summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rwxr-xr-xbin/syncqt21
-rwxr-xr-xconfig.tests/mac/crc.test71
-rw-r--r--config.tests/mac/crc/crc.pro2
-rw-r--r--config.tests/mac/crc/main.cpp108
-rwxr-xr-xconfig.tests/mac/defaultarch.test33
-rwxr-xr-xconfig.tests/mac/xarch.test26
-rwxr-xr-xconfig.tests/unix/endian.test3
-rw-r--r--config.tests/unix/evdev/evdev.cpp (renamed from src/corelib/arch/qatomic_arm.h)41
-rw-r--r--config.tests/unix/evdev/evdev.pro2
-rw-r--r--config.tests/unix/libudev/libudev.cpp49
-rw-r--r--config.tests/unix/libudev/libudev.pro3
-rwxr-xr-xconfigure263
-rw-r--r--configure.bat121
-rw-r--r--configure.exebin1115648 -> 0 bytes
-rw-r--r--dist/changes-5.0.065
-rw-r--r--doc/src/examples/dirview.qdoc2
-rw-r--r--doc/src/examples/editabletreemodel.qdoc5
-rw-r--r--doc/src/network/files-and-resources/resources.qdoc4
-rw-r--r--doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp2
-rw-r--r--doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp47
-rw-r--r--doc/src/snippets/code/src_corelib_thread_qmutex.cpp4
-rw-r--r--doc/src/snippets/code/src_gui_accessible_qaccessible.cpp9
-rw-r--r--doc/src/snippets/sqldatabase/sqldatabase.cpp2
-rw-r--r--doc/src/sql/sql-programming/sql-driver.qdoc2
-rw-r--r--examples/network/fortuneclient/client.cpp43
-rw-r--r--examples/network/fortuneclient/client.h3
-rw-r--r--mkspecs/common/gcc-base.conf2
-rw-r--r--mkspecs/common/linux.conf12
-rw-r--r--mkspecs/features/create_cmake.prf27
-rw-r--r--mkspecs/features/qt_installs.prf3
-rw-r--r--mkspecs/features/qt_module_config.prf1
-rw-r--r--mkspecs/features/testcase.prf4
-rw-r--r--mkspecs/linux-cxx/qmake.conf8
-rw-r--r--mkspecs/linux-ecc-64/qmake.conf8
-rw-r--r--mkspecs/linux-g++-maemo/qmake.conf16
-rw-r--r--mkspecs/linux-icc/qmake.conf8
-rw-r--r--mkspecs/linux-kcc/qmake.conf8
-rw-r--r--mkspecs/linux-lsb-g++/qmake.conf98
-rw-r--r--mkspecs/linux-pgcc/qmake.conf8
-rw-r--r--mkspecs/unsupported/linux-host-g++/qmake.conf8
-rw-r--r--mkspecs/wince70embedded-armv4i-msvc2008/qmake.conf2
-rw-r--r--mkspecs/wince70embedded-x86-msvc2008/qmake.conf2
-rw-r--r--qmake/Makefile.unix6
-rw-r--r--qmake/Makefile.win326
-rw-r--r--qmake/Makefile.win32-g++5
-rw-r--r--qmake/Makefile.win32-g++-sh6
-rw-r--r--qmake/generators/makefile.cpp118
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp2
-rw-r--r--qmake/project.cpp24
-rw-r--r--qmake/project.h3
-rw-r--r--qmake/qmake.pri3
-rw-r--r--qtbase.pro8
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h10
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gpos.c217
-rw-r--r--src/3rdparty/libpng.pri1
-rw-r--r--src/3rdparty/pcre.pri9
-rw-r--r--src/3rdparty/pcre/config.h17
-rw-r--r--src/3rdparty/zlib/gzguts.h9
-rw-r--r--src/3rdparty/zlib/zutil.c8
-rw-r--r--src/concurrent/concurrent.pro5
-rw-r--r--src/concurrent/qfuture.h2
-rw-r--r--src/concurrent/qfutureinterface.h5
-rw-r--r--src/concurrent/qfutureinterface_p.h2
-rw-r--r--src/concurrent/qfuturesynchronizer.h2
-rw-r--r--src/concurrent/qfuturewatcher.h4
-rw-r--r--src/concurrent/qfuturewatcher_p.h2
-rw-r--r--src/concurrent/qtconcurrent_global.h (renamed from src/corelib/arch/qatomic_arch.h)67
-rw-r--r--src/concurrent/qtconcurrentcompilertest.h9
-rw-r--r--src/concurrent/qtconcurrentexception.h10
-rw-r--r--src/concurrent/qtconcurrentfilter.h2
-rw-r--r--src/concurrent/qtconcurrentfilterkernel.h2
-rw-r--r--src/concurrent/qtconcurrentfunctionwrappers.h2
-rw-r--r--src/concurrent/qtconcurrentiteratekernel.h4
-rw-r--r--src/concurrent/qtconcurrentmap.h2
-rw-r--r--src/concurrent/qtconcurrentmapkernel.h2
-rw-r--r--src/concurrent/qtconcurrentmedian.h2
-rw-r--r--src/concurrent/qtconcurrentreducekernel.h2
-rw-r--r--src/concurrent/qtconcurrentresultstore.h6
-rw-r--r--src/concurrent/qtconcurrentrun.h2
-rw-r--r--src/concurrent/qtconcurrentrunbase.h2
-rw-r--r--src/concurrent/qtconcurrentstoredfunctioncall.h2
-rw-r--r--src/concurrent/qtconcurrentthreadengine.h4
-rw-r--r--src/corelib/Qt5CoreConfigExtras.cmake.in11
-rw-r--r--src/corelib/animation/qabstractanimation.cpp8
-rw-r--r--src/corelib/animation/qabstractanimation.h2
-rw-r--r--src/corelib/animation/qabstractanimation_p.h1
-rw-r--r--src/corelib/arch/alpha/arch.pri4
-rw-r--r--src/corelib/arch/alpha/qatomic_alpha.s239
-rw-r--r--src/corelib/arch/arch.pri56
-rw-r--r--src/corelib/arch/generic/arch.pri6
-rw-r--r--src/corelib/arch/generic/qatomic_generic_unix.cpp120
-rw-r--r--src/corelib/arch/generic/qatomic_generic_windows.cpp131
-rw-r--r--src/corelib/arch/parisc/arch.pri5
-rw-r--r--src/corelib/arch/parisc/q_ldcw.s62
-rw-r--r--src/corelib/arch/powerpc/arch.pri10
-rw-r--r--src/corelib/arch/powerpc/qatomic32.s525
-rw-r--r--src/corelib/arch/powerpc/qatomic64.s533
-rw-r--r--src/corelib/arch/qatomic_alpha.h128
-rw-r--r--src/corelib/arch/qatomic_armv5.h4
-rw-r--r--src/corelib/arch/qatomic_armv6.h4
-rw-r--r--src/corelib/arch/qatomic_armv7.h9
-rw-r--r--src/corelib/arch/qatomic_bfin.h2
-rw-r--r--src/corelib/arch/qatomic_bootstrap.h4
-rw-r--r--src/corelib/arch/qatomic_cxx11.h4
-rw-r--r--src/corelib/arch/qatomic_gcc.h4
-rw-r--r--src/corelib/arch/qatomic_generic.h282
-rw-r--r--src/corelib/arch/qatomic_i386.h4
-rw-r--r--src/corelib/arch/qatomic_ia64.h4
-rw-r--r--src/corelib/arch/qatomic_integrity.h1
-rw-r--r--src/corelib/arch/qatomic_mips.h6
-rw-r--r--src/corelib/arch/qatomic_msvc.h4
-rw-r--r--src/corelib/arch/qatomic_parisc.h305
-rw-r--r--src/corelib/arch/qatomic_power.h (renamed from src/corelib/arch/qatomic_powerpc.h)150
-rw-r--r--src/corelib/arch/qatomic_s390.h2
-rw-r--r--src/corelib/arch/qatomic_sh.h330
-rw-r--r--src/corelib/arch/qatomic_sh4a.h2
-rw-r--r--src/corelib/arch/qatomic_sparc.h2
-rw-r--r--src/corelib/arch/qatomic_unix.cpp (renamed from src/corelib/arch/parisc/qatomic_parisc.cpp)64
-rw-r--r--src/corelib/arch/qatomic_unix.h117
-rw-r--r--src/corelib/arch/qatomic_vxworks.h4
-rw-r--r--src/corelib/arch/qatomic_x86_64.h4
-rw-r--r--src/corelib/arch/sh/arch.pri4
-rw-r--r--src/corelib/arch/sparc/arch.pri6
-rw-r--r--src/corelib/arch/vxworks/arch.pri6
-rw-r--r--src/corelib/arch/vxworks/qatomic_ppc.s415
-rw-r--r--src/corelib/corelib.pro1
-rw-r--r--src/corelib/global/global.pri6
-rw-r--r--src/corelib/global/qcompilerdetection.h537
-rw-r--r--src/corelib/global/qglobal.cpp686
-rw-r--r--src/corelib/global/qglobal.h867
-rw-r--r--src/corelib/global/qlogging.cpp805
-rw-r--r--src/corelib/global/qlogging.h16
-rw-r--r--src/corelib/global/qnamespace.h1
-rw-r--r--src/corelib/global/qnamespace.qdoc102
-rw-r--r--src/corelib/global/qprocessordetection.h193
-rw-r--r--src/corelib/global/qsystemdetection.h208
-rw-r--r--src/corelib/global/qt_windows.h2
-rw-r--r--src/corelib/global/qtypeinfo.h216
-rw-r--r--src/corelib/io/io.pri10
-rw-r--r--src/corelib/io/qdir.cpp21
-rw-r--r--src/corelib/io/qfile.cpp51
-rw-r--r--src/corelib/io/qfile.h6
-rw-r--r--src/corelib/io/qfile_p.h5
-rw-r--r--src/corelib/io/qfileinfo.cpp23
-rw-r--r--src/corelib/io/qfileinfo.h1
-rw-r--r--src/corelib/io/qfilesystemengine_p.h9
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp7
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp5
-rw-r--r--src/corelib/io/qiodevice.cpp3
-rw-r--r--src/corelib/io/qprocess.cpp13
-rw-r--r--src/corelib/io/qprocess_p.h4
-rw-r--r--src/corelib/io/qprocess_unix.cpp159
-rw-r--r--src/corelib/io/qprocess_win.cpp5
-rw-r--r--src/corelib/io/qprocess_wince.cpp2
-rw-r--r--src/corelib/io/qstandardpaths_json.cpp184
-rw-r--r--src/corelib/io/qstandardpaths_unix.cpp2
-rw-r--r--src/corelib/io/qstandardpaths_win.cpp3
-rw-r--r--src/corelib/io/qtemporarydir.cpp39
-rw-r--r--src/corelib/io/qtemporaryfile.cpp35
-rw-r--r--src/corelib/io/qtemporaryfile.h2
-rw-r--r--src/corelib/io/qtextstream.cpp5
-rw-r--r--src/corelib/io/qurl.cpp30
-rw-r--r--src/corelib/io/qurl.h9
-rw-r--r--src/corelib/json/qjsonarray.h1
-rw-r--r--src/corelib/json/qjsondocument.cpp8
-rw-r--r--src/corelib/json/qjsondocument.h22
-rw-r--r--src/corelib/json/qjsonobject.h1
-rw-r--r--src/corelib/json/qjsonparser.cpp80
-rw-r--r--src/corelib/json/qjsonparser_p.h4
-rw-r--r--src/corelib/kernel/kernel.pri1
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.cpp10
-rw-r--r--src/corelib/kernel/qcore_mac_objc.mm4
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp68
-rw-r--r--src/corelib/kernel/qcoreapplication.h11
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h4
-rw-r--r--src/corelib/kernel/qcoreapplication_win.cpp24
-rw-r--r--src/corelib/kernel/qcoreevent.cpp1
-rw-r--r--src/corelib/kernel/qcoreevent.h4
-rw-r--r--src/corelib/kernel/qfunctions_wince.h10
-rw-r--r--src/corelib/kernel/qmetaobject.cpp95
-rw-r--r--src/corelib/kernel/qmetaobject.h2
-rw-r--r--src/corelib/kernel/qmetaobject_p.h6
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp242
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder_p.h6
-rw-r--r--src/corelib/kernel/qmetatype.cpp394
-rw-r--r--src/corelib/kernel/qmetatype.h161
-rw-r--r--src/corelib/kernel/qmetatype_p.h53
-rw-r--r--src/corelib/kernel/qmimedata.cpp28
-rw-r--r--src/corelib/kernel/qobject.cpp2
-rw-r--r--src/corelib/kernel/qobjectdefs.h1
-rw-r--r--src/corelib/kernel/qvariant.cpp21
-rw-r--r--src/corelib/kernel/qvariant.h74
-rw-r--r--src/corelib/kernel/qvariant_p.h20
-rw-r--r--src/corelib/mimetypes/mime/packages/freedesktop.org.xml31966
-rw-r--r--src/corelib/mimetypes/mimetypes.pri25
-rw-r--r--src/corelib/mimetypes/mimetypes.qrc5
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp609
-rw-r--r--src/corelib/mimetypes/qmimedatabase.h95
-rw-r--r--src/corelib/mimetypes/qmimedatabase_p.h90
-rw-r--r--src/corelib/mimetypes/qmimeglobpattern.cpp240
-rw-r--r--src/corelib/mimetypes/qmimeglobpattern_p.h146
-rw-r--r--src/corelib/mimetypes/qmimemagicrule.cpp387
-rw-r--r--src/corelib/mimetypes/qmimemagicrule_p.h89
-rw-r--r--src/corelib/mimetypes/qmimemagicrulematcher.cpp108
-rw-r--r--src/corelib/mimetypes/qmimemagicrulematcher_p.h (renamed from src/plugins/generic/touchscreen/qtoucheventsenderqpa.h)50
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp830
-rw-r--r--src/corelib/mimetypes/qmimeprovider_p.h165
-rw-r--r--src/corelib/mimetypes/qmimetype.cpp506
-rw-r--r--src/corelib/mimetypes/qmimetype.h115
-rw-r--r--src/corelib/mimetypes/qmimetype_p.h114
-rw-r--r--src/corelib/mimetypes/qmimetypeparser.cpp342
-rw-r--r--src/corelib/mimetypes/qmimetypeparser_p.h142
-rw-r--r--src/corelib/plugin/qelfparser_p.cpp4
-rw-r--r--src/corelib/plugin/qelfparser_p.h2
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp169
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h9
-rw-r--r--src/corelib/plugin/qlibrary.cpp159
-rw-r--r--src/corelib/plugin/qlibrary_p.h19
-rw-r--r--src/corelib/plugin/qplugin.h90
-rw-r--r--src/corelib/plugin/qpluginloader.cpp29
-rw-r--r--src/corelib/plugin/qpluginloader.h3
-rw-r--r--src/corelib/plugin/quuid.cpp8
-rw-r--r--src/corelib/plugin/quuid.h3
-rw-r--r--src/corelib/statemachine/qsignaleventgenerator_p.h8
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp59
-rw-r--r--src/corelib/thread/qatomic.h12
-rw-r--r--src/corelib/thread/qbasicatomic.h65
-rw-r--r--src/corelib/thread/qgenericatomic.h4
-rw-r--r--src/corelib/thread/qmutex.cpp6
-rw-r--r--src/corelib/thread/qmutex_p.h12
-rw-r--r--src/corelib/thread/qoldbasicatomic.h40
-rw-r--r--src/corelib/thread/qthread_unix.cpp18
-rw-r--r--src/corelib/thread/thread.pri10
-rw-r--r--src/corelib/tools/qbytearray.h2
-rw-r--r--src/corelib/tools/qdatetime.cpp2
-rw-r--r--src/corelib/tools/qeasingcurve.cpp12
-rw-r--r--src/corelib/tools/qeasingcurve.h11
-rw-r--r--src/corelib/tools/qline.cpp8
-rw-r--r--src/corelib/tools/qline.h5
-rw-r--r--src/corelib/tools/qlocale.qdoc1
-rw-r--r--src/corelib/tools/qpoint.cpp11
-rw-r--r--src/corelib/tools/qpoint.h8
-rw-r--r--src/corelib/tools/qregexp.cpp4
-rw-r--r--src/corelib/tools/qsharedpointer.cpp28
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h8
-rw-r--r--src/corelib/tools/qsimd.cpp2
-rw-r--r--src/corelib/tools/qsimd_p.h4
-rw-r--r--src/corelib/tools/qsize.cpp79
-rw-r--r--src/corelib/tools/qsize.h24
-rw-r--r--src/corelib/tools/qstring.cpp6
-rw-r--r--src/corelib/tools/qvector.h2
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp71
-rw-r--r--src/dbus/qdbusabstractadaptor_p.h3
-rw-r--r--src/dbus/qdbusmetaobject.cpp119
-rw-r--r--src/dbus/qdbusmetaobject_p.h2
-rw-r--r--src/gui/accessible/qaccessible.cpp161
-rw-r--r--src/gui/accessible/qaccessible.h16
-rw-r--r--src/gui/accessible/qaccessibleobject.cpp25
-rw-r--r--src/gui/accessible/qaccessibleobject.h2
-rw-r--r--src/gui/image/image.pri1
-rw-r--r--src/gui/image/qbitmap.cpp1
-rw-r--r--src/gui/image/qimage.cpp511
-rw-r--r--src/gui/image/qjpeghandler.cpp9
-rw-r--r--src/gui/image/qnativeimage.cpp1
-rw-r--r--src/gui/image/qpixmap.cpp21
-rw-r--r--src/gui/image/qpixmap.h1
-rw-r--r--src/gui/image/qpixmap_blitter.cpp26
-rw-r--r--src/gui/image/qpixmap_raster.cpp42
-rw-r--r--src/gui/image/qpixmap_win.cpp179
-rw-r--r--src/gui/image/qplatformpixmap.cpp1
-rw-r--r--src/gui/kernel/kernel.pri6
-rw-r--r--src/gui/kernel/qclipboard_qpa.cpp1
-rw-r--r--src/gui/kernel/qdnd.cpp1
-rw-r--r--src/gui/kernel/qevent.cpp12
-rw-r--r--src/gui/kernel/qguiapplication.cpp116
-rw-r--r--src/gui/kernel/qguiapplication.h4
-rw-r--r--src/gui/kernel/qguiapplication_p.h17
-rw-r--r--src/gui/kernel/qinputmethod_p.h1
-rw-r--r--src/gui/kernel/qopenglcontext.cpp3
-rw-r--r--src/gui/kernel/qopenglcontext_p.h3
-rw-r--r--src/gui/kernel/qpalette.cpp62
-rw-r--r--src/gui/kernel/qplatformintegration_qpa.cpp7
-rw-r--r--src/gui/kernel/qplatformintegration_qpa.h5
-rw-r--r--src/gui/kernel/qplatformintegrationplugin_qpa.h2
-rw-r--r--src/gui/kernel/qplatformopenglcontext_qpa.h3
-rw-r--r--src/gui/kernel/qplatformscreen_qpa.cpp2
-rw-r--r--src/gui/kernel/qplatformservices_qpa.cpp74
-rw-r--r--src/gui/kernel/qplatformservices_qpa.h (renamed from src/gui/util/qdesktopservices_qpa.cpp)30
-rw-r--r--src/gui/kernel/qplatformtheme_qpa.cpp36
-rw-r--r--src/gui/kernel/qplatformtheme_qpa.h19
-rw-r--r--src/gui/kernel/qplatformthemeplugin_qpa.h2
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.cpp19
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.h2
-rw-r--r--src/gui/kernel/qscreen.cpp48
-rw-r--r--src/gui/kernel/qscreen.h3
-rw-r--r--src/gui/kernel/qwindow.cpp94
-rw-r--r--src/gui/kernel/qwindow.h8
-rw-r--r--src/gui/kernel/qwindowdefs.h3
-rw-r--r--src/gui/kernel/qwindowsysteminterface_qpa.cpp22
-rw-r--r--src/gui/kernel/qwindowsysteminterface_qpa.h4
-rw-r--r--src/gui/kernel/qwindowsysteminterface_qpa_p.h8
-rw-r--r--src/gui/opengl/qopenglbuffer.cpp12
-rw-r--r--src/gui/opengl/qopenglframebufferobject.cpp107
-rw-r--r--src/gui/opengl/qopenglframebufferobject.h2
-rw-r--r--src/gui/opengl/qopenglframebufferobject_p.h4
-rw-r--r--src/gui/opengl/qopenglgradientcache_p.h2
-rw-r--r--src/gui/opengl/qopengltexturecache_p.h2
-rw-r--r--src/gui/painting/painting.pri6
-rw-r--r--src/gui/painting/qbackingstore.cpp1
-rw-r--r--src/gui/painting/qblendfunctions.cpp208
-rw-r--r--src/gui/painting/qdrawhelper.cpp3818
-rw-r--r--src/gui/painting/qdrawhelper_neon.cpp2
-rw-r--r--src/gui/painting/qdrawhelper_p.h1361
-rw-r--r--src/gui/painting/qdrawhelper_sse2.cpp7
-rw-r--r--src/gui/painting/qdrawhelper_sse_p.h2
-rw-r--r--src/gui/painting/qmemrotate.cpp380
-rw-r--r--src/gui/painting/qmemrotate_p.h38
-rw-r--r--src/gui/painting/qpathsimplifier.cpp1673
-rw-r--r--src/gui/painting/qpathsimplifier_p.h68
-rw-r--r--src/gui/painting/qstroker.cpp4
-rw-r--r--src/gui/text/qabstracttextdocumentlayout.cpp2
-rw-r--r--src/gui/text/qdistancefield.cpp762
-rw-r--r--src/gui/text/qdistancefield_p.h (renamed from src/widgets/kernel/qguiplatformplugin_p.h)77
-rw-r--r--src/gui/text/qfont.cpp14
-rw-r--r--src/gui/text/qfont_p.h1
-rw-r--r--src/gui/text/qfont_qpa.cpp1
-rw-r--r--src/gui/text/qfontdatabase.cpp51
-rw-r--r--src/gui/text/qfontdatabase_qpa.cpp74
-rw-r--r--src/gui/text/qfontengine.cpp37
-rw-r--r--src/gui/text/qfontengine_ft.cpp14
-rw-r--r--src/gui/text/qfontengine_ft_p.h1
-rw-r--r--src/gui/text/qfontengine_p.h3
-rw-r--r--src/gui/text/qfontengine_qpa_p.h5
-rw-r--r--src/gui/text/qfontenginedirectwrite.cpp4
-rw-r--r--src/gui/text/qfontmetrics.cpp8
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.cpp12
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.h2
-rw-r--r--src/gui/text/qrawfont_qpa.cpp1
-rw-r--r--src/gui/text/qtextcursor.cpp26
-rw-r--r--src/gui/text/qtextdocumentlayout.cpp6
-rw-r--r--src/gui/text/qtextengine.cpp42
-rw-r--r--src/gui/text/qtextengine_p.h6
-rw-r--r--src/gui/text/qtextlayout.cpp8
-rw-r--r--src/gui/text/text.pri6
-rw-r--r--src/gui/util/qdesktopservices.cpp22
-rw-r--r--src/gui/util/qdesktopservices_mac.cpp127
-rw-r--r--src/gui/util/qdesktopservices_win.cpp177
-rw-r--r--src/gui/util/qdesktopservices_x11.cpp131
-rw-r--r--src/network/access/qhttpthreaddelegate.cpp6
-rw-r--r--src/network/access/qnetworkaccessftpbackend.cpp6
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp10
-rw-r--r--src/network/access/qnetworkcookie.cpp2
-rw-r--r--src/network/access/qnetworkcookiejar.cpp4
-rw-r--r--src/network/access/qnetworkrequest.cpp8
-rw-r--r--src/network/kernel/kernel.pri7
-rw-r--r--src/network/kernel/qauthenticator.cpp6
-rw-r--r--src/network/kernel/qdnslookup_win.cpp1
-rw-r--r--src/network/kernel/qhostaddress.cpp1
-rw-r--r--src/network/kernel/qhostaddress_p.h4
-rw-r--r--src/network/kernel/qhostinfo_win.cpp28
-rw-r--r--src/network/kernel/qnetworkinterface.cpp2
-rw-r--r--src/network/kernel/qnetworkproxy.cpp31
-rw-r--r--src/network/kernel/qurlinfo.cpp1
-rw-r--r--src/network/socket/qlocalserver.cpp98
-rw-r--r--src/network/socket/qlocalserver.h17
-rw-r--r--src/network/socket/qlocalserver_p.h5
-rw-r--r--src/network/socket/qlocalserver_tcp.cpp7
-rw-r--r--src/network/socket/qlocalserver_unix.cpp107
-rw-r--r--src/network/socket/qlocalserver_win.cpp6
-rw-r--r--src/network/socket/qlocalsocket.cpp1
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp10
-rw-r--r--src/network/ssl/qsslcertificateextension.cpp5
-rw-r--r--src/network/ssl/qsslsocket.cpp2
-rw-r--r--src/opengl/qgl.h3
-rw-r--r--src/opengl/qglframebufferobject.cpp4
-rw-r--r--src/platformsupport/eglconvenience/qeglconvenience.cpp14
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/fontconfig.pri6
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp11
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h1
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp87
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h60
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm4
-rw-r--r--src/platformsupport/glxconvenience/qglxconvenience.cpp17
-rw-r--r--src/platformsupport/glxconvenience/qglxconvenience_p.h4
-rw-r--r--src/platformsupport/inputcontext/qplatforminputcontextfactory_qpa.cpp7
-rw-r--r--src/platformsupport/platformsupport.pro3
-rw-r--r--src/platformsupport/services/genericunix/genericunix.pri2
-rw-r--r--src/platformsupport/services/genericunix/qgenericunixservices.cpp152
-rw-r--r--src/platformsupport/services/genericunix/qgenericunixservices_p.h77
-rw-r--r--src/platformsupport/services/services.pri3
-rw-r--r--src/platformsupport/themes/genericunix/genericunix.pri2
-rw-r--r--src/platformsupport/themes/genericunix/qgenericunixthemes.cpp325
-rw-r--r--src/platformsupport/themes/genericunix/qgenericunixthemes_p.h106
-rw-r--r--src/platformsupport/themes/themes.pri3
-rw-r--r--src/platformsupport/udev/qudevhelper.cpp73
-rw-r--r--src/platformsupport/udev/qudevhelper_p.h (renamed from src/gui/image/qpixmap_qpa.cpp)22
-rw-r--r--src/platformsupport/udev/udev.pri5
-rw-r--r--src/plugins/accessible/widgets/complexwidgets.cpp7
-rw-r--r--src/plugins/accessible/widgets/itemviews.cpp52
-rw-r--r--src/plugins/accessible/widgets/itemviews.h10
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp8
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.h1
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp67
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h1
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp61
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h3
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp4
-rw-r--r--src/plugins/bearer/generic/qgenericengine.cpp2
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp4
-rw-r--r--src/plugins/generic/evdevkeyboard/evdevkeyboard.pro19
-rw-r--r--src/plugins/generic/evdevkeyboard/main.cpp (renamed from src/plugins/generic/linuxinput/main.cpp)24
-rw-r--r--src/plugins/generic/evdevkeyboard/qevdevkeyboard_defaultmap.h787
-rw-r--r--src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.cpp490
-rw-r--r--src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.h202
-rw-r--r--src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.cpp252
-rw-r--r--src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.h89
-rw-r--r--src/plugins/generic/evdevmouse/README11
-rw-r--r--src/plugins/generic/evdevmouse/evdevmouse.pro13
-rw-r--r--src/plugins/generic/evdevmouse/main.cpp77
-rw-r--r--src/plugins/generic/evdevmouse/qevdevmouse.cpp214
-rw-r--r--src/plugins/generic/evdevmouse/qevdevmouse.h (renamed from src/plugins/generic/linuxinput/qlinuxinput.h)32
-rw-r--r--src/plugins/generic/evdevtouch/70-qtouchscreen.rules (renamed from src/plugins/generic/touchscreen/70-qtouchscreen.rules)0
-rw-r--r--src/plugins/generic/evdevtouch/README36
-rw-r--r--src/plugins/generic/evdevtouch/evdevtouch.pro14
-rw-r--r--src/plugins/generic/evdevtouch/main.cpp (renamed from src/plugins/generic/touchscreen/main.cpp)18
-rw-r--r--src/plugins/generic/evdevtouch/qevdevtouch.cpp (renamed from src/plugins/generic/touchscreen/qtouchscreen.cpp)123
-rw-r--r--src/plugins/generic/evdevtouch/qevdevtouch.h (renamed from src/plugins/generic/touchscreen/qtouchscreen.h)20
-rw-r--r--src/plugins/generic/generic.pro6
-rw-r--r--src/plugins/generic/linuxinput/linuxinput.pro14
-rw-r--r--src/plugins/generic/linuxinput/qlinuxinput.cpp365
-rw-r--r--src/plugins/generic/touchscreen/README45
-rw-r--r--src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp116
-rw-r--r--src/plugins/generic/touchscreen/touchscreen.pro18
-rw-r--r--src/plugins/imageformats/gif/gif.json3
-rw-r--r--src/plugins/imageformats/gif/gif.pro2
-rw-r--r--src/plugins/imageformats/gif/main.cpp15
-rw-r--r--src/plugins/imageformats/gif/main.h65
-rw-r--r--src/plugins/imageformats/ico/ico.json3
-rw-r--r--src/plugins/imageformats/ico/ico.pro3
-rw-r--r--src/plugins/imageformats/ico/main.cpp18
-rw-r--r--src/plugins/imageformats/ico/main.h66
-rw-r--r--src/plugins/imageformats/jpeg/jpeg.json3
-rw-r--r--src/plugins/imageformats/jpeg/jpeg.pro2
-rw-r--r--src/plugins/imageformats/jpeg/main.cpp14
-rw-r--r--src/plugins/imageformats/jpeg/main.h65
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp2
-rw-r--r--src/plugins/platforminputcontexts/maliit/qmaliitplatforminputcontext.cpp2
-rw-r--r--src/plugins/platforms/cocoa/cocoa.json3
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro5
-rw-r--r--src/plugins/platforms/cocoa/main.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.h78
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm464
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm9
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.h82
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm487
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm37
-rw-r--r--src/plugins/platforms/cocoa/qt_mac_p.h10
-rw-r--r--src/plugins/platforms/minimal/main.cpp6
-rw-r--r--src/plugins/platforms/minimal/minimal.json3
-rw-r--r--src/plugins/platforms/minimal/minimal.pro2
-rw-r--r--src/plugins/platforms/minimal/qminimalbackingstore.cpp3
-rw-r--r--src/plugins/platforms/windows/main.cpp6
-rw-r--r--src/plugins/platforms/windows/qtwindows_additional.h11
-rw-r--r--src/plugins/platforms/windows/qtwindowsglobal.h12
-rw-r--r--src/plugins/platforms/windows/qwindowsaccessibility.cpp66
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.cpp18
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp15
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.h1
-rw-r--r--src/plugins/platforms/windows/qwindowsdialoghelpers.cpp20
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp17
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp228
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.h4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsguieventdispatcher.cpp3
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp7
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.h1
-rw-r--r--src/plugins/platforms/windows/qwindowsservices.cpp154
-rw-r--r--src/plugins/platforms/windows/qwindowsservices.h58
-rw-r--r--src/plugins/platforms/windows/qwindowstheme.cpp175
-rw-r--r--src/plugins/platforms/windows/qwindowstheme.h24
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp54
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h3
-rw-r--r--src/plugins/platforms/windows/windows.json3
-rw-r--r--src/plugins/platforms/windows/windows.pro12
-rw-r--r--src/plugins/platforms/xcb/main.cpp6
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.cpp3
-rw-r--r--src/plugins/platforms/xcb/qxcbdrag.cpp28
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp19
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.h9
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp34
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp12
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp14
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h2
-rw-r--r--src/plugins/platforms/xcb/xcb.json3
-rw-r--r--src/plugins/platforms/xcb/xcb.pro4
-rw-r--r--src/plugins/platforms/xlib/qglxintegration.cpp3
-rw-r--r--src/plugins/platforms/xlib/qxlibintegration.cpp2
-rw-r--r--src/plugins/platforms/xlib/qxlibintegration.h3
-rw-r--r--src/plugins/platforms/xlib/qxlibnativeinterface.cpp11
-rw-r--r--src/plugins/platforms/xlib/qxlibnativeinterface.h4
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.cpp11
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.h3
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.cpp7
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.h2
-rw-r--r--src/plugins/plugins.pro4
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp12
-rw-r--r--src/sql/drivers/sqlite/qsql_sqlite.cpp12
-rw-r--r--src/sql/drivers/sqlite2/qsql_sqlite2.cpp11
-rw-r--r--src/sql/drivers/tds/qsql_tds.cpp15
-rw-r--r--src/sql/kernel/qsqldatabase.cpp5
-rw-r--r--src/sql/models/qsqlquerymodel.h2
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.cpp25
-rw-r--r--src/sql/models/qsqltablemodel.cpp327
-rw-r--r--src/sql/models/qsqltablemodel_p.h35
-rw-r--r--src/src.pro9
-rw-r--r--src/testlib/qsignaldumper.cpp4
-rw-r--r--src/testlib/qtestcase.cpp104
-rw-r--r--src/testlib/qtestcase.h15
-rw-r--r--src/testlib/qtestlog.cpp38
-rw-r--r--src/testlib/qtestlog_p.h4
-rw-r--r--src/testlib/qtestresult.cpp64
-rw-r--r--src/testlib/qtestresult_p.h10
-rw-r--r--src/testlib/qxmltestlogger.cpp2
-rw-r--r--src/tools/bootstrap/bootstrap.pri2
-rw-r--r--src/tools/bootstrap/bootstrap.pro9
-rw-r--r--src/tools/moc/generator.cpp84
-rw-r--r--src/tools/moc/generator.h7
-rw-r--r--src/tools/moc/keywords.cpp320
-rw-r--r--src/tools/moc/main.cpp6
-rw-r--r--src/tools/moc/moc.cpp61
-rw-r--r--src/tools/moc/moc.h10
-rw-r--r--src/tools/moc/moc.pro2
-rw-r--r--src/tools/moc/preprocessor.cpp12
-rw-r--r--src/tools/moc/token.h1
-rw-r--r--src/tools/moc/util/generate_keywords.cpp1
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp53
-rw-r--r--src/tools/uic/uic.pro2
-rw-r--r--src/tools/uic/utils.h17
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp207
-rw-r--r--src/widgets/accessible/qaccessiblewidget.h4
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp12
-rw-r--r--src/widgets/dialogs/qdialog.cpp13
-rw-r--r--src/widgets/dialogs/qdialog.h4
-rw-r--r--src/widgets/dialogs/qdialog_p.h2
-rw-r--r--src/widgets/dialogs/qerrormessage.cpp12
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp17
-rw-r--r--src/widgets/dialogs/qfileinfogatherer_p.h6
-rw-r--r--src/widgets/dialogs/qfontdialog.cpp4
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp21
-rw-r--r--src/widgets/dialogs/qmessagebox.h2
-rw-r--r--src/widgets/dialogs/qwizard.cpp4
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp6
-rw-r--r--src/widgets/graphicsview/qgraphicslayout.cpp4
-rw-r--r--src/widgets/itemviews/qfileiconprovider.cpp15
-rw-r--r--src/widgets/itemviews/qheaderview.cpp290
-rw-r--r--src/widgets/itemviews/qheaderview_p.h35
-rw-r--r--src/widgets/itemviews/qlistwidget.cpp8
-rw-r--r--src/widgets/itemviews/qtreeview.cpp2
-rw-r--r--src/widgets/kernel/kernel.pri7
-rw-r--r--src/widgets/kernel/qapplication.cpp101
-rw-r--r--src/widgets/kernel/qapplication.h7
-rw-r--r--src/widgets/kernel/qapplication_p.h6
-rw-r--r--src/widgets/kernel/qapplication_qpa.cpp7
-rw-r--r--src/widgets/kernel/qguiplatformplugin.cpp294
-rw-r--r--src/widgets/kernel/qicon.cpp1
-rw-r--r--src/widgets/kernel/qiconloader.cpp52
-rw-r--r--src/widgets/kernel/qlayoutitem.cpp2
-rw-r--r--src/widgets/kernel/qwhatsthis.cpp1
-rw-r--r--src/widgets/kernel/qwidget.cpp65
-rw-r--r--src/widgets/kernel/qwidget.h5
-rw-r--r--src/widgets/kernel/qwidget_p.h6
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp28
-rw-r--r--src/widgets/kernel/qwidgetsfunctions_wince.cpp126
-rw-r--r--src/widgets/kernel/qwidgetsfunctions_wince.h (renamed from src/corelib/arch/sh/qatomic_sh.cpp)44
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa.cpp12
-rw-r--r--src/widgets/kernel/win.pri4
-rw-r--r--src/widgets/styles/qcommonstyle.cpp19
-rw-r--r--src/widgets/styles/qgtkstyle_p.cpp2
-rw-r--r--src/widgets/styles/qstylehelper.cpp4
-rw-r--r--src/widgets/styles/qwindowscestyle.cpp1
-rw-r--r--src/widgets/styles/qwindowsmobilestyle.cpp65
-rw-r--r--src/widgets/styles/qwindowsmobilestyle_p.h7
-rw-r--r--src/widgets/styles/qwindowsxpstyle.cpp9
-rw-r--r--src/widgets/util/qsystemtrayicon.cpp10
-rw-r--r--src/widgets/widgets/qabstractbutton.cpp4
-rw-r--r--src/widgets/widgets/qdockwidget.cpp2
-rw-r--r--src/widgets/widgets/qeffects.cpp2
-rw-r--r--src/widgets/widgets/qmdisubwindow.cpp2
-rw-r--r--src/widgets/widgets/qmenu.cpp3
-rw-r--r--src/widgets/widgets/qmenu.h6
-rw-r--r--src/widgets/widgets/qmenu_p.h8
-rw-r--r--src/widgets/widgets/qmenu_wince.cpp12
-rw-r--r--src/widgets/widgets/qmenu_wince.rc4
-rw-r--r--src/widgets/widgets/qmenubar.cpp25
-rw-r--r--src/widgets/widgets/qmenubar.h4
-rw-r--r--src/widgets/widgets/qmenubar_p.h13
-rw-r--r--src/widgets/widgets/qplaintextedit.cpp2
-rw-r--r--src/widgets/widgets/qscrollbar.cpp2
-rw-r--r--src/widgets/widgets/qsizegrip.cpp8
-rw-r--r--src/widgets/widgets/qtabwidget.cpp14
-rw-r--r--src/widgets/widgets/qtabwidget.h1
-rw-r--r--src/widgets/widgets/qtextedit.cpp4
-rw-r--r--src/widgets/widgets/qtoolbar.cpp2
-rw-r--r--src/widgets/widgets/qwidgettextcontrol.cpp2
-rw-r--r--src/xml/dom/qdom.cpp102
-rw-r--r--src/xml/dom/qdom.h9
-rw-r--r--sync.profile2
-rw-r--r--tests/auto/auto.pro4
-rw-r--r--tests/auto/concurrent/qfuture/qfuture.pro2
-rw-r--r--tests/auto/concurrent/qfuturewatcher/qfuturewatcher.pro2
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp129
-rw-r--r--tests/auto/corelib/codecs/utf8/tst_utf8.cpp6
-rw-r--r--tests/auto/corelib/corelib.pro1
-rw-r--r--tests/auto/corelib/global/global.pro2
-rw-r--r--tests/auto/corelib/global/qlogging/app/app.pro11
-rw-r--r--tests/auto/corelib/global/qlogging/app/main.cpp58
-rw-r--r--tests/auto/corelib/global/qlogging/qlogging.pro6
-rw-r--r--tests/auto/corelib/global/qlogging/tst_qlogging.cpp674
-rw-r--r--tests/auto/corelib/global/qlogging/tst_qlogging.pro4
-rw-r--r--tests/auto/corelib/global/qmessagehandler/qmessagehandler.pro4
-rw-r--r--tests/auto/corelib/global/qmessagehandler/tst_qmessagehandler.cpp147
-rw-r--r--tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp2
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp4
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp40
-rw-r--r--tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp7
-rw-r--r--tests/auto/corelib/io/qfile/tst_qfile.cpp32
-rw-r--r--tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp29
-rw-r--r--tests/auto/corelib/io/qfilesystementry/tst_qfilesystementry.cpp18
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro2
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp108
-rw-r--r--tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp1
-rw-r--r--tests/auto/corelib/io/qsettings/qsettings.pro2
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp6
-rw-r--r--tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp5
-rw-r--r--tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp4
-rw-r--r--tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp2
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp10
-rw-r--r--tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp58
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp44
-rw-r--r--tests/auto/corelib/json/json.pro2
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp184
-rw-r--r--tests/auto/corelib/kernel/kernel.pro2
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp3
-rw-r--r--tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro4
-rw-r--r--tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp213
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro5
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp630
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp85
-rw-r--r--tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp212
-rw-r--r--tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp7
-rw-r--r--tests/auto/corelib/kernel/qobject/qobject.pro5
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp20
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.pro3
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro2
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp19
-rw-r--r--tests/auto/corelib/kernel/qvariant/qvariant.pro2
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp125
-rw-r--r--tests/auto/corelib/mimetypes/mimetypes.pro8
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro12
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/tst_qmimedatabase-cache.cpp56
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro14
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/tst_qmimedatabase-xml.cpp51
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase.pro3
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp834
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.h99
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/yast2-metapackage-handler-mimetypes.xml15
-rw-r--r--tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro7
-rw-r--r--tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp257
-rw-r--r--tests/auto/corelib/plugin/qlibrary/tst/tst.pro3
-rw-r--r--tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp2
-rw-r--r--tests/auto/corelib/thread/qsemaphore/qsemaphore.pro2
-rw-r--r--tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp41
-rw-r--r--tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp22
-rw-r--r--tests/auto/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp8
-rw-r--r--tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp39
-rw-r--r--tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro12
-rw-r--r--tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp8
-rw-r--r--tests/auto/corelib/tools/qdate/tst_qdate.cpp26
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp26
-rw-r--r--tests/auto/corelib/tools/qlocale/tst_qlocale.cpp12
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/externaltests.pri2
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro2
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp38
-rw-r--r--tests/auto/corelib/tools/qstring/tst_qstring.cpp58
-rw-r--r--tests/auto/corelib/tools/qstringlist/tst_qstringlist.cpp16
-rw-r--r--tests/auto/corelib/tools/qstringmatcher/tst_qstringmatcher.cpp20
-rw-r--r--tests/auto/corelib/tools/qstringref/tst_qstringref.cpp24
-rw-r--r--tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp16
-rw-r--r--tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp2
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp78
-rw-r--r--tests/auto/dbus/qdbusmarshall/common.h8
-rw-r--r--tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp4
-rw-r--r--tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp16
-rw-r--r--tests/auto/gui/image/qicon/heart.svg55
-rw-r--r--tests/auto/gui/image/qicon/heart.svgzbin1506 -> 0 bytes
-rw-r--r--tests/auto/gui/image/qicon/rect.svg76
-rw-r--r--tests/auto/gui/image/qicon/trash.svg58
-rw-r--r--tests/auto/gui/image/qicon/tst_qicon.cpp88
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp67
-rw-r--r--tests/auto/gui/image/qimagereader/tst_qimagereader.cpp1
-rw-r--r--tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp5
-rw-r--r--tests/auto/gui/image/qpixmap/qpixmap.pro2
-rw-r--r--tests/auto/gui/image/qpixmap/tst_qpixmap.cpp3
-rw-r--r--tests/auto/gui/kernel/kernel.pro1
-rw-r--r--tests/auto/gui/kernel/qguiapplication/qguiapplication.pro2
-rw-r--r--tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp43
-rw-r--r--tests/auto/gui/kernel/qguieventdispatcher/qguieventdispatcher.pro4
-rw-r--r--tests/auto/gui/kernel/qkeysequence/qkeysequence.pro2
-rw-r--r--tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp5
-rw-r--r--tests/auto/gui/kernel/qwindow/qwindow.pro1
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp121
-rw-r--r--tests/auto/gui/painting/qpainter/qpainter.pro1
-rw-r--r--tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp10
-rw-r--r--tests/auto/gui/painting/qprinter/qprinter.pro1
-rw-r--r--tests/auto/gui/painting/qprinterinfo/qprinterinfo.pro1
-rw-r--r--tests/auto/gui/painting/qprinterinfo/tst_qprinterinfo.cpp5
-rw-r--r--tests/auto/gui/qopengl/qopengl.pro1
-rw-r--r--tests/auto/gui/text/qcssparser/tst_qcssparser.cpp4
-rw-r--r--tests/auto/gui/text/qfontdatabase/qfontdatabase.pro1
-rw-r--r--tests/auto/gui/text/qfontmetrics/qfontmetrics.pro1
-rw-r--r--tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp4
-rw-r--r--tests/auto/gui/text/qglyphrun/qglyphrun.pro2
-rw-r--r--tests/auto/gui/text/qrawfont/qrawfont.pro2
-rw-r--r--tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp4
-rw-r--r--tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp2
-rw-r--r--tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp10
-rw-r--r--tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro6
-rw-r--r--tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp34
-rw-r--r--tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp6
-rw-r--r--tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp2
-rw-r--r--tests/auto/network/access/qnetworkreply/echo/main.cpp3
-rw-r--r--tests/auto/network/access/qnetworkreply/qnetworkreply.pro3
-rw-r--r--tests/auto/network/access/qnetworkreply/test/test.pro25
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp604
-rw-r--r--tests/auto/network/bearer/qnetworksession/qnetworksession.pro4
-rw-r--r--tests/auto/network/bearer/qnetworksession/test/test.pro3
-rw-r--r--tests/auto/network/bearer/qnetworksession/test/tst_qnetworksession.cpp13
-rw-r--r--tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp14
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp179
-rw-r--r--tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp15
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp17
-rw-r--r--tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro17
-rw-r--r--tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp84
-rw-r--r--tests/auto/network/ssl/qsslkey/qsslkey.pro21
-rw-r--r--tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp48
-rw-r--r--tests/auto/network/ssl/qsslsocket/qsslsocket.pro2
-rw-r--r--tests/auto/other/headersclean/headersclean.pro27
-rw-r--r--tests/auto/other/headersclean/tst_headersclean.cpp5
-rw-r--r--tests/auto/other/networkselftest/networkselftest.pro11
-rw-r--r--tests/auto/other/networkselftest/rfc3252.txt899
-rw-r--r--tests/auto/other/networkselftest/tst_networkselftest.cpp26
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp45
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp25
-rw-r--r--tests/auto/testlib/selftests/badxml/tst_badxml.cpp9
-rw-r--r--tests/auto/testlib/selftests/benchlibcounting/benchlibcounting.pro7
-rw-r--r--tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp76
-rw-r--r--tests/auto/testlib/selftests/counting/tst_counting.cpp87
-rw-r--r--tests/auto/testlib/selftests/crashes/tst_crashes.cpp8
-rw-r--r--tests/auto/testlib/selftests/datetime/tst_datetime.cpp8
-rw-r--r--tests/auto/testlib/selftests/expected_badxml.lightxml73
-rw-r--r--tests/auto/testlib/selftests/expected_badxml.txt47
-rw-r--r--tests/auto/testlib/selftests/expected_badxml.xml73
-rw-r--r--tests/auto/testlib/selftests/expected_badxml.xunitxml26
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibcallgrind.txt4
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibcounting.lightxml24
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibcounting.txt13
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibcounting.xml27
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibcounting.xunitxml20
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibeventcounter.lightxml22
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibeventcounter.txt14
-rw-r--r--tests/auto/testlib/selftests/expected_benchlibeventcounter.xml22
-rw-r--r--tests/auto/testlib/selftests/expected_benchliboptions.txt6
-rw-r--r--tests/auto/testlib/selftests/expected_benchliboptions.xml17
-rw-r--r--tests/auto/testlib/selftests/expected_benchliboptions.xunitxml12
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.lightxml57
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.txt45
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.xml57
-rw-r--r--tests/auto/testlib/selftests/expected_commandlinedata.lightxml20
-rw-r--r--tests/auto/testlib/selftests/expected_commandlinedata.txt22
-rw-r--r--tests/auto/testlib/selftests/expected_commandlinedata.xml20
-rw-r--r--tests/auto/testlib/selftests/expected_counting.lightxml100
-rw-r--r--tests/auto/testlib/selftests/expected_counting.txt52
-rw-r--r--tests/auto/testlib/selftests/expected_counting.xml100
-rw-r--r--tests/auto/testlib/selftests/expected_counting.xunitxml22
-rw-r--r--tests/auto/testlib/selftests/expected_crashes.lightxml15
-rw-r--r--tests/auto/testlib/selftests/expected_crashes.xml18
-rw-r--r--tests/auto/testlib/selftests/expected_datatable.lightxml52
-rw-r--r--tests/auto/testlib/selftests/expected_datatable.txt46
-rw-r--r--tests/auto/testlib/selftests/expected_datatable.xml52
-rw-r--r--tests/auto/testlib/selftests/expected_datetime.lightxml8
-rw-r--r--tests/auto/testlib/selftests/expected_datetime.txt8
-rw-r--r--tests/auto/testlib/selftests/expected_datetime.xml8
-rw-r--r--tests/auto/testlib/selftests/expected_datetime.xunitxml4
-rw-r--r--tests/auto/testlib/selftests/expected_expectfail.lightxml98
-rw-r--r--tests/auto/testlib/selftests/expected_expectfail.txt56
-rw-r--r--tests/auto/testlib/selftests/expected_expectfail.xml98
-rw-r--r--tests/auto/testlib/selftests/expected_expectfail.xunitxml27
-rw-r--r--tests/auto/testlib/selftests/expected_failcleanup.lightxml (renamed from tests/auto/testlib/selftests/expected_benchliboptions.lightxml)10
-rw-r--r--tests/auto/testlib/selftests/expected_failcleanup.txt8
-rw-r--r--tests/auto/testlib/selftests/expected_failcleanup.xml (renamed from tests/auto/testlib/selftests/expected_benchlibcallgrind.xml)9
-rw-r--r--tests/auto/testlib/selftests/expected_failcleanup.xunitxml (renamed from tests/auto/testlib/selftests/expected_benchlibcallgrind.xunitxml)7
-rw-r--r--tests/auto/testlib/selftests/expected_float.lightxml44
-rw-r--r--tests/auto/testlib/selftests/expected_float.txt18
-rw-r--r--tests/auto/testlib/selftests/expected_float.xml47
-rw-r--r--tests/auto/testlib/selftests/expected_float.xunitxml29
-rw-r--r--tests/auto/testlib/selftests/expected_globaldata.lightxml23
-rw-r--r--tests/auto/testlib/selftests/expected_globaldata.txt11
-rw-r--r--tests/auto/testlib/selftests/expected_globaldata.xml23
-rw-r--r--tests/auto/testlib/selftests/expected_multiexec.lightxml13
-rw-r--r--tests/auto/testlib/selftests/expected_multiexec.xunitxml11
-rw-r--r--tests/auto/testlib/selftests/expected_qexecstringlist.txt20
-rw-r--r--tests/auto/testlib/selftests/expected_skip.lightxml4
-rw-r--r--tests/auto/testlib/selftests/expected_skip.txt2
-rw-r--r--tests/auto/testlib/selftests/expected_skip.xml4
-rw-r--r--tests/auto/testlib/selftests/expected_skipcleanup.lightxml (renamed from tests/auto/testlib/selftests/expected_benchlibcallgrind.lightxml)7
-rw-r--r--tests/auto/testlib/selftests/expected_skipcleanup.txt8
-rw-r--r--tests/auto/testlib/selftests/expected_skipcleanup.xml (renamed from tests/auto/testlib/selftests/expected_multiexec.xml)8
-rw-r--r--tests/auto/testlib/selftests/expected_skipcleanup.xunitxml (renamed from tests/auto/testlib/selftests/expected_crashes.xunitxml)10
-rw-r--r--tests/auto/testlib/selftests/expected_sleep.lightxml13
-rw-r--r--tests/auto/testlib/selftests/expected_sleep.xml16
-rw-r--r--tests/auto/testlib/selftests/expected_sleep.xunitxml11
-rw-r--r--tests/auto/testlib/selftests/expected_subtest.lightxml13
-rw-r--r--tests/auto/testlib/selftests/expected_subtest.txt7
-rw-r--r--tests/auto/testlib/selftests/expected_subtest.xml13
-rw-r--r--tests/auto/testlib/selftests/expected_warnings.lightxml26
-rw-r--r--tests/auto/testlib/selftests/expected_warnings.txt8
-rw-r--r--tests/auto/testlib/selftests/expected_warnings.xml26
-rw-r--r--tests/auto/testlib/selftests/expected_warnings.xunitxml14
-rw-r--r--tests/auto/testlib/selftests/expected_xunit.lightxml2
-rw-r--r--tests/auto/testlib/selftests/expected_xunit.txt2
-rw-r--r--tests/auto/testlib/selftests/expected_xunit.xml2
-rw-r--r--tests/auto/testlib/selftests/expected_xunit.xunitxml2
-rw-r--r--tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp91
-rw-r--r--tests/auto/testlib/selftests/failcleanup/failcleanup.pro7
-rw-r--r--tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp63
-rw-r--r--tests/auto/testlib/selftests/float/tst_float.cpp17
-rw-r--r--tests/auto/testlib/selftests/selftests.pri49
-rw-r--r--tests/auto/testlib/selftests/selftests.qrc30
-rw-r--r--tests/auto/testlib/selftests/skipcleanup/skipcleanup.pro7
-rw-r--r--tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp63
-rw-r--r--tests/auto/testlib/selftests/tst_selftests.cpp31
-rw-r--r--tests/auto/testlib/selftests/warnings/tst_warnings.cpp19
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp10
-rw-r--r--tests/auto/tools/qmake/testdata/substitutes/copy.txt3
-rw-r--r--tests/auto/tools/qmake/testdata/substitutes/test.pro5
-rw-r--r--tests/auto/tools/qmake/tst_qmake.cpp8
-rw-r--r--tests/auto/tools/uic/baseline/Dialog_with_Buttons_Bottom.ui.h4
-rw-r--r--tests/auto/tools/uic/baseline/Dialog_with_Buttons_Right.ui.h4
-rw-r--r--tests/auto/tools/uic/baseline/Dialog_without_Buttons.ui.h2
-rw-r--r--tests/auto/tools/uic/baseline/Main_Window.ui.h8
-rw-r--r--tests/auto/tools/uic/baseline/Widget.ui.h10
-rw-r--r--tests/auto/tools/uic/baseline/addlinkdialog.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/addtorrentform.ui.h48
-rw-r--r--tests/auto/tools/uic/baseline/authenticationdialog.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/backside.ui.h30
-rw-r--r--tests/auto/tools/uic/baseline/batchtranslation.ui.h34
-rw-r--r--tests/auto/tools/uic/baseline/bookmarkdialog.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/bookwindow.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/browserwidget.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/calculator.ui.h58
-rw-r--r--tests/auto/tools/uic/baseline/calculatorform.ui.h38
-rw-r--r--tests/auto/tools/uic/baseline/certificateinfo.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/chatdialog.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/chatmainwindow.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/chatsetnickname.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/config.ui.h104
-rw-r--r--tests/auto/tools/uic/baseline/connectdialog.ui.h28
-rw-r--r--tests/auto/tools/uic/baseline/controller.ui.h14
-rw-r--r--tests/auto/tools/uic/baseline/cookies.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/cookiesexceptions.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/default.ui.h52
-rw-r--r--tests/auto/tools/uic/baseline/dialog.ui.h10
-rw-r--r--tests/auto/tools/uic/baseline/downloaditem.ui.h22
-rw-r--r--tests/auto/tools/uic/baseline/downloads.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/embeddeddialog.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/filespage.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/filternamedialog.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/filterpage.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/finddialog.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/form.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/formwindowsettings.ui.h56
-rw-r--r--tests/auto/tools/uic/baseline/generalpage.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/gridalignment.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/gridpanel.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/helpdialog.ui.h60
-rw-r--r--tests/auto/tools/uic/baseline/history.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/icontheme.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/identifierpage.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/imagedialog.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/inputpage.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/installdialog.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/languagesdialog.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/listwidgeteditor.ui.h28
-rw-r--r--tests/auto/tools/uic/baseline/mainwindow.ui.h88
-rw-r--r--tests/auto/tools/uic/baseline/mydialog.ui.h8
-rw-r--r--tests/auto/tools/uic/baseline/myform.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/newactiondialog.ui.h24
-rw-r--r--tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/newform.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/orderdialog.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/outputpage.ui.h12
-rw-r--r--tests/auto/tools/uic/baseline/pagefold.ui.h56
-rw-r--r--tests/auto/tools/uic/baseline/paletteeditor.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/passworddialog.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/pathpage.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/phrasebookbox.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/plugindialog.ui.h14
-rw-r--r--tests/auto/tools/uic/baseline/preferencesdialog.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/previewconfigurationwidget.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/previewdialogbase.ui.h26
-rw-r--r--tests/auto/tools/uic/baseline/previewwidget.ui.h42
-rw-r--r--tests/auto/tools/uic/baseline/proxy.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/qfiledialog.ui.h54
-rw-r--r--tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h60
-rw-r--r--tests/auto/tools/uic/baseline/qprintpropertieswidget.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/qprintsettingsoutput.ui.h66
-rw-r--r--tests/auto/tools/uic/baseline/qprintwidget.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/qsqlconnectiondialog.ui.h42
-rw-r--r--tests/auto/tools/uic/baseline/qtgradientdialog.ui.h8
-rw-r--r--tests/auto/tools/uic/baseline/qtgradienteditor.ui.h158
-rw-r--r--tests/auto/tools/uic/baseline/qtgradientview.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/qtgradientviewdialog.ui.h8
-rw-r--r--tests/auto/tools/uic/baseline/qtresourceeditordialog.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/qttoolbardialog.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/querywidget.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/remotecontrol.ui.h56
-rw-r--r--tests/auto/tools/uic/baseline/saveformastemplate.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/settings.ui.h34
-rw-r--r--tests/auto/tools/uic/baseline/signalslotdialog.ui.h30
-rw-r--r--tests/auto/tools/uic/baseline/sslclient.ui.h36
-rw-r--r--tests/auto/tools/uic/baseline/sslerrors.ui.h16
-rw-r--r--tests/auto/tools/uic/baseline/statistics.ui.h42
-rw-r--r--tests/auto/tools/uic/baseline/stringlisteditor.ui.h32
-rw-r--r--tests/auto/tools/uic/baseline/stylesheeteditor.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/tabbedbrowser.ui.h28
-rw-r--r--tests/auto/tools/uic/baseline/tablewidgeteditor.ui.h66
-rw-r--r--tests/auto/tools/uic/baseline/tetrixwindow.ui.h30
-rw-r--r--tests/auto/tools/uic/baseline/textfinder.ui.h14
-rw-r--r--tests/auto/tools/uic/baseline/topicchooser.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/translatedialog.ui.h34
-rw-r--r--tests/auto/tools/uic/baseline/translationsettings.ui.h18
-rw-r--r--tests/auto/tools/uic/baseline/treewidgeteditor.ui.h56
-rw-r--r--tests/auto/tools/uic/baseline/trpreviewtool.ui.h38
-rw-r--r--tests/auto/tools/uic/baseline/validators.ui.h72
-rw-r--r--tests/auto/tools/uic/baseline/wateringconfigdialog.ui.h46
-rw-r--r--tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp6
-rw-r--r--tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp2
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp44
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro2
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp46
-rw-r--r--tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp10
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp4
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp44
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp3
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp4
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp4
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp43
-rw-r--r--tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/qlistwidget.pro2
-rw-r--r--tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp14
-rw-r--r--tests/auto/widgets/kernel/qapplication/test/test.pro2
-rw-r--r--tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp578
-rw-r--r--tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp21
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro2
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp5
-rw-r--r--tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp54
-rw-r--r--tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp14
-rw-r--r--tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp4
-rw-r--r--tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp4
-rw-r--r--tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp8
-rw-r--r--tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp2
-rw-r--r--tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp4
-rw-r--r--tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp2
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp69
-rw-r--r--tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp2
-rw-r--r--tests/auto/widgets/widgets/qmenu/qmenu.pro2
-rw-r--r--tests/auto/widgets/widgets/qmenubar/qmenubar.pro2
-rw-r--r--tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp6
-rw-r--r--tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp32
-rw-r--r--tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp2
-rw-r--r--tests/auto/widgets/widgets/qtextedit/qtextedit.pro2
-rw-r--r--tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp6
-rw-r--r--tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp4
-rw-r--r--tests/auto/xml/dom/qdom/tst_qdom.cpp53
-rw-r--r--tests/benchmarks/corelib/io/qfile/main.cpp2
-rw-r--r--tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp56
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp4
-rw-r--r--tests/benchmarks/corelib/tools/containers-sequential/main.cpp2
-rw-r--r--tests/benchmarks/corelib/tools/qhash/main.cpp36
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp2
-rw-r--r--tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp6
-rw-r--r--tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp2
-rw-r--r--tests/manual/cmake/CMakeLists.txt83
-rw-r--r--tests/manual/cmake/fail4/CMakeLists.txt2
-rw-r--r--tests/manual/cmake/fail5/CMakeLists.txt2
-rw-r--r--tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt2
-rw-r--r--tests/manual/cmake/pass1/CMakeLists.txt1
-rw-r--r--tests/manual/cmake/pass2/CMakeLists.txt2
-rw-r--r--tests/manual/cmake/pass3/CMakeLists.txt2
-rw-r--r--tests/manual/cmake/pass7/CMakeLists.txt11
-rw-r--r--tests/manual/cmake/pass7/main.cpp47
-rw-r--r--tests/manual/qnetworkconfigurationmanager/main.cpp84
-rw-r--r--tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro13
-rw-r--r--tools/configure/Makefile.mingw92
-rw-r--r--tools/configure/Makefile.win32157
-rw-r--r--tools/configure/configure.pro17
-rw-r--r--tools/configure/configure_pch.h25
-rw-r--r--tools/configure/configureapp.cpp31
-rw-r--r--tools/configure/environment.cpp1
1020 files changed, 64053 insertions, 19950 deletions
diff --git a/.gitignore b/.gitignore
index c059b26111..3aeefbafe9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -112,6 +112,8 @@ tests/auto/qmake/testdata/quotedfilenames/*.exe
tests/auto/compilerwarnings/*.exe
tests/auto/qmake/testdata/quotedfilenames/test.cpp
tests/auto/qprocess/fileWriterProcess.txt
+tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/mime/
+tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/mime/
.com.apple.timemachine.supported
tests/auto/qlibrary/libmylib.so*
tests/auto/qresourceengine/runtime_resource.rcc
diff --git a/bin/syncqt b/bin/syncqt
index 15814df3f9..9129de053a 100755
--- a/bin/syncqt
+++ b/bin/syncqt
@@ -607,22 +607,14 @@ sub loadSyncProfile {
sub locateSyncProfile
{
my ($directory) = @_;
- my $syncprofile;
$directory = abs_path($directory);
- while(!defined $syncprofile) {
- local(*D);
- if (opendir(D, $directory)) {
- foreach my $file (sort readdir(D)) {
- next if ($file =~ /^\.\.?$/);
- $syncprofile = "$directory/$file" if ($file =~ /^sync\.profile$/);
- last if (defined $syncprofile);
- }
- closedir(D);
- }
- last if (defined $syncprofile || $directory eq "/" || $directory =~ /^?:[\/\\]$/);
+ while (1) {
+ my $file = $directory."/sync.profile";
+ return $file if (-e $file);
+ my $odir = $directory;
$directory = dirname($directory);
+ return undef if ($directory eq $odir);
}
- return $syncprofile;
}
# check if this is an in-source build, and if so use that as the basedir too
@@ -1138,6 +1130,9 @@ foreach my $lib (@modules_to_sync) {
my $guard = "DEPRECATED_HEADER_" . $lib . "_" . $header;
$guard =~ s/([^a-zA-Z0-9_])/_/g;
+ my $header_dir = dirname($header_path);
+ make_path($header_dir, $lib, $verbose_level);
+
open HEADER, ">$header_path" || die "Could not open $header_path for writing!\n";
print HEADER "#ifndef $guard\n";
print HEADER "#define $guard\n";
diff --git a/config.tests/mac/crc.test b/config.tests/mac/crc.test
deleted file mode 100755
index 9cbe7bad94..0000000000
--- a/config.tests/mac/crc.test
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/sh
-
-SUCCESS=no
-QMKSPEC=$1
-XPLATFORM=`basename "$1"`
-QMAKE_CONFIG=$2
-VERBOSE=$3
-SRCDIR=$4
-OUTDIR=$5
-TEST=$6
-EXE=`basename "$6"`
-ARG=$7
-shift 7
-LFLAGS=""
-INCLUDEPATH=""
-CXXFLAGS=""
-while [ "$#" -gt 0 ]; do
- PARAM=$1
- case $PARAM in
- -framework)
- LFLAGS="$LFLAGS -framework \"$2\""
- shift
- ;;
- -F*|-m*|-x*)
- LFLAGS="$LFLAGS $PARAM"
- CXXFLAGS="$CXXFLAGS $PARAM"
- ;;
- -L*|-l*|-pthread)
- LFLAGS="$LFLAGS $PARAM"
- ;;
- -I*)
- INC=`echo $PARAM | sed -e 's/^-I//'`
- INCLUDEPATH="$INCLUDEPATH $INC"
- ;;
- -f*|-D*)
- CXXFLAGS="$CXXFLAGS $PARAM"
- ;;
- -Qoption)
- # Two-argument form for the Sun Compiler
- CXXFLAGS="$CXXFLAGS $PARAM \"$2\""
- shift
- ;;
- *) ;;
- esac
- shift
-done
-
-# debuggery
-[ "$VERBOSE" = "yes" ] && echo "$DESCRIPTION auto-detection... ($*)"
-
-test -d "$OUTDIR/$TEST" || mkdir -p "$OUTDIR/$TEST"
-
-cd "$OUTDIR/$TEST"
-
-$MAKE distclean >/dev/null 2>&1
-"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "LIBS*=$LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QT_BUILD_TREE=$OUTDIR" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
-
-if [ "$VERBOSE" = "yes" ]; then
- $MAKE
-else
- $MAKE >/dev/null 2>&1
-fi
-
-
-if [ -x "$EXE" ]; then
- foo=`$OUTDIR/$TEST/$EXE $ARG`
- echo "$foo"
-else
- echo "'CUTE'" #1129665605 # == 'CUTE'
-fi
-
diff --git a/config.tests/mac/crc/crc.pro b/config.tests/mac/crc/crc.pro
deleted file mode 100644
index c3abf15759..0000000000
--- a/config.tests/mac/crc/crc.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-SOURCES = main.cpp
-CONFIG -= app_bundle qt
diff --git a/config.tests/mac/crc/main.cpp b/config.tests/mac/crc/main.cpp
deleted file mode 100644
index f02177ccb7..0000000000
--- a/config.tests/mac/crc/main.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the config.tests of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <iostream>
-#include <cstdlib>
-#include <cstring>
-
-
-class CCRC32
-{
-public:
- CCRC32() { initialize(); }
-
- unsigned long FullCRC(const unsigned char *sData, unsigned long ulDataLength)
- {
- unsigned long ulCRC = 0xffffffff;
- PartialCRC(&ulCRC, sData, ulDataLength);
- return(ulCRC ^ 0xffffffff);
- }
-
- void PartialCRC(unsigned long *ulCRC, const unsigned char *sData, unsigned long ulDataLength)
- {
- while(ulDataLength--) {
- *ulCRC = (*ulCRC >> 8) ^ ulTable[(*ulCRC & 0xFF) ^ *sData++];
- }
- }
-
-private:
- void initialize(void)
- {
- unsigned long ulPolynomial = 0x04C11DB7;
- memset(&ulTable, 0, sizeof(ulTable));
- for(int iCodes = 0; iCodes <= 0xFF; iCodes++) {
- ulTable[iCodes] = Reflect(iCodes, 8) << 24;
- for(int iPos = 0; iPos < 8; iPos++) {
- ulTable[iCodes] = ((ulTable[iCodes] << 1) & 0xffffffff)
- ^ ((ulTable[iCodes] & (1 << 31)) ? ulPolynomial : 0);
- }
-
- ulTable[iCodes] = Reflect(ulTable[iCodes], 32);
- }
- }
- unsigned long Reflect(unsigned long ulReflect, const char cChar)
- {
- unsigned long ulValue = 0;
- // Swap bit 0 for bit 7, bit 1 For bit 6, etc....
- for(int iPos = 1; iPos < (cChar + 1); iPos++) {
- if(ulReflect & 1) {
- ulValue |= (1ul << (cChar - iPos));
- }
- ulReflect >>= 1;
- }
- return ulValue;
- }
- unsigned long ulTable[256]; // CRC lookup table array.
-};
-
-
-int main(int argc, char **argv)
-{
- CCRC32 crc;
- char *name;
- if (argc < 2) {
- std::cerr << "usage: crc <string>\n";
- return 0;
- } else {
- name = argv[1];
- }
- std::cout << crc.FullCRC((unsigned char *)name, strlen(name)) << std::endl;
-}
diff --git a/config.tests/mac/defaultarch.test b/config.tests/mac/defaultarch.test
deleted file mode 100755
index 80f244a8bb..0000000000
--- a/config.tests/mac/defaultarch.test
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-COMPILER=$1
-VERBOSE=$2
-WORKDIR=$3
-QT_MAC_DEFAULT_ARCH=
-
-touch defaultarch.c
-
-# compile something and run 'file' on it.
-if "$COMPILER" -c defaultarch.c 2>/dev/null 1>&2; then
- FIlE_OUTPUT=`file defaultarch.o`
- [ "$VERBOSE" = "yes" ] && echo "'file' reports compiler ($COMPILER) default architechture as: $FIlE_OUTPUT"
-
-fi
-rm -f defaultarch.c defaultarch.o
-
-# detect our known archs.
-if echo "$FIlE_OUTPUT" | grep '\<i386\>' > /dev/null 2>&1; then
- QT_MAC_DEFAULT_ARCH=x86 # configure knows it as "x86" not "i386"
-fi
-if echo "$FIlE_OUTPUT" | grep '\<x86_64\>' > /dev/null 2>&1; then
- QT_MAC_DEFAULT_ARCH=x86_64
-fi
-if echo "$FIlE_OUTPUT" | grep '\<ppc\>' > /dev/null 2>&1; then
- QT_MAC_DEFAULT_ARCH=ppc
-fi
-if echo "$FIlE_OUTPUT" | grep '\<ppc64\>' > /dev/null 2>&1; then
- QT_MAC_DEFAULT_ARCH=ppc64
-fi
-
-[ "$VERBOSE" = "yes" ] && echo "setting QT_MAC_DEFAULT_ARCH to \"$QT_MAC_DEFAULT_ARCH\""
-export QT_MAC_DEFAULT_ARCH
diff --git a/config.tests/mac/xarch.test b/config.tests/mac/xarch.test
deleted file mode 100755
index 08322a96cf..0000000000
--- a/config.tests/mac/xarch.test
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-
-XARCH_SUPPORT=no
-COMPILER=$1
-VERBOSE=$2
-WORKDIR=$3
-
-touch xarch.c
-
-if "$COMPILER" -c xarch.c -Xarch_i386 -mmmx 2>/dev/null 1>&2; then
- if "$COMPILER" -c xarch.c -Xarch_i386 -mmmx 2>&1 | grep "unrecognized" >/dev/null ; then
- true
- else
- XARCH_SUPPORT=yes
- fi
-fi
-rm -f xarch.c xarch.o
-
-# done
-if [ "$XARCH_SUPPORT" != "yes" ]; then
- [ "$VERBOSE" = "yes" ] && echo "Xarch is not supported"
- exit 0
-else
- [ "$VERBOSE" = "yes" ] && echo "Xarch support detected"
- exit 1
-fi
diff --git a/config.tests/unix/endian.test b/config.tests/unix/endian.test
index 2985fd8241..6c5c311888 100755
--- a/config.tests/unix/endian.test
+++ b/config.tests/unix/endian.test
@@ -4,13 +4,14 @@ QMKSPEC=$1
VERBOSE=$2
SRCDIR=$3
OUTDIR=$4
+QMFLAGS=$5
# debuggery
[ "$VERBOSE" = "yes" ] && echo "Determining machine byte-order... ($*)"
# build and run a test program
test -d "$OUTDIR/config.tests/unix/endian" || mkdir -p "$OUTDIR/config.tests/unix/endian"
-"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "QMAKE_LFLAGS+=$SYSROOT_FLAG" "$SRCDIR/config.tests/unix/endian/endiantest.pro" -o "$OUTDIR/config.tests/unix/endian/Makefile" >/dev/null 2>&1
+"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" $QMFLAGS "$SRCDIR/config.tests/unix/endian/endiantest.pro" -o "$OUTDIR/config.tests/unix/endian/Makefile" >/dev/null 2>&1
cd "$OUTDIR/config.tests/unix/endian"
diff --git a/src/corelib/arch/qatomic_arm.h b/config.tests/unix/evdev/evdev.cpp
index 3852bbb9e2..3dddd60038 100644
--- a/src/corelib/arch/qatomic_arm.h
+++ b/config.tests/unix/evdev/evdev.cpp
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the QtCore module of the Qt Toolkit.
+** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,28 +39,21 @@
**
****************************************************************************/
-#ifndef QATOMIC_ARM_H
-#define QATOMIC_ARM_H
+#include <linux/input.h>
-#if defined(__ARM_ARCH_7__) \
- || defined(__ARM_ARCH_7A__) \
- || defined(__ARM_ARCH_7R__) \
- || defined(__ARM_ARCH_7M__)
-# define QT_ARCH_ARMV7
-# include "QtCore/qatomic_armv7.h"
-#elif defined(__ARM_ARCH_6__) \
- || defined(__ARM_ARCH_6J__) \
- || defined(__ARM_ARCH_6T2__) \
- || defined(__ARM_ARCH_6Z__) \
- || defined(__ARM_ARCH_6K__) \
- || defined(__ARM_ARCH_6ZK__) \
- || defined(__ARM_ARCH_6M__) \
- || (defined(__TARGET_ARCH_ARM) && (__TARGET_ARCH_ARM-0 >= 6))
-# define QT_ARCH_ARMV6
-# include "QtCore/qatomic_armv6.h"
-#else
-# define QT_ARCH_ARMV5
-# include "QtCore/qatomic_armv5.h"
-#endif
+enum {
+ e1 = ABS_MT_POSITION_X,
+ e2 = ABS_MT_TRACKING_ID,
+ e3 = ABS_PRESSURE,
+ e4 = ABS_X,
+ e5 = REL_X,
+ e6 = SYN_REPORT,
+ e7 = SYN_MT_REPORT
+};
-#endif // QATOMIC_ARM_H
+int main()
+{
+ ::input_event buf[32];
+ (void) buf;
+ return 0;
+}
diff --git a/config.tests/unix/evdev/evdev.pro b/config.tests/unix/evdev/evdev.pro
new file mode 100644
index 0000000000..42db391216
--- /dev/null
+++ b/config.tests/unix/evdev/evdev.pro
@@ -0,0 +1,2 @@
+SOURCES = evdev.cpp
+CONFIG -= qt
diff --git a/config.tests/unix/libudev/libudev.cpp b/config.tests/unix/libudev/libudev.cpp
new file mode 100644
index 0000000000..1a08a715d8
--- /dev/null
+++ b/config.tests/unix/libudev/libudev.cpp
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <libudev.h>
+
+int main()
+{
+ udev *u = udev_new();
+ udev_unref(u);
+ return 0;
+}
diff --git a/config.tests/unix/libudev/libudev.pro b/config.tests/unix/libudev/libudev.pro
new file mode 100644
index 0000000000..7f571b5a6d
--- /dev/null
+++ b/config.tests/unix/libudev/libudev.pro
@@ -0,0 +1,3 @@
+SOURCES = libudev.cpp
+CONFIG -= qt
+LIBS += -ludev
diff --git a/configure b/configure
index 5e78360fa6..20df77f395 100755
--- a/configure
+++ b/configure
@@ -278,12 +278,6 @@ earlyArgParse()
VAL=$1
fi
;;
- -nacl)
- shift;
- VAR=nacl
- VAL=$1
- ;;
-
-h|help|--help|-help)
if [ "$VAL" = "yes" ]; then
OPT_HELP="$VAL"
@@ -334,15 +328,6 @@ earlyArgParse()
CFG_EMBEDDED=no
fi
;;
- nacl)
- echo "Using NaCl at $VAL."
- PLATFORM_X11=no
- PLATFORM_MAC=no
- PLATFORM_QWS=no
- CFG_NACL_PATH=$VAL
- CFG_EMBEDDED=nacl
- ;;
-
developer-build)
CFG_DEV="yes"
;;
@@ -727,6 +712,8 @@ CFG_XKB=auto
CFG_XCB=auto
CFG_XCB_LIMITED=yes
CFG_WAYLAND=auto
+CFG_LIBUDEV=auto
+CFG_EVDEV=auto
CFG_NIS=auto
CFG_CUPS=auto
CFG_ICONV=auto
@@ -772,7 +759,6 @@ CFG_FRAMEWORK=auto
CFG_MAC_ARCHS=
MAC_CONFIG_TEST_COMMANDLINE= # used to make the configure tests run with the correct arch's and SDK settings
CFG_MAC_DWARF2=auto
-CFG_MAC_XARCH=auto
CFG_MAC_HARFBUZZ=no
CFG_SXE=no
CFG_PREFIX_INSTALL=yes
@@ -913,36 +899,6 @@ if [ -d "$relpath/src/plugins/imageformats" ]; then
fi
#-------------------------------------------------------------------------------
-# Set Default NaCl options
-#-------------------------------------------------------------------------------
-if [ "$CFG_EMBEDDED" = "nacl" ]; then
- echo "Setting NaCl options:"
- echo "-static"
- CFG_SHARED=no
- echo "-qpa nacl"
- PLATFORM_QPA=yes
- echo "-fast"
- OPT_FAST=yes
- echo "-qconfig nacl"
- CFG_QCONFIG=nacl
-
- if [ `uname` = "Linux" ]; then
- I_FLAGS="$I_FLAGS -I${CFG_NACL_PATH}/toolchain/linux_x86/sdk/nacl-sdk/include"
- L_FLAGS="$L_FLAGS -I${CFG_NACL_PATH}/toolchain/linux_x86/sdk/nacl-sdk/lib"
- else
- I_FLAGS="$I_FLAGS -I${CFG_NACL_PATH}/toolchain/mac_x86/sdk/nacl-sdk/include"
- L_FLAGS="$L_FLAGS -I${CFG_NACL_PATH}/toolchain/mac_x86/sdk/nacl-sdk/lib"
- fi
-
- echo "-no-mediaservices -no-sql-sqlite -nomake tests"
- CFG_MEDIASERVICES=no
- CFG_SQLITE=no
- CFG_SQL_sqlite=no
- CFG_NOBUILD_PARTS="$CFG_NOBUILD_PARTS tests"
- QT_CONFIG="$QT_CONFIG nacl"
-fi
-
-#-------------------------------------------------------------------------------
# parse command line arguments
#-------------------------------------------------------------------------------
@@ -1039,10 +995,6 @@ while [ "$#" -gt 0 ]; do
VAL=$1
fi
;;
- -nacl)
- VAR=nacl
- shift;
- ;;
-opengl)
VAR=opengl
# this option may or may not be followed by an argument
@@ -1269,8 +1221,6 @@ while [ "$#" -gt 0 ]; do
PLATFORM_QWS=no
PLATFORM_QPA=yes
;;
- nacl)
- ;;
sse)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_SSE="$VAL"
@@ -1355,7 +1305,7 @@ while [ "$#" -gt 0 ]; do
PLATFORM_X11=yes
;;
sdk)
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
CFG_SDK="$VAL"
else
UNKNOWN_OPT=yes
@@ -1381,7 +1331,7 @@ while [ "$#" -gt 0 ]; do
CFG_HOST_ARCH=$VAL
;;
harfbuzz)
- if [ "$PLATFORM_MAC" = "yes" ] && [ "$VAL" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ] && [ "$VAL" = "yes" ]; then
CFG_MAC_HARFBUZZ="$VAL"
else
UNKNOWN_OPT=yes
@@ -1389,7 +1339,7 @@ while [ "$#" -gt 0 ]; do
;;
framework)
- if [ "$PLATFORM_MAC" = "yes" ] || [ "$PLATFORM_QPA" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
CFG_FRAMEWORK="$VAL"
else
UNKNOWN_OPT=yes
@@ -1843,6 +1793,20 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ libudev)
+ if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+ CFG_LIBUDEV="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
+ evdev)
+ if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+ CFG_EVDEV="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
cups)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_CUPS="$VAL"
@@ -2128,7 +2092,7 @@ while [ "$#" -gt 0 ]; do
l_FLAGS="$l_FLAGS -l\"${VAL}\""
;;
add_fpath)
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
L_FLAGS="$L_FLAGS -F\"${VAL}\""
I_FLAGS="$I_FLAGS -F\"${VAL}\""
else
@@ -2136,7 +2100,7 @@ while [ "$#" -gt 0 ]; do
fi
;;
add_framework)
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
l_FLAGS="$l_FLAGS -framework \"${VAL}\""
else
UNKNOWN_OPT=yes
@@ -2487,7 +2451,7 @@ if [ -z "$PLATFORM" ]; then
PLATFORM_NOTES=
case "$UNAME_SYSTEM:$UNAME_RELEASE" in
Darwin:*)
- if [ "$PLATFORM_MAC" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+ if [ "$PLATFORM_QPA" = "yes" ]; then
OSX_VERSION=`uname -r | cut -d. -f1`
if [ "$OSX_VERSION" -ge 11 ]; then
# We're on Lion or above. Check if we have a supported Clang version
@@ -2688,7 +2652,7 @@ if [ "$PLATFORM" != "$XPLATFORM" ]; then
QMAKE_CONFIG="$QMAKE_CONFIG cross_compile"
fi
-if [ "$PLATFORM_MAC" = "yes" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ]; then
if [ `basename $QMAKESPEC` = "macx-xcode" ] || [ `basename $XQMAKESPEC` = "macx-xcode" ]; then
echo >&2
echo " Platform 'macx-xcode' should not be used when building Qt/Mac." >&2
@@ -3027,7 +2991,7 @@ if [ '!' -z "$CFG_SDK" ]; then
fi
# find the default framework value
-if [ "$PLATFORM_MAC" = "yes" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ]; then
if [ "$CFG_FRAMEWORK" = "auto" ]; then
CFG_FRAMEWORK="$CFG_SHARED"
elif [ "$CFG_FRAMEWORK" = "yes" ] && [ "$CFG_SHARED" = "no" ]; then
@@ -3041,9 +3005,8 @@ else
fi
QMAKE_CONF_COMPILER=`getQMakeConf "$XQMAKESPEC" | grep "^QMAKE_CXX[^_A-Z0-9]" | sed "s,.* *= *\(.*\)$,\1," | tail -1`
-TEST_COMPILER="$CXX"
-[ -z "$TEST_COMPILER" ] && TEST_COMPILER=$QMAKE_CONF_COMPILER
+TEST_COMPILER=$QMAKE_CONF_COMPILER
if [ "$XPLATFORM_SYMBIAN_SBSV2" = "no" ]; then
if [ -z "$TEST_COMPILER" ]; then
echo "ERROR: Cannot set the compiler for the configuration tests"
@@ -3051,10 +3014,6 @@ if [ "$XPLATFORM_SYMBIAN_SBSV2" = "no" ]; then
fi
fi
-if [ "$CFG_EMBEDDED" = "nacl" ]; then
- TEST_COMPILER="nacl-gcc"
-fi
-
SYSROOT_FLAG=
if [ -n "$CFG_SYSROOT" ]; then
if compilerSupportsFlag --sysroot="$CFG_SYSROOT"; then
@@ -3077,7 +3036,7 @@ if [ "$CFG_PRECOMPILE" = "auto" ]; then
fi
#auto-detect DWARF2 on the mac
-if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_MAC_DWARF2" = "auto" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ] && [ "$CFG_MAC_DWARF2" = "auto" ]; then
if "$mactests/dwarf2.test" "$TEST_COMPILER" "$OPT_VERBOSE" "$mactests" ; then
CFG_MAC_DWARF2=no
else
@@ -3141,15 +3100,8 @@ if [ "$PLATFORM_QWS" = "yes" ] && [ "$CFG_OPENGL" = "auto" ]; then
CFG_OPENGL=no
fi
-# mac
-if [ "$PLATFORM_MAC" = "yes" ]; then
- if [ "$CFG_OPENGL" = "auto" ] || [ "$CFG_OPENGL" = "yes" ]; then
- CFG_OPENGL=desktop
- fi
-fi
-
# find the default framework value
-if [ "$PLATFORM_MAC" = "yes" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ]; then
if [ "$CFG_FRAMEWORK" = "auto" ]; then
CFG_FRAMEWORK="$CFG_SHARED"
elif [ "$CFG_FRAMEWORK" = "yes" ] && [ "$CFG_SHARED" = "no" ]; then
@@ -3162,18 +3114,6 @@ else
CFG_FRAMEWORK=no
fi
-# Print a warning if configure was called with the 10.4u SDK option on Snow Leopard
-# with the default mkspec. The 10.4u SDK does not support gcc 4.2.
-if [ "$PLATFORM_MAC" = "yes" ] && [ '!' -z "$CFG_SDK" ]; then
- # get the darwin version. 10.0.0 and up means snow leopard.
- VERSION=`uname -r | tr '.' ' ' | awk '{print $1}'`
- if [ "$VERSION" -gt 9 ] && [ "$CFG_SDK" == "/Developer/SDKs/MacOSX10.4u.sdk/" ] && [ "$PLATFORM" == "macx-g++" ]; then
- echo
- echo "WARNING: The 10.4u SDK does not support gcc 4.2. Configure with -platform macx-g++40. "
- echo
- fi
-fi
-
# x11 tests are done after qmake is built
@@ -3211,7 +3151,7 @@ QT_INSTALL_PREFIX=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_PREFIX"`
if [ -z "$QT_INSTALL_DOCS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_DOCS="/Developer/Documentation/Qt"
fi
fi
@@ -3222,7 +3162,7 @@ QT_INSTALL_DOCS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_DOCS"`
if [ -z "$QT_INSTALL_HEADERS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
if [ "$CFG_FRAMEWORK" = "yes" ]; then
QT_INSTALL_HEADERS=
fi
@@ -3235,7 +3175,7 @@ QT_INSTALL_HEADERS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_HEADERS"`
if [ -z "$QT_INSTALL_LIBS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
if [ "$CFG_FRAMEWORK" = "yes" ]; then
QT_INSTALL_LIBS="/Libraries/Frameworks"
fi
@@ -3247,7 +3187,7 @@ QT_INSTALL_LIBS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_LIBS"`
if [ -z "$QT_INSTALL_BINS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_BINS="/Developer/Applications/Qt"
fi
fi
@@ -3257,7 +3197,7 @@ QT_INSTALL_BINS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_BINS"`
if [ -z "$QT_INSTALL_PLUGINS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_PLUGINS="/Developer/Applications/Qt/plugins"
fi
fi
@@ -3267,7 +3207,7 @@ QT_INSTALL_PLUGINS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_PLUGINS"`
if [ -z "$QT_INSTALL_IMPORTS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_IMPORTS="/Developer/Applications/Qt/imports"
fi
fi
@@ -3286,7 +3226,7 @@ fi
QT_INSTALL_TRANSLATIONS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_TRANSLATIONS"`
if [ -z "$QT_INSTALL_SETTINGS" ]; then #default
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_SETTINGS=/Library/Preferences/Qt
else
QT_INSTALL_SETTINGS=/etc/xdg
@@ -3296,7 +3236,7 @@ QT_INSTALL_SETTINGS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_SETTINGS"
if [ -z "$QT_INSTALL_EXAMPLES" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_EXAMPLES="/Developer/Examples/Qt"
fi
fi
@@ -3307,7 +3247,7 @@ QT_INSTALL_EXAMPLES=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_EXAMPLES"
#tests
if [ -z "$QT_INSTALL_TESTS" ]; then #default
if [ "$CFG_PREFIX_INSTALL" = "no" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
QT_INSTALL_TESTS="/Developer/Tests/Qt"
fi
fi
@@ -4053,8 +3993,6 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
Platform="Qt for Embedded Linux"
elif [ "$PLATFORM_QPA" = "yes" ]; then
Platform="Qt Lighthouse"
-elif [ "$PLATFORM_MAC" = "yes" ]; then
- Platform="Qt for Mac OS X"
elif [ "$XPLATFORM_MINGW" = "yes" ]; then
Platform="Qt for Windows"
elif [ '!' -z "`getQMakeConf \"$XQMAKESPEC\" | grep QMAKE_LIBS_X11 | awk '{print $3;}'`" ]; then
@@ -4478,14 +4416,12 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_LFLAGS="$EXTRA_LFLAGS -lm"
fi
- [ -n "$CC" ] && echo "CC = $CC" >> "$mkfile"
- [ -n "$CXX" ] && echo "CXX = $CXX" >> "$mkfile"
if [ "$CFG_SILENT" = "yes" ]; then
- [ -z "$CC" ] && setBootstrapVariable QMAKE_CC 's,QMAKE_CC.*=,CC=\@,'
- [ -z "$CXX" ] && setBootstrapVariable QMAKE_CXX 's,QMAKE_CXX.*=,CXX=\@,'
+ setBootstrapVariable QMAKE_CC 's,QMAKE_CC.*=,CC=\@,'
+ setBootstrapVariable QMAKE_CXX 's,QMAKE_CXX.*=,CXX=\@,'
else
- [ -z "$CC" ] && setBootstrapVariable QMAKE_CC 's,QMAKE_CC,CC,'
- [ -z "$CXX" ] && setBootstrapVariable QMAKE_CXX 's,QMAKE_CXX,CXX,'
+ setBootstrapVariable QMAKE_CC 's,QMAKE_CC,CC,'
+ setBootstrapVariable QMAKE_CXX 's,QMAKE_CXX,CXX,'
fi
setBootstrapVariable QMAKE_CFLAGS
setBootstrapVariable QMAKE_CXXFLAGS 's,\$\$QMAKE_CFLAGS,\$(QMAKE_CFLAGS),'
@@ -4833,7 +4769,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
odbc)
if [ "$CFG_SQL_odbc" != "no" ]; then
- if ( [ "$PLATFORM_MAC" != "yes" ] || [ "$XPLATFORM_MINGW" = "yes" ] ) && "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/odbc "ODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
+ if ( [ "$BUILD_ON_MAC" != "yes" ] || [ "$XPLATFORM_MINGW" = "yes" ] ) && "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/odbc "ODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_odbc" = "auto" ]; then
CFG_SQL_odbc=plugin
fi
@@ -5543,7 +5479,7 @@ if [ "$PLATFORM_X11" = "yes" ]; then
fi # X11
-if [ "$PLATFORM_MAC" = "yes" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ]; then
if [ "$CFG_PHONON" != "no" ]; then
# Always enable Phonon (unless it was explicitly disabled)
CFG_PHONON=yes
@@ -5561,9 +5497,7 @@ fi
if [ "$PLATFORM_QPA" = "yes" ]; then
# auto-detect OpenGL support (es2 = OpenGL ES 2.x)
- if [ "$PLATFORM_MAC" = "yes" ]; then
- CFG_OPENGL=desktop
- elif [ "$CFG_OPENGL" = "auto" ] || [ "$CFG_OPENGL" = "yes" ]; then
+ if [ "$CFG_OPENGL" = "auto" ] || [ "$CFG_OPENGL" = "yes" ]; then
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengldesktop "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
CFG_OPENGL=desktop
elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS; then
@@ -5651,6 +5585,32 @@ if [ "$PLATFORM_QPA" = "yes" ]; then
fi
fi
+ if [ "$CFG_LIBUDEV" != "no" ]; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libudev "libudev" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ CFG_LIBUDEV=yes
+ QT_CONFIG="$QT_CONFIG libudev"
+ elif [ "$CFG_LIBUDEV" = "yes" ]; then
+ echo "The libudev functionality test failed!"
+ exit 1
+ else
+ CFG_LIBUDEV=no
+ QMakeVar add DEFINES QT_NO_LIBUDEV
+ fi
+ fi
+
+ if [ "$CFG_EVDEV" != "no" ]; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/evdev "evdev" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ CFG_EVDEV=yes
+ QT_CONFIG="$QT_CONFIG evdev"
+ elif [ "$CFG_EVDEV" = "yes" ]; then
+ echo "The evdev functionality test failed!"
+ exit 1
+ else
+ CFG_EVDEV=no
+ QMakeVar add DEFINES QT_NO_EVDEV
+ fi
+ fi
+
# Check we actually have X11 :-)
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/xlib "XLib" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
QT_CONFIG="$QT_CONFIG xlib"
@@ -5675,18 +5635,22 @@ if [ "$PLATFORM_QPA" = "yes" ]; then
fi
if [ "$CFG_XCB" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb "xcb" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists xcb 2>/dev/null; then
+ QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`"
+ QMAKE_LIBS_XCB="`$PKG_CONFIG --libs xcb 2>/dev/null`"
+ fi
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb "xcb" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
CFG_XCB=yes
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb-render "xcb-render" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb-render "xcb-render" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
QT_CONFIG="$QT_CONFIG xcb-render"
fi
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb-poll-for-queued-event "xcb-poll-for-queued-event" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb-poll-for-queued-event "xcb-poll-for-queued-event" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
CFG_XCB_LIMITED=no
QT_CONFIG="$QT_CONFIG xcb-poll-for-queued-event"
fi
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb-xlib "xcb-xlib" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/xcb-xlib "xcb-xlib" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
QT_CONFIG="$QT_CONFIG xcb-xlib"
fi
@@ -5921,7 +5885,6 @@ fi
# freetype support
[ "x$CFG_EMBEDDED" != "xno" ] && CFG_LIBFREETYPE="$CFG_QWS_FREETYPE"
-[ "x$PLATFORM_MAC" = "xyes" ] && CFG_LIBFREETYPE=no
[ "$XPLATFORM_MINGW" = "yes" ] && [ "$CFG_LIBFREETYPE" = "auto" ] && CFG_LIBFREETYPE=no
if [ "$CFG_LIBFREETYPE" = "auto" ]; then
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/freetype "FreeType" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
@@ -5934,10 +5897,8 @@ fi
if [ "$CFG_ENDIAN" = "auto" ]; then
if [ "$XPLATFORM_MINGW" = "yes" ]; then
CFG_ENDIAN="Q_LITTLE_ENDIAN"
- elif [ "$PLATFORM_MAC" = "yes" ]; then
- true #leave as auto
else
- "$unixtests/endian.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath"
+ "$unixtests/endian.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "QMAKE_LFLAGS+=$SYSROOT_FLAG"
F="$?"
if [ "$F" -eq 0 ]; then
CFG_ENDIAN="Q_LITTLE_ENDIAN"
@@ -5955,7 +5916,7 @@ if [ "$CFG_ENDIAN" = "auto" ]; then
fi
if [ "$CFG_HOST_ENDIAN" = "auto" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
true #leave as auto
else
"$unixtests/endian.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath"
@@ -6298,11 +6259,30 @@ if [ "$CFG_MAC_DWARF2" = "yes" ]; then
QT_CONFIG="$QT_CONFIG dwarf2"
fi
-# Set the default arch if there are no "-arch" arguments on the configure line
-if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_MAC_ARCHS" = "" ]; then
- source "$mactests/defaultarch.test" "$TEST_COMPILER" "$OPT_VERBOSE" "$mactests"
- CFG_MAC_ARCHS=" $QT_MAC_DEFAULT_ARCH"
- [ "$OPT_VERBOSE" = "yes" ] && echo "Setting Mac architechture to$CFG_MAC_ARCHS."
+# Set the default Mac OS X arch if there are no "-arch" arguments on the configure line
+if [ "$BUILD_ON_MAC" = "yes" ]; then
+ DEFAULT_ARCH="$CFG_MAC_ARCHS"
+ if [ -z "$DEFAULT_ARCH" ]; then
+ case `file "${outpath}/bin/qmake"` in
+ *i?86)
+ DEFAULT_ARCH=x86
+ ;;
+ *x86_64)
+ DEFAULT_ARCH=x86_64
+ ;;
+ *ppc|*ppc64|*)
+ # unsupported/unknown
+ ;;
+ esac
+ fi
+ if [ -n "$DEFAULT_ARCH" ]; then
+ [ "$OPT_VERBOSE" = "yes" ] && echo "Setting default Mac OS X architechture to $DEFAULT_ARCH."
+ QT_CONFIG="$QT_CONFIG $DEFAULT_ARCH"
+ QMAKE_CONFIG="$QMAKE_CONFIG $DEFAULT_ARCH"
+ # Make the application arch follow the Qt arch for single arch builds.
+ # (for multiple-arch builds, set CONFIG manually in the application .pro file)
+ [ `echo "$DEFAULT_ARCH" | wc -w` -eq 1 ] && QTCONFIG_CONFIG="$QTCONFIG_CONFIG $DEFAULT_ARCH"
+ fi
fi
# ### Vestige
@@ -6398,12 +6378,6 @@ if [ "$PLATFORM_QPA" = "yes" ]; then
rm -f "src/.moc/$QMAKE_OUTDIR/allmoc.cpp" # needs remaking if config changes
fi
-if [ "$CFG_EMBEDDED" = "nacl" ]; then
- QMAKE_CONFIG="$QMAKE_CONFIG nacl pepper"
- QT_CONFIG="$QT_CONFIG nacl pepper"
- rm -f "src/.moc/$QMAKE_OUTDIR/allmoc.cpp" # needs remaking if config changes
-fi
-
if [ "$XPLATFORM_MINGW" != "yes" ]; then
# Do not set this here for Windows. Let qmake do it so
# debug and release precompiled headers are kept separate.
@@ -6446,7 +6420,6 @@ fi
[ "$CFG_AVX" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx"
[ "$CFG_IWMMXT" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG iwmmxt"
[ "$CFG_NEON" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG neon"
-[ "$PLATFORM_MAC" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG $CFG_MAC_ARCHS"
if [ "$CFG_CLOCK_GETTIME" = "yes" ]; then
QT_CONFIG="$QT_CONFIG clock-gettime"
fi
@@ -6512,7 +6485,7 @@ else
fi
-if [ "x$PLATFORM_MAC" = "xyes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then
+if [ "x$BUILD_ON_MAC" = "xyes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then
#On Mac we implicitly link against libz, so we
#never use the 3rdparty stuff.
[ "$CFG_ZLIB" = "yes" ] && CFG_ZLIB="system"
@@ -7011,7 +6984,7 @@ if [ "$CFG_FRAMEWORK" = "yes" ]; then
echo "#define QT_MAC_FRAMEWORK_BUILD" >>"$outpath/src/corelib/global/qconfig.h.new"
fi
-if [ "$PLATFORM_MAC" = "yes" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ]; then
cat >>"$outpath/src/corelib/global/qconfig.h.new" <<EOF
#if defined(__LP64__)
# define QT_POINTER_SIZE 8
@@ -7024,6 +6997,11 @@ else
echo "#define QT_POINTER_SIZE $?" >>"$outpath/src/corelib/global/qconfig.h.new"
fi
+#REDUCE_RELOCATIONS is a elf/unix only thing, so not in windows configure.exe
+if [ "$CFG_REDUCE_RELOCATIONS" = "yes" ]; then
+ echo "#define QT_REDUCE_RELOCATIONS" >>"$outpath/src/corelib/global/qconfig.h.new"
+fi
+
echo "" >>"$outpath/src/corelib/global/qconfig.h.new"
@@ -7257,19 +7235,10 @@ else
QT_CONFIG="$QT_CONFIG qt_framework"
QTCONFIG_CONFIG="$QTCONFIG_CONFIG qt_framework"
fi
-if [ "$BUILD_ON_MAC" = "yes" ]; then
- QT_CONFIG="$QT_CONFIG $CFG_MAC_ARCHS"
-fi
if [ "$CFG_DEV" = "yes" ]; then
QT_CONFIG="$QT_CONFIG private_tests"
fi
-# Make the application arch follow the Qt arch for single arch builds.
-# (for multiple-arch builds, set CONFIG manually in the application .pro file)
-if [ `echo "$CFG_MAC_ARCHS" | wc -w` -eq 1 ]; then
- QTCONFIG_CONFIG="$QTCONFIG_CONFIG $CFG_MAC_ARCHS"
-fi
-
cat >>"$QTCONFIG.tmp" <<EOF
#configuration
CONFIG += $QTCONFIG_CONFIG
@@ -7286,7 +7255,6 @@ QT_PATCH_VERSION = $QT_PATCH_VERSION
#namespaces
QT_LIBINFIX = $QT_LIBINFIX
QT_NAMESPACE = $QT_NAMESPACE
-QT_NAMESPACE_MAC_CRC = $QT_NAMESPACE_MAC_CRC
EOF
if [ -n "$CFG_SYSROOT" ]; then
@@ -7328,7 +7296,7 @@ QTMODULE="$outpath/mkspecs/qmodule.pri"
echo "CONFIG += create_prl link_prl" >> "$QTMODULE.tmp"
# Ensure we can link to uninistalled libraries
-if [ "$XPLATFORM_MINGW" != "yes" ] && [ "$CFG_EMBEDDED" != "nacl" ] && linkerSupportsFlag -rpath-link "$outpath/lib"; then
+if [ "$BUILD_ON_MAC" != "yes" ] && [ "$XPLATFORM_MINGW" != "yes" ] && linkerSupportsFlag -rpath-link "$outpath/lib"; then
echo "QMAKE_LFLAGS = -Wl,-rpath-link,\$\$QT_BUILD_TREE/lib \$\$QMAKE_LFLAGS" >> "$QTMODULE.tmp"
fi
if [ -n "$QT_CFLAGS_PSQL" ]; then
@@ -7372,11 +7340,6 @@ if [ '!' -z "$CFG_SDK" ]; then
echo "QMAKE_MAC_SDK = $CFG_SDK" >> "$QTMODULE.tmp"
fi
-# mac gcc -Xarch support
-if [ "$CFG_MAC_XARCH" = "no" ]; then
- echo "QMAKE_MAC_XARCH = no" >> "$QTMODULE.tmp"
-fi
-
# cmdline args
cat "$QMAKE_VARS_FILE" >> "$QTMODULE.tmp"
rm -f "$QMAKE_VARS_FILE" 2>/dev/null
@@ -7655,7 +7618,7 @@ elif [ "$CFG_OPENSSL" = "linked" ]; then
fi
echo "OpenSSL support ........ $CFG_OPENSSL $OPENSSL_LINKAGE"
echo "Alsa support ........... $CFG_ALSA"
-if [ "$PLATFORM_MAC" = "yes" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ]; then
echo "CoreWlan support ....... $CFG_COREWLAN"
fi
echo "libICU support ......... $CFG_ICU"
@@ -7687,7 +7650,7 @@ if [ "$CFG_OPENSSL" = "linked" ] && [ "$OPENSSL_LIBS" = "" ]; then
echo " OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked"
echo
fi
-if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_FRAMEWORK" = "yes" ] && [ "$CFG_DEBUG" = "yes" ] && [ "$CFG_DEBUG_RELEASE" = "no" ]; then
+if [ "$BUILD_ON_MAC" = "yes" ] && [ "$CFG_FRAMEWORK" = "yes" ] && [ "$CFG_DEBUG" = "yes" ] && [ "$CFG_DEBUG_RELEASE" = "no" ]; then
echo
echo "Error: debug-only framework builds are not supported. Configure with -no-framework"
echo "if you want a pure debug build."
diff --git a/configure.bat b/configure.bat
new file mode 100644
index 0000000000..e872de2797
--- /dev/null
+++ b/configure.bat
@@ -0,0 +1,121 @@
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+:: Contact: http://www.qt-project.org/
+::
+:: This file is part of the tools applications of the Qt Toolkit.
+::
+:: $QT_BEGIN_LICENSE:LGPL$
+:: GNU Lesser General Public License Usage
+:: This file may be used under the terms of the GNU Lesser General Public
+:: License version 2.1 as published by the Free Software Foundation and
+:: appearing in the file LICENSE.LGPL included in the packaging of this
+:: file. Please review the following information to ensure the GNU Lesser
+:: General Public License version 2.1 requirements will be met:
+:: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+::
+:: In addition, as a special exception, Nokia gives you certain additional
+:: rights. These rights are described in the Nokia Qt LGPL Exception
+:: version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+::
+:: GNU General Public License Usage
+:: Alternatively, this file may be used under the terms of the GNU General
+:: Public License version 3.0 as published by the Free Software Foundation
+:: and appearing in the file LICENSE.GPL included in the packaging of this
+:: file. Please review the following information to ensure the GNU General
+:: Public License version 3.0 requirements will be met:
+:: http://www.gnu.org/copyleft/gpl.html.
+::
+:: Other Usage
+:: Alternatively, this file may be used in accordance with the terms and
+:: conditions contained in a signed written agreement between you and Nokia.
+::
+::
+::
+::
+::
+::
+:: $QT_END_LICENSE$
+::
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+set QTSRC=%~dp0
+set QTDIR=%CD%
+if exist configure.exe goto conf
+echo Please wait while bootstrapping configure ...
+
+for %%C in (cl.exe icl.exe g++.exe perl.exe) do set %%C=%%~$PATH:C
+
+set nosyncqt=
+if not exist include (
+ if "%perl.exe%" == "" (
+ echo Perl not found in PATH. Aborting. >&2
+ exit /b 1
+ )
+ if not exist mkspecs (
+ md mkspecs
+ if errorlevel 1 goto exit
+ )
+ perl %QTSRC%bin\syncqt -outdir %QTDIR% %QTSRC%
+ if errorlevel 1 goto exit
+ set nosyncqt=-no-syncqt
+)
+
+if not exist src\corelib\global\qconfig.h (
+ if not exist src\corelib\global (
+ md src\corelib\global
+ if errorlevel 1 goto exit
+ )
+ echo #define Q_BIG_ENDIAN 4321 > src\corelib\global\qconfig.h
+ echo #define Q_LITTLE_ENDIAN 1234 >> src\corelib\global\qconfig.h
+ echo #define Q_BYTE_ORDER Q_LITTLE_ENDIAN >> src\corelib\global\qconfig.h
+)
+
+if not exist tools\configure (
+ md tools\configure
+ if errorlevel 1 goto exit
+)
+cd tools\configure
+if errorlevel 1 goto exit
+
+echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile
+echo/>> Makefile
+for /f "tokens=3 usebackq" %%V in (`findstr QT_VERSION_STR %QTSRC%\src\corelib\global\qglobal.h`) do @echo QTVERSION = %%~V>> Makefile
+if not "%cl.exe%" == "" (
+ echo CXX = cl>>Makefile
+ echo EXTRA_CXXFLAGS =>>Makefile
+ rem This must have a trailing space.
+ echo QTSRC = %QTSRC% >> Makefile
+ set tmpl=win32
+ set make=nmake
+) else if not "%icl.exe%" == "" (
+ echo CXX = icl>>Makefile
+ echo EXTRA_CXXFLAGS = /Zc:forScope>>Makefile
+ rem This must have a trailing space.
+ echo QTSRC = %QTSRC% >> Makefile
+ set tmpl=win32
+ set make=nmake
+) else if not "%g++.exe%" == "" (
+ echo CXX = g++>>Makefile
+ echo EXTRA_CXXFLAGS =>>Makefile
+ rem This must NOT have a trailing space.
+ echo QTSRC = %QTSRC:\=/%>> Makefile
+ set tmpl=mingw
+ set make=mingw32-make
+) else (
+ echo No suitable compiler found in PATH. Aborting. >&2
+ cd ..\..
+ exit /b 1
+)
+echo/>> Makefile
+type %QTSRC%tools\configure\Makefile.%tmpl% >> Makefile
+
+%make%
+if errorlevel 1 (cd ..\.. & exit /b 1)
+
+cd ..\..
+
+:conf
+configure.exe -srcdir %QTSRC% %nosyncqt% %*
+:exit
diff --git a/configure.exe b/configure.exe
deleted file mode 100644
index e27966e3cd..0000000000
--- a/configure.exe
+++ /dev/null
Binary files differ
diff --git a/dist/changes-5.0.0 b/dist/changes-5.0.0
index e73ecc50ee..6ec968a059 100644
--- a/dist/changes-5.0.0
+++ b/dist/changes-5.0.0
@@ -52,9 +52,16 @@ information about a particular change.
in Qt4, so these methods return a bool now. If your code used the undocumented
QBool, simply replace it with bool.
-- QMetaType::construct() has been renamed to QMetaType::create().
+- QMetaType:
+ * QMetaType::construct() has been renamed to QMetaType::create().
+ * QMetaType::unregisterType() has been removed.
- QTestLib:
+ * The plain-text, xml and lightxml test output formats have been changed to
+ show a test result for every row of test data in data-driven tests. In
+ Qt4, only fails and skips were shown for individual data rows and passes
+ were not shown for individual data rows, preventing accurate calculation
+ of test run rates and pass rates.
* The QTRY_VERIFY and QTRY_COMPARE macros have been moved into QTestLib.
These macros formerly lived in tests/shared/util.h but are now provided
by including the <QtTest/QtTest> header. In addition,
@@ -93,8 +100,9 @@ information about a particular change.
text(Text t, int child) -> text(Text t), rect(int child) -> rect()
setText(Text t, int child, const QString &text) -> setText(Text t, const QString &text)
role(int child) -> role(), state(int child) -> state()
- relationTo(int child, const QAccessibleInterface *other, int otherChild) ->
- relationTo(const QAccessibleInterface *other)
+ * parent() and child() was added in order to do hierarchical navigation.
+ * relations() was added as a replacement to relationTo()
+ * As a consequence of the above two points, navigate() was removed.
* Accessible-Action related functions have been removed. QAccessibleInterface
subclasses are expected to implement the QAccessibleActionInterface instead.
These functions have been removed:
@@ -127,10 +135,16 @@ information about a particular change.
* QWidget *widget() has been removed and is replaced by QObject
*target() in order to avoid QWidget dependencies.
+ * QEvent::TouchCancel has been introduced. On systems where it makes
+ sense this event type can be used to differentiate between a
+ regular TouchEnd and abrupt touch sequence cancellations caused by
+ the compositor, for example when a system gesture gets recognized.
+
- QMetaType
- * It is no longer possible to use Q_DECLARE_METATYPE(Foo*) where Foo is only
- forward declared - it must be fully defined.
+ * Q_DECLARE_METATYPE(Foo*) now requires that Foo is fully defined. In
+ cases where a forward declared type should be used as a metatype,
+ Q_DECLARE_OPAQUE_POINTER(Foo*) can be used to allow that.
- QItemEditorFactory
@@ -207,6 +221,8 @@ information about a particular change.
- QSystemLocale has been removed from the public API.
+- QSqlQueryModel::indexInQuery() is now virtual. See note below under QSql.
+
****************************************************************************
* General *
****************************************************************************
@@ -333,6 +349,38 @@ QTestLib
* [QTBUG-20615] Autotests can now log test output to multiple destinations
and log formats simultaneously.
+QtSql
+-----
+QSqlTableModel/QSqlRelationalTableModel
+
+* The dataChanged() signal is now emitted for changes made to an inserted
+record that has not yet been committed. Previously, dataChanged() was
+suppressed in this case for OnRowChange and OnFieldChange. This was probably
+an attempt to avoid trouble if setData() was called while handling
+primeInsert(). By emitting dataChanged(), we ensure that all views are aware
+of the change.
+
+* While handling primeInsert() signal, the record must be manipulated using
+the provided reference. Do not attempt to manipulate the records using the
+model methods setData() or setRecord().
+
+* removeRows() no longer emits extra beforeDelete signal for out of range row.
+
+* removeRows() now requires the whole range of targetted rows to be valid
+before doing anything. Previously, it would remove what it could and
+ignore the rest of the range.
+
+* setRecord() and insertRecord()
+ -Only use fields where generated flag is set to true. This is
+ is consistent with the meaning of the flag.
+ -Require all fields to map correctly. Previously fields that didn't
+ map were simply ignored.
+ -For OnManualSubmit, insertRecord() no longer leaves behind an empty
+ row if setRecord() fails.
+
+* QSqlQueryModel::indexInQuery() is now virtual. See
+QSqlTableModel::indexInQuery() as example of how to implement in a
+subclass.
****************************************************************************
* Database Drivers *
@@ -444,6 +492,13 @@ Qt for Windows CE
cause an abort().
+- QVariant
+
+ * Definition of QVariant::UserType changed. Currently it is the same as
+ QMetaType::User, which means that it points to the first registered custom
+ type, instead of a nonexistent type.
+
+
- QMessageBox
* The static function QMessageBox::question has changed the default argument
diff --git a/doc/src/examples/dirview.qdoc b/doc/src/examples/dirview.qdoc
index 329f90e697..a4b799678a 100644
--- a/doc/src/examples/dirview.qdoc
+++ b/doc/src/examples/dirview.qdoc
@@ -30,7 +30,7 @@
\title Dir View Example
The Dir View example shows a tree view onto the local filing system. It uses the
- QDirModel class to provide supply file and directory information.
+ QDirModel class to provide file and directory information.
\image dirview-example.png
*/
diff --git a/doc/src/examples/editabletreemodel.qdoc b/doc/src/examples/editabletreemodel.qdoc
index 20d9efccd7..306295842e 100644
--- a/doc/src/examples/editabletreemodel.qdoc
+++ b/doc/src/examples/editabletreemodel.qdoc
@@ -48,14 +48,15 @@
As described in the \l{Model Subclassing Reference}, models must
provide implementations for the standard set of model functions:
\l{QAbstractItemModel::}{flags()}, \l{QAbstractItemModel::}{data()},
- \l{QAbstractItemModel::}{headerData()}, and
+ \l{QAbstractItemModel::}{headerData()},
+ \l{QAbstractItemModel::}{columnCount()}, and
\l{QAbstractItemModel::}{rowCount()}. In addition, hierarchical models,
such as this one, need to provide implementations of
\l{QAbstractItemModel::}{index()} and \l{QAbstractItemModel::}{parent()}.
An editable model needs to provide implementations of
\l{QAbstractItemModel::}{setData()} and
- \l{QAbstractItemModel::}{headerData()}, and must return a suitable
+ \l{QAbstractItemModel::}{setHeaderData()}, and must return a suitable
combination of flags from its \l{QAbstractItemModel::}{flags()} function.
Since this example allows the dimensions of the model to be changed,
diff --git a/doc/src/network/files-and-resources/resources.qdoc b/doc/src/network/files-and-resources/resources.qdoc
index 847f086bee..1d0fc51631 100644
--- a/doc/src/network/files-and-resources/resources.qdoc
+++ b/doc/src/network/files-and-resources/resources.qdoc
@@ -101,8 +101,8 @@
In this case, the file is accessible as \c
:/myresources/cut-img.png.
- Some resources, such as translation files and icons, many need to
- change based on the user's locale. This is done by adding a \c lang
+ Some resources need to change based on the user's locale,
+ such as translation files or icons. This is done by adding a \c lang
attribute to the \c qresource tag, specifying a suitable locale
string. For example:
diff --git a/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp b/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp
index b1e5df9001..9d72c42504 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp
+++ b/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp
@@ -73,7 +73,7 @@ MyStruct s2 = var.value<MyStruct>();
//! [3]
int id = QMetaType::type("MyClass");
-if (id == 0) {
+if (id != 0) {
void *myClassPtr = QMetaType::create(id);
...
QMetaType::destroy(id, myClassPtr);
diff --git a/doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp b/doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
new file mode 100644
index 0000000000..e59a96b87a
--- /dev/null
+++ b/doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+QMimeDatabase db;
+QMimeType mime = db.mimeTypeForFile(fileName);
+if (mime.inherits("text/plain")) {
+ // The file is plain text, we can display it in a QTextEdit
+}
+//! [0]
diff --git a/doc/src/snippets/code/src_corelib_thread_qmutex.cpp b/doc/src/snippets/code/src_corelib_thread_qmutex.cpp
index 84fe348eb2..f5fbeb8419 100644
--- a/doc/src/snippets/code/src_corelib_thread_qmutex.cpp
+++ b/doc/src/snippets/code/src_corelib_thread_qmutex.cpp
@@ -114,8 +114,8 @@ int complexFunction(int flag)
switch (flag) {
case 0:
case 1:
- mutex.unlock();
- return moreComplexFunction(flag);
+ retVal = moreComplexFunction(flag);
+ break;
case 2:
{
int status = anotherFunction();
diff --git a/doc/src/snippets/code/src_gui_accessible_qaccessible.cpp b/doc/src/snippets/code/src_gui_accessible_qaccessible.cpp
index 52d40d9038..f12f55051e 100644
--- a/doc/src/snippets/code/src_gui_accessible_qaccessible.cpp
+++ b/doc/src/snippets/code/src_gui_accessible_qaccessible.cpp
@@ -38,15 +38,6 @@
**
****************************************************************************/
-//! [0]
-QAccessibleInterface *child = 0;
-int targetChild = object->navigate(Accessible::Child, 1, &child);
-if (child) {
- // ...
- delete child;
-}
-//! [0]
-
//! [1]
typedef QAccessibleInterface* myFactoryFunction(const QString &key, QObject *);
//! [1]
diff --git a/doc/src/snippets/sqldatabase/sqldatabase.cpp b/doc/src/snippets/sqldatabase/sqldatabase.cpp
index 305c79e6ea..81f806309a 100644
--- a/doc/src/snippets/sqldatabase/sqldatabase.cpp
+++ b/doc/src/snippets/sqldatabase/sqldatabase.cpp
@@ -284,12 +284,12 @@ void QSqlTableModel_snippets()
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
- model->removeColumn(0); // don't show the ID
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
+ view->hideColumn(0); // don't show the ID
view->show();
//! [24]
diff --git a/doc/src/sql/sql-programming/sql-driver.qdoc b/doc/src/sql/sql-programming/sql-driver.qdoc
index 994d31f43f..667b9eba54 100644
--- a/doc/src/sql/sql-programming/sql-driver.qdoc
+++ b/doc/src/sql/sql-programming/sql-driver.qdoc
@@ -494,7 +494,7 @@
\snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 15
Users of MinGW may wish to consult the following online document:
- \l{Compiling PostgreSQL On Native Win32 FAQ}.
+ \l{PostgreSQL MinGW/Native Windows}.
\bold{Note:} This database plugin is not supported for Windows CE.
diff --git a/examples/network/fortuneclient/client.cpp b/examples/network/fortuneclient/client.cpp
index 01048f137d..fe16554eae 100644
--- a/examples/network/fortuneclient/client.cpp
+++ b/examples/network/fortuneclient/client.cpp
@@ -51,26 +51,35 @@ Client::Client(QWidget *parent)
hostLabel = new QLabel(tr("&Server name:"));
portLabel = new QLabel(tr("S&erver port:"));
- // find out which IP to connect to
- QString ipAddress;
+ hostCombo = new QComboBox;
+ hostCombo->setEditable(true);
+ // find out name of this machine
+ QString name = QHostInfo::localHostName();
+ if (!name.isEmpty()) {
+ hostCombo->addItem(name);
+ QString domain = QHostInfo::localDomainName();
+ if (!domain.isEmpty())
+ hostCombo->addItem(name + QChar('.') + domain);
+ }
+ if (name != QString("localhost"))
+ hostCombo->addItem(QString("localhost"));
+ // find out IP addresses of this machine
QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
- // use the first non-localhost IPv4 address
+ // add non-localhost addresses
for (int i = 0; i < ipAddressesList.size(); ++i) {
- if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
- ipAddressesList.at(i).toIPv4Address()) {
- ipAddress = ipAddressesList.at(i).toString();
- break;
- }
+ if (!ipAddressesList.at(i).isLoopback())
+ hostCombo->addItem(ipAddressesList.at(i).toString());
+ }
+ // add localhost addresses
+ for (int i = 0; i < ipAddressesList.size(); ++i) {
+ if (ipAddressesList.at(i).isLoopback())
+ hostCombo->addItem(ipAddressesList.at(i).toString());
}
- // if we did not find one, use IPv4 localhost
- if (ipAddress.isEmpty())
- ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
- hostLineEdit = new QLineEdit(ipAddress);
portLineEdit = new QLineEdit;
portLineEdit->setValidator(new QIntValidator(1, 65535, this));
- hostLabel->setBuddy(hostLineEdit);
+ hostLabel->setBuddy(hostCombo);
portLabel->setBuddy(portLineEdit);
statusLabel = new QLabel(tr("This examples requires that you run the "
@@ -90,7 +99,7 @@ Client::Client(QWidget *parent)
tcpSocket = new QTcpSocket(this);
//! [1]
- connect(hostLineEdit, SIGNAL(textChanged(QString)),
+ connect(hostCombo, SIGNAL(editTextChanged(QString)),
this, SLOT(enableGetFortuneButton()));
connect(portLineEdit, SIGNAL(textChanged(QString)),
this, SLOT(enableGetFortuneButton()));
@@ -107,7 +116,7 @@ Client::Client(QWidget *parent)
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(hostLabel, 0, 0);
- mainLayout->addWidget(hostLineEdit, 0, 1);
+ mainLayout->addWidget(hostCombo, 0, 1);
mainLayout->addWidget(portLabel, 1, 0);
mainLayout->addWidget(portLineEdit, 1, 1);
mainLayout->addWidget(statusLabel, 2, 0, 1, 2);
@@ -150,7 +159,7 @@ void Client::requestNewFortune()
blockSize = 0;
tcpSocket->abort();
//! [7]
- tcpSocket->connectToHost(hostLineEdit->text(),
+ tcpSocket->connectToHost(hostCombo->currentText(),
portLineEdit->text().toInt());
//! [7]
}
@@ -224,7 +233,7 @@ void Client::displayError(QAbstractSocket::SocketError socketError)
void Client::enableGetFortuneButton()
{
getFortuneButton->setEnabled((!networkSession || networkSession->isOpen()) &&
- !hostLineEdit->text().isEmpty() &&
+ !hostCombo->currentText().isEmpty() &&
!portLineEdit->text().isEmpty());
}
diff --git a/examples/network/fortuneclient/client.h b/examples/network/fortuneclient/client.h
index 6e65e6e021..dc65251476 100644
--- a/examples/network/fortuneclient/client.h
+++ b/examples/network/fortuneclient/client.h
@@ -45,6 +45,7 @@
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
+class QComboBox;
class QDialogButtonBox;
class QLabel;
class QLineEdit;
@@ -71,7 +72,7 @@ private slots:
private:
QLabel *hostLabel;
QLabel *portLabel;
- QLineEdit *hostLineEdit;
+ QComboBox *hostCombo;
QLineEdit *portLineEdit;
QLabel *statusLabel;
QPushButton *getFortuneButton;
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
index 0e90666350..28e3b87b5d 100644
--- a/mkspecs/common/gcc-base.conf
+++ b/mkspecs/common/gcc-base.conf
@@ -39,6 +39,7 @@ QMAKE_CFLAGS_RELEASE += -O2
QMAKE_CFLAGS_DEBUG += -g
QMAKE_CFLAGS_SHLIB += -fPIC
QMAKE_CFLAGS_STATIC_LIB += -fPIC
+QMAKE_CFLAGS_APP += -fPIE
QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
@@ -50,6 +51,7 @@ QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG
QMAKE_CXXFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB
QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB
+QMAKE_CXXFLAGS_APP += $$QMAKE_CFLAGS_APP
QMAKE_CXXFLAGS_YACC += $$QMAKE_CFLAGS_YACC
QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
diff --git a/mkspecs/common/linux.conf b/mkspecs/common/linux.conf
index de28ec7d1f..f8f007bada 100644
--- a/mkspecs/common/linux.conf
+++ b/mkspecs/common/linux.conf
@@ -7,12 +7,12 @@ QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL
QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL
QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL
@@ -42,6 +42,10 @@ QMAKE_LIBDIR_WAYLAND =
QMAKE_DEFINES_WAYLAND =
QMAKE_WAYLAND_SCANNER = wayland-scanner
+QMAKE_CFLAGS_XCB =
+QMAKE_LIBS_XCB =
+QMAKE_DEFINES_XCB =
+
QMAKE_MOC = $$[QT_INSTALL_BINS]/moc
QMAKE_UIC = $$[QT_INSTALL_BINS]/uic
diff --git a/mkspecs/features/create_cmake.prf b/mkspecs/features/create_cmake.prf
index 0a14b5cea4..3ae4ddc83b 100644
--- a/mkspecs/features/create_cmake.prf
+++ b/mkspecs/features/create_cmake.prf
@@ -29,13 +29,17 @@ CMAKE_BIN_DIR = $$replace(CMAKE_BINS, ^.*/, )
CMAKE_RELATIVE_INSTALL_DIR = "../../../"
+static|staticlib:CMAKE_STATIC_TYPE = true
+
+contains(QT_CONFIG, reduce_relocations):CMAKE_ADD_FPIE_FLAGS = "true"
+
macx {
CONFIG(qt_framework, qt_framework|qt_no_framework) {
CMAKE_LIB_FILE_LOCATION_DEBUG = Qt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.framework/Qt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}
CMAKE_LIB_FILE_LOCATION_RELEASE = Qt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.framework/Qt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}
CMAKE_BUILD_IS_FRAMEWORK = "true"
} else {
- static {
+ !isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_LIB_FILE_LOCATION_DEBUG = libQt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.a
CMAKE_LIB_FILE_LOCATION_RELEASE = libQt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.a
} else {
@@ -44,7 +48,7 @@ macx {
}
}
} else:win32 {
- static {
+ !isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = Qt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}d.lib
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = Qt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.lib
} else {
@@ -55,7 +59,7 @@ macx {
}
CMAKE_BIN_SUFFIX = ".exe"
} else {
- static {
+ !isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_LIB_FILE_LOCATION_DEBUG = libQt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.a
CMAKE_LIB_FILE_LOCATION_RELEASE = libQt$${CMAKE_MODULE_NAME}$${QT_LIBINFIX}.a
} else {
@@ -72,8 +76,6 @@ debug_and_release|release:release_type = release
INSTALLS += cmake_qt5_module_files
-static:CMAKE_STATIC_TYPE = true
-
cmake_config_file.input = $$PWD/../cmake/Qt5BasicConfig.cmake.in
cmake_config_file.output = $$eval(QT.$${MODULE}.libs)/cmake/Qt5$${CMAKE_MODULE_NAME}/Qt5$${CMAKE_MODULE_NAME}Config.cmake
@@ -100,19 +102,16 @@ exists($$cmake_extras_file.input) {
$$cmake_extras_file.output
}
-cmake_macros_file = $$_PRO_FILE_PWD_/Qt5$${CMAKE_MODULE_NAME}Macros.cmake
-exists($$cmake_macros_file) {
+cmake_macros_file.input = $$_PRO_FILE_PWD_/Qt5$${CMAKE_MODULE_NAME}Macros.cmake
+exists($$cmake_macros_file.input) {
CMAKE_MODULE_MACROS = "true"
- cmake_qt5_module_files.files += $$cmake_macros_file
- CMAKE_MACROS_FILE_SOURCE = $$_PRO_FILE_PWD_/Qt5$${CMAKE_MODULE_NAME}Macros.cmake
- CMAKE_MACROS_FILE_DESTINATION = $$eval(QT.$${MODULE}.libs)/cmake/Qt5$${CMAKE_MODULE_NAME}
+ cmake_macros_file.output = $$eval(QT.$${MODULE}.libs)/cmake/Qt5$${CMAKE_MODULE_NAME}/Qt5$${CMAKE_MODULE_NAME}Macros.cmake
+ cmake_macros_file.config = verbatim
- CMAKE_MACROS_FILE_SOURCE ~= s,[/\\\\],$$QMAKE_DIR_SEP,
- CMAKE_MACROS_FILE_DESTINATION ~= s,[/\\\\],$$QMAKE_DIR_SEP,
+ QMAKE_SUBSTITUTES += cmake_macros_file
- system($$QMAKE_MKDIR \"$$CMAKE_MACROS_FILE_DESTINATION\")
- system($$QMAKE_COPY \"$$CMAKE_MACROS_FILE_SOURCE\" \"$$CMAKE_MACROS_FILE_DESTINATION\")
+ cmake_qt5_module_files.files += $$cmake_macros_file.output
}
cmake_qt5_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5$${CMAKE_MODULE_NAME}
diff --git a/mkspecs/features/qt_installs.prf b/mkspecs/features/qt_installs.prf
index b0de7b8fd8..8b17aa90fb 100644
--- a/mkspecs/features/qt_installs.prf
+++ b/mkspecs/features/qt_installs.prf
@@ -11,8 +11,7 @@ qt_install_headers {
INSTALL_HEADERS = $$SYNCQT.HEADER_FILES
equals(TARGET, QtCore) {
#headers created by configure
- INSTALL_HEADERS *= $$QT_BUILD_TREE/src/corelib/global/qconfig.h \
- $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH/arch
+ INSTALL_HEADERS *= $$QT_BUILD_TREE/src/corelib/global/qconfig.h
}
equals(TARGET, phonon) {
diff --git a/mkspecs/features/qt_module_config.prf b/mkspecs/features/qt_module_config.prf
index 4da1666fc5..a8439198df 100644
--- a/mkspecs/features/qt_module_config.prf
+++ b/mkspecs/features/qt_module_config.prf
@@ -17,7 +17,6 @@ INCLUDEPATH *= $$MODULE_PRIVATE_INCLUDES
INCLUDEPATH *= $$MODULE_PRIVATE_INCLUDES/$$TARGET
INCLUDEPATH *= $$MODULE_INCLUDES $$MODULE_INCLUDES/.. #just for today to have some compat
!isEmpty(RCC_DIR): INCLUDEPATH += $$RCC_DIR
-isEmpty(QT_ARCH):!isEmpty(ARCH):QT_ARCH=$$ARCH #another compat that will rot for change #215700
TEMPLATE = lib
isEmpty(QT_MAJOR_VERSION) {
VERSION=5.0.0
diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf
index f890e97733..9bb9875f6d 100644
--- a/mkspecs/features/testcase.prf
+++ b/mkspecs/features/testcase.prf
@@ -49,11 +49,11 @@ QMAKE_EXTRA_TARGETS *= check
} else {
check.CONFIG = recursive
# In debug and release mode, only run the test once.
- # Run debug if available, release otherwise.
+ # Run debug if that is the preferred config, release otherwise.
debug_and_release {
check.target = dummy_check
check.recurse_target = check
- debug {
+ CONFIG(debug, debug|release) {
real_check.depends = debug-check
real_check.target = check
QMAKE_EXTRA_TARGETS += real_check
diff --git a/mkspecs/linux-cxx/qmake.conf b/mkspecs/linux-cxx/qmake.conf
index ce303b7f90..79aa834a90 100644
--- a/mkspecs/linux-cxx/qmake.conf
+++ b/mkspecs/linux-cxx/qmake.conf
@@ -38,12 +38,12 @@ QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_LINK = cxx
QMAKE_LINK_SHLIB = cxx
diff --git a/mkspecs/linux-ecc-64/qmake.conf b/mkspecs/linux-ecc-64/qmake.conf
index 61a056b746..50f841f1d4 100644
--- a/mkspecs/linux-ecc-64/qmake.conf
+++ b/mkspecs/linux-ecc-64/qmake.conf
@@ -40,12 +40,12 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_LINK = ecpc
QMAKE_LINK_SHLIB = ecpc
diff --git a/mkspecs/linux-g++-maemo/qmake.conf b/mkspecs/linux-g++-maemo/qmake.conf
index 23f1f71e0f..d5828ab5c8 100644
--- a/mkspecs/linux-g++-maemo/qmake.conf
+++ b/mkspecs/linux-g++-maemo/qmake.conf
@@ -10,19 +10,5 @@ CONFIG += nostrip
QT += core gui
QMAKE_INCREMENTAL_STYLE = sublib
-include(../common/linux.conf)
-include(../common/gcc-base-unix.conf)
-include(../common/g++-unix.conf)
+include(../linux-arm-gnueabi-g++/qmake.conf)
-
-# Override the default lib/include directories for scratchbox:
-QMAKE_INCDIR_X11 = /usr/include/X11
-QMAKE_INCDIR_OPENGL = /usr/include
-QMAKE_LIBDIR_X11 = /usr/lib
-QMAKE_LIBDIR_OPENGL = /usr/lib
-
-# We still need to generate debug symbols in release mode to put into the *-dbg packages:
-QMAKE_CFLAGS_RELEASE += -g -Wno-psabi
-QMAKE_CXXFLAGS_RELEASE += -g -Wno-psabi
-
-load(qt_config)
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 38916ece5c..4ff63cda71 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -46,12 +46,12 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_LINK = icpc
QMAKE_LINK_SHLIB = icpc
diff --git a/mkspecs/linux-kcc/qmake.conf b/mkspecs/linux-kcc/qmake.conf
index 01e3b73479..23fd6298ac 100644
--- a/mkspecs/linux-kcc/qmake.conf
+++ b/mkspecs/linux-kcc/qmake.conf
@@ -49,12 +49,12 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_LINK = KCC
QMAKE_LINK_SHLIB = KCC
diff --git a/mkspecs/linux-lsb-g++/qmake.conf b/mkspecs/linux-lsb-g++/qmake.conf
index 4197db0978..4335f5ae91 100644
--- a/mkspecs/linux-lsb-g++/qmake.conf
+++ b/mkspecs/linux-lsb-g++/qmake.conf
@@ -2,96 +2,18 @@
# qmake configuration for linux-g++
#
-MAKEFILE_GENERATOR = UNIX
-TARGET_PLATFORM = unix
-TEMPLATE = app
-CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
-QT += core gui
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
+QT += core gui
QMAKE_INCREMENTAL_STYLE = sublib
-QMAKE_CC = lsbcc
-QMAKE_LEX = flex
-QMAKE_LEXFLAGS =
-QMAKE_YACC = yacc
-QMAKE_YACCFLAGS = -d
-QMAKE_YACCFLAGS_MANGLE = -p $base -b $base
-QMAKE_YACC_HEADER = $base.tab.h
-QMAKE_YACC_SOURCE = $base.tab.c
-QMAKE_CFLAGS = -pipe
-QMAKE_CFLAGS_DEPS = -M
-QMAKE_CFLAGS_WARN_ON = -Wall -W
-QMAKE_CFLAGS_WARN_OFF = -w
-QMAKE_CFLAGS_RELEASE = -O2
-QMAKE_CFLAGS_DEBUG = -g
-QMAKE_CFLAGS_SHLIB = -fPIC
-QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-QMAKE_CFLAGS_THREAD = -D_REENTRANT
-QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden
+include(../common/linux.conf)
+include(../common/gcc-base-unix.conf)
+include(../common/g++-unix.conf)
+load(qt_config)
QMAKE_LSB = 1
-
+QMAKE_CC = lsbcc
QMAKE_CXX = lsbc++
-QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
-QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
-QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
-QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
-QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
-QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
-QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
-QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
-QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
-QMAKE_CXXFLAGS_HIDESYMS = $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
-
-QMAKE_INCDIR =
-QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /opt/lsb/include
-QMAKE_LIBDIR_X11 = /opt/lsb/lib
-QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /opt/lsb/include
-QMAKE_LIBDIR_OPENGL = /opt/lsb/lib
-
-QMAKE_LINK = lsbc++
-QMAKE_LINK_SHLIB = lsbc++
-QMAKE_LFLAGS =
-QMAKE_LFLAGS_RELEASE =
-QMAKE_LFLAGS_DEBUG =
-QMAKE_LFLAGS_SHLIB = -shared
-QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
-QMAKE_LFLAGS_SONAME = -Wl,-soname,
-QMAKE_LFLAGS_THREAD =
-QMAKE_LFLAGS_RPATH = -Wl,-rpath,
-
-QMAKE_LIBS =
-QMAKE_LIBS_DYNLOAD = -ldl
-QMAKE_LIBS_X11 = -lXext -lX11 -lm
-QMAKE_LIBS_X11SM = -lSM -lICE
-QMAKE_LIBS_NIS = -lnsl
-QMAKE_LIBS_OPENGL = -lGL
-QMAKE_LIBS_OPENGL_QT = -lGL
-QMAKE_LIBS_THREAD = -lpthread
-
-QMAKE_MOC = $$[QT_INSTALL_BINS]/moc
-QMAKE_UIC = $$[QT_INSTALL_BINS]/uic
-
-QMAKE_AR = ar cqs
-QMAKE_OBJCOPY = objcopy
-QMAKE_RANLIB =
-
-QMAKE_TAR = tar -cf
-QMAKE_GZIP = gzip -9f
-
-QMAKE_COPY = cp -f
-QMAKE_COPY_FILE = $(COPY)
-QMAKE_COPY_DIR = $(COPY) -r
-QMAKE_MOVE = mv -f
-QMAKE_DEL_FILE = rm -f
-QMAKE_DEL_DIR = rmdir
-QMAKE_STRIP = strip
-QMAKE_STRIPFLAGS_LIB += --strip-unneeded
-QMAKE_CHK_DIR_EXISTS = test -d
-QMAKE_MKDIR = mkdir -p
-include(../common/unix.conf)
-load(qt_config)
diff --git a/mkspecs/linux-pgcc/qmake.conf b/mkspecs/linux-pgcc/qmake.conf
index 63ede781a7..ed88215609 100644
--- a/mkspecs/linux-pgcc/qmake.conf
+++ b/mkspecs/linux-pgcc/qmake.conf
@@ -40,12 +40,12 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_LINK = pgCC
QMAKE_LINK_SHLIB = pgCC
diff --git a/mkspecs/unsupported/linux-host-g++/qmake.conf b/mkspecs/unsupported/linux-host-g++/qmake.conf
index 46ecf375e8..1ad529ebae 100644
--- a/mkspecs/unsupported/linux-host-g++/qmake.conf
+++ b/mkspecs/unsupported/linux-host-g++/qmake.conf
@@ -80,12 +80,12 @@ QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD
QMAKE_INCDIR =
QMAKE_LIBDIR =
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL
QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL
QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL
diff --git a/mkspecs/wince70embedded-armv4i-msvc2008/qmake.conf b/mkspecs/wince70embedded-armv4i-msvc2008/qmake.conf
index 1cda0cf32f..c9ca718812 100644
--- a/mkspecs/wince70embedded-armv4i-msvc2008/qmake.conf
+++ b/mkspecs/wince70embedded-armv4i-msvc2008/qmake.conf
@@ -8,7 +8,7 @@ include(../common/wince/qmake.conf)
CE_SDK = WEC7_SDK_NAME # replace with actual SDK name
CE_ARCH = armv4i
-DEFINES += QT_NO_GESTURES QT_NOSTANDARDSHELL_UI_MODEL _CRT_SECURE_NO_DEPRECATE _WIN32_WCE=0x700 $$CE_ARCH _AMRV7_ armv7 _ARM_
+DEFINES += QT_NO_NATIVE_GESTURES QT_NOSTANDARDSHELL_UI_MODEL _CRT_SECURE_NO_DEPRECATE _WIN32_WCE=0x700 $$CE_ARCH _AMRV7_ armv7 _ARM_
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:WINDOWSCE,7.00 /MACHINE:THUMB /ENTRY:mainACRTStartup
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWSCE,7.00 /MACHINE:THUMB
diff --git a/mkspecs/wince70embedded-x86-msvc2008/qmake.conf b/mkspecs/wince70embedded-x86-msvc2008/qmake.conf
index febd183521..89d912a347 100644
--- a/mkspecs/wince70embedded-x86-msvc2008/qmake.conf
+++ b/mkspecs/wince70embedded-x86-msvc2008/qmake.conf
@@ -7,7 +7,7 @@ include(../common/wince/qmake.conf)
CE_SDK = Platform Builder
CE_ARCH = _TGTCPU
-DEFINES += QT_NO_GESTURES QT_NOSTANDARDSHELL_UI_MODEL _CRT_SECURE_NO_DEPRECATE _WIN32_WCE=0x700 $$CE_ARCH _X86_ _M_IX86
+DEFINES += QT_NO_NATIVE_GESTURES QT_NOSTANDARDSHELL_UI_MODEL _CRT_SECURE_NO_DEPRECATE _WIN32_WCE=0x700 $$CE_ARCH _X86_ _M_IX86
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:WINDOWSCE,7.00 /MACHINE:X86 /ENTRY:mainACRTStartup
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWSCE,7.00 /MACHINE:X86
diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index 286e2ebcbc..16af49311b 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -22,7 +22,7 @@ QOBJS=qtextcodec.o qutfcodec.o qstring.o qtextstream.o qiodevice.o qmalloc.o qgl
qfileinfo.o qdatetime.o qstringlist.o qabstractfileengine.o qtemporaryfile.o \
qmap.o qmetatype.o qsettings.o qsystemerror.o qlibraryinfo.o qvariant.o qvsnprintf.o \
qlocale.o qlocale_tools.o qlocale_unix.o qlinkedlist.o qurl.o qnumeric.o qcryptographichash.o \
- qxmlstream.o qxmlutils.o \
+ qxmlstream.o qxmlutils.o qlogging.o \
$(QTOBJS)
@@ -66,6 +66,7 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge
$(SOURCE_PATH)/src/corelib/xml/qxmlstream.cpp \
$(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp \
$(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp \
+ $(SOURCE_PATH)/src/corelib/global/qlogging.cpp \
$(QTSRCS)
CPPFLAGS = -g -I. -Igenerators -Igenerators/unix -Igenerators/win32 \
@@ -316,6 +317,9 @@ qxmlstream.o: $(SOURCE_PATH)/src/corelib/xml/qxmlstream.cpp
qxmlutils.o: $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp
+qlogging.o: $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
+
#default rules
.cpp.o:
$(CXX) -c -o $@ $(CXXFLAGS) $<
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index e767786001..767237fcfc 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -29,7 +29,7 @@ CFLAGS_EXTRA = /MP
!endif
CFLAGS_BARE = -c -Fo./ \
- -W3 -nologo -O2 \
+ -W3 -nologo -O1 \
$(CFLAGS_EXTRA) \
-I. -Igenerators -Igenerators\unix -Igenerators\win32 -Igenerators\mac -Igenerators\integrity \
-I$(BUILD_PATH)\include -I$(BUILD_PATH)\include\QtCore -I$(BUILD_PATH)\include\QtCore\$(QT_VERSION) -I$(BUILD_PATH)\include\QtCore\$(QT_VERSION)\QtCore \
@@ -118,8 +118,8 @@ QTOBJS= \
qmetatype.obj \
qxmlstream.obj \
qxmlutils.obj \
- qnumeric.obj
-
+ qnumeric.obj \
+ qlogging.obj
first all: qmake.exe
diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++
index 443dba390a..585061ed26 100644
--- a/qmake/Makefile.win32-g++
+++ b/qmake/Makefile.win32-g++
@@ -95,7 +95,8 @@ QTOBJS= \
qmetatype.o \
qxmlstream.o \
qxmlutils.o \
- qnumeric.o
+ qnumeric.o \
+ qlogging.o
qmake.exe: $(OBJS) $(QTOBJS)
@@ -339,3 +340,5 @@ qxmlstream.o: $(SOURCE_PATH)/src/corelib/xml/qxmlstream.cpp
qxmlutils.o: $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp
+qlogging.o: $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh
index bc8356e178..6dfb486375 100644
--- a/qmake/Makefile.win32-g++-sh
+++ b/qmake/Makefile.win32-g++-sh
@@ -95,7 +95,8 @@ QTOBJS= \
qmetatype.o \
qxmlstream.o \
qxmlutils.o \
- qnumeric.o
+ qnumeric.o \
+ qlogging.o
qmake.exe: $(OBJS) $(QTOBJS)
$(LINKQMAKE)
@@ -337,3 +338,6 @@ qxmlstream.o: $(SOURCE_PATH)/src/corelib/xml/qxmlstream.cpp
qxmlutils.o: $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp
+
+qlogging.o: $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 59e17b0bea..dd098596e9 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -498,62 +498,74 @@ MakefileGenerator::init()
}
outn = fileFixify(inn.left(inn.length()-3), qmake_getpwd(), Option::output_dir);
}
+
+ QString confign = subs.at(i) + ".config";
+ bool verbatim = false;
+ if (v.contains(confign))
+ verbatim = v[confign].contains(QLatin1String("verbatim"));
+
QFile in(inn);
- if(in.open(QFile::ReadOnly)) {
- QString contents;
- QStack<int> state;
- enum { IN_CONDITION, MET_CONDITION, PENDING_CONDITION };
- for(int count = 1; !in.atEnd(); ++count) {
- QString line = QString::fromUtf8(in.readLine());
- if(line.startsWith("!!IF ")) {
- if(state.isEmpty() || state.top() == IN_CONDITION) {
- QString test = line.mid(5, line.length()-(5+1));
- if(project->test(test))
- state.push(IN_CONDITION);
- else
- state.push(PENDING_CONDITION);
- } else {
- state.push(MET_CONDITION);
- }
- } else if(line.startsWith("!!ELIF ")) {
- if(state.isEmpty()) {
- warn_msg(WarnLogic, "(%s:%d): Unexpected else condition",
- in.fileName().toLatin1().constData(), count);
- } else if(state.top() == PENDING_CONDITION) {
- QString test = line.mid(7, line.length()-(7+1));
- if(project->test(test)) {
+ if (in.open(QFile::ReadOnly)) {
+ QByteArray contentBytes;
+ if (verbatim) {
+ contentBytes = in.readAll();
+ } else {
+ QString contents;
+ QStack<int> state;
+ enum { IN_CONDITION, MET_CONDITION, PENDING_CONDITION };
+ for (int count = 1; !in.atEnd(); ++count) {
+ QString line = QString::fromUtf8(in.readLine());
+ if (line.startsWith("!!IF ")) {
+ if (state.isEmpty() || state.top() == IN_CONDITION) {
+ QString test = line.mid(5, line.length()-(5+1));
+ if (project->test(test))
+ state.push(IN_CONDITION);
+ else
+ state.push(PENDING_CONDITION);
+ } else {
+ state.push(MET_CONDITION);
+ }
+ } else if (line.startsWith("!!ELIF ")) {
+ if (state.isEmpty()) {
+ warn_msg(WarnLogic, "(%s:%d): Unexpected else condition",
+ in.fileName().toLatin1().constData(), count);
+ } else if (state.top() == PENDING_CONDITION) {
+ QString test = line.mid(7, line.length()-(7+1));
+ if (project->test(test)) {
+ state.pop();
+ state.push(IN_CONDITION);
+ }
+ } else if (state.top() == IN_CONDITION) {
+ state.pop();
+ state.push(MET_CONDITION);
+ }
+ } else if (line.startsWith("!!ELSE")) {
+ if (state.isEmpty()) {
+ warn_msg(WarnLogic, "(%s:%d): Unexpected else condition",
+ in.fileName().toLatin1().constData(), count);
+ } else if (state.top() == PENDING_CONDITION) {
state.pop();
state.push(IN_CONDITION);
+ } else if (state.top() == IN_CONDITION) {
+ state.pop();
+ state.push(MET_CONDITION);
}
- } else if(state.top() == IN_CONDITION) {
- state.pop();
- state.push(MET_CONDITION);
- }
- } else if(line.startsWith("!!ELSE")) {
- if(state.isEmpty()) {
- warn_msg(WarnLogic, "(%s:%d): Unexpected else condition",
- in.fileName().toLatin1().constData(), count);
- } else if(state.top() == PENDING_CONDITION) {
- state.pop();
- state.push(IN_CONDITION);
- } else if(state.top() == IN_CONDITION) {
- state.pop();
- state.push(MET_CONDITION);
+ } else if (line.startsWith("!!ENDIF")) {
+ if (state.isEmpty())
+ warn_msg(WarnLogic, "(%s:%d): Unexpected endif",
+ in.fileName().toLatin1().constData(), count);
+ else
+ state.pop();
+ } else if (state.isEmpty() || state.top() == IN_CONDITION) {
+ contents += project->expand(line, in.fileName(), count);
}
- } else if(line.startsWith("!!ENDIF")) {
- if(state.isEmpty())
- warn_msg(WarnLogic, "(%s:%d): Unexpected endif",
- in.fileName().toLatin1().constData(), count);
- else
- state.pop();
- } else if(state.isEmpty() || state.top() == IN_CONDITION) {
- contents += project->expand(line, in.fileName(), count);
}
+ contentBytes = contents.toUtf8();
}
QFile out(outn);
- if(out.exists() && out.open(QFile::ReadOnly)) {
- QString old = QString::fromUtf8(out.readAll());
- if(contents == old) {
+ if (out.exists() && out.open(QFile::ReadOnly)) {
+ QByteArray old = out.readAll();
+ if (contentBytes == old) {
v["QMAKE_INTERNAL_INCLUDED_FILES"].append(in.fileName());
continue;
}
@@ -567,7 +579,7 @@ MakefileGenerator::init()
mkdir(QFileInfo(out).absolutePath());
if(out.open(QFile::WriteOnly)) {
v["QMAKE_INTERNAL_INCLUDED_FILES"].append(in.fileName());
- out.write(contents.toUtf8());
+ out.write(contentBytes);
} else {
warn_msg(WarnLogic, "Cannot open substitute for output '%s'",
out.fileName().toLatin1().constData());
@@ -2496,10 +2508,10 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
if(!in_directory.isEmpty()) {
t << mkdir_p_asstring(out_directory)
<< out_directory_cdin
- << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out
+ << "$(QMAKE) " << escapeFilePath(in) << buildArgs(in_directory) << " -o " << out
<< in_directory_cdout << endl;
} else {
- t << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out << endl;
+ t << "$(QMAKE) " << escapeFilePath(in) << buildArgs(in_directory) << " -o " << out << endl;
}
t << subtarget->target << "-qmake_all: ";
if(project->isEmpty("QMAKE_NOFORCE"))
@@ -2508,10 +2520,10 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
if(!in_directory.isEmpty()) {
t << mkdir_p_asstring(out_directory)
<< out_directory_cdin
- << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out
+ << "$(QMAKE) " << escapeFilePath(in) << buildArgs(in_directory) << " -o " << out
<< in_directory_cdout << endl;
} else {
- t << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out << endl;
+ t << "$(QMAKE) " << escapeFilePath(in) << buildArgs(in_directory) << " -o " << out << endl;
}
}
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp
index 4d52c4be2e..b48dd4230a 100644
--- a/qmake/generators/win32/msvc_nmake.cpp
+++ b/qmake/generators/win32/msvc_nmake.cpp
@@ -158,7 +158,7 @@ void NmakeMakefileGenerator::writeNmakeParts(QTextStream &t)
// precompiled header
if(usePCH) {
QString precompRule = QString("-c -Yc -Fp%1 -Fo%2").arg(precompPch).arg(precompObj);
- t << precompObj << ": " << precompH << " " << findDependencies(precompH).join(" \\\n\t\t")
+ t << precompObj << ": " << precompH << " " << escapeDependencyPaths(findDependencies(precompH)).join(" \\\n\t\t")
<< "\n\t" << "$(CXX) " + precompRule +" $(CXXFLAGS) $(INCPATH) -TP " << precompH << endl << endl;
}
}
diff --git a/qmake/project.cpp b/qmake/project.cpp
index d898483a47..f8b24bb097 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -1284,7 +1284,7 @@ QMakeProject::read(uchar cmd)
if(!Option::user_template_prefix.isEmpty())
base_vars["TEMPLATE_PREFIX"] = QStringList(Option::user_template_prefix);
- if(cmd & ReadCache && Option::mkfile::do_cache) { // parse the cache
+ if ((cmd & ReadSetup) && Option::mkfile::do_cache) { // parse the cache
int cache_depth = -1;
QString qmake_cache = Option::mkfile::cachefile;
if(qmake_cache.isEmpty()) { //find it as it has not been specified
@@ -1315,7 +1315,7 @@ QMakeProject::read(uchar cmd)
}
}
}
- if(cmd & ReadConf) { // parse mkspec
+ if (cmd & ReadSetup) { // parse mkspec
QString qmakespec = fixEnvVariables(Option::mkfile::qmakespec);
QStringList mkspec_roots = qmake_mkspec_paths();
debug_msg(2, "Looking for mkspec %s in (%s)", qmakespec.toLatin1().constData(),
@@ -1389,7 +1389,7 @@ QMakeProject::read(uchar cmd)
vars["TARGET"].append(QFileInfo(pfile).baseName());
//before commandline
- if(cmd & ReadCmdLine) {
+ if (cmd & ReadSetup) {
cfile = pfile;
parser.file = "(internal)";
parser.from_file = false;
@@ -1406,7 +1406,7 @@ QMakeProject::read(uchar cmd)
}
//commandline configs
- if(cmd & ReadConfigs && !Option::user_configs.isEmpty()) {
+ if ((cmd & ReadSetup) && !Option::user_configs.isEmpty()) {
parser.file = "(configs)";
parser.from_file = false;
parser.line_no = 1; //really arg count now.. duh
@@ -1421,7 +1421,7 @@ QMakeProject::read(uchar cmd)
return false;
}
- if(cmd & ReadCmdLine) {
+ if (cmd & ReadSetup) {
parser.file = "(internal)";
parser.from_file = false;
parser.line_no = 1; //really arg count now.. duh
@@ -1437,7 +1437,7 @@ QMakeProject::read(uchar cmd)
}
//after configs (set in BUILDS)
- if(cmd & ReadConfigs && !Option::after_user_configs.isEmpty()) {
+ if ((cmd & ReadSetup) && !Option::after_user_configs.isEmpty()) {
parser.file = "(configs)";
parser.from_file = false;
parser.line_no = 1; //really arg count now.. duh
@@ -1447,7 +1447,7 @@ QMakeProject::read(uchar cmd)
if(pfile != "-" && vars["TARGET"].isEmpty())
vars["TARGET"].append(QFileInfo(pfile).baseName());
- if(cmd & ReadConfigs && !Option::user_configs.isEmpty()) {
+ if ((cmd & ReadSetup) && !Option::user_configs.isEmpty()) {
parser.file = "(configs)";
parser.from_file = false;
parser.line_no = 1; //really arg count now.. duh
@@ -3165,8 +3165,14 @@ QStringList &QMakeProject::values(const QString &_var, QHash<QString, QStringLis
QString ret, type = var.mid(13);
if(type == "arch") {
QString paths = qgetenv("PATH");
- QString vcBin64 = qgetenv("VCINSTALLDIR").append("\\bin\\amd64");
- QString vcBinX86_64 = qgetenv("VCINSTALLDIR").append("\\bin\\x86_amd64");
+ QString vcBin64 = qgetenv("VCINSTALLDIR");
+ if (!vcBin64.endsWith('\\'))
+ vcBin64.append('\\');
+ vcBin64.append("bin\\amd64");
+ QString vcBinX86_64 = qgetenv("VCINSTALLDIR");
+ if (!vcBinX86_64.endsWith('\\'))
+ vcBinX86_64.append('\\');
+ vcBinX86_64.append("bin\\x86_amd64");
if(paths.contains(vcBin64,Qt::CaseInsensitive) || paths.contains(vcBinX86_64,Qt::CaseInsensitive))
ret = "x86_64";
else
diff --git a/qmake/project.h b/qmake/project.h
index 83174455d1..7a9cc1eae4 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -117,8 +117,7 @@ public:
QMakeProject(QMakeProperty *p, const QHash<QString, QStringList> &nvars) { init(p, &nvars); }
~QMakeProject();
- enum { ReadCache=0x01, ReadConf=0x02, ReadCmdLine=0x04, ReadProFile=0x08,
- ReadFeatures=0x20, ReadConfigs=0x40, ReadAll=0xFF };
+ enum { ReadProFile=0x01, ReadSetup=0x02, ReadFeatures=0x04, ReadAll=0xFF };
inline bool parse(const QString &text) { return parse(text, vars); }
bool read(const QString &project, uchar cmd=ReadAll);
bool read(uchar cmd=ReadAll);
diff --git a/qmake/qmake.pri b/qmake/qmake.pri
index 1f59531c42..ba6ab383c7 100644
--- a/qmake/qmake.pri
+++ b/qmake/qmake.pri
@@ -76,7 +76,8 @@ bootstrap { #Qt code
qvector.cpp \
qvsnprintf.cpp \
qxmlstream.cpp \
- qxmlutils.cpp
+ qxmlutils.cpp \
+ qlogging.cpp
HEADERS+= \
qbitarray.h \
diff --git a/qtbase.pro b/qtbase.pro
index 56f40cdb7a..5fc9cb3888 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -132,3 +132,11 @@ win32:!equals(QT_BUILD_TREE, $$QT_SOURCE_TREE) {
mkspecs.files += $$QT_BUILD_TREE/mkspecs/default
}
INSTALLS += mkspecs
+
+OTHER_FILES += \
+ configure \
+ header.BSD \
+ header.FDL \
+ header.LGPL \
+ header.LGPL-ONLY \
+ sync.profile
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
index 63ba90797d..b363b81d87 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
@@ -39,6 +39,10 @@ HB_BEGIN_HEADER
#define VR_X_ADVANCE_DEVICE 2
#define VR_Y_ADVANCE_DEVICE 3
+#ifndef HB_SUPPORT_MULTIPLE_MASTER
+# define HB_USE_FLEXIBLE_VALUE_RECORD
+#endif
+
struct HB_ValueRecord_
{
HB_Short XPlacement; /* horizontal adjustment for
@@ -242,7 +246,11 @@ typedef struct HB_Class2Record_ HB_Class2Record;
struct HB_Class1Record_
{
- HB_Class2Record* Class2Record; /* array of Class2Record tables */
+ hb_uint8 IsFlexible;
+ union {
+ HB_Class2Record* Class2Record; /* array of Class2Record tables */
+ HB_Short* ValueRecords;
+ } c2r;
};
typedef struct HB_Class1Record_ HB_Class1Record;
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c
index a21600579e..2a86cb21e9 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c
@@ -194,6 +194,43 @@ HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos )
/* ValueRecord */
+static HB_Error Get_FlexibleValueRecord( GPOS_Instance* gpi,
+ HB_Short* vr,
+ HB_UShort format,
+ HB_Position gd )
+{
+ HB_Error error = HB_Err_Ok;
+
+ HB_16Dot16 x_scale, y_scale;
+
+ if ( !format )
+ return HB_Err_Ok;
+
+ x_scale = gpi->font->x_scale;
+ y_scale = gpi->font->y_scale;
+
+ /* design units -> fractional pixel */
+
+ if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT ) {
+ gd->x_pos += *vr * x_scale / 0x10000;
+ vr++;
+ }
+ if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT ) {
+ gd->y_pos += *vr * y_scale / 0x10000;
+ vr++;
+ }
+ if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE ) {
+ gd->x_advance += *vr * x_scale / 0x10000;
+ vr++;
+ }
+ if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE ) {
+ gd->y_advance += *vr * y_scale / 0x10000;
+ vr++;
+ }
+
+ return error;
+}
+
/* There is a subtle difference in the specs between a `table' and a
`record' -- offsets for device tables in ValueRecords are taken from
the parent table and not the parent record. */
@@ -1245,6 +1282,19 @@ static void Free_PairPos1( HB_PairPosFormat1* ppf1,
}
}
+static HB_UInt Calculate_Class2RecordSize(HB_UShort format1, HB_UShort format2)
+{
+ // Return number of 16 bit values in two value records with given formats
+ return (format1 & 0x01) + (format2 & 0x01)
+ + ((format1 & 0x02) >> 1) + ((format2 & 0x02) >> 1)
+ + ((format1 & 0x04) >> 2) + ((format2 & 0x04) >> 2)
+ + ((format1 & 0x08) >> 3) + ((format2 & 0x08) >> 3)
+ + ((format1 & 0x10) >> 4) + ((format2 & 0x10) >> 4)
+ + ((format1 & 0x20) >> 5) + ((format2 & 0x20) >> 5)
+ + ((format1 & 0x40) >> 6) + ((format2 & 0x40) >> 6)
+ + ((format1 & 0x80) >> 7) + ((format2 & 0x80) >> 7);
+}
+
/* PairPosFormat2 */
@@ -1256,11 +1306,14 @@ static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2,
HB_Error error;
HB_UShort m, n, k, count1, count2;
- HB_UInt cur_offset, new_offset1, new_offset2, base_offset;
+ HB_UInt cur_offset, new_offset1, new_offset2, base_offset, cls2_record_size = 0;
HB_Class1Record* c1r;
HB_Class2Record* c2r;
+ HB_Short* vr;
+
+ hb_uint8 use_flexible_value_records;
base_offset = FILE_Pos() - 8L;
@@ -1276,6 +1329,13 @@ static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2,
count1 = ppf2->Class1Count = GET_UShort();
count2 = ppf2->Class2Count = GET_UShort();
+#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
+ use_flexible_value_records = 0;
+#else
+ use_flexible_value_records = !((format1 & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES) ||
+ (format2 & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES));
+#endif
+
FORGET_Frame();
cur_offset = FILE_Pos();
@@ -1296,35 +1356,55 @@ static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2,
c1r = ppf2->Class1Record;
+ if ( use_flexible_value_records )
+ cls2_record_size = Calculate_Class2RecordSize(format1, format2);
+
for ( m = 0; m < count1; m++ )
{
- c1r[m].Class2Record = NULL;
-
- if ( ALLOC_ARRAY( c1r[m].Class2Record, count2, HB_Class2Record ) )
- goto Fail1;
-
- c2r = c1r[m].Class2Record;
-
- for ( n = 0; n < count2; n++ )
- {
- if ( format1 )
- {
- error = Load_ValueRecord( &c2r[n].Value1, format1,
- base_offset, stream );
- if ( error )
- goto Fail0;
- }
- if ( format2 )
- {
- error = Load_ValueRecord( &c2r[n].Value2, format2,
- base_offset, stream );
- if ( error )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[n].Value1, format1 );
- goto Fail0;
- }
- }
+ c1r[m].IsFlexible = use_flexible_value_records;
+ if ( use_flexible_value_records ) {
+ c1r[m].c2r.ValueRecords = NULL;
+
+ if ( ALLOC_ARRAY( c1r[m].c2r.ValueRecords, count2 * cls2_record_size, HB_UShort ) )
+ goto Fail1;
+
+ vr = c1r[m].c2r.ValueRecords;
+
+ if ( ACCESS_Frame( count2 * cls2_record_size * 2L ))
+ goto Fail1;
+
+ for ( n = 0; n < count2 * cls2_record_size; n++ )
+ vr[n] = GET_Short();
+
+ FORGET_Frame();
+ } else {
+ c1r[m].c2r.Class2Record = NULL;
+
+ if ( ALLOC_ARRAY( c1r[m].c2r.Class2Record, count2, HB_Class2Record ) )
+ goto Fail1;
+
+ c2r = c1r[m].c2r.Class2Record;
+ for ( n = 0; n < count2; n++ )
+ {
+ if ( format1 )
+ {
+ error = Load_ValueRecord( &c2r[n].Value1, format1,
+ base_offset, stream );
+ if ( error )
+ goto Fail0;
+ }
+ if ( format2 )
+ {
+ error = Load_ValueRecord( &c2r[n].Value2, format2,
+ base_offset, stream );
+ if ( error )
+ {
+ if ( format1 )
+ Free_ValueRecord( &c2r[n].Value1, format1 );
+ goto Fail0;
+ }
+ }
+ }
}
continue;
@@ -1345,17 +1425,21 @@ static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2,
Fail1:
for ( k = 0; k < m; k++ )
{
- c2r = c1r[k].Class2Record;
-
- for ( n = 0; n < count2; n++ )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[n].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &c2r[n].Value2, format2 );
- }
-
- FREE( c2r );
+ if ( !use_flexible_value_records ) {
+ c2r = c1r[k].c2r.Class2Record;
+
+ for ( n = 0; n < count2; n++ )
+ {
+ if ( format1 )
+ Free_ValueRecord( &c2r[n].Value1, format1 );
+ if ( format2 )
+ Free_ValueRecord( &c2r[n].Value2, format2 );
+ }
+
+ FREE( c2r );
+ } else {
+ FREE( c1r[k].c2r.ValueRecords );
+ }
}
FREE( c1r );
@@ -1387,17 +1471,21 @@ static void Free_PairPos2( HB_PairPosFormat2* ppf2,
for ( m = 0; m < count1; m++ )
{
- c2r = c1r[m].Class2Record;
-
- for ( n = 0; n < count2; n++ )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[n].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &c2r[n].Value2, format2 );
- }
-
- FREE( c2r );
+ if ( !c1r[m].IsFlexible ) {
+ c2r = c1r[m].c2r.Class2Record;
+
+ for ( n = 0; n < count2; n++ )
+ {
+ if ( format1 )
+ Free_ValueRecord( &c2r[n].Value1, format1 );
+ if ( format2 )
+ Free_ValueRecord( &c2r[n].Value2, format2 );
+ }
+
+ FREE( c2r );
+ } else {
+ FREE( c1r[m].c2r.ValueRecords );
+ }
}
FREE( c1r );
@@ -1544,6 +1632,10 @@ static HB_Error Lookup_PairPos2( GPOS_Instance* gpi,
HB_Class1Record* c1r;
HB_Class2Record* c2r;
+ HB_Short* vr;
+
+ HB_UShort vr1_size;
+ HB_UShort vr2_size;
error = _HB_OPEN_Get_Class( &ppf2->ClassDef1, IN_GLYPH( first_pos ),
@@ -1558,14 +1650,27 @@ static HB_Error Lookup_PairPos2( GPOS_Instance* gpi,
c1r = &ppf2->Class1Record[cl1];
if ( !c1r )
return ERR(HB_Err_Invalid_SubTable);
- c2r = &c1r->Class2Record[cl2];
- error = Get_ValueRecord( gpi, &c2r->Value1, format1, POSITION( first_pos ) );
- if ( error )
- return error;
- return Get_ValueRecord( gpi, &c2r->Value2, format2, POSITION( buffer->in_pos ) );
-}
+ if ( !c1r->IsFlexible ) {
+ c2r = &c1r->c2r.Class2Record[cl2];
+ error = Get_ValueRecord( gpi, &c2r->Value1, format1, POSITION( first_pos ) );
+ if ( error )
+ return error;
+ return Get_ValueRecord( gpi, &c2r->Value2, format2, POSITION( buffer->in_pos ) );
+ } else {
+ vr1_size = Calculate_Class2RecordSize( format1, 0 );
+ vr2_size = Calculate_Class2RecordSize( format2, 0 );
+
+ vr = c1r->c2r.ValueRecords + (cl2 * ( vr1_size + vr2_size ));
+
+ error = Get_FlexibleValueRecord( gpi, vr, format1, POSITION( first_pos ) );
+ if ( error )
+ return error;
+ vr += vr1_size; // Skip to second record
+ return Get_FlexibleValueRecord( gpi, vr, format2, POSITION( buffer->in_pos ) );
+ }
+}
static HB_Error Lookup_PairPos( GPOS_Instance* gpi,
HB_GPOS_SubTable* st,
diff --git a/src/3rdparty/libpng.pri b/src/3rdparty/libpng.pri
index 7ac1910151..8479114aa2 100644
--- a/src/3rdparty/libpng.pri
+++ b/src/3rdparty/libpng.pri
@@ -1,5 +1,4 @@
DEFINES *= QT_USE_BUNDLED_LIBPNG
-!isEqual(QT_ARCH, i386):!isEqual(QT_ARCH, x86_64):DEFINES += PNG_NO_ASSEMBLER_CODE
INCLUDEPATH += $$PWD/libpng
SOURCES += $$PWD/libpng/png.c \
$$PWD/libpng/pngerror.c \
diff --git a/src/3rdparty/pcre.pri b/src/3rdparty/pcre.pri
index 92066e1aee..7febd8fd0b 100644
--- a/src/3rdparty/pcre.pri
+++ b/src/3rdparty/pcre.pri
@@ -1,14 +1,5 @@
DEFINES += PCRE_HAVE_CONFIG_H
-# man 3 pcrejit for a list of supported platforms;
-# as PCRE 8.30, stable JIT support is available for:
-# - ARM v5, v7, and Thumb2
-# - x86/x86-64
-# - MIPS 32bit
-equals(QT_ARCH, "i386")|equals(QT_ARCH, "x86_64")|equals(QT_ARCH, "arm")|if(equals(QT_ARCH, "mips"):!*-64) {
- DEFINES += SUPPORT_JIT
-}
-
win32:DEFINES += PCRE_STATIC
INCLUDEPATH += $$PWD/pcre
diff --git a/src/3rdparty/pcre/config.h b/src/3rdparty/pcre/config.h
index 4fe10f41d8..fede0dcbb0 100644
--- a/src/3rdparty/pcre/config.h
+++ b/src/3rdparty/pcre/config.h
@@ -13,3 +13,20 @@
#define SUPPORT_UCP
#define SUPPORT_UTF16
+/*
+ man 3 pcrejit for a list of supported platforms;
+ as PCRE 8.30, stable JIT support is available for:
+ - ARM v5, v7, and Thumb2
+ - x86/x86-64
+ - MIPS 32bit
+*/
+#if \
+ /* ARM */ \
+ defined(__arm__) || defined(__TARGET_ARCH_ARM) \
+ /* x86 32/64 */ \
+ || defined(__i386) || defined(__i386__) || defined(_M_IX86) \
+ || defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) \
+ /* MIPS32 */ \
+ || defined(__mips) || defined(__mips__) || defined(_M_MRX000) && !(defined(_MIPS_ARCH_MIPS64) || defined(__mips64))
+# define SUPPORT_JIT
+#endif
diff --git a/src/3rdparty/zlib/gzguts.h b/src/3rdparty/zlib/gzguts.h
index c752b5763b..26b4d37c1d 100644
--- a/src/3rdparty/zlib/gzguts.h
+++ b/src/3rdparty/zlib/gzguts.h
@@ -32,7 +32,10 @@
# include <limits.h>
#endif
#if !defined(_WIN32_WCE)
-#include <fcntl.h>
+# include <fcntl.h>
+#else
+# include <qglobal.h>
+# include <qfunctions_wince.h>
#endif
#ifdef NO_DEFLATE /* for compatibility with old definition */
@@ -40,7 +43,9 @@
#endif
#ifdef _MSC_VER
-# include <io.h>
+# if !defined(_WIN32_WCE)
+# include <io.h>
+# endif
# define vsnprintf _vsnprintf
#endif
diff --git a/src/3rdparty/zlib/zutil.c b/src/3rdparty/zlib/zutil.c
index 898ed345b0..3418c5999f 100644
--- a/src/3rdparty/zlib/zutil.c
+++ b/src/3rdparty/zlib/zutil.c
@@ -136,14 +136,6 @@ const char * ZEXPORT zError(err)
return ERR_MSG(err);
}
-#if defined(_WIN32_WCE)
- /* The Microsoft C Run-Time Library for Windows CE doesn't have
- * errno. We define it as a global variable to simplify porting.
- * Its value is always 0 and should not be used.
- */
- int errno = 0;
-#endif
-
#ifndef HAVE_MEMCPY
void ZLIB_INTERNAL zmemcpy(dest, source, len)
diff --git a/src/concurrent/concurrent.pro b/src/concurrent/concurrent.pro
index a9482af057..6bf16e6a0a 100644
--- a/src/concurrent/concurrent.pro
+++ b/src/concurrent/concurrent.pro
@@ -1,3 +1,5 @@
+load(qt_module)
+
TARGET = QtConcurrent
QPRO_PWD = $$PWD
QT = core-private
@@ -12,7 +14,7 @@ unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
load(qt_module_config)
-HEADERS += $$QT_SOURCE_TREE/src/xml/qtconcurrentversion.h
+HEADERS += $$QT_SOURCE_TREE/src/concurrent/qtconcurrentversion.h
PRECOMPILED_HEADER = ../corelib/global/qt_pch.h
@@ -29,6 +31,7 @@ SOURCES += \
qtconcurrentexception.cpp
HEADERS += \
+ qtconcurrent_global.h \
qfuture.h \
qfutureinterface.h \
qfuturesynchronizer.h \
diff --git a/src/concurrent/qfuture.h b/src/concurrent/qfuture.h
index 6e99a6068e..4005fe58fa 100644
--- a/src/concurrent/qfuture.h
+++ b/src/concurrent/qfuture.h
@@ -42,7 +42,7 @@
#ifndef QFUTURE_H
#define QFUTURE_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_QFUTURE
diff --git a/src/concurrent/qfutureinterface.h b/src/concurrent/qfutureinterface.h
index f64623ae58..9ae2df5d07 100644
--- a/src/concurrent/qfutureinterface.h
+++ b/src/concurrent/qfutureinterface.h
@@ -42,7 +42,8 @@
#ifndef QFUTUREINTERFACE_H
#define QFUTUREINTERFACE_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
+
#include <QtCore/qrunnable.h>
#ifndef QT_NO_QFUTURE
@@ -60,7 +61,7 @@ class QFutureInterfaceBasePrivate;
class QFutureWatcherBase;
class QFutureWatcherBasePrivate;
-class Q_CORE_EXPORT QFutureInterfaceBase
+class Q_CONCURRENT_EXPORT QFutureInterfaceBase
{
public:
enum State {
diff --git a/src/concurrent/qfutureinterface_p.h b/src/concurrent/qfutureinterface_p.h
index ea52621378..3a73f846ac 100644
--- a/src/concurrent/qfutureinterface_p.h
+++ b/src/concurrent/qfutureinterface_p.h
@@ -53,6 +53,8 @@
// We mean it.
//
+#include <QtConcurrent/qtconcurrent_global.h>
+
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qlist.h>
diff --git a/src/concurrent/qfuturesynchronizer.h b/src/concurrent/qfuturesynchronizer.h
index 8b7e710ea9..3106dd44ac 100644
--- a/src/concurrent/qfuturesynchronizer.h
+++ b/src/concurrent/qfuturesynchronizer.h
@@ -42,6 +42,8 @@
#ifndef QFUTRUESYNCHRONIZER_H
#define QFUTRUESYNCHRONIZER_H
+#include <QtConcurrent/qtconcurrent_global.h>
+
#include <QtConcurrent/qfuture.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qfuturewatcher.h b/src/concurrent/qfuturewatcher.h
index 0e94863d12..11dab42174 100644
--- a/src/concurrent/qfuturewatcher.h
+++ b/src/concurrent/qfuturewatcher.h
@@ -42,6 +42,8 @@
#ifndef QFUTUREWATCHER_H
#define QFUTUREWATCHER_H
+#include <QtConcurrent/qtconcurrent_global.h>
+
#include <QtConcurrent/qfuture.h>
#ifndef QT_NO_QFUTURE
@@ -55,7 +57,7 @@ QT_BEGIN_NAMESPACE
class QEvent;
class QFutureWatcherBasePrivate;
-class Q_CORE_EXPORT QFutureWatcherBase : public QObject
+class Q_CONCURRENT_EXPORT QFutureWatcherBase : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QFutureWatcherBase)
diff --git a/src/concurrent/qfuturewatcher_p.h b/src/concurrent/qfuturewatcher_p.h
index 27bc49439a..46486bf571 100644
--- a/src/concurrent/qfuturewatcher_p.h
+++ b/src/concurrent/qfuturewatcher_p.h
@@ -53,6 +53,8 @@
// We mean it.
//
+#include <QtConcurrent/qtconcurrent_global.h>
+
#include "qfutureinterface_p.h"
#include <qlist.h>
diff --git a/src/corelib/arch/qatomic_arch.h b/src/concurrent/qtconcurrent_global.h
index 59c8de3cde..1e26c2321d 100644
--- a/src/corelib/arch/qatomic_arch.h
+++ b/src/concurrent/qtconcurrent_global.h
@@ -39,39 +39,46 @@
**
****************************************************************************/
-#ifndef QATOMIC_ARCH_H
-#define QATOMIC_ARCH_H
+#ifndef QTCONCURRENT_GLOBAL_H
+#define QTCONCURRENT_GLOBAL_H
-QT_BEGIN_HEADER
+#include <QtCore/qglobal.h>
-#include "QtCore/qglobal.h"
+#ifdef QT_NO_CONCURRENT
+# define QT_NO_QFUTURE
+#endif
-#if defined(QT_ARCH_INTEGRITY)
-# include "QtCore/qatomic_integrity.h"
-#elif defined(QT_ARCH_VXWORKS)
-# include "QtCore/qatomic_vxworks.h"
-#elif defined(QT_ARCH_ALPHA)
-# include "QtCore/qatomic_alpha.h"
-#elif defined(QT_ARCH_BFIN)
-# include "QtCore/qatomic_bfin.h"
-#elif defined(QT_ARCH_GENERIC)
-# include "QtCore/qatomic_generic.h"
-#elif defined(QT_ARCH_PARISC)
-# include "QtCore/qatomic_parisc.h"
-#elif defined(QT_ARCH_POWERPC)
-# include "QtCore/qatomic_powerpc.h"
-#elif defined(QT_ARCH_S390)
-# include "QtCore/qatomic_s390.h"
-#elif defined(QT_ARCH_SPARC)
-# include "QtCore/qatomic_sparc.h"
-#elif defined(QT_ARCH_SH)
-# include "QtCore/qatomic_sh.h"
-#elif defined(QT_ARCH_SH4A)
-# include "QtCore/qatomic_sh4a.h"
-#else
-# error "Qt has not been ported to this architecture"
+#if defined(Q_OS_WIN) && !defined(QT_NODLL)
+# if defined(QT_MAKEDLL)
+# if defined(QT_BUILD_CONCURRENT_LIB)
+# define Q_CONCURRENT_EXPORT Q_DECL_EXPORT
+# else
+# define Q_CONCURRENT_EXPORT Q_DECL_IMPORT
+# endif
+# elif defined(QT_DLL)
+# define Q_CONCURRENT_EXPORT Q_DECL_IMPORT
+# endif
+#endif
+
+#if !defined(Q_CONCURRENT_EXPORT)
+# if defined(QT_SHARED)
+# define Q_CONCURRENT_EXPORT Q_DECL_EXPORT
+# else
+# define Q_CONCURRENT_EXPORT
+# endif
#endif
-QT_END_HEADER
+// gcc 3 version has problems with some of the
+// map/filter overloads.
+#if defined(Q_CC_GNU) && (__GNUC__ < 4)
+# define QT_NO_CONCURRENT_MAP
+# define QT_NO_CONCURRENT_FILTER
+#endif
+
+#if defined (Q_CC_MSVC) && (_MSC_VER < 1300)
+# define QT_TYPENAME
+#else
+# define QT_TYPENAME typename
+#endif
-#endif // QATOMIC_ARCH_H
+#endif // include guard
diff --git a/src/concurrent/qtconcurrentcompilertest.h b/src/concurrent/qtconcurrentcompilertest.h
index 7818423090..7f3f7d4262 100644
--- a/src/concurrent/qtconcurrentcompilertest.h
+++ b/src/concurrent/qtconcurrentcompilertest.h
@@ -42,20 +42,13 @@
#ifndef QTCONCURRENT_COMPILERTEST_H
#define QTCONCURRENT_COMPILERTEST_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-
-#if defined (Q_CC_MSVC) && (_MSC_VER < 1300)
-# define QT_TYPENAME
-#else
-# define QT_TYPENAME typename
-#endif
-
namespace QtPrivate {
template<class T>
diff --git a/src/concurrent/qtconcurrentexception.h b/src/concurrent/qtconcurrentexception.h
index b04e1f2a04..80926c49c1 100644
--- a/src/concurrent/qtconcurrentexception.h
+++ b/src/concurrent/qtconcurrentexception.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_EXCEPTION_H
#define QTCONCURRENT_EXCEPTION_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_QFUTURE
@@ -62,14 +62,14 @@ namespace QtConcurrent
#ifndef QT_NO_EXCEPTIONS
-class Q_CORE_EXPORT Exception : public std::exception
+class Q_CONCURRENT_EXPORT Exception : public std::exception
{
public:
virtual void raise() const;
virtual Exception *clone() const;
};
-class Q_CORE_EXPORT UnhandledException : public Exception
+class Q_CONCURRENT_EXPORT UnhandledException : public Exception
{
public:
void raise() const;
@@ -90,7 +90,7 @@ public:
QExplicitlySharedDataPointer<Base> base;
};
-class Q_CORE_EXPORT ExceptionStore
+class Q_CONCURRENT_EXPORT ExceptionStore
{
public:
void setException(const Exception &e);
@@ -107,7 +107,7 @@ public:
namespace internal {
-class Q_CORE_EXPORT ExceptionStore
+class Q_CONCURRENT_EXPORT ExceptionStore
{
public:
ExceptionStore() { }
diff --git a/src/concurrent/qtconcurrentfilter.h b/src/concurrent/qtconcurrentfilter.h
index 1de8d230b1..3d4c1d6f57 100644
--- a/src/concurrent/qtconcurrentfilter.h
+++ b/src/concurrent/qtconcurrentfilter.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_FILTER_H
#define QTCONCURRENT_FILTER_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentfilterkernel.h b/src/concurrent/qtconcurrentfilterkernel.h
index 71112cb5a3..9bb4396f41 100644
--- a/src/concurrent/qtconcurrentfilterkernel.h
+++ b/src/concurrent/qtconcurrentfilterkernel.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_FILTERKERNEL_H
#define QTCONCURRENT_FILTERKERNEL_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentfunctionwrappers.h b/src/concurrent/qtconcurrentfunctionwrappers.h
index 9b86b73f6d..c87770f6c0 100644
--- a/src/concurrent/qtconcurrentfunctionwrappers.h
+++ b/src/concurrent/qtconcurrentfunctionwrappers.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_FUNCTIONWRAPPERS_H
#define QTCONCURRENT_FUNCTIONWRAPPERS_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentiteratekernel.h b/src/concurrent/qtconcurrentiteratekernel.h
index a28bc31a64..6776ff0346 100644
--- a/src/concurrent/qtconcurrentiteratekernel.h
+++ b/src/concurrent/qtconcurrentiteratekernel.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_ITERATEKERNEL_H
#define QTCONCURRENT_ITERATEKERNEL_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
@@ -80,7 +80,7 @@ namespace QtConcurrent {
management is done on the basis of the median of several timing measuremens,
and it is done induvidualy for each thread.
*/
-class Q_CORE_EXPORT BlockSizeManager
+class Q_CONCURRENT_EXPORT BlockSizeManager
{
public:
BlockSizeManager(int iterationCount);
diff --git a/src/concurrent/qtconcurrentmap.h b/src/concurrent/qtconcurrentmap.h
index 8a5557183d..4e51816b58 100644
--- a/src/concurrent/qtconcurrentmap.h
+++ b/src/concurrent/qtconcurrentmap.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_MAP_H
#define QTCONCURRENT_MAP_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentmapkernel.h b/src/concurrent/qtconcurrentmapkernel.h
index ceeaa6e3b3..a1ca2b60fd 100644
--- a/src/concurrent/qtconcurrentmapkernel.h
+++ b/src/concurrent/qtconcurrentmapkernel.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_MAPKERNEL_H
#define QTCONCURRENT_MAPKERNEL_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentmedian.h b/src/concurrent/qtconcurrentmedian.h
index 78fc3d97c8..9a17ecb3b4 100644
--- a/src/concurrent/qtconcurrentmedian.h
+++ b/src/concurrent/qtconcurrentmedian.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_MEDIAN_H
#define QTCONCURRENT_MEDIAN_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentreducekernel.h b/src/concurrent/qtconcurrentreducekernel.h
index ddf56298ad..4eaa767b1d 100644
--- a/src/concurrent/qtconcurrentreducekernel.h
+++ b/src/concurrent/qtconcurrentreducekernel.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_REDUCEKERNEL_H
#define QTCONCURRENT_REDUCEKERNEL_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentresultstore.h b/src/concurrent/qtconcurrentresultstore.h
index d39a45bba3..bb7b39311f 100644
--- a/src/concurrent/qtconcurrentresultstore.h
+++ b/src/concurrent/qtconcurrentresultstore.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_RESULTSTORE_H
#define QTCONCURRENT_RESULTSTORE_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_QFUTURE
@@ -78,7 +78,7 @@ public:
const void *result; // if count is 0 it's a result, otherwise it's a vector.
};
-class Q_CORE_EXPORT ResultIteratorBase
+class Q_CONCURRENT_EXPORT ResultIteratorBase
{
public:
ResultIteratorBase();
@@ -119,7 +119,7 @@ public:
}
};
-class Q_CORE_EXPORT ResultStoreBase
+class Q_CONCURRENT_EXPORT ResultStoreBase
{
public:
ResultStoreBase();
diff --git a/src/concurrent/qtconcurrentrun.h b/src/concurrent/qtconcurrentrun.h
index d7285388da..0e46db868d 100644
--- a/src/concurrent/qtconcurrentrun.h
+++ b/src/concurrent/qtconcurrentrun.h
@@ -43,7 +43,7 @@
#ifndef QTCONCURRENT_RUN_H
#define QTCONCURRENT_RUN_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentrunbase.h b/src/concurrent/qtconcurrentrunbase.h
index 2105437ede..2637abfc2e 100644
--- a/src/concurrent/qtconcurrentrunbase.h
+++ b/src/concurrent/qtconcurrentrunbase.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_RUNBASE_H
#define QTCONCURRENT_RUNBASE_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentstoredfunctioncall.h b/src/concurrent/qtconcurrentstoredfunctioncall.h
index c311a72427..d980e25623 100644
--- a/src/concurrent/qtconcurrentstoredfunctioncall.h
+++ b/src/concurrent/qtconcurrentstoredfunctioncall.h
@@ -43,7 +43,7 @@
#ifndef QTCONCURRENT_STOREDFUNCTIONCALL_H
#define QTCONCURRENT_STOREDFUNCTIONCALL_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
#include <QtConcurrent/qtconcurrentrunbase.h>
diff --git a/src/concurrent/qtconcurrentthreadengine.h b/src/concurrent/qtconcurrentthreadengine.h
index 20e86f59b6..3ecdc84600 100644
--- a/src/concurrent/qtconcurrentthreadengine.h
+++ b/src/concurrent/qtconcurrentthreadengine.h
@@ -42,7 +42,7 @@
#ifndef QTCONCURRENT_THREADENGINE_H
#define QTCONCURRENT_THREADENGINE_H
-#include <QtCore/qglobal.h>
+#include <QtConcurrent/qtconcurrent_global.h>
#ifndef QT_NO_CONCURRENT
@@ -93,7 +93,7 @@ enum ThreadFunctionResult { ThrottleThread, ThreadFinished };
// Can be run in three modes: single threaded, multi-threaded blocking
// and multi-threaded asynchronous.
// The code for the single threaded mode is
-class Q_CORE_EXPORT ThreadEngineBase: public QRunnable
+class Q_CONCURRENT_EXPORT ThreadEngineBase: public QRunnable
{
public:
// Public API:
diff --git a/src/corelib/Qt5CoreConfigExtras.cmake.in b/src/corelib/Qt5CoreConfigExtras.cmake.in
index e97493f65d..440d5e92bb 100644
--- a/src/corelib/Qt5CoreConfigExtras.cmake.in
+++ b/src/corelib/Qt5CoreConfigExtras.cmake.in
@@ -5,3 +5,14 @@ get_filename_component(_qt5_corelib_install_prefix ${CMAKE_CURRENT_LIST_DIR}/$${
set(QT_QMAKE_EXECUTABLE \"${_qt5_corelib_install_prefix}/$$CMAKE_BIN_DIR/qmake$$CMAKE_BIN_SUFFIX\")
set(QT_MOC_EXECUTABLE \"${_qt5_corelib_install_prefix}/$$CMAKE_BIN_DIR/moc$$CMAKE_BIN_SUFFIX\")
set(QT_RCC_EXECUTABLE \"${_qt5_corelib_install_prefix}/$$CMAKE_BIN_DIR/rcc$$CMAKE_BIN_SUFFIX\")
+
+list(APPEND Qt5Core_INCLUDE_DIRS \"${_qt5_corelib_install_prefix}/mkspecs/default\")
+
+if (NOT \"$${CMAKE_ADD_FPIE_FLAGS}\" STREQUAL \"\")
+ set(Qt5Core_COMPILE_FLAGS "-fPIE")
+endif()
+
+if (NOT \"$$QT_NAMESPACE\" STREQUAL \"\")
+ list(APPEND Qt5Core_DEFINITIONS -DQT_NAMESPACE=$$QT_NAMESPACE)
+ list(APPEND Qt5Core_COMPILE_DEFINITIONS QT_NAMESPACE=$$QT_NAMESPACE)
+endif()
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index 30f071498e..04df52c6f0 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -248,6 +248,12 @@ QUnifiedTimer *QUnifiedTimer::instance()
return instance(true);
}
+void QUnifiedTimer::maybeUpdateAnimationsToCurrentTime()
+{
+ if (time.elapsed() - lastTick > 50)
+ updateAnimationTimers(driver->elapsed());
+}
+
void QUnifiedTimer::updateAnimationTimers(qint64 currentTick)
{
//setCurrentTime can get this called again while we're the for loop. At least with pauseAnimations
@@ -590,7 +596,7 @@ void QAnimationTimer::startAnimations()
startAnimationPending = false;
//force timer to update, which prevents large deltas for our newly added animations
if (!animations.isEmpty())
- QUnifiedTimer::instance()->updateAnimationTimers(-1);
+ QUnifiedTimer::instance()->maybeUpdateAnimationsToCurrentTime();
//we transfer the waiting animations into the "really running" state
animations += animationsToStart;
diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h
index 70200c4064..34ddbc606f 100644
--- a/src/corelib/animation/qabstractanimation.h
+++ b/src/corelib/animation/qabstractanimation.h
@@ -149,7 +149,7 @@ public:
bool isRunning() const;
- qint64 elapsed() const;
+ virtual qint64 elapsed() const;
Q_SIGNALS:
void started();
diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h
index c4d53342c2..02a3c02ddc 100644
--- a/src/corelib/animation/qabstractanimation_p.h
+++ b/src/corelib/animation/qabstractanimation_p.h
@@ -185,6 +185,7 @@ public:
bool canUninstallAnimationDriver(QAnimationDriver *driver);
void restart();
+ void maybeUpdateAnimationsToCurrentTime();
void updateAnimationTimers(qint64 currentTick);
//useful for profiling/debugging
diff --git a/src/corelib/arch/alpha/arch.pri b/src/corelib/arch/alpha/arch.pri
deleted file mode 100644
index 448a531f07..0000000000
--- a/src/corelib/arch/alpha/arch.pri
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# Alpha architecture
-#
-!*-g++*:SOURCES += $$QT_ARCH_CPP/qatomic_alpha.s
diff --git a/src/corelib/arch/alpha/qatomic_alpha.s b/src/corelib/arch/alpha/qatomic_alpha.s
deleted file mode 100644
index 3bccd12849..0000000000
--- a/src/corelib/arch/alpha/qatomic_alpha.s
+++ /dev/null
@@ -1,239 +0,0 @@
-;/****************************************************************************
-;**
-;** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-;** Contact: http://www.qt-project.org/
-;**
-;** This file is part of the QtGui module of the Qt Toolkit.
-;**
-;** $QT_BEGIN_LICENSE:LGPL$
-;** GNU Lesser General Public License Usage
-;** This file may be used under the terms of the GNU Lesser General Public
-;** License version 2.1 as published by the Free Software Foundation and
-;** appearing in the file LICENSE.LGPL included in the packaging of this
-;** file. Please review the following information to ensure the GNU Lesser
-;** General Public License version 2.1 requirements will be met:
-;** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-;**
-;** In addition, as a special exception, Nokia gives you certain additional
-;** rights. These rights are described in the Nokia Qt LGPL Exception
-;** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-;**
-;** GNU General Public License Usage
-;** Alternatively, this file may be used under the terms of the GNU General
-;** Public License version 3.0 as published by the Free Software Foundation
-;** and appearing in the file LICENSE.GPL included in the packaging of this
-;** file. Please review the following information to ensure the GNU General
-;** Public License version 3.0 requirements will be met:
-;** http://www.gnu.org/copyleft/gpl.html.
-;**
-;** Other Usage
-;** Alternatively, this file may be used in accordance with the terms and
-;** conditions contained in a signed written agreement between you and Nokia.
-;**
-;**
-;**
-;**
-;**
-;**
-;** $QT_END_LICENSE$
-;**
-;****************************************************************************/
- .set noreorder
- .set volatile
- .set noat
- .arch ev4
- .text
- .align 2
- .align 4
- .globl q_atomic_test_and_set_int
- .ent q_atomic_test_and_set_int
-q_atomic_test_and_set_int:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- cmpeq $0,$17,$0
- beq $0,3f
- mov $18,$0
- stl_c $0,0($16)
- beq $0,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_test_and_set_int
- .align 2
- .align 4
- .globl q_atomic_test_and_set_acquire_int
- .ent q_atomic_test_and_set_acquire_int
-q_atomic_test_and_set_acquire_int:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- cmpeq $0,$17,$0
- beq $0,3f
- mov $18,$0
- stl_c $0,0($16)
- beq $0,2f
- br 3f
-2: br 1b
-3: mb
- addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_test_and_set_acquire_int
- .align 2
- .align 4
- .globl q_atomic_test_and_set_release_int
- .ent q_atomic_test_and_set_release_int
-q_atomic_test_and_set_release_int:
- .frame $30,0,$26,0
- .prologue 0
- mb
-1: ldl_l $0,0($16)
- cmpeq $0,$17,$0
- beq $0,3f
- mov $18,$0
- stl_c $0,0($16)
- beq $0,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_test_and_set_release_int
- .align 2
- .align 4
- .globl q_atomic_test_and_set_ptr
- .ent q_atomic_test_and_set_ptr
-q_atomic_test_and_set_ptr:
- .frame $30,0,$26,0
- .prologue 0
-1: ldq_l $0,0($16)
- cmpeq $0,$17,$0
- beq $0,3f
- mov $18,$0
- stq_c $0,0($16)
- beq $0,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_test_and_set_ptr
- .align 2
- .align 4
- .globl q_atomic_increment
- .ent q_atomic_increment
-q_atomic_increment:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- addl $0,1,$1
- stl_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- cmpeq $0,$1,$0
- xor $0,1,$0
- ret $31,($26),1
- .end q_atomic_increment
- .align 2
- .align 4
- .globl q_atomic_decrement
- .ent q_atomic_decrement
-q_atomic_decrement:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- subl $0,1,$1
- stl_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- cmpeq $0,1,$0
- xor $0,1,$0
- ret $31,($26),1
- .end q_atomic_decrement
- .align 2
- .align 4
- .globl q_atomic_set_int
- .ent q_atomic_set_int
-q_atomic_set_int:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- mov $17,$1
- stl_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_set_int
- .align 2
- .align 4
- .globl q_atomic_set_ptr
- .ent q_atomic_set_ptr
-q_atomic_set_ptr:
- .frame $30,0,$26,0
- .prologue 0
-1: ldq_l $0,0($16)
- mov $17,$1
- stq_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: ret $31,($26),1
- .end q_atomic_set_ptr
-
- .align 2
- .align 4
- .globl q_atomic_fetch_and_add_int
- .ent q_atomic_fetch_and_add_int
-q_atomic_fetch_and_add_int:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- addl $0,$17,$1
- stl_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_fetch_and_add_int
-
- .align 2
- .align 4
- .globl q_atomic_fetch_and_add_acquire_int
- .ent q_atomic_fetch_and_add_acquire_int
-q_atomic_fetch_and_add_acquire_int:
- .frame $30,0,$26,0
- .prologue 0
-1: ldl_l $0,0($16)
- addl $0,$17,$1
- stl_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: mb
- addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_fetch_and_add_acquire_int
-
- .align 2
- .align 4
- .globl q_atomic_fetch_and_add_release_int
- .ent q_atomic_fetch_and_add_release_int
-q_atomic_fetch_and_add_release_int:
- .frame $30,0,$26,0
- .prologue 0
- mb
-1: ldl_l $0,0($16)
- addl $0,$17,$1
- stl_c $1,0($16)
- beq $1,2f
- br 3f
-2: br 1b
-3: addl $31,$0,$0
- ret $31,($26),1
- .end q_atomic_fetch_and_add_release_int
diff --git a/src/corelib/arch/arch.pri b/src/corelib/arch/arch.pri
index 62b07a4a99..c611087043 100644
--- a/src/corelib/arch/arch.pri
+++ b/src/corelib/arch/arch.pri
@@ -1,39 +1,27 @@
-win32:HEADERS += arch/qatomic_msvc.h \
- arch/qatomic_generic.h
-
-win32-g++*:HEADERS += arch/qatomic_i386.h \
- arch/qatomic_x86_64.h
-
-mac:HEADERS += arch/qatomic_i386.h \
- arch/qatomic_x86_64.h \
- arch/qatomic_generic.h
-
+win32|wince:HEADERS += arch/qatomic_msvc.h
vxworks:HEADERS += arch/qatomic_vxworks.h
-
integrity:HEADERS += arch/qatomic_integrity.h
-!wince*:!win32:!mac:HEADERS += arch/qatomic_alpha.h \
- arch/qatomic_ia64.h \
- arch/qatomic_parisc.h \
- arch/qatomic_sparc.h \
- arch/qatomic_arch.h \
- arch/qatomic_generic.h \
- arch/qatomic_powerpc.h \
- arch/qatomic_arm.h \
- arch/qatomic_armv5.h \
- arch/qatomic_armv6.h \
- arch/qatomic_armv7.h \
- arch/qatomic_i386.h \
- arch/qatomic_mips.h \
- arch/qatomic_s390.h \
- arch/qatomic_x86_64.h \
- arch/qatomic_sh.h \
- arch/qatomic_sh4a.h \
- arch/qatomic_gcc.h \
- arch/qatomic_cxx11.h
+HEADERS += \
+ arch/qatomic_alpha.h \
+ arch/qatomic_armv5.h \
+ arch/qatomic_armv6.h \
+ arch/qatomic_armv7.h \
+ arch/qatomic_bfin.h \
+ arch/qatomic_bootstrap.h \
+ arch/qatomic_i386.h \
+ arch/qatomic_ia64.h \
+ arch/qatomic_mips.h \
+ arch/qatomic_power.h \
+ arch/qatomic_s390.h \
+ arch/qatomic_sh4a.h \
+ arch/qatomic_sparc.h \
+ arch/qatomic_x86_64.h \
+ arch/qatomic_gcc.h \
+ arch/qatomic_cxx11.h
-QT_ARCH_CPP = $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH
-exists($$QT_ARCH_CPP) {
- DEPENDPATH += $$QT_ARCH_CPP
- include($$QT_ARCH_CPP/arch.pri, "", true)
+unix {
+ # fallback implementation when no other appropriate qatomic_*.h exists
+ HEADERS += arch/qatomic_unix.h
+ SOURCES += arch/qatomic_unix.cpp
}
diff --git a/src/corelib/arch/generic/arch.pri b/src/corelib/arch/generic/arch.pri
deleted file mode 100644
index 8fee63fa5d..0000000000
--- a/src/corelib/arch/generic/arch.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# 'generic' architecture
-#
-
-unix:SOURCES += qatomic_generic_unix.cpp
-win32:SOURCES += qatomic_generic_windows.cpp
diff --git a/src/corelib/arch/generic/qatomic_generic_unix.cpp b/src/corelib/arch/generic/qatomic_generic_unix.cpp
deleted file mode 100644
index eb1498fceb..0000000000
--- a/src/corelib/arch/generic/qatomic_generic_unix.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-
-#include <QtCore/qatomic.h>
-
-QT_BEGIN_NAMESPACE
-static pthread_mutex_t qAtomicMutex = PTHREAD_MUTEX_INITIALIZER;
-
-Q_CORE_EXPORT
-bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue)
-{
- bool returnValue = false;
- pthread_mutex_lock(&qAtomicMutex);
- if (*_q_value == expectedValue) {
- *_q_value = newValue;
- returnValue = true;
- }
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
-Q_CORE_EXPORT
-int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue)
-{
- int returnValue;
- pthread_mutex_lock(&qAtomicMutex);
- returnValue = *_q_value;
- *_q_value = newValue;
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
-Q_CORE_EXPORT
-int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd)
-{
- int returnValue;
- pthread_mutex_lock(&qAtomicMutex);
- returnValue = *_q_value;
- *_q_value += valueToAdd;
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
-Q_CORE_EXPORT
-bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value,
- void *expectedValue,
- void *newValue)
-{
- bool returnValue = false;
- pthread_mutex_lock(&qAtomicMutex);
- if (*_q_value == expectedValue) {
- *_q_value = newValue;
- returnValue = true;
- }
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
-Q_CORE_EXPORT
-void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue)
-{
- void *returnValue;
- pthread_mutex_lock(&qAtomicMutex);
- returnValue = *_q_value;
- *_q_value = newValue;
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
-Q_CORE_EXPORT
-void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd)
-{
- void *returnValue;
- pthread_mutex_lock(&qAtomicMutex);
- returnValue = *_q_value;
- *_q_value = reinterpret_cast<char *>(returnValue) + valueToAdd;
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-QT_END_NAMESPACE
diff --git a/src/corelib/arch/generic/qatomic_generic_windows.cpp b/src/corelib/arch/generic/qatomic_generic_windows.cpp
deleted file mode 100644
index dafc8133b2..0000000000
--- a/src/corelib/arch/generic/qatomic_generic_windows.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-
-#include <QtCore/qatomic.h>
-
-
-class QCriticalSection
-{
-public:
- QCriticalSection() { InitializeCriticalSection(&section); }
- ~QCriticalSection() { DeleteCriticalSection(&section); }
- void lock() { EnterCriticalSection(&section); }
- void unlock() { LeaveCriticalSection(&section); }
-
-private:
- CRITICAL_SECTION section;
-};
-
-static QCriticalSection qAtomicCriticalSection;
-
-Q_CORE_EXPORT
-bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue)
-{
- bool returnValue = false;
- qAtomicCriticalSection.lock();
- if (*_q_value == expectedValue) {
- *_q_value = newValue;
- returnValue = true;
- }
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
-Q_CORE_EXPORT
-int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue)
-{
- int returnValue;
- qAtomicCriticalSection.lock();
- returnValue = *_q_value;
- *_q_value = newValue;
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
-Q_CORE_EXPORT
-int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd)
-{
- int returnValue;
- qAtomicCriticalSection.lock();
- returnValue = *_q_value;
- *_q_value += valueToAdd;
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
-Q_CORE_EXPORT
-bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value,
- void *expectedValue,
- void *newValue)
-{
- bool returnValue = false;
- qAtomicCriticalSection.lock();
- if (*_q_value == expectedValue) {
- *_q_value = newValue;
- returnValue = true;
- }
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
-Q_CORE_EXPORT
-void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue)
-{
- void *returnValue;
- qAtomicCriticalSection.lock();
- returnValue = *_q_value;
- *_q_value = newValue;
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
-Q_CORE_EXPORT
-void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd)
-{
- void *returnValue;
- qAtomicCriticalSection.lock();
- returnValue = *_q_value;
- *_q_value = reinterpret_cast<char *>(returnValue) + valueToAdd;
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
diff --git a/src/corelib/arch/parisc/arch.pri b/src/corelib/arch/parisc/arch.pri
deleted file mode 100644
index fab2897f04..0000000000
--- a/src/corelib/arch/parisc/arch.pri
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# HP PA-RISC architecture
-#
-SOURCES += $$QT_ARCH_CPP/q_ldcw.s \
- $$QT_ARCH_CPP/qatomic_parisc.cpp
diff --git a/src/corelib/arch/parisc/q_ldcw.s b/src/corelib/arch/parisc/q_ldcw.s
deleted file mode 100644
index 8af2861c50..0000000000
--- a/src/corelib/arch/parisc/q_ldcw.s
+++ /dev/null
@@ -1,62 +0,0 @@
-;/****************************************************************************
-;**
-;** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-;** Contact: http://www.qt-project.org/
-;**
-;** This file is part of the QtGui module of the Qt Toolkit.
-;**
-;** $QT_BEGIN_LICENSE:LGPL$
-;** GNU Lesser General Public License Usage
-;** This file may be used under the terms of the GNU Lesser General Public
-;** License version 2.1 as published by the Free Software Foundation and
-;** appearing in the file LICENSE.LGPL included in the packaging of this
-;** file. Please review the following information to ensure the GNU Lesser
-;** General Public License version 2.1 requirements will be met:
-;** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-;**
-;** In addition, as a special exception, Nokia gives you certain additional
-;** rights. These rights are described in the Nokia Qt LGPL Exception
-;** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-;**
-;** GNU General Public License Usage
-;** Alternatively, this file may be used under the terms of the GNU General
-;** Public License version 3.0 as published by the Free Software Foundation
-;** and appearing in the file LICENSE.GPL included in the packaging of this
-;** file. Please review the following information to ensure the GNU General
-;** Public License version 3.0 requirements will be met:
-;** http://www.gnu.org/copyleft/gpl.html.
-;**
-;** Other Usage
-;** Alternatively, this file may be used in accordance with the terms and
-;** conditions contained in a signed written agreement between you and Nokia.
-;**
-;**
-;**
-;**
-;**
-;**
-;** $QT_END_LICENSE$
-;**
-;****************************************************************************/
- .SPACE $PRIVATE$
- .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
- .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
- .SPACE $TEXT$
- .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
- .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
- .IMPORT $global$,DATA
- .IMPORT $$dyncall,MILLICODE
- .SPACE $TEXT$
- .SUBSPA $CODE$
-
- .align 4
- .EXPORT q_ldcw,ENTRY,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
-q_ldcw
- .PROC
- .CALLINFO FRAME=0,CALLS,SAVE_RP
- .ENTRY
- ldcw 0(%r26),%r1
- bv %r0(%r2)
- copy %r1,%r28
- .EXIT
- .PROCEND
diff --git a/src/corelib/arch/powerpc/arch.pri b/src/corelib/arch/powerpc/arch.pri
deleted file mode 100644
index 1989ac73a7..0000000000
--- a/src/corelib/arch/powerpc/arch.pri
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# PowerPC architecture
-#
-!*-g++* {
- *-64 {
- SOURCES += $$QT_ARCH_CPP/qatomic64.s
- } else {
- SOURCES += $$QT_ARCH_CPP/qatomic32.s
- }
-}
diff --git a/src/corelib/arch/powerpc/qatomic32.s b/src/corelib/arch/powerpc/qatomic32.s
deleted file mode 100644
index 8e2dbe2e2f..0000000000
--- a/src/corelib/arch/powerpc/qatomic32.s
+++ /dev/null
@@ -1,525 +0,0 @@
-############################################################################
-##
-## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-## Contact: http://www.qt-project.org/
-##
-## This file is part of the QtGui module of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:LGPL$
-## GNU Lesser General Public License Usage
-## This file may be used under the terms of the GNU Lesser General Public
-## License version 2.1 as published by the Free Software Foundation and
-## appearing in the file LICENSE.LGPL included in the packaging of this
-## file. Please review the following information to ensure the GNU Lesser
-## General Public License version 2.1 requirements will be met:
-## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-##
-## In addition, as a special exception, Nokia gives you certain additional
-## rights. These rights are described in the Nokia Qt LGPL Exception
-## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU General
-## Public License version 3.0 as published by the Free Software Foundation
-## and appearing in the file LICENSE.GPL included in the packaging of this
-## file. Please review the following information to ensure the GNU General
-## Public License version 3.0 requirements will be met:
-## http://www.gnu.org/copyleft/gpl.html.
-##
-## Other Usage
-## Alternatively, this file may be used in accordance with the terms and
-## conditions contained in a signed written agreement between you and Nokia.
-##
-##
-##
-##
-##
-##
-## $QT_END_LICENSE$
-##
-############################################################################
- .machine "ppc"
- .toc
- .csect .text[PR]
-
- .align 2
- .globl q_atomic_test_and_set_int
- .globl .q_atomic_test_and_set_int
- .csect q_atomic_test_and_set_int[DS],3
-q_atomic_test_and_set_int:
- .long .q_atomic_test_and_set_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_int-.q_atomic_test_and_set_int
- .short 25
- .byte "q_atomic_test_and_set_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_acquire_int
- .globl .q_atomic_test_and_set_acquire_int
- .csect q_atomic_test_and_set_acquire_int[DS],3
-q_atomic_test_and_set_acquire_int:
- .long .q_atomic_test_and_set_acquire_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_acquire_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+16
- stwcx. 5,0,3
- bne- $-16
- isync
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_acquire_int-.q_atomic_test_and_set_acquire_int
- .short 33
- .byte "q_atomic_test_and_set_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_release_int
- .globl .q_atomic_test_and_set_release_int
- .csect q_atomic_test_and_set_release_int[DS],3
-q_atomic_test_and_set_release_int:
- .long .q_atomic_test_and_set_release_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_release_int:
- eieio
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_release_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_release_int-.q_atomic_test_and_set_release_int
- .short 33
- .byte "q_atomic_test_and_set_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_ptr
- .globl .q_atomic_test_and_set_ptr
- .csect q_atomic_test_and_set_ptr[DS],3
-q_atomic_test_and_set_ptr:
- .long .q_atomic_test_and_set_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_ptr:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_ptr-.q_atomic_test_and_set_ptr
- .short 25
- .byte "q_atomic_test_and_set_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_acquire_ptr
- .globl .q_atomic_test_and_set_acquire_ptr
- .csect q_atomic_test_and_set_acquire_ptr[DS],3
-q_atomic_test_and_set_acquire_ptr:
- .long .q_atomic_test_and_set_acquire_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_acquire_ptr:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+16
- stwcx. 5,0,3
- bne- $-16
- isync
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_acquire_ptr-.q_atomic_test_and_set_acquire_ptr
- .short 25
- .byte "q_atomic_test_and_set_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_release_ptr
- .globl .q_atomic_test_and_set_release_ptr
- .csect q_atomic_test_and_set_release_ptr[DS],3
-q_atomic_test_and_set_release_ptr:
- .long .q_atomic_test_and_set_release_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_release_ptr:
- eieio
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_release_ptr-.q_atomic_test_and_set_release_ptr
- .short 33
- .byte "q_atomic_test_and_set_release_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_increment
- .globl .q_atomic_increment
- .csect q_atomic_increment[DS],3
-q_atomic_increment:
- .long .q_atomic_increment,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_increment:
- lwarx 4,0,3
- addi 4,4,1
- stwcx. 4,0,3
- bne- $-12
- mr 3,4
- blr
-LT..q_atomic_increment:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_increment-.q_atomic_increment
- .short 18
- .byte "q_atomic_increment"
- .align 2
-
- .align 2
- .globl q_atomic_decrement
- .globl .q_atomic_decrement
- .csect q_atomic_decrement[DS],3
-q_atomic_decrement:
- .long .q_atomic_decrement,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_decrement:
- lwarx 4,0,3
- subi 4,4,1
- stwcx. 4,0,3
- bne- $-12
- mr 3,4
- blr
-LT..q_atomic_decrement:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_decrement-.q_atomic_decrement
- .short 18
- .byte "q_atomic_decrement"
- .align 2
-
- .align 2
- .globl q_atomic_set_int
- .globl .q_atomic_set_int
- .csect q_atomic_set_int[DS],3
-q_atomic_set_int:
- .long .q_atomic_set_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_set_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_set_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_set_int-.q_atomic_set_int
- .short 16
- .byte "q_atomic_set_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_acquire_int
- .globl .q_atomic_fetch_and_store_acquire_int
- .csect q_atomic_fetch_and_store_acquire_int[DS],3
-q_atomic_fetch_and_store_acquire_int:
- .long .q_atomic_fetch_and_store_acquire_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_acquire_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_acquire_int-.q_atomic_fetch_and_store_acquire_int
- .short 16
- .byte "q_atomic_fetch_and_store_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_release_int
- .globl .q_atomic_fetch_and_store_release_int
- .csect q_atomic_fetch_and_store_release_int[DS],3
-q_atomic_fetch_and_store_release_int:
- .long .q_atomic_fetch_and_store_release_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_release_int:
- eieio
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_release_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_release_int-.q_atomic_fetch_and_store_release_int
- .short 16
- .byte "q_atomic_fetch_and_store_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_set_ptr
- .globl .q_atomic_set_ptr
- .csect q_atomic_set_ptr[DS],3
-q_atomic_set_ptr:
- .long .q_atomic_set_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_set_ptr:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_set_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_set_ptr-.q_atomic_set_ptr
- .short 16
- .byte "q_atomic_set_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_acquire_ptr
- .globl .q_atomic_fetch_and_store_acquire_ptr
- .csect q_atomic_fetch_and_store_acquire_ptr[DS],3
-q_atomic_fetch_and_store_acquire_ptr:
- .long .q_atomic_fetch_and_store_acquire_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_acquire_ptr:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_acquire_ptr-.q_atomic_fetch_and_store_acquire_ptr
- .short 16
- .byte "q_atomic_fetch_and_store_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_release_ptr
- .globl .q_atomic_fetch_and_store_release_ptr
- .csect q_atomic_fetch_and_store_release_ptr[DS],3
-q_atomic_fetch_and_store_release_ptr:
- .long .q_atomic_fetch_and_store_release_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_release_ptr:
- eieio
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_release_ptr-.q_atomic_fetch_and_store_release_ptr
- .short 16
- .byte "q_atomic_fetch_and_store_release_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_int
- .globl .q_atomic_fetch_and_add_int
- .csect q_atomic_fetch_and_add_int[DS],3
-q_atomic_fetch_and_add_int:
- .long .q_atomic_fetch_and_add_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_int:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_int-.q_atomic_fetch_and_add_int
- .short 18
- .byte "q_atomic_fetch_and_add_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_acquire_int
- .globl .q_atomic_fetch_and_add_acquire_int
- .csect q_atomic_fetch_and_add_acquire_int[DS],3
-q_atomic_fetch_and_add_acquire_int:
- .long .q_atomic_fetch_and_add_acquire_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_acquire_int:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_acquire_int-.q_atomic_fetch_and_add_acquire_int
- .short 18
- .byte "q_atomic_fetch_and_add_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_release_int
- .globl .q_atomic_fetch_and_add_release_int
- .csect q_atomic_fetch_and_add_release_int[DS],3
-q_atomic_fetch_and_add_release_int:
- .long .q_atomic_fetch_and_add_release_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_release_int:
- eieio
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_release_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_release_int-.q_atomic_fetch_and_add_release_int
- .short 34
- .byte "q_atomic_fetch_and_add_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_ptr
- .globl .q_atomic_fetch_and_add_ptr
- .csect q_atomic_fetch_and_add_ptr[DS],3
-q_atomic_fetch_and_add_ptr:
- .long .q_atomic_fetch_and_add_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_ptr:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_ptr-.q_atomic_fetch_and_add_ptr
- .short 26
- .byte "q_atomic_fetch_and_add_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_acquire_ptr
- .globl .q_atomic_fetch_and_add_acquire_ptr
- .csect q_atomic_fetch_and_add_acquire_ptr[DS],3
-q_atomic_fetch_and_add_acquire_ptr:
- .long .q_atomic_fetch_and_add_acquire_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_acquire_ptr:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_acquire_ptr-.q_atomic_fetch_and_add_acquire_ptr
- .short 34
- .byte "q_atomic_fetch_and_add_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_release_ptr
- .globl .q_atomic_fetch_and_add_release_ptr
- .csect q_atomic_fetch_and_add_release_ptr[DS],3
-q_atomic_fetch_and_add_release_ptr:
- .long .q_atomic_fetch_and_add_release_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_release_ptr:
- eieio
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_release_ptr-.q_atomic_fetch_and_add_release_ptr
- .short 34
- .byte "q_atomic_fetch_and_add_release_ptr"
- .align 2
-
-_section_.text:
- .csect .data[RW],3
- .long _section_.text
diff --git a/src/corelib/arch/powerpc/qatomic64.s b/src/corelib/arch/powerpc/qatomic64.s
deleted file mode 100644
index 84977d5a93..0000000000
--- a/src/corelib/arch/powerpc/qatomic64.s
+++ /dev/null
@@ -1,533 +0,0 @@
-############################################################################
-##
-## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-## Contact: http://www.qt-project.org/
-##
-## This file is part of the QtGui module of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:LGPL$
-## GNU Lesser General Public License Usage
-## This file may be used under the terms of the GNU Lesser General Public
-## License version 2.1 as published by the Free Software Foundation and
-## appearing in the file LICENSE.LGPL included in the packaging of this
-## file. Please review the following information to ensure the GNU Lesser
-## General Public License version 2.1 requirements will be met:
-## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-##
-## In addition, as a special exception, Nokia gives you certain additional
-## rights. These rights are described in the Nokia Qt LGPL Exception
-## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU General
-## Public License version 3.0 as published by the Free Software Foundation
-## and appearing in the file LICENSE.GPL included in the packaging of this
-## file. Please review the following information to ensure the GNU General
-## Public License version 3.0 requirements will be met:
-## http://www.gnu.org/copyleft/gpl.html.
-##
-## Other Usage
-## Alternatively, this file may be used in accordance with the terms and
-## conditions contained in a signed written agreement between you and Nokia.
-##
-##
-##
-##
-##
-##
-## $QT_END_LICENSE$
-##
-############################################################################
- .machine "ppc64"
- .toc
- .csect .text[PR]
-
- .align 2
- .globl q_atomic_test_and_set_int
- .globl .q_atomic_test_and_set_int
- .csect q_atomic_test_and_set_int[DS],3
-q_atomic_test_and_set_int:
- .llong .q_atomic_test_and_set_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- extsw 3,3
- blr
-LT..q_atomic_test_and_set_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_int-.q_atomic_test_and_set_int
- .short 25
- .byte "q_atomic_test_and_set_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_acquire_int
- .globl .q_atomic_test_and_set_acquire_int
- .csect q_atomic_test_and_set_acquire_int[DS],3
-q_atomic_test_and_set_acquire_int:
- .llong .q_atomic_test_and_set_acquire_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_acquire_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+16
- stwcx. 5,0,3
- bne- $-16
- isync
- subfic 3,6,0
- adde 3,3,6
- extsw 3,3
- blr
-LT..q_atomic_test_and_set_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_acquire_int-.q_atomic_test_and_set_acquire_int
- .short 33
- .byte "q_atomic_test_and_set_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_release_int
- .globl .q_atomic_test_and_set_release_int
- .csect q_atomic_test_and_set_release_int[DS],3
-q_atomic_test_and_set_release_int:
- .llong .q_atomic_test_and_set_release_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_release_int:
- eieio
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- extsw 3,3
- blr
-LT..q_atomic_test_and_set_release_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_release_int-.q_atomic_test_and_set_release_int
- .short 33
- .byte "q_atomic_test_and_set_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_ptr
- .globl .q_atomic_test_and_set_ptr
- .csect q_atomic_test_and_set_ptr[DS],3
-q_atomic_test_and_set_ptr:
- .llong .q_atomic_test_and_set_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_ptr:
- ldarx 6,0,3
- xor. 6,6,4
- bne $+12
- stdcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_ptr-.q_atomic_test_and_set_ptr
- .short 25
- .byte "q_atomic_test_and_set_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_acquire_ptr
- .globl .q_atomic_test_and_set_acquire_ptr
- .csect q_atomic_test_and_set_acquire_ptr[DS],3
-q_atomic_test_and_set_acquire_ptr:
- .llong .q_atomic_test_and_set_acquire_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_acquire_ptr:
- ldarx 6,0,3
- xor. 6,6,4
- bne $+16
- stdcx. 5,0,3
- bne- $-16
- isync
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_acquire_ptr-.q_atomic_test_and_set_acquire_ptr
- .short 33
- .byte "q_atomic_test_and_set_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_release_ptr
- .globl .q_atomic_test_and_set_release_ptr
- .csect q_atomic_test_and_set_release_ptr[DS],3
-q_atomic_test_and_set_release_ptr:
- .llong .q_atomic_test_and_set_release_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_test_and_set_release_ptr:
- eieio
- ldarx 6,0,3
- xor. 6,6,4
- bne $+12
- stdcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_release_ptr-.q_atomic_test_and_set_release_ptr
- .short 33
- .byte "q_atomic_test_and_set_release_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_increment
- .globl .q_atomic_increment
- .csect q_atomic_increment[DS],3
-q_atomic_increment:
- .llong .q_atomic_increment,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_increment:
- lwarx 4,0,3
- addi 5,4,1
- extsw 4,5
- stwcx. 4,0,3
- bne- $-16
- mr 3,4
- blr
-LT..q_atomic_increment:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_increment-.q_atomic_increment
- .short 18
- .byte "q_atomic_increment"
- .align 2
-
- .align 2
- .globl q_atomic_decrement
- .globl .q_atomic_decrement
- .csect q_atomic_decrement[DS],3
-q_atomic_decrement:
- .llong .q_atomic_decrement,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_decrement:
- lwarx 4,0,3
- subi 5,4,1
- extsw 4,5
- stwcx. 4,0,3
- bne- $-16
- mr 3,4
- blr
-LT..q_atomic_decrement:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_decrement-.q_atomic_decrement
- .short 18
- .byte "q_atomic_decrement"
- .align 2
-
- .align 2
- .globl q_atomic_set_int
- .globl .q_atomic_set_int
- .csect q_atomic_set_int[DS],3
-q_atomic_set_int:
- .llong .q_atomic_set_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_set_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- extsw 3,5
- blr
-LT..q_atomic_set_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_set_int-.q_atomic_set_int
- .short 16
- .byte "q_atomic_set_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_acquire_int
- .globl .q_atomic_fetch_and_store_acquire_int
- .csect q_atomic_fetch_and_store_acquire_int[DS],3
-q_atomic_fetch_and_store_acquire_int:
- .llong .q_atomic_fetch_and_store_acquire_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_acquire_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- isync
- extsw 3,5
- blr
-LT..q_atomic_fetch_and_store_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_acquire_int-.q_atomic_fetch_and_store_acquire_int
- .short 36
- .byte "q_atomic_fetch_and_store_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_release_int
- .globl .q_atomic_fetch_and_store_release_int
- .csect q_atomic_fetch_and_store_release_int[DS],3
-q_atomic_fetch_and_store_release_int:
- .llong .q_atomic_fetch_and_store_release_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_release_int:
- eieio
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- extsw 3,5
- blr
-LT..q_atomic_fetch_and_store_release_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_release_int-.q_atomic_fetch_and_store_release_int
- .short 36
- .byte "q_atomic_fetch_and_store_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_set_ptr
- .globl .q_atomic_set_ptr
- .csect q_atomic_set_ptr[DS],3
-q_atomic_set_ptr:
- .llong .q_atomic_set_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_set_ptr:
- ldarx 5,0,3
- stdcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_set_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_set_ptr-.q_atomic_set_ptr
- .short 16
- .byte "q_atomic_set_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_acquire_ptr
- .globl .q_atomic_fetch_and_store_acquire_ptr
- .csect q_atomic_fetch_and_store_acquire_ptr[DS],3
-q_atomic_fetch_and_store_acquire_ptr:
- .llong .q_atomic_fetch_and_store_acquire_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_acquire_ptr:
- ldarx 5,0,3
- stdcx. 4,0,3
- bne- $-8
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_acquire_ptr-.q_atomic_fetch_and_store_acquire_ptr
- .short 36
- .byte "q_atomic_fetch_and_store_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_release_ptr
- .globl .q_atomic_fetch_and_store_release_ptr
- .csect q_atomic_fetch_and_store_release_ptr[DS],3
-q_atomic_fetch_and_store_release_ptr:
- .llong .q_atomic_fetch_and_store_release_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_store_release_ptr:
- eieio
- ldarx 5,0,3
- stdcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_release_ptr-.q_atomic_fetch_and_store_release_ptr
- .short 36
- .byte "q_atomic_fetch_and_store_release_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_int
- .globl .q_atomic_fetch_and_add_int
- .csect q_atomic_fetch_and_add_int[DS],3
-q_atomic_fetch_and_add_int:
- .llong .q_atomic_fetch_and_add_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_int:
- lwarx 5,0,3
- add 6,4,5
- extsw 7,6
- stwcx. 7,0,3
- bne- $-16
- extsw 3,5
- blr
-LT..q_atomic_fetch_and_add_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_int-.q_atomic_fetch_and_add_int
- .short 26
- .byte "q_atomic_fetch_and_add_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_acquire_int
- .globl .q_atomic_fetch_and_add_acquire_int
- .csect q_atomic_fetch_and_add_acquire_int[DS],3
-q_atomic_fetch_and_add_acquire_int:
- .llong .q_atomic_fetch_and_add_acquire_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_acquire_int:
- lwarx 5,0,3
- add 6,4,5
- extsw 7,6
- stwcx. 7,0,3
- bne- $-16
- isync
- extsw 3,5
- blr
-LT..q_atomic_fetch_and_add_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_acquire_int-.q_atomic_fetch_and_add_acquire_int
- .short 34
- .byte "q_atomic_fetch_and_add_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_release_int
- .globl .q_atomic_fetch_and_add_release_int
- .csect q_atomic_fetch_and_add_release_int[DS],3
-q_atomic_fetch_and_add_release_int:
- .llong .q_atomic_fetch_and_add_release_int,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_release_int:
- eieio
- lwarx 5,0,3
- add 6,4,5
- extsw 7,6
- stwcx. 7,0,3
- bne- $-16
- extsw 3,5
- blr
-LT..q_atomic_fetch_and_add_release_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_release_int-.q_atomic_fetch_and_add_release_int
- .short 34
- .byte "q_atomic_fetch_and_add_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_ptr
- .globl .q_atomic_fetch_and_add_ptr
- .csect q_atomic_fetch_and_add_ptr[DS],3
-q_atomic_fetch_and_add_ptr:
- .llong .q_atomic_fetch_and_add_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_ptr:
- ldarx 5,0,3
- add 6,4,5
- stdcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_ptr-.q_atomic_fetch_and_add_ptr
- .short 26
- .byte "q_atomic_fetch_and_add_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_acquire_ptr
- .globl .q_atomic_fetch_and_add_acquire_ptr
- .csect q_atomic_fetch_and_add_acquire_ptr[DS],3
-q_atomic_fetch_and_add_acquire_ptr:
- .llong .q_atomic_fetch_and_add_acquire_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_acquire_ptr:
- ldarx 5,0,3
- add 6,4,5
- stdcx. 6,0,3
- bne- $-12
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_acquire_ptr-.q_atomic_fetch_and_add_acquire_ptr
- .short 34
- .byte "q_atomic_fetch_and_add_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_release_ptr
- .globl .q_atomic_fetch_and_add_release_ptr
- .csect q_atomic_fetch_and_add_release_ptr[DS],3
-q_atomic_fetch_and_add_release_ptr:
- .llong .q_atomic_fetch_and_add_release_ptr,TOC[tc0],0
- .csect .text[PR]
-.q_atomic_fetch_and_add_release_ptr:
- eieio
- ldarx 5,0,3
- add 6,4,5
- stdcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_release_ptr-.q_atomic_fetch_and_add_release_ptr
- .short 34
- .byte "q_atomic_fetch_and_add_release_ptr"
- .align 2
-
-_section_.text:
- .csect .data[RW],3
- .llong _section_.text
diff --git a/src/corelib/arch/qatomic_alpha.h b/src/corelib/arch/qatomic_alpha.h
index 432fb62c0a..0ac2d8da9c 100644
--- a/src/corelib/arch/qatomic_alpha.h
+++ b/src/corelib/arch/qatomic_alpha.h
@@ -42,6 +42,8 @@
#ifndef QATOMIC_ALPHA_H
#define QATOMIC_ALPHA_H
+#include <QtCore/qoldbasicatomic.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -476,130 +478,8 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo
return reinterpret_cast<T *>(old);
}
-#else // !Q_CC_GNU
-
-extern "C" {
- Q_CORE_EXPORT int q_atomic_test_and_set_int(volatile int *ptr, int expected, int newval);
- Q_CORE_EXPORT int q_atomic_test_and_set_acquire_int(volatile int *ptr, int expected, int newval);
- Q_CORE_EXPORT int q_atomic_test_and_set_release_int(volatile int *ptr, int expected, int newval);
- Q_CORE_EXPORT int q_atomic_test_and_set_ptr(volatile void *ptr, void *expected, void *newval);
- Q_CORE_EXPORT int q_atomic_increment(volatile int *ptr);
- Q_CORE_EXPORT int q_atomic_decrement(volatile int *ptr);
- Q_CORE_EXPORT int q_atomic_set_int(volatile int *ptr, int newval);
- Q_CORE_EXPORT void *q_atomic_set_ptr(volatile void *ptr, void *newval);
- Q_CORE_EXPORT int q_atomic_fetch_and_add_int(volatile int *ptr, int value);
- Q_CORE_EXPORT int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int value);
- Q_CORE_EXPORT int q_atomic_fetch_and_add_release_int(volatile int *ptr, int value);
-} // extern "C"
-
-inline bool QBasicAtomicInt::ref()
-{
- return q_atomic_increment(&_q_value) != 0;
-}
-
-inline bool QBasicAtomicInt::deref()
-{
- return q_atomic_decrement(&_q_value) != 0;
-}
-
-inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
-{
- return q_atomic_test_and_set_int(&_q_value, expectedValue, newValue) != 0;
-}
-
-inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
-{
- return q_atomic_test_and_set_acquire_int(&_q_value, expectedValue, newValue) != 0;
-}
-
-inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
-{
- return q_atomic_test_and_set_release_int(&_q_value, expectedValue, newValue) != 0;
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
-{
- return q_atomic_set_int(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
-{
- return q_atomic_fetch_and_store_acquire_int(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
-{
- return q_atomic_fetch_and_store_release_int(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
-{
- return q_atomic_fetch_and_add_int(&_q_value, valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
-{
- return q_atomic_fetch_and_add_acquire_int(&_q_value, valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
-{
- return q_atomic_fetch_and_add_release_int(&_q_value, valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
-{
- return q_atomic_test_and_set_ptr(&_q_value, expectedValue, newValue) != 0;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
-{
- return q_atomic_test_and_set_acquire_ptr(&_q_value, expectedValue, newValue) != 0;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
-{
- return q_atomic_test_and_set_release_ptr(&_q_value, expectedValue, newValue) != 0;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
-{
- return reinterpret_cast<T *>(q_atomic_set_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_store_acquire_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_store_release_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_add_ptr(&_q_value, newValue));
-}
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_add_acquire_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_add_release_ptr(&_q_value, newValue));
-}
-
+#else
+# error "This compiler for Alpha is not supported"
#endif // Q_CC_GNU
inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h
index 95ad73b713..b3136fe575 100644
--- a/src/corelib/arch/qatomic_armv5.h
+++ b/src/corelib/arch/qatomic_armv5.h
@@ -50,6 +50,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_armv6.h b/src/corelib/arch/qatomic_armv6.h
index 7095d13d9b..41f145ad0d 100644
--- a/src/corelib/arch/qatomic_armv6.h
+++ b/src/corelib/arch/qatomic_armv6.h
@@ -50,6 +50,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_armv7.h b/src/corelib/arch/qatomic_armv7.h
index 5b36708ad6..43ea8ca973 100644
--- a/src/corelib/arch/qatomic_armv7.h
+++ b/src/corelib/arch/qatomic_armv7.h
@@ -52,4 +52,13 @@
// ... but the implementation is otherwise identical to that for ARMv6
#include "QtCore/qatomic_armv6.h"
+#if 0
+// silence syncqt warnings
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif
+
#endif // QATOMIC_ARMV7_H
diff --git a/src/corelib/arch/qatomic_bfin.h b/src/corelib/arch/qatomic_bfin.h
index 530ac8d50f..28a5cd60c9 100644
--- a/src/corelib/arch/qatomic_bfin.h
+++ b/src/corelib/arch/qatomic_bfin.h
@@ -42,6 +42,8 @@
#ifndef QATOMIC_BFIN_H
#define QATOMIC_BFIN_H
+#include <QtCore/qoldbasicatomic.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/arch/qatomic_bootstrap.h b/src/corelib/arch/qatomic_bootstrap.h
index 10cdc888f6..75f328b7c7 100644
--- a/src/corelib/arch/qatomic_bootstrap.h
+++ b/src/corelib/arch/qatomic_bootstrap.h
@@ -50,6 +50,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_cxx11.h b/src/corelib/arch/qatomic_cxx11.h
index c2df59fd54..27e0acda64 100644
--- a/src/corelib/arch/qatomic_cxx11.h
+++ b/src/corelib/arch/qatomic_cxx11.h
@@ -49,6 +49,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_gcc.h b/src/corelib/arch/qatomic_gcc.h
index b5244429e6..225a7809eb 100644
--- a/src/corelib/arch/qatomic_gcc.h
+++ b/src/corelib/arch/qatomic_gcc.h
@@ -48,6 +48,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_generic.h b/src/corelib/arch/qatomic_generic.h
deleted file mode 100644
index 621a767dd6..0000000000
--- a/src/corelib/arch/qatomic_generic.h
+++ /dev/null
@@ -1,282 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QATOMIC_GENERIC_H
-#define QATOMIC_GENERIC_H
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isReferenceCountingNative()
-{ return false; }
-inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isTestAndSetNative()
-{ return false; }
-inline bool QBasicAtomicInt::isTestAndSetWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isFetchAndStoreNative()
-{ return false; }
-inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isFetchAndAddNative()
-{ return false; }
-inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
-{ return false; }
-
-Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetOrdered(volatile int *, int, int);
-Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *, int);
-Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddOrdered(volatile int *, int);
-
-Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *, void *, void *);
-Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *, void *);
-Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *, qptrdiff);
-
-// Reference counting
-
-inline bool QBasicAtomicInt::ref()
-{
- return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, 1) != -1;
-}
-
-inline bool QBasicAtomicInt::deref()
-{
- return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, -1) != 1;
-}
-
-// Test and set for integers
-
-inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
-{
- return QBasicAtomicInt_testAndSetOrdered(&_q_value, expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-// Fetch and store for integers
-
-inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
-{
- return QBasicAtomicInt_fetchAndStoreOrdered(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-// Fetch and add for integers
-
-inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
-{
- return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-// Test and set for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
-{
- union { T * volatile * typed; void * volatile * voidp; } pointer;
- pointer.typed = &_q_value;
- return QBasicAtomicPointer_testAndSetOrdered(pointer.voidp, expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-// Fetch and store for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
-{
- union { T * volatile * typed; void * volatile * voidp; } pointer;
- union { T *typed; void *voidp; } returnValue;
- pointer.typed = &_q_value;
- returnValue.voidp = QBasicAtomicPointer_fetchAndStoreOrdered(pointer.voidp, newValue);
- return returnValue.typed;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-// Fetch and add for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
-{
- union { T * volatile *typed; void * volatile *voidp; } pointer;
- union { T *typed; void *voidp; } returnValue;
- pointer.typed = &_q_value;
- returnValue.voidp = QBasicAtomicPointer_fetchAndAddOrdered(pointer.voidp, valueToAdd * sizeof(T));
- return returnValue.typed;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QATOMIC_GENERIC_H
diff --git a/src/corelib/arch/qatomic_i386.h b/src/corelib/arch/qatomic_i386.h
index 6fec561177..4d9d810318 100644
--- a/src/corelib/arch/qatomic_i386.h
+++ b/src/corelib/arch/qatomic_i386.h
@@ -49,6 +49,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_ia64.h b/src/corelib/arch/qatomic_ia64.h
index b5cd9f7545..d82ad12223 100644
--- a/src/corelib/arch/qatomic_ia64.h
+++ b/src/corelib/arch/qatomic_ia64.h
@@ -50,6 +50,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_integrity.h b/src/corelib/arch/qatomic_integrity.h
index e5d226ad7f..f290984611 100644
--- a/src/corelib/arch/qatomic_integrity.h
+++ b/src/corelib/arch/qatomic_integrity.h
@@ -42,6 +42,7 @@
#ifndef QATOMIC_INTEGRITY_H
#define QATOMIC_INTEGRITY_H
+#include <QtCore/qoldbasicatomic.h>
#include <INTEGRITY.h>
QT_BEGIN_HEADER
diff --git a/src/corelib/arch/qatomic_mips.h b/src/corelib/arch/qatomic_mips.h
index 04015c9d19..39119ba411 100644
--- a/src/corelib/arch/qatomic_mips.h
+++ b/src/corelib/arch/qatomic_mips.h
@@ -50,6 +50,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
@@ -223,7 +227,7 @@ T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy
return originalValue;
}
-#if defined(_MIPS_ARCH_MIPS64) || defined(__mips64)
+#if defined(Q_PROCESSOR_MIPS_64)
#define Q_ATOMIC_INT64_IS_SUPPORTED
#define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
diff --git a/src/corelib/arch/qatomic_msvc.h b/src/corelib/arch/qatomic_msvc.h
index eeb37dba89..c5d7848734 100644
--- a/src/corelib/arch/qatomic_msvc.h
+++ b/src/corelib/arch/qatomic_msvc.h
@@ -48,6 +48,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/qatomic_parisc.h b/src/corelib/arch/qatomic_parisc.h
deleted file mode 100644
index 221d0e36ff..0000000000
--- a/src/corelib/arch/qatomic_parisc.h
+++ /dev/null
@@ -1,305 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QATOMIC_PARISC_H
-#define QATOMIC_PARISC_H
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isReferenceCountingNative()
-{ return false; }
-inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isTestAndSetNative()
-{ return false; }
-inline bool QBasicAtomicInt::isTestAndSetWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isFetchAndStoreNative()
-{ return false; }
-inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isFetchAndAddNative()
-{ return false; }
-inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
-{ return false; }
-
-extern "C" {
- Q_CORE_EXPORT void q_atomic_lock(int *lock);
- Q_CORE_EXPORT void q_atomic_unlock(int *lock);
-}
-
-// Reference counting
-
-inline bool QBasicAtomicInt::ref()
-{
- q_atomic_lock(_q_lock);
- bool ret = (++_q_value != 0);
- q_atomic_unlock(_q_lock);
- return ret;
-}
-
-inline bool QBasicAtomicInt::deref()
-{
- q_atomic_lock(_q_lock);
- bool ret = (--_q_value != 0);
- q_atomic_unlock(_q_lock);
- return ret;
-}
-
-// Test-and-set for integers
-
-inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
-{
- q_atomic_lock(_q_lock);
- if (_q_value == expectedValue) {
- _q_value = newValue;
- q_atomic_unlock(_q_lock);
- return true;
- }
- q_atomic_unlock(_q_lock);
- return false;
-}
-
-inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-// Fetch-and-store for integers
-
-inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
-{
- q_atomic_lock(_q_lock);
- int returnValue = _q_value;
- _q_value = newValue;
- q_atomic_unlock(_q_lock);
- return returnValue;
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-// Fetch-and-add for integers
-
-inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
-{
- q_atomic_lock(_q_lock);
- int originalValue = _q_value;
- _q_value += valueToAdd;
- q_atomic_unlock(_q_lock);
- return originalValue;
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-// Test and set for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
-{
- q_atomic_lock(_q_lock);
- if (_q_value == expectedValue) {
- _q_value = newValue;
- q_atomic_unlock(_q_lock);
- return true;
- }
- q_atomic_unlock(_q_lock);
- return false;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-// Fetch and store for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
-{
- q_atomic_lock(_q_lock);
- T *returnValue = (_q_value);
- _q_value = newValue;
- q_atomic_unlock(_q_lock);
- return returnValue;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-// Fetch and add for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
-{
- q_atomic_lock(_q_lock);
- T *returnValue = (_q_value);
- _q_value += valueToAdd;
- q_atomic_unlock(_q_lock);
- return returnValue;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QATOMIC_PARISC_H
diff --git a/src/corelib/arch/qatomic_powerpc.h b/src/corelib/arch/qatomic_power.h
index 949102748a..a531dfedc8 100644
--- a/src/corelib/arch/qatomic_powerpc.h
+++ b/src/corelib/arch/qatomic_power.h
@@ -39,8 +39,10 @@
**
****************************************************************************/
-#ifndef QATOMIC_POWERPC_H
-#define QATOMIC_POWERPC_H
+#ifndef QATOMIC_POWER_H
+#define QATOMIC_POWER_H
+
+#include <QtCore/qoldbasicatomic.h>
QT_BEGIN_HEADER
@@ -103,13 +105,11 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
#if defined(Q_CC_GNU)
-#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) \
- || (!defined(__64BIT__) && !defined(__powerpc64__) && !defined(__ppc64__))
+#ifdef Q_PROCESSOR_POWER_32
# define _Q_VALUE "0, %[_q_value]"
# define _Q_VALUE_MEMORY_OPERAND "+m" (_q_value)
# define _Q_VALUE_REGISTER_OPERAND [_q_value] "r" (&_q_value),
-#else
-// On 64-bit with gcc >= 4.2
+#else // Q_PROCESSOR_POWER_64
# define _Q_VALUE "%y[_q_value]"
# define _Q_VALUE_MEMORY_OPERAND [_q_value] "+Z" (_q_value)
# define _Q_VALUE_REGISTER_OPERAND
@@ -299,7 +299,7 @@ inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
return originalValue;
}
-#if defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__)
+#ifdef Q_PROCESSOR_POWER_64
# define LPARX "ldarx"
# define STPCX "stdcx."
#else
@@ -473,139 +473,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo
#undef _Q_VALUE_REGISTER_OPERAND
#else
-
-extern "C" {
- int q_atomic_test_and_set_int(volatile int *ptr, int expectedValue, int newValue);
- int q_atomic_test_and_set_acquire_int(volatile int *ptr, int expectedValue, int newValue);
- int q_atomic_test_and_set_release_int(volatile int *ptr, int expectedValue, int newValue);
- int q_atomic_test_and_set_ptr(volatile void *ptr, void *expectedValue, void *newValue);
- int q_atomic_test_and_set_acquire_ptr(volatile void *ptr, void *expectedValue, void *newValue);
- int q_atomic_test_and_set_release_ptr(volatile void *ptr, void *expectedValue, void *newValue);
- int q_atomic_increment(volatile int *);
- int q_atomic_decrement(volatile int *);
- int q_atomic_set_int(volatile int *, int);
- int q_atomic_fetch_and_store_acquire_int(volatile int *ptr, int newValue);
- int q_atomic_fetch_and_store_release_int(volatile int *ptr, int newValue);
- void *q_atomic_set_ptr(volatile void *, void *);
- int q_atomic_fetch_and_store_acquire_ptr(volatile void *ptr, void *newValue);
- int q_atomic_fetch_and_store_release_ptr(volatile void *ptr, void *newValue);
- int q_atomic_fetch_and_add_int(volatile int *ptr, int valueToAdd);
- int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int valueToAdd);
- int q_atomic_fetch_and_add_release_int(volatile int *ptr, int valueToAdd);
- void *q_atomic_fetch_and_add_ptr(volatile void *ptr, qptrdiff valueToAdd);
- void *q_atomic_fetch_and_add_acquire_ptr(volatile void *ptr, qptrdiff valueToAdd);
- void *q_atomic_fetch_and_add_release_ptr(volatile void *ptr, qptrdiff valueToAdd);
-} // extern "C"
-
-
-inline bool QBasicAtomicInt::ref()
-{
- return q_atomic_increment(&_q_value) != 0;
-}
-
-inline bool QBasicAtomicInt::deref()
-{
- return q_atomic_decrement(&_q_value) != 0;
-}
-
-inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
-{
- return q_atomic_test_and_set_int(&_q_value, expectedValue, newValue) != 0;
-}
-
-inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
-{
- return q_atomic_test_and_set_acquire_int(&_q_value, expectedValue, newValue) != 0;
-}
-
-inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
-{
- return q_atomic_test_and_set_release_int(&_q_value, expectedValue, newValue) != 0;
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
-{
- return q_atomic_set_int(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
-{
- return q_atomic_fetch_and_store_acquire_int(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
-{
- return q_atomic_fetch_and_store_release_int(&_q_value, newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
-{
- return q_atomic_fetch_and_add_int(&_q_value, valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
-{
- return q_atomic_fetch_and_add_acquire_int(&_q_value, valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
-{
- return q_atomic_fetch_and_add_release_int(&_q_value, valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
-{
- return q_atomic_test_and_set_ptr(&_q_value, expectedValue, newValue) != 0;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
-{
- return q_atomic_test_and_set_acquire_ptr(&_q_value, expectedValue, newValue) != 0;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
-{
- return q_atomic_test_and_set_release_ptr(&_q_value, expectedValue, newValue) != 0;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
-{
- return reinterpret_cast<T *>(q_atomic_set_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_store_acquire_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_store_release_ptr(&_q_value, newValue));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_add_ptr(&_q_value, valueToAdd * sizeof(T)));
-}
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_add_acquire_ptr(&_q_value, valueToAdd * sizeof(T)));
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
-{
- return reinterpret_cast<T *>(q_atomic_fetch_and_add_release_ptr(&_q_value, valueToAdd * sizeof(T)));
-}
-
+# error "This compiler for Power/PowerPC is not supported"
#endif
inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
@@ -645,4 +513,4 @@ QT_END_NAMESPACE
QT_END_HEADER
-#endif // QATOMIC_POWERPC_H
+#endif // QATOMIC_POWER_H
diff --git a/src/corelib/arch/qatomic_s390.h b/src/corelib/arch/qatomic_s390.h
index b6246e817f..ef7ab346e3 100644
--- a/src/corelib/arch/qatomic_s390.h
+++ b/src/corelib/arch/qatomic_s390.h
@@ -42,6 +42,8 @@
#ifndef QATOMIC_S390_H
#define QATOMIC_S390_H
+#include <QtCore/qoldbasicatomic.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/arch/qatomic_sh.h b/src/corelib/arch/qatomic_sh.h
deleted file mode 100644
index d16aaf26b1..0000000000
--- a/src/corelib/arch/qatomic_sh.h
+++ /dev/null
@@ -1,330 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QATOMIC_SH_H
-#define QATOMIC_SH_H
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isReferenceCountingNative()
-{ return false; }
-inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isTestAndSetNative()
-{ return false; }
-inline bool QBasicAtomicInt::isTestAndSetWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isFetchAndStoreNative()
-{ return false; }
-inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
-
-inline bool QBasicAtomicInt::isFetchAndAddNative()
-{ return false; }
-inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
-{ return false; }
-
-#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
-{ return false; }
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
-{ return false; }
-
-extern Q_CORE_EXPORT volatile char qt_atomic_lock;
-Q_CORE_EXPORT void qt_atomic_yield(int *count);
-
-inline int qt_atomic_tasb(volatile char *ptr)
-{
- register int ret;
- asm volatile("tas.b @%2\n"
- "movt %0"
- : "=&r"(ret), "=m"(*ptr)
- : "r"(ptr)
- : "cc", "memory");
- return ret;
-}
-
-// Reference counting
-
-inline bool QBasicAtomicInt::ref()
-{
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- int originalValue = _q_value++;
- qt_atomic_lock = 0;
- return originalValue != -1;
-}
-
-inline bool QBasicAtomicInt::deref()
-{
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- int originalValue = _q_value--;
- qt_atomic_lock = 0;
- return originalValue != 1;
-}
-
-// Test and set for integers
-
-inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
-{
- bool returnValue = false;
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- if (_q_value == expectedValue) {
- _q_value = newValue;
- returnValue = true;
- }
- qt_atomic_lock = 0;
- return returnValue;
-}
-
-inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-// Fetch and store for integers
-
-inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
-{
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- int originalValue = _q_value;
- _q_value = newValue;
- qt_atomic_lock = 0;
- return originalValue;
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-// Fetch and add for integers
-
-inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
-{
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- int originalValue = _q_value;
- _q_value += valueToAdd;
- qt_atomic_lock = 0;
- return originalValue;
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-// Test and set for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
-{
- bool returnValue = false;
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- if (_q_value == expectedValue) {
- _q_value = newValue;
- returnValue = true;
- }
- qt_atomic_lock = 0;
- return returnValue;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
-{
- return testAndSetOrdered(expectedValue, newValue);
-}
-
-// Fetch and store for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
-{
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- T *originalValue = _q_value;
- _q_value = newValue;
- qt_atomic_lock = 0;
- return originalValue;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
-{
- return fetchAndStoreOrdered(newValue);
-}
-
-// Fetch and add for pointers
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
-{
- int count = 0;
- while (qt_atomic_tasb(&qt_atomic_lock) == 0)
- qt_atomic_yield(&count);
- T *originalValue = (_q_value);
- _q_value += valueToAdd;
- qt_atomic_lock = 0;
- return originalValue;
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
-{
- return fetchAndAddOrdered(valueToAdd);
-}
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QATOMIC_SH_H
diff --git a/src/corelib/arch/qatomic_sh4a.h b/src/corelib/arch/qatomic_sh4a.h
index 042a602c77..d00b9adc1d 100644
--- a/src/corelib/arch/qatomic_sh4a.h
+++ b/src/corelib/arch/qatomic_sh4a.h
@@ -42,6 +42,8 @@
#ifndef QATOMIC_SH4A_H
#define QATOMIC_SH4A_H
+#include <QtCore/qoldbasicatomic.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/arch/qatomic_sparc.h b/src/corelib/arch/qatomic_sparc.h
index 5fc640e01b..63282290c1 100644
--- a/src/corelib/arch/qatomic_sparc.h
+++ b/src/corelib/arch/qatomic_sparc.h
@@ -42,6 +42,8 @@
#ifndef QATOMIC_SPARC_H
#define QATOMIC_SPARC_H
+#include <QtCore/qoldbasicatomic.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/arch/parisc/qatomic_parisc.cpp b/src/corelib/arch/qatomic_unix.cpp
index 5e59669b22..a709be3fa1 100644
--- a/src/corelib/arch/parisc/qatomic_parisc.cpp
+++ b/src/corelib/arch/qatomic_unix.cpp
@@ -39,50 +39,44 @@
**
****************************************************************************/
-#include <QtCore/qglobal.h>
-#include <QtCore/qhash.h>
+#include "qplatformdefs.h"
-QT_BEGIN_NAMESPACE
-
-QT_USE_NAMESPACE
+#include <QtCore/qatomic.h>
-#define UNLOCKED {-1,-1,-1,-1}
-#define UNLOCKED2 UNLOCKED,UNLOCKED
-#define UNLOCKED4 UNLOCKED2,UNLOCKED2
-#define UNLOCKED8 UNLOCKED4,UNLOCKED4
-#define UNLOCKED16 UNLOCKED8,UNLOCKED8
-#define UNLOCKED32 UNLOCKED16,UNLOCKED16
-#define UNLOCKED64 UNLOCKED32,UNLOCKED32
-#define UNLOCKED128 UNLOCKED64,UNLOCKED64
-#define UNLOCKED256 UNLOCKED128,UNLOCKED128
+// If operating system, processor, and compiler detection fails, we fall back
+// to this generic, out-of-line implementation
-// use a 4k page for locks
-static int locks[256][4] = { UNLOCKED256 };
+#if defined(QATOMIC_UNIX_H)
-int *getLock(volatile void *addr)
-{ return locks[qHash(const_cast<void *>(addr)) % 256]; }
+QT_BEGIN_NAMESPACE
+static pthread_mutex_t qAtomicMutex = PTHREAD_MUTEX_INITIALIZER;
-static int *align16(int *lock)
+Q_CORE_EXPORT
+bool QAtomicOps<int>::testAndSetRelaxed(int &_q_value, int expectedValue, int newValue)
{
- ulong off = (((ulong) lock) % 16);
- return off ? (int *)(ulong(lock) + 16 - off) : lock;
+ bool returnValue = false;
+ pthread_mutex_lock(&qAtomicMutex);
+ if (_q_value == expectedValue) {
+ _q_value = newValue;
+ returnValue = true;
+ }
+ pthread_mutex_unlock(&qAtomicMutex);
+ return returnValue;
}
-extern "C" {
-
- int q_ldcw(volatile int *addr);
-
- void q_atomic_lock(int *lock)
- {
- // ldcw requires a 16-byte aligned address
- volatile int *x = align16(lock);
- while (q_ldcw(x) == 0)
- ;
+Q_CORE_EXPORT
+bool QAtomicOps<void *>::testAndSetRelaxed(void *&_q_value, void *expectedValue, void *newValue)
+{
+ bool returnValue = false;
+ pthread_mutex_lock(&qAtomicMutex);
+ if (_q_value == expectedValue) {
+ _q_value = newValue;
+ returnValue = true;
}
-
- void q_atomic_unlock(int *lock)
- { lock[0] = lock[1] = lock[2] = lock[3] = -1; }
+ pthread_mutex_unlock(&qAtomicMutex);
+ return returnValue;
}
-
QT_END_NAMESPACE
+
+#endif // QATOMIC_UNIX_H
diff --git a/src/corelib/arch/qatomic_unix.h b/src/corelib/arch/qatomic_unix.h
new file mode 100644
index 0000000000..3dc168c0ae
--- /dev/null
+++ b/src/corelib/arch/qatomic_unix.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QATOMIC_UNIX_H
+#define QATOMIC_UNIX_H
+
+#include <QtCore/qgenericatomic.h>
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#pragma qt_sync_stop_processing
+#endif
+
+#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
+#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
+#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
+#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
+
+#define Q_ATOMIC_INT32_IS_SUPPORTED
+
+#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
+#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
+#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
+
+template<> struct QAtomicIntegerTraits<int> { enum { IsInteger = 1 }; };
+
+// No definition, needs specialization
+template <typename T> struct QAtomicOps;
+
+template <>
+struct QAtomicOps<int> : QGenericAtomicOps<QAtomicOps<int> >
+{
+ typedef int Type;
+
+ static inline bool isTestAndSetNative() { return false; }
+ static inline bool isTestAndSetWaitFree() { return false; }
+ Q_CORE_EXPORT static bool testAndSetRelaxed(int &_q_value, int expectedValue, int newValue);
+};
+
+template <>
+struct QAtomicOps<void *> : QGenericAtomicOps<QAtomicOps<void *> >
+{
+ typedef void *Type;
+
+ static inline bool isTestAndSetNative() { return false; }
+ static inline bool isTestAndSetWaitFree() { return false; }
+ Q_CORE_EXPORT static bool testAndSetRelaxed(void *&_q_value, void *expectedValue, void *newValue);
+};
+
+template <typename T>
+struct QAtomicOps<T *> : QGenericAtomicOps<QAtomicOps<T *> >
+{
+ typedef T *Type;
+
+ // helper to strip cv qualifiers
+ static inline void *nocv(const T *p) { return const_cast<void *>(static_cast<const volatile void *>(p)); }
+
+ static inline bool isTestAndSetNative() { return false; }
+ static inline bool isTestAndSetWaitFree() { return false; }
+ static inline bool testAndSetRelaxed(T *&_q_value, T *expectedValue, T *newValue)
+ {
+ // forward to the void* specialization
+ void *voidp = nocv(_q_value);
+ bool returnValue = QAtomicOps<void *>::testAndSetRelaxed(voidp, nocv(expectedValue), nocv(newValue));
+ _q_value = reinterpret_cast<T *>(voidp);
+ return returnValue;
+ }
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif // QATOMIC_UNIX_H
diff --git a/src/corelib/arch/qatomic_vxworks.h b/src/corelib/arch/qatomic_vxworks.h
index c18563ef3c..564a07f3ea 100644
--- a/src/corelib/arch/qatomic_vxworks.h
+++ b/src/corelib/arch/qatomic_vxworks.h
@@ -45,9 +45,11 @@
QT_BEGIN_HEADER
#if defined(__ppc)
-# include <QtCore/qatomic_powerpc.h>
+# include <QtCore/qatomic_power.h>
#else // generic implementation with taskLock()
+#include <QtCore/qoldbasicatomic.h>
+
#if 0
// we don't want to include the system header here for two function prototypes,
// because it pulls in a _lot_ of stuff that pollutes the global namespace
diff --git a/src/corelib/arch/qatomic_x86_64.h b/src/corelib/arch/qatomic_x86_64.h
index f2fa8ce5f4..33427ebf33 100644
--- a/src/corelib/arch/qatomic_x86_64.h
+++ b/src/corelib/arch/qatomic_x86_64.h
@@ -50,6 +50,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/arch/sh/arch.pri b/src/corelib/arch/sh/arch.pri
deleted file mode 100644
index 67fbb16c10..0000000000
--- a/src/corelib/arch/sh/arch.pri
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# SH (Renesas SuperH) architecture
-#
-SOURCES += $$QT_ARCH_CPP/qatomic_sh.cpp
diff --git a/src/corelib/arch/sparc/arch.pri b/src/corelib/arch/sparc/arch.pri
index 9bb3a888e8..b3ca399640 100644
--- a/src/corelib/arch/sparc/arch.pri
+++ b/src/corelib/arch/sparc/arch.pri
@@ -2,9 +2,9 @@
# SPARC architecture
#
*-64* {
- SOURCES += $$QT_ARCH_CPP/qatomic64.s
+ SOURCES += $$PWD/qatomic64.s
}
else {
- SOURCES += $$QT_ARCH_CPP/qatomic32.s \
- $$QT_ARCH_CPP/qatomic_sparc.cpp
+ SOURCES += $$PWD/qatomic32.s \
+ $$PWD/qatomic_sparc.cpp
}
diff --git a/src/corelib/arch/vxworks/arch.pri b/src/corelib/arch/vxworks/arch.pri
deleted file mode 100644
index a7686186b0..0000000000
--- a/src/corelib/arch/vxworks/arch.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# VxWorks generic
-#
-*-ppc-* {
- SOURCES += qatomic_ppc.s
-}
diff --git a/src/corelib/arch/vxworks/qatomic_ppc.s b/src/corelib/arch/vxworks/qatomic_ppc.s
deleted file mode 100644
index 03971e89e8..0000000000
--- a/src/corelib/arch/vxworks/qatomic_ppc.s
+++ /dev/null
@@ -1,415 +0,0 @@
-
- .align 2
- .globl q_atomic_test_and_set_int
- .globl .q_atomic_test_and_set_int
-q_atomic_test_and_set_int:
-.q_atomic_test_and_set_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_int-.q_atomic_test_and_set_int
- .short 25
- .byte "q_atomic_test_and_set_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_acquire_int
- .globl .q_atomic_test_and_set_acquire_int
-q_atomic_test_and_set_acquire_int:
-.q_atomic_test_and_set_acquire_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+16
- stwcx. 5,0,3
- bne- $-16
- isync
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_acquire_int-.q_atomic_test_and_set_acquire_int
- .short 33
- .byte "q_atomic_test_and_set_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_release_int
- .globl .q_atomic_test_and_set_release_int
-q_atomic_test_and_set_release_int:
-.q_atomic_test_and_set_release_int:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_release_int:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_release_int-.q_atomic_test_and_set_release_int
- .short 33
- .byte "q_atomic_test_and_set_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_ptr
- .globl .q_atomic_test_and_set_ptr
-q_atomic_test_and_set_ptr:
-.q_atomic_test_and_set_ptr:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_ptr-.q_atomic_test_and_set_ptr
- .short 25
- .byte "q_atomic_test_and_set_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_acquire_ptr
- .globl .q_atomic_test_and_set_acquire_ptr
-q_atomic_test_and_set_acquire_ptr:
-.q_atomic_test_and_set_acquire_ptr:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+16
- stwcx. 5,0,3
- bne- $-16
- isync
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_acquire_ptr-.q_atomic_test_and_set_acquire_ptr
- .short 25
- .byte "q_atomic_test_and_set_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_test_and_set_release_ptr
- .globl .q_atomic_test_and_set_release_ptr
-q_atomic_test_and_set_release_ptr:
-.q_atomic_test_and_set_release_ptr:
- lwarx 6,0,3
- xor. 6,6,4
- bne $+12
- stwcx. 5,0,3
- bne- $-16
- subfic 3,6,0
- adde 3,3,6
- blr
-LT..q_atomic_test_and_set_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,3,0
- .long 0
- .long LT..q_atomic_test_and_set_release_ptr-.q_atomic_test_and_set_release_ptr
- .short 33
- .byte "q_atomic_test_and_set_release_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_increment
- .globl .q_atomic_increment
-q_atomic_increment:
-.q_atomic_increment:
- lwarx 4,0,3
- addi 4,4,1
- stwcx. 4,0,3
- bne- $-12
- mr 3,4
- blr
-LT..q_atomic_increment:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_increment-.q_atomic_increment
- .short 18
- .byte "q_atomic_increment"
- .align 2
-
- .align 2
- .globl q_atomic_decrement
- .globl .q_atomic_decrement
-q_atomic_decrement:
-.q_atomic_decrement:
- lwarx 4,0,3
- subi 4,4,1
- stwcx. 4,0,3
- bne- $-12
- mr 3,4
- blr
-LT..q_atomic_decrement:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_decrement-.q_atomic_decrement
- .short 18
- .byte "q_atomic_decrement"
- .align 2
-
- .align 2
- .globl q_atomic_set_int
- .globl .q_atomic_set_int
-q_atomic_set_int:
-.q_atomic_set_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_set_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_set_int-.q_atomic_set_int
- .short 16
- .byte "q_atomic_set_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_acquire_int
- .globl .q_atomic_fetch_and_store_acquire_int
-q_atomic_fetch_and_store_acquire_int:
-.q_atomic_fetch_and_store_acquire_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_acquire_int-.q_atomic_fetch_and_store_acquire_int
- .short 16
- .byte "q_atomic_fetch_and_store_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_release_int
- .globl .q_atomic_fetch_and_store_release_int
-q_atomic_fetch_and_store_release_int:
-.q_atomic_fetch_and_store_release_int:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_release_int:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_release_int-.q_atomic_fetch_and_store_release_int
- .short 16
- .byte "q_atomic_fetch_and_store_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_set_ptr
- .globl .q_atomic_set_ptr
-q_atomic_set_ptr:
-.q_atomic_set_ptr:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_set_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_set_ptr-.q_atomic_set_ptr
- .short 16
- .byte "q_atomic_set_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_acquire_ptr
- .globl .q_atomic_fetch_and_store_acquire_ptr
-q_atomic_fetch_and_store_acquire_ptr:
-.q_atomic_fetch_and_store_acquire_ptr:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_acquire_ptr-.q_atomic_fetch_and_store_acquire_ptr
- .short 16
- .byte "q_atomic_fetch_and_store_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_store_release_ptr
- .globl .q_atomic_fetch_and_store_release_ptr
-q_atomic_fetch_and_store_release_ptr:
-.q_atomic_fetch_and_store_release_ptr:
- lwarx 5,0,3
- stwcx. 4,0,3
- bne- $-8
- mr 3,5
- blr
-LT..q_atomic_fetch_and_store_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,2,0
- .long 0
- .long LT..q_atomic_fetch_and_store_release_ptr-.q_atomic_fetch_and_store_release_ptr
- .short 16
- .byte "q_atomic_fetch_and_store_release_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_int
- .globl .q_atomic_fetch_and_add_int
-q_atomic_fetch_and_add_int:
-.q_atomic_fetch_and_add_int:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_int-.q_atomic_fetch_and_add_int
- .short 18
- .byte "q_atomic_fetch_and_add_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_acquire_int
- .globl .q_atomic_fetch_and_add_acquire_int
-q_atomic_fetch_and_add_acquire_int:
-.q_atomic_fetch_and_add_acquire_int:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_acquire_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_acquire_int-.q_atomic_fetch_and_add_acquire_int
- .short 18
- .byte "q_atomic_fetch_and_add_acquire_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_release_int
- .globl .q_atomic_fetch_and_add_release_int
-q_atomic_fetch_and_add_release_int:
-.q_atomic_fetch_and_add_release_int:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_release_int:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_release_int-.q_atomic_fetch_and_add_release_int
- .short 34
- .byte "q_atomic_fetch_and_add_release_int"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_ptr
- .globl .q_atomic_fetch_and_add_ptr
-q_atomic_fetch_and_add_ptr:
-.q_atomic_fetch_and_add_ptr:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_ptr-.q_atomic_fetch_and_add_ptr
- .short 26
- .byte "q_atomic_fetch_and_add_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_acquire_ptr
- .globl .q_atomic_fetch_and_add_acquire_ptr
-q_atomic_fetch_and_add_acquire_ptr:
-.q_atomic_fetch_and_add_acquire_ptr:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- isync
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_acquire_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_acquire_ptr-.q_atomic_fetch_and_add_acquire_ptr
- .short 34
- .byte "q_atomic_fetch_and_add_acquire_ptr"
- .align 2
-
- .align 2
- .globl q_atomic_fetch_and_add_release_ptr
- .globl .q_atomic_fetch_and_add_release_ptr
-q_atomic_fetch_and_add_release_ptr:
-.q_atomic_fetch_and_add_release_ptr:
- lwarx 5,0,3
- add 6,4,5
- stwcx. 6,0,3
- bne- $-12
- mr 3,5
- blr
-LT..q_atomic_fetch_and_add_release_ptr:
- .long 0
- .byte 0,9,32,64,0,0,1,0
- .long 0
- .long LT..q_atomic_fetch_and_add_release_ptr-.q_atomic_fetch_and_add_release_ptr
- .short 34
- .byte "q_atomic_fetch_and_add_release_ptr"
- .align 2
-
-_section_.text:
- .long _section_.text
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index c8c9b9b8e6..40b42f4dbe 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -28,6 +28,7 @@ include(plugin/plugin.pri)
include(kernel/kernel.pri)
include(codecs/codecs.pri)
include(statemachine/statemachine.pri)
+include(mimetypes/mimetypes.pri)
include(xml/xml.pri)
mac|darwin {
diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri
index fca9969db0..ddba51950a 100644
--- a/src/corelib/global/global.pri
+++ b/src/corelib/global/global.pri
@@ -2,11 +2,15 @@
HEADERS += \
global/qglobal.h \
+ global/qsystemdetection.h \
+ global/qcompilerdetection.h \
+ global/qprocessordetection.h \
global/qnamespace.h \
global/qendian.h \
global/qnumeric_p.h \
global/qnumeric.h \
- global/qlogging.h
+ global/qlogging.h \
+ global/qtypeinfo.h
SOURCES += \
global/qglobal.cpp \
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
new file mode 100644
index 0000000000..5ab79092d2
--- /dev/null
+++ b/src/corelib/global/qcompilerdetection.h
@@ -0,0 +1,537 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOMPILERDETECTION_H
+#define QCOMPILERDETECTION_H
+
+/*
+ The compiler, must be one of: (Q_CC_x)
+
+ SYM - Digital Mars C/C++ (used to be Symantec C++)
+ MSVC - Microsoft Visual C/C++, Intel C++ for Windows
+ BOR - Borland/Turbo C++
+ WAT - Watcom C++
+ GNU - GNU C++
+ COMEAU - Comeau C++
+ EDG - Edison Design Group C++
+ OC - CenterLine C++
+ SUN - Forte Developer, or Sun Studio C++
+ MIPS - MIPSpro C++
+ DEC - DEC C++
+ HPACC - HP aC++
+ USLC - SCO OUDK and UDK
+ CDS - Reliant C++
+ KAI - KAI C++
+ INTEL - Intel C++ for Linux, Intel C++ for Windows
+ HIGHC - MetaWare High C/C++
+ PGI - Portland Group C++
+ GHS - Green Hills Optimizing C++ Compilers
+ RVCT - ARM Realview Compiler Suite
+ CLANG - C++ front-end for the LLVM compiler
+
+
+ Should be sorted most to least authoritative.
+*/
+
+/* Symantec C++ is now Digital Mars */
+#if defined(__DMC__) || defined(__SC__)
+# define Q_CC_SYM
+/* "explicit" semantics implemented in 8.1e but keyword recognized since 7.5 */
+# if defined(__SC__) && __SC__ < 0x750
+# define Q_NO_EXPLICIT_KEYWORD
+# endif
+# define Q_NO_USING_KEYWORD
+
+#elif defined(_MSC_VER)
+# define Q_CC_MSVC
+# define Q_CC_MSVC_NET
+# define Q_CANNOT_DELETE_CONSTANT
+# define Q_OUTOFLINE_TEMPLATE inline
+# define Q_NO_TEMPLATE_FRIENDS
+# define Q_ALIGNOF(type) __alignof(type)
+# define Q_DECL_ALIGN(n) __declspec(align(n))
+/* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
+# if defined(__INTEL_COMPILER)
+# define Q_CC_INTEL
+# endif
+/* MSVC does not support SSE/MMX on x64 */
+# if (defined(Q_CC_MSVC) && defined(_M_X64))
+# undef QT_HAVE_SSE
+# undef QT_HAVE_MMX
+# undef QT_HAVE_3DNOW
+# endif
+
+#if defined(Q_CC_MSVC) && _MSC_VER >= 1600
+# define Q_COMPILER_RVALUE_REFS
+# define Q_COMPILER_AUTO_TYPE
+# define Q_COMPILER_LAMBDA
+# define Q_COMPILER_DECLTYPE
+# define Q_COMPILER_STATIC_ASSERT
+// MSCV has std::initilizer_list, but do not support the braces initialization
+//# define Q_COMPILER_INITIALIZER_LISTS
+# endif
+
+
+#elif defined(__BORLANDC__) || defined(__TURBOC__)
+# define Q_CC_BOR
+# define Q_INLINE_TEMPLATE
+# if __BORLANDC__ < 0x502
+# define Q_NO_BOOL_TYPE
+# define Q_NO_EXPLICIT_KEYWORD
+# endif
+# define Q_NO_USING_KEYWORD
+
+#elif defined(__WATCOMC__)
+# define Q_CC_WAT
+
+/* ARM Realview Compiler Suite
+ RVCT compiler also defines __EDG__ and __GNUC__ (if --gnu flag is given),
+ so check for it before that */
+#elif defined(__ARMCC__) || defined(__CC_ARM)
+# define Q_CC_RVCT
+# if __TARGET_ARCH_ARM >= 6
+# define QT_HAVE_ARMV6
+# endif
+/* work-around for missing compiler intrinsics */
+# define __is_empty(X) false
+# define __is_pod(X) false
+#elif defined(__GNUC__)
+# define Q_CC_GNU
+# define Q_C_CALLBACKS
+# if defined(__MINGW32__)
+# define Q_CC_MINGW
+# endif
+# if defined(__INTEL_COMPILER)
+/* Intel C++ also masquerades as GCC 3.2.0 */
+# define Q_CC_INTEL
+# endif
+# if defined(__clang__)
+/* Clang also masquerades as GCC 4.2.1 */
+# define Q_CC_CLANG
+# endif
+# ifdef __APPLE__
+# define Q_NO_DEPRECATED_CONSTRUCTORS
+# endif
+# if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
+# define Q_FULL_TEMPLATE_INSTANTIATION
+# endif
+/* GCC 2.95 knows "using" but does not support it correctly */
+# if __GNUC__ == 2 && __GNUC_MINOR__ <= 95
+# define Q_NO_USING_KEYWORD
+# endif
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# define Q_ALIGNOF(type) __alignof__(type)
+# define Q_TYPEOF(expr) __typeof__(expr)
+# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
+# endif
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define Q_LIKELY(expr) __builtin_expect(!!(expr), true)
+# define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false)
+# endif
+/* GCC 3.1 and GCC 3.2 wrongly define _SB_CTYPE_MACROS on HP-UX */
+# if defined(Q_OS_HPUX) && __GNUC__ == 3 && __GNUC_MINOR__ >= 1
+# define Q_WRONG_SB_CTYPE_MACROS
+# endif
+/* GCC <= 3.3 cannot handle template friends */
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ <= 3)
+# define Q_NO_TEMPLATE_FRIENDS
+# endif
+/* Apple's GCC 3.1 chokes on our streaming qDebug() */
+# if defined(Q_OS_DARWIN) && __GNUC__ == 3 && (__GNUC_MINOR__ >= 1 && __GNUC_MINOR__ < 3)
+# define Q_BROKEN_DEBUG_STREAM
+# endif
+# if (defined(Q_CC_GNU) || defined(Q_CC_INTEL)) && !defined(QT_MOC_CPP)
+# define Q_PACKED __attribute__ ((__packed__))
+# define Q_NO_PACKED_REFERENCE
+# ifndef __ARM_EABI__
+# define QT_NO_ARM_EABI
+# endif
+# endif
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+# define Q_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
+# endif
+# if defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(__clang__) /* clang C++11 enablers are found below, don't do them here */
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+ /* C++0x features supported in GCC 4.3: */
+# define Q_COMPILER_VARIADIC_MACROS
+# define Q_COMPILER_RVALUE_REFS
+# define Q_COMPILER_DECLTYPE
+# define Q_COMPILER_STATIC_ASSERT
+# endif
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
+ /* C++0x features supported in GCC 4.4: */
+# define Q_COMPILER_UNICODE_STRINGS
+# define Q_COMPILER_VARIADIC_TEMPLATES
+# define Q_COMPILER_AUTO_TYPE
+# define Q_COMPILER_EXTERN_TEMPLATES
+# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
+# define Q_COMPILER_CLASS_ENUM
+# define Q_COMPILER_INITIALIZER_LISTS
+# define Q_COMPILER_ATOMICS
+# endif
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
+ /* C++0x features supported in GCC 4.5: */
+# define Q_COMPILER_LAMBDA
+# endif
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
+ /* C++0x features supported in GCC 4.6: */
+# define Q_COMPILER_NULLPTR
+# define Q_COMPILER_CONSTEXPR
+# define Q_COMPILER_UNRESTRICTED_UNIONS
+# define Q_COMPILER_RANGE_FOR
+# endif
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407
+ /* C++0x features supported in GCC 4.7: */
+# define Q_COMPILER_EXPLICIT_OVERRIDES
+# endif
+
+# endif
+
+/* IBM compiler versions are a bit messy. There are actually two products:
+ the C product, and the C++ product. The C++ compiler is always packaged
+ with the latest version of the C compiler. Version numbers do not always
+ match. This little table (I'm not sure it's accurate) should be helpful:
+
+ C++ product C product
+
+ C Set 3.1 C Compiler 3.0
+ ... ...
+ C++ Compiler 3.6.6 C Compiler 4.3
+ ... ...
+ Visual Age C++ 4.0 ...
+ ... ...
+ Visual Age C++ 5.0 C Compiler 5.0
+ ... ...
+ Visual Age C++ 6.0 C Compiler 6.0
+
+ Now:
+ __xlC__ is the version of the C compiler in hexadecimal notation
+ is only an approximation of the C++ compiler version
+ __IBMCPP__ is the version of the C++ compiler in decimal notation
+ but it is not defined on older compilers like C Set 3.1 */
+#elif defined(__xlC__)
+# define Q_CC_XLC
+# define Q_FULL_TEMPLATE_INSTANTIATION
+# if __xlC__ < 0x400
+# define Q_NO_BOOL_TYPE
+# define Q_NO_EXPLICIT_KEYWORD
+# define Q_NO_USING_KEYWORD
+# define Q_OUTOFLINE_TEMPLATE inline
+# define Q_BROKEN_TEMPLATE_SPECIALIZATION
+# define Q_CANNOT_DELETE_CONSTANT
+# elif __xlC__ >= 0x0600
+# define Q_ALIGNOF(type) __alignof__(type)
+# define Q_TYPEOF(expr) __typeof__(expr)
+# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
+# define Q_PACKED __attribute__((__packed__))
+# endif
+
+/* Older versions of DEC C++ do not define __EDG__ or __EDG - observed
+ on DEC C++ V5.5-004. New versions do define __EDG__ - observed on
+ Compaq C++ V6.3-002.
+ This compiler is different enough from other EDG compilers to handle
+ it separately anyway. */
+#elif defined(__DECCXX) || defined(__DECC)
+# define Q_CC_DEC
+/* Compaq C++ V6 compilers are EDG-based but I'm not sure about older
+ DEC C++ V5 compilers. */
+# if defined(__EDG__)
+# define Q_CC_EDG
+# endif
+/* Compaq have disabled EDG's _BOOL macro and use _BOOL_EXISTS instead
+ - observed on Compaq C++ V6.3-002.
+ In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
+# if !defined(_BOOL_EXISTS)
+# define Q_NO_BOOL_TYPE
+# endif
+/* Spurious (?) error messages observed on Compaq C++ V6.5-014. */
+# define Q_NO_USING_KEYWORD
+/* Apply to all versions prior to Compaq C++ V6.0-000 - observed on
+ DEC C++ V5.5-004. */
+# if __DECCXX_VER < 60060000
+# define Q_BROKEN_TEMPLATE_SPECIALIZATION
+# define Q_CANNOT_DELETE_CONSTANT
+# endif
+/* avoid undefined symbol problems with out-of-line template members */
+# define Q_OUTOFLINE_TEMPLATE inline
+
+/* The Portland Group C++ compiler is based on EDG and does define __EDG__
+ but the C compiler does not */
+#elif defined(__PGI)
+# define Q_CC_PGI
+# if defined(__EDG__)
+# define Q_CC_EDG
+# endif
+
+/* Compilers with EDG front end are similar. To detect them we test:
+ __EDG documented by SGI, observed on MIPSpro 7.3.1.1 and KAI C++ 4.0b
+ __EDG__ documented in EDG online docs, observed on Compaq C++ V6.3-002
+ and PGI C++ 5.2-4 */
+#elif !defined(Q_OS_HPUX) && (defined(__EDG) || defined(__EDG__))
+# define Q_CC_EDG
+/* From the EDG documentation (does not seem to apply to Compaq C++):
+ _BOOL
+ Defined in C++ mode when bool is a keyword. The name of this
+ predefined macro is specified by a configuration flag. _BOOL
+ is the default.
+ __BOOL_DEFINED
+ Defined in Microsoft C++ mode when bool is a keyword. */
+# if !defined(_BOOL) && !defined(__BOOL_DEFINED)
+# define Q_NO_BOOL_TYPE
+# endif
+
+/* The Comeau compiler is based on EDG and does define __EDG__ */
+# if defined(__COMO__)
+# define Q_CC_COMEAU
+# define Q_C_CALLBACKS
+
+/* The `using' keyword was introduced to avoid KAI C++ warnings
+ but it's now causing KAI C++ errors instead. The standard is
+ unclear about the use of this keyword, and in practice every
+ compiler is using its own set of rules. Forget it. */
+# elif defined(__KCC)
+# define Q_CC_KAI
+# define Q_NO_USING_KEYWORD
+
+/* Using the `using' keyword avoids Intel C++ for Linux warnings */
+# elif defined(__INTEL_COMPILER)
+# define Q_CC_INTEL
+
+/* Uses CFront, make sure to read the manual how to tweak templates. */
+# elif defined(__ghs)
+# define Q_CC_GHS
+
+# elif defined(__DCC__)
+# define Q_CC_DIAB
+# undef Q_NO_BOOL_TYPE
+# if !defined(__bool)
+# define Q_NO_BOOL_TYPE
+# endif
+
+/* The UnixWare 7 UDK compiler is based on EDG and does define __EDG__ */
+# elif defined(__USLC__) && defined(__SCO_VERSION__)
+# define Q_CC_USLC
+/* The latest UDK 7.1.1b does not need this, but previous versions do */
+# if !defined(__SCO_VERSION__) || (__SCO_VERSION__ < 302200010)
+# define Q_OUTOFLINE_TEMPLATE inline
+# endif
+# define Q_NO_USING_KEYWORD /* ### check "using" status */
+
+/* Never tested! */
+# elif defined(CENTERLINE_CLPP) || defined(OBJECTCENTER)
+# define Q_CC_OC
+# define Q_NO_USING_KEYWORD
+
+/* CDS++ defines __EDG__ although this is not documented in the Reliant
+ documentation. It also follows conventions like _BOOL and this documented */
+# elif defined(sinix)
+# define Q_CC_CDS
+# define Q_NO_USING_KEYWORD
+
+/* The MIPSpro compiler defines __EDG */
+# elif defined(__sgi)
+# define Q_CC_MIPS
+# define Q_NO_USING_KEYWORD /* ### check "using" status */
+# define Q_NO_TEMPLATE_FRIENDS
+# if defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 740)
+# define Q_OUTOFLINE_TEMPLATE inline
+# pragma set woff 3624,3625,3649 /* turn off some harmless warnings */
+# endif
+# endif
+
+/* VxWorks' DIAB toolchain has an additional EDG type C++ compiler
+ (see __DCC__ above). This one is for C mode files (__EDG is not defined) */
+#elif defined(_DIAB_TOOL)
+# define Q_CC_DIAB
+
+/* Never tested! */
+#elif defined(__HIGHC__)
+# define Q_CC_HIGHC
+
+#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C)
+# define Q_CC_SUN
+/* 5.0 compiler or better
+ 'bool' is enabled by default but can be disabled using -features=nobool
+ in which case _BOOL is not defined
+ this is the default in 4.2 compatibility mode triggered by -compat=4 */
+# if __SUNPRO_CC >= 0x500
+# define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
+ /* see http://developers.sun.com/sunstudio/support/Ccompare.html */
+# if __SUNPRO_CC >= 0x590
+# define Q_ALIGNOF(type) __alignof__(type)
+# define Q_TYPEOF(expr) __typeof__(expr)
+# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
+# endif
+# if __SUNPRO_CC >= 0x550
+# define Q_DECL_EXPORT __global
+# endif
+# if __SUNPRO_CC < 0x5a0
+# define Q_NO_TEMPLATE_FRIENDS
+# endif
+# if !defined(_BOOL)
+# define Q_NO_BOOL_TYPE
+# endif
+# if defined(__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT <= 4)
+# define Q_NO_USING_KEYWORD
+# endif
+# define Q_C_CALLBACKS
+/* 4.2 compiler or older */
+# else
+# define Q_NO_BOOL_TYPE
+# define Q_NO_EXPLICIT_KEYWORD
+# define Q_NO_USING_KEYWORD
+# endif
+
+/* CDS++ does not seem to define __EDG__ or __EDG according to Reliant
+ documentation but nevertheless uses EDG conventions like _BOOL */
+#elif defined(sinix)
+# define Q_CC_EDG
+# define Q_CC_CDS
+# if !defined(_BOOL)
+# define Q_NO_BOOL_TYPE
+# endif
+# define Q_BROKEN_TEMPLATE_SPECIALIZATION
+
+#elif defined(Q_OS_HPUX)
+/* __HP_aCC was not defined in first aCC releases */
+# if defined(__HP_aCC) || __cplusplus >= 199707L
+# define Q_NO_TEMPLATE_FRIENDS
+# define Q_CC_HPACC
+# if __HP_aCC-0 < 060000
+# define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
+# define Q_DECL_EXPORT __declspec(dllexport)
+# define Q_DECL_IMPORT __declspec(dllimport)
+# endif
+# if __HP_aCC-0 >= 061200
+# define Q_DECL_ALIGN(n) __attribute__((aligned(n)))
+# endif
+# if __HP_aCC-0 >= 062000
+# define Q_DECL_EXPORT __attribute__((visibility("default")))
+# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
+# define Q_DECL_IMPORT Q_DECL_EXPORT
+# endif
+# else
+# define Q_CC_HP
+# define Q_NO_BOOL_TYPE
+# define Q_FULL_TEMPLATE_INSTANTIATION
+# define Q_BROKEN_TEMPLATE_SPECIALIZATION
+# define Q_NO_EXPLICIT_KEYWORD
+# endif
+# define Q_NO_USING_KEYWORD /* ### check "using" status */
+
+#else
+# error "Qt has not been tested with this compiler - see http://www.qt-project.org/"
+#endif
+
+
+#ifdef Q_CC_INTEL
+# if __INTEL_COMPILER < 1200
+# define Q_NO_TEMPLATE_FRIENDS
+# endif
+# if defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(__GXX_EXPERIMENTAL_CPP0X__)
+# if __INTEL_COMPILER >= 1200
+# define Q_COMPILER_RVALUE_REFS
+# define Q_COMPILER_EXTERN_TEMPLATES
+# define Q_COMPILER_DECLTYPE
+# define Q_COMPILER_VARIADIC_TEMPLATES
+# define Q_COMPILER_AUTO_TYPE
+# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
+# define Q_COMPILER_CLASS_ENUM
+# define Q_COMPILER_LAMBDA
+# define Q_COMPILER_STATIC_ASSERT
+# endif
+# endif
+#endif
+
+#ifdef Q_CC_CLANG
+/* General C++ features */
+# if !__has_feature(cxx_exceptions)
+# define QT_NO_EXCEPTIONS
+# endif
+# if !__has_feature(cxx_rtti)
+# define QT_NO_RTTI
+# endif
+/* C++11 features, see http://clang.llvm.org/cxx_status.html */
+# if __cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__
+# if ((__clang_major__ * 100) + __clang_minor__) >= 209 /* since clang 2.9 */
+# define Q_COMPILER_AUTO_TYPE
+# define Q_COMPILER_DECLTYPE
+# define Q_COMPILER_EXTERN_TEMPLATES
+# define Q_COMPILER_RVALUE_REFS
+# define Q_COMPILER_STATIC_ASSERT
+# define Q_COMPILER_VARIADIC_MACROS
+# define Q_COMPILER_VARIADIC_TEMPLATES
+# endif
+# if ((__clang_major__ * 100) + __clang_minor__) >= 300 /* since clang 3.0 */
+# define Q_COMPILER_CLASS_ENUM
+ /* defaulted members in 3.0, deleted members in 2.9 */
+# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
+# define Q_COMPILER_EXPLICIT_OVERRIDES
+# define Q_COMPILER_NULLPTR
+# define Q_COMPILER_RANGE_FOR
+# define Q_COMPILER_UNICODE_STRINGS
+# endif
+ /* not implemented in clang yet */
+# if __has_feature(cxx_constexpr)
+# define Q_COMPILER_CONSTEXPR
+# endif
+# if __has_feature(cxx_lambdas)
+# define Q_COMPILER_LAMBDA
+# endif
+# if __has_feature(cxx_generalized_initializers)
+# define Q_COMPILER_INITIALIZER_LISTS
+# endif
+# if __has_feature(cxx_unrestricted_unions)
+# define Q_COMPILER_UNRESTRICTED_UNIONS
+# endif
+# if 0
+# define Q_COMPILER_ATOMICS
+# endif
+# endif
+#endif // Q_CC_CLANG
+
+#ifndef Q_COMPILER_MANGLES_RETURN_TYPE
+# if defined(Q_CC_MSVC)
+# define Q_COMPILER_MANGLES_RETURN_TYPE
+# endif
+#endif
+
+#endif // QCOMPILERDETECTION_H
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 01b3e2ec32..eea4397dcd 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -45,15 +45,12 @@
#include "qlist.h"
#include "qthreadstorage.h"
#include "qdir.h"
-#include "qstringlist.h"
#include "qdatetime.h"
-#include "qdebug.h"
#ifndef QT_NO_QOBJECT
#include <private/qthread_p.h>
#endif
-#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
@@ -678,34 +675,6 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \typedef QtMsgHandler
- \relates <QtGlobal>
- \deprecated
-
- This is a typedef for a pointer to a function with the following
- signature:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
-
- This typedef is deprecated, you should use QMessageHandler instead.
- \sa QtMsgType, QMessageHandler, qInstallMsgHandler(), qInstallMessageHandler()
-*/
-
-/*!
- \typedef QMessageHandler
- \relates <QtGlobal>
- \since 5.0
-
- This is a typedef for a pointer to a function with the following
- signature:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 49
-
- \sa QtMsgType, qInstallMessageHandler()
-*/
-
-
-/*!
\enum QtMsgType
\relates <QtGlobal>
@@ -1391,6 +1360,230 @@ bool qSharedBuild()
*/
/*!
+ \macro Q_PROCESSOR_ALPHA
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for Alpha processors.
+*/
+
+/*!
+ \macro Q_PROCESSOR_ARM
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for ARM processors. Qt currently
+ supports three optional ARM revisions: \l Q_PROCESSOR_ARM_V5, \l
+ Q_PROCESSOR_ARM_V6, and \l Q_PROCESSOR_ARM_V7.
+*/
+/*!
+ \macro Q_PROCESSOR_ARM_V5
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for ARMv5 processors. The \l
+ Q_PROCESSOR_ARM macro is also defined when Q_PROCESSOR_ARM_V5 is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_ARM_V6
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for ARMv6 processors. The \l
+ Q_PROCESSOR_ARM and \l Q_PROCESSOR_ARM_V5 macros are also defined when
+ Q_PROCESSOR_ARM_V6 is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_ARM_V7
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for ARMv7 processors. The \l
+ Q_PROCESSOR_ARM, \l Q_PROCESSOR_ARM_V5, and \l Q_PROCESSOR_ARM_V6 macros
+ are also defined when Q_PROCESSOR_ARM_V7 is defined.
+*/
+
+/*!
+ \macro Q_PROCESSOR_AVR32
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for AVR32 processors.
+*/
+
+/*!
+ \macro Q_PROCESSOR_BLACKFIN
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for Blackfin processors.
+*/
+
+/*!
+ \macro Q_PROCESSOR_IA64
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for IA-64 processors. This includes
+ all Itanium and Itanium 2 processors.
+*/
+
+/*!
+ \macro Q_PROCESSOR_MIPS
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS processors. Qt currently
+ supports seven MIPS revisions: \l Q_PROCESSOR_MIPS_I, \l
+ Q_PROCESSOR_MIPS_II, \l Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, \l
+ Q_PROCESSOR_MIPS_V, \l Q_PROCESSOR_MIPS_32, and \l Q_PROCESSOR_MIPS_64.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_I
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS-I processors. The \l
+ Q_PROCESSOR_MIPS macro is also defined when Q_PROCESSOR_MIPS_I is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_II
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS-II processors. The \l
+ Q_PROCESSOR_MIPS and \l Q_PROCESSOR_MIPS_I macros are also defined when
+ Q_PROCESSOR_MIPS_II is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_32
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS32 processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
+ are also defined when Q_PROCESSOR_MIPS_32 is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_III
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS-III processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
+ are also defined when Q_PROCESSOR_MIPS_III is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_IV
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS-IV processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, and \l
+ Q_PROCESSOR_MIPS_III macros are also defined when Q_PROCESSOR_MIPS_IV is
+ defined.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_V
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS-V processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
+ Q_PROCESSOR_MIPS_III, and \l Q_PROCESSOR_MIPS_IV macros are also defined
+ when Q_PROCESSOR_MIPS_V is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_64
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for MIPS64 processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
+ Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, and \l Q_PROCESSOR_MIPS_V
+ macros are also defined when Q_PROCESSOR_MIPS_64 is defined.
+*/
+
+/*!
+ \macro Q_PROCESSOR_POWER
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for POWER processors. Qt currently
+ supports two Power variants: \l Q_PROCESSOR_POWER_32 and \l
+ Q_PROCESSOR_POWER_64.
+*/
+/*!
+ \macro Q_PROCESSOR_POWER_32
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for 32-bit Power processors. The \l
+ Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_32 is
+ defined.
+*/
+/*!
+ \macro Q_PROCESSOR_POWER_64
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for 64-bit Power processors. The \l
+ Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_64 is
+ defined.
+*/
+
+/*!
+ \macro Q_PROCESSOR_S390
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for S/390 processors. Qt supports
+ one optional variant of S/390: Q_PROCESSOR_S390_X.
+*/
+/*!
+ \macro Q_PROCESSOR_S390_X
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for S/390x processors. The \l
+ Q_PROCESSOR_S390 macro is also defined when Q_PROCESSOR_S390_X is defined.
+*/
+
+/*!
+ \macro Q_PROCESSOR_SH
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for SuperH processors. Qt currently
+ supports one SuperH revision: \l Q_PROCESSOR_SH_4A.
+*/
+/*!
+ \macro Q_PROCESSOR_SH_4A
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for SuperH 4A processors. The \l
+ Q_PROCESSOR_SH macro is also defined when Q_PROCESSOR_SH_4A is defined.
+*/
+
+/*!
+ \macro Q_PROCESSOR_SPARC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for SPARC processors. Qt currently
+ supports one optional SPARC revision: \l Q_PROCESSOR_SPARC_V9.
+*/
+/*!
+ \macro Q_PROCESSOR_SPARC_V9
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for SPARC V9 processors. The \l
+ Q_PROCESSOR_SPARC macro is also defined when Q_PROCESSOR_SPARC_V9 is
+ defined.
+*/
+
+/*!
+ \macro Q_PROCESSOR_X86
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for x86 processors. Qt currently
+ supports two x86 variants: \l Q_PROCESSOR_X86_32 and \l Q_PROCESSOR_X86_64.
+*/
+/*!
+ \macro Q_PROCESSOR_X86_32
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for 32-bit x86 processors. This
+ includes all i386, i486, i586, and i686 processors. The \l Q_PROCESSOR_X86
+ macro is also defined when Q_PROCESSOR_X86_32 is defined.
+*/
+/*!
+ \macro Q_PROCESSOR_X86_64
+ \relates <QtGlobal>
+
+ Defined if the application is compiled for 64-bit x86 processors. This
+ includes all AMD64, Intel 64, and other x86_64/x64 processors. The \l
+ Q_PROCESSOR_X86 macro is also defined when Q_PROCESSOR_X86_64 is defined.
+*/
+
+/*!
\macro QT_DISABLE_DEPRECATED_BEFORE
\relates <QtGlobal>
@@ -1726,9 +1919,6 @@ Q_CORE_EXPORT unsigned int qt_int_sqrt(unsigned int n)
void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); }
-static QtMsgHandler msgHandler = 0; // pointer to debug handler (without context)
-static QMessageHandler messageHandler = 0; // pointer to debug handler (with context)
-
#if !defined(Q_OS_WIN) && !defined(QT_NO_THREAD) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) && \
defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L
namespace {
@@ -1808,434 +1998,6 @@ QString qt_error_string(int errorCode)
return ret.trimmed();
}
-/*!
- \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
- \relates <QtGlobal>
- \deprecated
-
- Installs a Qt message \a handler which has been defined
- previously. This method is deprecated, use qInstallMessageHandler
- instead.
-
- \sa QtMsgHandler, qInstallMessageHandler
-*/
-
-/*!
- \fn QMessageHandler qInstallMessageHandler(QMessageHandler handler)
- \relates <QtGlobal>
- \since 5.0
-
- Installs a Qt message \a handler which has been defined
- previously. Returns a pointer to the previous message handler
- (which may be 0).
-
- The message handler is a function that prints out debug messages,
- warnings, critical and fatal error messages. The Qt library (debug
- mode) contains hundreds of warning messages that are printed
- when internal errors (usually invalid function arguments)
- occur. Qt built in release mode also contains such warnings unless
- QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
- compilation. If you implement your own message handler, you get total
- control of these messages.
-
- The default message handler prints the message to the standard
- output under X11 or to the debugger under Windows. If it is a
- fatal message, the application aborts immediately.
-
- Only one message handler can be defined, since this is usually
- done on an application-wide basis to control debug output.
-
- To restore the message handler, call \c qInstallMessageHandler(0).
-
- Example:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
-
- \sa qDebug(), qWarning(), qCritical(), qFatal(), QtMsgType,
- {Debugging Techniques}
-*/
-
-#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
-extern bool usingWinMain;
-extern Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str);
-extern Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context,
- const char *str);
-#endif
-
-/*!
- \internal
-*/
-static void qDefaultMsgHandler(QtMsgType, const char *buf)
-{
-#if defined(Q_OS_WINCE)
- QString fstr = QString::fromLatin1(buf);
- fstr += QLatin1Char('\n');
- OutputDebugString(reinterpret_cast<const wchar_t *> (fstr.utf16()));
-#else
- fprintf(stderr, "%s\n", buf);
- fflush(stderr);
-#endif
-}
-
-/*!
- \internal
-*/
-static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &, const char *buf)
-{
- qDefaultMsgHandler(type, buf);
-}
-
-QMessageHandler qInstallMessageHandler(QMessageHandler h)
-{
- if (!messageHandler)
- messageHandler = qDefaultMessageHandler;
- QMessageHandler old = messageHandler;
- messageHandler = h;
-#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
- if (!messageHandler && usingWinMain)
- messageHandler = qWinMessageHandler;
-#endif
- return old;
-}
-
-QtMsgHandler qInstallMsgHandler(QtMsgHandler h)
-{
- //if handler is 0, set it to the
- //default message handler
- if (!msgHandler)
- msgHandler = qDefaultMsgHandler;
- QtMsgHandler old = msgHandler;
- msgHandler = h;
-#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
- if (!msgHandler && usingWinMain)
- msgHandler = qWinMsgHandler;
-#endif
- return old;
-}
-
-/*!
- \internal
-*/
-void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const char *buf)
-{
- if (!msgHandler)
- msgHandler = qDefaultMsgHandler;
- if (!messageHandler)
- messageHandler = qDefaultMessageHandler;
-
- // prefer new message handler over the old one
- if (msgHandler == qDefaultMsgHandler
- || messageHandler != qDefaultMessageHandler) {
- (*messageHandler)(msgType, context, buf);
- } else {
- (*msgHandler)(msgType, buf);
- }
-
- if (msgType == QtFatalMsg
- || (msgType == QtWarningMsg
- && (!qgetenv("QT_FATAL_WARNINGS").isNull())) ) {
-
-#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
- // get the current report mode
- int reportMode = _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
- _CrtSetReportMode(_CRT_ERROR, reportMode);
-#if !defined(Q_OS_WINCE)
- int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf);
-#else
- int ret = _CrtDbgReportW(_CRT_ERROR, _CRT_WIDE(__FILE__),
- __LINE__, _CRT_WIDE(QT_VERSION_STR), reinterpret_cast<const wchar_t *> (QString::fromLatin1(buf).utf16()));
-#endif
- if (ret == 0 && reportMode & _CRTDBG_MODE_WNDW)
- return; // ignore
- else if (ret == 1)
- _CrtDbgBreak();
-#endif
-
-#if (defined(Q_OS_UNIX) || defined(Q_CC_MINGW))
- abort(); // trap; generates core dump
-#else
- exit(1); // goodbye cruel world
-#endif
- }
-}
-
-#if !defined(QT_NO_EXCEPTIONS)
-/*!
- \internal
- Uses a local buffer to output the message. Not locale safe + cuts off
- everything after character 255, but will work in out of memory situations.
-*/
-static void qEmergencyOut(QtMsgType msgType, const char *msg, va_list ap)
-{
- char emergency_buf[256] = { '\0' };
- emergency_buf[255] = '\0';
- if (msg)
- qvsnprintf(emergency_buf, 255, msg, ap);
- QMessageLogContext context;
- qt_message_output(msgType, context, emergency_buf);
-}
-#endif
-
-/*!
- \internal
-*/
-static void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg, va_list ap)
-{
-#if !defined(QT_NO_EXCEPTIONS)
- if (std::uncaught_exception()) {
- qEmergencyOut(msgType, msg, ap);
- return;
- }
-#endif
- QByteArray buf;
- if (msg) {
- QT_TRY {
- buf = QString().vsprintf(msg, ap).toLocal8Bit();
- } QT_CATCH(const std::bad_alloc &) {
-#if !defined(QT_NO_EXCEPTIONS)
- qEmergencyOut(msgType, msg, ap);
- // don't rethrow - we use qWarning and friends in destructors.
- return;
-#endif
- }
- }
- qt_message_output(msgType, context, buf.constData());
-}
-
-#undef qDebug
-/*!
- \fn qDebug(const char *message, ...)
- \relates <QtGlobal>
-
- Calls the message handler with the debug message \a msg. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the console, if it is a
- console application; otherwise, it is sent to the debugger. This
- function does nothing if \c QT_NO_DEBUG_OUTPUT was defined
- during compilation.
-
- If you pass the function a format string and a list of arguments,
- it works in similar way to the C printf() function. The format
- should be a Latin-1 string.
-
- Example:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 24
-
- If you include \c <QtDebug>, a more convenient syntax is also
- available:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 25
-
- With this syntax, the function returns a QDebug object that is
- configured to use the QtDebugMsg message type. It automatically
- puts a single space between each item, and outputs a newline at
- the end. It supports many C++ and Qt types.
-
- To suppress the output at run-time, install your own message handler
- with qInstallMessageHandler().
-
- \sa qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-void QMessageLogger::debug(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg); // use variable arg list
- qt_message(QtDebugMsg, context, msg, ap);
- va_end(ap);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-
-QDebug QMessageLogger::debug()
-{
- QDebug dbg = QDebug(QtDebugMsg);
- QMessageLogContext &ctxt = dbg.stream->context;
- ctxt.file = context.file;
- ctxt.line = context.line;
- ctxt.function = context.function;
- return dbg;
-}
-
-QNoDebug QMessageLogger::noDebug()
-{
- return QNoDebug();
-}
-
-#endif
-
-#undef qWarning
-/*!
- \fn qWarning(const char *message, ...)
- \relates <QtGlobal>
-
- Calls the message handler with the warning message \a msg. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the debugger. This
- function does nothing if \c QT_NO_WARNING_OUTPUT was defined
- during compilation; it exits if the environment variable \c
- QT_FATAL_WARNINGS is defined.
-
- This function takes a format string and a list of arguments,
- similar to the C printf() function. The format should be a Latin-1
- string.
-
- Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 26
-
- If you include <QtDebug>, a more convenient syntax is
- also available:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 27
-
- This syntax inserts a space between each item, and
- appends a newline at the end.
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qDebug(), qCritical(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-void QMessageLogger::warning(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg); // use variable arg list
- qt_message(QtWarningMsg, context, msg, ap);
- va_end(ap);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug QMessageLogger::warning()
-{
- QDebug dbg = QDebug(QtWarningMsg);
- QMessageLogContext &ctxt = dbg.stream->context;
- ctxt.file = context.file;
- ctxt.line = context.line;
- ctxt.function = context.function;
- return dbg;
-}
-#endif
-
-#undef qCritical
-/*!
- \fn qCritical(const char *message, ...)
- \relates <QtGlobal>
-
- Calls the message handler with the critical message \a msg. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the debugger.
-
- This function takes a format string and a list of arguments,
- similar to the C printf() function. The format should be a Latin-1
- string.
-
- Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 28
-
- If you include <QtDebug>, a more convenient syntax is
- also available:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 29
-
- A space is inserted between the items, and a newline is
- appended at the end.
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qDebug(), qWarning(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-void QMessageLogger::critical(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg); // use variable arg list
- qt_message(QtCriticalMsg, context, msg, ap);
- va_end(ap);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug QMessageLogger::critical()
-{
- QDebug dbg = QDebug(QtCriticalMsg);
- QMessageLogContext &ctxt = dbg.stream->context;
- ctxt.file = context.file;
- ctxt.line = context.line;
- ctxt.function = context.function;
- return dbg;
-}
-#endif
-
-void qErrnoWarning(const char *msg, ...)
-{
- // qt_error_string() will allocate anyway, so we don't have
- // to be careful here (like we do in plain qWarning())
- QString buf;
- va_list ap;
- va_start(ap, msg);
- if (msg)
- buf.vsprintf(msg, ap);
- va_end(ap);
-
- QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
- qt_error_string(-1).toLocal8Bit().constData());
-}
-
-void qErrnoWarning(int code, const char *msg, ...)
-{
- // qt_error_string() will allocate anyway, so we don't have
- // to be careful here (like we do in plain qWarning())
- QString buf;
- va_list ap;
- va_start(ap, msg);
- if (msg)
- buf.vsprintf(msg, ap);
- va_end(ap);
-
- QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
- qt_error_string(code).toLocal8Bit().constData());
-}
-
-#undef qFatal
-/*!
- \fn qFatal(const char *message, ...)
- \relates <QtGlobal>
-
- Calls the message handler with the fatal message \a msg. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the debugger.
-
- If you are using the \bold{default message handler} this function will
- abort on Unix systems to create a core dump. On Windows, for debug builds,
- this function will report a _CRT_ERROR enabling you to connect a debugger
- to the application.
-
- This function takes a format string and a list of arguments,
- similar to the C printf() function.
-
- Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 30
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qDebug(), qCritical(), qWarning(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-void QMessageLogger::fatal(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg); // use variable arg list
- qt_message(QtFatalMsg, context, msg, ap);
- va_end(ap);
-}
-
// getenv is declared as deprecated in VS2005. This function
// makes use of the new secure getenv function.
/*!
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index c92336f95c..d4d2ffdabb 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -62,6 +62,11 @@
#include <QtCore/qconfig.h>
#endif
+
+#include <QtCore/qsystemdetection.h>
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qprocessordetection.h>
+
#ifdef __cplusplus
#ifndef QT_NO_STL
@@ -140,667 +145,13 @@ namespace QT_NAMESPACE {}
#endif /* __cplusplus */
-#if defined(Q_OS_MAC) && !defined(Q_CC_INTEL)
-#define QT_BEGIN_HEADER extern "C++" {
-#define QT_END_HEADER }
-#else
#define QT_BEGIN_HEADER
#define QT_END_HEADER
-#endif
-
-/*
- The operating system, must be one of: (Q_OS_x)
-
- DARWIN - Darwin OS (synonym for Q_OS_MAC)
- MSDOS - MS-DOS and Windows
- OS2 - OS/2
- OS2EMX - XFree86 on OS/2 (not PM)
- WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
- WINCE - WinCE (Windows CE 5.0)
- CYGWIN - Cygwin
- SOLARIS - Sun Solaris
- HPUX - HP-UX
- ULTRIX - DEC Ultrix
- LINUX - Linux
- FREEBSD - FreeBSD
- NETBSD - NetBSD
- OPENBSD - OpenBSD
- BSDI - BSD/OS
- IRIX - SGI Irix
- OSF - HP Tru64 UNIX
- SCO - SCO OpenServer 5
- UNIXWARE - UnixWare 7, Open UNIX 8
- AIX - AIX
- HURD - GNU Hurd
- DGUX - DG/UX
- RELIANT - Reliant UNIX
- DYNIX - DYNIX/ptx
- QNX - QNX
- QNX6 - QNX RTP 6.1
- LYNX - LynxOS
- BSD4 - Any BSD 4.4 system
- UNIX - Any UNIX BSD/SYSV system
-*/
-
-#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
-# define Q_OS_DARWIN
-# define Q_OS_BSD4
-# ifdef __LP64__
-# define Q_OS_DARWIN64
-# else
-# define Q_OS_DARWIN32
-# endif
-#elif defined(__CYGWIN__)
-# define Q_OS_CYGWIN
-#elif !defined(SAG_COM) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
-# define Q_OS_WIN32
-# define Q_OS_WIN64
-#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
-# if defined(WINCE) || defined(_WIN32_WCE)
-# define Q_OS_WINCE
-# else
-# define Q_OS_WIN32
-# endif
-#elif defined(__sun) || defined(sun)
-# define Q_OS_SOLARIS
-#elif defined(hpux) || defined(__hpux)
-# define Q_OS_HPUX
-#elif defined(__ultrix) || defined(ultrix)
-# define Q_OS_ULTRIX
-#elif defined(sinix)
-# define Q_OS_RELIANT
-#elif defined(__native_client__)
-# define Q_OS_NACL
-#elif defined(__linux__) || defined(__linux)
-# define Q_OS_LINUX
-#elif defined(__FreeBSD__) || defined(__DragonFly__)
-# define Q_OS_FREEBSD
-# define Q_OS_BSD4
-#elif defined(__NetBSD__)
-# define Q_OS_NETBSD
-# define Q_OS_BSD4
-#elif defined(__OpenBSD__)
-# define Q_OS_OPENBSD
-# define Q_OS_BSD4
-#elif defined(__bsdi__)
-# define Q_OS_BSDI
-# define Q_OS_BSD4
-#elif defined(__sgi)
-# define Q_OS_IRIX
-#elif defined(__osf__)
-# define Q_OS_OSF
-#elif defined(_AIX)
-# define Q_OS_AIX
-#elif defined(__Lynx__)
-# define Q_OS_LYNX
-#elif defined(__GNU__)
-# define Q_OS_HURD
-#elif defined(__DGUX__)
-# define Q_OS_DGUX
-#elif defined(__QNXNTO__)
-# define Q_OS_QNX
-#elif defined(_SEQUENT_)
-# define Q_OS_DYNIX
-#elif defined(_SCO_DS) /* SCO OpenServer 5 + GCC */
-# define Q_OS_SCO
-#elif defined(__USLC__) /* all SCO platforms + UDK or OUDK */
-# define Q_OS_UNIXWARE
-#elif defined(__svr4__) && defined(i386) /* Open UNIX 8 + GCC */
-# define Q_OS_UNIXWARE
-#elif defined(__INTEGRITY)
-# define Q_OS_INTEGRITY
-#elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
-# define Q_OS_VXWORKS
-#elif defined(__MAKEDEPEND__)
-#else
-# error "Qt has not been ported to this OS - see http://www.qt-project.org/"
-#endif
-
-#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) || defined(Q_OS_WINCE)
-# define Q_OS_WIN
-#endif
-
-#if defined(Q_OS_DARWIN)
-# define Q_OS_MAC
-# define Q_OS_MACX /* Q_OS_MACX is only for compatibility.*/
-# if defined(Q_OS_DARWIN64)
-# define Q_OS_MAC64
-# elif defined(Q_OS_DARWIN32)
-# define Q_OS_MAC32
-# endif
-#endif
-
-#if defined(Q_OS_WIN)
-# undef Q_OS_UNIX
-#elif !defined(Q_OS_UNIX)
-# define Q_OS_UNIX
-#endif
#if defined(Q_OS_DARWIN) && !defined(QT_LARGEFILE_SUPPORT)
# define QT_LARGEFILE_SUPPORT 64
#endif
-#ifdef Q_OS_DARWIN
-# ifdef MAC_OS_X_VERSION_MIN_REQUIRED
-# undef MAC_OS_X_VERSION_MIN_REQUIRED
-# endif
-# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_4
-# include <AvailabilityMacros.h>
-# if !defined(MAC_OS_X_VERSION_10_3)
-# define MAC_OS_X_VERSION_10_3 MAC_OS_X_VERSION_10_2 + 1
-# endif
-# if !defined(MAC_OS_X_VERSION_10_4)
-# define MAC_OS_X_VERSION_10_4 MAC_OS_X_VERSION_10_3 + 1
-# endif
-# if !defined(MAC_OS_X_VERSION_10_5)
-# define MAC_OS_X_VERSION_10_5 MAC_OS_X_VERSION_10_4 + 1
-# endif
-# if !defined(MAC_OS_X_VERSION_10_6)
-# define MAC_OS_X_VERSION_10_6 MAC_OS_X_VERSION_10_5 + 1
-# endif
-# if !defined(MAC_OS_X_VERSION_10_7)
-# define MAC_OS_X_VERSION_10_7 MAC_OS_X_VERSION_10_6 + 1
-# endif
-# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_7)
-# warning "This version of Mac OS X is unsupported"
-# endif
-#endif
-
-#ifdef __LSB_VERSION__
-# if __LSB_VERSION__ < 40
-# error "This version of the Linux Standard Base is unsupported"
-# endif
-#ifndef QT_LINUXBASE
-# define QT_LINUXBASE
-#endif
-#endif
-
-/*
- The compiler, must be one of: (Q_CC_x)
-
- SYM - Digital Mars C/C++ (used to be Symantec C++)
- MSVC - Microsoft Visual C/C++, Intel C++ for Windows
- BOR - Borland/Turbo C++
- WAT - Watcom C++
- GNU - GNU C++
- COMEAU - Comeau C++
- EDG - Edison Design Group C++
- OC - CenterLine C++
- SUN - Forte Developer, or Sun Studio C++
- MIPS - MIPSpro C++
- DEC - DEC C++
- HPACC - HP aC++
- USLC - SCO OUDK and UDK
- CDS - Reliant C++
- KAI - KAI C++
- INTEL - Intel C++ for Linux, Intel C++ for Windows
- HIGHC - MetaWare High C/C++
- PGI - Portland Group C++
- GHS - Green Hills Optimizing C++ Compilers
- RVCT - ARM Realview Compiler Suite
- CLANG - C++ front-end for the LLVM compiler
-
-
- Should be sorted most to least authoritative.
-*/
-
-/* Symantec C++ is now Digital Mars */
-#if defined(__DMC__) || defined(__SC__)
-# define Q_CC_SYM
-/* "explicit" semantics implemented in 8.1e but keyword recognized since 7.5 */
-# if defined(__SC__) && __SC__ < 0x750
-# define Q_NO_EXPLICIT_KEYWORD
-# endif
-# define Q_NO_USING_KEYWORD
-
-#elif defined(_MSC_VER)
-# define Q_CC_MSVC
-# define Q_CC_MSVC_NET
-# define Q_CANNOT_DELETE_CONSTANT
-# define Q_OUTOFLINE_TEMPLATE inline
-# define Q_NO_TEMPLATE_FRIENDS
-# define Q_ALIGNOF(type) __alignof(type)
-# define Q_DECL_ALIGN(n) __declspec(align(n))
-/* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
-# if defined(__INTEL_COMPILER)
-# define Q_CC_INTEL
-# endif
-/* MSVC does not support SSE/MMX on x64 */
-# if (defined(Q_CC_MSVC) && defined(_M_X64))
-# undef QT_HAVE_SSE
-# undef QT_HAVE_MMX
-# undef QT_HAVE_3DNOW
-# endif
-
-#if defined(Q_CC_MSVC) && _MSC_VER >= 1600
-# define Q_COMPILER_RVALUE_REFS
-# define Q_COMPILER_AUTO_TYPE
-# define Q_COMPILER_LAMBDA
-# define Q_COMPILER_DECLTYPE
-# define Q_COMPILER_STATIC_ASSERT
-// MSCV has std::initilizer_list, but do not support the braces initialization
-//# define Q_COMPILER_INITIALIZER_LISTS
-# endif
-
-
-#elif defined(__BORLANDC__) || defined(__TURBOC__)
-# define Q_CC_BOR
-# define Q_INLINE_TEMPLATE
-# if __BORLANDC__ < 0x502
-# define Q_NO_BOOL_TYPE
-# define Q_NO_EXPLICIT_KEYWORD
-# endif
-# define Q_NO_USING_KEYWORD
-
-#elif defined(__WATCOMC__)
-# define Q_CC_WAT
-
-/* ARM Realview Compiler Suite
- RVCT compiler also defines __EDG__ and __GNUC__ (if --gnu flag is given),
- so check for it before that */
-#elif defined(__ARMCC__) || defined(__CC_ARM)
-# define Q_CC_RVCT
-# if __TARGET_ARCH_ARM >= 6
-# define QT_HAVE_ARMV6
-# endif
-/* work-around for missing compiler intrinsics */
-# define __is_empty(X) false
-# define __is_pod(X) false
-#elif defined(__GNUC__)
-# define Q_CC_GNU
-# define Q_C_CALLBACKS
-# if defined(__MINGW32__)
-# define Q_CC_MINGW
-# endif
-# if defined(__INTEL_COMPILER)
-/* Intel C++ also masquerades as GCC 3.2.0 */
-# define Q_CC_INTEL
-# endif
-# if defined(__clang__)
-/* Clang also masquerades as GCC 4.2.1 */
-# define Q_CC_CLANG
-# endif
-# ifdef __APPLE__
-# define Q_NO_DEPRECATED_CONSTRUCTORS
-# endif
-# if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
-# define Q_FULL_TEMPLATE_INSTANTIATION
-# endif
-/* GCC 2.95 knows "using" but does not support it correctly */
-# if __GNUC__ == 2 && __GNUC_MINOR__ <= 95
-# define Q_NO_USING_KEYWORD
-# endif
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-# define Q_ALIGNOF(type) __alignof__(type)
-# define Q_TYPEOF(expr) __typeof__(expr)
-# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
-# endif
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define Q_LIKELY(expr) __builtin_expect(!!(expr), true)
-# define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false)
-# endif
-/* GCC 3.1 and GCC 3.2 wrongly define _SB_CTYPE_MACROS on HP-UX */
-# if defined(Q_OS_HPUX) && __GNUC__ == 3 && __GNUC_MINOR__ >= 1
-# define Q_WRONG_SB_CTYPE_MACROS
-# endif
-/* GCC <= 3.3 cannot handle template friends */
-# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ <= 3)
-# define Q_NO_TEMPLATE_FRIENDS
-# endif
-/* Apple's GCC 3.1 chokes on our streaming qDebug() */
-# if defined(Q_OS_DARWIN) && __GNUC__ == 3 && (__GNUC_MINOR__ >= 1 && __GNUC_MINOR__ < 3)
-# define Q_BROKEN_DEBUG_STREAM
-# endif
-# if (defined(Q_CC_GNU) || defined(Q_CC_INTEL)) && !defined(QT_MOC_CPP)
-# define Q_PACKED __attribute__ ((__packed__))
-# define Q_NO_PACKED_REFERENCE
-# ifndef __ARM_EABI__
-# define QT_NO_ARM_EABI
-# endif
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
-# define Q_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
-# endif
-# if defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(__clang__) /* clang C++11 enablers are found below, don't do them here */
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
- /* C++0x features supported in GCC 4.3: */
-# define Q_COMPILER_VARIADIC_MACROS
-# define Q_COMPILER_RVALUE_REFS
-# define Q_COMPILER_DECLTYPE
-# define Q_COMPILER_STATIC_ASSERT
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
- /* C++0x features supported in GCC 4.4: */
-# define Q_COMPILER_UNICODE_STRINGS
-# define Q_COMPILER_VARIADIC_TEMPLATES
-# define Q_COMPILER_AUTO_TYPE
-# define Q_COMPILER_EXTERN_TEMPLATES
-# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
-# define Q_COMPILER_CLASS_ENUM
-# define Q_COMPILER_INITIALIZER_LISTS
-# define Q_COMPILER_ATOMICS
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
- /* C++0x features supported in GCC 4.5: */
-# define Q_COMPILER_LAMBDA
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
- /* C++0x features supported in GCC 4.6: */
-# define Q_COMPILER_NULLPTR
-# define Q_COMPILER_CONSTEXPR
-# define Q_COMPILER_UNRESTRICTED_UNIONS
-# define Q_COMPILER_RANGE_FOR
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407
- /* C++0x features supported in GCC 4.7: */
-# define Q_COMPILER_EXPLICIT_OVERRIDES
-# endif
-
-# endif
-
-/* IBM compiler versions are a bit messy. There are actually two products:
- the C product, and the C++ product. The C++ compiler is always packaged
- with the latest version of the C compiler. Version numbers do not always
- match. This little table (I'm not sure it's accurate) should be helpful:
-
- C++ product C product
-
- C Set 3.1 C Compiler 3.0
- ... ...
- C++ Compiler 3.6.6 C Compiler 4.3
- ... ...
- Visual Age C++ 4.0 ...
- ... ...
- Visual Age C++ 5.0 C Compiler 5.0
- ... ...
- Visual Age C++ 6.0 C Compiler 6.0
-
- Now:
- __xlC__ is the version of the C compiler in hexadecimal notation
- is only an approximation of the C++ compiler version
- __IBMCPP__ is the version of the C++ compiler in decimal notation
- but it is not defined on older compilers like C Set 3.1 */
-#elif defined(__xlC__)
-# define Q_CC_XLC
-# define Q_FULL_TEMPLATE_INSTANTIATION
-# if __xlC__ < 0x400
-# define Q_NO_BOOL_TYPE
-# define Q_NO_EXPLICIT_KEYWORD
-# define Q_NO_USING_KEYWORD
-# define Q_OUTOFLINE_TEMPLATE inline
-# define Q_BROKEN_TEMPLATE_SPECIALIZATION
-# define Q_CANNOT_DELETE_CONSTANT
-# elif __xlC__ >= 0x0600
-# define Q_ALIGNOF(type) __alignof__(type)
-# define Q_TYPEOF(expr) __typeof__(expr)
-# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
-# define Q_PACKED __attribute__((__packed__))
-# endif
-
-/* Older versions of DEC C++ do not define __EDG__ or __EDG - observed
- on DEC C++ V5.5-004. New versions do define __EDG__ - observed on
- Compaq C++ V6.3-002.
- This compiler is different enough from other EDG compilers to handle
- it separately anyway. */
-#elif defined(__DECCXX) || defined(__DECC)
-# define Q_CC_DEC
-/* Compaq C++ V6 compilers are EDG-based but I'm not sure about older
- DEC C++ V5 compilers. */
-# if defined(__EDG__)
-# define Q_CC_EDG
-# endif
-/* Compaq have disabled EDG's _BOOL macro and use _BOOL_EXISTS instead
- - observed on Compaq C++ V6.3-002.
- In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
-# if !defined(_BOOL_EXISTS)
-# define Q_NO_BOOL_TYPE
-# endif
-/* Spurious (?) error messages observed on Compaq C++ V6.5-014. */
-# define Q_NO_USING_KEYWORD
-/* Apply to all versions prior to Compaq C++ V6.0-000 - observed on
- DEC C++ V5.5-004. */
-# if __DECCXX_VER < 60060000
-# define Q_BROKEN_TEMPLATE_SPECIALIZATION
-# define Q_CANNOT_DELETE_CONSTANT
-# endif
-/* avoid undefined symbol problems with out-of-line template members */
-# define Q_OUTOFLINE_TEMPLATE inline
-
-/* The Portland Group C++ compiler is based on EDG and does define __EDG__
- but the C compiler does not */
-#elif defined(__PGI)
-# define Q_CC_PGI
-# if defined(__EDG__)
-# define Q_CC_EDG
-# endif
-
-/* Compilers with EDG front end are similar. To detect them we test:
- __EDG documented by SGI, observed on MIPSpro 7.3.1.1 and KAI C++ 4.0b
- __EDG__ documented in EDG online docs, observed on Compaq C++ V6.3-002
- and PGI C++ 5.2-4 */
-#elif !defined(Q_OS_HPUX) && (defined(__EDG) || defined(__EDG__))
-# define Q_CC_EDG
-/* From the EDG documentation (does not seem to apply to Compaq C++):
- _BOOL
- Defined in C++ mode when bool is a keyword. The name of this
- predefined macro is specified by a configuration flag. _BOOL
- is the default.
- __BOOL_DEFINED
- Defined in Microsoft C++ mode when bool is a keyword. */
-# if !defined(_BOOL) && !defined(__BOOL_DEFINED)
-# define Q_NO_BOOL_TYPE
-# endif
-
-/* The Comeau compiler is based on EDG and does define __EDG__ */
-# if defined(__COMO__)
-# define Q_CC_COMEAU
-# define Q_C_CALLBACKS
-
-/* The `using' keyword was introduced to avoid KAI C++ warnings
- but it's now causing KAI C++ errors instead. The standard is
- unclear about the use of this keyword, and in practice every
- compiler is using its own set of rules. Forget it. */
-# elif defined(__KCC)
-# define Q_CC_KAI
-# define Q_NO_USING_KEYWORD
-
-/* Using the `using' keyword avoids Intel C++ for Linux warnings */
-# elif defined(__INTEL_COMPILER)
-# define Q_CC_INTEL
-
-/* Uses CFront, make sure to read the manual how to tweak templates. */
-# elif defined(__ghs)
-# define Q_CC_GHS
-
-# elif defined(__DCC__)
-# define Q_CC_DIAB
-# undef Q_NO_BOOL_TYPE
-# if !defined(__bool)
-# define Q_NO_BOOL_TYPE
-# endif
-
-/* The UnixWare 7 UDK compiler is based on EDG and does define __EDG__ */
-# elif defined(__USLC__) && defined(__SCO_VERSION__)
-# define Q_CC_USLC
-/* The latest UDK 7.1.1b does not need this, but previous versions do */
-# if !defined(__SCO_VERSION__) || (__SCO_VERSION__ < 302200010)
-# define Q_OUTOFLINE_TEMPLATE inline
-# endif
-# define Q_NO_USING_KEYWORD /* ### check "using" status */
-
-/* Never tested! */
-# elif defined(CENTERLINE_CLPP) || defined(OBJECTCENTER)
-# define Q_CC_OC
-# define Q_NO_USING_KEYWORD
-
-/* CDS++ defines __EDG__ although this is not documented in the Reliant
- documentation. It also follows conventions like _BOOL and this documented */
-# elif defined(sinix)
-# define Q_CC_CDS
-# define Q_NO_USING_KEYWORD
-
-/* The MIPSpro compiler defines __EDG */
-# elif defined(__sgi)
-# define Q_CC_MIPS
-# define Q_NO_USING_KEYWORD /* ### check "using" status */
-# define Q_NO_TEMPLATE_FRIENDS
-# if defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 740)
-# define Q_OUTOFLINE_TEMPLATE inline
-# pragma set woff 3624,3625,3649 /* turn off some harmless warnings */
-# endif
-# endif
-
-/* VxWorks' DIAB toolchain has an additional EDG type C++ compiler
- (see __DCC__ above). This one is for C mode files (__EDG is not defined) */
-#elif defined(_DIAB_TOOL)
-# define Q_CC_DIAB
-
-/* Never tested! */
-#elif defined(__HIGHC__)
-# define Q_CC_HIGHC
-
-#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C)
-# define Q_CC_SUN
-/* 5.0 compiler or better
- 'bool' is enabled by default but can be disabled using -features=nobool
- in which case _BOOL is not defined
- this is the default in 4.2 compatibility mode triggered by -compat=4 */
-# if __SUNPRO_CC >= 0x500
-# define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
- /* see http://developers.sun.com/sunstudio/support/Ccompare.html */
-# if __SUNPRO_CC >= 0x590
-# define Q_ALIGNOF(type) __alignof__(type)
-# define Q_TYPEOF(expr) __typeof__(expr)
-# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
-# endif
-# if __SUNPRO_CC >= 0x550
-# define Q_DECL_EXPORT __global
-# endif
-# if __SUNPRO_CC < 0x5a0
-# define Q_NO_TEMPLATE_FRIENDS
-# endif
-# if !defined(_BOOL)
-# define Q_NO_BOOL_TYPE
-# endif
-# if defined(__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT <= 4)
-# define Q_NO_USING_KEYWORD
-# endif
-# define Q_C_CALLBACKS
-/* 4.2 compiler or older */
-# else
-# define Q_NO_BOOL_TYPE
-# define Q_NO_EXPLICIT_KEYWORD
-# define Q_NO_USING_KEYWORD
-# endif
-
-/* CDS++ does not seem to define __EDG__ or __EDG according to Reliant
- documentation but nevertheless uses EDG conventions like _BOOL */
-#elif defined(sinix)
-# define Q_CC_EDG
-# define Q_CC_CDS
-# if !defined(_BOOL)
-# define Q_NO_BOOL_TYPE
-# endif
-# define Q_BROKEN_TEMPLATE_SPECIALIZATION
-
-#elif defined(Q_OS_HPUX)
-/* __HP_aCC was not defined in first aCC releases */
-# if defined(__HP_aCC) || __cplusplus >= 199707L
-# define Q_NO_TEMPLATE_FRIENDS
-# define Q_CC_HPACC
-# if __HP_aCC-0 < 060000
-# define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
-# define Q_DECL_EXPORT __declspec(dllexport)
-# define Q_DECL_IMPORT __declspec(dllimport)
-# endif
-# if __HP_aCC-0 >= 061200
-# define Q_DECL_ALIGN(n) __attribute__((aligned(n)))
-# endif
-# if __HP_aCC-0 >= 062000
-# define Q_DECL_EXPORT __attribute__((visibility("default")))
-# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
-# define Q_DECL_IMPORT Q_DECL_EXPORT
-# endif
-# else
-# define Q_CC_HP
-# define Q_NO_BOOL_TYPE
-# define Q_FULL_TEMPLATE_INSTANTIATION
-# define Q_BROKEN_TEMPLATE_SPECIALIZATION
-# define Q_NO_EXPLICIT_KEYWORD
-# endif
-# define Q_NO_USING_KEYWORD /* ### check "using" status */
-
-#else
-# error "Qt has not been tested with this compiler - see http://www.qt-project.org/"
-#endif
-
-
-#ifdef Q_CC_INTEL
-# if __INTEL_COMPILER < 1200
-# define Q_NO_TEMPLATE_FRIENDS
-# endif
-# if defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(__GXX_EXPERIMENTAL_CPP0X__)
-# if __INTEL_COMPILER >= 1200
-# define Q_COMPILER_RVALUE_REFS
-# define Q_COMPILER_EXTERN_TEMPLATES
-# define Q_COMPILER_DECLTYPE
-# define Q_COMPILER_VARIADIC_TEMPLATES
-# define Q_COMPILER_AUTO_TYPE
-# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
-# define Q_COMPILER_CLASS_ENUM
-# define Q_COMPILER_LAMBDA
-# define Q_COMPILER_STATIC_ASSERT
-# endif
-# endif
-#endif
-
-#ifdef Q_CC_CLANG
-/* General C++ features */
-# if !__has_feature(cxx_exceptions)
-# define QT_NO_EXCEPTIONS
-# endif
-# if !__has_feature(cxx_rtti)
-# define QT_NO_RTTI
-# endif
-/* C++11 features, see http://clang.llvm.org/cxx_status.html */
-# if __cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__
-# if ((__clang_major__ * 100) + __clang_minor__) >= 209 /* since clang 2.9 */
-# define Q_COMPILER_AUTO_TYPE
-# define Q_COMPILER_DECLTYPE
-# define Q_COMPILER_EXTERN_TEMPLATES
-# define Q_COMPILER_RVALUE_REFS
-# define Q_COMPILER_STATIC_ASSERT
-# define Q_COMPILER_VARIADIC_MACROS
-# define Q_COMPILER_VARIADIC_TEMPLATES
-# endif
-# if ((__clang_major__ * 100) + __clang_minor__) >= 300 /* since clang 3.0 */
-# define Q_COMPILER_CLASS_ENUM
- /* defaulted members in 3.0, deleted members in 2.9 */
-# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
-# define Q_COMPILER_EXPLICIT_OVERRIDES
-# define Q_COMPILER_NULLPTR
-# define Q_COMPILER_RANGE_FOR
-# define Q_COMPILER_UNICODE_STRINGS
-# endif
- /* not implemented in clang yet */
-# if __has_feature(cxx_constexpr)
-# define Q_COMPILER_CONSTEXPR
-# endif
-# if __has_feature(cxx_lambdas)
-# define Q_COMPILER_LAMBDA
-# endif
-# if __has_feature(cxx_generalized_initializers)
-# define Q_COMPILER_INITIALIZER_LISTS
-# endif
-# if __has_feature(cxx_unrestricted_unions)
-# define Q_COMPILER_UNRESTRICTED_UNIONS
-# endif
-# if 0
-# define Q_COMPILER_ATOMICS
-# endif
-# endif
-#endif // Q_CC_CLANG
-
#ifndef Q_PACKED
# define Q_PACKED
# undef Q_NO_PACKED_REFERENCE
@@ -847,12 +198,6 @@ namespace QT_NAMESPACE {}
# endif
#endif
-#ifndef Q_COMPILER_MANGLES_RETURN_TYPE
-# if defined(Q_CC_MSVC)
-# define Q_COMPILER_MANGLES_RETURN_TYPE
-# endif
-#endif
-
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -1118,7 +463,7 @@ typedef int QNoImplicitBoolCast;
// This logic must match the one in qmetatype.h
#if defined(QT_COORD_TYPE)
typedef QT_COORD_TYPE qreal;
-#elif defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE)
+#elif defined(QT_NO_FPU) || defined(Q_PROCESSOR_ARM) || defined(Q_OS_WINCE)
typedef float qreal;
#else
typedef double qreal;
@@ -1326,11 +671,6 @@ class QDataStream;
# define Q_DBUS_EXPORT Q_DECL_IMPORT
# endif
# define Q_TEMPLATEDLL
-# if defined(QT_BUILD_CONCURRENT_LIB)
-# define Q_CONCURRENT_EXPORT Q_DECL_EXPORT
-# else
-# define Q_CONCURRENT_EXPORT Q_DECL_IMPORT
-# endif
# elif defined(QT_DLL) /* use a Qt DLL library */
# define Q_CORE_EXPORT Q_DECL_IMPORT
# define Q_GUI_EXPORT Q_DECL_IMPORT
@@ -1352,7 +692,6 @@ class QDataStream;
# define Q_SCRIPTTOOLS_EXPORT Q_DECL_IMPORT
# define Q_COMPAT_EXPORT Q_DECL_IMPORT
# define Q_DBUS_EXPORT Q_DECL_IMPORT
-# define Q_CONCURRENT_EXPORT Q_DECL_IMPORT
# define Q_TEMPLATEDLL
# endif
# define Q_NO_DECLARED_NOT_DEFINED
@@ -1386,7 +725,6 @@ class QDataStream;
# define Q_SCRIPTTOOLS_EXPORT Q_DECL_EXPORT
# define Q_COMPAT_EXPORT Q_DECL_EXPORT
# define Q_DBUS_EXPORT Q_DECL_EXPORT
-# define Q_CONCURRENT_EXPORT Q_DECL_EXPORT
# else
# define Q_CORE_EXPORT
# define Q_GUI_EXPORT
@@ -1407,7 +745,6 @@ class QDataStream;
# define Q_SCRIPTTOOLS_EXPORT
# define Q_COMPAT_EXPORT
# define Q_DBUS_EXPORT
-# define Q_CONCURRENT_EXPORT
# endif
#endif
@@ -1647,10 +984,6 @@ inline void qUnused(T &x) { (void)x; }
class QString;
Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
-
-Q_CORE_EXPORT void qErrnoWarning(int code, const char *msg, ...);
-Q_CORE_EXPORT void qErrnoWarning(const char *msg, ...);
-
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
#if !defined(Q_ASSERT)
@@ -1687,7 +1020,7 @@ template <> class QStaticAssertFailure<true> {};
#define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
#define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
#define Q_STATIC_ASSERT(Condition) \
- enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<(Condition)>)}
+ enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
#endif
@@ -1933,122 +1266,6 @@ static inline bool qIsNull(float f)
# define Q_DUMMY_COMPARISON_OPERATOR(C)
#endif
-
-/*
- QTypeInfo - type trait functionality
- qIsDetached - data sharing functionality
-*/
-
-/*
- The catch-all template.
-*/
-
-template <typename T> inline bool qIsDetached(T &) { return true; }
-
-template <typename T>
-class QTypeInfo
-{
-public:
- enum {
- isPointer = false,
- isComplex = true,
- isStatic = true,
- isLarge = (sizeof(T)>sizeof(void*)),
- isDummy = false,
- sizeOf = sizeof(T)
- };
-};
-
-template<>
-class QTypeInfo<void>
-{
-public:
- enum {
- isPointer = false,
- isComplex = false,
- isStatic = false,
- isLarge = false,
- isDummy = false,
- sizeOf = 0
- };
-};
-
-template <typename T>
-class QTypeInfo<T*>
-{
-public:
- enum {
- isPointer = true,
- isComplex = false,
- isStatic = false,
- isLarge = false,
- isDummy = false,
- sizeOf = sizeof(T*)
- };
-};
-
-
-#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER) \
-template <typename T> class CONTAINER; \
-template <typename T> \
-class QTypeInfo< CONTAINER<T> > \
-{ \
-public: \
- enum { \
- isPointer = false, \
- isComplex = true, \
- isStatic = false, \
- isLarge = (sizeof(CONTAINER<T>) > sizeof(void*)), \
- isDummy = false, \
- sizeOf = sizeof(CONTAINER<T>) \
- }; \
-};
-
-Q_DECLARE_MOVABLE_CONTAINER(QList)
-Q_DECLARE_MOVABLE_CONTAINER(QVector)
-Q_DECLARE_MOVABLE_CONTAINER(QQueue)
-Q_DECLARE_MOVABLE_CONTAINER(QStack)
-Q_DECLARE_MOVABLE_CONTAINER(QLinkedList)
-Q_DECLARE_MOVABLE_CONTAINER(QSet)
-
-#undef Q_DECLARE_MOVABLE_CONTAINER
-
-/*
- Specialize a specific type with:
-
- Q_DECLARE_TYPEINFO(type, flags);
-
- where 'type' is the name of the type to specialize and 'flags' is
- logically-OR'ed combination of the flags below.
-*/
-enum { /* TYPEINFO flags */
- Q_COMPLEX_TYPE = 0,
- Q_PRIMITIVE_TYPE = 0x1,
- Q_STATIC_TYPE = 0,
- Q_MOVABLE_TYPE = 0x2,
- Q_DUMMY_TYPE = 0x4
-};
-
-#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \
-class QTypeInfo<TYPE > \
-{ \
-public: \
- enum { \
- isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
- isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
- isLarge = (sizeof(TYPE)>sizeof(void*)), \
- isPointer = false, \
- isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \
- sizeOf = sizeof(TYPE) \
- }; \
- static inline const char *name() { return #TYPE; } \
-}
-
-#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
-template<> \
-Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
-
-
template <typename T>
inline void qSwap(T &value1, T &value2)
{
@@ -2063,54 +1280,6 @@ inline void qSwap(T &value1, T &value2)
}
/*
- Specialize a shared type with:
-
- Q_DECLARE_SHARED(type);
-
- where 'type' is the name of the type to specialize. NOTE: shared
- types must declare a 'bool isDetached(void) const;' member for this
- to work.
-*/
-#ifdef QT_NO_STL
-#define Q_DECLARE_SHARED_STL(TYPE)
-#else
-#define Q_DECLARE_SHARED_STL(TYPE) \
-QT_END_NAMESPACE \
-namespace std { \
- template<> inline void swap<QT_PREPEND_NAMESPACE(TYPE)>(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
- { swap(value1.data_ptr(), value2.data_ptr()); } \
-} \
-QT_BEGIN_NAMESPACE
-#endif
-
-#define Q_DECLARE_SHARED(TYPE) \
-template <> inline bool qIsDetached<TYPE>(TYPE &t) { return t.isDetached(); } \
-template <> inline void qSwap<TYPE>(TYPE &value1, TYPE &value2) \
-{ qSwap(value1.data_ptr(), value2.data_ptr()); } \
-Q_DECLARE_SHARED_STL(TYPE)
-
-/*
- QTypeInfo primitive specializations
-*/
-Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(signed char, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(uchar, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(short, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(ushort, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(int, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(uint, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(long, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(ulong, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(qint64, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(quint64, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(float, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(double, Q_PRIMITIVE_TYPE);
-#ifndef Q_OS_DARWIN
-Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE);
-#endif
-
-/*
These functions make it possible to use standard C++ functions with
a similar name from Qt header files (especially template classes).
*/
@@ -2411,17 +1580,6 @@ Q_CORE_EXPORT int qrand();
#define QT_MODULE(x)
-#ifdef QT_NO_CONCURRENT
-# define QT_NO_QFUTURE
-#endif
-
-// gcc 3 version has problems with some of the
-// map/filter overloads.
-#if defined(Q_CC_GNU) && (__GNUC__ < 4)
-# define QT_NO_CONCURRENT_MAP
-# define QT_NO_CONCURRENT_FILTER
-#endif
-
#ifdef Q_OS_QNX
// QNX doesn't have SYSV style shared memory. Multiprocess QWS apps,
// shared fonts and QSystemSemaphore + QSharedMemory are not available
@@ -2429,8 +1587,6 @@ Q_CORE_EXPORT int qrand();
# define QT_NO_QWS_SHARE_FONTS
# define QT_NO_SYSTEMSEMAPHORE
# define QT_NO_SHAREDMEMORY
-// QNX currently doesn't support forking in a thread, so disable QProcess
-# define QT_NO_PROCESS
#endif
#if defined (__ELF__)
@@ -2439,6 +1595,11 @@ Q_CORE_EXPORT int qrand();
# endif
#endif
+#if !defined(QT_BOOTSTRAPPED) && defined(QT_REDUCE_RELOCATIONS) && defined(__ELF__) && !defined(__PIC__)
+# error "You must build your code with position independent code if Qt was built with -reduce-relocations. "\
+ "Compile your code with -fPIC or -fPIE."
+#endif
+
namespace QtPrivate {
//like std::enable_if
template <bool B, typename T = void> struct QEnableIf;
@@ -2449,7 +1610,9 @@ QT_END_NAMESPACE
QT_END_HEADER
// qDebug and friends
-#include "qlogging.h"
+#include <QtCore/qlogging.h>
+
+#include <QtCore/qtypeinfo.h>
#endif /* __cplusplus */
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index bc26c9b6b7..badccc947d 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -39,7 +39,21 @@
**
****************************************************************************/
-#include <qlogging.h>
+#include "qlogging.h"
+#include "qlist.h"
+#include "qbytearray.h"
+#include "qstring.h"
+#include "qvarlengtharray.h"
+#include "qdebug.h"
+#ifndef QT_BOOTSTRAPPED
+#include "qcoreapplication.h"
+#include "qthread.h"
+#endif
+#ifdef Q_OS_WINCE
+#include <qt_windows.h>
+#endif
+
+#include <stdio.h>
QT_BEGIN_NAMESPACE
@@ -73,4 +87,793 @@ QT_BEGIN_NAMESPACE
\sa QMessageLogContext, qDebug(), qWarning(), qCritical(), qFatal()
*/
+#if !defined(QT_NO_EXCEPTIONS)
+/*!
+ \internal
+ Uses a local buffer to output the message. Not locale safe + cuts off
+ everything after character 255, but will work in out of memory situations.
+*/
+static void qEmergencyOut(QtMsgType msgType, const char *msg, va_list ap)
+{
+ char emergency_buf[256] = { '\0' };
+ emergency_buf[255] = '\0';
+ if (msg)
+ qvsnprintf(emergency_buf, 255, msg, ap);
+ QMessageLogContext context;
+ qt_message_output(msgType, context, emergency_buf);
+}
+#endif
+
+/*!
+ \internal
+*/
+static void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg,
+ va_list ap)
+{
+#if !defined(QT_NO_EXCEPTIONS)
+ if (std::uncaught_exception()) {
+ qEmergencyOut(msgType, msg, ap);
+ return;
+ }
+#endif
+ QByteArray buf;
+ if (msg) {
+ QT_TRY {
+ buf = QString().vsprintf(msg, ap).toLocal8Bit();
+ } QT_CATCH(const std::bad_alloc &) {
+#if !defined(QT_NO_EXCEPTIONS)
+ qEmergencyOut(msgType, msg, ap);
+ // don't rethrow - we use qWarning and friends in destructors.
+ return;
+#endif
+ }
+ }
+ qt_message_output(msgType, context, buf.constData());
+}
+
+#undef qDebug
+/*!
+ \fn qDebug(const char *message, ...)
+ \relates <QtGlobal>
+
+ Calls the message handler with the debug message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the console, if it is a
+ console application; otherwise, it is sent to the debugger. This
+ function does nothing if \c QT_NO_DEBUG_OUTPUT was defined
+ during compilation.
+
+ If you pass the function a format string and a list of arguments,
+ it works in similar way to the C printf() function. The format
+ should be a Latin-1 string.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 24
+
+ If you include \c <QtDebug>, a more convenient syntax is also
+ available:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 25
+
+ With this syntax, the function returns a QDebug object that is
+ configured to use the QtDebugMsg message type. It automatically
+ puts a single space between each item, and outputs a newline at
+ the end. It supports many C++ and Qt types.
+
+ To suppress the output at run-time, install your own message handler
+ with qInstallMessageHandler().
+
+ \sa qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+void QMessageLogger::debug(const char *msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtDebugMsg, context, msg, ap);
+ va_end(ap);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug QMessageLogger::debug()
+{
+ QDebug dbg = QDebug(QtDebugMsg);
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.file = context.file;
+ ctxt.line = context.line;
+ ctxt.function = context.function;
+ return dbg;
+}
+
+QNoDebug QMessageLogger::noDebug()
+{
+ return QNoDebug();
+}
+
+#endif
+
+#undef qWarning
+/*!
+ \fn qWarning(const char *message, ...)
+ \relates <QtGlobal>
+
+ Calls the message handler with the warning message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger. This
+ function does nothing if \c QT_NO_WARNING_OUTPUT was defined
+ during compilation; it exits if the environment variable \c
+ QT_FATAL_WARNINGS is defined.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function. The format should be a Latin-1
+ string.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 26
+
+ If you include <QtDebug>, a more convenient syntax is
+ also available:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 27
+
+ This syntax inserts a space between each item, and
+ appends a newline at the end.
+
+ To suppress the output at runtime, install your own message handler
+ with qInstallMessageHandler().
+
+ \sa qDebug(), qCritical(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+void QMessageLogger::warning(const char *msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtWarningMsg, context, msg, ap);
+ va_end(ap);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug QMessageLogger::warning()
+{
+ QDebug dbg = QDebug(QtWarningMsg);
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.file = context.file;
+ ctxt.line = context.line;
+ ctxt.function = context.function;
+ return dbg;
+}
+#endif
+
+#undef qCritical
+/*!
+ \fn qCritical(const char *message, ...)
+ \relates <QtGlobal>
+
+ Calls the message handler with the critical message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function. The format should be a Latin-1
+ string.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 28
+
+ If you include <QtDebug>, a more convenient syntax is
+ also available:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 29
+
+ A space is inserted between the items, and a newline is
+ appended at the end.
+
+ To suppress the output at runtime, install your own message handler
+ with qInstallMessageHandler().
+
+ \sa qDebug(), qWarning(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+void QMessageLogger::critical(const char *msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtCriticalMsg, context, msg, ap);
+ va_end(ap);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug QMessageLogger::critical()
+{
+ QDebug dbg = QDebug(QtCriticalMsg);
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.file = context.file;
+ ctxt.line = context.line;
+ ctxt.function = context.function;
+ return dbg;
+}
+#endif
+
+#undef qFatal
+/*!
+ \fn qFatal(const char *message, ...)
+ \relates <QtGlobal>
+
+ Calls the message handler with the fatal message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+
+ If you are using the \bold{default message handler} this function will
+ abort on Unix systems to create a core dump. On Windows, for debug builds,
+ this function will report a _CRT_ERROR enabling you to connect a debugger
+ to the application.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 30
+
+ To suppress the output at runtime, install your own message handler
+ with qInstallMessageHandler().
+
+ \sa qDebug(), qCritical(), qWarning(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+void QMessageLogger::fatal(const char *msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtFatalMsg, context, msg, ap);
+ va_end(ap);
+}
+
+/*!
+ \internal
+*/
+Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info)
+{
+ // Strip the function info down to the base function name
+ // note that this throws away the template definitions,
+ // the parameter types (overloads) and any const/volatile qualifiers.
+
+ if (info.isEmpty())
+ return info;
+
+ int pos;
+
+ // skip trailing [with XXX] for templates (gcc)
+ pos = info.size() - 1;
+ if (info.endsWith(']')) {
+ while (--pos) {
+ if (info.at(pos) == '[')
+ info.truncate(pos);
+ }
+ }
+
+ // operator names with '(', ')', '<', '>' in it
+ static const char operator_call[] = "operator()";
+ static const char operator_lessThan[] = "operator<";
+ static const char operator_greaterThan[] = "operator>";
+ static const char operator_lessThanEqual[] = "operator<=";
+ static const char operator_greaterThanEqual[] = "operator>=";
+
+ // canonize operator names
+ info.replace("operator ", "operator");
+
+ // remove argument list
+ forever {
+ int parencount = 0;
+ pos = info.lastIndexOf(')');
+ if (pos == -1) {
+ // Don't know how to parse this function name
+ return info;
+ }
+
+ // find the beginning of the argument list
+ --pos;
+ ++parencount;
+ while (pos && parencount) {
+ if (info.at(pos) == ')')
+ ++parencount;
+ else if (info.at(pos) == '(')
+ --parencount;
+ --pos;
+ }
+ if (parencount != 0)
+ return info;
+
+ info.truncate(++pos);
+
+ if (info.at(pos - 1) == ')') {
+ if (info.indexOf(operator_call) == pos - (int)strlen(operator_call))
+ break;
+
+ // this function returns a pointer to a function
+ // and we matched the arguments of the return type's parameter list
+ // try again
+ info.remove(0, info.indexOf('('));
+ info.chop(1);
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ // find the beginning of the function name
+ int parencount = 0;
+ int templatecount = 0;
+ --pos;
+
+ // make sure special characters in operator names are kept
+ if (pos > -1) {
+ switch (info.at(pos)) {
+ case ')':
+ if (info.indexOf(operator_call) == pos - (int)strlen(operator_call) + 1)
+ pos -= 2;
+ break;
+ case '<':
+ if (info.indexOf(operator_lessThan) == pos - (int)strlen(operator_lessThan) + 1)
+ --pos;
+ break;
+ case '>':
+ if (info.indexOf(operator_greaterThan) == pos - (int)strlen(operator_greaterThan) + 1)
+ --pos;
+ break;
+ case '=': {
+ int operatorLength = (int)strlen(operator_lessThanEqual);
+ if (info.indexOf(operator_lessThanEqual) == pos - operatorLength + 1)
+ pos -= 2;
+ else if (info.indexOf(operator_greaterThanEqual) == pos - operatorLength + 1)
+ pos -= 2;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ while (pos > -1) {
+ if (parencount < 0 || templatecount < 0)
+ return info;
+
+ char c = info.at(pos);
+ if (c == ')')
+ ++parencount;
+ else if (c == '(')
+ --parencount;
+ else if (c == '>')
+ ++templatecount;
+ else if (c == '<')
+ --templatecount;
+ else if (c == ' ' && templatecount == 0 && parencount == 0)
+ break;
+
+ --pos;
+ }
+ info = info.mid(pos + 1);
+
+ // remove trailing '*', '&' that are part of the return argument
+ while ((info.at(0) == '*')
+ || (info.at(0) == '&'))
+ info = info.mid(1);
+
+ // we have the full function name now.
+ // clean up the templates
+ while ((pos = info.lastIndexOf('>')) != -1) {
+ if (!info.contains('<'))
+ break;
+
+ // find the matching close
+ int end = pos;
+ templatecount = 1;
+ --pos;
+ while (pos && templatecount) {
+ register char c = info.at(pos);
+ if (c == '>')
+ ++templatecount;
+ else if (c == '<')
+ --templatecount;
+ --pos;
+ }
+ ++pos;
+ info.remove(pos, end - pos + 1);
+ }
+
+ return info;
+}
+
+// tokens as recognized in QT_MESSAGE_PATTERN
+static const char typeTokenC[] = "%{type}";
+static const char messageTokenC[] = "%{message}";
+static const char fileTokenC[] = "%{file}";
+static const char lineTokenC[] = "%{line}";
+static const char functionTokenC[] = "%{function}";
+static const char pidTokenC[] = "%{pid}";
+static const char appnameTokenC[] = "%{appname}";
+static const char threadidTokenC[] = "%{threadid}";
+static const char emptyTokenC[] = "";
+
+struct QMessagePattern {
+ QMessagePattern();
+ ~QMessagePattern();
+
+ // 0 terminated arrays of literal tokens / literal or placeholder tokens
+ const char **literals;
+ const char **tokens;
+};
+
+QMessagePattern::QMessagePattern()
+{
+ QString pattern = QString::fromLocal8Bit(qgetenv("QT_MESSAGE_PATTERN"));
+ if (pattern.isEmpty()) {
+ pattern = QLatin1String("%{message}");
+ }
+
+ // scanner
+ QList<QString> lexemes;
+ QString lexeme;
+ bool inPlaceholder = false;
+ for (int i = 0; i < pattern.size(); ++i) {
+ const QChar c = pattern.at(i);
+ if ((c == QLatin1Char('%'))
+ && !inPlaceholder) {
+ if ((i + 1 < pattern.size())
+ && pattern.at(i + 1) == QLatin1Char('{')) {
+ // beginning of placeholder
+ if (!lexeme.isEmpty()) {
+ lexemes.append(lexeme);
+ lexeme.clear();
+ }
+ inPlaceholder = true;
+ }
+ }
+
+ lexeme.append(c);
+
+ if ((c == QLatin1Char('}') && inPlaceholder)) {
+ // end of placeholder
+ lexemes.append(lexeme);
+ lexeme.clear();
+ inPlaceholder = false;
+ }
+ }
+ if (!lexeme.isEmpty())
+ lexemes.append(lexeme);
+
+ // tokenizer
+ QVarLengthArray<const char*> literalsVar;
+ tokens = new const char*[lexemes.size() + 1];
+ tokens[lexemes.size()] = 0;
+
+ for (int i = 0; i < lexemes.size(); ++i) {
+ const QString lexeme = lexemes.at(i);
+ if (lexeme.startsWith(QLatin1String("%{"))
+ && lexeme.endsWith(QLatin1Char('}'))) {
+ // placeholder
+ if (lexeme == QLatin1String(typeTokenC)) {
+ tokens[i] = typeTokenC;
+ } else if (lexeme == QLatin1String(messageTokenC))
+ tokens[i] = messageTokenC;
+ else if (lexeme == QLatin1String(fileTokenC))
+ tokens[i] = fileTokenC;
+ else if (lexeme == QLatin1String(lineTokenC))
+ tokens[i] = lineTokenC;
+ else if (lexeme == QLatin1String(functionTokenC))
+ tokens[i] = functionTokenC;
+ else if (lexeme == QLatin1String(pidTokenC))
+ tokens[i] = pidTokenC;
+ else if (lexeme == QLatin1String(appnameTokenC))
+ tokens[i] = appnameTokenC;
+ else if (lexeme == QLatin1String(threadidTokenC))
+ tokens[i] = threadidTokenC;
+ else {
+ fprintf(stderr, "%s\n",
+ QString::fromLatin1("QT_MESSAGE_PATTERN: Unknown placeholder %1\n"
+ ).arg(lexeme).toLocal8Bit().constData());
+ fflush(stderr);
+ tokens[i] = emptyTokenC;
+ }
+ } else {
+ char *literal = new char[lexeme.size() + 1];
+ strncpy(literal, lexeme.toLocal8Bit().constData(), lexeme.size());
+ literal[lexeme.size()] = '\0';
+ literalsVar.append(literal);
+ tokens[i] = literal;
+ }
+ }
+ literals = new const char*[literalsVar.size() + 1];
+ literals[literalsVar.size()] = 0;
+ memcpy(literals, literalsVar.constData(), literalsVar.size() * sizeof(const char*));
+}
+
+QMessagePattern::~QMessagePattern()
+{
+ for (int i = 0; literals[i] != 0; ++i)
+ delete [] literals[i];
+ delete [] literals;
+ literals = 0;
+ delete [] tokens;
+ tokens = 0;
+}
+
+Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
+
+/*!
+ \internal
+*/
+Q_CORE_EXPORT QByteArray qMessageFormatString(QtMsgType type, const QMessageLogContext &context,
+ const char *str)
+{
+ QByteArray message;
+
+ QMessagePattern *pattern = qMessagePattern();
+ if (!pattern) {
+ // after destruction of static QMessagePattern instance
+ message.append(str);
+ message.append('\n');
+ return message;
+ }
+
+ // we do not convert file, function, line literals to local encoding due to overhead
+ for (int i = 0; pattern->tokens[i] != 0; ++i) {
+ const char *token = pattern->tokens[i];
+ if (token == messageTokenC) {
+ message.append(str);
+ } else if (token == typeTokenC) {
+ switch (type) {
+ case QtDebugMsg: message.append("debug"); break;
+ case QtWarningMsg: message.append("warning"); break;
+ case QtCriticalMsg:message.append("critical"); break;
+ case QtFatalMsg: message.append("fatal"); break;
+ }
+ } else if (token == fileTokenC) {
+ if (context.file)
+ message.append(context.file);
+ else
+ message.append("unknown");
+ } else if (token == lineTokenC) {
+ message.append(QByteArray::number(context.line));
+ } else if (token == functionTokenC) {
+ if (context.function)
+ message.append(qCleanupFuncinfo(context.function));
+ else
+ message.append("unknown");
+#ifndef QT_BOOTSTRAPPED
+ } else if (token == pidTokenC) {
+ message.append(QByteArray::number(QCoreApplication::applicationPid()));
+ } else if (token == appnameTokenC) {
+ message.append(QCoreApplication::applicationName().toUtf8().constData());
+ } else if (token == threadidTokenC) {
+ message.append("0x" + QByteArray::number(qlonglong(QThread::currentThread()->currentThread()), 16));
+#endif
+ } else {
+ message.append(token);
+ }
+ }
+ message.append('\n');
+ return message;
+}
+
+static QtMsgHandler msgHandler = 0; // pointer to debug handler (without context)
+static QMessageHandler messageHandler = 0; // pointer to debug handler (with context)
+
+/*!
+ \internal
+*/
+static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &context,
+ const char *buf)
+{
+ QByteArray logMessage = qMessageFormatString(type, context, buf);
+#if defined(Q_OS_WINCE)
+ QString fstr = QString::fromLocal8Bit(logMessage);
+ OutputDebugString(reinterpret_cast<const wchar_t *> (fstr.utf16()));
+#else
+ fprintf(stderr, "%s", logMessage.constData());
+ fflush(stderr);
+#endif
+}
+
+/*!
+ \internal
+*/
+static void qDefaultMsgHandler(QtMsgType type, const char *buf)
+{
+ QMessageLogContext emptyContext;
+ qDefaultMessageHandler(type, emptyContext, buf);
+}
+
+/*!
+ \internal
+*/
+void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const char *buf)
+{
+ if (!msgHandler)
+ msgHandler = qDefaultMsgHandler;
+ if (!messageHandler)
+ messageHandler = qDefaultMessageHandler;
+
+ // prefer new message handler over the old one
+ if (msgHandler == qDefaultMsgHandler
+ || messageHandler != qDefaultMessageHandler) {
+ (*messageHandler)(msgType, context, buf);
+ } else {
+ (*msgHandler)(msgType, buf);
+ }
+
+ if (msgType == QtFatalMsg
+ || (msgType == QtWarningMsg
+ && (!qgetenv("QT_FATAL_WARNINGS").isNull())) ) {
+
+#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
+ // get the current report mode
+ int reportMode = _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
+ _CrtSetReportMode(_CRT_ERROR, reportMode);
+#if !defined(Q_OS_WINCE)
+ int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf);
+#else
+ int ret = _CrtDbgReportW(_CRT_ERROR, _CRT_WIDE(__FILE__),
+ __LINE__, _CRT_WIDE(QT_VERSION_STR),
+ reinterpret_cast<const wchar_t *> (
+ QString::fromLatin1(buf).utf16()));
+#endif
+ if (ret == 0 && reportMode & _CRTDBG_MODE_WNDW)
+ return; // ignore
+ else if (ret == 1)
+ _CrtDbgBreak();
+#endif
+
+#if (defined(Q_OS_UNIX) || defined(Q_CC_MINGW))
+ abort(); // trap; generates core dump
+#else
+ exit(1); // goodbye cruel world
+#endif
+ }
+}
+
+void qErrnoWarning(const char *msg, ...)
+{
+ // qt_error_string() will allocate anyway, so we don't have
+ // to be careful here (like we do in plain qWarning())
+ QString buf;
+ va_list ap;
+ va_start(ap, msg);
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
+ qt_error_string(-1).toLocal8Bit().constData());
+}
+
+void qErrnoWarning(int code, const char *msg, ...)
+{
+ // qt_error_string() will allocate anyway, so we don't have
+ // to be careful here (like we do in plain qWarning())
+ QString buf;
+ va_list ap;
+ va_start(ap, msg);
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
+ qt_error_string(code).toLocal8Bit().constData());
+}
+
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+extern bool usingWinMain;
+extern Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str);
+extern Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context,
+ const char *str);
+#endif
+
+/*!
+ \typedef QtMsgHandler
+ \relates <QtGlobal>
+ \deprecated
+
+ This is a typedef for a pointer to a function with the following
+ signature:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
+
+ This typedef is deprecated, you should use QMessageHandler instead.
+ \sa QtMsgType, QMessageHandler, qInstallMsgHandler(), qInstallMessageHandler()
+*/
+
+/*!
+ \typedef QMessageHandler
+ \relates <QtGlobal>
+ \since 5.0
+
+ This is a typedef for a pointer to a function with the following
+ signature:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 49
+
+ \sa QtMsgType, qInstallMessageHandler()
+*/
+
+/*!
+ \fn QMessageHandler qInstallMessageHandler(QMessageHandler handler)
+ \relates <QtGlobal>
+ \since 5.0
+
+ Installs a Qt message \a handler which has been defined
+ previously. Returns a pointer to the previous message handler
+ (which may be 0).
+
+ The message handler is a function that prints out debug messages,
+ warnings, critical and fatal error messages. The Qt library (debug
+ mode) contains hundreds of warning messages that are printed
+ when internal errors (usually invalid function arguments)
+ occur. Qt built in release mode also contains such warnings unless
+ QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
+ compilation. If you implement your own message handler, you get total
+ control of these messages.
+
+ The default message handler prints the message to the standard
+ output under X11 or to the debugger under Windows. If it is a
+ fatal message, the application aborts immediately.
+
+ Only one message handler can be defined, since this is usually
+ done on an application-wide basis to control debug output.
+
+ To restore the message handler, call \c qInstallMessageHandler(0).
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
+
+ \sa qDebug(), qWarning(), qCritical(), qFatal(), QtMsgType,
+ {Debugging Techniques}
+*/
+
+QMessageHandler qInstallMessageHandler(QMessageHandler h)
+{
+ if (!messageHandler)
+ messageHandler = qDefaultMessageHandler;
+ QMessageHandler old = messageHandler;
+ messageHandler = h;
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+ if (!messageHandler && usingWinMain)
+ messageHandler = qWinMessageHandler;
+#endif
+ return old;
+}
+
+/*!
+ \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
+ \relates <QtGlobal>
+ \deprecated
+
+ Installs a Qt message \a handler which has been defined
+ previously. This method is deprecated, use qInstallMessageHandler
+ instead.
+ \sa QtMsgHandler, qInstallMessageHandler
+*/
+
+QtMsgHandler qInstallMsgHandler(QtMsgHandler h)
+{
+ //if handler is 0, set it to the
+ //default message handler
+ if (!msgHandler)
+ msgHandler = qDefaultMsgHandler;
+ QtMsgHandler old = msgHandler;
+ msgHandler = h;
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+ if (!msgHandler && usingWinMain)
+ msgHandler = qWinMsgHandler;
+#endif
+ return old;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/global/qlogging.h b/src/corelib/global/qlogging.h
index c6edc7bc48..4de04bdc33 100644
--- a/src/corelib/global/qlogging.h
+++ b/src/corelib/global/qlogging.h
@@ -67,8 +67,9 @@ class QMessageLogContext
Q_DISABLE_COPY(QMessageLogContext)
public:
QMessageLogContext() : version(1), line(0), file(0), function(0) {}
- Q_DECL_CONSTEXPR QMessageLogContext(const char *file, int line, const char *function)
- : version(1), line(line), file(file), function(function) {}
+ Q_DECL_CONSTEXPR QMessageLogContext(const char *fileName, int lineNumber,
+ const char *functionName)
+ : version(1), line(lineNumber), file(fileName), function(functionName) {}
int version;
int line;
@@ -126,8 +127,6 @@ private:
QMessageLogContext context;
};
-Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &context, const char *buf);
-
/*
qDebug, qWarning, qCritical, qFatal are redefined to automatically include context information
*/
@@ -139,15 +138,20 @@ Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &contex
#define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug
#define QT_NO_QWARNING_MACRO while (false) QMessageLogger().noDebug
-#ifdef QT_NO_DEBUG_OUTPUT
+#if defined(QT_NO_DEBUG_OUTPUT)
# undef qDebug
# define qDebug QT_NO_QDEBUG_MACRO
#endif
-#ifdef QT_NO_WARNING_OUTPUT
+#if defined(QT_NO_WARNING_OUTPUT)
# undef qWarning
# define qWarning QT_NO_QWARNING_MACRO
#endif
+Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &context, const char *buf);
+
+Q_CORE_EXPORT void qErrnoWarning(int code, const char *msg, ...);
+Q_CORE_EXPORT void qErrnoWarning(const char *msg, ...);
+
// deprecated. Use qInstallMessageHandler instead!
typedef void (*QtMsgHandler)(QtMsgType, const char *);
Q_CORE_EXPORT QtMsgHandler qInstallMsgHandler(QtMsgHandler);
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index efb4985645..2087d763de 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -184,6 +184,7 @@ public:
ExtraButton22 = 0x01000000,
ExtraButton23 = 0x02000000,
ExtraButton24 = 0x04000000,
+ AllButtons = 0x07ffffff,
MaxMouseButton = ExtraButton24,
// 4 high-order bits remain available for future use (0x08000000 through 0x40000000).
MouseButtonMask = 0xffffffff
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index ae395a2dfa..d50960f68b 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -172,18 +172,64 @@
This enum type describes the different mouse buttons.
\value NoButton The button state does not refer to any
- button (see QMouseEvent::button()).
+ button (see QMouseEvent::button()).
+
+ \value AllButtons This value corresponds to a mask of all
+ possible mouse buttons. Use to set the 'acceptedButtons'
+ property of a mouseArea to accept ALL mouse buttons.
+
\value LeftButton The left button is pressed, or an event refers
- to the left button. (The left button may be the right button on
- left-handed mice.)
+ to the left button. (The left button may be the right button on
+ left-handed mice.)
\value RightButton The right button.
\value MidButton The middle button.
\value MiddleButton The middle button.
- \value XButton1 The first X button.
- \value XButton2 The second X button.
+ \value BackButton The 'Back' button. (Typically present on
+ the 'thumb' side of a mouse with extra buttons. This is NOT
+ the tilt wheel.)
+ \value XButton1 The 'Back' Button.
+ \value ExtraButton1 The 'Back' Button.
+
+ \value ForwardButton The 'Forward' Button. (Typically present
+ beside the 'Back' button, and also pressed by the thumb.)
+ \value XButton2 The 'Forward Button.
+ \value ExtraButton2 The 'Forward' Button.
+
+ \value TaskButton The 'Task' Button.
+ \value ExtraButton3 The 'Task' Button.
+
+ \value ExtraButton4 The 7th non-wheel Mouse Button.
+ \value ExtraButton5 The 8th non-wheel Mouse Button.
+ \value ExtraButton6 The 9th non-wheel Mouse Button.
+ \value ExtraButton7 The 10th non-wheel Mouse Button.
+ \value ExtraButton8 The 11th non-wheel Mouse Button.
+ \value ExtraButton9 The 12th non-wheel Mouse Button.
+ \value ExtraButton10 The 13th non-wheel Mouse Button.
+ \value ExtraButton11 The 14th non-wheel Mouse Button.
+ \value ExtraButton12 The 15th non-wheel Mouse Button.
+ \value ExtraButton13 The 16th non-wheel Mouse Button.
+ \value ExtraButton14 The 17th non-wheel Mouse Button.
+ \value ExtraButton15 The 18th non-wheel Mouse Button.
+ \value ExtraButton16 The 19th non-wheel Mouse Button.
+ \value ExtraButton17 The 20th non-wheel Mouse Button.
+ \value ExtraButton18 The 21st non-wheel Mouse Button.
+ \value ExtraButton19 The 22nd non-wheel Mouse Button.
+ \value ExtraButton20 The 23rd non-wheel Mouse Button.
+ \value ExtraButton21 The 24th non-wheel Mouse Button.
+ \value ExtraButton22 The 25th non-wheel Mouse Button.
+ \value ExtraButton23 The 26th non-wheel Mouse Button.
+ \value ExtraButton44 The 27th non-wheel Mouse Button.
+
+ \omitvalue MaxMouseButton
\omitvalue MouseButtonMask
+ \note Some models of multi-button mice are pre-configured with
+ high-numbered Buttons emulating keyboard sequences, for use in
+ specific games. In order for these Buttons to be seen as
+ actual 'Mouse Buttons', the device must be re-configured (using
+ the vendor's configuration tool).
+
\sa KeyboardModifier Modifier
*/
@@ -462,20 +508,20 @@
delivery at a later time.
\value AutoConnection
- (default) If the signal is emitted from a different thread than the
- receiving object, the signal is queued, behaving as
- Qt::QueuedConnection. Otherwise, the slot is invoked directly,
- behaving as Qt::DirectConnection. The type of connection is
- determined when the signal is emitted.
+ (default) If the signal is emitted from a different thread than the
+ receiving object, the signal is queued, behaving as
+ Qt::QueuedConnection. Otherwise, the slot is invoked directly,
+ behaving as Qt::DirectConnection. The type of connection is
+ determined when the signal is emitted.
\value DirectConnection
- The slot is invoked immediately, when the signal is
- emitted.
+ The slot is invoked immediately, when the signal is
+ emitted.
\value QueuedConnection
- The slot is invoked when control returns to the event loop
- of the receiver's thread. The slot is executed in the
- receiver's thread.
+ The slot is invoked when control returns to the event loop
+ of the receiver's thread. The slot is executed in the
+ receiver's thread.
\value BlockingQueuedConnection
Same as QueuedConnection, except the current thread blocks
@@ -486,17 +532,17 @@
\value UniqueConnection
Same as AutoConnection, but the connection is made only if
- it does not duplicate an existing connection. i.e., if the
- same signal is already connected to the same slot for the
- same pair of objects, then the connection will fail. This
- connection type was introduced in Qt 4.6.
+ it does not duplicate an existing connection. i.e., if the
+ same signal is already connected to the same slot for the
+ same pair of objects, then the connection will fail. This
+ connection type was introduced in Qt 4.6.
\value AutoCompatConnection
- The default type when Qt 3 support is enabled. Same as
- AutoConnection but will also cause warnings to be output in
- certain situations. See \l{Porting to Qt 4#Compatibility
- Signals and Slots}{Compatibility Signals and Slots} for
- further information.
+ The default type when Qt 3 support is enabled. Same as
+ AutoConnection but will also cause warnings to be output in
+ certain situations. See \l{Porting to Qt 4#Compatibility
+ Signals and Slots}{Compatibility Signals and Slots} for
+ further information.
With queued connections, the parameters must be of types that are
known to Qt's meta-object system, because Qt needs to copy the
@@ -510,7 +556,7 @@
When using signals and slots with multiple threads, see \l{Signals and Slots Across Threads}.
- \sa {Thread Support in Qt}, QObject::connect(), qRegisterMetaType()
+ \sa {Thread Support in Qt}, QObject::connect(), qRegisterMetaType(), Q_DECLARE_METATYPE()
*/
/*!
@@ -2137,9 +2183,9 @@
should be taken over by the target application,
i.e., the source application should not delete
the data.
- \br
- On X11 this value is used to do a move.
- \br
+ \br
+ On X11 this value is used to do a move.
+ \br
TargetMoveAction is not used on the Mac.
*/
diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h
new file mode 100644
index 0000000000..fd02f0e4c5
--- /dev/null
+++ b/src/corelib/global/qprocessordetection.h
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPROCESSORDETECTION_H
+#define QPROCESSORDETECTION_H
+
+/*
+ This file uses preprocessor #defines to set various Q_PROCESSOR_* #defines
+ based on the following patterns:
+
+ Q_PROCESSOR_{FAMILY}
+ Q_PROCESSOR_{FAMILY}_{VARIANT}
+ Q_PROCESSOR_{FAMILY}_{REVISION}
+
+ The first is always defined. Defines for the various revisions/variants are
+ optional and usually dependent on how the compiler was invoked. Variants
+ that are a superset of another should have a define for the superset.
+*/
+
+/*
+ Alpha family, no revisions or variants
+*/
+// #elif defined(__alpha__) || defined(_M_ALPHA)
+// # define Q_PROCESSOR_ALPHA
+
+/*
+ ARM family, known revisions: V5, V6, and V7
+*/
+#if defined(__arm__) || defined(__TARGET_ARCH_ARM)
+# define Q_PROCESSOR_ARM
+# if defined(__ARM_ARCH_7__) \
+ || defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_7R__) \
+ || defined(__ARM_ARCH_7M__) \
+ || (__TARGET_ARCH_ARM-0 >= 7)
+# define Q_PROCESSOR_ARM_V7
+# define Q_PROCESSOR_ARM_V6
+# define Q_PROCESSOR_ARM_V5
+# elif defined(__ARM_ARCH_6__) \
+ || defined(__ARM_ARCH_6J__) \
+ || defined(__ARM_ARCH_6T2__) \
+ || defined(__ARM_ARCH_6Z__) \
+ || defined(__ARM_ARCH_6K__) \
+ || defined(__ARM_ARCH_6ZK__) \
+ || defined(__ARM_ARCH_6M__) \
+ || (__TARGET_ARCH_ARM-0 >= 6)
+# define Q_PROCESSOR_ARM_V6
+# define Q_PROCESSOR_ARM_V5
+# elif defined(__ARM_ARCH_5TEJ__) \
+ || (__TARGET_ARCH_ARM-0 >= 5)
+# define Q_PROCESSOR_ARM_V5
+# endif
+
+/*
+ AVR32 family, no revisions or variants
+*/
+// #elif defined(__avr32__)
+// # define Q_PROCESSOR_AVR32
+
+/*
+ Blackfin family, no revisions or variants
+*/
+// #elif defined(__bfin__)
+// # define Q_PROCESSOR_BLACKFIN
+
+/*
+ X86 family, known variants: 32- and 64-bit
+*/
+#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
+# define Q_PROCESSOR_X86
+# define Q_PROCESSOR_X86_32
+#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
+# define Q_PROCESSOR_X86
+# define Q_PROCESSOR_X86_64
+
+/*
+ Itanium (IA-64) family, no revisions or variants
+*/
+#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+# define Q_PROCESSOR_IA64
+
+/*
+ MIPS family, known revisions: I, II, III, IV, 32, 64
+*/
+#elif defined(__mips) || defined(__mips__) || defined(_M_MRX000)
+# define Q_PROCESSOR_MIPS
+# if defined(_MIPS_ARCH_MIPS1) || (defined(__mips) && __mips - 0 >= 1)
+# define Q_PROCESSOR_MIPS_I
+# endif
+# if defined(_MIPS_ARCH_MIPS2) || (defined(__mips) && __mips - 0 >= 2)
+# define Q_PROCESSOR_MIPS_II
+# endif
+# if defined(_MIPS_ARCH_MIPS32) || defined(__mips32)
+# define Q_PROCESSOR_MIPS_32
+# endif
+# if defined(_MIPS_ARCH_MIPS3) || (defined(__mips) && __mips - 0 >= 3)
+# define Q_PROCESSOR_MIPS_III
+# endif
+# if defined(_MIPS_ARCH_MIPS4) || (defined(__mips) && __mips - 0 >= 4)
+# define Q_PROCESSOR_MIPS_IV
+# endif
+# if defined(_MIPS_ARCH_MIPS5) || (defined(__mips) && __mips - 0 >= 5)
+# define Q_PROCESSOR_MIPS_V
+# endif
+# if defined(_MIPS_ARCH_MIPS64) || defined(__mips64)
+# define Q_PROCESSOR_MIPS_64
+# endif
+
+/*
+ Power family, known variants: 32- and 64-bit
+
+ There are many more known variants/revisions that we do not handle/detect.
+ See http://en.wikipedia.org/wiki/Power_Architecture
+ and http://en.wikipedia.org/wiki/File:PowerISA-evolution.svg
+*/
+#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \
+ || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \
+ || defined(_M_MPPC) || defined(_M_PPC)
+# define Q_PROCESSOR_POWER
+# if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
+# define Q_PROCESSOR_POWER_64
+# else
+# define Q_PROCESSOR_POWER_32
+# endif
+
+/*
+ S390 family, known variant: S390X (64-bit)
+*/
+// #elif defined(__s390__)
+// # define Q_PROCESSOR_S390
+// # if defined(__s390x__)
+// # define Q_PROCESSOR_S390_X
+// # endif
+
+/*
+ SuperH family, optional revision: SH-4A
+*/
+// #elif defined(__sh__)
+// # define Q_PROCESSOR_SH
+// # if defined(__sh4a__)
+// # define Q_PROCESSOR_SH_4A
+// # endif
+
+/*
+ SPARC family, optional revision: V9
+*/
+// #elif defined(__sparc__)
+// # define Q_PROCESSOR_SPARC
+// # if defined(__sparc_v9__)
+// # define Q_PROCESSOR_SPARC_V9
+// # endif
+
+#endif
+
+#endif // QPROCESSORDETECTION_H
diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h
new file mode 100644
index 0000000000..0228bc9404
--- /dev/null
+++ b/src/corelib/global/qsystemdetection.h
@@ -0,0 +1,208 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSYSTEMDETECTION_H
+#define QSYSTEMDETECTION_H
+
+/*
+ The operating system, must be one of: (Q_OS_x)
+
+ DARWIN - Darwin OS (synonym for Q_OS_MAC)
+ MSDOS - MS-DOS and Windows
+ OS2 - OS/2
+ OS2EMX - XFree86 on OS/2 (not PM)
+ WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
+ WINCE - WinCE (Windows CE 5.0)
+ CYGWIN - Cygwin
+ SOLARIS - Sun Solaris
+ HPUX - HP-UX
+ ULTRIX - DEC Ultrix
+ LINUX - Linux
+ FREEBSD - FreeBSD
+ NETBSD - NetBSD
+ OPENBSD - OpenBSD
+ BSDI - BSD/OS
+ IRIX - SGI Irix
+ OSF - HP Tru64 UNIX
+ SCO - SCO OpenServer 5
+ UNIXWARE - UnixWare 7, Open UNIX 8
+ AIX - AIX
+ HURD - GNU Hurd
+ DGUX - DG/UX
+ RELIANT - Reliant UNIX
+ DYNIX - DYNIX/ptx
+ QNX - QNX
+ QNX6 - QNX RTP 6.1
+ LYNX - LynxOS
+ BSD4 - Any BSD 4.4 system
+ UNIX - Any UNIX BSD/SYSV system
+*/
+
+#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
+# define Q_OS_DARWIN
+# define Q_OS_BSD4
+# ifdef __LP64__
+# define Q_OS_DARWIN64
+# else
+# define Q_OS_DARWIN32
+# endif
+#elif defined(__CYGWIN__)
+# define Q_OS_CYGWIN
+#elif !defined(SAG_COM) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
+# define Q_OS_WIN32
+# define Q_OS_WIN64
+#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
+# if defined(WINCE) || defined(_WIN32_WCE)
+# define Q_OS_WINCE
+# else
+# define Q_OS_WIN32
+# endif
+#elif defined(__sun) || defined(sun)
+# define Q_OS_SOLARIS
+#elif defined(hpux) || defined(__hpux)
+# define Q_OS_HPUX
+#elif defined(__ultrix) || defined(ultrix)
+# define Q_OS_ULTRIX
+#elif defined(sinix)
+# define Q_OS_RELIANT
+#elif defined(__native_client__)
+# define Q_OS_NACL
+#elif defined(__linux__) || defined(__linux)
+# define Q_OS_LINUX
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
+# define Q_OS_FREEBSD
+# define Q_OS_BSD4
+#elif defined(__NetBSD__)
+# define Q_OS_NETBSD
+# define Q_OS_BSD4
+#elif defined(__OpenBSD__)
+# define Q_OS_OPENBSD
+# define Q_OS_BSD4
+#elif defined(__bsdi__)
+# define Q_OS_BSDI
+# define Q_OS_BSD4
+#elif defined(__sgi)
+# define Q_OS_IRIX
+#elif defined(__osf__)
+# define Q_OS_OSF
+#elif defined(_AIX)
+# define Q_OS_AIX
+#elif defined(__Lynx__)
+# define Q_OS_LYNX
+#elif defined(__GNU__)
+# define Q_OS_HURD
+#elif defined(__DGUX__)
+# define Q_OS_DGUX
+#elif defined(__QNXNTO__)
+# define Q_OS_QNX
+#elif defined(_SEQUENT_)
+# define Q_OS_DYNIX
+#elif defined(_SCO_DS) /* SCO OpenServer 5 + GCC */
+# define Q_OS_SCO
+#elif defined(__USLC__) /* all SCO platforms + UDK or OUDK */
+# define Q_OS_UNIXWARE
+#elif defined(__svr4__) && defined(i386) /* Open UNIX 8 + GCC */
+# define Q_OS_UNIXWARE
+#elif defined(__INTEGRITY)
+# define Q_OS_INTEGRITY
+#elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
+# define Q_OS_VXWORKS
+#elif defined(__MAKEDEPEND__)
+#else
+# error "Qt has not been ported to this OS - see http://www.qt-project.org/"
+#endif
+
+#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) || defined(Q_OS_WINCE)
+# define Q_OS_WIN
+#endif
+
+#if defined(Q_OS_DARWIN)
+# define Q_OS_MAC
+# define Q_OS_MACX /* Q_OS_MACX is only for compatibility.*/
+# if defined(Q_OS_DARWIN64)
+# define Q_OS_MAC64
+# elif defined(Q_OS_DARWIN32)
+# define Q_OS_MAC32
+# endif
+#endif
+
+#if defined(Q_OS_WIN)
+# undef Q_OS_UNIX
+#elif !defined(Q_OS_UNIX)
+# define Q_OS_UNIX
+#endif
+
+#ifdef Q_OS_DARWIN
+# ifdef MAC_OS_X_VERSION_MIN_REQUIRED
+# undef MAC_OS_X_VERSION_MIN_REQUIRED
+# endif
+# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_4
+# include <AvailabilityMacros.h>
+# if !defined(MAC_OS_X_VERSION_10_3)
+# define MAC_OS_X_VERSION_10_3 MAC_OS_X_VERSION_10_2 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_4)
+# define MAC_OS_X_VERSION_10_4 MAC_OS_X_VERSION_10_3 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_5)
+# define MAC_OS_X_VERSION_10_5 MAC_OS_X_VERSION_10_4 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_6)
+# define MAC_OS_X_VERSION_10_6 MAC_OS_X_VERSION_10_5 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_7)
+# define MAC_OS_X_VERSION_10_7 MAC_OS_X_VERSION_10_6 + 1
+# endif
+# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_7)
+# warning "This version of Mac OS X is unsupported"
+# endif
+#endif
+
+#ifdef __LSB_VERSION__
+# if __LSB_VERSION__ < 40
+# error "This version of the Linux Standard Base is unsupported"
+# endif
+#ifndef QT_LINUXBASE
+# define QT_LINUXBASE
+#endif
+#endif
+
+#endif // QSYSTEMDETECTION_H
diff --git a/src/corelib/global/qt_windows.h b/src/corelib/global/qt_windows.h
index e4af46d939..a63185b5a5 100644
--- a/src/corelib/global/qt_windows.h
+++ b/src/corelib/global/qt_windows.h
@@ -149,6 +149,6 @@
#ifndef LR_SHARED
#define LR_SHARED 0
#endif
-#endif // Q_WS_WINCE
+#endif // Q_OS_WINCE
#endif // QT_WINDOWS_H
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
new file mode 100644
index 0000000000..6297b35b9c
--- /dev/null
+++ b/src/corelib/global/qtypeinfo.h
@@ -0,0 +1,216 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTYPEINFO_H
+#define QTYPEINFO_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+/*
+ QTypeInfo - type trait functionality
+ qIsDetached - data sharing functionality
+*/
+
+/*
+ The catch-all template.
+*/
+
+template <typename T> inline bool qIsDetached(T &) { return true; }
+
+template <typename T>
+class QTypeInfo
+{
+public:
+ enum {
+ isPointer = false,
+ isComplex = true,
+ isStatic = true,
+ isLarge = (sizeof(T)>sizeof(void*)),
+ isDummy = false,
+ sizeOf = sizeof(T)
+ };
+};
+
+template<>
+class QTypeInfo<void>
+{
+public:
+ enum {
+ isPointer = false,
+ isComplex = false,
+ isStatic = false,
+ isLarge = false,
+ isDummy = false,
+ sizeOf = 0
+ };
+};
+
+template <typename T>
+class QTypeInfo<T*>
+{
+public:
+ enum {
+ isPointer = true,
+ isComplex = false,
+ isStatic = false,
+ isLarge = false,
+ isDummy = false,
+ sizeOf = sizeof(T*)
+ };
+};
+
+
+#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER) \
+template <typename T> class CONTAINER; \
+template <typename T> \
+class QTypeInfo< CONTAINER<T> > \
+{ \
+public: \
+ enum { \
+ isPointer = false, \
+ isComplex = true, \
+ isStatic = false, \
+ isLarge = (sizeof(CONTAINER<T>) > sizeof(void*)), \
+ isDummy = false, \
+ sizeOf = sizeof(CONTAINER<T>) \
+ }; \
+};
+
+Q_DECLARE_MOVABLE_CONTAINER(QList)
+Q_DECLARE_MOVABLE_CONTAINER(QVector)
+Q_DECLARE_MOVABLE_CONTAINER(QQueue)
+Q_DECLARE_MOVABLE_CONTAINER(QStack)
+Q_DECLARE_MOVABLE_CONTAINER(QLinkedList)
+Q_DECLARE_MOVABLE_CONTAINER(QSet)
+
+#undef Q_DECLARE_MOVABLE_CONTAINER
+
+/*
+ Specialize a specific type with:
+
+ Q_DECLARE_TYPEINFO(type, flags);
+
+ where 'type' is the name of the type to specialize and 'flags' is
+ logically-OR'ed combination of the flags below.
+*/
+enum { /* TYPEINFO flags */
+ Q_COMPLEX_TYPE = 0,
+ Q_PRIMITIVE_TYPE = 0x1,
+ Q_STATIC_TYPE = 0,
+ Q_MOVABLE_TYPE = 0x2,
+ Q_DUMMY_TYPE = 0x4
+};
+
+#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \
+class QTypeInfo<TYPE > \
+{ \
+public: \
+ enum { \
+ isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
+ isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
+ isLarge = (sizeof(TYPE)>sizeof(void*)), \
+ isPointer = false, \
+ isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \
+ sizeOf = sizeof(TYPE) \
+ }; \
+ static inline const char *name() { return #TYPE; } \
+}
+
+#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
+template<> \
+Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
+
+
+/*
+ Specialize a shared type with:
+
+ Q_DECLARE_SHARED(type);
+
+ where 'type' is the name of the type to specialize. NOTE: shared
+ types must declare a 'bool isDetached(void) const;' member for this
+ to work.
+*/
+#ifdef QT_NO_STL
+#define Q_DECLARE_SHARED_STL(TYPE)
+#else
+#define Q_DECLARE_SHARED_STL(TYPE) \
+QT_END_NAMESPACE \
+namespace std { \
+ template<> inline void swap<QT_PREPEND_NAMESPACE(TYPE)>(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
+ { swap(value1.data_ptr(), value2.data_ptr()); } \
+} \
+QT_BEGIN_NAMESPACE
+#endif
+
+#define Q_DECLARE_SHARED(TYPE) \
+template <> inline bool qIsDetached<TYPE>(TYPE &t) { return t.isDetached(); } \
+template <> inline void qSwap<TYPE>(TYPE &value1, TYPE &value2) \
+{ qSwap(value1.data_ptr(), value2.data_ptr()); } \
+Q_DECLARE_SHARED_STL(TYPE)
+
+/*
+ QTypeInfo primitive specializations
+*/
+Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(signed char, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(uchar, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(short, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(ushort, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(int, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(uint, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(long, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(ulong, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(qint64, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(quint64, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(float, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(double, Q_PRIMITIVE_TYPE);
+#ifndef Q_OS_DARWIN
+Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE);
+#endif
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif // QTYPEINFO_H
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index e8a41b2d76..2df862e360 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -76,8 +76,6 @@ win32 {
SOURCES += io/qfilesystemwatcher_win.cpp
HEADERS += io/qfilesystemwatcher_win_p.h
- HEADERS += io/qwindowspipereader_p.h
- SOURCES += io/qwindowspipereader.cpp
HEADERS += io/qwindowspipewriter_p.h
SOURCES += io/qwindowspipewriter.cpp
SOURCES += io/qfilesystemengine_win.cpp
@@ -88,10 +86,12 @@ win32 {
SOURCES += io/qprocess_wince.cpp
} else {
HEADERS += \
- io/qwinoverlappedionotifier_p.h
+ io/qwinoverlappedionotifier_p.h \
+ io/qwindowspipereader_p.h
SOURCES += \
io/qprocess_win.cpp \
- io/qwinoverlappedionotifier.cpp
+ io/qwinoverlappedionotifier.cpp \
+ io/qwindowspipereader.cpp
}
} else:unix|integrity {
SOURCES += \
@@ -106,6 +106,8 @@ win32 {
}
macx-*: {
SOURCES += io/qstandardpaths_mac.cpp
+ } else:standardpathsjson {
+ SOURCES += io/qstandardpaths_json.cpp
} else {
SOURCES += io/qstandardpaths_unix.cpp
}
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index afd6620e65..220fc43b92 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -861,19 +861,28 @@ bool QDir::cd(const QString &dirName)
if (isAbsolutePath(dirName)) {
newPath = cleanPath(dirName);
} else {
- if (isRoot()) {
- if (dirName == QLatin1String(".."))
- return false;
+ if (isRoot())
newPath = d->dirEntry.filePath();
- } else {
+ else
newPath = d->dirEntry.filePath() % QLatin1Char('/');
- }
-
newPath += dirName;
if (dirName.indexOf(QLatin1Char('/')) >= 0
|| dirName == QLatin1String("..")
|| d->dirEntry.filePath() == QLatin1String(".")) {
newPath = cleanPath(newPath);
+#if defined (Q_OS_UNIX)
+ //After cleanPath() if path is "/.." or starts with "/../" it means trying to cd above root.
+ if (newPath.startsWith(QLatin1String("/../")) || newPath == QLatin1String("/.."))
+#else
+ /*
+ cleanPath() already took care of replacing '\' with '/'.
+ We can't use startsWith here because the letter of the drive is unknown.
+ After cleanPath() if path is "[A-Z]:/.." or starts with "[A-Z]:/../" it means trying to cd above root.
+ */
+
+ if (newPath.midRef(1, 4) == QLatin1String(":/..") && (newPath.length() == 5 || newPath.at(5) == QLatin1Char('/')))
+#endif
+ return false;
/*
If newPath starts with .., we convert it to absolute to
avoid infinite looping on
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index d7308c710d..58935fad3b 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -130,6 +130,13 @@ QFilePrivate::openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handl
#endif
}
+QAbstractFileEngine *QFilePrivate::engine() const
+{
+ if (!fileEngine)
+ fileEngine = QAbstractFileEngine::create(fileName);
+ return fileEngine;
+}
+
inline bool QFilePrivate::ensureFlushed() const
{
// This function ensures that the write buffer has been flushed (const
@@ -424,7 +431,8 @@ QFile::~QFile()
*/
QString QFile::fileName() const
{
- return fileEngine()->fileName(QAbstractFileEngine::DefaultName);
+ Q_D(const QFile);
+ return d->engine()->fileName(QAbstractFileEngine::DefaultName);
}
/*!
@@ -569,8 +577,9 @@ QFile::setDecodingFunction(DecoderFn f)
bool
QFile::exists() const
{
+ Q_D(const QFile);
// 0x1000000 = QAbstractFileEngine::Refresh, forcing an update
- return (fileEngine()->fileFlags(QAbstractFileEngine::FlagsMask
+ return (d->engine()->fileFlags(QAbstractFileEngine::FlagsMask
| QAbstractFileEngine::FileFlag(0x1000000)) & QAbstractFileEngine::ExistsFlag);
}
@@ -608,7 +617,8 @@ QFile::exists(const QString &fileName)
QString
QFile::readLink() const
{
- return fileEngine()->fileName(QAbstractFileEngine::LinkName);
+ Q_D(const QFile);
+ return d->engine()->fileName(QAbstractFileEngine::LinkName);
}
/*!
@@ -654,7 +664,7 @@ QFile::remove()
unsetError();
close();
if(error() == QFile::NoError) {
- if(fileEngine()->remove()) {
+ if (d->engine()->remove()) {
unsetError();
return true;
}
@@ -709,7 +719,7 @@ QFile::rename(const QString &newName)
unsetError();
close();
if(error() == QFile::NoError) {
- if (fileEngine()->rename(newName)) {
+ if (d->engine()->rename(newName)) {
unsetError();
// engine was able to handle the new name so we just reset it
d->fileEngine->setFileName(newName);
@@ -806,7 +816,7 @@ QFile::link(const QString &linkName)
return false;
}
QFileInfo fi(linkName);
- if(fileEngine()->link(fi.absoluteFilePath())) {
+ if (d->engine()->link(fi.absoluteFilePath())) {
unsetError();
return true;
}
@@ -861,7 +871,7 @@ QFile::copy(const QString &newName)
unsetError();
close();
if(error() == QFile::NoError) {
- if(fileEngine()->copy(newName)) {
+ if (d->engine()->copy(newName)) {
unsetError();
return true;
} else {
@@ -996,7 +1006,7 @@ bool QFile::open(OpenMode mode)
}
// QIODevice provides the buffering, so there's no need to request it from the file engine.
- if (fileEngine()->open(mode | QIODevice::Unbuffered)) {
+ if (d->engine()->open(mode | QIODevice::Unbuffered)) {
QIODevice::open(mode);
if (mode & Append)
seek(size());
@@ -1271,7 +1281,7 @@ QFile::handle() const
uchar *QFile::map(qint64 offset, qint64 size, MemoryMapFlags flags)
{
Q_D(QFile);
- if (fileEngine()
+ if (d->engine()
&& d->fileEngine->supportsExtension(QAbstractFileEngine::MapExtension)) {
unsetError();
uchar *address = d->fileEngine->map(offset, size, flags);
@@ -1293,7 +1303,7 @@ uchar *QFile::map(qint64 offset, qint64 size, MemoryMapFlags flags)
bool QFile::unmap(uchar *address)
{
Q_D(QFile);
- if (fileEngine()
+ if (d->engine()
&& d->fileEngine->supportsExtension(QAbstractFileEngine::UnMapExtension)) {
unsetError();
bool success = d->fileEngine->unmap(address);
@@ -1320,7 +1330,7 @@ QFile::resize(qint64 sz)
Q_D(QFile);
if (!d->ensureFlushed())
return false;
- fileEngine();
+ d->engine();
if (isOpen() && d->fileEngine->pos() > sz)
seek(sz);
if(d->fileEngine->setSize(sz)) {
@@ -1360,7 +1370,8 @@ QFile::resize(const QString &fileName, qint64 sz)
QFile::Permissions
QFile::permissions() const
{
- QAbstractFileEngine::FileFlags perms = fileEngine()->fileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask;
+ Q_D(const QFile);
+ QAbstractFileEngine::FileFlags perms = d->engine()->fileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask;
return QFile::Permissions((int)perms); //ewww
}
@@ -1389,7 +1400,7 @@ bool
QFile::setPermissions(Permissions permissions)
{
Q_D(QFile);
- if(fileEngine()->setPermissions(permissions)) {
+ if (d->engine()->setPermissions(permissions)) {
unsetError();
return true;
}
@@ -1490,7 +1501,7 @@ qint64 QFile::size() const
Q_D(const QFile);
if (!d->ensureFlushed())
return 0;
- d->cachedSize = fileEngine()->size();
+ d->cachedSize = d->engine()->size();
return d->cachedSize;
}
@@ -1731,18 +1742,6 @@ QFile::writeData(const char *data, qint64 len)
}
/*!
- \internal
- Returns the QIOEngine for this QFile object.
-*/
-QAbstractFileEngine *QFile::fileEngine() const
-{
- Q_D(const QFile);
- if(!d->fileEngine)
- d->fileEngine = QAbstractFileEngine::create(d->fileName);
- return d->fileEngine;
-}
-
-/*!
Returns the file error status.
The I/O device status returns an error code. For example, if open()
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h
index bc278cf600..bf7290dda2 100644
--- a/src/corelib/io/qfile.h
+++ b/src/corelib/io/qfile.h
@@ -54,8 +54,7 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-
-class QAbstractFileEngine;
+class QTemporaryFile;
class QFilePrivate;
class Q_CORE_EXPORT QFile : public QIODevice
@@ -174,8 +173,6 @@ public:
uchar *map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions);
bool unmap(uchar *address);
- virtual QAbstractFileEngine *fileEngine() const;
-
protected:
#ifdef QT_NO_QOBJECT
QFile(QFilePrivate &dd);
@@ -188,6 +185,7 @@ protected:
qint64 readLineData(char *data, qint64 maxlen);
private:
+ friend class QTemporaryFile;
Q_DISABLE_COPY(QFile)
};
diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h
index b932627ec0..4a637d44a8 100644
--- a/src/corelib/io/qfile_p.h
+++ b/src/corelib/io/qfile_p.h
@@ -59,9 +59,12 @@
QT_BEGIN_NAMESPACE
+class QTemporaryFile;
+
class QFilePrivate : public QIODevicePrivate
{
Q_DECLARE_PUBLIC(QFile)
+ friend class QTemporaryFile;
protected:
QFilePrivate();
@@ -70,6 +73,8 @@ protected:
bool openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags);
bool openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags);
+ virtual QAbstractFileEngine *engine() const;
+
QString fileName;
mutable QAbstractFileEngine *fileEngine;
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 7277a7a0e4..a7fb0fb6c7 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -918,6 +918,29 @@ bool QFileInfo::isHidden() const
}
/*!
+ \since 5.0
+ Returns true if the file path can be used directly with native APIs.
+ Returns false if the file is otherwise supported by a virtual file system
+ inside Qt, such as \l{the Qt Resource System}.
+
+ \bold{Note:} Native paths may still require conversion of path separators
+ and character encoding, depending on platform and input requirements of the
+ native API.
+
+ \sa QDir::toNativeSeparators(), QFile::encodeName(), filePath(),
+ absoluteFilePath(), canonicalFilePath()
+*/
+bool QFileInfo::isNativePath() const
+{
+ Q_D(const QFileInfo);
+ if (d->isDefaultConstructed)
+ return false;
+ if (d->fileEngine == 0)
+ return true;
+ return d->getFileFlags(QAbstractFileEngine::LocalDiskFlag);
+}
+
+/*!
Returns true if this object points to a file or to a symbolic
link to a file. Returns false if the
object points to something which isn't a file, such as a directory.
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index bc9b057fb5..0f43ebd439 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -103,6 +103,7 @@ public:
bool isWritable() const;
bool isExecutable() const;
bool isHidden() const;
+ bool isNativePath() const;
bool isRelative() const;
inline bool isAbsolute() const { return !isRelative(); }
diff --git a/src/corelib/io/qfilesystemengine_p.h b/src/corelib/io/qfilesystemengine_p.h
index 6d60d77c33..17413d9c76 100644
--- a/src/corelib/io/qfilesystemengine_p.h
+++ b/src/corelib/io/qfilesystemengine_p.h
@@ -63,7 +63,14 @@ QT_BEGIN_NAMESPACE
class QFileSystemEngine
{
public:
- static bool isCaseSensitive();
+ static bool isCaseSensitive()
+ {
+#ifndef Q_OS_WIN
+ return true;
+#else
+ return false;
+#endif
+ }
static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 52621eb23f..8d08bb5944 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -87,11 +87,6 @@ static inline bool _q_isMacHidden(const char *nativePath)
}
#endif
-bool QFileSystemEngine::isCaseSensitive()
-{
- return true;
-}
-
//static
QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data)
{
@@ -174,7 +169,7 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
if (entry.isEmpty() || entry.isRoot())
return entry;
-#if !defined(Q_OS_MAC) && _POSIX_VERSION < 200809L
+#if !defined(Q_OS_MAC) && !defined(Q_OS_QNX) && _POSIX_VERSION < 200809L
// realpath(X,0) is not supported
Q_UNUSED(data);
return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath()));
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
index 6ebaadad7e..b04018ca0f 100644
--- a/src/corelib/io/qfilesystemengine_win.cpp
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -472,11 +472,6 @@ void QFileSystemEngine::clearWinStatData(QFileSystemMetaData &data)
data.lastWriteTime_ = FILETIME();
}
-bool QFileSystemEngine::isCaseSensitive()
-{
- return false;
-}
-
//static
QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
QFileSystemMetaData &data)
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 0ad1a91d6c..3d9391ebaa 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -118,7 +118,7 @@ void debugBinaryString(const char *data, qint64 maxlen)
*/
QIODevicePrivate::QIODevicePrivate()
: openMode(QIODevice::NotOpen), buffer(QIODEVICE_BUFFERSIZE),
- pos(0), devicePos(0)
+ pos(0), devicePos(0), seqDumpPos(0)
, pPos(&pos), pDevicePos(&devicePos)
, baseReadLineDataCalled(false)
, firstRead(true)
@@ -562,6 +562,7 @@ void QIODevice::close()
d->openMode = NotOpen;
d->errorString.clear();
d->pos = 0;
+ d->seqDumpPos = 0;
d->buffer.clear();
d->firstRead = true;
}
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 0a0097c887..7a81313fa0 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -520,6 +520,11 @@ void QProcessPrivate::Channel::clear()
setWorkingDirectory(). By default, processes are run in the
current working directory of the calling process.
+ \note On QNX, setting the working directory may cause all
+ application threads, with the exception of the QProcess caller
+ thread, to temporarily freeze during the spawning process,
+ owing to a limitation in the operating system.
+
\section1 Synchronous Process API
QProcess provides a set of functions which allow it to be used
@@ -1433,6 +1438,9 @@ QString QProcess::workingDirectory() const
process in this directory. The default behavior is to start the
process in the working directory of the calling process.
+ \note On QNX, this may cause all application threads to
+ temporarily freeze.
+
\sa workingDirectory(), start()
*/
void QProcess::setWorkingDirectory(const QString &dir)
@@ -1755,7 +1763,7 @@ void QProcess::setProcessState(ProcessState state)
exit().
\warning This function is called by QProcess on Unix and Mac OS X
- only. On Windows, it is not called.
+ only. On Windows and QNX, it is not called.
*/
void QProcess::setupChildProcess()
{
@@ -2149,6 +2157,9 @@ int QProcess::execute(const QString &program)
The process will be started in the directory \a workingDirectory.
+ \note On QNX, this may cause all application threads to
+ temporarily freeze.
+
If the function is successful then *\a pid is set to the process
identifier of the started process.
*/
diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h
index 236e716b34..311b5ce845 100644
--- a/src/corelib/io/qprocess_p.h
+++ b/src/corelib/io/qprocess_p.h
@@ -304,8 +304,10 @@ public:
#endif
void startProcess();
-#if defined(Q_OS_UNIX)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_QNX)
void execChild(const char *workingDirectory, char **path, char **argv, char **envp);
+#elif defined(Q_OS_QNX)
+ pid_t spawnChild(const char *workingDirectory, char **argv, char **envp);
#endif
bool processStarted();
void terminateProcess();
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 9e35978c77..2da2913c6f 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -48,6 +48,7 @@
#include "qstring.h"
#include <ctype.h>
+
/*
Returns a human readable representation of the first \a len
characters in \a data.
@@ -105,6 +106,10 @@ QT_END_NAMESPACE
#include <errno.h>
#include <stdlib.h>
#include <string.h>
+#ifdef Q_OS_QNX
+#include <spawn.h>
+#include <sys/neutrino.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -538,16 +543,6 @@ static char **_q_dupEnvironment(const QProcessEnvironmentPrivate::Hash &environm
return envp;
}
-// under QNX RTOS we have to use vfork() when multithreading
-inline pid_t qt_fork()
-{
-#if defined(Q_OS_QNX)
- return vfork();
-#else
- return fork();
-#endif
-}
-
void QProcessPrivate::startProcess()
{
Q_Q(QProcess);
@@ -664,8 +659,12 @@ void QProcessPrivate::startProcess()
// Start the process manager, and fork off the child process.
processManager()->lock();
- pid_t childPid = qt_fork();
+#if defined(Q_OS_QNX)
+ pid_t childPid = spawnChild(workingDirPtr, argv, envp);
+#else
+ pid_t childPid = fork();
int lastForkErrno = errno;
+#endif
if (childPid != 0) {
// Clean up duplicated memory.
free(dupProgramName);
@@ -679,10 +678,22 @@ void QProcessPrivate::startProcess()
delete [] envp;
delete [] path;
}
+
+ // This is not a valid check under QNX, because the semantics are
+ // different. While under other platforms where fork() may succeed and exec() can still fail,
+ // causing the childPid to hold a valid value (and thus evaluating the
+ // following if to false), and then signaling the error via
+ // childStartedPipe, under QNX on the other hand, spawn() return value will be assigned
+ // to childPid (which will be -1 in case of failure). This will force
+ // QProcess to cleanup, instead of signaling the error via
+ // childStartedPipe. Since it will invalidade the pipes, functions like
+ // QProcess::waitForStarted() will fail, for childStartedPipe will be
+ // '-1' and mess with the select() calls.
+#if !defined(Q_OS_QNX)
if (childPid < 0) {
// Cleanup, report error and return
#if defined (QPROCESS_DEBUG)
- qDebug("qt_fork failed: %s", qPrintable(qt_error_string(lastForkErrno)));
+ qDebug("fork failed: %s", qPrintable(qt_error_string(lastForkErrno)));
#endif
processManager()->unlock();
q->setProcessState(QProcess::NotRunning);
@@ -698,6 +709,7 @@ void QProcessPrivate::startProcess()
execChild(workingDirPtr, path, argv, envp);
::_exit(-1);
}
+#endif
// Register the child. In the mean time, we can get a SIGCHLD, so we need
// to keep the lock held to avoid a race to catch the child.
@@ -735,6 +747,87 @@ void QProcessPrivate::startProcess()
::fcntl(stderrChannel.pipe[0], F_SETFL, ::fcntl(stderrChannel.pipe[0], F_GETFL) | O_NONBLOCK);
}
+#if defined(Q_OS_QNX)
+static pid_t doSpawn(int fd_count, int fd_map[], char **argv, char **envp,
+ const char *workingDir, bool spawn_detached)
+{
+ // A multi threaded QNX Process can't fork so we call spawn() instead.
+
+ struct inheritance inherit;
+ memset(&inherit, 0, sizeof(inherit));
+ inherit.flags |= SPAWN_SETSID;
+ inherit.flags |= SPAWN_CHECK_SCRIPT;
+ if (spawn_detached)
+ inherit.flags |= SPAWN_NOZOMBIE;
+ inherit.flags |= SPAWN_SETSIGDEF;
+ sigaddset(&inherit.sigdefault, SIGPIPE); // reset the signal that we ignored
+
+ // enter the working directory
+ const char *oldWorkingDir = 0;
+ char buff[PATH_MAX + 1];
+
+ if (workingDir) {
+ //we need to freeze everyone in order to avoid race conditions with //chdir().
+ if (ThreadCtl(_NTO_TCTL_THREADS_HOLD, 0) == -1)
+ qWarning("ThreadCtl(): cannot hold threads: %s", qPrintable(qt_error_string(errno)));
+
+ oldWorkingDir = QT_GETCWD(buff, PATH_MAX + 1);
+ QT_CHDIR(workingDir);
+ }
+
+ pid_t childPid;
+ EINTR_LOOP(childPid, ::spawn(argv[0], fd_count, fd_map, &inherit, argv, envp));
+ if (childPid == -1) {
+ inherit.flags |= SPAWN_SEARCH_PATH;
+ EINTR_LOOP(childPid, ::spawn(argv[0], fd_count, fd_map, &inherit, argv, envp));
+ }
+
+ if (oldWorkingDir) {
+ QT_CHDIR(oldWorkingDir);
+
+ if (ThreadCtl(_NTO_TCTL_THREADS_CONT, 0) == -1)
+ qFatal("ThreadCtl(): cannot resume threads: %s", qPrintable(qt_error_string(errno)));
+ }
+
+ return childPid;
+}
+
+pid_t QProcessPrivate::spawnChild(const char *workingDir, char **argv, char **envp)
+{
+ const int fd_count = 3;
+ int fd_map[fd_count];
+ switch (processChannelMode) {
+ case QProcess::ForwardedChannels:
+ fd_map[0] = stdinChannel.pipe[0];
+ fd_map[1] = QT_FILENO(stdout);
+ fd_map[2] = QT_FILENO(stderr);
+ break;
+ case QProcess::MergedChannels:
+ fd_map[0] = stdinChannel.pipe[0];
+ fd_map[1] = stdoutChannel.pipe[1];
+ fd_map[2] = stdoutChannel.pipe[1];
+ break;
+ case QProcess::SeparateChannels:
+ fd_map[0] = stdinChannel.pipe[0];
+ fd_map[1] = stdoutChannel.pipe[1];
+ fd_map[2] = stderrChannel.pipe[1];
+ break;
+ }
+
+ pid_t childPid = doSpawn(fd_count, fd_map, argv, envp, workingDir, false);
+
+ if (childPid == -1) {
+ QString error = qt_error_string(errno);
+ qt_safe_write(childStartedPipe[1], error.data(), error.length() * sizeof(QChar));
+ qt_safe_close(childStartedPipe[1]);
+ childStartedPipe[1] = -1;
+ }
+
+ return childPid;
+}
+
+#else
+
void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv, char **envp)
{
::signal(SIGPIPE, SIG_DFL); // reset the signal that we ignored
@@ -797,6 +890,7 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
qt_safe_close(childStartedPipe[1]);
childStartedPipe[1] = -1;
}
+#endif
bool QProcessPrivate::processStarted()
{
@@ -1213,6 +1307,42 @@ void QProcessPrivate::_q_notified()
{
}
+#if defined(Q_OS_QNX)
+bool QProcessPrivate::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)
+{
+ const int fd_count = 3;
+ int fd_map[fd_count] = { QT_FILENO(stdin), QT_FILENO(stdout), QT_FILENO(stderr) };
+
+ QList<QByteArray> enc_args;
+ enc_args.append(QFile::encodeName(program));
+ for (int i = 0; i < arguments.size(); ++i)
+ enc_args.append(arguments.at(i).toLocal8Bit());
+
+ const int argc = enc_args.size();
+ QScopedArrayPointer<char*> raw_argv(new char*[argc + 1]);
+ for (int i = 0; i < argc; ++i)
+ raw_argv[i] = const_cast<char *>(enc_args.at(i).data());
+ raw_argv[argc] = 0;
+
+ char **envp = 0; // inherit environment
+
+ // Encode the working directory if it's non-empty, otherwise just pass 0.
+ const char *workingDirPtr = 0;
+ QByteArray encodedWorkingDirectory;
+ if (!workingDirectory.isEmpty()) {
+ encodedWorkingDirectory = QFile::encodeName(workingDirectory);
+ workingDirPtr = encodedWorkingDirectory.constData();
+ }
+
+ pid_t childPid = doSpawn(fd_count, fd_map, raw_argv.data(), envp, workingDirPtr, true);
+ if (pid && childPid != -1)
+ *pid = childPid;
+
+ return childPid != -1;
+}
+
+#else
+
bool QProcessPrivate::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)
{
processManager()->start();
@@ -1226,7 +1356,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
int pidPipe[2];
qt_safe_pipe(pidPipe);
- pid_t childPid = qt_fork();
+ pid_t childPid = fork();
if (childPid == 0) {
struct sigaction noaction;
memset(&noaction, 0, sizeof(noaction));
@@ -1238,7 +1368,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
qt_safe_close(startedPipe[0]);
qt_safe_close(pidPipe[0]);
- pid_t doubleForkPid = qt_fork();
+ pid_t doubleForkPid = fork();
if (doubleForkPid == 0) {
qt_safe_close(pidPipe[1]);
@@ -1326,6 +1456,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
qt_safe_close(pidPipe[0]);
return success;
}
+#endif
void QProcessPrivate::initializeProcessManager()
{
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp
index 51f34a61a6..a52fd46c97 100644
--- a/src/corelib/io/qprocess_win.cpp
+++ b/src/corelib/io/qprocess_win.cpp
@@ -85,10 +85,13 @@ static void qt_create_pipe(Q_PIPE *pipe, bool isInputPipe)
// ### Replace the call to qrand() with a secure version, once we have it in Qt.
swprintf(pipeName, L"\\\\.\\pipe\\qt-%X", qrand());
+ DWORD dwPipeFlags = PIPE_TYPE_BYTE | PIPE_WAIT;
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
+ dwPipeFlags |= PIPE_REJECT_REMOTE_CLIENTS;
const DWORD dwPipeBufferSize = 1024 * 1024;
hRead = CreateNamedPipe(pipeName,
PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
- PIPE_TYPE_BYTE | PIPE_WAIT | PIPE_REJECT_REMOTE_CLIENTS,
+ dwPipeFlags,
1, // only one pipe instance
0, // output buffer size
dwPipeBufferSize, // input buffer size
diff --git a/src/corelib/io/qprocess_wince.cpp b/src/corelib/io/qprocess_wince.cpp
index 8ae1d11c80..88d5a71657 100644
--- a/src/corelib/io/qprocess_wince.cpp
+++ b/src/corelib/io/qprocess_wince.cpp
@@ -41,6 +41,7 @@
#include "qprocess.h"
#include "qprocess_p.h"
+#include "qwindowspipewriter_p.h"
#include <qdir.h>
#include <qfileinfo.h>
@@ -48,6 +49,7 @@
#include <qtimer.h>
#include <qwineventnotifier.h>
#include <qdebug.h>
+#include <private/qthread_p.h>
#ifndef QT_NO_PROCESS
diff --git a/src/corelib/io/qstandardpaths_json.cpp b/src/corelib/io/qstandardpaths_json.cpp
new file mode 100644
index 0000000000..52b194bea8
--- /dev/null
+++ b/src/corelib/io/qstandardpaths_json.cpp
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qstandardpaths.h"
+
+#include <QRegExp>
+#include <QString>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonValue>
+#include <QFile>
+#include <QDir>
+#include <QAtomicPointer>
+
+#ifndef QT_NO_STANDARDPATHS
+
+QT_BEGIN_NAMESPACE
+
+class QStandardPathsPrivate {
+public:
+ QStandardPathsPrivate() : object(0){}
+ ~QStandardPathsPrivate() { delete object.load(); }
+ QAtomicPointer<QJsonObject> object;
+};
+
+Q_GLOBAL_STATIC(QStandardPathsPrivate, configCache);
+
+QString QStandardPaths::writableLocation(StandardLocation type)
+{
+ switch (type) {
+ case HomeLocation:
+ return QDir::homePath(); // set $HOME
+ case TempLocation:
+ return QDir::tempPath(); // set $TMPDIR
+ default:
+ break;
+ }
+
+ QJsonObject * localConfigObject = configCache()->object.loadAcquire();
+ if (localConfigObject == 0) {
+ QString configHome = QFile::decodeName(qgetenv("PATH_CONFIG_HOME"));
+ if (configHome.isEmpty())
+ configHome = QLatin1String("/etc/user-dirs.json");
+ QFile file(configHome);
+ if (file.open(QIODevice::ReadOnly)) {
+ QJsonDocument configDoc = QJsonDocument::fromJson(file.readAll());
+ if (configDoc.isNull())
+ return QString();
+
+ QJsonObject myConfigObject = configDoc.object();
+ localConfigObject = new QJsonObject(myConfigObject);
+ if (!configCache()->object.testAndSetRelease(0, localConfigObject)) {
+ delete localConfigObject;
+ localConfigObject = configCache()->object.loadAcquire();
+ }
+ } else {
+ return QString();
+ }
+ }
+
+ QLatin1String key("");
+
+ switch (type) {
+ case DocumentsLocation:
+ key = QLatin1String("DOCUMENTS");
+ break;
+ case PicturesLocation:
+ key = QLatin1String("PICTURES");
+ break;
+ case MusicLocation:
+ key = QLatin1String("MUSIC");
+ break;
+ case MoviesLocation:
+ key = QLatin1String("VIDEOS");
+ break;
+ case DownloadLocation:
+ key = QLatin1String("DOWNLOAD");
+ break;
+ case ApplicationsLocation:
+ key = QLatin1String("APPLICATIONS");
+ break;
+ case CacheLocation:
+ key = QLatin1String("CACHE");
+ break;
+ case GenericCacheLocation:
+ key = QLatin1String("GENERIC_CACHE");
+ break;
+ case DataLocation:
+ key = QLatin1String("DATA");
+ break;
+ case GenericDataLocation:
+ key = QLatin1String("GENERIC_DATA");
+ break;
+ case ConfigLocation:
+ key = QLatin1String("CONFIG");
+ break;
+ case RuntimeLocation:
+ key = QLatin1String("RUNTIME");
+ break;
+ case DesktopLocation:
+ key = QLatin1String("DESKTOP");
+ break;
+ case FontsLocation:
+ key = QLatin1String("FONTS");
+ break;
+
+ default:
+ return QString();
+ }
+
+ QJsonObject::const_iterator iter = localConfigObject->constFind(key);
+ if (iter == localConfigObject->constEnd() || ! iter.value().isString())
+ return QString();
+ QString value = iter.value().toString();
+
+ // optimize for a common case
+ value.replace(QLatin1String("${HOME}"), QFile::decodeName(qgetenv("HOME")));
+
+ // Do ${} format environment variable substitution if necessary
+ if (!value.isEmpty() && value.contains(QLatin1String("${"))) {
+ QRegExp varRegExp(QLatin1String("\\$\\{([^\\}]*)\\}"));
+ while (value.contains(varRegExp)) {
+ QString replacement =
+ QFile::decodeName(qgetenv(varRegExp.cap(1).toAscii().data()));
+ value.replace(varRegExp.cap(0), replacement);
+ }
+ }
+ return value;
+}
+
+QStringList QStandardPaths::standardLocations(StandardLocation type)
+{
+ QStringList dirs;
+ const QString localDir = writableLocation(type);
+ dirs.prepend(localDir);
+ return dirs;
+}
+
+QString QStandardPaths::displayName(StandardLocation type)
+{
+ Q_UNUSED(type);
+ return QString();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_STANDARDPATHS
diff --git a/src/corelib/io/qstandardpaths_unix.cpp b/src/corelib/io/qstandardpaths_unix.cpp
index 6057c26e0d..62c846738e 100644
--- a/src/corelib/io/qstandardpaths_unix.cpp
+++ b/src/corelib/io/qstandardpaths_unix.cpp
@@ -137,7 +137,7 @@ QString QStandardPaths::writableLocation(StandardLocation type)
if (xdgConfigHome.isEmpty())
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
QFile file(xdgConfigHome + QLatin1String("/user-dirs.dirs"));
- if (file.exists() && file.open(QIODevice::ReadOnly)) {
+ if (file.open(QIODevice::ReadOnly)) {
QHash<QString, QString> lines;
QTextStream stream(&file);
// Only look for lines like: XDG_DESKTOP_DIR="$HOME/Desktop"
diff --git a/src/corelib/io/qstandardpaths_win.cpp b/src/corelib/io/qstandardpaths_win.cpp
index 310b1eb40d..848dd448eb 100644
--- a/src/corelib/io/qstandardpaths_win.cpp
+++ b/src/corelib/io/qstandardpaths_win.cpp
@@ -51,7 +51,6 @@
#if !defined(Q_OS_WINCE)
# include <intshcut.h>
#else
-# include <qguifunctions_wince.h>
# if !defined(STANDARDSHELL_UI_MODEL)
# include <winx.h>
# endif
@@ -177,7 +176,7 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
// type-specific handling goes here
-#ifndef Q_WS_WINCE
+#ifndef Q_OS_WINCE
static GetSpecialFolderPath SHGetSpecialFolderPath = resolveGetSpecialFolderPath();
if (SHGetSpecialFolderPath) {
wchar_t path[MAX_PATH];
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index 53a48609e5..f8cd2e780e 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -52,9 +52,8 @@
#endif
#include <stdlib.h> // mkdtemp
-#ifdef Q_OS_WIN
-#include <private/qfsfileengine_p.h>
-#include <qt_windows.h>
+#if defined(Q_OS_QNX) || defined(Q_OS_WIN)
+#include <private/qfilesystemengine_p.h>
#endif
QT_BEGIN_NAMESPACE
@@ -95,7 +94,7 @@ static QString defaultTemplateName()
return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
}
-#ifdef Q_OS_QNX
+#if defined(Q_OS_QNX ) || defined(Q_OS_WIN)
static char *mkdtemp(char *templateName)
{
static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
@@ -123,33 +122,26 @@ static char *mkdtemp(char *templateName)
v /= 62;
XXXXXX[5] = letters[v % 62];
- if (!mkdir(templateName, 0700))
+ QString templateNameStr = QFile::decodeName(templateName);
+
+ QFileSystemEntry fileSystemEntry(templateNameStr);
+ if (QFileSystemEngine::createDirectory(fileSystemEntry, false)) {
+ QSystemError error;
+ QFileSystemEngine::setPermissions(fileSystemEntry,
+ QFile::ReadOwner |
+ QFile::WriteOwner |
+ QFile::ExeOwner, error);
+ if (error.error() != 0)
+ continue;
return templateName;
+ }
}
-
return 0;
}
#endif
void QTemporaryDirPrivate::create(const QString &templateName)
{
-#ifdef Q_OS_WIN
- QString buffer = templateName;
- // Windows' mktemp believes 26 temp files per process ought to be enough for everyone (!)
- // Let's add a few random chars then, before the XXXXXX template.
- for (int i = 0 ; i < 4 ; ++i)
- buffer += QChar((qrand() & 0xffff) % (26) + 'A');
- if (!buffer.endsWith(QLatin1String("XXXXXX")))
- buffer += QLatin1String("XXXXXX");
- QFileSystemEntry baseEntry(buffer);
- QFileSystemEntry::NativePath basePath = baseEntry.nativeFilePath();
- wchar_t* array = (wchar_t*)basePath.utf16();
- if (_wmktemp(array) && ::CreateDirectory(array, 0)) {
- success = true;
- QFileSystemEntry entry(QString::fromWCharArray(array), QFileSystemEntry::FromNativePath());
- path = entry.filePath();
- }
-#else
QByteArray buffer = QFile::encodeName(templateName);
if (!buffer.endsWith("XXXXXX"))
buffer += "XXXXXX";
@@ -157,7 +149,6 @@ void QTemporaryDirPrivate::create(const QString &templateName)
success = true;
path = QFile::decodeName(buffer.constData());
}
-#endif
}
//************* QTemporaryDir
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index b80ba6eee1..75681dadff 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -407,6 +407,8 @@ protected:
QTemporaryFilePrivate();
~QTemporaryFilePrivate();
+ QAbstractFileEngine *engine() const;
+
bool autoRemove;
QString templateName;
};
@@ -419,6 +421,17 @@ QTemporaryFilePrivate::~QTemporaryFilePrivate()
{
}
+QAbstractFileEngine *QTemporaryFilePrivate::engine() const
+{
+ if (!fileEngine) {
+ if (fileName.isEmpty())
+ fileEngine = new QTemporaryFileEngine(templateName);
+ else
+ fileEngine = new QTemporaryFileEngine(fileName, false);
+ }
+ return fileEngine;
+}
+
static QString defaultTemplateName()
{
QString baseName;
@@ -640,7 +653,7 @@ QString QTemporaryFile::fileName() const
Q_D(const QTemporaryFile);
if(d->fileName.isEmpty())
return QString();
- return fileEngine()->fileName(QAbstractFileEngine::DefaultName);
+ return d->engine()->fileName(QAbstractFileEngine::DefaultName);
}
/*!
@@ -692,7 +705,7 @@ void QTemporaryFile::setFileTemplate(const QString &name)
*/
QTemporaryFile *QTemporaryFile::createLocalFile(QFile &file)
{
- if (QAbstractFileEngine *engine = file.fileEngine()) {
+ if (QAbstractFileEngine *engine = file.d_func()->engine()) {
if(engine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::LocalDiskFlag)
return 0; //local already
//cache
@@ -726,22 +739,6 @@ QTemporaryFile *QTemporaryFile::createLocalFile(QFile &file)
}
/*!
- \internal
-*/
-
-QAbstractFileEngine *QTemporaryFile::fileEngine() const
-{
- Q_D(const QTemporaryFile);
- if(!d->fileEngine) {
- if (d->fileName.isEmpty())
- d->fileEngine = new QTemporaryFileEngine(d->templateName);
- else
- d->fileEngine = new QTemporaryFileEngine(d->fileName, false);
- }
- return d->fileEngine;
-}
-
-/*!
\reimp
Creates a unique file name for the temporary file, and opens it. You can
@@ -752,7 +749,7 @@ bool QTemporaryFile::open(OpenMode flags)
{
Q_D(QTemporaryFile);
if (!d->fileName.isEmpty()) {
- if (static_cast<QTemporaryFileEngine*>(fileEngine())->isReallyOpen()) {
+ if (static_cast<QTemporaryFileEngine*>(d->engine())->isReallyOpen()) {
setOpenMode(flags);
return true;
}
diff --git a/src/corelib/io/qtemporaryfile.h b/src/corelib/io/qtemporaryfile.h
index 8b14e5a14a..e766569293 100644
--- a/src/corelib/io/qtemporaryfile.h
+++ b/src/corelib/io/qtemporaryfile.h
@@ -88,8 +88,6 @@ public:
{ QFile file(fileName); return createLocalFile(file); }
static QTemporaryFile *createLocalFile(QFile &file);
- virtual QAbstractFileEngine *fileEngine() const;
-
protected:
bool open(OpenMode flags);
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index 7f37866226..a6d58c760f 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -66,11 +66,6 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 1
- Note that you cannot use QTextStream::atEnd(), which returns true when you
- have reached the end of the data stream, with stdin. The reason for this is
- that as long as stdin doesn't give any input to the QTextStream, \c atEnd()
- will return true even if the stdin is open and waiting for more characters.
-
Besides using QTextStream's constructors, you can also set the
device or string QTextStream operates on by calling setDevice() or
setString(). You can seek to a position by calling seek(), and
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index d74e7b8121..eeeca1bf77 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -4176,6 +4176,7 @@ QString QUrlPrivate::createErrorString()
Constructs a URL by parsing \a url. \a url is assumed to be in human
readable representation, with no percent encoding. QUrl will automatically
percent encode all characters that are not allowed in a URL.
+ The default parsing mode is TolerantMode.
The parsing mode \a parsingMode is used for parsing \a url.
@@ -5678,9 +5679,8 @@ static QString toPrettyPercentEncoding(const QString &input, bool forFragment)
}
/*!
- Returns the human-displayable string representation of the
- URL. The output can be customized by passing flags with \a
- options.
+ Returns a string representation of the URL.
+ The output can be customized by passing flags with \a options.
The resulting QString can be passed back to a QUrl later on.
@@ -5733,9 +5733,8 @@ QString QUrl::toString(FormattingOptions options) const
}
/*!
- Returns the human-displayable string representation of the
- URL. The output can be customized by passing flags with \a
- options.
+ Returns a string representation of the URL.
+ The output can be customized by passing flags with \a options.
The resulting QString can be passed back to a QUrl later on.
@@ -5749,6 +5748,23 @@ QString QUrl::url(FormattingOptions options) const
}
/*!
+ Returns a human-displayable string representation of the URL.
+ The output can be customized by passing flags with \a options.
+ The option RemovePassword is always enabled, since passwords
+ should never be shown back to users.
+
+ The resulting QString can be passed back to a QUrl later on,
+ but any password that was present initially will be lost.
+
+ \sa FormattingOptions, toEncoded(), toString()
+*/
+
+QString QUrl::toDisplayString(FormattingOptions options) const
+{
+ return toString(options | RemovePassword);
+}
+
+/*!
Returns the encoded representation of the URL if it's valid;
otherwise an empty QByteArray is returned. The output can be
customized by passing flags with \a options.
@@ -6237,7 +6253,7 @@ QDataStream &operator>>(QDataStream &in, QUrl &url)
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug d, const QUrl &url)
{
- d.maybeSpace() << "QUrl(" << url.toString() << ')';
+ d.maybeSpace() << "QUrl(" << url.toDisplayString() << ')';
return d.space();
}
#endif
diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h
index c301d92dfb..3e5c62cd7c 100644
--- a/src/corelib/io/qurl.h
+++ b/src/corelib/io/qurl.h
@@ -102,6 +102,7 @@ public:
void setUrl(const QString &url, ParsingMode mode = TolerantMode);
QString url(FormattingOptions options = None) const;
QString toString(FormattingOptions options = None) const;
+ QString toDisplayString(FormattingOptions options = None) const;
bool isValid() const;
@@ -211,10 +212,10 @@ public:
QString errorString() const;
#if QT_DEPRECATED_SINCE(5,0)
- QT_DEPRECATED void setEncodedUrl(const QByteArray &url, ParsingMode mode = TolerantMode)
- { setUrl(QString::fromUtf8(url.constData(), url.size()), mode); }
- QT_DEPRECATED static QUrl fromEncoded(const QByteArray &url, ParsingMode mode = TolerantMode)
- { return QUrl(QString::fromUtf8(url.constData(), url.size()), mode); }
+ QT_DEPRECATED void setEncodedUrl(const QByteArray &u, ParsingMode mode = TolerantMode)
+ { setUrl(QString::fromUtf8(u.constData(), u.size()), mode); }
+ QT_DEPRECATED static QUrl fromEncoded(const QByteArray &u, ParsingMode mode = TolerantMode)
+ { return QUrl(QString::fromUtf8(u.constData(), u.size()), mode); }
#endif
private:
diff --git a/src/corelib/json/qjsonarray.h b/src/corelib/json/qjsonarray.h
index 8bb1ac0b51..83b07e33c9 100644
--- a/src/corelib/json/qjsonarray.h
+++ b/src/corelib/json/qjsonarray.h
@@ -43,6 +43,7 @@
#define QJSONARRAY_H
#include <QtCore/qjsonvalue.h>
+#include <QtCore/qiterator.h>
QT_BEGIN_HEADER
diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp
index 98a0b8c3d3..8a7fa760ae 100644
--- a/src/corelib/json/qjsondocument.cpp
+++ b/src/corelib/json/qjsondocument.cpp
@@ -179,8 +179,8 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
*/
QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation)
{
- if (!(((quintptr)validation) & ~3)) {
- qWarning() <<"QJsonDocumnt::fromRawData: data has to have 4 byte alignment";
+ if (quintptr(data) & 3) {
+ qWarning() <<"QJsonDocument::fromRawData: data has to have 4 byte alignment";
return QJsonDocument();
}
@@ -317,10 +317,10 @@ QByteArray QJsonDocument::toJson() const
\sa toJson
*/
-QJsonDocument QJsonDocument::fromJson(const QByteArray &json)
+QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error)
{
QJsonPrivate::Parser parser(json.constData(), json.length());
- return parser.parse();
+ return parser.parse(error);
}
/*!
diff --git a/src/corelib/json/qjsondocument.h b/src/corelib/json/qjsondocument.h
index 39db830726..7eca0302db 100644
--- a/src/corelib/json/qjsondocument.h
+++ b/src/corelib/json/qjsondocument.h
@@ -54,6 +54,26 @@ namespace QJsonPrivate {
class Parser;
}
+struct Q_CORE_EXPORT QJsonParseError
+{
+ enum ParseError {
+ NoError = 0,
+ UnterminatedObject,
+ MissingNameSeparator,
+ UnterminatedArray,
+ MissingValueSeparator,
+ IllegalValue,
+ EndOfNumber,
+ IllegalNumber,
+ StringEscapeSequence,
+ StringUTF8Scan,
+ EndOfString
+ };
+
+ int offset;
+ ParseError error;
+};
+
class Q_CORE_EXPORT QJsonDocument
{
public:
@@ -85,7 +105,7 @@ public:
static QJsonDocument fromVariant(const QVariant &variant);
QVariant toVariant() const;
- static QJsonDocument fromJson(const QByteArray &json);
+ static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = 0);
QByteArray toJson() const;
bool isEmpty() const;
diff --git a/src/corelib/json/qjsonobject.h b/src/corelib/json/qjsonobject.h
index d2831a3cea..973a01585b 100644
--- a/src/corelib/json/qjsonobject.h
+++ b/src/corelib/json/qjsonobject.h
@@ -43,6 +43,7 @@
#define QJSONOBJECT_H
#include <QtCore/qjsonvalue.h>
+#include <QtCore/qiterator.h>
QT_BEGIN_HEADER
diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp
index 75ed7de48f..16eedadf1a 100644
--- a/src/corelib/json/qjsonparser.cpp
+++ b/src/corelib/json/qjsonparser.cpp
@@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE
using namespace QJsonPrivate;
Parser::Parser(const char *json, int length)
- : json(json), data(0), dataLength(0), current(0)
+ : head(json), json(json), data(0), dataLength(0), current(0), lastError(QJsonParseError::NoError)
{
end = json + length;
}
@@ -134,8 +134,6 @@ char Parser::nextToken()
case BeginObject:
case NameSeparator:
case ValueSeparator:
- if (!eatSpace())
- return 0;
case EndArray:
case EndObject:
eatSpace();
@@ -151,7 +149,7 @@ char Parser::nextToken()
/*
JSON-text = object / array
*/
-QJsonDocument Parser::parse()
+QJsonDocument Parser::parse(QJsonParseError *error)
{
#ifdef PARSER_DEBUG
indent = 0;
@@ -182,6 +180,10 @@ QJsonDocument Parser::parse()
END;
{
+ if (error) {
+ error->offset = 0;
+ error->error = QJsonParseError::NoError;
+ }
QJsonPrivate::Data *d = new QJsonPrivate::Data(data, current);
return QJsonDocument(d);
}
@@ -190,6 +192,10 @@ error:
#ifdef PARSER_DEBUG
qDebug() << ">>>>> parser error";
#endif
+ if (error) {
+ error->offset = json - head;
+ error->error = lastError;
+ }
free(data);
return QJsonDocument();
}
@@ -241,8 +247,10 @@ bool Parser::parseObject()
}
DEBUG << "end token=" << token;
- if (token != EndObject)
+ if (token != EndObject) {
+ lastError = QJsonParseError::UnterminatedObject;
return false;
+ }
DEBUG << "numEntries" << parsedObject.offsets.size();
int table = objectOffset;
@@ -283,8 +291,10 @@ bool Parser::parseMember(int baseOffset)
if (!parseString(&latin1))
return false;
char token = nextToken();
- if (token != NameSeparator)
+ if (token != NameSeparator) {
+ lastError = QJsonParseError::MissingNameSeparator;
return false;
+ }
QJsonPrivate::Value val;
if (!parseValue(&val, baseOffset))
return false;
@@ -308,8 +318,10 @@ bool Parser::parseArray()
QVarLengthArray<QJsonPrivate::Value> values;
- if (!eatSpace())
+ if (!eatSpace()) {
+ lastError = QJsonParseError::UnterminatedArray;
return false;
+ }
if (*json == EndArray) {
nextToken();
} else {
@@ -321,8 +333,13 @@ bool Parser::parseArray()
char token = nextToken();
if (token == EndArray)
break;
- else if (token != ValueSeparator)
+ else if (token != ValueSeparator) {
+ if (!eatSpace())
+ lastError = QJsonParseError::UnterminatedArray;
+ else
+ lastError = QJsonParseError::MissingValueSeparator;
return false;
+ }
}
}
@@ -358,8 +375,10 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
switch (*json++) {
case 'n':
- if (end - json < 4)
+ if (end - json < 4) {
+ lastError = QJsonParseError::IllegalValue;
return false;
+ }
if (*json++ == 'u' &&
*json++ == 'l' &&
*json++ == 'l') {
@@ -368,10 +387,13 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
END;
return true;
}
+ lastError = QJsonParseError::IllegalValue;
return false;
case 't':
- if (end - json < 4)
+ if (end - json < 4) {
+ lastError = QJsonParseError::IllegalValue;
return false;
+ }
if (*json++ == 'r' &&
*json++ == 'u' &&
*json++ == 'e') {
@@ -381,10 +403,13 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
END;
return true;
}
+ lastError = QJsonParseError::IllegalValue;
return false;
case 'f':
- if (end - json < 5)
+ if (end - json < 5) {
+ lastError = QJsonParseError::IllegalValue;
return false;
+ }
if (*json++ == 'a' &&
*json++ == 'l' &&
*json++ == 's' &&
@@ -395,6 +420,7 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
END;
return true;
}
+ lastError = QJsonParseError::IllegalValue;
return false;
case Quote: {
val->type = QJsonValue::String;
@@ -490,8 +516,10 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset)
++json;
}
- if (json >= end)
+ if (json >= end) {
+ lastError = QJsonParseError::EndOfNumber;
return false;
+ }
QByteArray number(start, json - start);
DEBUG << "numberstring" << number;
@@ -514,8 +542,10 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset)
};
d = number.toDouble(&ok);
- if (!ok)
+ if (!ok) {
+ lastError = QJsonParseError::IllegalNumber;
return false;
+ }
int pos = reserveSpace(sizeof(double));
*(quint64 *)(data + pos) = qToLittleEndian(ui);
@@ -679,11 +709,15 @@ bool Parser::parseString(bool *latin1)
if (*json == '"')
break;
else if (*json == '\\') {
- if (!scanEscapeSequence(json, end, &ch))
+ if (!scanEscapeSequence(json, end, &ch)) {
+ lastError = QJsonParseError::StringEscapeSequence;
return false;
+ }
} else {
- if (!scanUtf8Char(json, end, &ch))
+ if (!scanUtf8Char(json, end, &ch)) {
+ lastError = QJsonParseError::StringUTF8Scan;
return false;
+ }
}
if (ch > 0xff) {
*latin1 = false;
@@ -695,8 +729,10 @@ bool Parser::parseString(bool *latin1)
}
++json;
DEBUG << "end of string";
- if (json >= end)
+ if (json >= end) {
+ lastError = QJsonParseError::EndOfString;
return false;
+ }
// no unicode string, we are done
if (*latin1) {
@@ -720,11 +756,15 @@ bool Parser::parseString(bool *latin1)
if (*json == '"')
break;
else if (*json == '\\') {
- if (!scanEscapeSequence(json, end, &ch))
+ if (!scanEscapeSequence(json, end, &ch)) {
+ lastError = QJsonParseError::StringEscapeSequence;
return false;
+ }
} else {
- if (!scanUtf8Char(json, end, &ch))
+ if (!scanUtf8Char(json, end, &ch)) {
+ lastError = QJsonParseError::StringUTF8Scan;
return false;
+ }
}
if (ch > 0xffff) {
int pos = reserveSpace(4);
@@ -737,8 +777,10 @@ bool Parser::parseString(bool *latin1)
}
++json;
- if (json >= end)
+ if (json >= end) {
+ lastError = QJsonParseError::EndOfString;
return false;
+ }
// write string length
*(QJsonPrivate::qle_int *)(data + stringPos) = (current - outStart - sizeof(int))/2;
diff --git a/src/corelib/json/qjsonparser_p.h b/src/corelib/json/qjsonparser_p.h
index eae6c08718..20e57dcf26 100644
--- a/src/corelib/json/qjsonparser_p.h
+++ b/src/corelib/json/qjsonparser_p.h
@@ -65,7 +65,7 @@ class Parser
public:
Parser(const char *json, int length);
- QJsonDocument parse();
+ QJsonDocument parse(QJsonParseError *error);
class ParsedObject
{
@@ -93,12 +93,14 @@ private:
bool parseString(bool *latin1);
bool parseValue(QJsonPrivate::Value *val, int baseOffset);
bool parseNumber(QJsonPrivate::Value *val, int baseOffset);
+ const char *head;
const char *json;
const char *end;
char *data;
int dataLength;
int current;
+ QJsonParseError::ParseError lastError;
inline int reserveSpace(int space) {
if (current + space >= dataLength) {
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index 6ebc62614b..4b81087e2f 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -12,6 +12,7 @@ HEADERS += \
kernel/qmetatype.h \
kernel/qmimedata.h \
kernel/qobject.h \
+ kernel/qobject_impl.h \
kernel/qobjectdefs.h \
kernel/qsignalmapper.h \
kernel/qsocketnotifier.h \
diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index 31a46ad744..3075eab753 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -135,8 +135,8 @@ void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId)
QAbstractEventDispatcher also allows the integration of an
external event loop with the Qt event loop. For example, the
- \l{Qt Solutions}{Motif Extension Qt Solution} includes a
- reimplementation of QAbstractEventDispatcher that merges Qt and
+ \l{Motif Extension}
+ includes a reimplementation of QAbstractEventDispatcher that merges Qt and
Motif events together.
\sa QEventLoop, QCoreApplication, QThread
@@ -413,8 +413,12 @@ QAbstractEventDispatcher::EventFilter QAbstractEventDispatcher::setEventFilter(E
bool QAbstractEventDispatcher::filterEvent(void *message)
{
Q_D(QAbstractEventDispatcher);
- if (d->event_filter)
+ if (d->event_filter) {
+ // Raise the loopLevel so that deleteLater() calls in or triggered
+ // by event_filter() will be processed from the main event loop.
+ QScopedLoopLevelCounter loopLevelCounter(d->threadData);
return d->event_filter(message);
+ }
return false;
}
diff --git a/src/corelib/kernel/qcore_mac_objc.mm b/src/corelib/kernel/qcore_mac_objc.mm
index 76705f1c8c..35e3bb27d9 100644
--- a/src/corelib/kernel/qcore_mac_objc.mm
+++ b/src/corelib/kernel/qcore_mac_objc.mm
@@ -41,6 +41,8 @@
#include <private/qcore_mac_p.h>
+QT_BEGIN_NAMESPACE
+
NSString *QCFString::toNSString(const QString &string)
{
// The const cast below is safe: CfStringRef is immutable and so is NSString.
@@ -52,3 +54,5 @@ QString QCFString::toQString(const NSString *nsstr)
return toQString(reinterpret_cast<CFStringRef>(nsstr));
}
+QT_END_NAMESPACE
+
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index cf3ae1b7c5..2d49b271ce 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -1011,35 +1011,6 @@ void QCoreApplication::exit(int returnCode)
*/
/*!
- Adds the event \a event, with the object \a receiver as the
- receiver of the event, to an event queue and returns immediately.
-
- The event must be allocated on the heap since the post event queue
- will take ownership of the event and delete it once it has been
- posted. It is \e {not safe} to access the event after
- it has been posted.
-
- When control returns to the main event loop, all events that are
- stored in the queue will be sent using the notify() function.
-
- Events are processed in the order posted. For more control over
- the processing order, use the postEvent() overload below, which
- takes a priority argument. This function posts all event with a
- Qt::NormalEventPriority.
-
- \threadsafe
-
- \sa sendEvent(), notify(), sendPostedEvents()
-*/
-
-void QCoreApplication::postEvent(QObject *receiver, QEvent *event)
-{
- postEvent(receiver, event, Qt::NormalEventPriority);
-}
-
-
-/*!
- \overload postEvent()
\since 4.3
Adds the event \a event, with the object \a receiver as the
@@ -1167,13 +1138,6 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven
}
/*!
- \fn void QCoreApplication::sendPostedEvents()
- \overload sendPostedEvents()
-
- Dispatches all posted events, i.e. empties the event queue.
-*/
-
-/*!
Immediately dispatches all events which have been previously queued
with QCoreApplication::postEvent() and which are for the object \a receiver
and have the event type \a event_type.
@@ -1188,7 +1152,6 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven
\sa flush(), postEvent()
*/
-
void QCoreApplication::sendPostedEvents(QObject *receiver, int event_type)
{
QThreadData *data = QThreadData::current();
@@ -1343,23 +1306,6 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
}
/*!
- Removes all events posted using postEvent() for \a receiver.
-
- The events are \e not dispatched, instead they are removed from the
- queue. You should never need to call this function. If you do call it,
- be aware that killing events may cause \a receiver to break one or
- more invariants.
-
- \threadsafe
-*/
-
-void QCoreApplication::removePostedEvents(QObject *receiver)
-{
- removePostedEvents(receiver, 0);
-}
-
-/*!
- \overload removePostedEvents()
\since 4.3
Removes all events of the given \a eventType that were posted
@@ -1372,7 +1318,9 @@ void QCoreApplication::removePostedEvents(QObject *receiver)
If \a receiver is null, the events of \a eventType are removed for
all objects. If \a eventType is 0, all the events are removed for
- \a receiver.
+ \a receiver. You should never call this function with \a eventType
+ of 0. If you do call it in this way, be aware that killing events
+ may cause \a receiver to break one or more invariants.
\threadsafe
*/
@@ -1506,8 +1454,14 @@ void QCoreApplicationPrivate::ref()
void QCoreApplicationPrivate::deref()
{
- if (!quitLockRef.deref() && in_exec && quitLockRefEnabled)
- QCoreApplication::postEvent(qApp, new QEvent(QEvent::Quit));
+ if (!quitLockRef.deref())
+ maybeQuit();
+}
+
+void QCoreApplicationPrivate::maybeQuit()
+{
+ if (quitLockRef.load() == 0 && in_exec && quitLockRefEnabled && shouldQuit())
+ QCoreApplication::postEvent(QCoreApplication::instance(), new QEvent(QEvent::Quit));
}
/*!
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index d1fba3b63c..18266a9a2c 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -110,12 +110,9 @@ public:
static void exit(int retcode=0);
static bool sendEvent(QObject *receiver, QEvent *event);
- static void postEvent(QObject *receiver, QEvent *event);
- static void postEvent(QObject *receiver, QEvent *event, int priority);
- static void sendPostedEvents(QObject *receiver, int event_type);
- static void sendPostedEvents();
- static void removePostedEvents(QObject *receiver);
- static void removePostedEvents(QObject *receiver, int eventType);
+ static void postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);
+ static void sendPostedEvents(QObject *receiver = 0, int event_type = 0);
+ static void removePostedEvents(QObject *receiver, int eventType = 0);
static bool hasPendingEvents();
static QAbstractEventDispatcher *eventDispatcher();
static void setEventDispatcher(QAbstractEventDispatcher *eventDispatcher);
@@ -211,8 +208,6 @@ inline bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
inline bool QCoreApplication::sendSpontaneousEvent(QObject *receiver, QEvent *event)
{ if (event) event->spont = true; return self ? self->notifyInternal(receiver, event) : false; }
-inline void QCoreApplication::sendPostedEvents() { sendPostedEvents(0, 0); }
-
#ifdef QT_NO_TRANSLATION
// Simple versions
inline QString QCoreApplication::translate(const char *, const char *sourceText,
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 861a046f16..112b313129 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -92,6 +92,10 @@ public:
QAtomicInt quitLockRef;
void ref();
void deref();
+ virtual bool shouldQuit() {
+ return true;
+ }
+ void maybeQuit();
static QThread *theMainThread;
static QThread *mainThread();
diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp
index 9a45f28f16..c1f7c8ab25 100644
--- a/src/corelib/kernel/qcoreapplication_win.cpp
+++ b/src/corelib/kernel/qcoreapplication_win.cpp
@@ -140,30 +140,30 @@ public:
{ LeaveCriticalSection(&cs); }
};
-Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char* str)
-{
- Q_UNUSED(t);
- // OutputDebugString is not threadsafe.
+// defined in qlogging.cpp
+extern Q_CORE_EXPORT QByteArray qMessageFormatString(QtMsgType type,
+ const QMessageLogContext &context,
+ const char *str);
+Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context, const char *str)
+{
// cannot use QMutex here, because qWarning()s in the QMutex
// implementation may cause this function to recurse
static QWinMsgHandlerCriticalSection staticCriticalSection;
- if (!str)
- str = "(null)";
+ QByteArray message = qMessageFormatString(t, context, str);
+ QString s(QString::fromLocal8Bit(message));
+ // OutputDebugString is not threadsafe.
staticCriticalSection.lock();
-
- QString s(QString::fromLocal8Bit(str));
- s += QLatin1Char('\n');
OutputDebugString((wchar_t*)s.utf16());
-
staticCriticalSection.unlock();
}
-Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &, const char* str)
+Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str)
{
- qWinMsgHandler(t, str);
+ QMessageLogContext emptyContext;
+ qWinMessageHandler(t, emptyContext, str);
}
/*****************************************************************************
diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp
index 9ed696539a..032590fa7f 100644
--- a/src/corelib/kernel/qcoreevent.cpp
+++ b/src/corelib/kernel/qcoreevent.cpp
@@ -228,6 +228,7 @@ QT_BEGIN_NAMESPACE
\value TouchBegin Beginning of a sequence of touch-screen and/or track-pad events (QTouchEvent)
\value TouchUpdate Touch-screen event (QTouchEvent)
\value TouchEnd End of touch-event sequence (QTouchEvent)
+ \value TouchCancel Cancellation of touch-event sequence (QTouchEvent)
\value WinIdChange The window system identifer for this native widget has changed
\value Gesture A gesture was triggered (QGestureEvent)
\value GestureOverride A gesture override was triggered (QGestureEvent)
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index 8910763daf..1f36f9c9c8 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -277,6 +277,10 @@ public:
InputMethodQuery = 209,
OrientationChange = 210, // Screen orientation has changed
+ TouchCancel = 211,
+
+ ThemeChange = 212,
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
diff --git a/src/corelib/kernel/qfunctions_wince.h b/src/corelib/kernel/qfunctions_wince.h
index f83dad0dde..7cd8ea66a2 100644
--- a/src/corelib/kernel/qfunctions_wince.h
+++ b/src/corelib/kernel/qfunctions_wince.h
@@ -182,6 +182,16 @@ void qt_wince_rewind( FILE *stream );
int qt_wince___fileno(FILE *);
FILE *qt_wince_tmpfile( void );
+//For zlib we need these helper functions, but they break the build when
+//set globally, so just set them for zlib use
+#ifdef ZLIB_H
+#define open qt_wince_open
+#define close qt_wince__close
+#define lseek qt_wince__lseek
+#define read qt_wince__read
+#define write qt_wince__write
+#endif
+
int qt_wince__mkdir(const char *dirname);
int qt_wince__rmdir(const char *dirname);
int qt_wince__access( const char *path, int pmode );
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 400fe54c7f..d53ba707f7 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -1151,18 +1151,19 @@ bool QMetaObject::invokeMethod(QObject *obj,
sig[sig.size() - 1] = ')';
sig.append('\0');
- int idx = obj->metaObject()->indexOfMethod(sig.constData());
+ const QMetaObject *meta = obj->metaObject();
+ int idx = meta->indexOfMethod(sig.constData());
if (idx < 0) {
QByteArray norm = QMetaObject::normalizedSignature(sig.constData());
- idx = obj->metaObject()->indexOfMethod(norm.constData());
+ idx = meta->indexOfMethod(norm.constData());
}
- if (idx < 0 || idx >= obj->metaObject()->methodCount()) {
+ if (idx < 0 || idx >= meta->methodCount()) {
qWarning("QMetaObject::invokeMethod: No such method %s::%s",
- obj->metaObject()->className(), sig.constData());
+ meta->className(), sig.constData());
return false;
}
- QMetaMethod method = obj->metaObject()->method(idx);
+ QMetaMethod method = meta->method(idx);
return method.invoke(obj, type, ret,
val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
@@ -1248,6 +1249,14 @@ bool QMetaObject::invokeMethod(QObject *obj,
*/
/*!
+ \fn bool QMetaMethod::isValid() const
+ \since 5.0
+
+ Returns true if this method is valid (can be introspected and
+ invoked), otherwise returns false.
+*/
+
+/*!
\fn const QMetaObject *QMetaMethod::enclosingMetaObject() const
\internal
*/
@@ -1286,25 +1295,10 @@ const char *QMetaMethod::signature() const
*/
QList<QByteArray> QMetaMethod::parameterTypes() const
{
- QList<QByteArray> list;
if (!mobj)
- return list;
- const char *signature = mobj->d.stringdata + mobj->d.data[handle];
- while (*signature && *signature != '(')
- ++signature;
- while (*signature && *signature != ')' && *++signature != ')') {
- const char *begin = signature;
- int level = 0;
- while (*signature && (level > 0 || *signature != ',') && *signature != ')') {
- if (*signature == '<')
- ++level;
- else if (*signature == '>')
- --level;
- ++signature;
- }
- list += QByteArray(begin, signature - begin);
- }
- return list;
+ return QList<QByteArray>();
+ return QMetaObjectPrivate::parameterTypeNamesFromSignature(
+ mobj->d.stringdata + mobj->d.data[handle]);
}
/*!
@@ -1353,7 +1347,30 @@ const char *QMetaMethod::typeName() const
Returns the tag associated with this method.
Tags are special macros recognized by \c moc that make it
- possible to add extra information about a method. For the moment,
+ possible to add extra information about a method.
+
+ Tag information can be added in the following
+ way in the function declaration:
+
+ \code
+ #define THISISTESTTAG // tag text
+ ...
+ private slots:
+ THISISTESTTAG void testFunc();
+ \endcode
+
+ and the information can be accessed by using:
+
+ \code
+ MainWindow win;
+ win.show();
+
+ int functionIndex = win.metaObject()->indexOfSlot("testFunc()");
+ QMetaMethod mm = metaObject()->method(functionIndex);
+ qDebug() << mm.tag(); // prints THISISTESTTAG
+ \endcode
+
+ For the moment,
\c moc doesn't support any special tags.
*/
const char *QMetaMethod::tag() const
@@ -2243,9 +2260,8 @@ QVariant QMetaProperty::read(const QObject *object) const
t = QMetaType::type(typeName);
if (t == QVariant::Invalid)
t = QVariant::nameToType(typeName);
- if (t == QVariant::Invalid || t == QVariant::UserType) {
- if (t == QVariant::Invalid)
- qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property '%s::%s'", typeName, mobj->className(), name());
+ if (t == QVariant::Invalid) {
+ qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property '%s::%s'", typeName, mobj->className(), name());
return QVariant();
}
}
@@ -2778,4 +2794,29 @@ int QMetaObjectPrivate::originalClone(const QMetaObject *mobj, int local_method_
return local_method_index;
}
+/*!
+ \internal
+
+ Returns the parameter type names extracted from the given \a signature.
+*/
+QList<QByteArray> QMetaObjectPrivate::parameterTypeNamesFromSignature(const char *signature)
+{
+ QList<QByteArray> list;
+ while (*signature && *signature != '(')
+ ++signature;
+ while (*signature && *signature != ')' && *++signature != ')') {
+ const char *begin = signature;
+ int level = 0;
+ while (*signature && (level > 0 || *signature != ',') && *signature != ')') {
+ if (*signature == '<')
+ ++level;
+ else if (*signature == '>')
+ --level;
+ ++signature;
+ }
+ list += QByteArray(begin, signature - begin);
+ }
+ return list;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index 650369164c..9e51af7556 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -134,6 +134,8 @@ public:
val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
+ inline bool isValid() const { return mobj != 0; }
+
private:
const QMetaObject *mobj;
uint handle;
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index 5fc0555fb5..59a5c5f280 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -134,6 +134,8 @@ struct QMetaObjectPrivate
bool normalizeStringData);
static int originalClone(const QMetaObject *obj, int local_method_index);
+ static QList<QByteArray> parameterTypeNamesFromSignature(const char *signature);
+
#ifndef QT_NO_QOBJECT
//defined in qobject.cpp
enum DisconnectType { DisconnectAll, DisconnectOne };
@@ -152,6 +154,10 @@ struct QMetaObjectPrivate
#endif
};
+// For meta-object generators
+
+enum { MetaObjectPrivateFieldCount = sizeof(QMetaObjectPrivate) / sizeof(int) };
+
#ifndef UTILS_H
// mirrored in moc's utils.h
static inline bool is_ident_char(char s)
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 529ca22107..8bece6636b 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -106,10 +106,12 @@ public:
(QMetaMethod::MethodType _methodType,
const QByteArray& _signature,
const QByteArray& _returnType = QByteArray(),
- QMetaMethod::Access _access = QMetaMethod::Public)
+ QMetaMethod::Access _access = QMetaMethod::Public,
+ int _revision = 0)
: signature(QMetaObject::normalizedSignature(_signature.constData())),
returnType(QMetaObject::normalizedType(_returnType)),
- attributes(((int)_access) | (((int)_methodType) << 2))
+ attributes(((int)_access) | (((int)_methodType) << 2)),
+ revision(_revision)
{
}
@@ -118,6 +120,7 @@ public:
QList<QByteArray> parameterNames;
QByteArray tag;
int attributes;
+ int revision;
QMetaMethod::MethodType methodType() const
{
@@ -139,10 +142,12 @@ class QMetaPropertyBuilderPrivate
{
public:
QMetaPropertyBuilderPrivate
- (const QByteArray& _name, const QByteArray& _type, int notifierIdx=-1)
+ (const QByteArray& _name, const QByteArray& _type, int notifierIdx=-1,
+ int _revision = 0)
: name(_name),
type(QMetaObject::normalizedType(_type.constData())),
- flags(Readable | Writable | Scriptable), notifySignal(-1)
+ flags(Readable | Writable | Scriptable), notifySignal(-1),
+ revision(_revision)
{
if (notifierIdx >= 0) {
flags |= Notify;
@@ -154,6 +159,7 @@ public:
QByteArray type;
int flags;
int notifySignal;
+ int revision;
bool flag(int f) const
{
@@ -193,6 +199,9 @@ public:
staticMetacallFunction = 0;
}
+ bool hasRevisionedProperties() const;
+ bool hasRevisionedMethods() const;
+
QByteArray className;
const QMetaObject *superClass;
QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction;
@@ -206,6 +215,24 @@ public:
int flags;
};
+bool QMetaObjectBuilderPrivate::hasRevisionedProperties() const
+{
+ for (int i = 0; i < properties.size(); ++i) {
+ if (properties.at(i).revision)
+ return true;
+ }
+ return false;
+}
+
+bool QMetaObjectBuilderPrivate::hasRevisionedMethods() const
+{
+ for (int i = 0; i < methods.size(); ++i) {
+ if (methods.at(i).revision)
+ return true;
+ }
+ return false;
+}
+
/*!
Constructs a new QMetaObjectBuilder.
*/
@@ -443,6 +470,7 @@ QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QMetaMethod& prototype)
method.setTag(prototype.tag());
method.setAccess(prototype.access());
method.setAttributes(prototype.attributes());
+ method.setRevision(prototype.revision());
return method;
}
@@ -556,6 +584,7 @@ QMetaPropertyBuilder QMetaObjectBuilder::addProperty(const QMetaProperty& protot
property.setEnumOrFlag(prototype.isEnumType());
property.setConstant(prototype.isConstant());
property.setFinal(prototype.isFinal());
+ property.setRevision(prototype.revision());
if (prototype.hasNotifySignal()) {
// Find an existing method for the notify signal, or add a new one.
QMetaMethod method = prototype.notifySignal();
@@ -1041,21 +1070,35 @@ int QMetaObjectBuilder::indexOfClassInfo(const QByteArray& name)
#define ALIGN(size,type) \
(size) = ((size) + sizeof(type) - 1) & ~(sizeof(type) - 1)
-// Build a string into a QMetaObject representation. Returns the
-// position in the string table where the string was placed.
-static int buildString
- (char *buf, char *str, int *offset, const QByteArray& value, int empty)
+class MetaStringTable
{
- if (value.size() == 0 && empty >= 0)
- return empty;
- if (buf) {
- memcpy(str + *offset, value.constData(), value.size());
- str[*offset + value.size()] = '\0';
+public:
+ typedef QHash<QByteArray, int> Entries; // string --> offset mapping
+ typedef Entries::const_iterator const_iterator;
+ Entries::const_iterator constBegin() const
+ { return m_entries.constBegin(); }
+ Entries::const_iterator constEnd() const
+ { return m_entries.constEnd(); }
+
+ MetaStringTable() : m_offset(0) {}
+
+ int enter(const QByteArray &value)
+ {
+ Entries::iterator it = m_entries.find(value);
+ if (it != m_entries.end())
+ return it.value();
+ int pos = m_offset;
+ m_entries.insert(value, pos);
+ m_offset += value.size() + 1;
+ return pos;
}
- int posn = *offset;
- *offset += value.size() + 1;
- return posn;
-}
+
+ int arraySize() const { return m_offset; }
+
+private:
+ Entries m_entries;
+ int m_offset;
+};
// Build the parameter array string for a method.
static QByteArray buildParameterNames
@@ -1103,12 +1146,15 @@ static QByteArray buildParameterNames
// build the QMetaObject. Returns -1 if the metaobject if
// relocatable is set, but the metaobject contains extradata.
static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
- bool relocatable)
+ int expectedSize, bool relocatable)
{
+ Q_UNUSED(expectedSize); // Avoid warning in release mode
int size = 0;
int dataIndex;
int enumIndex;
int index;
+ bool hasRevisionedMethods = d->hasRevisionedMethods();
+ bool hasRevisionedProperties = d->hasRevisionedProperties();
bool hasNotifySignals = false;
if (relocatable &&
@@ -1128,7 +1174,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
QMetaObjectPrivate *pmeta
= reinterpret_cast<QMetaObjectPrivate *>(buf + size);
int pmetaSize = size;
- dataIndex = 14; // Number of fields in the QMetaObjectPrivate.
+ dataIndex = MetaObjectPrivateFieldCount;
for (index = 0; index < d->properties.size(); ++index) {
if (d->properties[index].notifySignal != -1) {
hasNotifySignals = true;
@@ -1149,12 +1195,16 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
pmeta->methodCount = d->methods.size();
pmeta->methodData = dataIndex;
dataIndex += 5 * d->methods.size();
+ if (hasRevisionedMethods)
+ dataIndex += d->methods.size();
pmeta->propertyCount = d->properties.size();
pmeta->propertyData = dataIndex;
dataIndex += 3 * d->properties.size();
if (hasNotifySignals)
dataIndex += d->properties.size();
+ if (hasRevisionedProperties)
+ dataIndex += d->properties.size();
pmeta->enumeratorCount = d->enumerators.size();
pmeta->enumeratorData = dataIndex;
@@ -1166,9 +1216,13 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
} else {
dataIndex += 2 * d->classInfoNames.size();
dataIndex += 5 * d->methods.size();
+ if (hasRevisionedMethods)
+ dataIndex += d->methods.size();
dataIndex += 3 * d->properties.size();
if (hasNotifySignals)
dataIndex += d->properties.size();
+ if (hasRevisionedProperties)
+ dataIndex += d->properties.size();
dataIndex += 4 * d->enumerators.size();
dataIndex += 5 * d->constructors.size();
}
@@ -1198,20 +1252,16 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
// Reset the current data position to just past the QMetaObjectPrivate.
- dataIndex = 14;
-
- // Add the class name to the string table.
- int offset = 0;
- buildString(buf, str, &offset, d->className, -1);
+ dataIndex = MetaObjectPrivateFieldCount;
- // Add a common empty string, which is used to indicate "void"
- // method returns, empty tag strings, etc.
- int empty = buildString(buf, str, &offset, QByteArray(), -1);
+ MetaStringTable strings;
+ strings.enter(d->className);
// Output the class infos,
+ Q_ASSERT(!buf || dataIndex == pmeta->classInfoData);
for (index = 0; index < d->classInfoNames.size(); ++index) {
- int name = buildString(buf, str, &offset, d->classInfoNames[index], empty);
- int value = buildString(buf, str, &offset, d->classInfoValues[index], empty);
+ int name = strings.enter(d->classInfoNames[index]);
+ int value = strings.enter(d->classInfoValues[index]);
if (buf) {
data[dataIndex] = name;
data[dataIndex + 1] = value;
@@ -1220,15 +1270,16 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
// Output the methods in the class.
+ Q_ASSERT(!buf || dataIndex == pmeta->methodData);
for (index = 0; index < d->methods.size(); ++index) {
QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- int sig = buildString(buf, str, &offset, method->signature, empty);
+ int sig = strings.enter(method->signature);
int params;
QByteArray names = buildParameterNames
(method->signature, method->parameterNames);
- params = buildString(buf, str, &offset, names, empty);
- int ret = buildString(buf, str, &offset, method->returnType, empty);
- int tag = buildString(buf, str, &offset, method->tag, empty);
+ params = strings.enter(names);
+ int ret = strings.enter(method->returnType);
+ int tag = strings.enter(method->tag);
int attrs = method->attributes;
if (buf) {
data[dataIndex] = sig;
@@ -1241,12 +1292,21 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
dataIndex += 5;
}
+ if (hasRevisionedMethods) {
+ for (index = 0; index < d->methods.size(); ++index) {
+ QMetaMethodBuilderPrivate *method = &(d->methods[index]);
+ if (buf)
+ data[dataIndex] = method->revision;
+ ++dataIndex;
+ }
+ }
// Output the properties in the class.
+ Q_ASSERT(!buf || dataIndex == pmeta->propertyData);
for (index = 0; index < d->properties.size(); ++index) {
QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
- int name = buildString(buf, str, &offset, prop->name, empty);
- int type = buildString(buf, str, &offset, prop->type, empty);
+ int name = strings.enter(prop->name);
+ int type = strings.enter(prop->type);
int flags = prop->flags;
if (!isVariantType(prop->type)) {
@@ -1274,11 +1334,20 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
++dataIndex;
}
}
+ if (hasRevisionedProperties) {
+ for (index = 0; index < d->properties.size(); ++index) {
+ QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
+ if (buf)
+ data[dataIndex] = prop->revision;
+ ++dataIndex;
+ }
+ }
// Output the enumerators in the class.
+ Q_ASSERT(!buf || dataIndex == pmeta->enumeratorData);
for (index = 0; index < d->enumerators.size(); ++index) {
QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- int name = buildString(buf, str, &offset, enumerator->name, empty);
+ int name = strings.enter(enumerator->name);
int isFlag = (int)(enumerator->isFlag);
int count = enumerator->keys.size();
int enumOffset = enumIndex;
@@ -1289,7 +1358,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
data[dataIndex + 3] = enumOffset;
}
for (int key = 0; key < count; ++key) {
- int keyIndex = buildString(buf, str, &offset, enumerator->keys[key], empty);
+ int keyIndex = strings.enter(enumerator->keys[key]);
if (buf) {
data[enumOffset++] = keyIndex;
data[enumOffset++] = enumerator->values[key];
@@ -1300,15 +1369,16 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
// Output the constructors in the class.
+ Q_ASSERT(!buf || dataIndex == pmeta->constructorData);
for (index = 0; index < d->constructors.size(); ++index) {
QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- int sig = buildString(buf, str, &offset, method->signature, empty);
+ int sig = strings.enter(method->signature);
int params;
QByteArray names = buildParameterNames
(method->signature, method->parameterNames);
- params = buildString(buf, str, &offset, names, empty);
- int ret = buildString(buf, str, &offset, method->returnType, empty);
- int tag = buildString(buf, str, &offset, method->tag, empty);
+ params = strings.enter(names);
+ int ret = strings.enter(method->returnType);
+ int tag = strings.enter(method->tag);
int attrs = method->attributes;
if (buf) {
data[dataIndex] = sig;
@@ -1320,9 +1390,16 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
dataIndex += 5;
}
- // One more empty string to act as a terminator.
- buildString(buf, str, &offset, QByteArray(), -1);
- size += offset;
+ size += strings.arraySize();
+
+ if (buf) {
+ // Write strings to string data array.
+ MetaStringTable::const_iterator it;
+ for (it = strings.constBegin(); it != strings.constEnd(); ++it) {
+ memcpy(str + it.value(), it.key().constData(), it.key().size());
+ str[it.value() + it.key().size()] = '\0';
+ }
+ }
// Output the zero terminator in the data array.
if (buf)
@@ -1356,6 +1433,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Align the final size and return it.
ALIGN(size, void *);
+ Q_ASSERT(!buf || size == expectedSize);
return size;
}
@@ -1371,10 +1449,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
*/
QMetaObject *QMetaObjectBuilder::toMetaObject() const
{
- int size = buildMetaObject(d, 0, false);
+ int size = buildMetaObject(d, 0, 0, false);
char *buf = reinterpret_cast<char *>(malloc(size));
memset(buf, 0, size);
- buildMetaObject(d, buf, false);
+ buildMetaObject(d, buf, size, false);
return reinterpret_cast<QMetaObject *>(buf);
}
@@ -1394,7 +1472,7 @@ QMetaObject *QMetaObjectBuilder::toMetaObject() const
*/
QByteArray QMetaObjectBuilder::toRelocatableData(bool *ok) const
{
- int size = buildMetaObject(d, 0, true);
+ int size = buildMetaObject(d, 0, 0, true);
if (size == -1) {
if (ok) *ok = false;
return QByteArray();
@@ -1404,7 +1482,7 @@ QByteArray QMetaObjectBuilder::toRelocatableData(bool *ok) const
data.resize(size);
char *buf = data.data();
memset(buf, 0, size);
- buildMetaObject(d, buf, true);
+ buildMetaObject(d, buf, size, true);
if (ok) *ok = true;
return data;
}
@@ -1432,6 +1510,7 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output,
output->d.superdata = superclass;
output->d.stringdata = buf + stringdataOffset;
output->d.data = reinterpret_cast<const uint *>(buf + dataOffset);
+ output->d.extradata = 0;
}
/*!
@@ -1505,6 +1584,8 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const
stream << method->parameterNames;
stream << method->tag;
stream << method->attributes;
+ if (method->revision)
+ stream << method->revision;
}
// Write the properties.
@@ -1514,6 +1595,8 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const
stream << property->type;
stream << property->flags;
stream << property->notifySignal;
+ if (property->revision)
+ stream << property->revision;
}
// Write the enumerators.
@@ -1644,6 +1727,8 @@ void QMetaObjectBuilder::deserialize
stream >> method->parameterNames;
stream >> method->tag;
stream >> method->attributes;
+ if (method->attributes & MethodRevisioned)
+ stream >> method->revision;
if (method->methodType() == QMetaMethod::Constructor) {
// Cannot add a constructor in this set of methods.
stream.setStatus(QDataStream::ReadCorruptData);
@@ -1674,6 +1759,8 @@ void QMetaObjectBuilder::deserialize
stream.setStatus(QDataStream::ReadCorruptData);
return;
}
+ if (property->flags & Revisioned)
+ stream >> property->revision;
}
// Read the enumerators.
@@ -1928,6 +2015,37 @@ void QMetaMethodBuilder::setAttributes(int value)
}
/*!
+ Returns the revision of this method.
+
+ \sa setRevision()
+*/
+int QMetaMethodBuilder::revision() const
+{
+ QMetaMethodBuilderPrivate *d = d_func();
+ if (d)
+ return d->revision;
+ return 0;
+
+}
+
+/*!
+ Sets the \a revision of this method.
+
+ \sa revision()
+*/
+void QMetaMethodBuilder::setRevision(int revision)
+{
+ QMetaMethodBuilderPrivate *d = d_func();
+ if (d) {
+ d->revision = revision;
+ if (revision)
+ d->attributes |= MethodRevisioned;
+ else
+ d->attributes &= ~MethodRevisioned;
+ }
+}
+
+/*!
\class QMetaPropertyBuilder
\internal
\brief The QMetaPropertyBuilder class enables modifications to a property definition on a meta object builder.
@@ -2369,6 +2487,34 @@ void QMetaPropertyBuilder::setFinal(bool value)
d->setFlag(Final, value);
}
+/*!
+ Returns the revision of this property.
+
+ \sa setRevision()
+*/
+int QMetaPropertyBuilder::revision() const
+{
+ QMetaPropertyBuilderPrivate *d = d_func();
+ if (d)
+ return d->revision;
+ return 0;
+
+}
+
+/*!
+ Sets the \a revision of this property.
+
+ \sa revision()
+*/
+void QMetaPropertyBuilder::setRevision(int revision)
+{
+ QMetaPropertyBuilderPrivate *d = d_func();
+ if (d) {
+ d->revision = revision;
+ d->setFlag(Revisioned, revision != 0);
+ }
+}
+
/*!
\class QMetaEnumBuilder
diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h
index 17b7af0c77..86bc354164 100644
--- a/src/corelib/kernel/qmetaobjectbuilder_p.h
+++ b/src/corelib/kernel/qmetaobjectbuilder_p.h
@@ -215,6 +215,9 @@ public:
int attributes() const;
void setAttributes(int value);
+ int revision() const;
+ void setRevision(int revision);
+
private:
const QMetaObjectBuilder *_mobj;
int _index;
@@ -269,6 +272,9 @@ public:
void setConstant(bool value);
void setFinal(bool value);
+ int revision() const;
+ void setRevision(int revision);
+
private:
const QMetaObjectBuilder *_mobj;
int _index;
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 50b11e0e98..a1baf28f10 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -116,6 +116,16 @@ template<> struct TypeDefinition<QRegExp> { static const bool IsAvailable = fals
#endif
} // namespace
+/*!
+ \macro Q_DECLARE_OPAQUE_POINTER(Pointer)
+ \relates QMetaType
+
+ This macro enables pointers to forward-declared types to be registered with
+ QMetaType using either Q_DECLARE_METATYPE() or qRegisterMetaType().
+
+ \sa Q_DECLARE_METATYPE(), qRegisterMetaType()
+
+*/
/*!
\macro Q_DECLARE_METATYPE(Type)
@@ -126,6 +136,11 @@ template<> struct TypeDefinition<QRegExp> { static const bool IsAvailable = fals
a public destructor.
It is needed to use the type \a Type as a custom type in QVariant.
+ This macro requires that \a Type is a fully defined type at the point where
+ it is used. For pointer types, it also requires that the pointed to type is
+ fully defined. Use in conjunction with Q_DECLARE_OPAQUE_POINTER() to
+ register pointers to forward declared types.
+
Ideally, this macro should be placed below the declaration of
the class or struct. If that is not possible, it can be put in
a private header file which has to be included every time that
@@ -305,6 +320,12 @@ Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper = 0;
class QCustomTypeInfo : public QMetaTypeInterface
{
public:
+ QCustomTypeInfo()
+ : alias(-1)
+ {
+ QMetaTypeInterface empty = QT_METATYPE_INTERFACE_INIT(void);
+ *static_cast<QMetaTypeInterface*>(this) = empty;
+ }
QByteArray typeName;
int alias;
};
@@ -465,6 +486,8 @@ int QMetaType::registerType(const char *typeName, Deleter deleter,
int idx = qMetaTypeStaticType(normalizedTypeName.constData(),
normalizedTypeName.size());
+ int previousSize = 0;
+ int previousFlags = 0;
if (!idx) {
QWriteLocker locker(customTypesLock());
idx = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
@@ -485,8 +508,33 @@ int QMetaType::registerType(const char *typeName, Deleter deleter,
inf.flags = flags;
idx = ct->size() + User;
ct->append(inf);
+ return idx;
+ }
+
+ if (idx >= User) {
+ previousSize = ct->at(idx - User).size;
+ previousFlags = ct->at(idx - User).flags;
}
}
+
+ if (idx < User) {
+ previousSize = QMetaType::sizeOf(idx);
+ previousFlags = QMetaType::typeFlags(idx);
+ }
+
+ if (previousSize != size) {
+ qFatal("QMetaType::registerType: Binary compatibility break "
+ "-- Size mismatch for type '%s' [%i]. Previously registered "
+ "size %i, now registering size %i.",
+ normalizedTypeName.constData(), idx, previousSize, size);
+ }
+ if (previousFlags != flags) {
+ qFatal("QMetaType::registerType: Binary compatibility break "
+ "-- Type flags for type '%s' [%i] don't match. Previously "
+ "registered TypeFlags(0x%x), now registering TypeFlags(0x%x).",
+ normalizedTypeName.constData(), idx, previousFlags, int(flags));
+ }
+
return idx;
}
@@ -510,55 +558,30 @@ int QMetaType::registerTypedef(const char* typeName, int aliasId)
int idx = qMetaTypeStaticType(normalizedTypeName.constData(),
normalizedTypeName.size());
- if (idx) {
- Q_ASSERT(idx == aliasId);
- return idx;
- }
-
- QWriteLocker locker(customTypesLock());
- idx = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
- normalizedTypeName.size());
-
- if (idx)
- return idx;
-
- QCustomTypeInfo inf;
- inf.typeName = normalizedTypeName;
- inf.alias = aliasId;
- inf.creator = 0;
- inf.deleter = 0;
- ct->append(inf);
- return aliasId;
-}
-
-/*!
- \since 4.4
-
- Unregisters a user type, with \a typeName.
-
- \sa type(), typeName()
- */
-void QMetaType::unregisterType(const char *typeName)
-{
- QVector<QCustomTypeInfo> *ct = customTypes();
- if (!ct || !typeName)
- return;
+ if (!idx) {
+ QWriteLocker locker(customTypesLock());
+ idx = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
+ normalizedTypeName.size());
-#ifdef QT_NO_QOBJECT
- NS(QByteArray) normalizedTypeName = typeName;
-#else
- NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
-#endif
- QWriteLocker locker(customTypesLock());
- for (int v = 0; v < ct->count(); ++v) {
- if (ct->at(v).typeName == typeName) {
- QCustomTypeInfo &inf = (*ct)[v];
- inf.typeName.clear();
+ if (!idx) {
+ QCustomTypeInfo inf;
+ inf.typeName = normalizedTypeName;
+ inf.alias = aliasId;
inf.creator = 0;
inf.deleter = 0;
- inf.alias = -1;
+ ct->append(inf);
+ return aliasId;
}
}
+
+ if (idx != aliasId) {
+ qFatal("QMetaType::registerTypedef: Binary compatibility break "
+ "-- Type name '%s' previously registered as typedef of '%s' [%i], "
+ "now registering as typedef of '%s' [%i].",
+ normalizedTypeName.constData(), QMetaType::typeName(idx), idx,
+ QMetaType::typeName(aliasId), aliasId);
+ }
+ return idx;
}
/*!
@@ -1274,12 +1297,12 @@ class TypeDestroyer {
static void Destroy(const int type, void *where)
{
if (QTypeModuleInfo<T>::IsGui) {
- if (qMetaTypeGuiHelper)
+ if (Q_LIKELY(qMetaTypeGuiHelper))
qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].deleter(where);
return;
}
if (QTypeModuleInfo<T>::IsWidget) {
- if (qMetaTypeWidgetsHelper)
+ if (Q_LIKELY(qMetaTypeWidgetsHelper))
qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].deleter(where);
return;
}
@@ -1308,8 +1331,7 @@ private:
return;
deleter = ct->at(type - QMetaType::User).deleter;
}
- if (Q_LIKELY(deleter))
- deleter(where);
+ deleter(where);
}
const int m_type;
@@ -1338,19 +1360,15 @@ class TypeConstructor {
struct ConstructorImpl<T, /* IsAcceptedType = */ false> {
static void *Construct(const int type, void *where, const T *copy)
{
- QMetaType::Constructor ctor = 0;
- if (QTypeModuleInfo<T>::IsGui) {
- if (!qMetaTypeGuiHelper)
- return 0;
- ctor = qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].constructor;
- } else if (QTypeModuleInfo<T>::IsWidget) {
- if (!qMetaTypeWidgetsHelper)
- return 0;
- ctor = qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].constructor;
- } else
- return customTypeConstructor(type, where, copy);
-
- return ctor(where, copy);
+ if (QTypeModuleInfo<T>::IsGui)
+ return Q_LIKELY(qMetaTypeGuiHelper) ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].constructor(where, copy) : 0;
+
+ if (QTypeModuleInfo<T>::IsWidget)
+ return Q_LIKELY(qMetaTypeWidgetsHelper) ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].constructor(where, copy) : 0;
+
+ // This point can be reached only for known types that definition is not available, for example
+ // in bootstrap mode. We have no other choice then ignore it.
+ return 0;
}
};
public:
@@ -1367,15 +1385,15 @@ public:
private:
static void *customTypeConstructor(const int type, void *where, const void *copy)
{
- QMetaType::Constructor ctor = 0;
+ QMetaType::Constructor ctor;
const QVector<QCustomTypeInfo> * const ct = customTypes();
{
QReadLocker locker(customTypesLock());
- if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
+ if (Q_UNLIKELY(type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User))
return 0;
ctor = ct->at(type - QMetaType::User).constructor;
}
- return ctor ? ctor(where, copy) : 0;
+ return ctor(where, copy);
}
const int m_type;
@@ -1428,20 +1446,18 @@ class TypeDestructor {
struct DestructorImpl<T, /* IsAcceptedType = */ false> {
static void Destruct(const int type, void *where)
{
- QMetaType::Destructor dtor = 0;
if (QTypeModuleInfo<T>::IsGui) {
- if (!qMetaTypeGuiHelper)
- return;
- dtor = qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].destructor;
- } else if (QTypeModuleInfo<T>::IsWidget) {
- if (!qMetaTypeWidgetsHelper)
- return;
- dtor = qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].destructor;
- } else {
- customTypeDestructor(type, where);
+ if (Q_LIKELY(qMetaTypeGuiHelper))
+ qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].destructor(where);
return;
}
- dtor(where);
+ if (QTypeModuleInfo<T>::IsWidget) {
+ if (Q_LIKELY(qMetaTypeWidgetsHelper))
+ qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].destructor(where);
+ return;
+ }
+ // This point can be reached only for known types that definition is not available, for example
+ // in bootstrap mode. We have no other choice then ignore it.
}
};
public:
@@ -1457,16 +1473,14 @@ public:
private:
static void customTypeDestructor(const int type, void *where)
{
- QMetaType::Destructor dtor = 0;
+ QMetaType::Destructor dtor;
const QVector<QCustomTypeInfo> * const ct = customTypes();
{
QReadLocker locker(customTypesLock());
- if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
+ if (Q_UNLIKELY(type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User))
return;
dtor = ct->at(type - QMetaType::User).destructor;
}
- if (!dtor)
- return;
dtor(where);
}
@@ -1503,16 +1517,15 @@ class SizeOf {
struct SizeOfImpl<T, /* IsAcceptedType = */ false> {
static int Size(const int type)
{
- if (QTypeModuleInfo<T>::IsGui) {
- if (!qMetaTypeGuiHelper)
- return 0;
- return qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].size;
- } else if (QTypeModuleInfo<T>::IsWidget) {
- if (!qMetaTypeWidgetsHelper)
- return 0;
- return qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].size;
- }
- return customTypeSizeOf(type);
+ if (QTypeModuleInfo<T>::IsGui)
+ return Q_LIKELY(qMetaTypeGuiHelper) ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].size : 0;
+
+ if (QTypeModuleInfo<T>::IsWidget)
+ return Q_LIKELY(qMetaTypeWidgetsHelper) ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].size : 0;
+
+ // This point can be reached only for known types that definition is not available, for example
+ // in bootstrap mode. We have no other choice then ignore it.
+ return 0;
}
};
@@ -1529,7 +1542,7 @@ private:
{
const QVector<QCustomTypeInfo> * const ct = customTypes();
QReadLocker locker(customTypesLock());
- if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
+ if (Q_UNLIKELY(type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User))
return 0;
return ct->at(type - QMetaType::User).size;
}
@@ -1575,7 +1588,15 @@ class Flags
{
static quint32 Flags(const int type)
{
- return Flags::undefinedTypeFlags(type);
+ if (QTypeModuleInfo<T>::IsGui)
+ return Q_LIKELY(qMetaTypeGuiHelper) ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].flags : 0;
+
+ if (QTypeModuleInfo<T>::IsWidget)
+ return Q_LIKELY(qMetaTypeWidgetsHelper) ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].flags : 0;
+
+ // This point can be reached only for known types that definition is not available, for example
+ // in bootstrap mode. We have no other choice then ignore it.
+ return 0;
}
};
public:
@@ -1584,31 +1605,21 @@ public:
{}
template<typename T>
quint32 delegate(const T*) { return FlagsImpl<T>::Flags(m_type); }
+ quint32 delegate(const void*) { return 0; }
quint32 delegate(const QMetaTypeSwitcher::UnknownType*) { return customTypeFlags(m_type); }
private:
const int m_type;
static quint32 customTypeFlags(const int type)
{
const QVector<QCustomTypeInfo> * const ct = customTypes();
- if (!ct)
+ if (Q_UNLIKELY(!ct))
return 0;
QReadLocker locker(customTypesLock());
- if (ct->count() <= type - QMetaType::User)
+ if (Q_UNLIKELY(ct->count() <= type - QMetaType::User))
return 0;
return ct->at(type - QMetaType::User).flags;
}
- static quint32 undefinedTypeFlags(const int type);
};
-
-quint32 Flags::undefinedTypeFlags(const int type)
-{
- if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType)
- return qMetaTypeGuiHelper ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].flags : 0;
- else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType)
- return qMetaTypeWidgetsHelper ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].flags : 0;
- return customTypeFlags(type);
-}
-
} // namespace
/*!
@@ -1634,6 +1645,11 @@ QMetaType::TypeFlags QMetaType::typeFlags(int type)
public default constructor, a public copy constructor and a public
destructor can be registered.
+ This function requires that \c{T} is a fully defined type at the point
+ where the function is called. For pointer types, it also requires that the
+ pointed to type is fully defined. Use Q_DECLARE_OPAQUE_POINTER() to be able
+ to register pointers to forward declared types.
+
After a type has been registered, you can create and destroy
objects of that type dynamically at run-time.
@@ -1737,4 +1753,174 @@ QMetaType::TypeFlags QMetaType::typeFlags(int type)
\sa Q_DECLARE_METATYPE(), QMetaType::type()
*/
+namespace {
+class TypeInfo {
+ template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
+ struct TypeInfoImpl
+ {
+ TypeInfoImpl(const uint /* type */, QMetaTypeInterface &info)
+ {
+ QMetaTypeInterface tmp = QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(T);
+ info = tmp;
+ }
+ };
+
+ template<typename T>
+ struct TypeInfoImpl<T, /* IsAcceptedType = */ false>
+ {
+ TypeInfoImpl(const uint type, QMetaTypeInterface &info)
+ {
+ if (QTypeModuleInfo<T>::IsGui) {
+ if (Q_LIKELY(qMetaTypeGuiHelper))
+ info = qMetaTypeGuiHelper[type - QMetaType::FirstGuiType];
+ return;
+ }
+ if (QTypeModuleInfo<T>::IsWidget) {
+ if (Q_LIKELY(qMetaTypeWidgetsHelper))
+ info = qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType];
+ return;
+ }
+ }
+ };
+public:
+ QMetaTypeInterface info;
+ TypeInfo(const uint type)
+ : m_type(type)
+ {
+ QMetaTypeInterface tmp = QT_METATYPE_INTERFACE_INIT_EMPTY();
+ info = tmp;
+ }
+ template<typename T>
+ void delegate(const T*) { TypeInfoImpl<T>(m_type, info); }
+ void delegate(const void*) {}
+ void delegate(const QMetaTypeSwitcher::UnknownType*) { customTypeInfo(m_type); }
+private:
+ void customTypeInfo(const uint type)
+ {
+ const QVector<QCustomTypeInfo> * const ct = customTypes();
+ if (Q_UNLIKELY(!ct))
+ return;
+ QReadLocker locker(customTypesLock());
+ if (Q_LIKELY(uint(ct->count()) > type - QMetaType::User))
+ info = ct->at(type - QMetaType::User);
+ }
+
+ const uint m_type;
+};
+} // namespace
+
+QMetaType QMetaType::typeInfo(const int type)
+{
+ TypeInfo typeInfo(type);
+ QMetaTypeSwitcher::switcher<void>(typeInfo, type, 0);
+ return typeInfo.info.creator || !type ? QMetaType(QMetaType::NoExtensionFlags
+ , static_cast<const QMetaTypeInterface *>(0) // typeInfo::info is a temporary variable, we can't return address of it.
+ , typeInfo.info.creator
+ , typeInfo.info.deleter
+ , typeInfo.info.saveOp
+ , typeInfo.info.loadOp
+ , typeInfo.info.constructor
+ , typeInfo.info.destructor
+ , typeInfo.info.size
+ , typeInfo.info.flags
+ , type)
+ : QMetaType(-1);
+}
+
+QMetaType::QMetaType(const int typeId)
+ : m_typeId(typeId)
+{
+ if (Q_UNLIKELY(typeId == -1)) {
+ // Constructs invalid QMetaType instance.
+ m_extensionFlags = 0xffffffff;
+ Q_ASSERT(!isValid());
+ } else {
+ // TODO it can be better.
+ *this = QMetaType::typeInfo(typeId);
+ if (m_typeId > 0 && !m_creator) {
+ m_extensionFlags = 0xffffffff;
+ m_typeId = -1;
+ }
+ if (m_typeId == QMetaType::Void) {
+ m_extensionFlags = CreateEx | DestroyEx | ConstructEx | DestructEx;
+ }
+ }
+}
+
+QMetaType::QMetaType(const QMetaType &other)
+ : m_creator(other.m_creator)
+ , m_deleter(other.m_deleter)
+ , m_saveOp(other.m_saveOp)
+ , m_loadOp(other.m_loadOp)
+ , m_constructor(other.m_constructor)
+ , m_destructor(other.m_destructor)
+ , m_extension(other.m_extension) // space reserved for future use
+ , m_size(other.m_size)
+ , m_typeFlags(other.m_typeFlags)
+ , m_extensionFlags(other.m_extensionFlags)
+ , m_typeId(other.m_typeId)
+{}
+
+QMetaType &QMetaType::operator =(const QMetaType &other)
+{
+ m_creator = other.m_creator;
+ m_deleter = other.m_deleter;
+ m_saveOp = other.m_saveOp;
+ m_loadOp = other.m_loadOp;
+ m_constructor = other.m_constructor;
+ m_destructor = other.m_destructor;
+ m_size = other.m_size;
+ m_typeFlags = other.m_typeFlags;
+ m_extensionFlags = other.m_extensionFlags;
+ m_extension = other.m_extension; // space reserved for future use
+ m_typeId = other.m_typeId;
+ return *this;
+}
+
+void QMetaType::ctor(const QMetaTypeInterface *info)
+{
+ // Special case for Void type, the type is valid but not constructible.
+ // In future we may consider to remove this assert and extend this function to initialize
+ // differently m_extensionFlags for different types. Currently it is not needed.
+ Q_ASSERT(m_typeId == QMetaType::Void);
+ Q_UNUSED(info);
+ m_extensionFlags = CreateEx | DestroyEx | ConstructEx | DestructEx;
+}
+
+void QMetaType::dtor()
+{}
+
+void *QMetaType::createExtended(const void *copy) const
+{
+ Q_UNUSED(copy);
+ return 0;
+}
+
+void QMetaType::destroyExtended(void *data) const
+{
+ Q_UNUSED(data);
+}
+
+void *QMetaType::constructExtended(void *where, const void *copy) const
+{
+ Q_UNUSED(where);
+ Q_UNUSED(copy);
+ return 0;
+}
+
+void QMetaType::destructExtended(void *data) const
+{
+ Q_UNUSED(data);
+}
+
+uint QMetaType::sizeExtended() const
+{
+ return 0;
+}
+
+QMetaType::TypeFlags QMetaType::flagsExtended() const
+{
+ return 0;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 0ea9d26394..4af77fcedc 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -177,13 +177,22 @@ QT_BEGIN_NAMESPACE
TypeName = Id,
class QDataStream;
+class QMetaTypeInterface;
class Q_CORE_EXPORT QMetaType {
+ enum ExtensionFlag { NoExtensionFlags,
+ CreateEx = 0x1, DestroyEx = 0x2,
+ ConstructEx = 0x4, DestructEx = 0x8,
+ NameEx = 0x10, SizeEx = 0x20,
+ CtorEx = 0x40, DtorEx = 0x80,
+ FlagsEx = 0x100
+ };
public:
enum Type {
// these are merged with QVariant
QT_FOR_EACH_STATIC_TYPE(QT_DEFINE_METATYPE_ID)
+ FirstCoreType = Void,
LastCoreType = QModelIndex,
FirstGuiType = QFont,
LastGuiType = QPolygonF,
@@ -194,7 +203,7 @@ public:
// This logic must match the one in qglobal.h
#if defined(QT_COORD_TYPE)
QReal = 0,
-#elif defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE)
+#elif defined(QT_NO_FPU) || defined(Q_PROCESSOR_ARM) || defined(Q_OS_WINCE)
QReal = Float,
#else
QReal = Double,
@@ -217,9 +226,9 @@ public:
typedef void (*Destructor)(void *);
typedef void *(*Constructor)(void *, const void *);
-#ifndef QT_NO_DATASTREAM
typedef void (*SaveOperator)(QDataStream &, const void *);
typedef void (*LoadOperator)(QDataStream &, void *);
+#ifndef QT_NO_DATASTREAM
static void registerStreamOperators(const char *typeName, SaveOperator saveOp,
LoadOperator loadOp);
static void registerStreamOperators(int type, SaveOperator saveOp,
@@ -247,12 +256,61 @@ public:
static void destroy(int type, void *data);
static void *construct(int type, void *where, const void *copy);
static void destruct(int type, void *where);
- static void unregisterType(const char *typeName);
#ifndef QT_NO_DATASTREAM
static bool save(QDataStream &stream, int type, const void *data);
static bool load(QDataStream &stream, int type, void *data);
#endif
+
+ QMetaType(const int type);
+ inline ~QMetaType();
+
+ inline bool isValid() const;
+ inline bool isRegistered() const;
+ inline int sizeOf() const;
+ inline TypeFlags flags() const;
+
+ inline void *create(const void *copy = 0) const;
+ inline void destroy(void *data) const;
+ inline void *construct(void *where, const void *copy = 0) const;
+ inline void destruct(void *data) const;
+private:
+ static QMetaType typeInfo(const int type);
+ inline QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info,
+ Creator creator,
+ Deleter deleter,
+ SaveOperator saveOp,
+ LoadOperator loadOp,
+ Constructor constructor,
+ Destructor destructor,
+ uint sizeOf,
+ uint theTypeFlags,
+ int typeId);
+ QMetaType(const QMetaType &other);
+ QMetaType &operator =(const QMetaType &);
+ inline bool isExtended(const ExtensionFlag flag) const { return m_extensionFlags & flag; }
+
+ // Methods used for future binary compatibile extensions
+ void ctor(const QMetaTypeInterface *info);
+ void dtor();
+ uint sizeExtended() const;
+ QMetaType::TypeFlags flagsExtended() const;
+ void *createExtended(const void *copy = 0) const;
+ void destroyExtended(void *data) const;
+ void *constructExtended(void *where, const void *copy = 0) const;
+ void destructExtended(void *data) const;
+
+ Creator m_creator;
+ Deleter m_deleter;
+ SaveOperator m_saveOp;
+ LoadOperator m_loadOp;
+ Constructor m_constructor;
+ Destructor m_destructor;
+ void *m_extension; // space reserved for future use
+ uint m_size;
+ uint m_typeFlags;
+ uint m_extensionFlags;
+ int m_typeId;
};
#undef QT_DEFINE_METATYPE_ID
@@ -472,6 +530,16 @@ inline int qRegisterMetaTypeStreamOperators()
}
#endif
+#define Q_DECLARE_OPAQUE_POINTER(POINTER) \
+ QT_BEGIN_NAMESPACE namespace QtPrivate { \
+ template <> \
+ struct IsPointerToTypeDerivedFromQObject<POINTER > \
+ { \
+ enum { Value = false }; \
+ }; \
+ } QT_END_NAMESPACE \
+ /**/
+
#define Q_DECLARE_METATYPE(TYPE) \
QT_BEGIN_NAMESPACE \
template <> \
@@ -531,7 +599,7 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE<T> > \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (!metatype_id.load()) \
- metatype_id.storeRelease(qRegisterMetaType< SINGLE_ARG_TEMPLATE<T> >( QByteArray(QByteArray(#SINGLE_ARG_TEMPLATE "<") + QMetaType::typeName(qMetaTypeId<T>()) + ">"), \
+ metatype_id.storeRelease(qRegisterMetaType< SINGLE_ARG_TEMPLATE<T> >( QByteArray(QByteArray(#SINGLE_ARG_TEMPLATE "<") + QMetaType::typeName(qMetaTypeId<T>()) + ">").constData(), \
reinterpret_cast< SINGLE_ARG_TEMPLATE<T> *>(quintptr(-1)))); \
return metatype_id.loadAcquire(); \
} \
@@ -545,6 +613,91 @@ Q_DECLARE_METATYPE_TEMPLATE_1ARG(QSet)
Q_DECLARE_METATYPE_TEMPLATE_1ARG(QSharedPointer)
Q_DECLARE_METATYPE_TEMPLATE_1ARG(QLinkedList)
+inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info,
+ Creator creator,
+ Deleter deleter,
+ SaveOperator saveOp,
+ LoadOperator loadOp,
+ Constructor constructor,
+ Destructor destructor,
+ uint size,
+ uint theTypeFlags,
+ int typeId)
+ : m_creator(creator)
+ , m_deleter(deleter)
+ , m_saveOp(saveOp)
+ , m_loadOp(loadOp)
+ , m_constructor(constructor)
+ , m_destructor(destructor)
+ , m_size(size)
+ , m_typeFlags(theTypeFlags)
+ , m_extensionFlags(extensionFlags)
+ , m_typeId(typeId)
+{
+ if (Q_UNLIKELY(isExtended(CtorEx) || typeId == QMetaType::Void))
+ ctor(info);
+}
+
+inline QMetaType::~QMetaType()
+{
+ if (Q_UNLIKELY(isExtended(DtorEx)))
+ dtor();
+}
+
+inline bool QMetaType::isValid() const
+{
+ return m_typeId >= 0;
+}
+
+inline bool QMetaType::isRegistered() const
+{
+ return isValid();
+}
+
+inline void *QMetaType::create(const void *copy) const
+{
+ if (Q_UNLIKELY(isExtended(CreateEx)))
+ return createExtended(copy);
+ return m_creator(copy);
+}
+
+inline void QMetaType::destroy(void *data) const
+{
+ if (Q_UNLIKELY(isExtended(DestroyEx)))
+ return destroyExtended(data);
+ m_deleter(data);
+}
+
+inline void *QMetaType::construct(void *where, const void *copy) const
+{
+ if (Q_UNLIKELY(isExtended(ConstructEx)))
+ return constructExtended(where, copy);
+ return m_constructor(where, copy);
+}
+
+inline void QMetaType::destruct(void *data) const
+{
+ if (Q_UNLIKELY(isExtended(DestructEx)))
+ return destructExtended(data);
+ if (Q_UNLIKELY(!data))
+ return;
+ m_destructor(data);
+}
+
+inline int QMetaType::sizeOf() const
+{
+ if (Q_UNLIKELY(isExtended(SizeEx)))
+ return sizeExtended();
+ return m_size;
+}
+
+inline QMetaType::TypeFlags QMetaType::flags() const
+{
+ if (Q_UNLIKELY(isExtended(FlagsEx)))
+ return flagsExtended();
+ return QMetaType::TypeFlags(m_typeFlags);
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h
index c292f11764..e48c5d3033 100644
--- a/src/corelib/kernel/qmetatype_p.h
+++ b/src/corelib/kernel/qmetatype_p.h
@@ -132,10 +132,8 @@ public:
}
static void deleter(T *t) { delete t; }
- #ifndef QT_NO_DATASTREAM
static void saver(QDataStream &stream, const T *t) { stream << *t; }
static void loader(QDataStream &stream, T *t) { stream >> *t; }
- #endif // QT_NO_DATASTREAM
static void destructor(T *t)
{
Q_UNUSED(t) // Silence MSVC that warns for POD types.
@@ -151,37 +149,76 @@ public:
QMetaType::Creator creator;
QMetaType::Deleter deleter;
-#ifndef QT_NO_DATASTREAM
QMetaType::SaveOperator saveOp;
QMetaType::LoadOperator loadOp;
-#endif
QMetaType::Constructor constructor;
QMetaType::Destructor destructor;
int size;
quint32 flags; // same as QMetaType::TypeFlags
};
+template<>
+struct QMetaTypeInterface::Impl<void> {
+ static void *creator(const void *) { return 0; }
+ static void deleter(void *) {}
+ static void saver(QDataStream &, const void *) {}
+ static void loader(QDataStream &, void *) {}
+ static void destructor(void *){}
+ static void *constructor(void *, const void *) { return 0; }
+};
+
#ifndef QT_NO_DATASTREAM
# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
/*saveOp*/(reinterpret_cast<QMetaType::SaveOperator>(QMetaTypeInterface::Impl<Type>::saver)), \
/*loadOp*/(reinterpret_cast<QMetaType::LoadOperator>(QMetaTypeInterface::Impl<Type>::loader)),
+# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
+ /*saveOp*/ 0, \
+ /*loadOp*/ 0,
#else
-# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type)
+# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
+ /*saveOp*/ 0, \
+ /*loadOp*/ 0,
+# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
+ QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type)
#endif
-#define QT_METATYPE_INTERFACE_INIT(Type) \
+#define QT_METATYPE_INTERFACE_INIT_IMPL(Type, DATASTREAM_DELEGATE) \
{ \
/*creator*/(reinterpret_cast<QMetaType::Creator>(QMetaTypeInterface::Impl<Type>::creator)), \
/*deleter*/(reinterpret_cast<QMetaType::Deleter>(QMetaTypeInterface::Impl<Type>::deleter)), \
- QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
+ DATASTREAM_DELEGATE(Type) \
/*constructor*/(reinterpret_cast<QMetaType::Constructor>(QMetaTypeInterface::Impl<Type>::constructor)), \
/*destructor*/(reinterpret_cast<QMetaType::Destructor>(QMetaTypeInterface::Impl<Type>::destructor)), \
- /*size*/(sizeof(Type)), \
+ /*size*/(QTypeInfo<Type>::sizeOf), \
/*flags*/(!QTypeInfo<Type>::isStatic * QMetaType::MovableType) \
| (QTypeInfo<Type>::isComplex * QMetaType::NeedsConstruction) \
| (QTypeInfo<Type>::isComplex * QMetaType::NeedsDestruction) \
}
+
+/* These QT_METATYPE_INTERFACE_INIT* macros are used to initialize QMetaTypeInterface instance.
+
+ - QT_METATYPE_INTERFACE_INIT(Type) -> It takes Type argument and creates all necessary wrapper functions for the Type,
+ it detects if QT_NO_DATASTREAM was defined. Probably it is the macro that you want to use.
+
+ - QT_METATYPE_INTERFACE_INIT_EMPTY() -> It initializes an empty QMetaTypeInterface instance.
+
+ - QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(Type) -> Temporary workaround for missing auto-detection of data stream
+ operators. It creates same instance as QT_METATYPE_INTERFACE_INIT(Type) but with null stream operators callbacks.
+ */
+#define QT_METATYPE_INTERFACE_INIT(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL)
+#define QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL)
+#define QT_METATYPE_INTERFACE_INIT_EMPTY() \
+{ \
+ /*creator*/ 0, \
+ /*deleter*/ 0, \
+ QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL() \
+ /*constructor*/ 0, \
+ /*destructor*/ 0, \
+ /*size*/ 0, \
+ /*flags*/ 0 \
+}
+
QT_END_NAMESPACE
#endif // QMETATYPE_P_H
diff --git a/src/corelib/kernel/qmimedata.cpp b/src/corelib/kernel/qmimedata.cpp
index 25e2b3532b..cfe985da26 100644
--- a/src/corelib/kernel/qmimedata.cpp
+++ b/src/corelib/kernel/qmimedata.cpp
@@ -105,6 +105,28 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
Q_Q(const QMimeData);
QVariant data = q->retrieveData(format, type);
+
+ // Text data requested: fallback to URL data if available
+ if (format == QLatin1String("text/plain") && !data.isValid()) {
+ data = retrieveTypedData(QLatin1String("text/uri-list"), QVariant::List);
+ if (data.type() == QVariant::Url) {
+ data = QVariant(data.toUrl().toDisplayString());
+ } else if (data.type() == QVariant::List) {
+ QString text;
+ int numUrls = 0;
+ const QList<QVariant> list = data.toList();
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i).type() == QVariant::Url) {
+ text.append(list.at(i).toUrl().toDisplayString() + QLatin1Char('\n'));
+ ++numUrls;
+ }
+ }
+ if (numUrls == 1)
+ text.chop(1); // no final '\n' if there's only one URL
+ data = QVariant(text);
+ }
+ }
+
if (data.type() == type || !data.isValid())
return data;
@@ -326,6 +348,10 @@ QList<QUrl> QMimeData::urls() const
URLs correspond to the MIME type \c text/uri-list.
+ Since Qt 5.0, setUrls also exports the urls as plain text, if setText
+ was not called before, to make it possible to drop them into any lineedit
+ and text editor.
+
\sa hasUrls(), setData()
*/
void QMimeData::setUrls(const QList<QUrl> &urls)
@@ -385,7 +411,7 @@ void QMimeData::setText(const QString &text)
*/
bool QMimeData::hasText() const
{
- return hasFormat(QLatin1String("text/plain"));
+ return hasFormat(QLatin1String("text/plain")) || hasUrls();
}
/*!
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 4377355486..252a713872 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -2247,7 +2247,7 @@ static inline void check_and_warn_compat(const QMetaObject *sender, const QMetaM
call qRegisterMetaType() to register the data type before you
establish the connection.
- \sa disconnect(), sender(), qRegisterMetaType()
+ \sa disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE()
*/
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method,
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 315619761c..0b1fa8839f 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -76,6 +76,7 @@ class QString;
# define emit
#endif
#define Q_CLASSINFO(name, value)
+#define Q_PLUGIN_METADATA(x)
#define Q_INTERFACES(x)
#define Q_PROPERTY(text)
#define Q_PRIVATE_PROPERTY(d, text)
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index cfaf22c146..d0470ff796 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -787,7 +787,8 @@ const QVariant::Handler qt_dummy_variant_handler = {
static void customConstruct(QVariant::Private *d, const void *copy)
{
- const uint size = QMetaType::sizeOf(d->type);
+ const QMetaType type(d->type);
+ const uint size = type.sizeOf();
if (!size) {
d->type = QVariant::Invalid;
return;
@@ -795,11 +796,11 @@ static void customConstruct(QVariant::Private *d, const void *copy)
// this logic should match with QVariantIntegrator::CanUseInternalSpace
if (size <= sizeof(QVariant::Private::Data)
- && (QMetaType::typeFlags(d->type) & QMetaType::MovableType)) {
- QMetaType::construct(d->type, &d->data.ptr, copy);
+ && (type.flags() & QMetaType::MovableType)) {
+ type.construct(&d->data.ptr, copy);
d->is_shared = false;
} else {
- void *ptr = QMetaType::create(d->type, copy);
+ void *ptr = type.create(copy);
d->is_shared = true;
d->data.shared = new QVariant::PrivateShared(ptr);
}
@@ -1608,7 +1609,7 @@ QVariant::Type QVariant::nameToType(const char *name)
return Invalid;
int metaType = QMetaType::type(name);
- return metaType <= int(LastGuiType) ? QVariant::Type(metaType) : UserType;
+ return metaType <= int(UserType) ? QVariant::Type(metaType) : UserType;
}
#ifndef QT_NO_DATASTREAM
@@ -1670,7 +1671,9 @@ void QVariant::load(QDataStream &s)
return;
typeId = mapIdFromQt3ToCurrent[typeId];
} else if (s.version() < QDataStream::Qt_5_0) {
- if (typeId >= 128 && typeId != QVariant::UserType) {
+ if (typeId == 127 /* QVariant::UserType */) {
+ typeId = QMetaType::User;
+ } else if (typeId >= 128 && typeId != QVariant::UserType) {
// In Qt4 id == 128 was FirstExtCoreType. In Qt5 ExtCoreTypes set was merged to CoreTypes
// by moving all ids down by 97.
typeId -= 97;
@@ -1741,7 +1744,9 @@ void QVariant::save(QDataStream &s) const
return;
}
} else if (s.version() < QDataStream::Qt_5_0) {
- if (typeId >= 128 - 97 && typeId <= LastCoreType) {
+ if (typeId == QMetaType::User) {
+ typeId = 127; // QVariant::UserType had this value in Qt4
+ } else if (typeId >= 128 - 97 && typeId <= LastCoreType) {
// In Qt4 id == 128 was FirstExtCoreType. In Qt5 ExtCoreTypes set was merged to CoreTypes
// by moving all ids down by 97.
typeId += 97;
@@ -1762,7 +1767,7 @@ void QVariant::save(QDataStream &s) const
s << typeId;
if (s.version() >= QDataStream::Qt_4_2)
s << qint8(d.is_null);
- if (typeId == QVariant::UserType) {
+ if (d.type >= QVariant::UserType) {
s << QMetaType::typeName(userType());
}
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index 07ef4dc41e..089d0d643b 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -49,6 +49,7 @@
#include <QtCore/qmap.h>
#include <QtCore/qhash.h>
#include <QtCore/qstring.h>
+#include <QtCore/qobject.h>
QT_BEGIN_HEADER
@@ -88,6 +89,39 @@ inline QVariant qVariantFromValue(const T &);
template<typename T>
inline T qvariant_cast(const QVariant &);
+namespace QtPrivate {
+
+ template <typename Derived, typename Argument, typename ReturnType>
+ struct ObjectInvoker
+ {
+ static ReturnType invoke(Argument a)
+ {
+ return Derived::object(a);
+ }
+ };
+
+ template <typename Derived, typename Argument, typename ReturnType>
+ struct MetaTypeInvoker
+ {
+ static ReturnType invoke(Argument a)
+ {
+ return Derived::metaType(a);
+ }
+ };
+
+ template <typename Derived, typename T, typename Argument, typename ReturnType, bool = IsPointerToTypeDerivedFromQObject<T>::Value>
+ struct TreatAsQObjectBeforeMetaType : ObjectInvoker<Derived, Argument, ReturnType>
+ {
+ };
+
+ template <typename Derived, typename T, typename Argument, typename ReturnType>
+ struct TreatAsQObjectBeforeMetaType<Derived, T, Argument, ReturnType, false> : MetaTypeInvoker<Derived, Argument, ReturnType>
+ {
+ };
+
+ template<typename T> struct QVariantValueHelper;
+}
+
class Q_CORE_EXPORT QVariant
{
public:
@@ -153,7 +187,7 @@ class Q_CORE_EXPORT QVariant
Icon = QMetaType::QIcon,
SizePolicy = QMetaType::QSizePolicy,
- UserType = 127,
+ UserType = QMetaType::User,
LastType = 0xffffffff // need this so that gcc >= 3.4 allocates 32 bits for Type
};
@@ -375,14 +409,15 @@ protected:
#ifndef QT_NO_DEBUG_STREAM
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &);
#endif
- Private d;
#ifndef Q_NO_TEMPLATE_FRIENDS
template<typename T>
friend inline T qvariant_cast(const QVariant &);
+ template<typename T> friend struct QtPrivate::QVariantValueHelper;
protected:
#else
public:
#endif
+ Private d;
void create(int type, const void *copy);
bool cmp(const QVariant &other) const;
bool convert(const int t, void *ptr) const;
@@ -481,18 +516,35 @@ inline bool operator!=(const QVariant &v1, const QVariantComparisonHelper &v2)
}
#endif
+namespace QtPrivate {
+ template<typename T>
+ struct QVariantValueHelper : TreatAsQObjectBeforeMetaType<QVariantValueHelper<T>, T, const QVariant &, T>
+ {
+ static T metaType(const QVariant &v)
+ {
+ const int vid = qMetaTypeId<T>(static_cast<T *>(0));
+ if (vid == v.userType())
+ return *reinterpret_cast<const T *>(v.constData());
+ if (vid < int(QMetaType::User)) {
+ T t;
+ if (v.convert(QVariant::Type(vid), &t))
+ return t;
+ }
+ return T();
+ }
+#ifndef QT_NO_QOBJECT
+ static T object(const QVariant &v)
+ {
+ return qobject_cast<T>(QMetaType::typeFlags(v.userType()) & QMetaType::PointerToQObject ? v.d.data.o : 0);
+ }
+#endif
+ };
+}
+
#ifndef QT_MOC
template<typename T> inline T qvariant_cast(const QVariant &v)
{
- const int vid = qMetaTypeId<T>(static_cast<T *>(0));
- if (vid == v.userType())
- return *reinterpret_cast<const T *>(v.constData());
- if (vid < int(QMetaType::User)) {
- T t;
- if (v.convert(vid, &t))
- return t;
- }
- return T();
+ return QtPrivate::QVariantValueHelper<T>::invoke(v);
}
template<> inline QVariant qvariant_cast<QVariant>(const QVariant &v)
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h
index 7065bcfd6b..cdae8997a7 100644
--- a/src/corelib/kernel/qvariant_p.h
+++ b/src/corelib/kernel/qvariant_p.h
@@ -53,9 +53,6 @@
// We mean it.
//
-// takes a type, returns the internal void* pointer cast
-// to a pointer of the input type
-
#include <QtCore/qglobal.h>
#include <QtCore/qvariant.h>
#include <QtCore/private/qmetatype_p.h>
@@ -79,6 +76,8 @@ Q_STATIC_ASSERT(QVariantIntegrator<qulonglong>::CanUseInternalSpace);
#ifdef Q_CC_SUN // Sun CC picks the wrong overload, so introduce awful hack
+// takes a type, returns the internal void* pointer cast
+// to a pointer of the input type
template <typename T>
inline T *v_cast(const QVariant::Private *nd, T * = 0)
{
@@ -348,14 +347,6 @@ public:
void delegate(const QMetaTypeSwitcher::UnknownType*)
{
- if (m_x->type == QVariant::UserType) {
- // TODO get rid of it
- // And yes! we can support historical magic, unkonwn/unconstructed user type isn't that
- // awesome? this QVariant::isValid will be true!
- m_x->is_null = !m_copy;
- m_x->is_shared = false;
- return;
- }
qWarning("Trying to construct an instance of an invalid type, type id: %i", m_x->type);
m_x->type = QVariant::Invalid;
}
@@ -406,8 +397,6 @@ public:
void delegate(const QMetaTypeSwitcher::UnknownType*)
{
- if (m_d->type == QVariant::UserType)
- return;
qWarning("Trying to destruct an instance of an invalid type, type id: %i", m_d->type);
}
// Ignore nonconstructible type
@@ -454,10 +443,7 @@ public:
void delegate(const QMetaTypeSwitcher::UnknownType*)
{
- if (m_d->type == QVariant::UserType)
- m_debugStream.nospace() << "QVariant::UserType";
- else
- qWarning("Trying to stream an instance of an invalid type, type id: %i", m_d->type);
+ qWarning("Trying to stream an instance of an invalid type, type id: %i", m_d->type);
}
void delegate(const void*)
{
diff --git a/src/corelib/mimetypes/mime/packages/freedesktop.org.xml b/src/corelib/mimetypes/mime/packages/freedesktop.org.xml
new file mode 100644
index 0000000000..f607f1d3ff
--- /dev/null
+++ b/src/corelib/mimetypes/mime/packages/freedesktop.org.xml
@@ -0,0 +1,31966 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mime-info [
+ <!ELEMENT mime-info (mime-type)+>
+ <!ATTLIST mime-info xmlns CDATA #FIXED "http://www.freedesktop.org/standards/shared-mime-info">
+
+ <!ELEMENT mime-type (comment+, (acronym,expanded-acronym)? , (generic-icon? | glob | magic | treemagic | root-XML | alias | sub-class-of)*)>
+ <!ATTLIST mime-type type CDATA #REQUIRED>
+
+ <!-- a comment describing a document with the respective MIME type. Example: "WMV video" -->
+ <!ELEMENT comment (#PCDATA)>
+ <!ATTLIST comment xml:lang CDATA #IMPLIED>
+
+ <!-- a comment describing the respective unexpanded MIME type acronym. Example: "WMV" -->
+ <!ELEMENT acronym (#PCDATA)>
+ <!ATTLIST acronym xml:lang CDATA #IMPLIED>
+
+ <!-- a comment describing the respective expanded MIME type acronym. Example: "Windows Media Video" -->
+ <!ELEMENT expanded-acronym (#PCDATA)>
+ <!ATTLIST expanded-acronym xml:lang CDATA #IMPLIED>
+
+ <!-- a generic icon name as per the Icon Naming Specification, only required if computing
+ it from the mime-type would not work, See "generic-icon" in the Shared Mime Specification -->
+ <!ELEMENT generic-icon EMPTY>
+ <!ATTLIST generic-icon name (application-x-executable|audio-x-generic|font-x-generic|image-x-generic|package-x-generic|text-html|text-x-generic|text-x-generic-template|text-x-script|video-x-generic|x-office-address-book|x-office-calendar|x-office-document|x-office-presentation|x-office-spreadsheet) #IMPLIED>
+
+ <!ELEMENT glob EMPTY>
+ <!ATTLIST glob pattern CDATA #REQUIRED>
+ <!ATTLIST glob weight CDATA #IMPLIED>
+ <!ATTLIST glob case-sensitive CDATA #IMPLIED>
+
+ <!ELEMENT magic (match)+>
+ <!ATTLIST magic priority CDATA #IMPLIED>
+
+ <!ELEMENT match (match)*>
+ <!ATTLIST match offset CDATA #REQUIRED>
+ <!ATTLIST match type (string|big16|big32|little16|little32|host16|host32|byte) #REQUIRED>
+ <!ATTLIST match value CDATA #REQUIRED>
+ <!ATTLIST match mask CDATA #IMPLIED>
+
+ <!ELEMENT treemagic (treematch)+>
+ <!ATTLIST treemagic priority CDATA #IMPLIED>
+
+ <!ELEMENT treematch (treematch)*>
+ <!ATTLIST treematch path CDATA #REQUIRED>
+ <!ATTLIST treematch type (file|directory|link) #IMPLIED>
+ <!ATTLIST treematch match-case (true|false) #IMPLIED>
+ <!ATTLIST treematch executable (true|false) #IMPLIED>
+ <!ATTLIST treematch non-empty (true|false) #IMPLIED>
+ <!ATTLIST treematch mimetype CDATA #IMPLIED>
+
+ <!ELEMENT root-XML EMPTY>
+ <!ATTLIST root-XML namespaceURI CDATA #REQUIRED>
+ <!ATTLIST root-XML localName CDATA #REQUIRED>
+
+ <!ELEMENT alias EMPTY>
+ <!ATTLIST alias type CDATA #REQUIRED>
+
+ <!ELEMENT sub-class-of EMPTY>
+ <!ATTLIST sub-class-of type CDATA #REQUIRED>
+]>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/andrew-inset">
+ <comment>ATK inset</comment>
+ <comment xml:lang="ar">شكل ATK</comment>
+ <comment xml:lang="be@latin">Ustaŭka ATK</comment>
+ <comment xml:lang="bg">Сбор — ATK</comment>
+ <comment xml:lang="ca">inset ATK</comment>
+ <comment xml:lang="cs">Vložka ATK</comment>
+ <comment xml:lang="da">ATK-indsættelse</comment>
+ <comment xml:lang="de">ATK-Inset</comment>
+ <comment xml:lang="en_GB">ATK inset</comment>
+ <comment xml:lang="es">inserción ATK</comment>
+ <comment xml:lang="eu">ATK sartzapena</comment>
+ <comment xml:lang="fi">ATK-osio</comment>
+ <comment xml:lang="fo">ATK innskot</comment>
+ <comment xml:lang="fr">encart ATK</comment>
+ <comment xml:lang="ga">intlis ATK</comment>
+ <comment xml:lang="gl">conxunto ATK</comment>
+ <comment xml:lang="he">תוספת ATK</comment>
+ <comment xml:lang="hu">ATK betét</comment>
+ <comment xml:lang="id">Inset ATK</comment>
+ <comment xml:lang="it">Inset ATK</comment>
+ <comment xml:lang="ja">ATK インセット</comment>
+ <comment xml:lang="kk">ATK беті</comment>
+ <comment xml:lang="ko">ATK inset</comment>
+ <comment xml:lang="lt">ATK inset</comment>
+ <comment xml:lang="lv">ATK ielaidums</comment>
+ <comment xml:lang="nb">ATK-innsats</comment>
+ <comment xml:lang="nl">ATK-invoegsel</comment>
+ <comment xml:lang="nn">ATK-innskot</comment>
+ <comment xml:lang="pl">Wstawka ATK</comment>
+ <comment xml:lang="pt_BR">Conjunto de entrada do ATK</comment>
+ <comment xml:lang="ro">Inset ATK</comment>
+ <comment xml:lang="ru">вкладка ATK</comment>
+ <comment xml:lang="sk">Vložka ATK</comment>
+ <comment xml:lang="sl">Vložka ATK</comment>
+ <comment xml:lang="sq">Inset ATK</comment>
+ <comment xml:lang="sv">ATK-inlägg</comment>
+ <comment xml:lang="uk">вкладка ATK</comment>
+ <comment xml:lang="vi">Bộ dát ATK</comment>
+ <comment xml:lang="zh_CN">ATK 嵌入对象</comment>
+ <acronym>ATK</acronym>
+ <expanded-acronym>Andrew Toolkit</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.ez"/>
+ </mime-type>
+ <mime-type type="application/epub+zip">
+ <comment>electronic book document</comment>
+ <comment xml:lang="ar">مستند كتاب إلكتروني</comment>
+ <comment xml:lang="be@latin">elektronnaja kniha</comment>
+ <comment xml:lang="bg">Документ — електронна книга</comment>
+ <comment xml:lang="ca">document de llibre electrònic</comment>
+ <comment xml:lang="cs">Dokument elektronické knihy</comment>
+ <comment xml:lang="da">elektronisk bogdokument</comment>
+ <comment xml:lang="de">Elektronisches Buch</comment>
+ <comment xml:lang="es">documento de libro electrónico</comment>
+ <comment xml:lang="eu">liburu elektronikoaren dokumentua</comment>
+ <comment xml:lang="fi">elektroninen kirja</comment>
+ <comment xml:lang="fo">elektroniskbóka skjal</comment>
+ <comment xml:lang="fr">document livre électronique</comment>
+ <comment xml:lang="ga">leabhar leictreonach</comment>
+ <comment xml:lang="gl">documento de libro electrónico</comment>
+ <comment xml:lang="he">מסמך מסוג ספר אלקטרוני</comment>
+ <comment xml:lang="hu">elektronikus könyvdokumentum</comment>
+ <comment xml:lang="id">dokumen buku elektronik</comment>
+ <comment xml:lang="it">Documento libro elettronico</comment>
+ <comment xml:lang="ja">電子ブックドキュメント</comment>
+ <comment xml:lang="kk">электронды кітабы</comment>
+ <comment xml:lang="ko">전자책 문서</comment>
+ <comment xml:lang="lt">elektroninės knygos dokumentas</comment>
+ <comment xml:lang="lv">elektroniskās grāmatas dokuments</comment>
+ <comment xml:lang="nl">elektronisch boek</comment>
+ <comment xml:lang="nn">elektronisk bok-dokument</comment>
+ <comment xml:lang="pl">Dokument książki elektronicznej</comment>
+ <comment xml:lang="pt_BR">documento de livro eletrônico</comment>
+ <comment xml:lang="ro">document carte electronică</comment>
+ <comment xml:lang="ru">электронная книга</comment>
+ <comment xml:lang="sk">Dokument elektronickej knihy</comment>
+ <comment xml:lang="sl">dokument elektronske knjige</comment>
+ <comment xml:lang="sq">Dokument libri elektronik</comment>
+ <comment xml:lang="sv">elektroniskt bokdokument</comment>
+ <comment xml:lang="uk">документ електронної книги</comment>
+ <comment xml:lang="vi">tài liệu cuốn sách điện tử</comment>
+ <comment xml:lang="zh_CN">电子书文档</comment>
+ <comment xml:lang="zh_TW">電子書文件</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/epub+zip" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.epub"/>
+ </mime-type>
+ <mime-type type="application/illustrator">
+ <comment>Adobe Illustrator document</comment>
+ <comment xml:lang="ar">مستند أدوبي المصور</comment>
+ <comment xml:lang="be@latin">Dakument Adobe Illustrator</comment>
+ <comment xml:lang="bg">Документ — Adobe Illustrator</comment>
+ <comment xml:lang="ca">document d'Adobe Illustrator</comment>
+ <comment xml:lang="cs">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="da">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="de">Adobe-Illustrator-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Adobe Illustrator</comment>
+ <comment xml:lang="en_GB">Adobe Illustrator document</comment>
+ <comment xml:lang="eo">dokumento de Adobe Illustrator</comment>
+ <comment xml:lang="es">documento de Adobe Illustrator</comment>
+ <comment xml:lang="eu">Adobe Illustrator dokumentua</comment>
+ <comment xml:lang="fi">Adobe Illustrator -asiakirja</comment>
+ <comment xml:lang="fo">Adobe Illustrator skjal</comment>
+ <comment xml:lang="fr">document Adobe Illustrator</comment>
+ <comment xml:lang="ga">cáipéis Adobe Illustrator</comment>
+ <comment xml:lang="gl">documento de Adobe Ilustrator</comment>
+ <comment xml:lang="he">מסמך Adobe Ill</comment>
+ <comment xml:lang="hu">Adobe Illustrator-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Adobe Illustrator</comment>
+ <comment xml:lang="it">Documento Adobe Illustrator</comment>
+ <comment xml:lang="ja">Adobe Illustrator ドキュメント</comment>
+ <comment xml:lang="kk">Adobe Illustrator құжаты</comment>
+ <comment xml:lang="ko">어도비 일러스트레이터 문서</comment>
+ <comment xml:lang="lt">Adobe Illustrator dokumentas</comment>
+ <comment xml:lang="lv">Adobe Illustrator dokuments</comment>
+ <comment xml:lang="ms">Dokumen Adobe Illustrator</comment>
+ <comment xml:lang="nb">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="nl">Adobe Illustrator-document</comment>
+ <comment xml:lang="nn">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="pl">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="pt">documento Adobe Illustrator</comment>
+ <comment xml:lang="pt_BR">Documento do Adobe Illustrator</comment>
+ <comment xml:lang="ro">Document Adobe Illustrator</comment>
+ <comment xml:lang="ru">документ Adobe Illustrator</comment>
+ <comment xml:lang="sk">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="sl">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="sq">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="sr">Адоуби Илустратор документ</comment>
+ <comment xml:lang="sv">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="uk">документ Adobe Illustrator</comment>
+ <comment xml:lang="vi">Tài liệu Adobe Illustrator</comment>
+ <comment xml:lang="zh_CN">Adobe Illustrator 文档</comment>
+ <comment xml:lang="zh_TW">Adobe Illustrator 文件</comment>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.ai"/>
+ </mime-type>
+ <mime-type type="application/mac-binhex40">
+ <comment>Macintosh BinHex-encoded file</comment>
+ <comment xml:lang="ar">ملف Macintosh BinHex مشفر</comment>
+ <comment xml:lang="az">Macintosh BinHex-kodlanmış fayl</comment>
+ <comment xml:lang="be@latin">Fajł Macintosh, BinHex-zakadavany</comment>
+ <comment xml:lang="bg">Файл — кодиран във формат BinHex за Macintosh</comment>
+ <comment xml:lang="ca">fitxer codificat BinHex de Macintosh</comment>
+ <comment xml:lang="cs">Soubor kódovaný pomocí Macintosh BinHex</comment>
+ <comment xml:lang="cy">Ffeil BinHex-amgodwyd Macintosh</comment>
+ <comment xml:lang="da">Macintosh BinHex-kodet fil</comment>
+ <comment xml:lang="de">Macintosh-Datei (BinHex-kodiert)</comment>
+ <comment xml:lang="el">αρχείο Macintosh κωδικοποίησης BinHex</comment>
+ <comment xml:lang="en_GB">Macintosh BinHex-encoded file</comment>
+ <comment xml:lang="eo">dosiero kodigita laŭ Macintosh BinHex</comment>
+ <comment xml:lang="es">archivo Macintosh codificado con BinHex</comment>
+ <comment xml:lang="eu">Macintosh BinHex-ekin kodetutako fitxategia</comment>
+ <comment xml:lang="fi">Macintosh BinHex -koodattu tiedosto</comment>
+ <comment xml:lang="fo">Macintosh BinHex-bronglað fíla</comment>
+ <comment xml:lang="fr">fichier codé Macintosh BinHex</comment>
+ <comment xml:lang="ga">comhad ionchódaithe le Macintosh BinHex</comment>
+ <comment xml:lang="gl">ficheiro de Macintosh codificado con BinHex</comment>
+ <comment xml:lang="he">קובץ מסוג Macintosh BinHex-encoded</comment>
+ <comment xml:lang="hu">Macintosh BinHex kódolású fájl</comment>
+ <comment xml:lang="id">Berkas tersandi Macintosh BinHex</comment>
+ <comment xml:lang="it">File Macintosh codificato BinHex</comment>
+ <comment xml:lang="ja">Macintosh BinHex エンコードファイル</comment>
+ <comment xml:lang="kk">Macintosh BinHex кодталған файлы</comment>
+ <comment xml:lang="ko">맥킨토시 BinHex 인코딩된 압축 파일</comment>
+ <comment xml:lang="lt">Macintosh BinHex-encoded failas</comment>
+ <comment xml:lang="lv">Macintosh BinHex-kodēts fails</comment>
+ <comment xml:lang="ms">Fail terenkod-BinHex Macintosh</comment>
+ <comment xml:lang="nb">Macintosh BinHe-kodet arkiv</comment>
+ <comment xml:lang="nl">Macintosh BinHex-gecodeerd bestand</comment>
+ <comment xml:lang="nn">Macintosh BinHex-koda fil</comment>
+ <comment xml:lang="pl">Zakodowany w BinHex plik Macintosh</comment>
+ <comment xml:lang="pt">ficheiro codificado em BinHex de Macintosh</comment>
+ <comment xml:lang="pt_BR">Arquivo Macintosh codificado com BinHex</comment>
+ <comment xml:lang="ro">Fișier codat Macintosh BinHex</comment>
+ <comment xml:lang="ru">файл (закодированный Macintosh BinHex)</comment>
+ <comment xml:lang="sk">Súbor kódovaný pomocou Macintosh BinHex</comment>
+ <comment xml:lang="sl">Kodirana datoteka Macintosh (BinHex)</comment>
+ <comment xml:lang="sq">File Macintosh i kodifikuar BinHex</comment>
+ <comment xml:lang="sr">Мекинтош BinHex-encoded датотека</comment>
+ <comment xml:lang="sv">Macintosh BinHex-kodad fil</comment>
+ <comment xml:lang="uk">файл закодований Macintosh BinHex</comment>
+ <comment xml:lang="vi">Tập tin đã mã hoá BinHex của Macintosh</comment>
+ <comment xml:lang="zh_CN">Macintosh BinHex 编码的文件</comment>
+ <comment xml:lang="zh_TW">Macintosh BinHex 編碼檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="must be converted with BinHex" type="string" offset="11"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/mathematica">
+ <comment>Mathematica Notebook</comment>
+ <comment xml:lang="ar">مذكرة رياضيات</comment>
+ <comment xml:lang="be@latin">Natatnik Mathematica</comment>
+ <comment xml:lang="bg">Тетрадка — Mathematica</comment>
+ <comment xml:lang="ca">llibreta de notes de Mathematica</comment>
+ <comment xml:lang="cs">Sešit Mathematica</comment>
+ <comment xml:lang="da">Mathematica Notebook</comment>
+ <comment xml:lang="de">Mathematica-Dokument</comment>
+ <comment xml:lang="en_GB">Mathematica Notebook</comment>
+ <comment xml:lang="es">notebook de Mathematica</comment>
+ <comment xml:lang="eu">Mathematica Notebook</comment>
+ <comment xml:lang="fi">Mathematica-muistilehtiö</comment>
+ <comment xml:lang="fo">Mathematica skriviblokkur</comment>
+ <comment xml:lang="fr">carnet de notes Mathematica</comment>
+ <comment xml:lang="ga">leabhar nótaí Mathematica</comment>
+ <comment xml:lang="gl">notebook de Mathematica</comment>
+ <comment xml:lang="he">מחברת מתמטיקה</comment>
+ <comment xml:lang="hu">Mathematica notesz</comment>
+ <comment xml:lang="id">Mathematica Notebook</comment>
+ <comment xml:lang="it">Notebook Mathematica</comment>
+ <comment xml:lang="ja">Mathematica ノートブック</comment>
+ <comment xml:lang="kk">Mathematica Notebook</comment>
+ <comment xml:lang="ko">Mathematica 노트북</comment>
+ <comment xml:lang="lt">Mathematica užrašinė</comment>
+ <comment xml:lang="lv">Mathematica bloknots</comment>
+ <comment xml:lang="nb">Mathematica notisblokk</comment>
+ <comment xml:lang="nl">Mathematica-notitieboek</comment>
+ <comment xml:lang="nn">Mathematica-notatbok</comment>
+ <comment xml:lang="pl">Notatnik Mathematica</comment>
+ <comment xml:lang="pt_BR">Caderno do Mathematica</comment>
+ <comment xml:lang="ro">Carnețel Mathematica</comment>
+ <comment xml:lang="ru">Mathematica Notebook</comment>
+ <comment xml:lang="sk">Zošit Mathematica</comment>
+ <comment xml:lang="sl">Datoteka dokumenta Mathematica</comment>
+ <comment xml:lang="sq">Notebook matematike</comment>
+ <comment xml:lang="sv">Mathematica Notebook-dokument</comment>
+ <comment xml:lang="uk">математичний записник</comment>
+ <comment xml:lang="vi">Cuốn vở Mathematica</comment>
+ <comment xml:lang="zh_CN">Mathematica 记事</comment>
+ <comment xml:lang="zh_TW">Mathematica Notebook</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.nb"/>
+ <magic priority="50">
+ <match value="(************** Content-type: application/mathematica" type="string" offset="0"/>
+ <match value="This notebook can be used on any computer system with Mathematica" type="string" offset="100:256"/>
+ <match value="This is a Mathematica Notebook file. It contains ASCII text" type="string" offset="10:256"/>
+ </magic>
+ <alias type="application/x-mathematica"/>
+ </mime-type>
+ <mime-type type="application/mathml+xml">
+ <comment>MathML document</comment>
+ <comment xml:lang="ar">مستند MathML</comment>
+ <comment xml:lang="az">MathML sənədi</comment>
+ <comment xml:lang="be@latin">Dakument MathML</comment>
+ <comment xml:lang="bg">Документ — MathML</comment>
+ <comment xml:lang="ca">document de MathML</comment>
+ <comment xml:lang="cs">Dokument MathML</comment>
+ <comment xml:lang="cy">Dogfen MathML</comment>
+ <comment xml:lang="da">MathML-dokument</comment>
+ <comment xml:lang="de">MathML-Dokument</comment>
+ <comment xml:lang="el">έγγραφο MathML</comment>
+ <comment xml:lang="en_GB">MathML document</comment>
+ <comment xml:lang="eo">MathML-dokumento</comment>
+ <comment xml:lang="es">documento MathML</comment>
+ <comment xml:lang="eu">MathML dokumentua</comment>
+ <comment xml:lang="fi">MathML-asiakirja</comment>
+ <comment xml:lang="fo">MathML skjal</comment>
+ <comment xml:lang="fr">document MathML</comment>
+ <comment xml:lang="ga">cáipéis MathML</comment>
+ <comment xml:lang="gl">documento de MathML</comment>
+ <comment xml:lang="he">מסמך MathML</comment>
+ <comment xml:lang="hu">MathML-dokumentum</comment>
+ <comment xml:lang="id">Dokumen MathML</comment>
+ <comment xml:lang="it">Documento MathML</comment>
+ <comment xml:lang="ja">MathML ドキュメント</comment>
+ <comment xml:lang="kk">MathML құжаты</comment>
+ <comment xml:lang="ko">MathML 문서</comment>
+ <comment xml:lang="lt">MathML dokumentas</comment>
+ <comment xml:lang="lv">MathML dokuments</comment>
+ <comment xml:lang="ms">Dokumen MathML</comment>
+ <comment xml:lang="nb">MathML-dokument</comment>
+ <comment xml:lang="nl">MathML-document</comment>
+ <comment xml:lang="nn">MathML-dokument</comment>
+ <comment xml:lang="pl">Dokument MathML</comment>
+ <comment xml:lang="pt">documento MathML</comment>
+ <comment xml:lang="pt_BR">Documento do MathML</comment>
+ <comment xml:lang="ro">Document MathML</comment>
+ <comment xml:lang="ru">документ MathML</comment>
+ <comment xml:lang="sk">Dokument MathML</comment>
+ <comment xml:lang="sl">Dokument MathML</comment>
+ <comment xml:lang="sq">Dokument MathML</comment>
+ <comment xml:lang="sr">MathML документ</comment>
+ <comment xml:lang="sv">MathML-dokument</comment>
+ <comment xml:lang="uk">документ MathML</comment>
+ <comment xml:lang="vi">Tài liệu MathML</comment>
+ <comment xml:lang="zh_CN">MathML 文档</comment>
+ <comment xml:lang="zh_TW">MathML 文件</comment>
+ <acronym>MathML</acronym>
+ <expanded-acronym>Mathematical Markup Language</expanded-acronym>
+ <alias type="text/mathml"/>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.mml"/>
+ <root-XML namespaceURI="http://www.w3.org/1998/Math/MathML" localName="math"/>
+ </mime-type>
+ <mime-type type="application/mbox">
+ <comment>mailbox file</comment>
+ <comment xml:lang="ar">ملف صندوق البريد</comment>
+ <comment xml:lang="be@latin">fajł paštovaj skryni</comment>
+ <comment xml:lang="bg">Файл — Mailbox</comment>
+ <comment xml:lang="ca">fitxer mailbox</comment>
+ <comment xml:lang="cs">Soubor mailbox</comment>
+ <comment xml:lang="da">postkassefil</comment>
+ <comment xml:lang="de">Mailbox-Datei</comment>
+ <comment xml:lang="es">archivo de buzón de correo</comment>
+ <comment xml:lang="eu">mailbox fitxategia</comment>
+ <comment xml:lang="fi">mailbox-tiedosto</comment>
+ <comment xml:lang="fo">postkassafíla</comment>
+ <comment xml:lang="fr">fichier boîte aux lettres</comment>
+ <comment xml:lang="ga">comhad bhosca poist</comment>
+ <comment xml:lang="gl">ficheiro de caixa de correo</comment>
+ <comment xml:lang="he">קובץ תיבת-דואר</comment>
+ <comment xml:lang="hu">mailbox fájl</comment>
+ <comment xml:lang="id">berkas kotak surat</comment>
+ <comment xml:lang="it">File mailbox</comment>
+ <comment xml:lang="ja">メールボックスファイル</comment>
+ <comment xml:lang="kk">пошта жәшігінің файлы</comment>
+ <comment xml:lang="ko">메일함 파일</comment>
+ <comment xml:lang="lt">pašto dėžutės failas</comment>
+ <comment xml:lang="lv">pastkastītes fails</comment>
+ <comment xml:lang="nb">postboksfil</comment>
+ <comment xml:lang="nl">mailbox-bestand</comment>
+ <comment xml:lang="nn">mailbox-fil</comment>
+ <comment xml:lang="pl">Plik poczty (Mailbox)</comment>
+ <comment xml:lang="pt_BR">Arquivo de caixa de correio</comment>
+ <comment xml:lang="ro">fișier căsuță poștală</comment>
+ <comment xml:lang="ru">файл почтового ящика</comment>
+ <comment xml:lang="sk">Súbor mailbox</comment>
+ <comment xml:lang="sl">datoteka poštnega predala</comment>
+ <comment xml:lang="sq">File mailbox</comment>
+ <comment xml:lang="sv">brevlådefil</comment>
+ <comment xml:lang="uk">файл поштової скриньки</comment>
+ <comment xml:lang="vi">tập tin hộp thư</comment>
+ <comment xml:lang="zh_CN">mailbox 文件</comment>
+ <comment xml:lang="zh_TW">郵箱檔</comment>
+ <generic-icon name="text-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="20">
+ <match value="From " type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mbox"/>
+ </mime-type>
+ <mime-type type="application/metalink+xml">
+ <comment>Metalink file</comment>
+ <comment xml:lang="ar">ملف ميتالنك</comment>
+ <comment xml:lang="bg">Изтегляне — Metalink</comment>
+ <comment xml:lang="ca">fitxer Metalink</comment>
+ <comment xml:lang="cs">Soubor metalink</comment>
+ <comment xml:lang="da">Metahenvisningsfil</comment>
+ <comment xml:lang="de">Metalink-Datei</comment>
+ <comment xml:lang="eo">Metalink-dosiero</comment>
+ <comment xml:lang="es">archivo de metaenlace</comment>
+ <comment xml:lang="eu">Metaestekaren fitxategia</comment>
+ <comment xml:lang="fi">Metalink-tiedosto</comment>
+ <comment xml:lang="fo">Metalink fíla</comment>
+ <comment xml:lang="fr">fichier metalink</comment>
+ <comment xml:lang="ga">comhad Metalink</comment>
+ <comment xml:lang="gl">ficheiro Metalink</comment>
+ <comment xml:lang="he">קובץ Metalink</comment>
+ <comment xml:lang="hu">Metalink fájl</comment>
+ <comment xml:lang="id">Berkas Metalink</comment>
+ <comment xml:lang="it">File Metalink</comment>
+ <comment xml:lang="ja">Metalink ファイル</comment>
+ <comment xml:lang="kk">Metalink файлы</comment>
+ <comment xml:lang="ko">Metalink 파일</comment>
+ <comment xml:lang="lt">Metalink failas</comment>
+ <comment xml:lang="lv">Metalink fails</comment>
+ <comment xml:lang="pl">Plik Metalink</comment>
+ <comment xml:lang="ro">Fișier Metalink</comment>
+ <comment xml:lang="ru">файл Metalink</comment>
+ <comment xml:lang="sk">Súbor Metalink</comment>
+ <comment xml:lang="sl">Datoteka povezave Metalink</comment>
+ <comment xml:lang="sv">Metalink-fil</comment>
+ <comment xml:lang="uk">файл метапосилання</comment>
+ <comment xml:lang="zh_CN">元链接文件</comment>
+ <comment xml:lang="zh_TW">Metalink 檔案</comment>
+ <sub-class-of type="application/xml"/>
+ <magic priority="50">
+ <match value="&lt;metalink version=&quot;3.0&quot;" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.metalink"/>
+ <root-XML namespaceURI="http://www.metalinker.org/" localName="metalink"/>
+ </mime-type>
+ <mime-type type="application/metalink4+xml">
+ <comment>Metalink file</comment>
+ <comment xml:lang="ar">ملف ميتالنك</comment>
+ <comment xml:lang="bg">Изтегляне — Metalink</comment>
+ <comment xml:lang="ca">fitxer Metalink</comment>
+ <comment xml:lang="cs">Soubor metalink</comment>
+ <comment xml:lang="da">Metahenvisningsfil</comment>
+ <comment xml:lang="de">Metalink-Datei</comment>
+ <comment xml:lang="eo">Metalink-dosiero</comment>
+ <comment xml:lang="es">archivo de metaenlace</comment>
+ <comment xml:lang="eu">Metaestekaren fitxategia</comment>
+ <comment xml:lang="fi">Metalink-tiedosto</comment>
+ <comment xml:lang="fo">Metalink fíla</comment>
+ <comment xml:lang="fr">fichier metalink</comment>
+ <comment xml:lang="ga">comhad Metalink</comment>
+ <comment xml:lang="gl">ficheiro Metalink</comment>
+ <comment xml:lang="he">קובץ Metalink</comment>
+ <comment xml:lang="hu">Metalink fájl</comment>
+ <comment xml:lang="id">Berkas Metalink</comment>
+ <comment xml:lang="it">File Metalink</comment>
+ <comment xml:lang="ja">Metalink ファイル</comment>
+ <comment xml:lang="kk">Metalink файлы</comment>
+ <comment xml:lang="ko">Metalink 파일</comment>
+ <comment xml:lang="lt">Metalink failas</comment>
+ <comment xml:lang="lv">Metalink fails</comment>
+ <comment xml:lang="pl">Plik Metalink</comment>
+ <comment xml:lang="ro">Fișier Metalink</comment>
+ <comment xml:lang="ru">файл Metalink</comment>
+ <comment xml:lang="sk">Súbor Metalink</comment>
+ <comment xml:lang="sl">Datoteka povezave Metalink</comment>
+ <comment xml:lang="sv">Metalink-fil</comment>
+ <comment xml:lang="uk">файл метапосилання</comment>
+ <comment xml:lang="zh_CN">元链接文件</comment>
+ <comment xml:lang="zh_TW">Metalink 檔案</comment>
+ <sub-class-of type="application/xml"/>
+ <magic priority="50">
+ <match value="&lt;metalink xmlns=&quot;urn" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.meta4"/>
+ <root-XML namespaceURI="urn:ietf:params:xml:ns:metalink" localName="metalink"/>
+ </mime-type>
+ <mime-type type="application/octet-stream">
+ <comment>unknown</comment>
+ <comment xml:lang="ar">مجهول</comment>
+ <comment xml:lang="be@latin">nieviadomy</comment>
+ <comment xml:lang="bg">Неизвестен тип</comment>
+ <comment xml:lang="ca">desconegut</comment>
+ <comment xml:lang="cs">Neznámý</comment>
+ <comment xml:lang="da">ukendt</comment>
+ <comment xml:lang="de">Unbekannt</comment>
+ <comment xml:lang="el">αγνωστο</comment>
+ <comment xml:lang="en_GB">unknown</comment>
+ <comment xml:lang="eo">nekonate</comment>
+ <comment xml:lang="es">desconocido</comment>
+ <comment xml:lang="eu">ezezaguna</comment>
+ <comment xml:lang="fi">tuntematon</comment>
+ <comment xml:lang="fo">ókent</comment>
+ <comment xml:lang="fr">inconnu</comment>
+ <comment xml:lang="ga">anaithnid</comment>
+ <comment xml:lang="gl">descoñecido</comment>
+ <comment xml:lang="he">לא ידוע</comment>
+ <comment xml:lang="hu">ismeretlen</comment>
+ <comment xml:lang="id">tak diketahui</comment>
+ <comment xml:lang="it">Sconosciuto</comment>
+ <comment xml:lang="ja">不明</comment>
+ <comment xml:lang="kk">белгісіз</comment>
+ <comment xml:lang="ko">알 수 없음</comment>
+ <comment xml:lang="lt">nežinoma</comment>
+ <comment xml:lang="lv">nezināms</comment>
+ <comment xml:lang="ms">Entah</comment>
+ <comment xml:lang="nb">ukjent</comment>
+ <comment xml:lang="nl">onbekend</comment>
+ <comment xml:lang="nn">ukjend</comment>
+ <comment xml:lang="pl">Nieznany typ</comment>
+ <comment xml:lang="pt">desconhecido</comment>
+ <comment xml:lang="pt_BR">desconhecido</comment>
+ <comment xml:lang="ro">necunoscut</comment>
+ <comment xml:lang="ru">неизвестно</comment>
+ <comment xml:lang="sk">Neznámy</comment>
+ <comment xml:lang="sl">neznano</comment>
+ <comment xml:lang="sq">Nuk njihet</comment>
+ <comment xml:lang="sr">непознато</comment>
+ <comment xml:lang="sv">okänd</comment>
+ <comment xml:lang="uk">невідомо</comment>
+ <comment xml:lang="vi">không rõ</comment>
+ <comment xml:lang="zh_CN">未知</comment>
+ <comment xml:lang="zh_TW">不明</comment>
+ <glob pattern="*.bin"/>
+ </mime-type>
+ <mime-type type="application/oda">
+ <comment>ODA document</comment>
+ <comment xml:lang="ar">مستند ODA</comment>
+ <comment xml:lang="az">ODA sənədi</comment>
+ <comment xml:lang="be@latin">Dakument ODA</comment>
+ <comment xml:lang="bg">Документ — ODA</comment>
+ <comment xml:lang="ca">document ODA</comment>
+ <comment xml:lang="cs">Dokument ODA</comment>
+ <comment xml:lang="cy">Dogfen ODA</comment>
+ <comment xml:lang="da">ODA-dokument</comment>
+ <comment xml:lang="de">ODA-Dokument</comment>
+ <comment xml:lang="el">έγγραφο ODA</comment>
+ <comment xml:lang="en_GB">ODA document</comment>
+ <comment xml:lang="eo">ODA-dokumento</comment>
+ <comment xml:lang="es">documento ODA</comment>
+ <comment xml:lang="eu">ODA dokumentua</comment>
+ <comment xml:lang="fi">ODA-asiakirja</comment>
+ <comment xml:lang="fo">ODA skjal</comment>
+ <comment xml:lang="fr">document ODA</comment>
+ <comment xml:lang="ga">cáipéis ODA</comment>
+ <comment xml:lang="gl">documento ODA</comment>
+ <comment xml:lang="he">מסמך ODA</comment>
+ <comment xml:lang="hu">ODA-dokumentum</comment>
+ <comment xml:lang="id">Dokumen ODA</comment>
+ <comment xml:lang="it">Documento ODA</comment>
+ <comment xml:lang="ja">ODA ドキュメント</comment>
+ <comment xml:lang="kk">ODA құжаты</comment>
+ <comment xml:lang="ko">ODA 문서</comment>
+ <comment xml:lang="lt">ODA dokumentas</comment>
+ <comment xml:lang="lv">ODA dokuments</comment>
+ <comment xml:lang="ms">Dokumen ODA</comment>
+ <comment xml:lang="nb">ODA-dokument</comment>
+ <comment xml:lang="nl">ODA-document</comment>
+ <comment xml:lang="nn">ODA-dokument</comment>
+ <comment xml:lang="pl">Dokument ODA</comment>
+ <comment xml:lang="pt">documento ODA</comment>
+ <comment xml:lang="pt_BR">Documento ODA</comment>
+ <comment xml:lang="ro">Document ODA</comment>
+ <comment xml:lang="ru">документ ODA</comment>
+ <comment xml:lang="sk">Dokument ODA</comment>
+ <comment xml:lang="sl">Dokument ODA</comment>
+ <comment xml:lang="sq">Dokument ODA</comment>
+ <comment xml:lang="sr">ODA документ</comment>
+ <comment xml:lang="sv">ODA-dokument</comment>
+ <comment xml:lang="uk">документ ODA</comment>
+ <comment xml:lang="vi">Tài liệu ODA</comment>
+ <comment xml:lang="zh_CN">ODA 文档</comment>
+ <comment xml:lang="zh_TW">ODA 文件</comment>
+ <acronym>ODA</acronym>
+ <expanded-acronym>Office Document Architecture</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.oda"/>
+ </mime-type>
+ <mime-type type="application/x-wwf">
+ <comment>WWF document</comment>
+ <comment xml:lang="bg">Документ — WWF</comment>
+ <comment xml:lang="ca">document WWF</comment>
+ <comment xml:lang="cs">Dokument WWF</comment>
+ <comment xml:lang="de">WWF-Dokument</comment>
+ <comment xml:lang="eo">WWF-dokumento</comment>
+ <comment xml:lang="es">Documento de WWF</comment>
+ <comment xml:lang="fi">WWF-asiakirja</comment>
+ <comment xml:lang="fr">document WWF</comment>
+ <comment xml:lang="gl">documento de WWF</comment>
+ <comment xml:lang="he">מסמך WWF</comment>
+ <comment xml:lang="hu">WWF dokumentum</comment>
+ <comment xml:lang="id">Dokumen WWF</comment>
+ <comment xml:lang="it">Documento WWF</comment>
+ <comment xml:lang="ja">WWF 文書</comment>
+ <comment xml:lang="kk">WWF құжаты</comment>
+ <comment xml:lang="ko">WWF 문서</comment>
+ <comment xml:lang="lv">WWF dokuments</comment>
+ <comment xml:lang="pl">Dokument WWF</comment>
+ <comment xml:lang="ru">документ WWF</comment>
+ <comment xml:lang="sl">Dokument WWF</comment>
+ <comment xml:lang="sv">WWF-dokument</comment>
+ <comment xml:lang="uk">документ WWF</comment>
+ <comment xml:lang="zh_CN">WWF</comment>
+ <comment xml:lang="zh_TW">WWF 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.wwf"/>
+ <sub-class-of type="application/pdf"/>
+ <alias type="application/wwf"/>
+ </mime-type>
+ <mime-type type="application/pdf">
+ <comment>PDF document</comment>
+ <comment xml:lang="ar">مستند PDF</comment>
+ <comment xml:lang="be@latin">Dakument PDF</comment>
+ <comment xml:lang="bg">Документ — PDF</comment>
+ <comment xml:lang="ca">document PDF</comment>
+ <comment xml:lang="cs">Dokument PDF</comment>
+ <comment xml:lang="cy">Dogfen PDF</comment>
+ <comment xml:lang="da">PDF-dokument</comment>
+ <comment xml:lang="de">PDF-Dokument</comment>
+ <comment xml:lang="el">έγγραφο PDF</comment>
+ <comment xml:lang="en_GB">PDF document</comment>
+ <comment xml:lang="eo">PDF-dokumento</comment>
+ <comment xml:lang="es">documento PDF</comment>
+ <comment xml:lang="eu">PDF dokumentua</comment>
+ <comment xml:lang="fi">PDF-asiakirja</comment>
+ <comment xml:lang="fo">PDF skjal</comment>
+ <comment xml:lang="fr">document PDF</comment>
+ <comment xml:lang="ga">cáipéis PDF</comment>
+ <comment xml:lang="gl">documento PDF</comment>
+ <comment xml:lang="he">מסמך PDF</comment>
+ <comment xml:lang="hu">PDF-dokumentum</comment>
+ <comment xml:lang="id">Dokumen PDF</comment>
+ <comment xml:lang="it">Documento PDF</comment>
+ <comment xml:lang="ja">PDF ドキュメント</comment>
+ <comment xml:lang="kk">PDF құжаты</comment>
+ <comment xml:lang="ko">PDF 문서</comment>
+ <comment xml:lang="lt">PDF dokumentas</comment>
+ <comment xml:lang="lv">PDF dokuments</comment>
+ <comment xml:lang="ms">Dokumen PDF</comment>
+ <comment xml:lang="nb">PDF-dokument</comment>
+ <comment xml:lang="nl">PDF-document</comment>
+ <comment xml:lang="nn">PDF-dokument</comment>
+ <comment xml:lang="pl">Dokument PDF</comment>
+ <comment xml:lang="pt">documento PDF</comment>
+ <comment xml:lang="pt_BR">Documento PDF</comment>
+ <comment xml:lang="ro">Document PDF</comment>
+ <comment xml:lang="ru">документ PDF</comment>
+ <comment xml:lang="sk">Dokument PDF</comment>
+ <comment xml:lang="sl">Dokument PDF</comment>
+ <comment xml:lang="sq">Dokument PDF</comment>
+ <comment xml:lang="sr">PDF документ</comment>
+ <comment xml:lang="sv">PDF-dokument</comment>
+ <comment xml:lang="uk">документ PDF</comment>
+ <comment xml:lang="vi">Tài liệu PDF</comment>
+ <comment xml:lang="zh_CN">PDF 文档</comment>
+ <comment xml:lang="zh_TW">PDF 文件</comment>
+ <acronym>PDF</acronym>
+ <expanded-acronym>Portable Document Format</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="%PDF-" type="string" offset="0:1024"/>
+ </magic>
+ <glob pattern="*.pdf"/>
+ <alias type="application/x-pdf"/>
+ <alias type="image/pdf"/>
+ <alias type="application/acrobat"/>
+ </mime-type>
+ <mime-type type="application/xspf+xml">
+ <comment>XSPF playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل XSPF</comment>
+ <comment xml:lang="be@latin">Śpis piesień XSPF</comment>
+ <comment xml:lang="bg">Списък за изпълнение — XSPF</comment>
+ <comment xml:lang="ca">llista de reproducció XSPF</comment>
+ <comment xml:lang="cs">Seznam skladeb XSPF</comment>
+ <comment xml:lang="da">XSPF-afspilningsliste</comment>
+ <comment xml:lang="de">XSPF-Wiedergabeliste</comment>
+ <comment xml:lang="eo">XSPF-ludlisto</comment>
+ <comment xml:lang="es">lista de reproducción XSPF</comment>
+ <comment xml:lang="eu">XSPF erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">XSPF-soittolista</comment>
+ <comment xml:lang="fo">XSPF avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture XSPF</comment>
+ <comment xml:lang="ga">seinmliosta XSPF</comment>
+ <comment xml:lang="gl">lista de reprodución XSPF</comment>
+ <comment xml:lang="he">רשימת השמעה XSPF</comment>
+ <comment xml:lang="hu">XSPF-lejátszólista</comment>
+ <comment xml:lang="id">Senarai pular XSPF</comment>
+ <comment xml:lang="it">Scaletta XSPF</comment>
+ <comment xml:lang="ja">XSPF 再生リスト</comment>
+ <comment xml:lang="kk">XSPF ойнау тізімі</comment>
+ <comment xml:lang="ko">XSPF 재생 목록</comment>
+ <comment xml:lang="lt">XSPF grojaraštis</comment>
+ <comment xml:lang="lv">XSPF repertuārs</comment>
+ <comment xml:lang="nb">XSPF-spilleliste</comment>
+ <comment xml:lang="nl">XSPF-afspeellijst</comment>
+ <comment xml:lang="nn">XSPF-speleliste</comment>
+ <comment xml:lang="pl">Lista odtwarzania XSPF</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução XSPF</comment>
+ <comment xml:lang="ro">Listă XSPF</comment>
+ <comment xml:lang="ru">список воспроизведения XSPF</comment>
+ <comment xml:lang="sk">Zoznam skladieb XSPF</comment>
+ <comment xml:lang="sl">Seznam predvajanja XSPF</comment>
+ <comment xml:lang="sq">Listë titujsh XSPF</comment>
+ <comment xml:lang="sv">XSPF-spellista</comment>
+ <comment xml:lang="uk">список програвання XSPF</comment>
+ <comment xml:lang="vi">Danh mục nhạc XSPF</comment>
+ <comment xml:lang="zh_CN">XSPF 播放列表</comment>
+ <comment xml:lang="zh_TW">XSPF 播放清單</comment>
+ <acronym>XSPF</acronym>
+ <expanded-acronym>XML Shareable Playlist Format</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="audio-x-generic"/>
+ <magic priority="50">
+ <match value="&lt;playlist version=&quot;1" type="string" offset="0:64"/>
+ <match value="&lt;playlist version='1" type="string" offset="0:64"/>
+ </magic>
+ <glob pattern="*.xspf"/>
+ <root-XML namespaceURI="http://xspf.org/ns/0/" localName="playlist"/>
+ <alias type="application/x-xspf+xml"/>
+ </mime-type>
+ <mime-type type="application/x-windows-themepack">
+ <comment>Microsoft Windows theme pack</comment>
+ <comment xml:lang="ar">حزمة سمات Microsoft Works</comment>
+ <comment xml:lang="bg">Пакет с тема — Microsoft Windows</comment>
+ <comment xml:lang="ca">paquet de temes Windows de Microsoft</comment>
+ <comment xml:lang="cs">Balík motivů Microsoft Windows</comment>
+ <comment xml:lang="da">Microsoft Windows-temapakke</comment>
+ <comment xml:lang="de">Themenpaket für Microsoft Windows</comment>
+ <comment xml:lang="es">paquete de tema para Microsoft Windows</comment>
+ <comment xml:lang="eu">Microsoft Windows-en gaiaren paketea</comment>
+ <comment xml:lang="fi">Microsoft Windows -teemapaketti</comment>
+ <comment xml:lang="fo">Microsoft Windows tema pakki</comment>
+ <comment xml:lang="fr">paquet de thèmes Microsoft Windows</comment>
+ <comment xml:lang="ga">paca téamaí Microsoft Windows</comment>
+ <comment xml:lang="gl">paquete de tema de Microsoft Windows</comment>
+ <comment xml:lang="he">חבילת ערכות נושא של Microsoft Windows</comment>
+ <comment xml:lang="hu">Microsoft Windows témacsomag</comment>
+ <comment xml:lang="id">Pak tema Microsoft Windows</comment>
+ <comment xml:lang="it">Pacchetto temi Microsoft Windows</comment>
+ <comment xml:lang="ja">Microsoft Windows テーマパック</comment>
+ <comment xml:lang="kk">Microsoft Windows тема дестесі</comment>
+ <comment xml:lang="ko">마이크로소프트 윈도우 테마 패키지</comment>
+ <comment xml:lang="lt">Microsoft Windows temų paketas</comment>
+ <comment xml:lang="lv">Microsoft Windows tēmas paka</comment>
+ <comment xml:lang="pl">Pakiet motywu Microsoft Windows</comment>
+ <comment xml:lang="ro">Pachet de teme Microsoft Windows</comment>
+ <comment xml:lang="ru">пакет темы Microsoft Windows</comment>
+ <comment xml:lang="sk">Balík tém Microsoft Windows</comment>
+ <comment xml:lang="sl">Datoteka teme Microsoft Windows</comment>
+ <comment xml:lang="sv">Microsoft Windows-temapaket</comment>
+ <comment xml:lang="uk">пакунок з темою Microsoft Windows</comment>
+ <comment xml:lang="zh_CN">Microsoft Windows 主题包</comment>
+ <comment xml:lang="zh_TW">微軟視窗佈景主題包</comment>
+ <sub-class-of type="application/vnd.ms-cab-compressed"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.themepack"/>
+ </mime-type>
+ <mime-type type="audio/x-gsm">
+ <comment>GSM 06.10 audio</comment>
+ <comment xml:lang="ar">GSM 06.10 سمعي</comment>
+ <comment xml:lang="bg">Аудио — GSM 06.10</comment>
+ <comment xml:lang="ca">àudio GSM 06.10</comment>
+ <comment xml:lang="cs">Zvuk GSM 06.10</comment>
+ <comment xml:lang="da">GSM 06.10-lyd</comment>
+ <comment xml:lang="de">GSM-06.10-Audio</comment>
+ <comment xml:lang="es">sonido GSM 06.10</comment>
+ <comment xml:lang="eu">GSM 06.10 audioa</comment>
+ <comment xml:lang="fi">GSM 06.10 -ääni</comment>
+ <comment xml:lang="fo">GSM 06.10 ljóður</comment>
+ <comment xml:lang="fr">audio GSM 06.10</comment>
+ <comment xml:lang="ga">fuaim GSM 06.10</comment>
+ <comment xml:lang="gl">son de GSM 06.10</comment>
+ <comment xml:lang="he">שמע GSM 06.10</comment>
+ <comment xml:lang="hu">GSM 06.10 hang</comment>
+ <comment xml:lang="id">Audio GSM 06.10</comment>
+ <comment xml:lang="it">Audio GSM 06.10</comment>
+ <comment xml:lang="ja">GSM 06.10 オーディオ</comment>
+ <comment xml:lang="kk">GSM 06.10 аудиосы</comment>
+ <comment xml:lang="ko">GSM 06.10 오디오</comment>
+ <comment xml:lang="lt">GSM 06.10 garso įrašas</comment>
+ <comment xml:lang="lv">GSM 06.10 audio</comment>
+ <comment xml:lang="nl">GSM 06.10 audio</comment>
+ <comment xml:lang="pl">Plik dźwiękowy GSM 06.10</comment>
+ <comment xml:lang="pt_BR">Áudio GSM 06.10</comment>
+ <comment xml:lang="ro">GSM 06.10 audio</comment>
+ <comment xml:lang="ru">аудио GSM 06.10</comment>
+ <comment xml:lang="sk">Zvuk GSM 06.10</comment>
+ <comment xml:lang="sl">Zvočna datoteka GSM 06.10</comment>
+ <comment xml:lang="sv">GSM 06.10-ljud</comment>
+ <comment xml:lang="uk">звук GSM 06.10</comment>
+ <comment xml:lang="vi">Âm thanh GSM 06.10</comment>
+ <comment xml:lang="zh_CN">GSM 06.10 音频</comment>
+ <comment xml:lang="zh_TW">GSM 06.10 音訊</comment>
+ <acronym>GSM</acronym>
+ <expanded-acronym>Global System for Mobile communications</expanded-acronym>
+ <glob pattern="*.gsm"/>
+ </mime-type>
+ <mime-type type="audio/x-iriver-pla">
+ <comment>iRiver Playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل iRiver</comment>
+ <comment xml:lang="be@latin">Śpis piesień iRiver</comment>
+ <comment xml:lang="bg">Списък за изпълнение — iRiver</comment>
+ <comment xml:lang="ca">llista de reproducció iRiver</comment>
+ <comment xml:lang="cs">Seznam skladeb iRiver</comment>
+ <comment xml:lang="da">iRiver-afspilningsliste</comment>
+ <comment xml:lang="de">iRiver-Wiedergabeliste</comment>
+ <comment xml:lang="eo">iRiver-ludlisto</comment>
+ <comment xml:lang="es">lista de reproducción de iRiver</comment>
+ <comment xml:lang="eu">iRiver erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">iRiver-soittolista</comment>
+ <comment xml:lang="fo">iRiver avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture iRiver</comment>
+ <comment xml:lang="ga">seinmliosta iRiver</comment>
+ <comment xml:lang="gl">lista de reprodución de iRiver</comment>
+ <comment xml:lang="he">רשימת השמעה של iRiver</comment>
+ <comment xml:lang="hu">iRiver lejátszólista</comment>
+ <comment xml:lang="id">iRiver Playlist</comment>
+ <comment xml:lang="it">Scaletta iRiver</comment>
+ <comment xml:lang="ja">iRiver 再生リスト</comment>
+ <comment xml:lang="kk">iRiver ойнау тізімі</comment>
+ <comment xml:lang="ko">iRiver 재생 목록</comment>
+ <comment xml:lang="lt">iRiver grojaraštis</comment>
+ <comment xml:lang="lv">iRiver repertuārs</comment>
+ <comment xml:lang="nb">iRiver-spilleliste</comment>
+ <comment xml:lang="nl">iRiver-afspeellijst</comment>
+ <comment xml:lang="nn">iRiver speleliste</comment>
+ <comment xml:lang="pl">Lista odtwarzania iRiver</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do iRiver</comment>
+ <comment xml:lang="ro">Listă iRiver</comment>
+ <comment xml:lang="ru">список воспроизведения iRiver</comment>
+ <comment xml:lang="sk">Zoznam skladieb iRiver</comment>
+ <comment xml:lang="sl">Seznam predvajanja iRiver</comment>
+ <comment xml:lang="sq">Listë titujsh iRiver</comment>
+ <comment xml:lang="sv">iRiver-spellista</comment>
+ <comment xml:lang="uk">список програвання iRiver</comment>
+ <comment xml:lang="vi">danh mục nhạc iRiver</comment>
+ <comment xml:lang="zh_CN">iRiver 播放列表</comment>
+ <comment xml:lang="zh_TW">iRiver 播放清單</comment>
+ <magic priority="50">
+ <match value="iriver UMS PLA" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.pla"/>
+ </mime-type>
+ <mime-type type="application/pgp-encrypted">
+ <comment>PGP/MIME-encrypted message header</comment>
+ <comment xml:lang="ar">ترويسة رسالة PGP/MIME-مشفرة</comment>
+ <comment xml:lang="be@latin">Zahałovak paviedamleńnia, zašyfravany ŭ PGP/MIME</comment>
+ <comment xml:lang="bg">Заглавна част на шифрирано съобщение — PGP/MIME</comment>
+ <comment xml:lang="ca">capçalera de missatge xifrat amb PGP/MIME</comment>
+ <comment xml:lang="cs">Záhlaví zprávy zašifrované pomocí PGP/MIME</comment>
+ <comment xml:lang="da">PGP-/MIME-krypteret meddelelseshoved</comment>
+ <comment xml:lang="de">PGP/MIME-verschlüsselter Nachrichtenkopf</comment>
+ <comment xml:lang="el">κεφαλίδα μηνύματος κρυπτογραφημένου κατά PGP/MIME</comment>
+ <comment xml:lang="en_GB">PGP/MIME-encrypted message header</comment>
+ <comment xml:lang="eo">PGP/MIME-ĉifrita ĉapo de mesaĝo</comment>
+ <comment xml:lang="es">cabecera de mensaje cifrado PGP/MIME</comment>
+ <comment xml:lang="eu">PGP/MIME enkriptatutako mezu-goiburua</comment>
+ <comment xml:lang="fi">PGP/MIME-salattu viestiotsikko</comment>
+ <comment xml:lang="fo">PGP/MIME-encrypted boð tekshøvd</comment>
+ <comment xml:lang="fr">en-tête de message codé PGP/MIME</comment>
+ <comment xml:lang="ga">ceanntásc teachtaireachta ionchódaithe le PGP/MIME</comment>
+ <comment xml:lang="gl">cabeceira de mensaxe cifrado PGP/MIME</comment>
+ <comment xml:lang="he">כותר של קובץ מוצפן מסוג PGP/MIME</comment>
+ <comment xml:lang="hu">PGP/MIME titkosított üzenetfejléc</comment>
+ <comment xml:lang="id">Tajuk pesan terenkripsi PGP/MIME</comment>
+ <comment xml:lang="it">Intestazione messaggio PGP/MIME-encrypted</comment>
+ <comment xml:lang="ja">PGP/MIME 暗号化メッセージヘッダー</comment>
+ <comment xml:lang="kk">PGP/MIME-шифрленген мәлімдеме тақырыптамасы</comment>
+ <comment xml:lang="ko">PGP/MIME으로 암호화된 메시지 헤더</comment>
+ <comment xml:lang="lt">PGP/MIME užšifruota žinutės antraštė</comment>
+ <comment xml:lang="lv">PGP/MIME-šifrēta ziņas galvene</comment>
+ <comment xml:lang="ms">Pengepala mesej terenkripsi PGP/MIME</comment>
+ <comment xml:lang="nb">PGP/MIME-kryptert meldingshode</comment>
+ <comment xml:lang="nl">PGP/MIME-versleutelde berichtkopregels</comment>
+ <comment xml:lang="nn">PGP/MIME-kryptert meldingshovud</comment>
+ <comment xml:lang="pl">Nagłówek listu zaszyfrowanego PGP/MIME</comment>
+ <comment xml:lang="pt">cabeçalho de mensagem cifrada com PGP/MIME</comment>
+ <comment xml:lang="pt_BR">Cabeçalho de mensagem criptografada PGP/MIME</comment>
+ <comment xml:lang="ro">Antet de mesaj encriptat PGP/MIME</comment>
+ <comment xml:lang="ru">заголовок сообщения, зашифрованный PGP/MIME</comment>
+ <comment xml:lang="sk">Hlavičke správy zašifrovaná pomocou PGP/MIME</comment>
+ <comment xml:lang="sl">Datoteka glave šifriranega sporočila PGP/MIME</comment>
+ <comment xml:lang="sq">Header mesazhi të kriptuar PGP/MIME</comment>
+ <comment xml:lang="sr">ПГП/МИМЕ шифровано заглавље поруке</comment>
+ <comment xml:lang="sv">PGP/MIME-krypterat meddelandehuvud</comment>
+ <comment xml:lang="uk">заголовок шифрованого PGP/MIME повідомлення</comment>
+ <comment xml:lang="vi">Phần đầu thông điệp đã mật mã bằng PGP/MIME</comment>
+ <comment xml:lang="zh_CN">PGP/MIME 加密的信件头</comment>
+ <comment xml:lang="zh_TW">PGP/MIME 加密訊息標頭</comment>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="-----BEGIN PGP MESSAGE-----" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.pgp"/>
+ <glob pattern="*.gpg"/>
+ <glob pattern="*.asc"/>
+ <alias type="application/pgp"/>
+ </mime-type>
+ <mime-type type="application/pgp-keys">
+ <comment>PGP keys</comment>
+ <comment xml:lang="ar">مفاتيح PGP</comment>
+ <comment xml:lang="az">PGP açarları</comment>
+ <comment xml:lang="be@latin">Klučy PGP</comment>
+ <comment xml:lang="bg">Ключове — PGP</comment>
+ <comment xml:lang="ca">claus PGP</comment>
+ <comment xml:lang="cs">Klíče PGP</comment>
+ <comment xml:lang="cy">Allweddi PGP</comment>
+ <comment xml:lang="da">PGP-nøgler</comment>
+ <comment xml:lang="de">PGP-Schlüssel</comment>
+ <comment xml:lang="el">κλειδιά PGP</comment>
+ <comment xml:lang="en_GB">PGP keys</comment>
+ <comment xml:lang="eo">PGP-ŝlosiloj</comment>
+ <comment xml:lang="es">claves PGP</comment>
+ <comment xml:lang="eu">PGP giltzak</comment>
+ <comment xml:lang="fi">PGP-avainrengas</comment>
+ <comment xml:lang="fo">PGP lyklar</comment>
+ <comment xml:lang="fr">clés PGP</comment>
+ <comment xml:lang="ga">eochracha PGP</comment>
+ <comment xml:lang="gl">Chaves PGP</comment>
+ <comment xml:lang="he">מפתח PGP</comment>
+ <comment xml:lang="hu">PGP-kulcs</comment>
+ <comment xml:lang="id">Kunci PGP</comment>
+ <comment xml:lang="it">Chiavi PGP</comment>
+ <comment xml:lang="ja">PGP 鍵</comment>
+ <comment xml:lang="kk">PGP кілттері</comment>
+ <comment xml:lang="ko">PGP 키</comment>
+ <comment xml:lang="lt">PGP raktai</comment>
+ <comment xml:lang="lv">PGP atslēgas</comment>
+ <comment xml:lang="ms">Kekunci PGP</comment>
+ <comment xml:lang="nb">PGP-nøkler</comment>
+ <comment xml:lang="nl">PGP-sleutels</comment>
+ <comment xml:lang="nn">PGP-nøkler</comment>
+ <comment xml:lang="pl">Klucze PGP</comment>
+ <comment xml:lang="pt">chaves PGP</comment>
+ <comment xml:lang="pt_BR">Chaves PGP</comment>
+ <comment xml:lang="ro">Chei PGP</comment>
+ <comment xml:lang="ru">ключи PGP</comment>
+ <comment xml:lang="sk">Kľúče PGP</comment>
+ <comment xml:lang="sl">Datoteka ključa PGP</comment>
+ <comment xml:lang="sq">Kyçe PGP</comment>
+ <comment xml:lang="sr">PGP кључ</comment>
+ <comment xml:lang="sv">PGP-nycklar</comment>
+ <comment xml:lang="uk">ключі PGP</comment>
+ <comment xml:lang="vi">Khoá PGP</comment>
+ <comment xml:lang="zh_CN">PGP 密钥</comment>
+ <comment xml:lang="zh_TW">PGP 鑰匙</comment>
+ <acronym>PGP</acronym>
+ <expanded-acronym>Pretty Good Privacy</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="-----BEGIN PGP PUBLIC KEY BLOCK-----" type="string" offset="0"/>
+ <match value="-----BEGIN PGP PRIVATE KEY BLOCK-----" type="string" offset="0"/>
+ <match value="0x9501" type="big16" offset="0"/>
+ <match value="0x9500" type="big16" offset="0"/>
+ <match value="0x9900" type="big16" offset="0"/>
+ <match value="0x9901" type="big16" offset="0"/>
+ </magic>
+ <glob pattern="*.skr"/>
+ <glob pattern="*.pkr"/>
+ <glob pattern="*.asc"/>
+ </mime-type>
+ <mime-type type="application/pgp-signature">
+ <comment>detached OpenPGP signature</comment>
+ <comment xml:lang="ar">إمضاء OpenPGP مفصول</comment>
+ <comment xml:lang="be@latin">adłučany podpis OpenPGP</comment>
+ <comment xml:lang="bg">Отделен подпис — OpenPGP</comment>
+ <comment xml:lang="ca">signatura OpenPGP separada</comment>
+ <comment xml:lang="cs">Oddělený podpis OpenPGP</comment>
+ <comment xml:lang="da">frigjort OpenPGP-signatur</comment>
+ <comment xml:lang="de">Isolierte OpenPGP-Signatur</comment>
+ <comment xml:lang="el">αποκομμένη υπογραφή OpenPGP</comment>
+ <comment xml:lang="en_GB">detached OpenPGP signature</comment>
+ <comment xml:lang="eo">dekroĉa OpenPGP-subskribo</comment>
+ <comment xml:lang="es">firma OpenPGP separada</comment>
+ <comment xml:lang="eu">desuzturtako OpenPGP sinadura</comment>
+ <comment xml:lang="fi">erillinen OpenPGP-allekirjoitus</comment>
+ <comment xml:lang="fo">skild OpenPGP undirskrift</comment>
+ <comment xml:lang="fr">signature OpenPGP détachée</comment>
+ <comment xml:lang="ga">síniú OpenPGP scartha</comment>
+ <comment xml:lang="gl">sinatura de OpenPGP independente</comment>
+ <comment xml:lang="he">חתימת OpenPGP מנותקת</comment>
+ <comment xml:lang="hu">leválasztott OpenPGP-aláírás</comment>
+ <comment xml:lang="id">tanda tangan OpenPGP yang terlepas</comment>
+ <comment xml:lang="it">Firma staccata OpenPGP</comment>
+ <comment xml:lang="ja">分離 OpenPGP 署名</comment>
+ <comment xml:lang="kk">бөлінген OpenPGP қолтаңбасы</comment>
+ <comment xml:lang="ko">분리된 OpenPGP 서명</comment>
+ <comment xml:lang="lt">neprisegtas OpenPGP parašas</comment>
+ <comment xml:lang="lv">atvienots OpenPGP paraksts</comment>
+ <comment xml:lang="ms">Tandatangan OpenPGP terlerai</comment>
+ <comment xml:lang="nb">frakoblet OpenPGP-signatur</comment>
+ <comment xml:lang="nl">losse OpenPGP-ondertekening</comment>
+ <comment xml:lang="nn">fråkopla OpenPGP-signatur</comment>
+ <comment xml:lang="pl">Oddzielony podpis OpenPGP</comment>
+ <comment xml:lang="pt">assinatura OpenPGP solta</comment>
+ <comment xml:lang="pt_BR">assinatura OpenPGP destacada</comment>
+ <comment xml:lang="ro">semnătură OpenPGP detașată</comment>
+ <comment xml:lang="ru">отсоединённая подпись OpenPGP</comment>
+ <comment xml:lang="sk">Oddelený podpis OpenPGP</comment>
+ <comment xml:lang="sl">odpet podpis OpenPGP</comment>
+ <comment xml:lang="sq">Firmë e shkëputur OpenPGP</comment>
+ <comment xml:lang="sr">одвојени ОпенПГП потпис</comment>
+ <comment xml:lang="sv">frikopplad OpenPGP-signatur</comment>
+ <comment xml:lang="uk">відокремлений OpenPGP підпис</comment>
+ <comment xml:lang="vi">chữ ký OpenPGP tách rời</comment>
+ <comment xml:lang="zh_CN">分离的 OpenPGP 签名</comment>
+ <comment xml:lang="zh_TW">分離的 OpenPGP 簽章</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="-----BEGIN PGP SIGNED MESSAGE-----" type="string" offset="0"/>
+ <match value="-----BEGIN PGP SIGNATURE-----" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/pkcs7-mime">
+ <comment>S/MIME file</comment>
+ <comment xml:lang="ar">ملف S/MIME</comment>
+ <comment xml:lang="az">S/MIME faylı</comment>
+ <comment xml:lang="be@latin">Fajł S/MIME</comment>
+ <comment xml:lang="bg">Файл — S/MIME</comment>
+ <comment xml:lang="ca">fitxer S/MIME</comment>
+ <comment xml:lang="cs">Soubor S/MIME</comment>
+ <comment xml:lang="cy">Ffeil S/MIME</comment>
+ <comment xml:lang="da">S/MIME-fil</comment>
+ <comment xml:lang="de">S/MIME-Datei</comment>
+ <comment xml:lang="el">αρχείο S/MIME</comment>
+ <comment xml:lang="en_GB">S/MIME file</comment>
+ <comment xml:lang="eo">S/MIME-dosiero</comment>
+ <comment xml:lang="es">archivo S/MIME</comment>
+ <comment xml:lang="eu">S/MIME fitxategia</comment>
+ <comment xml:lang="fi">S/MIME-tiedosto</comment>
+ <comment xml:lang="fo">S/MIME fíla</comment>
+ <comment xml:lang="fr">fichier S/MIME</comment>
+ <comment xml:lang="ga">comhad S/MIME</comment>
+ <comment xml:lang="gl">ficheiro S/MIME</comment>
+ <comment xml:lang="he">קובץ S/MIME</comment>
+ <comment xml:lang="hu">S/MIME-fájl</comment>
+ <comment xml:lang="id">Berkas S/MIME</comment>
+ <comment xml:lang="it">File S/MIME</comment>
+ <comment xml:lang="ja">S/MIME ファイル</comment>
+ <comment xml:lang="kk">S/MIME файлы</comment>
+ <comment xml:lang="ko">S/MIME 파일</comment>
+ <comment xml:lang="lt">S/MIME failas</comment>
+ <comment xml:lang="lv">S/MIME fails</comment>
+ <comment xml:lang="ms">Fail S/MIME</comment>
+ <comment xml:lang="nb">S/MIME-fil</comment>
+ <comment xml:lang="nl">S/MIME-bestand</comment>
+ <comment xml:lang="nn">S/MIME-fil</comment>
+ <comment xml:lang="pl">Plik S/MIME</comment>
+ <comment xml:lang="pt">ficheiro S/MIME</comment>
+ <comment xml:lang="pt_BR">Arquivo S/MIME</comment>
+ <comment xml:lang="ro">Fișier S/MIME</comment>
+ <comment xml:lang="ru">файл S/MIME</comment>
+ <comment xml:lang="sk">Súbor S/MIME</comment>
+ <comment xml:lang="sl">Datoteka S/MIME</comment>
+ <comment xml:lang="sq">File S/MIME</comment>
+ <comment xml:lang="sr">S/MIME датотека</comment>
+ <comment xml:lang="sv">S/MIME-fil</comment>
+ <comment xml:lang="uk">файл S/MIME</comment>
+ <comment xml:lang="vi">Tập tin S/MIME</comment>
+ <comment xml:lang="zh_CN">S/MIME 文件</comment>
+ <comment xml:lang="zh_TW">S/MIME 檔</comment>
+ <acronym>S/MIME</acronym>
+ <expanded-acronym>Secure/Multipurpose Internet Mail Extensions</expanded-acronym>
+ <generic-icon name="text-x-generic"/>
+ </mime-type>
+ <mime-type type="application/pkcs7-signature">
+ <comment>detached S/MIME signature</comment>
+ <comment xml:lang="ar">إمضاء S/MIME مفصول</comment>
+ <comment xml:lang="be@latin">adłučany podpis S/MIME</comment>
+ <comment xml:lang="bg">Отделен подпис — S/MIME</comment>
+ <comment xml:lang="ca">signatura S/MIME separada</comment>
+ <comment xml:lang="cs">Oddělený podpis S/MIME</comment>
+ <comment xml:lang="da">frigjort S/MIME-signatur</comment>
+ <comment xml:lang="de">Isolierte S/MIME-Signatur</comment>
+ <comment xml:lang="el">αποκομμένη υπογραφή S/MIME</comment>
+ <comment xml:lang="en_GB">detached S/MIME signature</comment>
+ <comment xml:lang="eo">dekroĉa S/MIME-subskribo</comment>
+ <comment xml:lang="es">firma S/MIME separada</comment>
+ <comment xml:lang="eu">desuzturtako S/MIME sinadura</comment>
+ <comment xml:lang="fi">erillinen S/MIME-allekirjoitus</comment>
+ <comment xml:lang="fo">skild S/MIME undirskrift</comment>
+ <comment xml:lang="fr">signature S/MIME détachée</comment>
+ <comment xml:lang="ga">síniú S/MIME scartha</comment>
+ <comment xml:lang="gl">sinatura S/MIME independente</comment>
+ <comment xml:lang="he">חתימת S/MIME מנותקת</comment>
+ <comment xml:lang="hu">leválasztott S/MIME-aláírás</comment>
+ <comment xml:lang="id">tanda tangan S/MIME yang terlepas</comment>
+ <comment xml:lang="it">Firma staccata S/MIME</comment>
+ <comment xml:lang="ja">分離 S/MIME 署名</comment>
+ <comment xml:lang="kk">бөлінген S/MIME қолтаңбасы</comment>
+ <comment xml:lang="ko">분리된 S/MIME 서명</comment>
+ <comment xml:lang="lt">neprisegtas S/MIME parašas</comment>
+ <comment xml:lang="lv">atvienots S/MIME paraksts</comment>
+ <comment xml:lang="ms">Tandatangan S/MIME terlerai</comment>
+ <comment xml:lang="nb">frakoblet S/MIME-signatur</comment>
+ <comment xml:lang="nl">losse S/MIME-ondertekening</comment>
+ <comment xml:lang="nn">fråkopla S/MIME-signatur</comment>
+ <comment xml:lang="pl">Oddzielony podpis S/MIME</comment>
+ <comment xml:lang="pt">assinatura S/MIME solta</comment>
+ <comment xml:lang="pt_BR">assinatura S/MIME destacada</comment>
+ <comment xml:lang="ro">semnătură S/MIME detașată</comment>
+ <comment xml:lang="ru">отсоединённая подпись S/MIME</comment>
+ <comment xml:lang="sk">Oddelený podpis S/MIME</comment>
+ <comment xml:lang="sl">odpet podpis S/MIME</comment>
+ <comment xml:lang="sq">Firmë e shkëputur S/MIME</comment>
+ <comment xml:lang="sr">одвојени S/MIME потпис</comment>
+ <comment xml:lang="sv">frikopplad S/MIME-signatur</comment>
+ <comment xml:lang="uk">відокремлений S/MIME підпис</comment>
+ <comment xml:lang="vi">chữ ký S/MIME tách rời</comment>
+ <comment xml:lang="zh_CN">分离的 S/MIME 签名</comment>
+ <comment xml:lang="zh_TW">分離的 S/MIME 簽章</comment>
+ <acronym>S/MIME</acronym>
+ <expanded-acronym>Secure/Multipurpose Internet Mail Extensions</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.p7s"/>
+ </mime-type>
+ <mime-type type="application/pkcs8">
+ <comment>PKCS#8 private key</comment>
+ <comment xml:lang="ar">رزمة الشهادة PKCS#8</comment>
+ <comment xml:lang="bg">Ключ, частен — PKCS#8</comment>
+ <comment xml:lang="ca">clau privada PKCS#8</comment>
+ <comment xml:lang="cs">Soukromý klíč PKCS#8</comment>
+ <comment xml:lang="da">PKCS#8-privat nøgle</comment>
+ <comment xml:lang="de">PKCS#8 Geheimer Schlüssel</comment>
+ <comment xml:lang="es">clave privada PCKS#8</comment>
+ <comment xml:lang="fi">PKCS#8 yksityinen avain</comment>
+ <comment xml:lang="fo">PKCS#8 privatur lykil</comment>
+ <comment xml:lang="fr">clé privée PKCS#8</comment>
+ <comment xml:lang="ga">eochair phríobháideach PKCS#8</comment>
+ <comment xml:lang="gl">Chave privada PKCS#8</comment>
+ <comment xml:lang="he">מפתח פרטי של PKCS#8</comment>
+ <comment xml:lang="hu">PKCS#8 személyes kulcs</comment>
+ <comment xml:lang="id">Kunci privat PKCS#8</comment>
+ <comment xml:lang="it">Chiave privata PKCS#8</comment>
+ <comment xml:lang="ja">PKCS#8 秘密鍵</comment>
+ <comment xml:lang="kk">PKCS#8 меншік кілті</comment>
+ <comment xml:lang="ko">PKCS#8 개인 키</comment>
+ <comment xml:lang="lt">PKCS#8 asmeninis raktas</comment>
+ <comment xml:lang="lv">PKCS#8 privātā atslēga</comment>
+ <comment xml:lang="pl">Klucz prywatny PKCS#8</comment>
+ <comment xml:lang="ro">Cheie privată PKCS#8</comment>
+ <comment xml:lang="ru">личный ключ PKCS#8</comment>
+ <comment xml:lang="sk">Súkromný kľúč PKCS#8</comment>
+ <comment xml:lang="sl">Datoteka osebnega ključa PKCS#8</comment>
+ <comment xml:lang="sv">Privat PKCS#8-nyckel</comment>
+ <comment xml:lang="uk">закритий ключ PKCS#8</comment>
+ <comment xml:lang="zh_CN">PKCS#8 私钥</comment>
+ <comment xml:lang="zh_TW">PKCS#8 私人金鑰</comment>
+ <acronym>PKCS</acronym>
+ <expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
+ <glob pattern="*.p8"/>
+ </mime-type>
+ <mime-type type="application/pkcs10">
+ <comment>PKCS#10 certification request</comment>
+ <comment xml:lang="ar">طلب شهادة PKCS#10</comment>
+ <comment xml:lang="be@latin">Zapyt sertyfikacyi PKCS#10</comment>
+ <comment xml:lang="bg">Заявка за сертификат — PKCS#10</comment>
+ <comment xml:lang="ca">sol·licitud de certificació PKCS#10</comment>
+ <comment xml:lang="cs">Požadavek na certifikát PKCS#10</comment>
+ <comment xml:lang="da">PKCS#10-certifikatanmodning</comment>
+ <comment xml:lang="de">PKCS#10-Zertifikatanfrage</comment>
+ <comment xml:lang="es">petición de certificados PKCS#10</comment>
+ <comment xml:lang="eu">PKCS#10 ziurtagirien eskaera</comment>
+ <comment xml:lang="fi">PKCS#10-varmennepyyntö</comment>
+ <comment xml:lang="fo">PKCS#10 váttanarumbøn</comment>
+ <comment xml:lang="fr">requête de certification PKCS#10</comment>
+ <comment xml:lang="ga">iarratas dheimhniúchán PKCS#10</comment>
+ <comment xml:lang="gl">Solicitude de certificado PKCS#10</comment>
+ <comment xml:lang="he">בקשה מוסמכת PLCS#10</comment>
+ <comment xml:lang="hu">PKCS#10-tanúsítványkérés</comment>
+ <comment xml:lang="id">Permintaan sertifikasi PKCS#10</comment>
+ <comment xml:lang="it">Richiesta certificazione PKCS#10</comment>
+ <comment xml:lang="ja">PKCS#10 証明書署名要求</comment>
+ <comment xml:lang="kk">PKCS#10 сертификацияға сұранымы</comment>
+ <comment xml:lang="ko">PKCS#10 인증서 요청</comment>
+ <comment xml:lang="lt">PKCS#10 liudijimų užklausa</comment>
+ <comment xml:lang="lv">PKCS#10 sertifikācijas pieprasījums</comment>
+ <comment xml:lang="nb">PKCS#10-sertifikatforespørsel</comment>
+ <comment xml:lang="nl">PKCS#10-certificatieverzoek</comment>
+ <comment xml:lang="nn">PKCS#10-sertifiseringsførespurnad</comment>
+ <comment xml:lang="pl">Żądanie certyfikatu PKCS#10</comment>
+ <comment xml:lang="pt_BR">Pedido de certificação PKCS#12</comment>
+ <comment xml:lang="ro">Cerere de certificat PKCS#10</comment>
+ <comment xml:lang="ru">запрос сертификации PKCS#10</comment>
+ <comment xml:lang="sk">Požiadavka na certifikát PKCS#10</comment>
+ <comment xml:lang="sl">Datoteka potrdila PKCS#10</comment>
+ <comment xml:lang="sq">Kërkesë çertifikimi PKCS#10</comment>
+ <comment xml:lang="sv">PKCS#10-certifikatbegäran</comment>
+ <comment xml:lang="uk">комплект сертифікатів PKCS#10</comment>
+ <comment xml:lang="vi">Yêu cầu chứng nhận PKCS#10</comment>
+ <comment xml:lang="zh_CN">PKCS#10 认证请求</comment>
+ <comment xml:lang="zh_TW">PKCS#10 憑證請求</comment>
+ <acronym>PKCS</acronym>
+ <expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.p10"/>
+ </mime-type>
+ <mime-type type="application/pkix-cert">
+ <comment>X.509 certificate</comment>
+ <comment xml:lang="ar">شهادة X.509</comment>
+ <comment xml:lang="bg">Сертификат — X.509</comment>
+ <comment xml:lang="ca">certificat X.509</comment>
+ <comment xml:lang="cs">Certifikát X.509</comment>
+ <comment xml:lang="da">X.509-certifikat</comment>
+ <comment xml:lang="de">X.509-Zertifikat</comment>
+ <comment xml:lang="es">certificado X.509</comment>
+ <comment xml:lang="eu">X.509 ziurtagiria</comment>
+ <comment xml:lang="fi">X.509-varmenne</comment>
+ <comment xml:lang="fo">X.509 prógv</comment>
+ <comment xml:lang="fr">certificat X.509</comment>
+ <comment xml:lang="ga">teastas X.509</comment>
+ <comment xml:lang="gl">Certificado X.509</comment>
+ <comment xml:lang="he">אישור X.509</comment>
+ <comment xml:lang="hu">X.509 tanúsítvány</comment>
+ <comment xml:lang="id">Sertifikat X.509</comment>
+ <comment xml:lang="it">Certificato X.509</comment>
+ <comment xml:lang="ja">X.509 証明書</comment>
+ <comment xml:lang="kk">X.509 сертификаты</comment>
+ <comment xml:lang="ko">X.509 인증서</comment>
+ <comment xml:lang="lt">X.509 liudijimas</comment>
+ <comment xml:lang="lv">X.509 sertifikāts</comment>
+ <comment xml:lang="pl">Certyfikat X.509</comment>
+ <comment xml:lang="ro">Certificat X.509</comment>
+ <comment xml:lang="ru">сертификат X.509</comment>
+ <comment xml:lang="sk">Certifikát X.509</comment>
+ <comment xml:lang="sl">Datoteka potrdila X.509</comment>
+ <comment xml:lang="sv">X.509-certifikat</comment>
+ <comment xml:lang="uk">сертифікат X.509</comment>
+ <comment xml:lang="zh_CN">X.509 证书</comment>
+ <comment xml:lang="zh_TW">X.509 憑證</comment>
+ <glob pattern="*.cer"/>
+ </mime-type>
+ <mime-type type="application/pkix-crl">
+ <comment>Certificate revocation list</comment>
+ <comment xml:lang="ar">قائمة إبطال الشهادات</comment>
+ <comment xml:lang="bg">Списък с отхвърлени сертификати</comment>
+ <comment xml:lang="ca">llista de revocació de certificats</comment>
+ <comment xml:lang="cs">Seznam odvolaných certifikátů</comment>
+ <comment xml:lang="da">Certifikattilbagekaldelsesliste</comment>
+ <comment xml:lang="de">Liste widerrufener Zertifikate</comment>
+ <comment xml:lang="es">lista de revocación de certificados</comment>
+ <comment xml:lang="eu">Ziurtagiri-errebokatzeen zerrenda</comment>
+ <comment xml:lang="fi">Varmenteiden sulkulista</comment>
+ <comment xml:lang="fo">Prógv afturtøkulisti</comment>
+ <comment xml:lang="fr">liste de révocation de certificat</comment>
+ <comment xml:lang="ga">liosta teastas cúlghairmthe</comment>
+ <comment xml:lang="gl">lista de certificados de revogación</comment>
+ <comment xml:lang="he">רשימת אישורים מבוטלים</comment>
+ <comment xml:lang="hu">Tanúsítvány-visszavonási lista</comment>
+ <comment xml:lang="id">Daftar pencabutan sertificat (CRL)</comment>
+ <comment xml:lang="it">Elenco certificati di revoca</comment>
+ <comment xml:lang="ja">証明書失効リスト</comment>
+ <comment xml:lang="kk">Сертификатты қайта шақыру тізімі</comment>
+ <comment xml:lang="ko">인증서 철회 목록</comment>
+ <comment xml:lang="lt">Panaikintų liudijimų sąrašas</comment>
+ <comment xml:lang="lv">Sertifikātu atsaukšanu saraksts</comment>
+ <comment xml:lang="pl">Lista unieważnień certyfikatów</comment>
+ <comment xml:lang="ro">Listă de revocare a certificatelor</comment>
+ <comment xml:lang="ru">Список аннулирования сертификатов</comment>
+ <comment xml:lang="sk">Zoznam zrušených certifikátov</comment>
+ <comment xml:lang="sl">Datoteka seznama preklica potrdil</comment>
+ <comment xml:lang="sv">Spärrlista för certifikat</comment>
+ <comment xml:lang="uk">список відкликання сертифікатів</comment>
+ <comment xml:lang="zh_CN">证书吊销列表</comment>
+ <comment xml:lang="zh_TW">憑證撤銷清單</comment>
+ <glob pattern="*.crl"/>
+ </mime-type>
+ <mime-type type="application/pkix-pkipath">
+ <comment>PkiPath certification path</comment>
+ <comment xml:lang="ar">مسار شهادة PkiPath</comment>
+ <comment xml:lang="bg">Сертификационна верига — PkiPath</comment>
+ <comment xml:lang="ca">ruta de certificació PkiPath</comment>
+ <comment xml:lang="cs">Cesta k certifikátu PkiPath</comment>
+ <comment xml:lang="da">PkiPath-certifikationssti</comment>
+ <comment xml:lang="de">PkiPath-Zertifikatspfad</comment>
+ <comment xml:lang="es">ruta de certificación PkiPath</comment>
+ <comment xml:lang="eu">PkiPath ziurtagirien bide-izena</comment>
+ <comment xml:lang="fi">PkiPath-varmennepolku</comment>
+ <comment xml:lang="fo">PkiPath váttanleið</comment>
+ <comment xml:lang="fr">chemin de certification PkiPath</comment>
+ <comment xml:lang="ga">conair dheimhniúcháin PkiPath</comment>
+ <comment xml:lang="gl">Ruta de certificación PkiPath</comment>
+ <comment xml:lang="he">נתיב מאושר של PkiPath</comment>
+ <comment xml:lang="hu">PkiPath tanúsítványútvonal</comment>
+ <comment xml:lang="id">Alamat sertifikasi PkiPath</comment>
+ <comment xml:lang="it">Percorso certificazione PkiPath</comment>
+ <comment xml:lang="ja">PkiPath 証明書パス</comment>
+ <comment xml:lang="kk">PkiPath сертификаттау жолы</comment>
+ <comment xml:lang="ko">PkiPath 인증서 요청</comment>
+ <comment xml:lang="lt">PkiPath liudijimų maršrutas</comment>
+ <comment xml:lang="lv">PkiPath sertifikāta ceļš</comment>
+ <comment xml:lang="nl">PkiPath-certificatiepad</comment>
+ <comment xml:lang="pl">Ścieżka certyfikacji PkiPath</comment>
+ <comment xml:lang="pt_BR">Pedido de certificação PkiPath</comment>
+ <comment xml:lang="ro">Cale certificare PkiPath</comment>
+ <comment xml:lang="ru">путь сертификации PkiPath</comment>
+ <comment xml:lang="sk">Cesta k certifikátu PkiPath</comment>
+ <comment xml:lang="sl">Datoteka poti potrdila PkiPath</comment>
+ <comment xml:lang="sv">PkiPath-certifikatsekvens</comment>
+ <comment xml:lang="uk">шлях сертифікації PkiPath</comment>
+ <comment xml:lang="vi">Đường dẫn cấp chứng nhận PkiPath</comment>
+ <comment xml:lang="zh_CN">PkiPath 证书目录</comment>
+ <comment xml:lang="zh_TW">PkiPath 憑證路徑</comment>
+ <glob pattern="*.pkipath"/>
+ </mime-type>
+ <mime-type type="application/postscript">
+ <comment>PS document</comment>
+ <comment xml:lang="ar">مستند PS</comment>
+ <comment xml:lang="be@latin">Dakument PS</comment>
+ <comment xml:lang="bg">Документ — PS</comment>
+ <comment xml:lang="ca">document PS</comment>
+ <comment xml:lang="cs">Dokument PS</comment>
+ <comment xml:lang="da">PS-dokument</comment>
+ <comment xml:lang="de">PS-Dokument</comment>
+ <comment xml:lang="en_GB">PS document</comment>
+ <comment xml:lang="eo">PS-dokumento</comment>
+ <comment xml:lang="es">documento PS</comment>
+ <comment xml:lang="eu">PS dokumentua</comment>
+ <comment xml:lang="fi">PS-asiakirja</comment>
+ <comment xml:lang="fo">PS skjal</comment>
+ <comment xml:lang="fr">document PS</comment>
+ <comment xml:lang="ga">cáipéis PS</comment>
+ <comment xml:lang="gl">documento PS</comment>
+ <comment xml:lang="he">מסמך PS</comment>
+ <comment xml:lang="hu">PS dokumentum</comment>
+ <comment xml:lang="id">Dokumen PS</comment>
+ <comment xml:lang="it">Documento PS</comment>
+ <comment xml:lang="ja">PS ドキュメント</comment>
+ <comment xml:lang="kk">PS құжаты</comment>
+ <comment xml:lang="ko">PS 문서</comment>
+ <comment xml:lang="lt">PS dokumentas</comment>
+ <comment xml:lang="lv">PS dokuments</comment>
+ <comment xml:lang="nb">PS-dokument</comment>
+ <comment xml:lang="nl">PS-document</comment>
+ <comment xml:lang="nn">PS-dokument</comment>
+ <comment xml:lang="pl">Dokument PS</comment>
+ <comment xml:lang="pt_BR">Documento PS</comment>
+ <comment xml:lang="ro">Document PS</comment>
+ <comment xml:lang="ru">документ PS</comment>
+ <comment xml:lang="sk">Dokument PS</comment>
+ <comment xml:lang="sl">Dokument PS</comment>
+ <comment xml:lang="sq">Dokument PS</comment>
+ <comment xml:lang="sv">PS-dokument</comment>
+ <comment xml:lang="uk">документ PS</comment>
+ <comment xml:lang="vi">Tài liệu PS</comment>
+ <comment xml:lang="zh_CN">PS 文档</comment>
+ <comment xml:lang="zh_TW">Ps 文件</comment>
+ <acronym>PS</acronym>
+ <expanded-acronym>PostScript</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="\004%!" type="string" offset="0"/>
+ <match value="%!" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ps"/>
+ </mime-type>
+ <mime-type type="application/prs.plucker">
+ <comment>Plucker document</comment>
+ <comment xml:lang="ar">مستند Plucker</comment>
+ <comment xml:lang="be@latin">Dakument Plucker</comment>
+ <comment xml:lang="bg">Документ — Plucker</comment>
+ <comment xml:lang="ca">document Plucker</comment>
+ <comment xml:lang="cs">Dokument Plucker</comment>
+ <comment xml:lang="da">Pluckerdokument</comment>
+ <comment xml:lang="de">Plucker-Dokument</comment>
+ <comment xml:lang="eo">Plucker-dokumento</comment>
+ <comment xml:lang="es">documento de Plucker</comment>
+ <comment xml:lang="eu">Plucker dokumentua</comment>
+ <comment xml:lang="fi">Plucker-asiakirja</comment>
+ <comment xml:lang="fo">Plucker skjal</comment>
+ <comment xml:lang="fr">document Plucker</comment>
+ <comment xml:lang="ga">cáipéis Plucker</comment>
+ <comment xml:lang="gl">documento de Plucker</comment>
+ <comment xml:lang="he">מסמך של Plucker</comment>
+ <comment xml:lang="hu">Plucker dokumentum</comment>
+ <comment xml:lang="id">Dokumen Plucker</comment>
+ <comment xml:lang="it">Documento Plucker</comment>
+ <comment xml:lang="ja">Plucker ドキュメント</comment>
+ <comment xml:lang="kk">Plucker құжаты</comment>
+ <comment xml:lang="ko">Plucker 문서</comment>
+ <comment xml:lang="lt">Plucker dokumentas</comment>
+ <comment xml:lang="lv">Plucker dokuments</comment>
+ <comment xml:lang="nb">Plucker-dokument</comment>
+ <comment xml:lang="nl">Plucker-document</comment>
+ <comment xml:lang="nn">Plucker-dokument</comment>
+ <comment xml:lang="pl">Dokument Plucker</comment>
+ <comment xml:lang="pt_BR">Documento do Plucker</comment>
+ <comment xml:lang="ro">Document Plucker</comment>
+ <comment xml:lang="ru">документ Plucker</comment>
+ <comment xml:lang="sk">Dokument Plucker</comment>
+ <comment xml:lang="sl">Dokument Plucker</comment>
+ <comment xml:lang="sq">Dokument Plucker</comment>
+ <comment xml:lang="sv">Plucker-dokument</comment>
+ <comment xml:lang="uk">документ Plucker</comment>
+ <comment xml:lang="vi">Tài liệu Plucker</comment>
+ <comment xml:lang="zh_CN">Plucker 文档</comment>
+ <comment xml:lang="zh_TW">Plucker 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="80">
+ <match value="DataPlkr" type="string" offset="60"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/relax-ng-compact-syntax">
+ <comment>RELAX NG XML schema</comment>
+ <comment xml:lang="ar">مخطط RELAX NG XML</comment>
+ <comment xml:lang="bg">Схема за XML — RELAX NG</comment>
+ <comment xml:lang="ca">esquema XML RELAX NG</comment>
+ <comment xml:lang="cs">Schéma RELAX NG XML</comment>
+ <comment xml:lang="da">RELAX NG XML-skema</comment>
+ <comment xml:lang="de">RELAX NG XML-Schema</comment>
+ <comment xml:lang="es">Esquema XML RELAX NG</comment>
+ <comment xml:lang="fi">RELAX NG XML-skeema</comment>
+ <comment xml:lang="fr">schéma XML RELAX NG</comment>
+ <comment xml:lang="ga">scéimre XML RELAX NG</comment>
+ <comment xml:lang="gl">Esquema XML RELAX NG</comment>
+ <comment xml:lang="he">סכנת RELAX NG XML</comment>
+ <comment xml:lang="hu">RELAX NG XML-séma</comment>
+ <comment xml:lang="id">Skema XML RELAX NG</comment>
+ <comment xml:lang="it">Schema XML RELAX NG</comment>
+ <comment xml:lang="ja">RELAX NG XML スキーマ</comment>
+ <comment xml:lang="kk">RELAX NG XML сұлбасы</comment>
+ <comment xml:lang="ko">RELAX NG XML 스키마</comment>
+ <comment xml:lang="lt">RELAX NG XML schema</comment>
+ <comment xml:lang="lv">RELAX NG XML shēma</comment>
+ <comment xml:lang="pl">Schemat XML RELAX NG</comment>
+ <comment xml:lang="ro">Schemă RELAX NG XML</comment>
+ <comment xml:lang="ru">XML-схема RELAX NG</comment>
+ <comment xml:lang="sk">XML schéma RELAX NG</comment>
+ <comment xml:lang="sl">Datoteka shema RELAX NG XML</comment>
+ <comment xml:lang="sv">RELAX NG XML-schema</comment>
+ <comment xml:lang="uk">XML-схема RELAX NG</comment>
+ <comment xml:lang="zh_CN">RELAX NG XML 模式</comment>
+ <acronym>RELAX NG</acronym>
+ <expanded-acronym>REgular LAnguage for XML Next Generation</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.rnc"/>
+ <alias type="application/x-rnc"/>
+ </mime-type>
+ <mime-type type="application/rtf">
+ <comment>RTF document</comment>
+ <comment xml:lang="ar">مستند RTF</comment>
+ <comment xml:lang="be@latin">Dakument RTF</comment>
+ <comment xml:lang="bg">Документ — RTF</comment>
+ <comment xml:lang="ca">document RTF</comment>
+ <comment xml:lang="cs">Dokument RTF</comment>
+ <comment xml:lang="da">RTF-dokument</comment>
+ <comment xml:lang="de">RTF-Dokument</comment>
+ <comment xml:lang="en_GB">RTF document</comment>
+ <comment xml:lang="eo">RTF-dokumento</comment>
+ <comment xml:lang="es">documento RTF</comment>
+ <comment xml:lang="eu">RTF dokumentua</comment>
+ <comment xml:lang="fi">RTF-asiakirja</comment>
+ <comment xml:lang="fo">RTF skjal</comment>
+ <comment xml:lang="fr">document RTF</comment>
+ <comment xml:lang="ga">cáipéis RTF</comment>
+ <comment xml:lang="gl">documento RTF</comment>
+ <comment xml:lang="he">מסמך RTF</comment>
+ <comment xml:lang="hu">RTF dokumentum</comment>
+ <comment xml:lang="id">Dokumen RTF</comment>
+ <comment xml:lang="it">Documento RTF</comment>
+ <comment xml:lang="ja">RTF ドキュメント</comment>
+ <comment xml:lang="kk">RTF құжаты</comment>
+ <comment xml:lang="ko">RTF 문서</comment>
+ <comment xml:lang="lt">RTF dokumentas</comment>
+ <comment xml:lang="lv">RTF dokuments</comment>
+ <comment xml:lang="nb">RTF-dokument</comment>
+ <comment xml:lang="nl">RTF-document</comment>
+ <comment xml:lang="nn">TRF-dokument</comment>
+ <comment xml:lang="pl">Dokument RTF</comment>
+ <comment xml:lang="pt_BR">Documento RTF</comment>
+ <comment xml:lang="ro">Document RTF</comment>
+ <comment xml:lang="ru">документ RTF</comment>
+ <comment xml:lang="sk">Dokument RTF</comment>
+ <comment xml:lang="sl">Dokument RTF</comment>
+ <comment xml:lang="sq">Dokument RTF</comment>
+ <comment xml:lang="sv">RTF-dokument</comment>
+ <comment xml:lang="uk">документ RTF</comment>
+ <comment xml:lang="vi">Tài liệu RTF</comment>
+ <comment xml:lang="zh_CN">RTF 文档</comment>
+ <comment xml:lang="zh_TW">RTF 文件</comment>
+ <acronym>RTF</acronym>
+ <expanded-acronym>Rich Text Format</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="{\\rtf" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.rtf"/>
+ <alias type="text/rtf"/>
+ </mime-type>
+ <mime-type type="application/sieve">
+ <comment>Sieve mail filter script</comment>
+ <comment xml:lang="ar">سكربت مرشح بريد Sieve</comment>
+ <comment xml:lang="be@latin">Skrypt filtravańnia pošty Sieve</comment>
+ <comment xml:lang="bg">Скрипт-филтър за пресяване на поща</comment>
+ <comment xml:lang="ca">script de filtre de correu Sieve</comment>
+ <comment xml:lang="cs">Skript poštovního filtru Sieve</comment>
+ <comment xml:lang="da">Sieve e-post-filterprogram</comment>
+ <comment xml:lang="de">Sieve-E-Mail-Filterskript</comment>
+ <comment xml:lang="es">script de filtro de correo Sieve</comment>
+ <comment xml:lang="eu">Sieve posta-iragazki script-a</comment>
+ <comment xml:lang="fi">Sieve-postinsuodatuskomentotiedosto</comment>
+ <comment xml:lang="fr">script de filtrage de courriel Sieve</comment>
+ <comment xml:lang="ga">script scagaire phost Sieve</comment>
+ <comment xml:lang="gl">Script de filtro de correo Sieve</comment>
+ <comment xml:lang="he">תסריט סינון דואר של Sieve</comment>
+ <comment xml:lang="hu">Sieve levélszűrő parancsfájl</comment>
+ <comment xml:lang="id">Skrip filter surat Sieve</comment>
+ <comment xml:lang="it">Script filtro posta Sieve</comment>
+ <comment xml:lang="ja">Sieve メールフィルタスクリプト</comment>
+ <comment xml:lang="kk">Sieve пошталық фильтр сценарийі</comment>
+ <comment xml:lang="ko">Sieve 메일 필터 스크립트</comment>
+ <comment xml:lang="lt">Sieve pašto filtro scenarijus</comment>
+ <comment xml:lang="lv">Sieve pasta filtra skripts</comment>
+ <comment xml:lang="nb">Sieve e-postfilter skript</comment>
+ <comment xml:lang="nl">Sieve mailfilter-script</comment>
+ <comment xml:lang="nn">Sieve e-postfilterskript</comment>
+ <comment xml:lang="pl">Skrypt filtra poczty Sieve</comment>
+ <comment xml:lang="pt_BR">Script de filtro de mensagens do Sieve</comment>
+ <comment xml:lang="ro">Script filtrare email Sieve</comment>
+ <comment xml:lang="ru">сценарий почтового фильтра Sieve</comment>
+ <comment xml:lang="sk">Skript poštového filtra Sieve</comment>
+ <comment xml:lang="sl">Skriptna datoteka Sieve poštnega filtra</comment>
+ <comment xml:lang="sq">Script filtrim poste Sieve</comment>
+ <comment xml:lang="sv">Sieve-epostfilterskript</comment>
+ <comment xml:lang="uk">скрипт поштового фільтру Sieve</comment>
+ <comment xml:lang="vi">Văn lệnh lọc thư Sieve</comment>
+ <comment xml:lang="zh_CN">Sieve 邮件过滤脚本</comment>
+ <comment xml:lang="zh_TW">Sieve 郵件過濾指令稿</comment>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.siv"/>
+ </mime-type>
+ <mime-type type="application/smil">
+ <comment>SMIL document</comment>
+ <comment xml:lang="ar">مستند SMIL</comment>
+ <comment xml:lang="be@latin">Dakument SMIL</comment>
+ <comment xml:lang="bg">Документ — SMIL</comment>
+ <comment xml:lang="ca">document SMIL</comment>
+ <comment xml:lang="cs">Dokument SMIL</comment>
+ <comment xml:lang="da">SMIL-dokument</comment>
+ <comment xml:lang="de">SMIL-Dokument</comment>
+ <comment xml:lang="en_GB">SMIL document</comment>
+ <comment xml:lang="eo">SMIL-dokumento</comment>
+ <comment xml:lang="es">documento SMIL</comment>
+ <comment xml:lang="eu">SMIL dokumentua</comment>
+ <comment xml:lang="fi">SMIL-asiakirja</comment>
+ <comment xml:lang="fo">SMIL skjal</comment>
+ <comment xml:lang="fr">document SMIL</comment>
+ <comment xml:lang="ga">cáipéis SMIL</comment>
+ <comment xml:lang="gl">documento SMIL</comment>
+ <comment xml:lang="he">מסמך SMIL</comment>
+ <comment xml:lang="hu">SMIL dokumentum</comment>
+ <comment xml:lang="id">Dokumen SMIL</comment>
+ <comment xml:lang="it">Documento SMIL</comment>
+ <comment xml:lang="ja">SMIL ドキュメント</comment>
+ <comment xml:lang="kk">SMIL құжаты</comment>
+ <comment xml:lang="ko">SMIL 문서</comment>
+ <comment xml:lang="lt">SMIL dokumentas</comment>
+ <comment xml:lang="lv">SMIL dokuments</comment>
+ <comment xml:lang="nb">SMIL-dokument</comment>
+ <comment xml:lang="nl">SMIL-document</comment>
+ <comment xml:lang="nn">SMIL-dokument</comment>
+ <comment xml:lang="pl">Dokument SMIL</comment>
+ <comment xml:lang="pt_BR">Documento SMIL</comment>
+ <comment xml:lang="ro">Document SMIL</comment>
+ <comment xml:lang="ru">документ SMIL</comment>
+ <comment xml:lang="sk">Dokument SMIL</comment>
+ <comment xml:lang="sl">Dokument SMIL</comment>
+ <comment xml:lang="sq">Dokument SMIL</comment>
+ <comment xml:lang="sv">SMIL-dokument</comment>
+ <comment xml:lang="uk">документ SMIL</comment>
+ <comment xml:lang="vi">Tài liệu SMIL</comment>
+ <comment xml:lang="zh_CN">SMIL 文档</comment>
+ <comment xml:lang="zh_TW">SMIL 文件</comment>
+ <acronym>SMIL</acronym>
+ <expanded-acronym>Synchronized Multimedia Integration Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <alias type="application/smil+xml"/>
+ <generic-icon name="video-x-generic"/>
+ <glob pattern="*.smil"/>
+ <glob pattern="*.smi"/>
+ <glob pattern="*.sml"/>
+ <glob pattern="*.kino"/>
+ <magic priority="55">
+ <match value="&lt;smil" type="string" offset="0:256"/>
+ </magic>
+ <root-XML namespaceURI="http://www.w3.org/2001/SMIL20/Language" localName="smil"/>
+ <root-XML namespaceURI="http://www.w3.org/2005/SMIL21/Language" localName="smil"/>
+ <root-XML namespaceURI="http://www.w3.org/ns/SMIL" localName="smil"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-wpl">
+ <comment>WPL playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل WPL</comment>
+ <comment xml:lang="bg">Списък за изпълнение — WPL</comment>
+ <comment xml:lang="ca">llista de reproducció WPL</comment>
+ <comment xml:lang="cs">Seznam skladeb WPL</comment>
+ <comment xml:lang="da">WPL-afspilningsliste</comment>
+ <comment xml:lang="de">WPL-Wiedergabeliste</comment>
+ <comment xml:lang="eo">WPL-ludlisto</comment>
+ <comment xml:lang="es">lista de reproducción WPL</comment>
+ <comment xml:lang="eu">WPL erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">WPL-soittolista</comment>
+ <comment xml:lang="fo">WPL avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture WPL</comment>
+ <comment xml:lang="ga">seinmliosta WPL</comment>
+ <comment xml:lang="gl">lista de reprodución WPL</comment>
+ <comment xml:lang="he">רשימת השמעה WPL</comment>
+ <comment xml:lang="hu">WPL-lejátszólista</comment>
+ <comment xml:lang="id">Senarai putar WPL</comment>
+ <comment xml:lang="it">Scaletta WPL</comment>
+ <comment xml:lang="ja">WPL 再生リスト</comment>
+ <comment xml:lang="kk">WPL ойнау тізімі</comment>
+ <comment xml:lang="ko">WPL 재생 목록</comment>
+ <comment xml:lang="lt">WPL grojaraštis</comment>
+ <comment xml:lang="lv">WPL repertuārs</comment>
+ <comment xml:lang="nl">WPL-afspeellijst</comment>
+ <comment xml:lang="pl">Lista odtwarzania WPL</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do WPL</comment>
+ <comment xml:lang="ro">Listă redare WPL</comment>
+ <comment xml:lang="ru">список воспроизведения WPL</comment>
+ <comment xml:lang="sk">Zoznam skladieb WPL</comment>
+ <comment xml:lang="sl">Seznam predvajanja WPL</comment>
+ <comment xml:lang="sv">WPL-spellista</comment>
+ <comment xml:lang="uk">список відтворення WPL</comment>
+ <comment xml:lang="vi">Danh mục nhạc WPL</comment>
+ <comment xml:lang="zh_CN">WPL 播放列表</comment>
+ <comment xml:lang="zh_TW">WPL 播放清單</comment>
+ <acronym>WPL</acronym>
+ <expanded-acronym>Windows Media Player Playlist</expanded-acronym>
+ <generic-icon name="video-x-generic"/>
+ <glob pattern="*.wpl"/>
+ <magic priority="60">
+ <match value="&lt;?wpl" type="string" offset="0:256"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-sqlite2">
+ <comment>SQLite2 database</comment>
+ <comment xml:lang="ar">قاعدة بيانات SQLite2</comment>
+ <comment xml:lang="be@latin">Baza źviestak SQLite2</comment>
+ <comment xml:lang="bg">База от данни — SQLite2</comment>
+ <comment xml:lang="ca">base de dades SQLite2</comment>
+ <comment xml:lang="cs">Databáze SQLite2</comment>
+ <comment xml:lang="da">SQLite2-database</comment>
+ <comment xml:lang="de">SQLite2-Datenbank</comment>
+ <comment xml:lang="en_GB">SQLite2 database</comment>
+ <comment xml:lang="eo">SQLite2-datumbazo</comment>
+ <comment xml:lang="es">base de datos SQLite2</comment>
+ <comment xml:lang="eu">SQLite2 datu-basea</comment>
+ <comment xml:lang="fi">SQLite2-tietokanta</comment>
+ <comment xml:lang="fo">SQLite2 dátustovnur</comment>
+ <comment xml:lang="fr">base de données SQLite2</comment>
+ <comment xml:lang="ga">bunachar sonraí SQLite2</comment>
+ <comment xml:lang="gl">base de datos SQLite2</comment>
+ <comment xml:lang="he">בסיס מידע של SQLite2</comment>
+ <comment xml:lang="hu">SQLite2 adatbázis</comment>
+ <comment xml:lang="id">Basis data SQLite2</comment>
+ <comment xml:lang="it">Database SQLite2</comment>
+ <comment xml:lang="ja">SQLite2 データベース</comment>
+ <comment xml:lang="kk">SQLite2 дерекқоры</comment>
+ <comment xml:lang="ko">SQLite2 데이터베이스</comment>
+ <comment xml:lang="lt">SQLite2 duomenų bazė</comment>
+ <comment xml:lang="lv">SQLite2 datubāze</comment>
+ <comment xml:lang="nb">SQLite2-database</comment>
+ <comment xml:lang="nl">SQLite2-gegevensbank</comment>
+ <comment xml:lang="nn">SQLite2-database</comment>
+ <comment xml:lang="pl">Baza danych SQLite2</comment>
+ <comment xml:lang="pt_BR">Banco de dados do SQLite2</comment>
+ <comment xml:lang="ro">Bază de date SQLite2</comment>
+ <comment xml:lang="ru">база данных SQLite2</comment>
+ <comment xml:lang="sk">Databáza SQLite2</comment>
+ <comment xml:lang="sl">Podatkovna zbirka SQLite2</comment>
+ <comment xml:lang="sq">Bazë me të dhëna SQLite2</comment>
+ <comment xml:lang="sv">SQLite2-databas</comment>
+ <comment xml:lang="uk">База даних SQLite2</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu SQLite2</comment>
+ <comment xml:lang="zh_CN">SQLite2 数据库</comment>
+ <comment xml:lang="zh_TW">SQLite2 資料庫</comment>
+ <magic>
+ <match value="** This file contains an SQLite" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-sqlite3">
+ <comment>SQLite3 database</comment>
+ <comment xml:lang="ar">قاعدة بيانات SQLite3</comment>
+ <comment xml:lang="be@latin">Baza źviestak SQLite3</comment>
+ <comment xml:lang="bg">База от данни — SQLite3</comment>
+ <comment xml:lang="ca">base de dades SQLite3</comment>
+ <comment xml:lang="cs">Databáze SQLite3</comment>
+ <comment xml:lang="da">SQLite3-database</comment>
+ <comment xml:lang="de">SQLite3-Datenbank</comment>
+ <comment xml:lang="en_GB">SQLite3 database</comment>
+ <comment xml:lang="eo">SQLite3-datumbazo</comment>
+ <comment xml:lang="es">base de datos SQLite3</comment>
+ <comment xml:lang="eu">SQLite3 datu-basea</comment>
+ <comment xml:lang="fi">SQLite3-tietokanta</comment>
+ <comment xml:lang="fo">SQLite3 dátustovnur</comment>
+ <comment xml:lang="fr">base de données SQLite3</comment>
+ <comment xml:lang="ga">bunachar sonraí SQLite3</comment>
+ <comment xml:lang="gl">base de datos SQLite3</comment>
+ <comment xml:lang="he">בסיס מידע של SQLite3</comment>
+ <comment xml:lang="hu">SQLite3 adatbázis</comment>
+ <comment xml:lang="id">Basis data SQLite3</comment>
+ <comment xml:lang="it">Database SQLite3</comment>
+ <comment xml:lang="ja">SQLite3 データベース</comment>
+ <comment xml:lang="kk">SQLite3 дерекқоры</comment>
+ <comment xml:lang="ko">SQLite3 데이터베이스</comment>
+ <comment xml:lang="lt">SQLite3 duomenų bazė</comment>
+ <comment xml:lang="lv">SQLite3 datubāze</comment>
+ <comment xml:lang="nb">SQLite3-database</comment>
+ <comment xml:lang="nl">SQLite3-gegevensbank</comment>
+ <comment xml:lang="nn">SQLite3-database</comment>
+ <comment xml:lang="pl">Baza danych SQLite3</comment>
+ <comment xml:lang="pt_BR">Banco de dados do SQLite3</comment>
+ <comment xml:lang="ro">Bază de date SQLite3</comment>
+ <comment xml:lang="ru">база данных SQLite3</comment>
+ <comment xml:lang="sk">Databáza SQLite3</comment>
+ <comment xml:lang="sl">Podatkovna zbirka SQLite3</comment>
+ <comment xml:lang="sq">Bazë me të dhëna SQLite3</comment>
+ <comment xml:lang="sv">SQLite3-databas</comment>
+ <comment xml:lang="uk">база даних SQLite3</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu SQLite3</comment>
+ <comment xml:lang="zh_CN">SQLite3 数据库</comment>
+ <comment xml:lang="zh_TW">SQLite3 資料庫</comment>
+ <magic>
+ <match value="SQLite format 3" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-gedcom">
+ <comment>GEDCOM family history</comment>
+ <comment xml:lang="ar">تاريخ عائلة GEDCOM</comment>
+ <comment xml:lang="be@latin">Siamiejnaja historyja GEDCOM</comment>
+ <comment xml:lang="bg">Родословно дърво — GEDCOM</comment>
+ <comment xml:lang="ca">història familiar GEDCOM</comment>
+ <comment xml:lang="cs">Rodokmen GEDCOM</comment>
+ <comment xml:lang="da">GEDCOM-familiehistorie</comment>
+ <comment xml:lang="de">GEDCOM-Stammbaum</comment>
+ <comment xml:lang="en_GB">GEDCOM family history</comment>
+ <comment xml:lang="es">historia familiar GEDCOM</comment>
+ <comment xml:lang="eu">GEDCOM famili historia</comment>
+ <comment xml:lang="fi">GEDCOM-sukuhistoria</comment>
+ <comment xml:lang="fo">GEDCOM familjusøga</comment>
+ <comment xml:lang="fr">généalogie GEDCOM</comment>
+ <comment xml:lang="ga">stair theaghlach GEDCOM</comment>
+ <comment xml:lang="gl">historial de familia GEDCOM</comment>
+ <comment xml:lang="he">היסטוריה משפחתית של GEDCOM</comment>
+ <comment xml:lang="hu">GEDCOM családtörténet</comment>
+ <comment xml:lang="id">Sejarah keluarga GEDCOM</comment>
+ <comment xml:lang="it">Cronologia famiglia GEDCOM</comment>
+ <comment xml:lang="ja">GEDCOM 家系図データ</comment>
+ <comment xml:lang="kk">GEDCOM отбасы тарихы</comment>
+ <comment xml:lang="ko">GEDCOM family history</comment>
+ <comment xml:lang="lt">GEDCOM šeimos istorija</comment>
+ <comment xml:lang="lv">GEDCOM ģimenes vēsture</comment>
+ <comment xml:lang="nb">GEDCOM-familiehistorikk</comment>
+ <comment xml:lang="nl">GEDCOM-stamboom</comment>
+ <comment xml:lang="nn">GEDCOM-familehistorie</comment>
+ <comment xml:lang="pl">Plik historii rodziny GEDCOM</comment>
+ <comment xml:lang="pt_BR">Histórico familiar do GEDCOM</comment>
+ <comment xml:lang="ro">Tablou genealogic GEDCOM</comment>
+ <comment xml:lang="ru">история семьи GEDCOM</comment>
+ <comment xml:lang="sk">Rodokmeň GEDCOM</comment>
+ <comment xml:lang="sl">Datoteka družinske zgodovine GEDCOM</comment>
+ <comment xml:lang="sq">Kronollogji familje GEDCOM</comment>
+ <comment xml:lang="sv">GEDCOM-släktträd</comment>
+ <comment xml:lang="uk">історія родини GEDCOM</comment>
+ <comment xml:lang="vi">Lịch sử gia đình GEDCOM</comment>
+ <comment xml:lang="zh_CN">GEDCOM 家谱</comment>
+ <comment xml:lang="zh_TW">GEDCOM 家族史</comment>
+ <acronym>GEDCOM</acronym>
+ <expanded-acronym>GEnealogical Data COMmunication</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="0 HEAD" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ged"/>
+ <glob pattern="*.gedcom"/>
+ <alias type="text/gedcom"/>
+ </mime-type>
+ <mime-type type="video/x-flv">
+ <comment>Flash video</comment>
+ <comment xml:lang="ar">Flash مرئي</comment>
+ <comment xml:lang="be@latin">Videa Flash</comment>
+ <comment xml:lang="bg">Видео — Flash</comment>
+ <comment xml:lang="ca">vídeo de Flash</comment>
+ <comment xml:lang="cs">Video Flash</comment>
+ <comment xml:lang="da">Flashvideo</comment>
+ <comment xml:lang="de">Flash-Video</comment>
+ <comment xml:lang="en_GB">Flash video</comment>
+ <comment xml:lang="eo">Flash-video</comment>
+ <comment xml:lang="es">vídeo Flash</comment>
+ <comment xml:lang="eu">Flash bideoa</comment>
+ <comment xml:lang="fi">Flash-video</comment>
+ <comment xml:lang="fo">Flash video</comment>
+ <comment xml:lang="fr">vidéo Flash</comment>
+ <comment xml:lang="ga">físeán Flash</comment>
+ <comment xml:lang="gl">vídeo Flash</comment>
+ <comment xml:lang="he">וידאו של פלאש</comment>
+ <comment xml:lang="hu">Flash videó</comment>
+ <comment xml:lang="id">Video Flash</comment>
+ <comment xml:lang="it">Video Flash</comment>
+ <comment xml:lang="ja">Flash 動画</comment>
+ <comment xml:lang="kk">Flash видеосы</comment>
+ <comment xml:lang="ko">Flash 비디오</comment>
+ <comment xml:lang="lt">Flash vaizdo įrašas</comment>
+ <comment xml:lang="lv">Flash video</comment>
+ <comment xml:lang="nb">Flash-film</comment>
+ <comment xml:lang="nl">Flash-video</comment>
+ <comment xml:lang="nn">Flash-video</comment>
+ <comment xml:lang="pl">Plik wideo Flash</comment>
+ <comment xml:lang="pt_BR">Vídeo Flash</comment>
+ <comment xml:lang="ro">Video Flash</comment>
+ <comment xml:lang="ru">видео Flash</comment>
+ <comment xml:lang="sk">Video Flash</comment>
+ <comment xml:lang="sl">Video datoteka Flash</comment>
+ <comment xml:lang="sq">Video Flash</comment>
+ <comment xml:lang="sv">Flash-video</comment>
+ <comment xml:lang="uk">відеокліп Flash</comment>
+ <comment xml:lang="vi">Ảnh động Flash</comment>
+ <comment xml:lang="zh_CN">Flash 影片</comment>
+ <comment xml:lang="zh_TW">Flash 視訊</comment>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+ <match value="FLV" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.flv"/>
+ <alias type="application/x-flash-video"/>
+ <alias type="flv-application/octet-stream"/>
+ <alias type="video/flv"/>
+ </mime-type>
+ <mime-type type="video/x-javafx">
+ <comment>JavaFX video</comment>
+ <comment xml:lang="bg">Видео — JavaFX</comment>
+ <comment xml:lang="ca">vídeo JavaFX</comment>
+ <comment xml:lang="cs">Video JavaFX</comment>
+ <comment xml:lang="da">JavaFX-video</comment>
+ <comment xml:lang="de">JavaFX-Video</comment>
+ <comment xml:lang="eo">JavaFX-video</comment>
+ <comment xml:lang="es">vídeo JavaFX</comment>
+ <comment xml:lang="fi">JavaFX-video</comment>
+ <comment xml:lang="fo">JavaFX video</comment>
+ <comment xml:lang="fr">vidéo JavaFX</comment>
+ <comment xml:lang="ga">físeán JavaFX</comment>
+ <comment xml:lang="gl">vídeo JavaFX</comment>
+ <comment xml:lang="he">וידאו JavaFX</comment>
+ <comment xml:lang="hu">JavaFX videó</comment>
+ <comment xml:lang="id">Video JavaFX</comment>
+ <comment xml:lang="it">Video JavaFX</comment>
+ <comment xml:lang="ja">JavaFX 動画</comment>
+ <comment xml:lang="kk">JavaFX аудиосы</comment>
+ <comment xml:lang="ko">자바FX 비디오</comment>
+ <comment xml:lang="lv">JavaFX video</comment>
+ <comment xml:lang="pl">Plik wideo JavaFX</comment>
+ <comment xml:lang="ro">Video JavaFX</comment>
+ <comment xml:lang="ru">видео JavaFX</comment>
+ <comment xml:lang="sk">Video JavaFX</comment>
+ <comment xml:lang="sl">Video JavaFX</comment>
+ <comment xml:lang="sv">JavaFX-video</comment>
+ <comment xml:lang="uk">відеокліп JavaFX</comment>
+ <comment xml:lang="zh_CN">JavaFX 视频</comment>
+ <comment xml:lang="zh_TW">JavaFX 視訊</comment>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="40">
+ <match value="FLV" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.fxm"/>
+ <sub-class-of type="video/x-flv"/>
+ </mime-type>
+ <mime-type type="application/x-go-sgf">
+
+ <comment>SGF record</comment>
+ <comment xml:lang="ar">تسجيلة SGF</comment>
+ <comment xml:lang="be@latin">Zapisanaja hulnia SGF</comment>
+ <comment xml:lang="bg">Запис — SGF</comment>
+ <comment xml:lang="ca">registre SGF</comment>
+ <comment xml:lang="cs">Záznam SGF</comment>
+ <comment xml:lang="da">SGF-optagelse</comment>
+ <comment xml:lang="de">SGF-Aufzeichnung</comment>
+ <comment xml:lang="es">grabación SGF</comment>
+ <comment xml:lang="eu">SGF erregistroa</comment>
+ <comment xml:lang="fi">SGF-nauhoitus</comment>
+ <comment xml:lang="fo">SGF met</comment>
+ <comment xml:lang="fr">partie SGF</comment>
+ <comment xml:lang="ga">taifead SGF</comment>
+ <comment xml:lang="gl">Grabación SGF</comment>
+ <comment xml:lang="he">הקלטת SGF</comment>
+ <comment xml:lang="hu">SGF pontszám</comment>
+ <comment xml:lang="id">Catatan SGF</comment>
+ <comment xml:lang="it">Registrazione SGF</comment>
+ <comment xml:lang="ja">SGF レコード</comment>
+ <comment xml:lang="kk">SGF жазбасы</comment>
+ <comment xml:lang="ko">SGF 기록파일</comment>
+ <comment xml:lang="lt">SGF įrašas</comment>
+ <comment xml:lang="lv">SGF ieraksts</comment>
+ <comment xml:lang="nb">SGF-oppføring</comment>
+ <comment xml:lang="nl">SGF-record</comment>
+ <comment xml:lang="nn">SGF-logg</comment>
+ <comment xml:lang="pl">Zapis gry SGF</comment>
+ <comment xml:lang="pt_BR">Gravação do SGF</comment>
+ <comment xml:lang="ro">Înregistrare SGF</comment>
+ <comment xml:lang="ru">запись SGF</comment>
+ <comment xml:lang="sk">Záznam SGF</comment>
+ <comment xml:lang="sl">Datoteka shranjene igre SGF</comment>
+ <comment xml:lang="sq">Regjistrim SGF</comment>
+ <comment xml:lang="sv">SGF-protokoll</comment>
+ <comment xml:lang="uk">запис SGF</comment>
+ <comment xml:lang="vi">Mục ghi SGF</comment>
+ <comment xml:lang="zh_CN">SGF 记录</comment>
+ <comment xml:lang="zh_TW">SGF 紀錄</comment>
+ <acronym>SGF</acronym>
+ <expanded-acronym>Smart Game Format</expanded-acronym>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.sgf"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="(;FF[3]" type="string" offset="0"/>
+ <match value="(;FF[4]" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-xliff">
+ <comment>XLIFF translation file</comment>
+ <comment xml:lang="ar">ملف ترجمة XLIFF</comment>
+ <comment xml:lang="be@latin">Fajł pierakładu XLIFF</comment>
+ <comment xml:lang="bg">Превод — XLIFF</comment>
+ <comment xml:lang="ca">fitxer traducció XLIFF</comment>
+ <comment xml:lang="cs">Soubor překladu XLIFF</comment>
+ <comment xml:lang="da">XLIFF-oversættelsesfil</comment>
+ <comment xml:lang="de">XLIFF-Übersetzung</comment>
+ <comment xml:lang="es">archivo de traducción XLIFF</comment>
+ <comment xml:lang="eu">XLIFF itzulpen-fitxategia</comment>
+ <comment xml:lang="fi">XLIFF-käännöstiedosto</comment>
+ <comment xml:lang="fo">XLIFF týðingarfíla</comment>
+ <comment xml:lang="fr">fichier de traduction XLIFF</comment>
+ <comment xml:lang="ga">comhad aistrithe XLIFF</comment>
+ <comment xml:lang="gl">ficheiro de tradución XLIFF</comment>
+ <comment xml:lang="he">קובץ תרגום CLIFF</comment>
+ <comment xml:lang="hu">XLIFF fordítási fájl</comment>
+ <comment xml:lang="id">Berkas terjemahan XLIFF</comment>
+ <comment xml:lang="it">File traduzione XLIFF</comment>
+ <comment xml:lang="ja">XLIFF 翻訳ファイル</comment>
+ <comment xml:lang="kk">XLIFF аударма файлы</comment>
+ <comment xml:lang="ko">XLIFF 번역 파일</comment>
+ <comment xml:lang="lt">XLIFF vertimo failas</comment>
+ <comment xml:lang="lv">XLIFF tulkošanas fails</comment>
+ <comment xml:lang="nb">XLIFF-oversettelsesfil</comment>
+ <comment xml:lang="nl">XLIFF-vertalingsbestand</comment>
+ <comment xml:lang="nn">XLIFF-omsetjingsfil</comment>
+ <comment xml:lang="pl">Plik tłumaczenia XLIFF</comment>
+ <comment xml:lang="pt_BR">Arquivo de tradução XLIFF</comment>
+ <comment xml:lang="ro">Fișier de traducere XLIFF</comment>
+ <comment xml:lang="ru">файл перевода XLIFF</comment>
+ <comment xml:lang="sk">Súbor prekladu XLIFF</comment>
+ <comment xml:lang="sl">Datoteka prevoda XLIFF</comment>
+ <comment xml:lang="sq">File përkthimesh XLIFF</comment>
+ <comment xml:lang="sv">XLIFF-översättningsfil</comment>
+ <comment xml:lang="uk">файл перекладу XLIFF</comment>
+ <comment xml:lang="vi">Tập tin dịch XLIFF</comment>
+ <comment xml:lang="zh_CN">XLIFF 消息翻译文件</comment>
+ <comment xml:lang="zh_TW">XLIFF 翻譯檔</comment>
+ <acronym>XLIFF</acronym>
+ <expanded-acronym>XML Localization Interchange File Format</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.xlf"/>
+ <glob pattern="*.xliff"/>
+ <magic priority="80">
+ <match value="&lt;xliff" type="string" offset="0:256"/>
+ </magic>
+ <root-XML namespaceURI='urn:oasis:names:tc:xliff:document:1.1' localName='xliff'/>
+ </mime-type>
+ <mime-type type="application/x-yaml">
+ <comment>YAML document</comment>
+ <comment xml:lang="ar">مستند YAML</comment>
+ <comment xml:lang="bg">Документ — YAML</comment>
+ <comment xml:lang="ca">document YAML</comment>
+ <comment xml:lang="cs">Dokument YAML</comment>
+ <comment xml:lang="da">YAML-dokument</comment>
+ <comment xml:lang="de">YAML-Dokument</comment>
+ <comment xml:lang="eo">YAML-dokumento</comment>
+ <comment xml:lang="es">documento YAML</comment>
+ <comment xml:lang="fi">YAML-asiakirja</comment>
+ <comment xml:lang="fo">YAML skjal</comment>
+ <comment xml:lang="fr">document YAML</comment>
+ <comment xml:lang="ga">cáipéis YAML</comment>
+ <comment xml:lang="gl">documento YAML</comment>
+ <comment xml:lang="he">מסמך YAML</comment>
+ <comment xml:lang="hu">YAML-dokumentum</comment>
+ <comment xml:lang="id">Dokumen YAML</comment>
+ <comment xml:lang="it">Documento YAML</comment>
+ <comment xml:lang="ja">YAML ドキュメント</comment>
+ <comment xml:lang="kk">YAML құжаты</comment>
+ <comment xml:lang="ko">YAML 문서</comment>
+ <comment xml:lang="lt">YAML dokumentas</comment>
+ <comment xml:lang="lv">YAML dokuments</comment>
+ <comment xml:lang="pl">Dokument YAML</comment>
+ <comment xml:lang="ro">Document YAML</comment>
+ <comment xml:lang="ru">документ YAML</comment>
+ <comment xml:lang="sk">Dokument YAML</comment>
+ <comment xml:lang="sl">Dokument YAML</comment>
+ <comment xml:lang="sv">YAML-dokument</comment>
+ <comment xml:lang="uk">документ YAML</comment>
+ <comment xml:lang="zh_CN">YAML 文档</comment>
+ <comment xml:lang="zh_TW">YAML 文件</comment>
+ <acronym>YAML</acronym>
+ <expanded-acronym>YAML Ain't Markup Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic>
+ <match value="%YAML" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.yaml"/>
+ <glob pattern="*.yml"/>
+ <alias type="text/yaml"/>
+ <alias type="text/x-yaml"/>
+ </mime-type>
+ <mime-type type="application/vnd.corel-draw">
+ <comment>Corel Draw drawing</comment>
+ <comment xml:lang="ar">تصميم Corel Draw</comment>
+ <comment xml:lang="az">Corel Draw çəkimi</comment>
+ <comment xml:lang="be@latin">Rysunak Corel Draw</comment>
+ <comment xml:lang="bg">Чертеж — Corel Draw</comment>
+ <comment xml:lang="ca">dibuix de Corel Draw</comment>
+ <comment xml:lang="cs">Kresba Corel Draw</comment>
+ <comment xml:lang="cy">Darlun Corel Draw</comment>
+ <comment xml:lang="da">Corel Draw-tegning</comment>
+ <comment xml:lang="de">Corel-Draw-Zeichnung</comment>
+ <comment xml:lang="el">σχέδιο Corel Draw </comment>
+ <comment xml:lang="en_GB">Corel Draw drawing</comment>
+ <comment xml:lang="eo">grafikaĵo de Corel Draw</comment>
+ <comment xml:lang="es">dibujo de Corel Draw</comment>
+ <comment xml:lang="eu">Corel Draw-eko marrazkia</comment>
+ <comment xml:lang="fi">Corel Draw -piirros</comment>
+ <comment xml:lang="fo">Corel Draw tekning</comment>
+ <comment xml:lang="fr">dessin Corel Draw</comment>
+ <comment xml:lang="ga">líníocht Corel Draw</comment>
+ <comment xml:lang="gl">debuxo de Corel Draw</comment>
+ <comment xml:lang="he">ציור של Corel Draw</comment>
+ <comment xml:lang="hu">Corel Draw-rajz</comment>
+ <comment xml:lang="id">Gambar Corel Draw</comment>
+ <comment xml:lang="it">Disegno Corel Draw</comment>
+ <comment xml:lang="ja">Corel Draw ドロー</comment>
+ <comment xml:lang="kk">Corel Draw суреті</comment>
+ <comment xml:lang="ko">코렐 드로우 드로잉</comment>
+ <comment xml:lang="lt">Corel Draw piešinys</comment>
+ <comment xml:lang="lv">Corel Draw zīmējums</comment>
+ <comment xml:lang="ms">Lukisan Corel Draw</comment>
+ <comment xml:lang="nb">Corel Draw-tegning</comment>
+ <comment xml:lang="nl">Corel Draw-tekening</comment>
+ <comment xml:lang="nn">Corel Draw-teikning</comment>
+ <comment xml:lang="pl">Rysunek Corel Draw</comment>
+ <comment xml:lang="pt">desenho Corel Draw</comment>
+ <comment xml:lang="pt_BR">Desenho do Corel Draw</comment>
+ <comment xml:lang="ro">Desen Corel Draw</comment>
+ <comment xml:lang="ru">изображение Corel Draw</comment>
+ <comment xml:lang="sk">Kresba Corel Draw</comment>
+ <comment xml:lang="sl">Datoteka risbe Corel Draw</comment>
+ <comment xml:lang="sq">Vizatim Corel Draw</comment>
+ <comment xml:lang="sr">Corel Draw цртеж</comment>
+ <comment xml:lang="sv">Corel Draw-teckning</comment>
+ <comment xml:lang="uk">малюнок Corel Draw</comment>
+ <comment xml:lang="vi">Bản vẽ Corel Draw</comment>
+ <comment xml:lang="zh_CN">Corel Draw 图形</comment>
+ <comment xml:lang="zh_TW">Corel Draw 繪圖</comment>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="80">
+ <match value="CDRXvrsn" type="string" offset="8" mask="0xffffff00ffffffff"/>
+ </magic>
+ <glob pattern="*.cdr"/>
+ <alias type="application/cdr"/>
+ <alias type="application/coreldraw"/>
+ <alias type="application/x-cdr"/>
+ <alias type="application/x-coreldraw"/>
+ <alias type="image/cdr"/>
+ <alias type="image/x-cdr"/>
+ <alias type="zz-application/zz-winassoc-cdr"/>
+ </mime-type>
+ <mime-type type="application/vnd.hp-hpgl">
+ <comment>HPGL file</comment>
+ <comment xml:lang="ar">ملف HPGL</comment>
+ <comment xml:lang="be@latin">Fajł HPGL</comment>
+ <comment xml:lang="bg">Файл — HPGL</comment>
+ <comment xml:lang="ca">fitxer HPGL</comment>
+ <comment xml:lang="cs">Soubor HPGL</comment>
+ <comment xml:lang="da">HPGL-fil</comment>
+ <comment xml:lang="de">HPGL-Datei</comment>
+ <comment xml:lang="en_GB">HPGL file</comment>
+ <comment xml:lang="eo">HPGL-dosiero</comment>
+ <comment xml:lang="es">archivo HPGL</comment>
+ <comment xml:lang="eu">HPGL fitxategia</comment>
+ <comment xml:lang="fi">HPGL-tiedosto</comment>
+ <comment xml:lang="fo">HPGL fíla</comment>
+ <comment xml:lang="fr">fichier HPGL</comment>
+ <comment xml:lang="ga">comhad HPGL</comment>
+ <comment xml:lang="gl">ficheiro HPGL</comment>
+ <comment xml:lang="he">קובץ HGPL</comment>
+ <comment xml:lang="hu">HPGL fájl</comment>
+ <comment xml:lang="id">Berkas HPGL</comment>
+ <comment xml:lang="it">File HPGL</comment>
+ <comment xml:lang="ja">HPGL ファイル</comment>
+ <comment xml:lang="kk">HPGL файлы</comment>
+ <comment xml:lang="ko">HPGL 파일</comment>
+ <comment xml:lang="lt">HPGL failas</comment>
+ <comment xml:lang="lv">HPGL fails</comment>
+ <comment xml:lang="nb">HPGL-fil</comment>
+ <comment xml:lang="nl">HPGL-bestand</comment>
+ <comment xml:lang="nn">HPGL-fil</comment>
+ <comment xml:lang="pl">Plik HPGL</comment>
+ <comment xml:lang="pt_BR">Arquivo HPGL</comment>
+ <comment xml:lang="ro">Fișier HPGL</comment>
+ <comment xml:lang="ru">файл HPGL</comment>
+ <comment xml:lang="sk">Súbor HPGL</comment>
+ <comment xml:lang="sl">Datoteka HPGL</comment>
+ <comment xml:lang="sq">File HPGL</comment>
+ <comment xml:lang="sv">HPGL-fil</comment>
+ <comment xml:lang="uk">файл HPGL</comment>
+ <comment xml:lang="vi">Tập tin HPGL</comment>
+ <comment xml:lang="zh_CN">HPGL 文件</comment>
+ <comment xml:lang="zh_TW">HPGL 檔案</comment>
+ <acronym>HPGL</acronym>
+ <expanded-acronym>HP Graphics Language</expanded-acronym>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.hpgl"/>
+ </mime-type>
+ <mime-type type="application/vnd.hp-pcl">
+ <comment>PCL file</comment>
+ <comment xml:lang="ar">ملف PCL</comment>
+ <comment xml:lang="be@latin">Fajł PCL</comment>
+ <comment xml:lang="bg">Файл — PCL</comment>
+ <comment xml:lang="ca">fitxer PCL</comment>
+ <comment xml:lang="cs">Soubor PCL</comment>
+ <comment xml:lang="da">PCL-fil</comment>
+ <comment xml:lang="de">PCL-Datei</comment>
+ <comment xml:lang="en_GB">PCL file</comment>
+ <comment xml:lang="eo">PCL-dosiero</comment>
+ <comment xml:lang="es">archivo PCL</comment>
+ <comment xml:lang="eu">PCL fitxategia</comment>
+ <comment xml:lang="fi">PCL-tiedosto</comment>
+ <comment xml:lang="fo">PCL fíla</comment>
+ <comment xml:lang="fr">fichier PCL</comment>
+ <comment xml:lang="ga">comhad PCL</comment>
+ <comment xml:lang="gl">ficheiro PCL</comment>
+ <comment xml:lang="he">קובץ PCL</comment>
+ <comment xml:lang="hu">PCL fájl</comment>
+ <comment xml:lang="id">Berkas PCL</comment>
+ <comment xml:lang="it">File PCL</comment>
+ <comment xml:lang="ja">PCL ファイル</comment>
+ <comment xml:lang="kk">PCL файлы</comment>
+ <comment xml:lang="ko">PCL 파일</comment>
+ <comment xml:lang="lt">PCL failas</comment>
+ <comment xml:lang="lv">PCL fails</comment>
+ <comment xml:lang="nb">PCL-fil</comment>
+ <comment xml:lang="nl">PCL-bestand</comment>
+ <comment xml:lang="nn">PCL-fil</comment>
+ <comment xml:lang="pl">Plik PCL</comment>
+ <comment xml:lang="pt_BR">Arquivo PCL</comment>
+ <comment xml:lang="ro">Fișier PCL</comment>
+ <comment xml:lang="ru">файл PCL</comment>
+ <comment xml:lang="sk">Súbor PCL</comment>
+ <comment xml:lang="sl">Datoteka PCL</comment>
+ <comment xml:lang="sq">File PCL</comment>
+ <comment xml:lang="sv">PCL-fil</comment>
+ <comment xml:lang="uk">файл PCL</comment>
+ <comment xml:lang="vi">Tập tin PCL</comment>
+ <comment xml:lang="zh_CN">PCL 文件</comment>
+ <comment xml:lang="zh_TW">PCL 檔</comment>
+ <acronym>PCL</acronym>
+ <expanded-acronym>HP Printer Control Language</expanded-acronym>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.pcl"/>
+ </mime-type>
+ <mime-type type="application/vnd.lotus-1-2-3">
+ <comment>Lotus 1-2-3 spreadsheet</comment>
+ <comment xml:lang="ar">جدول Lotus 1-2-3</comment>
+ <comment xml:lang="az">Lotus 1-2-3 hesab cədvəli</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Lotus 1-2-3</comment>
+ <comment xml:lang="bg">Таблица — Lotus 1-2-3</comment>
+ <comment xml:lang="ca">full de càlcul de Lotus 1-2-3</comment>
+ <comment xml:lang="cs">Sešit Lotus 1-2-3</comment>
+ <comment xml:lang="cy">Taenlen Lotus 1-2-3</comment>
+ <comment xml:lang="da">Lotus 1-2-3-regneark</comment>
+ <comment xml:lang="de">Lotus-1-2-3-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο Lotus 1-2-3</comment>
+ <comment xml:lang="en_GB">Lotus 1-2-3 spreadsheet</comment>
+ <comment xml:lang="eo">Kalkultabelo de Lotus 1-2-3</comment>
+ <comment xml:lang="es">hoja de cálculo de Lotus 1-2-3</comment>
+ <comment xml:lang="eu">Lotus 1-2-3 kalkulu-orria</comment>
+ <comment xml:lang="fi">Lotus 1-2-3 -taulukko</comment>
+ <comment xml:lang="fo">Lotus 1-2-3 rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Lotus 1-2-3</comment>
+ <comment xml:lang="ga">scarbhileog Lotus 1-2-3</comment>
+ <comment xml:lang="gl">folla de cálculo de Lotus 1-2-3</comment>
+ <comment xml:lang="he">גליון נתונים של Lotus 1-2-3</comment>
+ <comment xml:lang="hu">Lotus 1-2-3-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar Lotus 1-2-3</comment>
+ <comment xml:lang="it">Foglio di calcolo Lotus 1-2-3</comment>
+ <comment xml:lang="ja">Lotus 1-2-3 スプレッドシート</comment>
+ <comment xml:lang="kk">Lotus 1-2-3 электрондық кестесі</comment>
+ <comment xml:lang="ko">Lotus 1-2-3 스프레드시트</comment>
+ <comment xml:lang="lt">Lotus 1-2-3 skaičialentė</comment>
+ <comment xml:lang="lv">Lotus 1-2-3 izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan Lotus 1-2-3</comment>
+ <comment xml:lang="nb">Lotus 1-2-3 regneark</comment>
+ <comment xml:lang="nl">Lotus 1-2-3-rekenblad</comment>
+ <comment xml:lang="nn">Lotus 1-2-3 rekneark</comment>
+ <comment xml:lang="pl">Arkusz Lotus 1-2-3</comment>
+ <comment xml:lang="pt">folha de cálculo Lotus 1-2-3</comment>
+ <comment xml:lang="pt_BR">Planilha do Lotus 1-2-3</comment>
+ <comment xml:lang="ro">Foaie de calcul Lotus 1-2-3</comment>
+ <comment xml:lang="ru">электронная таблица Lotus 1-2-3</comment>
+ <comment xml:lang="sk">Zošit Lotus 1-2-3</comment>
+ <comment xml:lang="sl">Razpredelnica Lotus 1-2-3</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh Lotus 1-2-3</comment>
+ <comment xml:lang="sr">Lotus 1-2-3 табеларни прорачун</comment>
+ <comment xml:lang="sv">Lotus 1-2-3-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Lotus 1-2-3</comment>
+ <comment xml:lang="vi">Bảng tính Lotus 1-2-3</comment>
+ <comment xml:lang="zh_CN">Lotus 1-2-3 工作簿</comment>
+ <comment xml:lang="zh_TW">Lotus 1-2-3 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="\x00\x00\x02\x00\x06\x04\x06\x00\x08\x00\x00\x00\x00\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.123"/>
+ <glob pattern="*.wk1"/>
+ <glob pattern="*.wk3"/>
+ <glob pattern="*.wk4"/>
+ <glob pattern="*.wks"/>
+ <alias type="application/x-lotus123"/>
+ <alias type="application/x-123"/>
+ <alias type="application/lotus123"/>
+ <alias type="application/wk1"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-access">
+ <comment>JET database</comment>
+ <comment xml:lang="ar">قاعدة بيانات JET</comment>
+ <comment xml:lang="be@latin">Baza źviestak JET</comment>
+ <comment xml:lang="bg">База от данни — JET</comment>
+ <comment xml:lang="ca">base de dades JET</comment>
+ <comment xml:lang="cs">Databáze JET</comment>
+ <comment xml:lang="da">JET-database</comment>
+ <comment xml:lang="de">JET-Datenbank</comment>
+ <comment xml:lang="en_GB">JET database</comment>
+ <comment xml:lang="eo">JET-datumbazo</comment>
+ <comment xml:lang="es">base de datos JET</comment>
+ <comment xml:lang="eu">JET datu-basea</comment>
+ <comment xml:lang="fi">JET-tietokanta</comment>
+ <comment xml:lang="fo">JET dátustovnur</comment>
+ <comment xml:lang="fr">base de données JET</comment>
+ <comment xml:lang="ga">bunachar sonraí JET</comment>
+ <comment xml:lang="gl">base de datos JET</comment>
+ <comment xml:lang="he">מסד נתונים JET</comment>
+ <comment xml:lang="hu">JET adatbázis</comment>
+ <comment xml:lang="id">Basis data JET</comment>
+ <comment xml:lang="it">Database JET</comment>
+ <comment xml:lang="ja">JET データベース</comment>
+ <comment xml:lang="kk">JET дерекқоры</comment>
+ <comment xml:lang="ko">JET 데이터베이스</comment>
+ <comment xml:lang="lt">JET duomenų bazė</comment>
+ <comment xml:lang="lv">JET datubāze</comment>
+ <comment xml:lang="nb">JET-database</comment>
+ <comment xml:lang="nl">JET-gegevensbank</comment>
+ <comment xml:lang="nn">JET-database</comment>
+ <comment xml:lang="pl">Baza Danych JET</comment>
+ <comment xml:lang="pt_BR">Banco de dados JET</comment>
+ <comment xml:lang="ro">Bază de date JET</comment>
+ <comment xml:lang="ru">база данных JET</comment>
+ <comment xml:lang="sk">Databáza JET</comment>
+ <comment xml:lang="sl">Podatkovna zbirka JET</comment>
+ <comment xml:lang="sq">Bazë me të dhëna JET</comment>
+ <comment xml:lang="sv">JET-databas</comment>
+ <comment xml:lang="uk">База даних JET</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu JET</comment>
+ <comment xml:lang="zh_CN">JET 数据库</comment>
+ <comment xml:lang="zh_TW">JET 資料庫</comment>
+ <acronym>JET</acronym>
+ <expanded-acronym>Joint Engine Technology</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="\x00\x01\x00\x00Standard Jet DB" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mdb"/>
+ <alias type="application/x-msaccess"/>
+ <alias type="application/msaccess"/>
+ <alias type="application/vnd.msaccess"/>
+ <alias type="application/x-msaccess"/>
+ <alias type="application/mdb"/>
+ <alias type="application/x-mdb"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-cab-compressed">
+ <comment>Microsoft Cabinet archive</comment>
+ <comment xml:lang="ar">أرشيف Microsoft Cabinet</comment>
+ <comment xml:lang="bg">Архив — Microsoft Cabinet</comment>
+ <comment xml:lang="ca">arxiu Cabinet de Microsoft</comment>
+ <comment xml:lang="cs">Archiv Microsoft Cabinet</comment>
+ <comment xml:lang="da">Microsoft Cabinet-arkiv</comment>
+ <comment xml:lang="de">Microsoft-Cabinet-Archiv</comment>
+ <comment xml:lang="es">archivador Microsoft Cabinet</comment>
+ <comment xml:lang="eu">Microsoft Cabinet artxiboa</comment>
+ <comment xml:lang="fi">Microsoft Cabinet -arkisto</comment>
+ <comment xml:lang="fo">Microsoft Cabinet skjalasavn</comment>
+ <comment xml:lang="fr">archive Cab Microsoft</comment>
+ <comment xml:lang="ga">cartlann Microsoft Cabinet</comment>
+ <comment xml:lang="gl">arquivo de Microsoft Cabinet</comment>
+ <comment xml:lang="he">ארכיון CAB (מיקרוסופט)</comment>
+ <comment xml:lang="hu">Microsoft Cabinet archívum</comment>
+ <comment xml:lang="id">Arsip Microsoft Cabinet</comment>
+ <comment xml:lang="it">Archivio Microsoft Cabinet</comment>
+ <comment xml:lang="ja">Microsoft Cabinet アーカイブ</comment>
+ <comment xml:lang="kk">Microsoft Cabinet архиві</comment>
+ <comment xml:lang="ko">마이크로소프트 캐비넛 묶음</comment>
+ <comment xml:lang="lt">Microsoft Cabinet archyvas</comment>
+ <comment xml:lang="lv">Microsoft kabineta arhīvs</comment>
+ <comment xml:lang="nl">Microsoft Cabinet-archief</comment>
+ <comment xml:lang="pl">Archiwum Microsoft Cabinet</comment>
+ <comment xml:lang="pt_BR">Pacote do Microsoft Cabinet</comment>
+ <comment xml:lang="ro">Arhivă Microsoft Cabinet</comment>
+ <comment xml:lang="ru">архив Microsoft Cabinet</comment>
+ <comment xml:lang="sk">Archív Microsoft Cabinet</comment>
+ <comment xml:lang="sl">Datoteka arhiva Microsoft Cabinet</comment>
+ <comment xml:lang="sv">Microsoft Cabinet-arkiv</comment>
+ <comment xml:lang="uk">архів Cabinet Microsoft</comment>
+ <comment xml:lang="vi">Kho lưu Cabinet Microsoft</comment>
+ <comment xml:lang="zh_CN">Microsoft CAB 归档文件</comment>
+ <comment xml:lang="zh_TW">微軟 Cabinet 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="MSCF\0\0\0\0" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.cab"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-excel">
+ <comment>Excel spreadsheet</comment>
+ <comment xml:lang="ar">جدول Excel</comment>
+ <comment xml:lang="be@latin">Raźlikovy akruš Excel</comment>
+ <comment xml:lang="bg">Таблица — Excel</comment>
+ <comment xml:lang="ca">full de càlcul d'Excel</comment>
+ <comment xml:lang="cs">Sešit Excel</comment>
+ <comment xml:lang="da">Excelregneark</comment>
+ <comment xml:lang="de">Excel-Tabelle</comment>
+ <comment xml:lang="en_GB">Excel spreadsheet</comment>
+ <comment xml:lang="eo">Excel-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo de Excel</comment>
+ <comment xml:lang="eu">Excel kalkulu-orria</comment>
+ <comment xml:lang="fi">Excel-taulukko</comment>
+ <comment xml:lang="fo">Excel rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Excel</comment>
+ <comment xml:lang="ga">scarbhileog Excel</comment>
+ <comment xml:lang="gl">folla de cálculo de Excel</comment>
+ <comment xml:lang="he">גליון נתונים של אקסל</comment>
+ <comment xml:lang="hu">Excel táblázat</comment>
+ <comment xml:lang="id">Lembar sebar Excel</comment>
+ <comment xml:lang="it">Foglio di calcolo Excel</comment>
+ <comment xml:lang="ja">Excel スプレッドシート</comment>
+ <comment xml:lang="kk">Excel электрондық кестесі</comment>
+ <comment xml:lang="ko">엑셀 스프레드시트</comment>
+ <comment xml:lang="lt">Excel skaičialentė</comment>
+ <comment xml:lang="lv">Excel izklājlapa</comment>
+ <comment xml:lang="nb">Excel regneark</comment>
+ <comment xml:lang="nl">Excel-rekenblad</comment>
+ <comment xml:lang="nn">Excel-rekneark</comment>
+ <comment xml:lang="pl">Arkusz Excel</comment>
+ <comment xml:lang="pt_BR">Planilha do Excel</comment>
+ <comment xml:lang="ro">Foaie de calcul Excel</comment>
+ <comment xml:lang="ru">электронная таблица Excel</comment>
+ <comment xml:lang="sk">Zošit Excel</comment>
+ <comment xml:lang="sl">Razpredelnica Microsoft Excel</comment>
+ <comment xml:lang="sq">Fletë llogaritje Excel</comment>
+ <comment xml:lang="sv">Excel-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Excel</comment>
+ <comment xml:lang="vi">Bảng tính Excel</comment>
+ <comment xml:lang="zh_CN">Microsoft Excel 工作簿</comment>
+ <comment xml:lang="zh_TW">Excel 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="Microsoft Excel 5.0 Worksheet" type="string" offset="2080"/>
+ </magic>
+ <glob pattern="*.xls"/>
+ <glob pattern="*.xlc"/>
+ <glob pattern="*.xll"/>
+ <glob pattern="*.xlm"/>
+ <glob pattern="*.xlw"/>
+ <glob pattern="*.xla"/>
+ <glob pattern="*.xlt"/>
+ <glob pattern="*.xld"/>
+ <alias type="application/msexcel"/>
+ <alias type="application/x-msexcel"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-excel.addin.macroEnabled.12">
+ <comment>Excel add-in</comment>
+ <comment xml:lang="bg">Приставка — Excel</comment>
+ <comment xml:lang="ca">complement d'Excel</comment>
+ <comment xml:lang="cs">Doplněk aplikace Excel</comment>
+ <comment xml:lang="de">Excel Add-in</comment>
+ <comment xml:lang="es">Complemento de Excel</comment>
+ <comment xml:lang="fr">complément Excel</comment>
+ <comment xml:lang="gl">complemento de Excel</comment>
+ <comment xml:lang="he">תוסף של Excel</comment>
+ <comment xml:lang="hu">Excel bővítmény</comment>
+ <comment xml:lang="id">Add-in Excel</comment>
+ <comment xml:lang="it">Add-in Excel</comment>
+ <comment xml:lang="ja">Excel アドイン</comment>
+ <comment xml:lang="kk">Excel қосымшасы</comment>
+ <comment xml:lang="ko">엑셀 추가 기능</comment>
+ <comment xml:lang="lv">Excel pievienojumprogramma</comment>
+ <comment xml:lang="pl">Dodatek Excel</comment>
+ <comment xml:lang="ru">дополнение Excel</comment>
+ <comment xml:lang="sl">Vstavek Excel</comment>
+ <comment xml:lang="uk">додаток Excel</comment>
+ <comment xml:lang="zh_TW">Excel 增益集</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.xlam"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-excel.sheet.binary.macroEnabled.12">
+ <comment>Excel 2007 binary spreadsheet</comment>
+ <comment xml:lang="bg">Таблица — Excel 2007, двоична</comment>
+ <comment xml:lang="ca">full de càlcul binari d'Excel 2007</comment>
+ <comment xml:lang="cs">Binární formát sešitu Excel 2007</comment>
+ <comment xml:lang="de">Excel 2007-Tabelle (binär)</comment>
+ <comment xml:lang="es">Hoja de cálculo de Excel 2007</comment>
+ <comment xml:lang="fr">feuille de calcul binaire Excel 2007</comment>
+ <comment xml:lang="gl">ficheiro binario de folla de cálculo Excel 2007</comment>
+ <comment xml:lang="he">גיליון נתונים בינרי של Excel 2007</comment>
+ <comment xml:lang="hu">Excel 2007 bináris táblázat</comment>
+ <comment xml:lang="id">Lembar kerja biner Excel 2007</comment>
+ <comment xml:lang="it">Foglio di calcolo binario Excel 2007</comment>
+ <comment xml:lang="ja">Excel 2007 バイナリスプレッドシート</comment>
+ <comment xml:lang="kk">Excel 2007 бинарды кестесі</comment>
+ <comment xml:lang="ko">엑셀 2007 바이너리 스프레드시트</comment>
+ <comment xml:lang="lv">Excel 2007 binārā izklājlapa</comment>
+ <comment xml:lang="pl">Binarny arkusz Excel 2007</comment>
+ <comment xml:lang="ru">двоичная электронная таблица Excel 2007</comment>
+ <comment xml:lang="sl">Binarna preglednica Excel 2007</comment>
+ <comment xml:lang="uk">бінарна електронна таблиця Excel 2007</comment>
+ <comment xml:lang="zh_TW">Excel 2007 二進位試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.xlsb"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-excel.sheet.macroEnabled.12">
+ <comment>Excel macro-enabled spreadsheet</comment>
+ <comment xml:lang="bg">Таблица — Excel, с макроси</comment>
+ <comment xml:lang="ca">full de càlcul amb macros d'Excel</comment>
+ <comment xml:lang="cs">Sešit Excel s podporou maker</comment>
+ <comment xml:lang="de">Excel-Tabelle mit aktivierten Makros</comment>
+ <comment xml:lang="es">Hoja de cálculo con macros activados de Excel</comment>
+ <comment xml:lang="fr">feuille de calcul Excel avec macros</comment>
+ <comment xml:lang="gl">folla de cálculo de Excel con macros activadas</comment>
+ <comment xml:lang="he">גיליון נתונים עם תכונות מקרו פעילות של Excel</comment>
+ <comment xml:lang="hu">Excel makrókat tartalmazó táblázat</comment>
+ <comment xml:lang="id">Lembar kerja Excel dengan makro</comment>
+ <comment xml:lang="it">Foglio di calcolo Excel con macro abilitate</comment>
+ <comment xml:lang="ja">Excel マクロ有効スプレッドシート</comment>
+ <comment xml:lang="kk">макростары іске қосылған Excel кестесі</comment>
+ <comment xml:lang="ko">엑셀 매크로 사용 스프레드시트</comment>
+ <comment xml:lang="lv">Excel izklājlapa ar makrosiem</comment>
+ <comment xml:lang="pl">Arkusz z włączonymi makrami Excel</comment>
+ <comment xml:lang="ru">электронная таблица Excel с включёнными макросами</comment>
+ <comment xml:lang="sl">Preglednica Excel z omogočenimi makri</comment>
+ <comment xml:lang="uk">електронна таблиця Excel з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">Excel 巨集啟用試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.xlsm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-excel.template.macroEnabled.12">
+ <comment>Excel macro-enabled spreadsheet template</comment>
+ <comment xml:lang="bg">Шаблон за таблици — Excel, с макроси</comment>
+ <comment xml:lang="ca">plantilla de full de càlcul amb macros d'Excel</comment>
+ <comment xml:lang="cs">Šablona sešitu Excel s podporou maker</comment>
+ <comment xml:lang="de">Excel-Tabellenvorlage mit aktivierten Makros</comment>
+ <comment xml:lang="es">Plantilla de hoja de cálculo con macros activados de Excel</comment>
+ <comment xml:lang="fr">modèle de feuille de calcul Excel avec macros</comment>
+ <comment xml:lang="gl">modelo de folla de cálculo de Excel con macros activadas</comment>
+ <comment xml:lang="he">תבנית של גיליון נתונים עם תכונות מקרו פעילות של Excel</comment>
+ <comment xml:lang="hu">Excel makrókat tartalmazó táblázatsablon</comment>
+ <comment xml:lang="id">Templat lembar kerja Excel dengan makro</comment>
+ <comment xml:lang="it">Modello foglio di calcolo Excel con macro abilitate</comment>
+ <comment xml:lang="ja">Excel マクロ有効スプレッドシートテンプレート</comment>
+ <comment xml:lang="kk">макростары іске қосылған Excel кестесінің үлгісі</comment>
+ <comment xml:lang="ko">엑셀 매크로 사용 스프레드시트 서식</comment>
+ <comment xml:lang="lv">Excel izklājlapas ar makrosiem veidne</comment>
+ <comment xml:lang="pl">Szablon arkusza z włączonymi makrami Excel</comment>
+ <comment xml:lang="ru">шаблон электронной таблицы Excel с включёнными макросами</comment>
+ <comment xml:lang="sl">Predloga preglednice Excel z omogočenimi makri</comment>
+ <comment xml:lang="uk">шаблон електронної таблиці Excel з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">Excel 巨集啟用試算表範本</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.xltm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.template"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-powerpoint">
+ <comment>PowerPoint presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي PowerPoint</comment>
+ <comment xml:lang="be@latin">Prezentacyja PowerPoint</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint</comment>
+ <comment xml:lang="ca">presentació de PowerPoint</comment>
+ <comment xml:lang="cs">Prezentace PowerPoint</comment>
+ <comment xml:lang="da">PowerPoint-præsentation</comment>
+ <comment xml:lang="de">PowerPoint-Präsentation</comment>
+ <comment xml:lang="en_GB">PowerPoint presentation</comment>
+ <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
+ <comment xml:lang="es">presentación de PowerPoint</comment>
+ <comment xml:lang="eu">PowerPoint aurkezpena</comment>
+ <comment xml:lang="fi">PowerPoint-esitys</comment>
+ <comment xml:lang="fo">PowerPoint framløga</comment>
+ <comment xml:lang="fr">présentation PowerPoint</comment>
+ <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
+ <comment xml:lang="gl">presentación de PowerPoint</comment>
+ <comment xml:lang="he">מצגת PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint prezentáció</comment>
+ <comment xml:lang="id">Presentasi PowerPoint</comment>
+ <comment xml:lang="it">Presentazione PowerPoint</comment>
+ <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
+ <comment xml:lang="kk">PowerPoint презентациясы</comment>
+ <comment xml:lang="ko">파워포인트 프리젠테이션</comment>
+ <comment xml:lang="lt">PowerPoint pateiktis</comment>
+ <comment xml:lang="lv">PowerPoint prezentācija</comment>
+ <comment xml:lang="nb">PowerPoint-presentasjon</comment>
+ <comment xml:lang="nl">PowerPoint-presentatie</comment>
+ <comment xml:lang="nn">PowerPoint-presentasjon</comment>
+ <comment xml:lang="pl">Prezentacja PowerPoint</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint</comment>
+ <comment xml:lang="ru">презентация PowerPoint</comment>
+ <comment xml:lang="sk">Prezentácia PowerPoint</comment>
+ <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
+ <comment xml:lang="sq">Prezantim PowerPoint</comment>
+ <comment xml:lang="sv">PowerPoint-presentation</comment>
+ <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="vi">Trình diễn PowerPoint</comment>
+ <comment xml:lang="zh_CN">Microsoft PowerPoint 演示文稿</comment>
+ <comment xml:lang="zh_TW">PowerPoint 簡報</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.ppz"/>
+ <glob pattern="*.ppt"/>
+ <glob pattern="*.pps"/>
+ <glob pattern="*.pot"/>
+ <alias type="application/powerpoint"/>
+ <alias type="application/mspowerpoint"/>
+ <alias type="application/x-mspowerpoint"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-powerpoint.addin.macroEnabled.12">
+ <comment>PowerPoint add-in</comment>
+ <comment xml:lang="bg">Приставка — PowerPoint</comment>
+ <comment xml:lang="ca">complement de </comment>
+ <comment xml:lang="cs">Doplněk PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint Add-in</comment>
+ <comment xml:lang="es">Complemento de PowerPoint</comment>
+ <comment xml:lang="fr">complément PowerPoint</comment>
+ <comment xml:lang="gl">complemento de PowerPoint</comment>
+ <comment xml:lang="he">תוסף של PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint bővítmény</comment>
+ <comment xml:lang="id">Add-in PowerPoint</comment>
+ <comment xml:lang="it">Add-in PowerPoint</comment>
+ <comment xml:lang="ja">PowerPoint アドイン</comment>
+ <comment xml:lang="kk">PowerPoint қосымшасы</comment>
+ <comment xml:lang="ko">파워포인트 기능 추가</comment>
+ <comment xml:lang="lv">PowerPoint pievienojumprogramma</comment>
+ <comment xml:lang="pl">Dodatek PowerPoint</comment>
+ <comment xml:lang="ru">дополнение PowerPoint</comment>
+ <comment xml:lang="sl">Vstavek PowerPoint</comment>
+ <comment xml:lang="uk">додаток PowerPoint</comment>
+ <comment xml:lang="zh_TW">PowerPoint 增益集</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.ppam"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-powerpoint.presentation.macroEnabled.12">
+ <comment>PowerPoint macro-enabled presentation</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint, с макроси</comment>
+ <comment xml:lang="ca">presentació amb macros</comment>
+ <comment xml:lang="cs">Prezentace PowerPoint s podporou maker</comment>
+ <comment xml:lang="de">PowerPoint-Präsentation mit aktivierten Makros</comment>
+ <comment xml:lang="es">Presentación con macros activadas de PowerPoint</comment>
+ <comment xml:lang="fr">présentation PowerPoint avec macros</comment>
+ <comment xml:lang="gl">presentación con macros activadas de PowerPoint</comment>
+ <comment xml:lang="he">מצגת של PowerPoint בעלת תכונות מקרו פעילות</comment>
+ <comment xml:lang="hu">PowerPoint makrókat tartalmazó bemutató</comment>
+ <comment xml:lang="id">Presentasi PowerPoint dengan makro</comment>
+ <comment xml:lang="it">Presentazione PowerPoint con macro abilitate</comment>
+ <comment xml:lang="ja">PowerPoint マクロ有効プレゼンテーション</comment>
+ <comment xml:lang="kk">макростары іске қосылған PowerPoint презентациясы</comment>
+ <comment xml:lang="ko">파워포인트 매크로 사용 프리젠테이션</comment>
+ <comment xml:lang="lv">PowerPoint prezentācija ar makrosiem</comment>
+ <comment xml:lang="pl">Prezentacja z włączonymi makrami PowerPoint</comment>
+ <comment xml:lang="ru">презентация PowerPoint с включёнными макросами</comment>
+ <comment xml:lang="sl">Predstavitev PowerPoint z omogočenimi makri</comment>
+ <comment xml:lang="uk">презентація PowerPoint з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">PowerPoint 巨集啟用簡報</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.pptm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.presentation"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-powerpoint.slide.macroEnabled.12">
+ <comment>PowerPoint macro-enabled slide</comment>
+ <comment xml:lang="bg">Кадър — PowerPoint, с макроси</comment>
+ <comment xml:lang="ca">dispositiva amb macros</comment>
+ <comment xml:lang="cs">Snímek PowerPoint s podporou maker</comment>
+ <comment xml:lang="de">PowerPoint-Folie mit aktivierten Makros</comment>
+ <comment xml:lang="es">Diapositiva con macros activadas de PowerPoint</comment>
+ <comment xml:lang="fr">diapositive PowerPoint avec macros</comment>
+ <comment xml:lang="gl">Diapositiva con macros activadas de Powerpoint</comment>
+ <comment xml:lang="he">שקופית של PowerPoint בעלת תכונות מקרו פעילות</comment>
+ <comment xml:lang="hu">PowerPoint makrókat tartalmazó dia</comment>
+ <comment xml:lang="id">Slide PowerPoint dengan makro</comment>
+ <comment xml:lang="it">Diapositiva PowerPoint con macro abilitate</comment>
+ <comment xml:lang="ja">PowerPoint マクロ有効スライド</comment>
+ <comment xml:lang="kk">макростары іске қосылған PowerPoint слайды</comment>
+ <comment xml:lang="ko">파워포인트 매크로 사용 슬라이드</comment>
+ <comment xml:lang="lv">PowerPoint slaids ar makrosiem</comment>
+ <comment xml:lang="pl">Slajd z włączonymi makrami PowerPoint</comment>
+ <comment xml:lang="ru">слайд PowerPoint с включёнными макросами</comment>
+ <comment xml:lang="sl">Prosojnica PowerPoint z omogočenimi makri</comment>
+ <comment xml:lang="uk">слайд PowerPoint з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">PowerPoint 巨集啟用投影片</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.sldm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.slide"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-powerpoint.slideshow.macroEnabled.12">
+ <comment>PowerPoint macro-enabled presentation</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint, с макроси</comment>
+ <comment xml:lang="ca">presentació amb macros</comment>
+ <comment xml:lang="cs">Prezentace PowerPoint s podporou maker</comment>
+ <comment xml:lang="de">PowerPoint-Präsentation mit aktivierten Makros</comment>
+ <comment xml:lang="es">Presentación con macros activadas de PowerPoint</comment>
+ <comment xml:lang="fr">présentation PowerPoint avec macros</comment>
+ <comment xml:lang="gl">presentación con macros activadas de PowerPoint</comment>
+ <comment xml:lang="he">מצגת של PowerPoint בעלת תכונות מקרו פעילות</comment>
+ <comment xml:lang="hu">PowerPoint makrókat tartalmazó bemutató</comment>
+ <comment xml:lang="id">Presentasi PowerPoint dengan makro</comment>
+ <comment xml:lang="it">Presentazione PowerPoint con macro abilitate</comment>
+ <comment xml:lang="ja">PowerPoint マクロ有効プレゼンテーション</comment>
+ <comment xml:lang="kk">макростары іске қосылған PowerPoint презентациясы</comment>
+ <comment xml:lang="ko">파워포인트 매크로 사용 프리젠테이션</comment>
+ <comment xml:lang="lv">PowerPoint prezentācija ar makrosiem</comment>
+ <comment xml:lang="pl">Prezentacja z włączonymi makrami PowerPoint</comment>
+ <comment xml:lang="ru">презентация PowerPoint с включёнными макросами</comment>
+ <comment xml:lang="sl">Predstavitev PowerPoint z omogočenimi makri</comment>
+ <comment xml:lang="uk">презентація PowerPoint з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">PowerPoint 巨集啟用簡報</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.ppsm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.slideshow"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-powerpoint.template.macroEnabled.12">
+ <comment>PowerPoint macro-enabled presentation template</comment>
+ <comment xml:lang="bg">Шаблон за презентации — PowerPoint, с макроси</comment>
+ <comment xml:lang="ca">plantilla de presentació amb macros</comment>
+ <comment xml:lang="cs">Šablona prezentace PowerPoint s podporou maker</comment>
+ <comment xml:lang="de">PowerPoint-Präsentationsvorlage mit aktivierten Makros</comment>
+ <comment xml:lang="es">Plantilla de presentación con macros activadas de PowerPoint</comment>
+ <comment xml:lang="fr">modèle de présentation PowerPoint avec macros</comment>
+ <comment xml:lang="gl">modelo de presentación con macros activadas de PowerPoint</comment>
+ <comment xml:lang="he">תבנית של מצגת של PowerPoint בעלת תכונות מקרו פעילות</comment>
+ <comment xml:lang="hu">PowerPoint makrókat tartalmazó bemutatósablon</comment>
+ <comment xml:lang="id">Templat presentasi PowerPoint dengan makro</comment>
+ <comment xml:lang="it">Modello presentazione PowerPoint con macro abilitate</comment>
+ <comment xml:lang="ja">PowerPoint マクロ有効プレゼンテーションテンプレート</comment>
+ <comment xml:lang="kk">макростары іске қосылған PowerPoint презентациясының үлгісі</comment>
+ <comment xml:lang="ko">파워포인트 매크로 사용 프리젠테이션 서식</comment>
+ <comment xml:lang="lv">PowerPoint prezentācijas ar makrosiem veidne</comment>
+ <comment xml:lang="pl">Szablon prezentacji z włączonymi makrami PowerPoint</comment>
+ <comment xml:lang="ru">шаблон презентации PowerPoint с включёнными макросами</comment>
+ <comment xml:lang="sl">Predloga predstavitve PowerPoint z omogočenimi makri</comment>
+ <comment xml:lang="uk">шаблон презентації PowerPoint з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">PowerPoint 巨集啟用簡報範本</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.potm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.template"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-word.document.macroEnabled.12">
+ <comment>Word macro-enabled document</comment>
+ <comment xml:lang="bg">Документ — Word, с макроси</comment>
+ <comment xml:lang="ca">document amb macros de Word</comment>
+ <comment xml:lang="cs">Dokument Word s podporou maker</comment>
+ <comment xml:lang="de">Word-Dokument mit aktivierten Makros</comment>
+ <comment xml:lang="es">Documento con macros activadas de Word</comment>
+ <comment xml:lang="fr">document Word avec macros</comment>
+ <comment xml:lang="gl">documento con macros activadas de Word</comment>
+ <comment xml:lang="he">מסמך של Word בעל תכונות מקרו פעילות</comment>
+ <comment xml:lang="hu">Word makrókat tartalmazó dokumentum</comment>
+ <comment xml:lang="id">Dokumen Word dengan makro</comment>
+ <comment xml:lang="it">Documento Word con macro abilitate</comment>
+ <comment xml:lang="ja">Word マクロ有効文書</comment>
+ <comment xml:lang="kk">макростары іске қосылған Word құжаты</comment>
+ <comment xml:lang="ko">워드 매크로 사용 문서</comment>
+ <comment xml:lang="lv">Word dokuments ar makrosiem</comment>
+ <comment xml:lang="pl">Dokument z włączonymi makrami Word</comment>
+ <comment xml:lang="ru">документ Word с включёнными макросами</comment>
+ <comment xml:lang="sl">Dokument Word z omogočenimi makri</comment>
+ <comment xml:lang="uk">документ Word з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">Word 巨集啟用文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.docm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.wordprocessingml.document"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-word.template.macroEnabled.12">
+ <comment>Word macro-enabled document template</comment>
+ <comment xml:lang="bg">Шаблон за документи — Word, с макроси</comment>
+ <comment xml:lang="ca">plantilla de document amb macros de Word</comment>
+ <comment xml:lang="cs">Šablona dokumentu Word s podporou maker</comment>
+ <comment xml:lang="de">Word-Dokumentvorlage mit aktivierten Makros</comment>
+ <comment xml:lang="es">Plantilla de documento con macros activadas de Word</comment>
+ <comment xml:lang="fr">modèle de document Word avec macros</comment>
+ <comment xml:lang="gl">Plantilla de documento con macros activadas de Word</comment>
+ <comment xml:lang="he">תבנית של מסמך של Word בעל תכונות מקרו פעילות</comment>
+ <comment xml:lang="hu">Word makrókat tartalmazó dokumentumsablon</comment>
+ <comment xml:lang="id">Templat dokumen Word dengan makro</comment>
+ <comment xml:lang="it">Modello documento Word con macro abilitate</comment>
+ <comment xml:lang="ja">Word マクロ有効文書テンプレート</comment>
+ <comment xml:lang="kk">макростары іске қосылған Word құжатының үлгісі</comment>
+ <comment xml:lang="ko">워드 매크로 사용 문서 서식</comment>
+ <comment xml:lang="lv">Word dokumenta ar makrosiem veidne</comment>
+ <comment xml:lang="pl">Szablon dokumentu z włączonymi makrami Word</comment>
+ <comment xml:lang="ru">шаблон документа Word с включёнными макросами</comment>
+ <comment xml:lang="sl">Predloga dokumenta Word z omogočenimi makri</comment>
+ <comment xml:lang="uk">шаблон документа Word з увімкненими макросами</comment>
+ <comment xml:lang="zh_TW">Word 巨集啟用文件範本</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.dotm"/>
+ <sub-class-of type="application/vnd.openxmlformats-officedocument.wordprocessingml.template"/>
+ </mime-type>
+ <mime-type type="application/oxps">
+ <comment>XPS document</comment>
+ <comment xml:lang="ar">مستند XPS</comment>
+ <comment xml:lang="be@latin">Dakument XPS</comment>
+ <comment xml:lang="bg">Документ — XPS</comment>
+ <comment xml:lang="ca">document XPS</comment>
+ <comment xml:lang="cs">Dokument XPS</comment>
+ <comment xml:lang="da">XPS-dokument</comment>
+ <comment xml:lang="de">XPS-Dokument</comment>
+ <comment xml:lang="eo">XPS-dokumento</comment>
+ <comment xml:lang="es">documento XPS</comment>
+ <comment xml:lang="eu">XPS dokumentua</comment>
+ <comment xml:lang="fi">XPS-asiakirja</comment>
+ <comment xml:lang="fo">XPS skjal</comment>
+ <comment xml:lang="fr">document XPS</comment>
+ <comment xml:lang="ga">cáipéis XPS</comment>
+ <comment xml:lang="gl">documento XPS</comment>
+ <comment xml:lang="he">מסמך XPS</comment>
+ <comment xml:lang="hu">XPS dokumentum</comment>
+ <comment xml:lang="id">Dokumen XPS</comment>
+ <comment xml:lang="it">Documento XPS</comment>
+ <comment xml:lang="ja">XPS ドキュメント</comment>
+ <comment xml:lang="kk">XPS құжаты</comment>
+ <comment xml:lang="ko">XPS 문서</comment>
+ <comment xml:lang="lt">XPS dokumentas</comment>
+ <comment xml:lang="lv">XPS dokuments</comment>
+ <comment xml:lang="nb">XPS-dokument</comment>
+ <comment xml:lang="nl">XPS-document</comment>
+ <comment xml:lang="nn">XPS-dokument</comment>
+ <comment xml:lang="pl">Dokument XPS</comment>
+ <comment xml:lang="pt_BR">Documento XPS</comment>
+ <comment xml:lang="ro">Document XPS</comment>
+ <comment xml:lang="ru">документ XPS</comment>
+ <comment xml:lang="sk">Dokument XPS</comment>
+ <comment xml:lang="sl">Dokument XPS</comment>
+ <comment xml:lang="sq">Dokument XPS</comment>
+ <comment xml:lang="sv">XPS-dokument</comment>
+ <comment xml:lang="uk">документ XPS</comment>
+ <comment xml:lang="vi">Tài liệu XPS</comment>
+ <comment xml:lang="zh_CN">XPS 文档</comment>
+ <comment xml:lang="zh_TW">XPS 文件</comment>
+ <acronym>XPS</acronym>
+ <expanded-acronym>Open XML Paper Specification</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.oxps"/>
+ <glob pattern="*.xps"/>
+ <alias type="application/vnd.ms-xpsdocument"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-works">
+ <comment>Microsoft Works document</comment>
+ <comment xml:lang="ar">مستند Microsoft Works</comment>
+ <comment xml:lang="be@latin">Dakument Microsoft Works</comment>
+ <comment xml:lang="bg">Документ — Microsoft Works</comment>
+ <comment xml:lang="ca">document Works de Microsoft</comment>
+ <comment xml:lang="cs">Dokument Microsoft Works</comment>
+ <comment xml:lang="da">Microsoft Works-dokument</comment>
+ <comment xml:lang="de">Microsoft-Works-Dokument</comment>
+ <comment xml:lang="es">documento de Microsoft Works</comment>
+ <comment xml:lang="eu">Microsoft Works dokumentua</comment>
+ <comment xml:lang="fi">Microsoft Works -asiakirja</comment>
+ <comment xml:lang="fo">Microsoft Works skjal</comment>
+ <comment xml:lang="fr">document Microsoft Works</comment>
+ <comment xml:lang="ga">cáipéis Microsoft Works</comment>
+ <comment xml:lang="gl">documento de Microsoft Works</comment>
+ <comment xml:lang="he">מסמך Microsoft Works</comment>
+ <comment xml:lang="hu">Microsoft Works dokumentum</comment>
+ <comment xml:lang="id">Dokumen Microsoft Works</comment>
+ <comment xml:lang="it">Documento Microsoft Works</comment>
+ <comment xml:lang="ja">Microsoft Works ドキュメント</comment>
+ <comment xml:lang="kk">Microsoft Works құжаты</comment>
+ <comment xml:lang="ko">마이크로소프트 웍스 문서</comment>
+ <comment xml:lang="lt">Microsoft Works dokumentas</comment>
+ <comment xml:lang="lv">Microsoft Works dokuments</comment>
+ <comment xml:lang="nb">Microsoft Works-dokument</comment>
+ <comment xml:lang="nl">Microsoft Works-document</comment>
+ <comment xml:lang="nn">Microsoft Works-dokument</comment>
+ <comment xml:lang="pl">Dokument Microsoft Works</comment>
+ <comment xml:lang="pt_BR">Documento do Microsoft Works</comment>
+ <comment xml:lang="ro">Document Microsoft Works</comment>
+ <comment xml:lang="ru">документ Microsoft Works</comment>
+ <comment xml:lang="sk">Dokument Microsoft Works</comment>
+ <comment xml:lang="sl">Dokument Microsoft Works</comment>
+ <comment xml:lang="sq">Dokument Microsoft Works</comment>
+ <comment xml:lang="sv">Microsoft Works-dokument</comment>
+ <comment xml:lang="uk">документ Microsoft Works</comment>
+ <comment xml:lang="vi">Tài liệu Microsoft Works</comment>
+ <comment xml:lang="zh_CN">Microsoft Works 文档</comment>
+ <comment xml:lang="zh_TW">微軟 Works 文件</comment>
+ <sub-class-of type="application/x-ole-storage"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.wcm"/>
+ <glob pattern="*.wdb"/>
+ <glob pattern="*.wks"/>
+ <glob pattern="*.wps"/>
+ </mime-type>
+ <mime-type type="application/vnd.visio">
+ <comment>Microsoft Visio document</comment>
+ <sub-class-of type="application/x-ole-storage"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.vsd"/>
+ <glob pattern="*.vst"/>
+ <glob pattern="*.vsw"/>
+ <glob pattern="*.vss"/>
+ </mime-type>
+ <mime-type type="application/msword">
+ <comment>Word document</comment>
+ <comment xml:lang="ar">مستند Word</comment>
+ <comment xml:lang="be@latin">Dakument Word</comment>
+ <comment xml:lang="bg">Документ — Word</comment>
+ <comment xml:lang="ca">document de Word</comment>
+ <comment xml:lang="cs">Dokument Word</comment>
+ <comment xml:lang="da">Worddokument</comment>
+ <comment xml:lang="de">Word-Dokument</comment>
+ <comment xml:lang="en_GB">Word document</comment>
+ <comment xml:lang="eo">Word-dokumento</comment>
+ <comment xml:lang="es">documento de Word</comment>
+ <comment xml:lang="eu">Word dokumentua</comment>
+ <comment xml:lang="fi">Word-asiakirja</comment>
+ <comment xml:lang="fo">Word skjal</comment>
+ <comment xml:lang="fr">document Word</comment>
+ <comment xml:lang="ga">cáipéis Word</comment>
+ <comment xml:lang="gl">documento de Word</comment>
+ <comment xml:lang="he">מסמך Word</comment>
+ <comment xml:lang="hu">Word dokumentum</comment>
+ <comment xml:lang="id">Dokumen Word</comment>
+ <comment xml:lang="it">Documento Word</comment>
+ <comment xml:lang="ja">Word ドキュメント</comment>
+ <comment xml:lang="kk">Word құжаты</comment>
+ <comment xml:lang="ko">워드 문서</comment>
+ <comment xml:lang="lt">Word dokumentas</comment>
+ <comment xml:lang="lv">Word dokuments</comment>
+ <comment xml:lang="nb">Word-dokument</comment>
+ <comment xml:lang="nl">Word-document</comment>
+ <comment xml:lang="nn">Word-dokument</comment>
+ <comment xml:lang="pl">Dokument Word</comment>
+ <comment xml:lang="pt_BR">Documento do Word</comment>
+ <comment xml:lang="ro">Document Word</comment>
+ <comment xml:lang="ru">документ Word</comment>
+ <comment xml:lang="sk">Dokument Word</comment>
+ <comment xml:lang="sl">Dokument Word</comment>
+ <comment xml:lang="sq">Dokument Word</comment>
+ <comment xml:lang="sv">Word-dokument</comment>
+ <comment xml:lang="uk">документ Word</comment>
+ <comment xml:lang="vi">Tài liệu Word</comment>
+ <comment xml:lang="zh_CN">Microsoft Word 文档</comment>
+ <comment xml:lang="zh_TW">Word 文件</comment>
+ <sub-class-of type="application/x-ole-storage"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="60">
+ <match value="\x31\xbe\x00\x00" type="string" offset="0"/>
+ <match value="PO^Q`" type="string" offset="0"/>
+ <match value="\376\067\0\043" type="string" offset="0"/>
+ <match value="\333\245-\0\0\0" type="string" offset="0"/>
+ <match value="MSWordDoc" type="string" offset="2112"/>
+ <match value="MSWordDoc" type="string" offset="2108"/>
+ <match value="Microsoft Word document data" type="string" offset="2112"/>
+ <match value="bjbj" type="string" offset="546"/>
+ <match value="jbjb" type="string" offset="546"/>
+ </magic>
+ <glob pattern="*.doc"/>
+ <alias type="application/vnd.ms-word"/>
+ <alias type="application/x-msword"/>
+ </mime-type>
+ <mime-type type="application/msword-template">
+ <comment>Word template</comment>
+ <comment xml:lang="ar">قالب Word</comment>
+ <comment xml:lang="be@latin">Šablon Word</comment>
+ <comment xml:lang="bg">Шаблон за документи — Word</comment>
+ <comment xml:lang="ca">plantilla de Word</comment>
+ <comment xml:lang="cs">Šablona Word</comment>
+ <comment xml:lang="da">Wordskabelon</comment>
+ <comment xml:lang="de">Word-Vorlage</comment>
+ <comment xml:lang="eo">Word-ŝablono</comment>
+ <comment xml:lang="es">plantilla de Word</comment>
+ <comment xml:lang="eu">Word txantiloia</comment>
+ <comment xml:lang="fi">Word-malli</comment>
+ <comment xml:lang="fo">Word formur</comment>
+ <comment xml:lang="fr">modèle Word</comment>
+ <comment xml:lang="ga">teimpléad Word</comment>
+ <comment xml:lang="gl">Plantilla de Word</comment>
+ <comment xml:lang="he">תבנית Word</comment>
+ <comment xml:lang="hu">Word sablon</comment>
+ <comment xml:lang="id">Templat Word</comment>
+ <comment xml:lang="it">Modello Word</comment>
+ <comment xml:lang="ja">Word テンプレート</comment>
+ <comment xml:lang="kk">Word үлгісі</comment>
+ <comment xml:lang="ko">워드 서식</comment>
+ <comment xml:lang="lt">Word šablonas</comment>
+ <comment xml:lang="lv">Word veidne</comment>
+ <comment xml:lang="nb">Word-mal</comment>
+ <comment xml:lang="nl">Word-sjabloon</comment>
+ <comment xml:lang="nn">Word-mal</comment>
+ <comment xml:lang="pl">Szablon Word</comment>
+ <comment xml:lang="pt_BR">Modelo do Word</comment>
+ <comment xml:lang="ro">Șablon Word</comment>
+ <comment xml:lang="ru">шаблон Word</comment>
+ <comment xml:lang="sk">Šablóna Word</comment>
+ <comment xml:lang="sl">Predloga dokumenta Microsoft Word</comment>
+ <comment xml:lang="sq">Model Word</comment>
+ <comment xml:lang="sv">Word-mall</comment>
+ <comment xml:lang="uk">шаблон Word</comment>
+ <comment xml:lang="vi">Mẫu Word</comment>
+ <comment xml:lang="zh_CN">Word 模板</comment>
+ <comment xml:lang="zh_TW">Word 範本</comment>
+ <sub-class-of type="application/msword"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.dot"/>
+ </mime-type>
+ <mime-type type="application/gnunet-directory">
+ <comment>GNUnet search file</comment>
+ <comment xml:lang="ar">ملف بحث GNUnet</comment>
+ <comment xml:lang="be@latin">fajł pošuku GNUnet</comment>
+ <comment xml:lang="bg">Указател за търсене — GNUnet</comment>
+ <comment xml:lang="ca">fitxer de cerca GNUnet</comment>
+ <comment xml:lang="cs">Vyhledávací soubor GNUnet</comment>
+ <comment xml:lang="da">GNunet-søgefil</comment>
+ <comment xml:lang="de">GNUnet-Suchdatei</comment>
+ <comment xml:lang="es">archivo de búsqueda GNUnet</comment>
+ <comment xml:lang="eu">GNUnet bilaketako fitxategia</comment>
+ <comment xml:lang="fi">GNUnet-hakutiedosto</comment>
+ <comment xml:lang="fo">GNUnet leitifíla</comment>
+ <comment xml:lang="fr">fichier de recherche GNUnet</comment>
+ <comment xml:lang="ga">comhad cuardaigh GNUnet</comment>
+ <comment xml:lang="gl">ficheiro de busca de GNUnet</comment>
+ <comment xml:lang="he">קובץ חיפוש של GNUnet</comment>
+ <comment xml:lang="hu">GNUnet keresési fájl</comment>
+ <comment xml:lang="id">Berkas telusur GNUnet</comment>
+ <comment xml:lang="it">File ricerca GNUnet</comment>
+ <comment xml:lang="ja">GNUnet 検索ファイル</comment>
+ <comment xml:lang="kk">GNUnet іздеу файлы</comment>
+ <comment xml:lang="ko">GNUnet 검색 파일</comment>
+ <comment xml:lang="lt">GNUnet paieškos failas</comment>
+ <comment xml:lang="lv">GNUnet meklēšanas fails</comment>
+ <comment xml:lang="nb">GNUnet søkefil</comment>
+ <comment xml:lang="nl">GNUnet-zoekbestand</comment>
+ <comment xml:lang="nn">GNUnet-søkjefil</comment>
+ <comment xml:lang="pl">Plik wyszukiwania GNUnet</comment>
+ <comment xml:lang="pt_BR">Arquivo de pesquisa do GNUnet</comment>
+ <comment xml:lang="ro">Fișier căutare GNUnet</comment>
+ <comment xml:lang="ru">файл поиска GNUnet</comment>
+ <comment xml:lang="sk">Vyhľadávací súbor GNUnet</comment>
+ <comment xml:lang="sl">Iskalna datoteka GNUnet</comment>
+ <comment xml:lang="sq">File kërkimi GNUnet</comment>
+ <comment xml:lang="sv">GNUnet-sökfil</comment>
+ <comment xml:lang="uk">файл пошуку GNUnet</comment>
+ <comment xml:lang="vi">Tập tin tìm kiếm GNUnet</comment>
+ <comment xml:lang="zh_CN">GNUnet 搜索文件</comment>
+ <comment xml:lang="zh_TW">GNUnet 搜尋檔案</comment>
+ <magic priority="50">
+ <match value="\211GND\r\n\032\n" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.gnd"/>
+ </mime-type>
+ <mime-type type="application/vnd.ms-tnef">
+ <comment>TNEF message</comment>
+ <comment xml:lang="ar">رسالة TNEF</comment>
+ <comment xml:lang="be@latin">List TNEF</comment>
+ <comment xml:lang="bg">Съобщение — TNEF</comment>
+ <comment xml:lang="ca">missatge TNEF</comment>
+ <comment xml:lang="cs">Zpráva TNEF</comment>
+ <comment xml:lang="da">TNEF-meddelelse</comment>
+ <comment xml:lang="de">TNEF-Nachricht</comment>
+ <comment xml:lang="es">mensaje TNEF</comment>
+ <comment xml:lang="eu">TNEF mezua</comment>
+ <comment xml:lang="fi">TNEF-viesti</comment>
+ <comment xml:lang="fo">TNEF boð</comment>
+ <comment xml:lang="fr">message TNEF</comment>
+ <comment xml:lang="ga">teachtaireacht TNEF</comment>
+ <comment xml:lang="gl">mensaxe TNEF</comment>
+ <comment xml:lang="he">הודעת TNEF</comment>
+ <comment xml:lang="hu">TNEF üzenet</comment>
+ <comment xml:lang="id">Pesan TNEF</comment>
+ <comment xml:lang="it">Messaggio TNEF</comment>
+ <comment xml:lang="ja">TNEF メッセージ</comment>
+ <comment xml:lang="kk">TNEF мәлімдемесі</comment>
+ <comment xml:lang="ko">TNEF 메시지</comment>
+ <comment xml:lang="lt">TNEF žinutė</comment>
+ <comment xml:lang="lv">TNEF ziņojums</comment>
+ <comment xml:lang="nb">TNEF-melding</comment>
+ <comment xml:lang="nl">TNEF-bericht</comment>
+ <comment xml:lang="nn">TNEF-melding</comment>
+ <comment xml:lang="pl">Wiadomość TNEF</comment>
+ <comment xml:lang="pt_BR">Mensagem TNEF</comment>
+ <comment xml:lang="ro">Mesaj TNEF</comment>
+ <comment xml:lang="ru">сообщение TNEF</comment>
+ <comment xml:lang="sk">Správa TNEF</comment>
+ <comment xml:lang="sl">Datoteka sporočila TNEF</comment>
+ <comment xml:lang="sq">Mesazh TNEF</comment>
+ <comment xml:lang="sv">TNEF-meddelande</comment>
+ <comment xml:lang="uk">повідомлення TNEF</comment>
+ <comment xml:lang="vi">Thông điệp TNEF</comment>
+ <comment xml:lang="zh_CN">TNEF 信件</comment>
+ <comment xml:lang="zh_TW">TNEF 訊息</comment>
+ <acronym>TNEF</acronym>
+ <expanded-acronym>Transport Neutral Encapsulation Format</expanded-acronym>
+ <magic priority="50">
+ <match value="0x223e9f78" type="little32" offset="0"/>
+ </magic>
+ <glob pattern="*.tnef"/>
+ <glob pattern="*.tnf"/>
+ <glob pattern="winmail.dat"/>
+ <alias type="application/ms-tnef"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.calc">
+ <comment>StarCalc spreadsheet</comment>
+ <comment xml:lang="ar">جدول StarCalc</comment>
+ <comment xml:lang="az">StarCalc hesab cədvəli</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš StarCalc</comment>
+ <comment xml:lang="bg">Таблица — StarCalc</comment>
+ <comment xml:lang="ca">full de càlcul de StarCalc</comment>
+ <comment xml:lang="cs">Sešit StarCalc</comment>
+ <comment xml:lang="cy">Taenlen StarCalc</comment>
+ <comment xml:lang="da">StarCalc-regneark</comment>
+ <comment xml:lang="de">StarCalc-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο StarCalc</comment>
+ <comment xml:lang="en_GB">StarCalc spreadsheet</comment>
+ <comment xml:lang="eo">StarCalc-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo de StarCalc</comment>
+ <comment xml:lang="eu">StarCalc kalkulu-orria</comment>
+ <comment xml:lang="fi">StarCalc-taulukko</comment>
+ <comment xml:lang="fo">StarCalc rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul StarCalc</comment>
+ <comment xml:lang="ga">scarbhileog StarCalc</comment>
+ <comment xml:lang="gl">folla de cálculo de StarCalc</comment>
+ <comment xml:lang="he">גליון נתונים של StarCalc</comment>
+ <comment xml:lang="hu">StarCalc-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar StarCalc</comment>
+ <comment xml:lang="it">Foglio di calcolo StarCalc</comment>
+ <comment xml:lang="ja">StarCalc スプレッドシート</comment>
+ <comment xml:lang="kk">StarCalc электрондық кестесі</comment>
+ <comment xml:lang="ko">StarCalc 스프레드시트</comment>
+ <comment xml:lang="lt">StarCalc skaičialentė</comment>
+ <comment xml:lang="lv">StarCalc izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan StarCalc</comment>
+ <comment xml:lang="nb">StarCalc-regneark</comment>
+ <comment xml:lang="nl">StarCalc-rekenblad</comment>
+ <comment xml:lang="nn">StarCalc-rekneark</comment>
+ <comment xml:lang="pl">Arkusz StarCalc</comment>
+ <comment xml:lang="pt">folha de cálculo do StarCalc</comment>
+ <comment xml:lang="pt_BR">Planilha do StarCalc</comment>
+ <comment xml:lang="ro">Foaie de calcul StarCalc</comment>
+ <comment xml:lang="ru">электронная таблица StarCalc</comment>
+ <comment xml:lang="sk">Zošit StarCalc</comment>
+ <comment xml:lang="sl">Razpredelnica StarCalc</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh StarCalc</comment>
+ <comment xml:lang="sr">StarCalc табеларни прорачун</comment>
+ <comment xml:lang="sv">StarCalc-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця StarCalc</comment>
+ <comment xml:lang="vi">Bảng tính StarCalc</comment>
+ <comment xml:lang="zh_CN">STarCalc 工作簿</comment>
+ <comment xml:lang="zh_TW">StarCalc 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.sdc"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.chart">
+ <comment>StarChart chart</comment>
+ <comment xml:lang="ar">مخطط StarChart</comment>
+ <comment xml:lang="az">StarChart cədvəli</comment>
+ <comment xml:lang="be@latin">Dyjahrama StarChart</comment>
+ <comment xml:lang="bg">Диаграма — StarChart</comment>
+ <comment xml:lang="ca">diagrama de StarChart</comment>
+ <comment xml:lang="cs">Graf StarChart</comment>
+ <comment xml:lang="cy">Siart StarChart</comment>
+ <comment xml:lang="da">StarChart-diagram</comment>
+ <comment xml:lang="de">StarChart-Diagramm</comment>
+ <comment xml:lang="el">γράφημα StarChart</comment>
+ <comment xml:lang="en_GB">StarChart chart</comment>
+ <comment xml:lang="eo">StarChart-diagramo</comment>
+ <comment xml:lang="es">gráfica de StarChart</comment>
+ <comment xml:lang="eu">StarChart diagrama</comment>
+ <comment xml:lang="fi">StarChart-kaavio</comment>
+ <comment xml:lang="fo">StarChart strikumynd</comment>
+ <comment xml:lang="fr">graphique StarChart</comment>
+ <comment xml:lang="ga">cairt StarChart</comment>
+ <comment xml:lang="gl">gráfica de StarChart</comment>
+ <comment xml:lang="he">טבלה של StarChart</comment>
+ <comment xml:lang="hu">StarChart-grafikon</comment>
+ <comment xml:lang="id">Bagan StarChart</comment>
+ <comment xml:lang="it">Grafico StarChart</comment>
+ <comment xml:lang="ja">StarChart チャート</comment>
+ <comment xml:lang="kk">StarChart диаграммасы</comment>
+ <comment xml:lang="ko">StarCalc 표</comment>
+ <comment xml:lang="lt">StarChart diagrama</comment>
+ <comment xml:lang="lv">StarChart diagramma</comment>
+ <comment xml:lang="ms">Carta StarChart</comment>
+ <comment xml:lang="nb">StarChart graf</comment>
+ <comment xml:lang="nl">StarChart-kaart</comment>
+ <comment xml:lang="nn">StarChart-graf</comment>
+ <comment xml:lang="pl">Wykres StarChart</comment>
+ <comment xml:lang="pt">gráfico do StarChart</comment>
+ <comment xml:lang="pt_BR">Gráfico StarChart</comment>
+ <comment xml:lang="ro">Diagramă StarChart</comment>
+ <comment xml:lang="ru">диаграмма StarChart</comment>
+ <comment xml:lang="sk">Graf StarChart</comment>
+ <comment xml:lang="sl">Datoteka grafikona StarChart</comment>
+ <comment xml:lang="sq">Grafik StarChart</comment>
+ <comment xml:lang="sr">StarChart графикон</comment>
+ <comment xml:lang="sv">StarChart-diagram</comment>
+ <comment xml:lang="uk">діаграма StarChart</comment>
+ <comment xml:lang="vi">Đồ thị StarChart</comment>
+ <comment xml:lang="zh_CN">STarChart 图表</comment>
+ <comment xml:lang="zh_TW">StarChart 圖表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.sds"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.draw">
+ <comment>StarDraw drawing</comment>
+ <comment xml:lang="ar">تصميم StarDraw</comment>
+ <comment xml:lang="az">StarDraw çəkimi</comment>
+ <comment xml:lang="be@latin">Rysunak StarDraw</comment>
+ <comment xml:lang="bg">Чертеж — StarDraw</comment>
+ <comment xml:lang="ca">dibuix de StarDraw</comment>
+ <comment xml:lang="cs">Kresba StarDraw</comment>
+ <comment xml:lang="cy">Darlun StarDraw</comment>
+ <comment xml:lang="da">StarDraw-tegning</comment>
+ <comment xml:lang="de">StarDraw-Zeichnung</comment>
+ <comment xml:lang="el">σχέδιο StarDraw</comment>
+ <comment xml:lang="en_GB">StarDraw drawing</comment>
+ <comment xml:lang="eo">StarDraw-grafikaĵo</comment>
+ <comment xml:lang="es">dibujo de StarDraw</comment>
+ <comment xml:lang="eu">StarDraw marrazkia</comment>
+ <comment xml:lang="fi">StarDraw-piirros</comment>
+ <comment xml:lang="fo">StarDraw tekning</comment>
+ <comment xml:lang="fr">dessin StarDraw</comment>
+ <comment xml:lang="ga">líníocht StarDraw</comment>
+ <comment xml:lang="gl">debuxo de StarDraw</comment>
+ <comment xml:lang="he">ציור של StarDrawing</comment>
+ <comment xml:lang="hu">StarDraw-rajz</comment>
+ <comment xml:lang="id">Gambar StarDraw</comment>
+ <comment xml:lang="it">Disegno StarDraw</comment>
+ <comment xml:lang="ja">StarDraw ドロー</comment>
+ <comment xml:lang="kk">StarDraw суреті</comment>
+ <comment xml:lang="ko">StarCalc 드로잉</comment>
+ <comment xml:lang="lt">StarDraw piešinys</comment>
+ <comment xml:lang="lv">StarDraw zīmējums</comment>
+ <comment xml:lang="ms">Lukisan StarDraw</comment>
+ <comment xml:lang="nb">StarDraw tegning</comment>
+ <comment xml:lang="nl">StarDraw-tekening</comment>
+ <comment xml:lang="nn">StarDraw-teikning</comment>
+ <comment xml:lang="pl">Rysunek StarDraw</comment>
+ <comment xml:lang="pt">desenho do StarDraw</comment>
+ <comment xml:lang="pt_BR">Desenho do StarDraw</comment>
+ <comment xml:lang="ro">Desen StarDraw</comment>
+ <comment xml:lang="ru">изображение StarDraw</comment>
+ <comment xml:lang="sk">Kresba StarDraw</comment>
+ <comment xml:lang="sl">Datoteka risbe StarDraw</comment>
+ <comment xml:lang="sq">Vizatim StarDraw</comment>
+ <comment xml:lang="sr">StarDraw drawing</comment>
+ <comment xml:lang="sv">StarDraw-teckning</comment>
+ <comment xml:lang="uk">малюнок StarDraw</comment>
+ <comment xml:lang="vi">Bản vẽ StarDraw</comment>
+ <comment xml:lang="zh_CN">STarDraw 绘图</comment>
+ <comment xml:lang="zh_TW">StarDraw 繪圖</comment>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.sda"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.impress">
+ <comment>StarImpress presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي StarImpress</comment>
+ <comment xml:lang="az">StarImpress təqdimatı</comment>
+ <comment xml:lang="be@latin">Prezentacyja StarImpress</comment>
+ <comment xml:lang="bg">Презентация — StarImpress</comment>
+ <comment xml:lang="ca">presentació de StarImpress</comment>
+ <comment xml:lang="cs">Prezentace StarImpress</comment>
+ <comment xml:lang="cy">Cyflwyniad StarImpress</comment>
+ <comment xml:lang="da">StarImpress-præsentation</comment>
+ <comment xml:lang="de">StarImpress-Präsentation</comment>
+ <comment xml:lang="el">παρουσίαση StarImpress</comment>
+ <comment xml:lang="en_GB">StarImpress presentation</comment>
+ <comment xml:lang="eo">StarImpress-prezentaĵo</comment>
+ <comment xml:lang="es">presentación de StarImpress</comment>
+ <comment xml:lang="eu">StarImpress aurkezpena</comment>
+ <comment xml:lang="fi">StarImpress-esitys</comment>
+ <comment xml:lang="fo">StarImpress framløga</comment>
+ <comment xml:lang="fr">présentation StarImpress</comment>
+ <comment xml:lang="ga">láithreoireacht StarImpress</comment>
+ <comment xml:lang="gl">presentación de StarImpress</comment>
+ <comment xml:lang="he">מצגת של StarImpress</comment>
+ <comment xml:lang="hu">StarImpress-bemutató</comment>
+ <comment xml:lang="id">Presentasi StarImpress</comment>
+ <comment xml:lang="it">Presentazione StarImpress</comment>
+ <comment xml:lang="ja">StarImpress プレゼンテーション</comment>
+ <comment xml:lang="kk">StarImpress презентациясы</comment>
+ <comment xml:lang="ko">StarImpress 프리젠테이션</comment>
+ <comment xml:lang="lt">StarImpress pateiktis</comment>
+ <comment xml:lang="lv">StarImpress prezentācija</comment>
+ <comment xml:lang="ms">Persembahan StarImpress</comment>
+ <comment xml:lang="nb">StarImpress-presentasjon</comment>
+ <comment xml:lang="nl">StarImpress-presentatie</comment>
+ <comment xml:lang="nn">StarImpress-presentasjon</comment>
+ <comment xml:lang="pl">Prezentacja StarImpress</comment>
+ <comment xml:lang="pt">apresentação do StarImpress</comment>
+ <comment xml:lang="pt_BR">Apresentação do StarImpress</comment>
+ <comment xml:lang="ro">Prezentare StarImpress</comment>
+ <comment xml:lang="ru">презентация StarImpress</comment>
+ <comment xml:lang="sk">Prezentácia StarImpress</comment>
+ <comment xml:lang="sl">Predstavitev StarImpress</comment>
+ <comment xml:lang="sq">Prezantim StarImpress</comment>
+ <comment xml:lang="sr">StarImpress презентација</comment>
+ <comment xml:lang="sv">StarImpress-presentation</comment>
+ <comment xml:lang="uk">презентація StarImpress</comment>
+ <comment xml:lang="vi">Trình diễn StarImpress</comment>
+ <comment xml:lang="zh_CN">STarImpress 演示文稿</comment>
+ <comment xml:lang="zh_TW">StarImpress 簡報檔</comment>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.sdd"/>
+ <glob pattern="*.sdp"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.mail">
+ <comment>StarMail email</comment>
+ <comment xml:lang="ar">بريد StarMail الإلكتروني</comment>
+ <comment xml:lang="be@latin">Email StarMail</comment>
+ <comment xml:lang="bg">Електронно писмо — StarMail</comment>
+ <comment xml:lang="ca">correu electrònic de StarMail</comment>
+ <comment xml:lang="cs">E-mail StarMail</comment>
+ <comment xml:lang="da">StarMail-e-brev</comment>
+ <comment xml:lang="de">StarMail-E-Mail</comment>
+ <comment xml:lang="el">ηλ. μήνυμα StarMail</comment>
+ <comment xml:lang="en_GB">StarMail email</comment>
+ <comment xml:lang="eo">StarMail-retpoŝto</comment>
+ <comment xml:lang="es">correo electrónico de StarMail</comment>
+ <comment xml:lang="eu">StarMail helb.el.</comment>
+ <comment xml:lang="fi">StarMail-sähköposti</comment>
+ <comment xml:lang="fo">StarMail t-postur</comment>
+ <comment xml:lang="fr">courriel StarMail</comment>
+ <comment xml:lang="ga">ríomhphost StarMail</comment>
+ <comment xml:lang="gl">Correo electrónico de StarMail</comment>
+ <comment xml:lang="he">דוא"ל של StarMail</comment>
+ <comment xml:lang="hu">StarMail e-mail</comment>
+ <comment xml:lang="id">Email StarMail</comment>
+ <comment xml:lang="it">Email StarMail</comment>
+ <comment xml:lang="ja">StarMail メール</comment>
+ <comment xml:lang="kk">StarMail электрондық хаты</comment>
+ <comment xml:lang="ko">StarMail 전자우편</comment>
+ <comment xml:lang="lt">StarMail el. laiškas</comment>
+ <comment xml:lang="lv">StarMail epasts</comment>
+ <comment xml:lang="ms">Emel StarMail</comment>
+ <comment xml:lang="nb">StarMail-melding</comment>
+ <comment xml:lang="nl">StarMail-e-mail</comment>
+ <comment xml:lang="nn">StarMail-fil</comment>
+ <comment xml:lang="pl">E-Mail StarMail</comment>
+ <comment xml:lang="pt">e-mail do StarMail</comment>
+ <comment xml:lang="pt_BR">E-mail do StarMail</comment>
+ <comment xml:lang="ro">Email StarEmail</comment>
+ <comment xml:lang="ru">электронное письмо StarMail</comment>
+ <comment xml:lang="sk">E-mail StarMail</comment>
+ <comment xml:lang="sl">Datoteka pošte StarMail</comment>
+ <comment xml:lang="sq">Mesazh StarMail</comment>
+ <comment xml:lang="sr">StarMail пошта</comment>
+ <comment xml:lang="sv">StarMail-e-post</comment>
+ <comment xml:lang="uk">поштове повідомлення StarMail</comment>
+ <comment xml:lang="vi">Thư điện tử StarMail</comment>
+ <comment xml:lang="zh_CN">STarMail 电子邮件</comment>
+ <comment xml:lang="zh_TW">StarMail 郵件</comment>
+ <glob pattern="*.smd"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.math">
+ <comment>StarMath formula</comment>
+ <comment xml:lang="ar">صيغة StarMath</comment>
+ <comment xml:lang="be@latin">Formuła StarMath</comment>
+ <comment xml:lang="bg">Формула — StarMath</comment>
+ <comment xml:lang="ca">fórmula de StarMath</comment>
+ <comment xml:lang="cs">Vzorec StarMath</comment>
+ <comment xml:lang="da">StarMath-formel</comment>
+ <comment xml:lang="de">StarMath-Formel</comment>
+ <comment xml:lang="el">μαθηματικός τύπος StarMath</comment>
+ <comment xml:lang="en_GB">StarMath formula</comment>
+ <comment xml:lang="eo">StarMath-formulo</comment>
+ <comment xml:lang="es">fórmula de StarMath</comment>
+ <comment xml:lang="eu">StarMath formula</comment>
+ <comment xml:lang="fi">StarMath-kaava</comment>
+ <comment xml:lang="fo">StarMath frymil</comment>
+ <comment xml:lang="fr">formule StarMath</comment>
+ <comment xml:lang="ga">foirmle StarMath</comment>
+ <comment xml:lang="gl">fórmula de StarMath</comment>
+ <comment xml:lang="he">נוסחה של StarMath</comment>
+ <comment xml:lang="hu">StarMath-képlet</comment>
+ <comment xml:lang="id">Formula StarMath</comment>
+ <comment xml:lang="it">Formula StarMath</comment>
+ <comment xml:lang="ja">StarMath 計算式</comment>
+ <comment xml:lang="kk">StarMath формуласы</comment>
+ <comment xml:lang="ko">StarMath 수식</comment>
+ <comment xml:lang="lt">StarMath formulė</comment>
+ <comment xml:lang="lv">StarMath formula</comment>
+ <comment xml:lang="ms">Formula StarMath</comment>
+ <comment xml:lang="nb">StarMath-formel</comment>
+ <comment xml:lang="nl">StarMath-formule</comment>
+ <comment xml:lang="nn">StarMath-formel</comment>
+ <comment xml:lang="pl">Formuła StarMath</comment>
+ <comment xml:lang="pt">fórmula do StarMath</comment>
+ <comment xml:lang="pt_BR">Fórmula do StarMath</comment>
+ <comment xml:lang="ro">Formulă StarMath</comment>
+ <comment xml:lang="ru">формула StarMath</comment>
+ <comment xml:lang="sk">Vzorec StarMath</comment>
+ <comment xml:lang="sl">Datoteka formule StarMath</comment>
+ <comment xml:lang="sq">Formulë StarMath</comment>
+ <comment xml:lang="sr">StarMath формула</comment>
+ <comment xml:lang="sv">StarMath-formel</comment>
+ <comment xml:lang="uk">формула StarMath</comment>
+ <comment xml:lang="vi">Công thức StarMath</comment>
+ <comment xml:lang="zh_CN">STarMath 公式</comment>
+ <comment xml:lang="zh_TW">StarMath 公式</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.smf"/>
+ </mime-type>
+ <mime-type type="application/vnd.stardivision.writer">
+ <comment>StarWriter document</comment>
+ <comment xml:lang="ar">مستند StarWriter</comment>
+ <comment xml:lang="az">StarWriter sənədi</comment>
+ <comment xml:lang="be@latin">Dakument StarWriter</comment>
+ <comment xml:lang="bg">Документ — StarWriter</comment>
+ <comment xml:lang="ca">document de StarWriter</comment>
+ <comment xml:lang="cs">Dokument StarWriter</comment>
+ <comment xml:lang="cy">Dogfen StarWriter</comment>
+ <comment xml:lang="da">StarWriter-dokument</comment>
+ <comment xml:lang="de">StarWriter-Dokument</comment>
+ <comment xml:lang="el">έγγραφο StarWriter</comment>
+ <comment xml:lang="en_GB">StarWriter document</comment>
+ <comment xml:lang="eo">StarWriter-dokumento</comment>
+ <comment xml:lang="es">documento de StarWriter</comment>
+ <comment xml:lang="eu">StarWriter dokumentua</comment>
+ <comment xml:lang="fi">StarWriter-asiakirja</comment>
+ <comment xml:lang="fo">StarWriter skjal</comment>
+ <comment xml:lang="fr">document StarWriter</comment>
+ <comment xml:lang="ga">cáipéis StarWriter</comment>
+ <comment xml:lang="gl">documento de StarWriter</comment>
+ <comment xml:lang="he">מסמך של StarWriter</comment>
+ <comment xml:lang="hu">StarWriter-dokumentum</comment>
+ <comment xml:lang="id">Dokumen StarWriter</comment>
+ <comment xml:lang="it">Documento StrarWriter</comment>
+ <comment xml:lang="ja">StarWriter ドキュメント</comment>
+ <comment xml:lang="kk">StarWriter құжаты</comment>
+ <comment xml:lang="ko">StarWriter 문서</comment>
+ <comment xml:lang="lt">StarWriter dokumentas</comment>
+ <comment xml:lang="lv">StarWriter dokuments</comment>
+ <comment xml:lang="ms">Dokumen StarWriter</comment>
+ <comment xml:lang="nb">StarWriter-dokument</comment>
+ <comment xml:lang="nl">StarWriter-document</comment>
+ <comment xml:lang="nn">StarWriter document</comment>
+ <comment xml:lang="pl">Dokument StarWriter</comment>
+ <comment xml:lang="pt">documento do StarWriter</comment>
+ <comment xml:lang="pt_BR">Documento do StarWriter</comment>
+ <comment xml:lang="ro">Document StarWriter</comment>
+ <comment xml:lang="ru">документ StarWriter</comment>
+ <comment xml:lang="sk">Dokument StarWriter</comment>
+ <comment xml:lang="sl">Dokument StarWriter</comment>
+ <comment xml:lang="sq">Dokument StarWriter</comment>
+ <comment xml:lang="sr">StarWriter документ</comment>
+ <comment xml:lang="sv">StarWriter-dokument</comment>
+ <comment xml:lang="uk">документ StarWriter</comment>
+ <comment xml:lang="vi">Tài liệu StarWriter</comment>
+ <comment xml:lang="zh_CN">STarWriter 文档</comment>
+ <comment xml:lang="zh_TW">StarWriter 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.sdw"/>
+ <glob pattern="*.vor"/>
+ <glob pattern="*.sgl"/>
+ <magic priority="90">
+ <match value="StarWriter" type="string" offset="2089"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.calc">
+ <comment>OpenOffice Calc spreadsheet</comment>
+ <comment xml:lang="ar">جدول Calc المكتب المفتوح</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš OpenOffice Calc</comment>
+ <comment xml:lang="bg">Таблица — OpenOffice Calc</comment>
+ <comment xml:lang="ca">full de càlcul d'OpenOffice Calc</comment>
+ <comment xml:lang="cs">Sešit OpenOffice Calc</comment>
+ <comment xml:lang="da">OpenOffice Calc-regneark</comment>
+ <comment xml:lang="de">OpenOffice-Calc-Tabelle</comment>
+ <comment xml:lang="es">hoja de cálculo de OpenOffice Calc</comment>
+ <comment xml:lang="eu">OpenOffice.org Calc kalkulu-orria</comment>
+ <comment xml:lang="fi">OpenOffice Calc -taulukko</comment>
+ <comment xml:lang="fo">OpenOffice Calc rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul OpenOffice Calc</comment>
+ <comment xml:lang="ga">scarbhileog OpenOffice Calc</comment>
+ <comment xml:lang="gl">folla de cálculo de OpenOffice Calc</comment>
+ <comment xml:lang="he">גליון נתונים של OpenOffice Calc</comment>
+ <comment xml:lang="hu">OpenOffice Calc táblázat</comment>
+ <comment xml:lang="id">Lembar sebar OpenOffice Calc</comment>
+ <comment xml:lang="it">Foglio di calcolo OpenOffice Calc</comment>
+ <comment xml:lang="ja">OpenOffice Calc スプレッドシート</comment>
+ <comment xml:lang="kk">OpenOffice Calc электрондық кестесі</comment>
+ <comment xml:lang="ko">OpenOffice Calc 스프레드시트</comment>
+ <comment xml:lang="lt">OpenOffice Calc skaičialentė</comment>
+ <comment xml:lang="lv">OpenOffice Calc izklājlapa</comment>
+ <comment xml:lang="nb">OpenOffice Calc-regneark</comment>
+ <comment xml:lang="nl">OpenOffice.org Calc-rekenblad</comment>
+ <comment xml:lang="nn">OpenOffice Calc-rekneark</comment>
+ <comment xml:lang="pl">Arkusz kalkulacyjny OpenOffice.org Calc</comment>
+ <comment xml:lang="pt_BR">Planilha do OpenOffice Calc</comment>
+ <comment xml:lang="ro">Foaie de calcul OpenOffice Calc</comment>
+ <comment xml:lang="ru">электронная таблица OpenOffice Calc</comment>
+ <comment xml:lang="sk">Zošit OpenOffice Calc</comment>
+ <comment xml:lang="sl">Razpredelnica OpenOffice.org Calc</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh OpenOffice Calc</comment>
+ <comment xml:lang="sv">OpenOffice Calc-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця OpenOffice Calc</comment>
+ <comment xml:lang="vi">Bảng tính Calc của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Calc 工作簿</comment>
+ <comment xml:lang="zh_TW">OpenOffice Calc 試算表</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.calc" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sxc"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.calc.template">
+ <comment>OpenOffice Calc template</comment>
+ <comment xml:lang="ar">قالب Calc المكتب المفتوح</comment>
+ <comment xml:lang="be@latin">Šablon OpenOffice Calc</comment>
+ <comment xml:lang="bg">Шаблон за таблици — OpenOffice Calc</comment>
+ <comment xml:lang="ca">plantilla d'OpenOffice Calc</comment>
+ <comment xml:lang="cs">Šablona OpenOffice Calc</comment>
+ <comment xml:lang="da">OpenOffice Calc-skabelon</comment>
+ <comment xml:lang="de">OpenOffice-Calc-Vorlage</comment>
+ <comment xml:lang="en_GB">OpenOffice Calc template</comment>
+ <comment xml:lang="es">plantilla de OpenOffice Calc</comment>
+ <comment xml:lang="eu">OpenOffice Calc txantiloia</comment>
+ <comment xml:lang="fi">OpenOffice Calc -malli</comment>
+ <comment xml:lang="fo">OpenOffice Calc formur</comment>
+ <comment xml:lang="fr">modèle OpenOffice Calc</comment>
+ <comment xml:lang="ga">teimpléad OpenOffice Calc</comment>
+ <comment xml:lang="gl">modelo de OpenOffice Calc</comment>
+ <comment xml:lang="he">תבנית של OpenOffice Calc</comment>
+ <comment xml:lang="hu">OpenOffice Calc sablon</comment>
+ <comment xml:lang="id">Templat OpenOffice Calc</comment>
+ <comment xml:lang="it">Modello OpenOffice Calc</comment>
+ <comment xml:lang="ja">OpenOffice Calc テンプレート</comment>
+ <comment xml:lang="kk">OpenOffice Calc үлгісі</comment>
+ <comment xml:lang="ko">OpenOffice Calc 스프레드시트 문서 서식</comment>
+ <comment xml:lang="lt">OpenOffice Calc šablonas</comment>
+ <comment xml:lang="lv">OpenOffice Calc veidne</comment>
+ <comment xml:lang="nb">OpenOffice Calc-mal</comment>
+ <comment xml:lang="nl">OpenOffice.org Calc-sjabloon</comment>
+ <comment xml:lang="nn">OpenOffice Calc-mal</comment>
+ <comment xml:lang="pl">Szablon arkusza OpenOffice.org Calc</comment>
+ <comment xml:lang="pt_BR">Modelo do OpenOffice Calc</comment>
+ <comment xml:lang="ro">Șablon OpenOffice Calc</comment>
+ <comment xml:lang="ru">шаблон OpenOffice Calc</comment>
+ <comment xml:lang="sk">Šablóna OpenOffice Calc</comment>
+ <comment xml:lang="sl">Predloga OpenOffice.org Calc</comment>
+ <comment xml:lang="sq">Model OpenOffice Calc</comment>
+ <comment xml:lang="sv">OpenOffice Calc-mall</comment>
+ <comment xml:lang="uk">шаблон ел.таблиці OpenOffice Calc</comment>
+ <comment xml:lang="vi">Mẫu bảng tính Calc của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Calc 工作簿模板</comment>
+ <comment xml:lang="zh_TW">OpenOffice Calc 範本</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.calc" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.stc"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.draw">
+ <comment>OpenOffice Draw drawing</comment>
+ <comment xml:lang="ar">تصميم Draw المكتب المفتوح</comment>
+ <comment xml:lang="be@latin">Rysunak OpenOffice Draw</comment>
+ <comment xml:lang="bg">Чертеж — OpenOffice Draw</comment>
+ <comment xml:lang="ca">dibuix d'OpenOffice Draw</comment>
+ <comment xml:lang="cs">Kresba OpenOffice Draw</comment>
+ <comment xml:lang="da">OpenOffice Draw-tegning</comment>
+ <comment xml:lang="de">OpenOffice-Draw-Zeichnung</comment>
+ <comment xml:lang="es">dibujo de OpenOffice Draw</comment>
+ <comment xml:lang="eu">OpenOffice.org Draw marrazkia</comment>
+ <comment xml:lang="fi">OpenOffice Draw -piirros</comment>
+ <comment xml:lang="fo">OpenOffice Draw tekning</comment>
+ <comment xml:lang="fr">dessin OpenOffice Draw</comment>
+ <comment xml:lang="ga">líníocht OpenOffice Draw</comment>
+ <comment xml:lang="gl">debuxo de OpenOffice Draw</comment>
+ <comment xml:lang="he">ציור של OpenOffice Draw</comment>
+ <comment xml:lang="hu">OpenOffice Draw rajz</comment>
+ <comment xml:lang="id">Gambar OpenOffice Draw</comment>
+ <comment xml:lang="it">Disegno OpenOffice Draw</comment>
+ <comment xml:lang="ja">OpenOffice Draw ドロー</comment>
+ <comment xml:lang="kk">OpenOffice Draw суреті</comment>
+ <comment xml:lang="ko">OpenOffice Draw 그림</comment>
+ <comment xml:lang="lt">OpenOffice Draw piešinys</comment>
+ <comment xml:lang="lv">OpenOffice Draw zīmējums</comment>
+ <comment xml:lang="nb">OpenOffice Draw-tegning</comment>
+ <comment xml:lang="nl">OpenOffice.org Draw-tekening</comment>
+ <comment xml:lang="nn">OpenOffice Draw-teikning</comment>
+ <comment xml:lang="pl">Rysunek OpenOffice.org Draw</comment>
+ <comment xml:lang="pt_BR">Desenho do OpenOffice Draw</comment>
+ <comment xml:lang="ro">Desen OpenOffice Draw</comment>
+ <comment xml:lang="ru">изображение OpenOffice Draw</comment>
+ <comment xml:lang="sk">Kresba OpenOffice Draw</comment>
+ <comment xml:lang="sl">Datoteka risbe OpenOffice.org Draw</comment>
+ <comment xml:lang="sq">Vizatim OpenOffice Draw</comment>
+ <comment xml:lang="sv">OpenOffice Draw-teckning</comment>
+ <comment xml:lang="uk">малюнок OpenOffice Draw</comment>
+ <comment xml:lang="vi">Bản vẽ Draw của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Draw 绘图</comment>
+ <comment xml:lang="zh_TW">OpenOffice Draw 繪圖</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="image-x-generic"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.draw" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sxd"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.draw.template">
+ <comment>OpenOffice Draw template</comment>
+ <comment xml:lang="ar">قالب Draw المكتب المفتوح</comment>
+ <comment xml:lang="be@latin">Šablon OpenOffice Draw</comment>
+ <comment xml:lang="bg">Шаблон за чертежи — OpenOffice Draw</comment>
+ <comment xml:lang="ca">plantilla d'OpenOffice Draw</comment>
+ <comment xml:lang="cs">Šablona OpenOffice Draw</comment>
+ <comment xml:lang="da">OpenOffice Draw-skabelon</comment>
+ <comment xml:lang="de">OpenOffice-Draw-Vorlage</comment>
+ <comment xml:lang="en_GB">OpenOffice Draw template</comment>
+ <comment xml:lang="es">plantilla de OpenOffice.org Draw</comment>
+ <comment xml:lang="eu">OpenOffice Draw txantiloia</comment>
+ <comment xml:lang="fi">OpenOffice Draw -malli</comment>
+ <comment xml:lang="fo">OpenOffice Draw formur</comment>
+ <comment xml:lang="fr">modèle OpenOffice Draw</comment>
+ <comment xml:lang="ga">teimpléad OpenOffice Draw</comment>
+ <comment xml:lang="gl">modelo de OpenOffice Draw</comment>
+ <comment xml:lang="he">תבנית של OpenOffice Draw</comment>
+ <comment xml:lang="hu">OpenOffice Draw sablon</comment>
+ <comment xml:lang="id">Templat OpenOffice Draw</comment>
+ <comment xml:lang="it">Modello OpenOffice Draw</comment>
+ <comment xml:lang="ja">OpenOffice Draw テンプレート</comment>
+ <comment xml:lang="kk">OpenOffice Draw үлгісі</comment>
+ <comment xml:lang="ko">OpenOffice Draw 그림 문서 서식</comment>
+ <comment xml:lang="lt">OpenOffice Draw šablonas</comment>
+ <comment xml:lang="lv">OpenOffice Draw veidne</comment>
+ <comment xml:lang="nb">OpenOffice Draw-mal</comment>
+ <comment xml:lang="nl">OpenOffice.org Draw-sjabloon</comment>
+ <comment xml:lang="nn">OpenOffice Draw-mal</comment>
+ <comment xml:lang="pl">Szablon rysunku OpenOffice.org Draw</comment>
+ <comment xml:lang="pt_BR">Modelo do OpenOffice Draw</comment>
+ <comment xml:lang="ro">Șablon OpenOffice Draw</comment>
+ <comment xml:lang="ru">шаблон OpenOffice Draw</comment>
+ <comment xml:lang="sk">Šablóna OpenOffice Draw</comment>
+ <comment xml:lang="sl">Predloga OpenOffice.org Draw</comment>
+ <comment xml:lang="sq">Model OpenOffice Draw</comment>
+ <comment xml:lang="sv">OpenOffice Draw-mall</comment>
+ <comment xml:lang="uk">шаблон малюнку OpenOffice Draw</comment>
+ <comment xml:lang="vi">Mẫu bản vẽ Draw của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Draw 绘图模板</comment>
+ <comment xml:lang="zh_TW">OpenOffice Draw 範本</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="image-x-generic"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.draw" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.std"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.impress">
+ <comment>OpenOffice Impress presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي Impress المكتب المفتوح</comment>
+ <comment xml:lang="az">OpenOffice Impress sənədi</comment>
+ <comment xml:lang="be@latin">Prezentacyja OpenOffice Impress</comment>
+ <comment xml:lang="bg">Презентация — OpenOffice Impress</comment>
+ <comment xml:lang="ca">presentació d'OpenOffice Impress</comment>
+ <comment xml:lang="cs">Prezentace OpenOffice Impress</comment>
+ <comment xml:lang="cy">Cyflwyniad OpenOffice (Impress)</comment>
+ <comment xml:lang="da">OpenOffice Impress-præsentation</comment>
+ <comment xml:lang="de">OpenOffice-Impress-Vorlage</comment>
+ <comment xml:lang="es">presentación de OpenOffice Impress</comment>
+ <comment xml:lang="eu">OpenOffice.org Impress aurkezpena</comment>
+ <comment xml:lang="fi">OpenOffice Impress -esitys</comment>
+ <comment xml:lang="fo">OpenOffice Impress framløga</comment>
+ <comment xml:lang="fr">présentation OpenOffice Impress</comment>
+ <comment xml:lang="ga">láithreoireacht OpenOffice Impress</comment>
+ <comment xml:lang="gl">presentación de de OpenOffice Impress</comment>
+ <comment xml:lang="he">מצגת של OpenOffice Impress</comment>
+ <comment xml:lang="hu">OpenOffice Impress bemutató</comment>
+ <comment xml:lang="id">Presentasi OpenOffice Impress</comment>
+ <comment xml:lang="it">Presentazione OpenOffice Impress</comment>
+ <comment xml:lang="ja">OpenOffice Impress プレゼンテーション</comment>
+ <comment xml:lang="kk">OpenOffice Impress презентациясы</comment>
+ <comment xml:lang="ko">OpenOffice Impress 프리젠테이션</comment>
+ <comment xml:lang="lt">OpenOffice Impress pateiktis</comment>
+ <comment xml:lang="lv">OpenOffice Impress prezentācija</comment>
+ <comment xml:lang="nb">OpenOffice Impress-presentasjon</comment>
+ <comment xml:lang="nl">OpenOffice.org Impress-presentatie</comment>
+ <comment xml:lang="nn">OpenOffice Impress-presentasjon</comment>
+ <comment xml:lang="pl">Prezentacja OpenOffice.org Impress</comment>
+ <comment xml:lang="pt_BR">Apresentação do OpenOffice Impress</comment>
+ <comment xml:lang="ro">Prezentare OpenOffice Impress</comment>
+ <comment xml:lang="ru">презентация OpenOffice Impress</comment>
+ <comment xml:lang="sk">Prezentácia OpenOffice Impress</comment>
+ <comment xml:lang="sl">Predstavitev OpenOffice.org Impress</comment>
+ <comment xml:lang="sq">Prezantim OpenOffice Impress</comment>
+ <comment xml:lang="sv">OpenOffice Impress-presentation</comment>
+ <comment xml:lang="uk">презентація OpenOffice Impress</comment>
+ <comment xml:lang="vi">Trình diễn Impress của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Impress 演示文稿</comment>
+ <comment xml:lang="zh_TW">OpenOffice Impress 簡報</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.impress" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sxi"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.impress.template">
+ <comment>OpenOffice Impress template</comment>
+ <comment xml:lang="ar">قالب Impress المكتب المفتوح</comment>
+ <comment xml:lang="be@latin">Šablon OpenOffice Impress</comment>
+ <comment xml:lang="bg">Шаблон за презентации — OpenOffice Impress</comment>
+ <comment xml:lang="ca">plantilla d'OpenOffice Impress</comment>
+ <comment xml:lang="cs">Šablona OpenOffice Impress</comment>
+ <comment xml:lang="da">OpenOffice Impress-skabelon</comment>
+ <comment xml:lang="de">OpenOffice-Impress-Vorlage</comment>
+ <comment xml:lang="en_GB">OpenOffice Impress template</comment>
+ <comment xml:lang="es">plantilla de OpenOffice Impress</comment>
+ <comment xml:lang="eu">OpenOffice Impress txantiloia</comment>
+ <comment xml:lang="fi">OpenOffice Impress -malli</comment>
+ <comment xml:lang="fo">OpenOffice Impress formur</comment>
+ <comment xml:lang="fr">modèle OpenOffice Impress</comment>
+ <comment xml:lang="ga">teimpléad OpenOffice Impress</comment>
+ <comment xml:lang="gl">modelo de OpenOffice Impress</comment>
+ <comment xml:lang="he">תבנית של OpenOffice Impress</comment>
+ <comment xml:lang="hu">OpenOffice Impress sablon</comment>
+ <comment xml:lang="id">Templat OpenOffice Impress</comment>
+ <comment xml:lang="it">Modello OpenOffice Impress</comment>
+ <comment xml:lang="ja">OpenOffice Impress テンプレート</comment>
+ <comment xml:lang="kk">OpenOffice Impress үлгісі</comment>
+ <comment xml:lang="ko">OpenOffice Impress 프리젠테이션 문서 서식</comment>
+ <comment xml:lang="lt">OpenOffice Impress šablonas</comment>
+ <comment xml:lang="lv">OpenOffice Impress veidne</comment>
+ <comment xml:lang="nb">OpenOffice Impress-mal</comment>
+ <comment xml:lang="nl">OpenOffice.org Impress-sjabloon</comment>
+ <comment xml:lang="nn">OpenOffice Impress-mal</comment>
+ <comment xml:lang="pl">Szablon prezentacji OpenOffice.org Impress</comment>
+ <comment xml:lang="pt_BR">Modelo do OpenOffice Impress</comment>
+ <comment xml:lang="ro">Șablon OpenOffice Impress</comment>
+ <comment xml:lang="ru">шаблон OpenOffice Impress</comment>
+ <comment xml:lang="sk">Šablóna OpenOffice Impress</comment>
+ <comment xml:lang="sl">Predloga OpenOffice.org Impress</comment>
+ <comment xml:lang="sq">Model OpenOffice Impress</comment>
+ <comment xml:lang="sv">OpenOffice Impress-mall</comment>
+ <comment xml:lang="uk">шаблон презентації OpenOffice Impress</comment>
+ <comment xml:lang="vi">Mẫu trình diễn Impress của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Impress 演示文稿模板</comment>
+ <comment xml:lang="zh_TW">OpenOffice Impress 範本</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.impress" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sti"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.math">
+ <comment>OpenOffice Math formula</comment>
+ <comment xml:lang="ar">صيغة Math المكتب المفتوح</comment>
+ <comment xml:lang="be@latin">Formuła OpenOffice Math</comment>
+ <comment xml:lang="bg">Формула — OpenOffice Math</comment>
+ <comment xml:lang="ca">fórmula d'OpenOffice Math</comment>
+ <comment xml:lang="cs">Vzorec OpenOffice Math</comment>
+ <comment xml:lang="da">OpenOffice Math-formel</comment>
+ <comment xml:lang="de">OpenOffice-Math-Formel</comment>
+ <comment xml:lang="es">fórmula de OpenOffice Math</comment>
+ <comment xml:lang="eu">OpenOffice.org Math formula</comment>
+ <comment xml:lang="fi">OpenOffice Math -kaava</comment>
+ <comment xml:lang="fo">OpenOffice Math frymil</comment>
+ <comment xml:lang="fr">formule OpenOffice Math</comment>
+ <comment xml:lang="ga">foirmle OpenOffice Math</comment>
+ <comment xml:lang="gl">fórmula de OpenOffice Math</comment>
+ <comment xml:lang="he">נוסחה של OpenOffice Math</comment>
+ <comment xml:lang="hu">OpenOffice Math képlet</comment>
+ <comment xml:lang="id">Formula OpenOffice Math</comment>
+ <comment xml:lang="it">Formula OpenOffice Math</comment>
+ <comment xml:lang="ja">OpenOffice Math 計算式</comment>
+ <comment xml:lang="kk">OpenOffice Math формуласы</comment>
+ <comment xml:lang="ko">OpenOffice Math 수식</comment>
+ <comment xml:lang="lt">OpenOffice Math formulė</comment>
+ <comment xml:lang="lv">OpenOffice Math formula</comment>
+ <comment xml:lang="nb">OpenOffice Math-formel</comment>
+ <comment xml:lang="nl">OpenOffice.org Math-formule</comment>
+ <comment xml:lang="nn">OpenOffice Math-formel</comment>
+ <comment xml:lang="pl">Formuła OpenOffice.org Math</comment>
+ <comment xml:lang="pt_BR">Fórmula do OpenOffice Math</comment>
+ <comment xml:lang="ro">Formulă OpenOffice Math</comment>
+ <comment xml:lang="ru">формула OpenOffice Math</comment>
+ <comment xml:lang="sk">Vzorec OpenOffice Math</comment>
+ <comment xml:lang="sl">Dokument formule OpenOffice.org Math</comment>
+ <comment xml:lang="sq">Formulë OpenOffice Math</comment>
+ <comment xml:lang="sv">OpenOffice Math-formel</comment>
+ <comment xml:lang="uk">формула OpenOffice Math</comment>
+ <comment xml:lang="vi">Công thức Math của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Math 公式</comment>
+ <comment xml:lang="zh_TW">OpenOffice Math 公式</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.math" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sxm"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.writer">
+ <comment>OpenOffice Writer document</comment>
+ <comment xml:lang="ar">مستند Writer المكتب المفتوح</comment>
+ <comment xml:lang="az">OpenOffice Writer sənədi</comment>
+ <comment xml:lang="be@latin">Dakument OpenOffice Writer</comment>
+ <comment xml:lang="bg">Документ — OpenOffice Writer</comment>
+ <comment xml:lang="ca">document d'OpenOffice Writer</comment>
+ <comment xml:lang="cs">Dokument OpenOffice Writer</comment>
+ <comment xml:lang="cy">Dogfen OpenOffice (Writer)</comment>
+ <comment xml:lang="da">OpenOffice Writer-dokument</comment>
+ <comment xml:lang="de">OpenOffice-Writer-Dokument</comment>
+ <comment xml:lang="es">documento de OpenOffice Writer</comment>
+ <comment xml:lang="eu">OpenOffice.org Writer dokumentua</comment>
+ <comment xml:lang="fi">OpenOffice Writer -asiakirja</comment>
+ <comment xml:lang="fo">OpenOffice Writer skjal</comment>
+ <comment xml:lang="fr">document OpenOffice Writer</comment>
+ <comment xml:lang="ga">cáipéis OpenOffice Writer</comment>
+ <comment xml:lang="gl">documento de OpenOffice Writer</comment>
+ <comment xml:lang="he">מסמך של OpenOffice Writer</comment>
+ <comment xml:lang="hu">OpenOffice Writer dokumentum</comment>
+ <comment xml:lang="id">Dokumen OpenOffice Writer</comment>
+ <comment xml:lang="it">Documento OpenOffice Writer</comment>
+ <comment xml:lang="ja">OpenOffice Writer ドキュメント</comment>
+ <comment xml:lang="kk">OpenOffice Writer құжаты</comment>
+ <comment xml:lang="ko">OpenOffice Writer 문서</comment>
+ <comment xml:lang="lt">OpenOffice Writer dokumentas</comment>
+ <comment xml:lang="lv">OpenOffice Writer dokuments</comment>
+ <comment xml:lang="nb">OpenOffice Writer-dokument</comment>
+ <comment xml:lang="nl">OpenOffice.org Writer-document</comment>
+ <comment xml:lang="nn">OpenOffice Writer-dokument</comment>
+ <comment xml:lang="pl">Dokument OpenOffice.org Writer</comment>
+ <comment xml:lang="pt_BR">Documento do OpenOffice Writer</comment>
+ <comment xml:lang="ro">Document OpenOffice Writer</comment>
+ <comment xml:lang="ru">документ OpenOffice Writer</comment>
+ <comment xml:lang="sk">Dokument OpenOffice Writer</comment>
+ <comment xml:lang="sl">Dokument OpenOffice.org Writer</comment>
+ <comment xml:lang="sq">Dokument OpenOffice Writer</comment>
+ <comment xml:lang="sv">OpenOffice Writer-dokument</comment>
+ <comment xml:lang="uk">документ OpenOffice Writer</comment>
+ <comment xml:lang="vi">Tài liệu Writer của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Writer 文档</comment>
+ <comment xml:lang="zh_TW">OpenOffice Writer 文件</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.writer" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sxw"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.writer.global">
+ <comment>OpenOffice Writer global document</comment>
+ <comment xml:lang="ar">مستند المكتب المفتوح Writer العالمي</comment>
+ <comment xml:lang="az">OpenOffice Writer qlobal sənədi</comment>
+ <comment xml:lang="be@latin">Hlabalny dakument OpenOffice Writer</comment>
+ <comment xml:lang="bg">Документ - глобален — OpenOffice Writer</comment>
+ <comment xml:lang="ca">document global d'OpenOffice Writer</comment>
+ <comment xml:lang="cs">Globální dokument OpenOffice Writer</comment>
+ <comment xml:lang="cy">Dogfen eang OpenOffice (Writer)</comment>
+ <comment xml:lang="da">OpenOffice Writer-globalt dokument</comment>
+ <comment xml:lang="de">OpenOffice-Writer-Globaldokument</comment>
+ <comment xml:lang="es">documento global de OpenOffice Writer</comment>
+ <comment xml:lang="eu">OpenOffice.org Writer dokumentu globala</comment>
+ <comment xml:lang="fi">OpenOffice Writer - yleinen asiakirja</comment>
+ <comment xml:lang="fo">OpenOffice Writer heiltøkt skjal</comment>
+ <comment xml:lang="fr">document global OpenOffice Writer</comment>
+ <comment xml:lang="ga">cáipéis chomhchoiteann OpenOffice Writer</comment>
+ <comment xml:lang="gl">documento global de OpenOffice Writer</comment>
+ <comment xml:lang="he">מסמך גלובלי של OpenOffice Writer</comment>
+ <comment xml:lang="hu">OpenOffice Writer globális dokumentum</comment>
+ <comment xml:lang="id">Dokumen global OpenOffice Writer</comment>
+ <comment xml:lang="it">Documento globale OpenOffice Writer</comment>
+ <comment xml:lang="ja">OpenOffice Writer グローバルドキュメント</comment>
+ <comment xml:lang="kk">OpenOffice Writer негізгі құжаты</comment>
+ <comment xml:lang="ko">OpenOffice Writer 글로벌 문서</comment>
+ <comment xml:lang="lt">OpenOffice Writer bendrinis dokumentas</comment>
+ <comment xml:lang="lv">OpenOffice Writer globālais dokuments</comment>
+ <comment xml:lang="nb">Global OpenOffice Writer globalt dokument</comment>
+ <comment xml:lang="nl">OpenOffice.org Writer-globaal-document</comment>
+ <comment xml:lang="nn">OpenOffice Writer globalt dokument</comment>
+ <comment xml:lang="pl">Globalny dokument OpenOffice.org Writer</comment>
+ <comment xml:lang="pt_BR">Documento global do OpenOffice Writer</comment>
+ <comment xml:lang="ro">Document global OpenOffice Writer</comment>
+ <comment xml:lang="ru">основной документ OpenOffice Writer</comment>
+ <comment xml:lang="sk">Globálny dokument OpenOffice Writer</comment>
+ <comment xml:lang="sl">Splošni dokument OpenOffice.org Writer</comment>
+ <comment xml:lang="sq">Dokument i përgjithshëm OpenOffice Writer</comment>
+ <comment xml:lang="sv">OpenOffice Writer-globaldokument</comment>
+ <comment xml:lang="uk">загальний документ OpenOffice Writer</comment>
+ <comment xml:lang="vi">Tài liệu toàn cục Writer của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Writer 全局文档</comment>
+ <comment xml:lang="zh_TW">OpenOffice Writer 主控文件</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.writer" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.sxg"/>
+ </mime-type>
+ <mime-type type="application/vnd.sun.xml.writer.template">
+ <comment>OpenOffice Writer template</comment>
+ <comment xml:lang="ar">قالب Writer المكتب المفتوح</comment>
+ <comment xml:lang="az">OpenOffice Writer şablonu</comment>
+ <comment xml:lang="be@latin">Šablon OpenOffice Writer</comment>
+ <comment xml:lang="bg">Шаблон за документи — OpenOffice Writer</comment>
+ <comment xml:lang="ca">plantilla d'OpenOffice Writer</comment>
+ <comment xml:lang="cs">Šablona OpenOffice Writer</comment>
+ <comment xml:lang="cy">Templed OpenOffice (Writer)</comment>
+ <comment xml:lang="da">OpenOffice Writer-skabelon</comment>
+ <comment xml:lang="de">OpenOffice-Writer-Vorlage</comment>
+ <comment xml:lang="en_GB">OpenOffice Writer template</comment>
+ <comment xml:lang="es">plantilla de OpenOffice Writer</comment>
+ <comment xml:lang="eu">OpenOffice Writer txantiloia</comment>
+ <comment xml:lang="fi">OpenOffice Writer -malli</comment>
+ <comment xml:lang="fo">OpenOffice Writer formur</comment>
+ <comment xml:lang="fr">modèle OpenOffice Writer</comment>
+ <comment xml:lang="ga">teimpléad OpenOffice Writer</comment>
+ <comment xml:lang="gl">modelo de OpenOffice Writer</comment>
+ <comment xml:lang="he">תסנית של OpenOffice Writer</comment>
+ <comment xml:lang="hu">OpenOffice Writer sablon</comment>
+ <comment xml:lang="id">Templat OpenOffice Writer</comment>
+ <comment xml:lang="it">Modello OpenOffice Writer</comment>
+ <comment xml:lang="ja">OpenOffice Writer ドキュメントテンプレート</comment>
+ <comment xml:lang="kk">OpenOffice Writer үлгісі</comment>
+ <comment xml:lang="ko">OpenOffice Writer 문서 서식</comment>
+ <comment xml:lang="lt">OpenOffice Writer šablonas</comment>
+ <comment xml:lang="lv">OpenOffice Writer veidne</comment>
+ <comment xml:lang="ms">Templat OpenOffice Writer</comment>
+ <comment xml:lang="nb">OpenOffice Writer-mal</comment>
+ <comment xml:lang="nl">OpenOffice.org Writer-sjabloon</comment>
+ <comment xml:lang="nn">OpenOffice Writer-mal</comment>
+ <comment xml:lang="pl">Szablon dokumentu OpenOffice.org Writer</comment>
+ <comment xml:lang="pt_BR">Modelo do OpenOffice Writer</comment>
+ <comment xml:lang="ro">Șablon OpenOffice Writer</comment>
+ <comment xml:lang="ru">шаблон OpenOffice Writer</comment>
+ <comment xml:lang="sk">Šablóna OpenOffice Writer</comment>
+ <comment xml:lang="sl">Predloga OpenOffice.org Writer</comment>
+ <comment xml:lang="sq">Model OpenOffice Writer</comment>
+ <comment xml:lang="sv">OpenOffice Writer-mall</comment>
+ <comment xml:lang="uk">шаблон документа OpenOffice Writer</comment>
+ <comment xml:lang="vi">Mẫu tài liệu Writer của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org Writer 文档模板</comment>
+ <comment xml:lang="zh_TW">OpenOffice Writer 範本</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.sun.xml.writer" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.stw"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.text">
+ <comment>ODT document</comment>
+ <comment xml:lang="ar">مستند ODT</comment>
+ <comment xml:lang="be@latin">Dakument ODT</comment>
+ <comment xml:lang="bg">Документ — ODT</comment>
+ <comment xml:lang="ca">document ODT</comment>
+ <comment xml:lang="cs">Dokument ODT</comment>
+ <comment xml:lang="da">ODT-dokument</comment>
+ <comment xml:lang="de">ODT-Dokument</comment>
+ <comment xml:lang="en_GB">ODT document</comment>
+ <comment xml:lang="eo">ODT-dokumento</comment>
+ <comment xml:lang="es">documento ODT</comment>
+ <comment xml:lang="eu">ODT dokumentua</comment>
+ <comment xml:lang="fi">ODT-asiakirja</comment>
+ <comment xml:lang="fo">ODT skjal</comment>
+ <comment xml:lang="fr">document ODT</comment>
+ <comment xml:lang="ga">cáipéis ODT</comment>
+ <comment xml:lang="gl">documento ODT</comment>
+ <comment xml:lang="he">מסמך ODT</comment>
+ <comment xml:lang="hu">ODT-dokumentum</comment>
+ <comment xml:lang="id">Dokumen ODT</comment>
+ <comment xml:lang="it">Documento ODT</comment>
+ <comment xml:lang="ja">ODT ドキュメント</comment>
+ <comment xml:lang="kk">ODT құжаты</comment>
+ <comment xml:lang="ko">ODT 문서</comment>
+ <comment xml:lang="lt">ODT dokumentas</comment>
+ <comment xml:lang="lv">ODT dokuments</comment>
+ <comment xml:lang="nb">ODT-dokument</comment>
+ <comment xml:lang="nl">ODT-document</comment>
+ <comment xml:lang="nn">ODT-dokument</comment>
+ <comment xml:lang="pl">Dokument ODT</comment>
+ <comment xml:lang="pt_BR">Documento ODT</comment>
+ <comment xml:lang="ro">Document ODT</comment>
+ <comment xml:lang="ru">документ ODT</comment>
+ <comment xml:lang="sk">Dokument ODT</comment>
+ <comment xml:lang="sl">Dokument ODT</comment>
+ <comment xml:lang="sq">Dokument ODT</comment>
+ <comment xml:lang="sv">ODT-dokument</comment>
+ <comment xml:lang="uk">документ ODT</comment>
+ <comment xml:lang="vi">Tài liệu ODT</comment>
+ <comment xml:lang="zh_CN">ODT 文档</comment>
+ <comment xml:lang="zh_TW">ODT 文件</comment>
+ <acronym>ODT</acronym>
+ <expanded-acronym>OpenDocument Text</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.text" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odt"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.text-flat-xml">
+ <comment>ODT document (Flat XML)</comment>
+ <comment xml:lang="ar">مستند ODT (Flat XML)</comment>
+ <comment xml:lang="bg">Документ — ODT (само XML)</comment>
+ <comment xml:lang="ca">document ODT (XML pla)</comment>
+ <comment xml:lang="cs">Dokument ODT (Flat XML)</comment>
+ <comment xml:lang="da">ODT-dokument (flad XML)</comment>
+ <comment xml:lang="de">ODT-Dokument (Unkomprimiertes XML)</comment>
+ <comment xml:lang="es">documento ODT (XML plano)</comment>
+ <comment xml:lang="eu">ODT dokumentua (XML soila)</comment>
+ <comment xml:lang="fo">ODT skjal (Flat XML)</comment>
+ <comment xml:lang="fr">document ODT (XML plat)</comment>
+ <comment xml:lang="ga">cáipéis ODT (XML cothrom)</comment>
+ <comment xml:lang="gl">documento ODT (XML plano)</comment>
+ <comment xml:lang="he">מסמך ODT‏ (Flat XML)</comment>
+ <comment xml:lang="hu">ODT-dokumentum (egyszerű XML)</comment>
+ <comment xml:lang="id">Dokumen ODT (Flat XML)</comment>
+ <comment xml:lang="it">Documento ODT (XML semplice)</comment>
+ <comment xml:lang="ja">ODT ドキュメント (Flat XML)</comment>
+ <comment xml:lang="kk">ODT құжаты (Тек XML)</comment>
+ <comment xml:lang="ko">ODT 문서 (단일 XML)</comment>
+ <comment xml:lang="lt">ODT dokumentas (Flat XML)</comment>
+ <comment xml:lang="lv">ODT dokuments (plakans XML)</comment>
+ <comment xml:lang="pl">Dokument ODT (prosty XML)</comment>
+ <comment xml:lang="ro">Document ODT (XML simplu)</comment>
+ <comment xml:lang="ru">документ ODT (простой XML)</comment>
+ <comment xml:lang="sk">Dokument ODT (čisté XML)</comment>
+ <comment xml:lang="sl">Datoteka dokumenta ODT (nepovezan XML)</comment>
+ <comment xml:lang="sv">ODT-dokument (platt XML)</comment>
+ <comment xml:lang="uk">документ ODT (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODT 文档(Flat XML)</comment>
+ <comment xml:lang="zh_TW">ODT 文件 (Flat XML)</comment>
+ <acronym>FODT</acronym>
+ <expanded-acronym>OpenDocument Text (Flat XML)</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.fodt"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.text-template">
+ <comment>ODT template</comment>
+ <comment xml:lang="ar">قالب ODT</comment>
+ <comment xml:lang="be@latin">Šablon ODT</comment>
+ <comment xml:lang="bg">Шаблон за документи — ODT</comment>
+ <comment xml:lang="ca">plantilla ODT</comment>
+ <comment xml:lang="cs">Šablona ODT</comment>
+ <comment xml:lang="da">ODT-skabelon</comment>
+ <comment xml:lang="de">ODT-Vorlage</comment>
+ <comment xml:lang="en_GB">ODT template</comment>
+ <comment xml:lang="eo">ODT-ŝablono</comment>
+ <comment xml:lang="es">plantilla ODT</comment>
+ <comment xml:lang="eu">ODT txantiloia</comment>
+ <comment xml:lang="fi">ODT-malli</comment>
+ <comment xml:lang="fo">ODT formur</comment>
+ <comment xml:lang="fr">modèle ODT</comment>
+ <comment xml:lang="ga">teimpléad ODT</comment>
+ <comment xml:lang="gl">modelo ODT</comment>
+ <comment xml:lang="he">תבנית ODT</comment>
+ <comment xml:lang="hu">ODT-sablon</comment>
+ <comment xml:lang="id">Templat ODT</comment>
+ <comment xml:lang="it">Modello ODT</comment>
+ <comment xml:lang="ja">ODT テンプレート</comment>
+ <comment xml:lang="kk">ODT үлгісі</comment>
+ <comment xml:lang="ko">ODT 문서 서식</comment>
+ <comment xml:lang="lt">ODT šablonas</comment>
+ <comment xml:lang="lv">ODT veidne</comment>
+ <comment xml:lang="nb">ODT-mal</comment>
+ <comment xml:lang="nl">ODT-sjabloon</comment>
+ <comment xml:lang="nn">ODT-mal</comment>
+ <comment xml:lang="pl">Szablon ODT</comment>
+ <comment xml:lang="pt_BR">Modelo ODT</comment>
+ <comment xml:lang="ro">Șablon ODT</comment>
+ <comment xml:lang="ru">шаблон ODT</comment>
+ <comment xml:lang="sk">Šablóna ODT</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODT</comment>
+ <comment xml:lang="sq">Model ODT</comment>
+ <comment xml:lang="sv">ODT-mall</comment>
+ <comment xml:lang="uk">шаблон ODT</comment>
+ <comment xml:lang="vi">Mẫu ODT</comment>
+ <comment xml:lang="zh_CN">ODT 模板</comment>
+ <comment xml:lang="zh_TW">ODT 範本</comment>
+ <acronym>ODT</acronym>
+ <expanded-acronym>OpenDocument Text</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.text-template" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.ott"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.text-web">
+ <comment>OTH template</comment>
+ <comment xml:lang="ar">قالب OTH</comment>
+ <comment xml:lang="be@latin">Šablon OTH</comment>
+ <comment xml:lang="bg">Шаблон за страници — OTH</comment>
+ <comment xml:lang="ca">plantilla OTH</comment>
+ <comment xml:lang="cs">Šablona OTH</comment>
+ <comment xml:lang="da">OTH-skabelon</comment>
+ <comment xml:lang="de">OTH-Vorlage</comment>
+ <comment xml:lang="en_GB">OTH template</comment>
+ <comment xml:lang="eo">OTH-ŝablono</comment>
+ <comment xml:lang="es">plantilla OTH</comment>
+ <comment xml:lang="eu">OTH txantiloia</comment>
+ <comment xml:lang="fi">OTH-malli</comment>
+ <comment xml:lang="fo">OTH formur</comment>
+ <comment xml:lang="fr">modèle OTH</comment>
+ <comment xml:lang="ga">teimpléad OTH</comment>
+ <comment xml:lang="gl">modelo OTH</comment>
+ <comment xml:lang="he">תבנית OTH</comment>
+ <comment xml:lang="hu">OTH-sablon</comment>
+ <comment xml:lang="id">Templat OTH</comment>
+ <comment xml:lang="it">Modello OTH</comment>
+ <comment xml:lang="ja">OTH テンプレート</comment>
+ <comment xml:lang="kk">OTH үлгісі</comment>
+ <comment xml:lang="ko">OTH 문서 서식</comment>
+ <comment xml:lang="lt">OTH šablonas</comment>
+ <comment xml:lang="lv">OTH veidne</comment>
+ <comment xml:lang="nb">OTH-mal</comment>
+ <comment xml:lang="nl">OTH-sjabloon</comment>
+ <comment xml:lang="nn">OTH-mal</comment>
+ <comment xml:lang="pl">Szablon OTH</comment>
+ <comment xml:lang="pt_BR">Modelo OTH</comment>
+ <comment xml:lang="ro">Șablon OTH</comment>
+ <comment xml:lang="ru">шаблон OTH</comment>
+ <comment xml:lang="sk">Šablóna OTH</comment>
+ <comment xml:lang="sl">Predloga OTH</comment>
+ <comment xml:lang="sq">Model OTH</comment>
+ <comment xml:lang="sv">OTH-mall</comment>
+ <comment xml:lang="uk">шаблон OTH</comment>
+ <comment xml:lang="vi">Mẫu ODH</comment>
+ <comment xml:lang="zh_CN">OTH 模板</comment>
+ <comment xml:lang="zh_TW">OTH 範本</comment>
+ <acronym>OTH</acronym>
+ <expanded-acronym>OpenDocument HTML</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="text-html"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.text-web" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.oth"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.text-master">
+ <comment>ODM document</comment>
+ <comment xml:lang="ar">مستند ODM</comment>
+ <comment xml:lang="be@latin">Dakument ODM</comment>
+ <comment xml:lang="bg">Документ — ODM</comment>
+ <comment xml:lang="ca">document ODM</comment>
+ <comment xml:lang="cs">Dokument ODM</comment>
+ <comment xml:lang="da">ODM-dokument</comment>
+ <comment xml:lang="de">ODM-Dokument</comment>
+ <comment xml:lang="en_GB">ODM document</comment>
+ <comment xml:lang="eo">ODM-dokumento</comment>
+ <comment xml:lang="es">documento ODM</comment>
+ <comment xml:lang="eu">ODM dokumentua</comment>
+ <comment xml:lang="fi">ODM-asiakirja</comment>
+ <comment xml:lang="fo">ODM skjal</comment>
+ <comment xml:lang="fr">document ODM</comment>
+ <comment xml:lang="ga">cáipéis ODM</comment>
+ <comment xml:lang="gl">documento ODM</comment>
+ <comment xml:lang="he">מסמך ODM</comment>
+ <comment xml:lang="hu">ODM-dokumentum</comment>
+ <comment xml:lang="id">Dokumen ODM</comment>
+ <comment xml:lang="it">Documento ODM</comment>
+ <comment xml:lang="ja">ODM ドキュメント</comment>
+ <comment xml:lang="kk">ODM құжаты</comment>
+ <comment xml:lang="ko">ODM 문서</comment>
+ <comment xml:lang="lt">ODM dokumentas</comment>
+ <comment xml:lang="lv">ODM dokuments</comment>
+ <comment xml:lang="nb">ODM-dokument</comment>
+ <comment xml:lang="nl">ODM-document</comment>
+ <comment xml:lang="nn">ODM-dokument</comment>
+ <comment xml:lang="pl">Dokument ODM</comment>
+ <comment xml:lang="pt_BR">Documento ODM</comment>
+ <comment xml:lang="ro">Document ODM</comment>
+ <comment xml:lang="ru">документ ODM</comment>
+ <comment xml:lang="sk">Dokument ODM</comment>
+ <comment xml:lang="sl">Dokument ODM</comment>
+ <comment xml:lang="sq">Dokument ODM</comment>
+ <comment xml:lang="sv">ODM-dokument</comment>
+ <comment xml:lang="uk">документ ODM</comment>
+ <comment xml:lang="vi">Tài liệu ODM</comment>
+ <comment xml:lang="zh_CN">ODM 文档</comment>
+ <comment xml:lang="zh_TW">ODM 文件</comment>
+ <acronym>ODM</acronym>
+ <expanded-acronym>OpenDocument Master</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.text-master" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odm"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.graphics">
+ <comment>ODG drawing</comment>
+ <comment xml:lang="ar">تصميم ODG</comment>
+ <comment xml:lang="be@latin">Rysunak ODG</comment>
+ <comment xml:lang="bg">Чертеж — ODG</comment>
+ <comment xml:lang="ca">dibuix ODG</comment>
+ <comment xml:lang="cs">Kresba ODG</comment>
+ <comment xml:lang="da">ODG-tegning</comment>
+ <comment xml:lang="de">ODG-Zeichnung</comment>
+ <comment xml:lang="en_GB">ODG drawing</comment>
+ <comment xml:lang="eo">ODG-desegnaĵo</comment>
+ <comment xml:lang="es">dibujo ODG</comment>
+ <comment xml:lang="eu">ODG marrazkia</comment>
+ <comment xml:lang="fi">ODG-piirros</comment>
+ <comment xml:lang="fo">ODG tekning</comment>
+ <comment xml:lang="fr">dessin ODG</comment>
+ <comment xml:lang="ga">líníocht ODG</comment>
+ <comment xml:lang="gl">debuxo ODG</comment>
+ <comment xml:lang="he">ציור ODG</comment>
+ <comment xml:lang="hu">ODG-rajz</comment>
+ <comment xml:lang="id">Gambar ODG</comment>
+ <comment xml:lang="it">Disegno ODG</comment>
+ <comment xml:lang="ja">ODG ドロー</comment>
+ <comment xml:lang="kk">ODG суреті</comment>
+ <comment xml:lang="ko">ODG 드로잉</comment>
+ <comment xml:lang="lt">ODG piešinys</comment>
+ <comment xml:lang="lv">ODG zīmējums</comment>
+ <comment xml:lang="nb">ODG-tegning</comment>
+ <comment xml:lang="nl">ODG-tekening</comment>
+ <comment xml:lang="nn">ODG-teikning</comment>
+ <comment xml:lang="pl">Rysunek ODG</comment>
+ <comment xml:lang="pt_BR">Desenho ODG</comment>
+ <comment xml:lang="ro">Desen ODG</comment>
+ <comment xml:lang="ru">изображение ODG</comment>
+ <comment xml:lang="sk">Kresba ODG</comment>
+ <comment xml:lang="sl">Datoteka risbe ODG</comment>
+ <comment xml:lang="sq">Vizatim ODG</comment>
+ <comment xml:lang="sv">ODG-teckning</comment>
+ <comment xml:lang="uk">малюнок ODG</comment>
+ <comment xml:lang="vi">Bản vẽ ODG</comment>
+ <comment xml:lang="zh_CN">ODG 绘图</comment>
+ <comment xml:lang="zh_TW">ODG 繪圖</comment>
+ <acronym>ODG</acronym>
+ <expanded-acronym>OpenDocument Drawing</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.graphics" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odg"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.graphics-flat-xml">
+ <comment>ODG drawing (Flat XML)</comment>
+ <comment xml:lang="ar">رسمة ODG (Flat XML)</comment>
+ <comment xml:lang="bg">Чертеж — ODG (само XML)</comment>
+ <comment xml:lang="ca">dibuix ODG (XML pla) </comment>
+ <comment xml:lang="cs">Kresba ODG (Flat XML)</comment>
+ <comment xml:lang="da">ODG-tegning (flad XML)</comment>
+ <comment xml:lang="de">ODG-Zeichnung (Unkomprimiertes XML)</comment>
+ <comment xml:lang="es">dibujo ODG (XML plano)</comment>
+ <comment xml:lang="eu">ODG marrazkia (XML soila)</comment>
+ <comment xml:lang="fo">ODG tekning (Flat XML)</comment>
+ <comment xml:lang="fr">dessin ODG (XML plat)</comment>
+ <comment xml:lang="ga">líníocht ODG (XML cothrom)</comment>
+ <comment xml:lang="gl">debuxo ODB (XML plano)</comment>
+ <comment xml:lang="he">ציור ODG (Flat XML(</comment>
+ <comment xml:lang="hu">ODG-rajz (egyszerű XML)</comment>
+ <comment xml:lang="id">Gambar ODG (FLAT XML)</comment>
+ <comment xml:lang="it">Disegno ODG (XML semplice)</comment>
+ <comment xml:lang="ja">ODG ドロー (Flat XML)</comment>
+ <comment xml:lang="kk">ODG сызбасы (Тек XML)</comment>
+ <comment xml:lang="ko">ODG 드로잉 (단일 XML)</comment>
+ <comment xml:lang="lt">ODG piešinys (Flat XML)</comment>
+ <comment xml:lang="lv">ODG zīmējums (plakans XML)</comment>
+ <comment xml:lang="pl">Rysunek ODG (prosty XML)</comment>
+ <comment xml:lang="ro">Desen ODG (XML simplu)</comment>
+ <comment xml:lang="ru">изображение ODG (простой XML)</comment>
+ <comment xml:lang="sk">Kresba ODG (čisté XML)</comment>
+ <comment xml:lang="sl">Datoteka risbe ODG (nepovezan XML)</comment>
+ <comment xml:lang="sv">ODG-teckning (platt XML)</comment>
+ <comment xml:lang="uk">малюнок ODG (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODG 绘图(Flat XML)</comment>
+ <comment xml:lang="zh_TW">ODG 繪圖 (Flat XML)</comment>
+ <acronym>FODG</acronym>
+ <expanded-acronym>OpenDocument Drawing (Flat XML)</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.fodg"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.graphics-template">
+ <comment>ODG template</comment>
+ <comment xml:lang="ar">قالب ODG</comment>
+ <comment xml:lang="be@latin">Šablon ODG</comment>
+ <comment xml:lang="bg">Шаблон за чертежи — ODG</comment>
+ <comment xml:lang="ca">plantilla ODG</comment>
+ <comment xml:lang="cs">Šablona ODG</comment>
+ <comment xml:lang="da">ODG-skabelon</comment>
+ <comment xml:lang="de">ODG-Vorlage</comment>
+ <comment xml:lang="en_GB">ODG template</comment>
+ <comment xml:lang="eo">ODG-ŝablono</comment>
+ <comment xml:lang="es">plantilla ODG</comment>
+ <comment xml:lang="eu">ODG txantiloia</comment>
+ <comment xml:lang="fi">ODG-malli</comment>
+ <comment xml:lang="fo">ODG formur</comment>
+ <comment xml:lang="fr">modèle ODG</comment>
+ <comment xml:lang="ga">teimpléad ODG</comment>
+ <comment xml:lang="gl">modelo ODG</comment>
+ <comment xml:lang="he">תבנית ODG</comment>
+ <comment xml:lang="hu">ODG-sablon</comment>
+ <comment xml:lang="id">Templat ODG</comment>
+ <comment xml:lang="it">Modello ODG</comment>
+ <comment xml:lang="ja">ODG テンプレート</comment>
+ <comment xml:lang="kk">ODG үлгісі</comment>
+ <comment xml:lang="ko">ODG 문서 서식</comment>
+ <comment xml:lang="lt">ODG šablonas</comment>
+ <comment xml:lang="lv">ODG veidne</comment>
+ <comment xml:lang="nb">ODG-mal</comment>
+ <comment xml:lang="nl">ODG-sjabloon</comment>
+ <comment xml:lang="nn">ODG-mal</comment>
+ <comment xml:lang="pl">Szablon ODG</comment>
+ <comment xml:lang="pt_BR">Modelo ODG</comment>
+ <comment xml:lang="ro">Șablon ODG</comment>
+ <comment xml:lang="ru">шаблон ODG</comment>
+ <comment xml:lang="sk">Šablóna ODG</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODG</comment>
+ <comment xml:lang="sq">Model ODG</comment>
+ <comment xml:lang="sv">ODG-mall</comment>
+ <comment xml:lang="uk">шаблон ODG</comment>
+ <comment xml:lang="vi">Mẫu ODG</comment>
+ <comment xml:lang="zh_CN">ODG 模板</comment>
+ <comment xml:lang="zh_TW">ODG 範本</comment>
+ <acronym>ODG</acronym>
+ <expanded-acronym>OpenDocument Drawing</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.graphics-template" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.otg"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.presentation">
+ <comment>ODP presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي ODP</comment>
+ <comment xml:lang="be@latin">Prezentacyja ODP</comment>
+ <comment xml:lang="bg">Презентация — ODP</comment>
+ <comment xml:lang="ca">presentació ODP</comment>
+ <comment xml:lang="cs">Prezentace ODP</comment>
+ <comment xml:lang="da">ODP-præsentation</comment>
+ <comment xml:lang="de">ODP-Präsentation</comment>
+ <comment xml:lang="en_GB">ODP presentation</comment>
+ <comment xml:lang="eo">ODP-prezentaĵo</comment>
+ <comment xml:lang="es">presentación ODP</comment>
+ <comment xml:lang="eu">ODP aurkezpena</comment>
+ <comment xml:lang="fi">ODP-esitys</comment>
+ <comment xml:lang="fo">ODP framløga</comment>
+ <comment xml:lang="fr">présentation ODP</comment>
+ <comment xml:lang="ga">láithreoireacht ODP</comment>
+ <comment xml:lang="gl">presentación ODP</comment>
+ <comment xml:lang="he">מצגת ODP</comment>
+ <comment xml:lang="hu">ODP-prezentáció</comment>
+ <comment xml:lang="id">Presentasi ODP</comment>
+ <comment xml:lang="it">Presentazione ODP</comment>
+ <comment xml:lang="ja">ODP プレゼンテーション</comment>
+ <comment xml:lang="kk">ODP презентациясы</comment>
+ <comment xml:lang="ko">ODP 프리젠테이션</comment>
+ <comment xml:lang="lt">ODP pateiktis</comment>
+ <comment xml:lang="lv">ODP prezentācija</comment>
+ <comment xml:lang="nb">ODP-presentasjon</comment>
+ <comment xml:lang="nl">ODP-presentatie</comment>
+ <comment xml:lang="nn">ODP-presentasjon</comment>
+ <comment xml:lang="pl">Prezentacja ODP</comment>
+ <comment xml:lang="pt_BR">Apresentação ODP</comment>
+ <comment xml:lang="ro">Prezentare ODP</comment>
+ <comment xml:lang="ru">презентация ODP</comment>
+ <comment xml:lang="sk">Prezentácia ODP</comment>
+ <comment xml:lang="sl">Predstavitev ODP</comment>
+ <comment xml:lang="sq">Prezantim ODP</comment>
+ <comment xml:lang="sv">ODP-presentation</comment>
+ <comment xml:lang="uk">презентація ODP</comment>
+ <comment xml:lang="vi">Trình diễn ODM</comment>
+ <comment xml:lang="zh_CN">ODP 演示文稿</comment>
+ <comment xml:lang="zh_TW">ODP 簡報</comment>
+ <acronym>ODP</acronym>
+ <expanded-acronym>OpenDocument Presentation</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.presentation" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odp"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.presentation-flat-xml">
+ <comment>ODP presentation (Flat XML)</comment>
+ <comment xml:lang="ar">عرض ODP (Flat XML)</comment>
+ <comment xml:lang="bg">Презентация — ODP (само XML)</comment>
+ <comment xml:lang="ca">presentació ODP (XML pla)</comment>
+ <comment xml:lang="cs">Prezentace ODP (Flat XML)</comment>
+ <comment xml:lang="da">ODP-præsentation (flad XML)</comment>
+ <comment xml:lang="de">ODP-Präsentation (Unkomprimiertes XML)</comment>
+ <comment xml:lang="es">presentación ODP (XML plano)</comment>
+ <comment xml:lang="eu">ODP aurkezpena (XML soila)</comment>
+ <comment xml:lang="fo">ODP framløga (Flat XML)</comment>
+ <comment xml:lang="fr">présentation ODP (XML plat)</comment>
+ <comment xml:lang="ga">láithreoireacht ODP (XML cothrom)</comment>
+ <comment xml:lang="gl">presentación ODP (XML plano)</comment>
+ <comment xml:lang="he">מצגת ODP‏ (Flat XML)</comment>
+ <comment xml:lang="hu">ODP-prezentáció (egyszerű XML)</comment>
+ <comment xml:lang="id">Presentasi ODP (Flat XML)</comment>
+ <comment xml:lang="it">Presentazione ODP (XML semplice)</comment>
+ <comment xml:lang="ja">ODP プレゼンテーション (Flat XML)</comment>
+ <comment xml:lang="kk">ODP презентациясы (Тек XML)</comment>
+ <comment xml:lang="ko">ODP 프리젠테이션 (단일 XML)</comment>
+ <comment xml:lang="lt">ODP pateiktis (Flat XML)</comment>
+ <comment xml:lang="lv">ODP prezentācija (plakans XML)</comment>
+ <comment xml:lang="pl">Prezentacja ODP (prosty XML)</comment>
+ <comment xml:lang="ro">Prezentare ODP (XML simplu)</comment>
+ <comment xml:lang="ru">презентация ODP (простой XML)</comment>
+ <comment xml:lang="sk">Prezentácia ODP (čisté XML)</comment>
+ <comment xml:lang="sl">Predstavitev ODP (nepovezan XML)</comment>
+ <comment xml:lang="sv">ODP-presentation (platt XML)</comment>
+ <comment xml:lang="uk">презентація ODP (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODP 演示文稿(Flat XML)</comment>
+ <comment xml:lang="zh_TW">ODP 範本 (Flat XML)</comment>
+ <acronym>FODP</acronym>
+ <expanded-acronym>OpenDocument Presentation (Flat XML)</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.fodp"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.presentation-template">
+ <comment>ODP template</comment>
+ <comment xml:lang="ar">قالب ODP</comment>
+ <comment xml:lang="be@latin">Šablon ODP</comment>
+ <comment xml:lang="bg">Шаблон за презентации — ODP</comment>
+ <comment xml:lang="ca">plantilla ODP</comment>
+ <comment xml:lang="cs">Šablona ODP</comment>
+ <comment xml:lang="da">ODP-skabelon</comment>
+ <comment xml:lang="de">ODP-Vorlage</comment>
+ <comment xml:lang="en_GB">ODP template</comment>
+ <comment xml:lang="eo">ODP-ŝablono</comment>
+ <comment xml:lang="es">plantilla ODP</comment>
+ <comment xml:lang="eu">ODP txantiloia</comment>
+ <comment xml:lang="fi">ODP-malli</comment>
+ <comment xml:lang="fo">ODP formur</comment>
+ <comment xml:lang="fr">modèle ODP</comment>
+ <comment xml:lang="ga">teimpléad ODP</comment>
+ <comment xml:lang="gl">modelo ODP</comment>
+ <comment xml:lang="he">תבנית ODP</comment>
+ <comment xml:lang="hu">ODP-sablon</comment>
+ <comment xml:lang="id">Templat ODP</comment>
+ <comment xml:lang="it">Modello ODP</comment>
+ <comment xml:lang="ja">ODP テンプレート</comment>
+ <comment xml:lang="kk">ODP үлгісі</comment>
+ <comment xml:lang="ko">ODP 문서 서식</comment>
+ <comment xml:lang="lt">ODP šablonas</comment>
+ <comment xml:lang="lv">ODP veidne</comment>
+ <comment xml:lang="nb">ODP-mal</comment>
+ <comment xml:lang="nl">ODP-sjabloon</comment>
+ <comment xml:lang="nn">ODP-mal</comment>
+ <comment xml:lang="pl">Szablon ODP</comment>
+ <comment xml:lang="pt_BR">Modelo ODP</comment>
+ <comment xml:lang="ro">Șablon ODP</comment>
+ <comment xml:lang="ru">шаблон ODP</comment>
+ <comment xml:lang="sk">Šablóna ODP</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODP</comment>
+ <comment xml:lang="sq">Model ODP</comment>
+ <comment xml:lang="sv">ODP-mall</comment>
+ <comment xml:lang="uk">шаблон ODP</comment>
+ <comment xml:lang="vi">Mẫu ODP</comment>
+ <comment xml:lang="zh_CN">ODP 模板</comment>
+ <comment xml:lang="zh_TW">ODP 範本</comment>
+ <acronym>ODP</acronym>
+ <expanded-acronym>OpenDocument Presentation</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.presentation-template" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.otp"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.spreadsheet">
+ <comment>ODS spreadsheet</comment>
+ <comment xml:lang="ar">جدول ODS</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš ODS</comment>
+ <comment xml:lang="bg">Таблица — ODS</comment>
+ <comment xml:lang="ca">full de càlcul ODS</comment>
+ <comment xml:lang="cs">Sešit ODS</comment>
+ <comment xml:lang="da">ODS-regneark</comment>
+ <comment xml:lang="de">ODS-Tabelle</comment>
+ <comment xml:lang="en_GB">ODS spreadsheet</comment>
+ <comment xml:lang="eo">ODS-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo ODS</comment>
+ <comment xml:lang="eu">ODS kalkulu-orria</comment>
+ <comment xml:lang="fi">ODS-taulukko</comment>
+ <comment xml:lang="fo">ODS rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul ODS</comment>
+ <comment xml:lang="ga">scarbhileog ODS</comment>
+ <comment xml:lang="gl">folla de cálculo ODS</comment>
+ <comment xml:lang="he">גליון נתונים ODS</comment>
+ <comment xml:lang="hu">ODS-táblázat</comment>
+ <comment xml:lang="id">Lembar sebar ODS</comment>
+ <comment xml:lang="it">Foglio di calcolo ODS</comment>
+ <comment xml:lang="ja">ODS スプレッドシート</comment>
+ <comment xml:lang="kk">ODS электрондық кестесі</comment>
+ <comment xml:lang="ko">ODS 스프레드시트</comment>
+ <comment xml:lang="lt">ODS skaičialentė</comment>
+ <comment xml:lang="lv">ODS izklājlapa</comment>
+ <comment xml:lang="nb">ODS-regneark</comment>
+ <comment xml:lang="nl">ODS-rekenblad</comment>
+ <comment xml:lang="nn">ODS-rekneark</comment>
+ <comment xml:lang="pl">Arkusz ODS</comment>
+ <comment xml:lang="pt_BR">Planilha ODS</comment>
+ <comment xml:lang="ro">Foaie de calcul ODS</comment>
+ <comment xml:lang="ru">электронная таблица ODS</comment>
+ <comment xml:lang="sk">Zošit ODS</comment>
+ <comment xml:lang="sl">Razpredelnica ODS</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh ODS</comment>
+ <comment xml:lang="sv">ODS-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця ODS</comment>
+ <comment xml:lang="vi">Bảng tính ODS</comment>
+ <comment xml:lang="zh_CN">ODS 工作簿</comment>
+ <comment xml:lang="zh_TW">ODS 試算表</comment>
+ <acronym>ODS</acronym>
+ <expanded-acronym>OpenDocument Spreadsheet</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.spreadsheet" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.ods"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.spreadsheet-flat-xml">
+ <comment>ODS spreadsheet (Flat XML)</comment>
+ <comment xml:lang="ar">جدول ODS (Flat XML)</comment>
+ <comment xml:lang="bg">Таблица — ODS (само XML)</comment>
+ <comment xml:lang="ca">full de càlcul ODS (XML pla)</comment>
+ <comment xml:lang="cs">Sešit ODS (Flat XML)</comment>
+ <comment xml:lang="da">ODS-regneark (flad XML)</comment>
+ <comment xml:lang="de">ODS-Tabelle (Unkomprimiertes XML)</comment>
+ <comment xml:lang="es">hoja de cálculo ODS (XML plano)</comment>
+ <comment xml:lang="eu">ODS kalkulu-orria (XML soila)</comment>
+ <comment xml:lang="fo">ODS rokniark (Flat XML)</comment>
+ <comment xml:lang="fr">feuille de calcul ODS (XML plat)</comment>
+ <comment xml:lang="ga">scarbhileog ODS (XML cothrom)</comment>
+ <comment xml:lang="gl">folla de cálculo ODS (XML plano)</comment>
+ <comment xml:lang="he">גליון נתונים ODS‏ (XML פשוט)</comment>
+ <comment xml:lang="hu">ODS-táblázat (egyszerű XML)</comment>
+ <comment xml:lang="id">Lembar sebar ODS (Flat XML)</comment>
+ <comment xml:lang="it">Foglio di calcolo ODS (XML semplice)</comment>
+ <comment xml:lang="ja">ODS スプレッドシート (Flat XML)</comment>
+ <comment xml:lang="kk">ODS электрондық кестесі (Тек XML)</comment>
+ <comment xml:lang="ko">ODS 스프레드시트 (단일 XML)</comment>
+ <comment xml:lang="lt">ODS skaičialentė (Flat XML)</comment>
+ <comment xml:lang="lv">ODS izklājlapa (plakans XML)</comment>
+ <comment xml:lang="pl">Arkusz ODS (prosty XML)</comment>
+ <comment xml:lang="ro">Foaie de calcul ODS (XML simplu)</comment>
+ <comment xml:lang="ru">электронная таблица ODS (простой XML)</comment>
+ <comment xml:lang="sk">Zošit ODS (čisté XML)</comment>
+ <comment xml:lang="sl">Razpredelnica ODS (nepovezan XML)</comment>
+ <comment xml:lang="sv">ODS-kalkylblad (platt XML)</comment>
+ <comment xml:lang="uk">ел. таблиця ODS (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODS 工作簿(Flat XML)</comment>
+ <comment xml:lang="zh_TW">ODS 試算表 (Flat XML)</comment>
+ <acronym>FODS</acronym>
+ <expanded-acronym>OpenDocument Spreadsheet (Flat XML)</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.fods"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.spreadsheet-template">
+ <comment>ODS template</comment>
+ <comment xml:lang="ar">قالب ODS</comment>
+ <comment xml:lang="be@latin">Šablon ODS</comment>
+ <comment xml:lang="bg">Шаблон за таблици — ODS</comment>
+ <comment xml:lang="ca">plantilla ODS</comment>
+ <comment xml:lang="cs">Šablona ODS</comment>
+ <comment xml:lang="da">ODS-skabelon</comment>
+ <comment xml:lang="de">ODS-Vorlage</comment>
+ <comment xml:lang="en_GB">ODS template</comment>
+ <comment xml:lang="eo">ODS-ŝablono</comment>
+ <comment xml:lang="es">plantilla ODS</comment>
+ <comment xml:lang="eu">ODS txantiloia</comment>
+ <comment xml:lang="fi">ODS-malli</comment>
+ <comment xml:lang="fo">ODS formur</comment>
+ <comment xml:lang="fr">modèle ODS</comment>
+ <comment xml:lang="ga">teimpléad ODS</comment>
+ <comment xml:lang="gl">modelo ODS</comment>
+ <comment xml:lang="he">תבנית ODS</comment>
+ <comment xml:lang="hu">ODS-sablon</comment>
+ <comment xml:lang="id">Templat ODS</comment>
+ <comment xml:lang="it">Modello ODS</comment>
+ <comment xml:lang="ja">ODS テンプレート</comment>
+ <comment xml:lang="kk">ODS үлгісі</comment>
+ <comment xml:lang="ko">ODS 문서 서식</comment>
+ <comment xml:lang="lt">ODS šablonas</comment>
+ <comment xml:lang="lv">ODS veidne</comment>
+ <comment xml:lang="nb">ODS-mal</comment>
+ <comment xml:lang="nl">ODS-sjabloon</comment>
+ <comment xml:lang="nn">ODS-mal</comment>
+ <comment xml:lang="pl">Szablon ODS</comment>
+ <comment xml:lang="pt_BR">Modelo ODS</comment>
+ <comment xml:lang="ro">Șablon ODS</comment>
+ <comment xml:lang="ru">шаблон ODS</comment>
+ <comment xml:lang="sk">Šablóna ODS</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODS</comment>
+ <comment xml:lang="sq">Model ODS</comment>
+ <comment xml:lang="sv">ODS-mall</comment>
+ <comment xml:lang="uk">шаблон ODS</comment>
+ <comment xml:lang="vi">Mẫu ODS</comment>
+ <comment xml:lang="zh_CN">ODS 模板</comment>
+ <comment xml:lang="zh_TW">ODS 範本</comment>
+ <acronym>ODS</acronym>
+ <expanded-acronym>OpenDocument Spreadsheet</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.spreadsheet-template" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.ots"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.chart">
+ <comment>ODC chart</comment>
+ <comment xml:lang="ar">مخطط ODC</comment>
+ <comment xml:lang="be@latin">Dyjahrama ODC</comment>
+ <comment xml:lang="bg">Диаграма — ODC</comment>
+ <comment xml:lang="ca">diagrama ODC</comment>
+ <comment xml:lang="cs">Graf ODC</comment>
+ <comment xml:lang="da">ODC-diagram</comment>
+ <comment xml:lang="de">ODC-Diagramm</comment>
+ <comment xml:lang="en_GB">ODC chart</comment>
+ <comment xml:lang="eo">ODC-diagramo</comment>
+ <comment xml:lang="es">gráfica ODC</comment>
+ <comment xml:lang="eu">ODC diagrama</comment>
+ <comment xml:lang="fi">ODC-kaavio</comment>
+ <comment xml:lang="fo">ODC strikumynd</comment>
+ <comment xml:lang="fr">graphique ODC</comment>
+ <comment xml:lang="ga">cairt ODC</comment>
+ <comment xml:lang="gl">gráfica ODC</comment>
+ <comment xml:lang="he">תו ODC</comment>
+ <comment xml:lang="hu">ODC-táblázat</comment>
+ <comment xml:lang="id">Bagan ODC</comment>
+ <comment xml:lang="it">Grafico ODC</comment>
+ <comment xml:lang="ja">ODC チャート</comment>
+ <comment xml:lang="kk">ODC диаграммасы</comment>
+ <comment xml:lang="ko">ODC 차트</comment>
+ <comment xml:lang="lt">ODC diagrama</comment>
+ <comment xml:lang="lv">ODC diagramma</comment>
+ <comment xml:lang="nb">ODC-graf</comment>
+ <comment xml:lang="nl">ODC-grafiek</comment>
+ <comment xml:lang="nn">ODC-diagram</comment>
+ <comment xml:lang="pl">Wykres ODC</comment>
+ <comment xml:lang="pt_BR">Gráfico ODC</comment>
+ <comment xml:lang="ro">Diagramă ODC</comment>
+ <comment xml:lang="ru">диаграмма ODC</comment>
+ <comment xml:lang="sk">Graf ODC</comment>
+ <comment xml:lang="sl">Datoteka grafikona ODC</comment>
+ <comment xml:lang="sq">Grafik ODC</comment>
+ <comment xml:lang="sv">ODC-diagram</comment>
+ <comment xml:lang="uk">діаграма ODC</comment>
+ <comment xml:lang="vi">Sơ đồ ODC</comment>
+ <comment xml:lang="zh_CN">ODC 图表</comment>
+ <comment xml:lang="zh_TW">ODC 圖表</comment>
+ <acronym>ODC</acronym>
+ <expanded-acronym>OpenDocument Chart</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.chart" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odc"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.chart-template">
+ <comment>ODC template</comment>
+ <comment xml:lang="ar">قالب ODC</comment>
+ <comment xml:lang="bg">Шаблон за диаграми — ODC</comment>
+ <comment xml:lang="ca">plantilla ODC</comment>
+ <comment xml:lang="cs">Šablona ODC</comment>
+ <comment xml:lang="da">ODC-skabelon</comment>
+ <comment xml:lang="de">ODC-Vorlage</comment>
+ <comment xml:lang="eo">ODC-ŝablono</comment>
+ <comment xml:lang="es">plantilla ODC</comment>
+ <comment xml:lang="eu">ODC txantiloia</comment>
+ <comment xml:lang="fi">ODC-malli</comment>
+ <comment xml:lang="fo">ODC formur</comment>
+ <comment xml:lang="fr">modèle ODC</comment>
+ <comment xml:lang="ga">teimpléad ODC</comment>
+ <comment xml:lang="gl">modelo ODC</comment>
+ <comment xml:lang="he">תבנית ODC</comment>
+ <comment xml:lang="hu">ODC-sablon</comment>
+ <comment xml:lang="id">Templat ODC</comment>
+ <comment xml:lang="it">Modello ODC</comment>
+ <comment xml:lang="ja">ODC テンプレート</comment>
+ <comment xml:lang="kk">ODC үлгісі</comment>
+ <comment xml:lang="ko">ODC 문서 서식</comment>
+ <comment xml:lang="lt">ODC šablonas</comment>
+ <comment xml:lang="lv">ODC veidne</comment>
+ <comment xml:lang="nl">ODC-sjabloon</comment>
+ <comment xml:lang="pl">Szablon ODC</comment>
+ <comment xml:lang="pt_BR">Modelo ODC</comment>
+ <comment xml:lang="ro">Șablon ODC</comment>
+ <comment xml:lang="ru">шаблон ODC</comment>
+ <comment xml:lang="sk">Šablóna ODC</comment>
+ <comment xml:lang="sl">Predloga ODC</comment>
+ <comment xml:lang="sv">ODC-mall</comment>
+ <comment xml:lang="uk">шаблон ODC</comment>
+ <comment xml:lang="vi">Mẫu ODC</comment>
+ <comment xml:lang="zh_CN">ODC 模板</comment>
+ <comment xml:lang="zh_TW">ODC 範本</comment>
+ <acronym>ODC</acronym>
+ <expanded-acronym>OpenDocument Chart</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.chart-template" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.otc"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.formula">
+ <comment>ODF formula</comment>
+ <comment xml:lang="ar">صيغة ODF</comment>
+ <comment xml:lang="be@latin">Formuła ODF</comment>
+ <comment xml:lang="bg">Формула — ODF</comment>
+ <comment xml:lang="ca">fórmula ODF</comment>
+ <comment xml:lang="cs">Vzorec ODF</comment>
+ <comment xml:lang="da">ODF-formel</comment>
+ <comment xml:lang="de">ODF-Formel</comment>
+ <comment xml:lang="en_GB">ODF formula</comment>
+ <comment xml:lang="eo">ODF-formulo</comment>
+ <comment xml:lang="es">fórmula ODF</comment>
+ <comment xml:lang="eu">ODF formula</comment>
+ <comment xml:lang="fi">ODF-kaava</comment>
+ <comment xml:lang="fo">ODF frymil</comment>
+ <comment xml:lang="fr">formule ODF</comment>
+ <comment xml:lang="ga">foirmle ODF</comment>
+ <comment xml:lang="gl">Fórula ODF</comment>
+ <comment xml:lang="he">נוסחת ODF</comment>
+ <comment xml:lang="hu">ODF-képlet</comment>
+ <comment xml:lang="id">Formula ODF</comment>
+ <comment xml:lang="it">Formula ODF</comment>
+ <comment xml:lang="ja">ODF 計算式</comment>
+ <comment xml:lang="kk">ODF формуласы</comment>
+ <comment xml:lang="ko">ODF 수식</comment>
+ <comment xml:lang="lt">ODF formulė</comment>
+ <comment xml:lang="lv">ODF formula</comment>
+ <comment xml:lang="nb">ODF-formel</comment>
+ <comment xml:lang="nl">ODF-formule</comment>
+ <comment xml:lang="nn">ODF-formel</comment>
+ <comment xml:lang="pl">Formuła ODF</comment>
+ <comment xml:lang="pt_BR">Fórmula ODF</comment>
+ <comment xml:lang="ro">Formulă ODF</comment>
+ <comment xml:lang="ru">формула ODF</comment>
+ <comment xml:lang="sk">Vzorec ODF</comment>
+ <comment xml:lang="sl">Dokument formule ODF</comment>
+ <comment xml:lang="sq">Formulë ODF</comment>
+ <comment xml:lang="sv">ODF-formel</comment>
+ <comment xml:lang="uk">формула ODF</comment>
+ <comment xml:lang="vi">Công thức ODF</comment>
+ <comment xml:lang="zh_CN">ODF 公式</comment>
+ <comment xml:lang="zh_TW">ODF 公式</comment>
+ <acronym>ODF</acronym>
+ <expanded-acronym>OpenDocument Formula</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.formula" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odf"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.formula-template">
+ <comment>ODF template</comment>
+ <comment xml:lang="ar">قالب ODF</comment>
+ <comment xml:lang="bg">Шаблон за формули — ODF</comment>
+ <comment xml:lang="ca">plantilla ODF</comment>
+ <comment xml:lang="cs">Šablona ODF</comment>
+ <comment xml:lang="da">ODF-skabelon</comment>
+ <comment xml:lang="de">ODF-Vorlage</comment>
+ <comment xml:lang="eo">ODF-ŝablono</comment>
+ <comment xml:lang="es">plantilla ODF</comment>
+ <comment xml:lang="eu">ODF txantiloia</comment>
+ <comment xml:lang="fi">ODF-malli</comment>
+ <comment xml:lang="fo">ODF formur</comment>
+ <comment xml:lang="fr">modèle ODF</comment>
+ <comment xml:lang="ga">teimpléad ODF</comment>
+ <comment xml:lang="gl">modelo ODF</comment>
+ <comment xml:lang="he">תבנית ODF</comment>
+ <comment xml:lang="hu">ODG-sablon</comment>
+ <comment xml:lang="id">Templat ODF</comment>
+ <comment xml:lang="it">Modello ODF</comment>
+ <comment xml:lang="ja">ODF テンプレート</comment>
+ <comment xml:lang="kk">ODF үлгісі</comment>
+ <comment xml:lang="ko">ODF 문서 서식</comment>
+ <comment xml:lang="lt">ODF šablonas</comment>
+ <comment xml:lang="lv">ODF veidne</comment>
+ <comment xml:lang="nl">ODF-sjabloon</comment>
+ <comment xml:lang="pl">Szablon ODF</comment>
+ <comment xml:lang="pt_BR">Modelo ODF</comment>
+ <comment xml:lang="ro">Șablon ODF</comment>
+ <comment xml:lang="ru">шаблон ODF</comment>
+ <comment xml:lang="sk">Šablóna ODF</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODF</comment>
+ <comment xml:lang="sv">ODF-mall</comment>
+ <comment xml:lang="uk">шаблон ODF</comment>
+ <comment xml:lang="vi">Mẫu ODF</comment>
+ <comment xml:lang="zh_CN">ODF 模板</comment>
+ <comment xml:lang="zh_TW">ODF 範本</comment>
+ <acronym>ODF</acronym>
+ <expanded-acronym>OpenDocument Formula</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.formula-template" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.otf"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.database">
+ <comment>ODB database</comment>
+ <comment xml:lang="ar">قاعدة بيانات ODB</comment>
+ <comment xml:lang="be@latin">Baza źviestak ODB</comment>
+ <comment xml:lang="bg">База от данни — ODB</comment>
+ <comment xml:lang="ca">base de dades ODB</comment>
+ <comment xml:lang="cs">Databáze ODB</comment>
+ <comment xml:lang="da">ODB-database</comment>
+ <comment xml:lang="de">ODB-Datenbank</comment>
+ <comment xml:lang="en_GB">ODB database</comment>
+ <comment xml:lang="eo">ODB-datumbazo</comment>
+ <comment xml:lang="es">base de datos ODB</comment>
+ <comment xml:lang="eu">ODB datu-basea</comment>
+ <comment xml:lang="fi">ODB-tietokanta</comment>
+ <comment xml:lang="fo">ODB dátustovnur</comment>
+ <comment xml:lang="fr">base de données ODB</comment>
+ <comment xml:lang="ga">bunachar sonraí ODB</comment>
+ <comment xml:lang="gl">base de datos ODB</comment>
+ <comment xml:lang="he">בסיס נתונים ODB</comment>
+ <comment xml:lang="hu">ODB-adatbázis</comment>
+ <comment xml:lang="id">Basis data ODB</comment>
+ <comment xml:lang="it">Database ODB</comment>
+ <comment xml:lang="ja">ODB データベース</comment>
+ <comment xml:lang="kk">ODB дерекқоры</comment>
+ <comment xml:lang="ko">ODB 데이터베이스</comment>
+ <comment xml:lang="lt">ODB duomenų bazė</comment>
+ <comment xml:lang="lv">ODB datubāze</comment>
+ <comment xml:lang="nb">ODB-database</comment>
+ <comment xml:lang="nl">ODB-gegevensbank</comment>
+ <comment xml:lang="nn">ODB-database</comment>
+ <comment xml:lang="pl">Baza danych ODB</comment>
+ <comment xml:lang="pt_BR">Banco de dados ODB</comment>
+ <comment xml:lang="ro">Bază de date ODB</comment>
+ <comment xml:lang="ru">база данных ODB</comment>
+ <comment xml:lang="sk">Databáza ODB</comment>
+ <comment xml:lang="sl">Podatkovna zbirka ODB</comment>
+ <comment xml:lang="sq">Bazë me të dhëna ODB</comment>
+ <comment xml:lang="sv">ODB-databas</comment>
+ <comment xml:lang="uk">база даних ODB</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu ODB</comment>
+ <comment xml:lang="zh_CN">ODB 数据库</comment>
+ <comment xml:lang="zh_TW">ODB 資料庫</comment>
+ <acronym>ODB</acronym>
+ <expanded-acronym>OpenDocument Database</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.odb"/>
+ </mime-type>
+ <mime-type type="application/vnd.oasis.opendocument.image">
+ <comment>ODI image</comment>
+ <comment xml:lang="ar">صورة ODI</comment>
+ <comment xml:lang="be@latin">Vyjava ODI</comment>
+ <comment xml:lang="bg">Изображение — ODI</comment>
+ <comment xml:lang="ca">imatge ODI</comment>
+ <comment xml:lang="cs">Obrázek ODI</comment>
+ <comment xml:lang="da">ODI-billede</comment>
+ <comment xml:lang="de">ODI-Bild</comment>
+ <comment xml:lang="en_GB">ODI image</comment>
+ <comment xml:lang="eo">ODI-bildo</comment>
+ <comment xml:lang="es">imagen ODI</comment>
+ <comment xml:lang="eu">ODI irudia</comment>
+ <comment xml:lang="fi">ODI-kuva</comment>
+ <comment xml:lang="fo">ODI mynd</comment>
+ <comment xml:lang="fr">image ODI</comment>
+ <comment xml:lang="ga">íomhá ODI</comment>
+ <comment xml:lang="gl">imaxe ODI</comment>
+ <comment xml:lang="he">תמונת ODI</comment>
+ <comment xml:lang="hu">ODI-kép</comment>
+ <comment xml:lang="id">Citra ODI</comment>
+ <comment xml:lang="it">Immagine ODI</comment>
+ <comment xml:lang="ja">ODI 画像</comment>
+ <comment xml:lang="kk">ODI суреті</comment>
+ <comment xml:lang="ko">ODI 그림</comment>
+ <comment xml:lang="lt">ODI paveikslėlis</comment>
+ <comment xml:lang="lv">ODI attēls</comment>
+ <comment xml:lang="nb">ODI-bilde</comment>
+ <comment xml:lang="nl">ODI-afbeelding</comment>
+ <comment xml:lang="nn">ODI-bilete</comment>
+ <comment xml:lang="pl">Obraz ODI</comment>
+ <comment xml:lang="pt_BR">Imagem ODI</comment>
+ <comment xml:lang="ro">Imagine ODI</comment>
+ <comment xml:lang="ru">изображение ODI</comment>
+ <comment xml:lang="sk">Obrázok ODI</comment>
+ <comment xml:lang="sl">Slikovna datoteka ODI</comment>
+ <comment xml:lang="sq">Figurë ODI</comment>
+ <comment xml:lang="sv">ODI-bild</comment>
+ <comment xml:lang="uk">зображення ODI</comment>
+ <comment xml:lang="vi">Ảnh ODI</comment>
+ <comment xml:lang="zh_CN">ODI 图像</comment>
+ <comment xml:lang="zh_TW">ODI 影像</comment>
+ <acronym>ODI</acronym>
+ <expanded-acronym>OpenDocument Image</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/vnd.oasis.opendocument.image" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.odi"/>
+ </mime-type>
+ <mime-type type="application/vnd.openofficeorg.extension">
+ <comment>OpenOffice.org extension</comment>
+ <comment xml:lang="ar">امتداد OpenOffice.org</comment>
+ <comment xml:lang="be@latin">Pašyreńnie OpenOffice.org</comment>
+ <comment xml:lang="bg">Разширение — OpenOffice</comment>
+ <comment xml:lang="ca">extensió d'OpenOffice.org</comment>
+ <comment xml:lang="cs">Rozšíření OpenOffice.org</comment>
+ <comment xml:lang="da">OpenOffice.org-udvidelse</comment>
+ <comment xml:lang="de">OpenOffice.org-Erweiterung</comment>
+ <comment xml:lang="es">extensión de OpenOffice</comment>
+ <comment xml:lang="eu">OpenOffice.org luzapena</comment>
+ <comment xml:lang="fi">OpenOffice.org-laajennus</comment>
+ <comment xml:lang="fo">OpenOffice.org víðkan</comment>
+ <comment xml:lang="fr">extension OpenOffice.org</comment>
+ <comment xml:lang="ga">eisínteacht OpenOffice.org</comment>
+ <comment xml:lang="gl">Extensión de OpenOffice.org</comment>
+ <comment xml:lang="he">הרחבה של OpenOffice.org</comment>
+ <comment xml:lang="hu">OpenOffice.org kiterjesztés</comment>
+ <comment xml:lang="id">Ekstensi OpenOffice.org</comment>
+ <comment xml:lang="it">Estensione OpenOffice.org</comment>
+ <comment xml:lang="ja">OpenOffice.org 拡張機能</comment>
+ <comment xml:lang="kk">OpenOffice.org кеңейтуі</comment>
+ <comment xml:lang="ko">OpenOffice.org 확장</comment>
+ <comment xml:lang="lt">OpenOffice.org plėtinys</comment>
+ <comment xml:lang="lv">OpenOffice.org paplašinājums</comment>
+ <comment xml:lang="nl">OpenOffice.org-uitbreiding</comment>
+ <comment xml:lang="nn">OpenOffice Writer-utviding</comment>
+ <comment xml:lang="pl">Rozszerzenie OpenOffice.org</comment>
+ <comment xml:lang="pt_BR">Extensão do OpenOffice</comment>
+ <comment xml:lang="ro">Extensie OpenOffice.org</comment>
+ <comment xml:lang="ru">расширение OpenOffice.org</comment>
+ <comment xml:lang="sk">Rozšírenie OpenOffice.org</comment>
+ <comment xml:lang="sl">Razširitev OpenOffice.org</comment>
+ <comment xml:lang="sq">Shtojcë për OpenOffice.org</comment>
+ <comment xml:lang="sv">OpenOffice.org-tillägg</comment>
+ <comment xml:lang="uk">розширення OpenOffice.org</comment>
+ <comment xml:lang="vi">Phần mở rộng của OpenOffice.org</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org 扩展</comment>
+ <comment xml:lang="zh_TW">OpenOffice.org 擴充套件</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.oxt"/>
+ </mime-type>
+ <mime-type type="application/vnd.android.package-archive">
+ <comment>Android package</comment>
+ <comment xml:lang="bg">Пакет — Android</comment>
+ <comment xml:lang="ca">paquet d'Android</comment>
+ <comment xml:lang="cs">Balíčky systému Android</comment>
+ <comment xml:lang="de">Android-Paket</comment>
+ <comment xml:lang="eo">Android-pakaĵo</comment>
+ <comment xml:lang="es">Paquete de Android</comment>
+ <comment xml:lang="fi">Android-paketti</comment>
+ <comment xml:lang="fr">paquet Android</comment>
+ <comment xml:lang="gl">paquete de Android</comment>
+ <comment xml:lang="he">חבילת אנדרויד</comment>
+ <comment xml:lang="hu">Android csomag</comment>
+ <comment xml:lang="id">Paket Android</comment>
+ <comment xml:lang="it">Pacchetto Android</comment>
+ <comment xml:lang="ja">Android パッケージ</comment>
+ <comment xml:lang="kk">Android дестесі</comment>
+ <comment xml:lang="ko">안드로이드 패키지</comment>
+ <comment xml:lang="lv">Android pakotne</comment>
+ <comment xml:lang="pl">Pakiet Androida</comment>
+ <comment xml:lang="ru">пакет Android</comment>
+ <comment xml:lang="sl">Paket Android</comment>
+ <comment xml:lang="sv">Android-paket</comment>
+ <comment xml:lang="uk">пакунок Android</comment>
+ <comment xml:lang="zh_CN">Android</comment>
+ <comment xml:lang="zh_TW">Android 套件</comment>
+ <sub-class-of type="application/x-java-archive"/>
+ <glob pattern="*.apk"/>
+ </mime-type>
+ <mime-type type="application/vnd.symbian.install">
+ <comment>SIS package</comment>
+ <comment xml:lang="ar">حزمة SIS</comment>
+ <comment xml:lang="be@latin">Pakunak SIS</comment>
+ <comment xml:lang="bg">Пакет — SIS</comment>
+ <comment xml:lang="ca">paquet SIS</comment>
+ <comment xml:lang="cs">Balíček SIS</comment>
+ <comment xml:lang="da">SIS-pakke</comment>
+ <comment xml:lang="de">SIS-Paket</comment>
+ <comment xml:lang="eo">SIS-pakaĵo</comment>
+ <comment xml:lang="es">paquete SIS</comment>
+ <comment xml:lang="eu">SIS paketea</comment>
+ <comment xml:lang="fi">SIS-paketti</comment>
+ <comment xml:lang="fo">SIS pakki</comment>
+ <comment xml:lang="fr">paquet SIS</comment>
+ <comment xml:lang="ga">pacáiste SIS</comment>
+ <comment xml:lang="gl">paquete SIS</comment>
+ <comment xml:lang="he">חבילת SIS</comment>
+ <comment xml:lang="hu">SIS csomag</comment>
+ <comment xml:lang="id">Paket SIS</comment>
+ <comment xml:lang="it">Pacchetto SIS</comment>
+ <comment xml:lang="ja">SIS パッケージ</comment>
+ <comment xml:lang="kk">SIS дестесі</comment>
+ <comment xml:lang="ko">SIS 패키지</comment>
+ <comment xml:lang="lt">SIS paketas</comment>
+ <comment xml:lang="lv">SIS pakotne</comment>
+ <comment xml:lang="nb">SIS-pakke</comment>
+ <comment xml:lang="nl">SIS-pakket</comment>
+ <comment xml:lang="nn">SIS-pakke</comment>
+ <comment xml:lang="pl">Pakiet SIS</comment>
+ <comment xml:lang="pt_BR">Pacote SIS</comment>
+ <comment xml:lang="ro">Pachet SIS</comment>
+ <comment xml:lang="ru">пакет SIS</comment>
+ <comment xml:lang="sk">Balíček SIS</comment>
+ <comment xml:lang="sl">Datoteka paketa SIS</comment>
+ <comment xml:lang="sq">Paketë SIS</comment>
+ <comment xml:lang="sv">SIS-paket</comment>
+ <comment xml:lang="uk">пакунок SIS</comment>
+ <comment xml:lang="vi">Gói SIS</comment>
+ <comment xml:lang="zh_CN">SIS 软件包</comment>
+ <comment xml:lang="zh_TW">SIS 套件</comment>
+ <acronym>SIS</acronym>
+ <expanded-acronym>Symbian Installation File</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="0x10000419" type="little32" offset="8"/>
+ </magic>
+ <glob pattern="*.sis"/>
+ </mime-type>
+ <mime-type type="x-epoc/x-sisx-app">
+ <comment>SISX package</comment>
+ <comment xml:lang="ar">حزمة SISX</comment>
+ <comment xml:lang="be@latin">Pakunak SISX</comment>
+ <comment xml:lang="bg">Пакет — SISX</comment>
+ <comment xml:lang="ca">paquet SISX</comment>
+ <comment xml:lang="cs">Balíček SISX</comment>
+ <comment xml:lang="da">SISX-pakke</comment>
+ <comment xml:lang="de">SISX-Paket</comment>
+ <comment xml:lang="eo">SISX-pakaĵo</comment>
+ <comment xml:lang="es">paquete SISX</comment>
+ <comment xml:lang="eu">SISX paketea</comment>
+ <comment xml:lang="fi">SISX-paketti</comment>
+ <comment xml:lang="fo">SISX pakki</comment>
+ <comment xml:lang="fr">paquet SISX</comment>
+ <comment xml:lang="ga">pacáiste SISX</comment>
+ <comment xml:lang="gl">paquete SISX</comment>
+ <comment xml:lang="he">חבילת SISX</comment>
+ <comment xml:lang="hu">SISX csomag</comment>
+ <comment xml:lang="id">Paket SISX</comment>
+ <comment xml:lang="it">Pacchetto SISX</comment>
+ <comment xml:lang="ja">SISX パッケージ</comment>
+ <comment xml:lang="kk">SISX дестесі</comment>
+ <comment xml:lang="ko">SISX 패키지</comment>
+ <comment xml:lang="lt">SISX paketas</comment>
+ <comment xml:lang="lv">SISX pakotne</comment>
+ <comment xml:lang="nb">SISX-pakke</comment>
+ <comment xml:lang="nl">SISX-pakket</comment>
+ <comment xml:lang="nn">SISX-pakke</comment>
+ <comment xml:lang="pl">Pakiet SISX</comment>
+ <comment xml:lang="pt_BR">Pacote SISX</comment>
+ <comment xml:lang="ro">Pachet SISX</comment>
+ <comment xml:lang="ru">пакет SISX</comment>
+ <comment xml:lang="sk">Balíček SISX</comment>
+ <comment xml:lang="sl">Datoteka paketa SISX</comment>
+ <comment xml:lang="sq">Paketë SISX</comment>
+ <comment xml:lang="sv">SISX-paket</comment>
+ <comment xml:lang="uk">пакунок SISX</comment>
+ <comment xml:lang="vi">Gói SISX</comment>
+ <comment xml:lang="zh_CN">SISX 软件包</comment>
+ <comment xml:lang="zh_TW">SISX 套件</comment>
+ <acronym>SIS</acronym>
+ <expanded-acronym>Symbian Installation File</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="0x10201a7a" type="little32" offset="0"/>
+ </magic>
+ <glob pattern="*.sisx"/>
+ </mime-type>
+ <mime-type type="application/vnd.tcpdump.pcap">
+ <comment>Network Packet Capture</comment>
+ <comment xml:lang="bg">Прихванати пакети по мрежата</comment>
+ <comment xml:lang="ca">captura de paquets de xarxa</comment>
+ <comment xml:lang="cs">Network Packet Capture</comment>
+ <comment xml:lang="de">Netzwerk-Paketmitschnitt</comment>
+ <comment xml:lang="es">Caputra de paquete de red</comment>
+ <comment xml:lang="fr">capture de paquet réseau</comment>
+ <comment xml:lang="gl">Captura de Network Packet</comment>
+ <comment xml:lang="he">לכידה של מנות נתונים ברשת</comment>
+ <comment xml:lang="hu">Hálózati csomagelfogás</comment>
+ <comment xml:lang="id">Tangkapan Paket Jaringan</comment>
+ <comment xml:lang="it">Cattura pacchetti rete</comment>
+ <comment xml:lang="ja">ネットワークパケットキャプチャー</comment>
+ <comment xml:lang="kk">ұсталған желілік пакеттер</comment>
+ <comment xml:lang="ko">네트워크 패킷 캡처</comment>
+ <comment xml:lang="lv">Network Packet Capture</comment>
+ <comment xml:lang="pl">Przechwycenie pakietu sieciowego</comment>
+ <comment xml:lang="ru">захваченные сетевые пакеты</comment>
+ <comment xml:lang="sl">Zajem omrežnih paketov</comment>
+ <comment xml:lang="uk">перехоплені дані мережевих пакетів</comment>
+ <comment xml:lang="zh_TW">網路封包捕捉</comment>
+ <magic priority="50">
+ <match value="0xa1b2c3d4" type="host32" offset="0"/>
+ <match value="0xd4c3b2a1" type="host32" offset="0"/>
+ </magic>
+ <glob pattern="*.pcap"/>
+ <glob pattern="*.cap"/>
+ <glob pattern="*.dmp"/>
+ <alias type="application/x-pcap"/>
+ <alias type="application/pcap"/>
+ </mime-type>
+ <mime-type type="application/vnd.wordperfect">
+ <comment>WordPerfect document</comment>
+ <comment xml:lang="ar">مستند WordPerfect</comment>
+ <comment xml:lang="az">WordPerfect sənədi</comment>
+ <comment xml:lang="be@latin">Dakument WordPerfect</comment>
+ <comment xml:lang="bg">Документ — WordPerfect</comment>
+ <comment xml:lang="ca">document de WordPerfect</comment>
+ <comment xml:lang="cs">Dokument WordPerfect</comment>
+ <comment xml:lang="cy">Dogfen WordPerfect</comment>
+ <comment xml:lang="da">WordPerfect-dokument</comment>
+ <comment xml:lang="de">WordPerfect-Dokument</comment>
+ <comment xml:lang="el">έγγραφο WordPerfect</comment>
+ <comment xml:lang="en_GB">WordPerfect document</comment>
+ <comment xml:lang="eo">WordPerfect-dokumento</comment>
+ <comment xml:lang="es">documento de WordPerfect</comment>
+ <comment xml:lang="eu">WordPerfect dokumentua</comment>
+ <comment xml:lang="fi">WordPerfect-asiakirja</comment>
+ <comment xml:lang="fo">WordPerfect skjal</comment>
+ <comment xml:lang="fr">document WordPerfect</comment>
+ <comment xml:lang="ga">cáipéis WordPerfect</comment>
+ <comment xml:lang="gl">documento de WordPerfect</comment>
+ <comment xml:lang="he">מסמך WordPerfect</comment>
+ <comment xml:lang="hu">WordPerfect-dokumentum</comment>
+ <comment xml:lang="id">Dokumen WordPerfect</comment>
+ <comment xml:lang="it">Documento WordPerfect</comment>
+ <comment xml:lang="ja">WordPerfect ドキュメント</comment>
+ <comment xml:lang="kk">WordPerfect құжаты</comment>
+ <comment xml:lang="ko">워드퍼펙트 문서</comment>
+ <comment xml:lang="lt">WordPerfect dokumentas</comment>
+ <comment xml:lang="lv">WordPerfect dokuments</comment>
+ <comment xml:lang="ms">Dokumen WordPerfect</comment>
+ <comment xml:lang="nb">WordPerfect-dokument</comment>
+ <comment xml:lang="nl">WordPerfect-document</comment>
+ <comment xml:lang="nn">WordPerfect-dokument</comment>
+ <comment xml:lang="pl">Dokument WordPerfect</comment>
+ <comment xml:lang="pt">documento do WordPerfect</comment>
+ <comment xml:lang="pt_BR">Documento do WordPerfect</comment>
+ <comment xml:lang="ro">Document WordPerfect</comment>
+ <comment xml:lang="ru">документ WordPerfect</comment>
+ <comment xml:lang="sk">Dokument WordPerfect</comment>
+ <comment xml:lang="sl">Dokument WordPerfect</comment>
+ <comment xml:lang="sq">Dokument WordPerfect</comment>
+ <comment xml:lang="sr">WordPerfect документ</comment>
+ <comment xml:lang="sv">WordPerfect-dokument</comment>
+ <comment xml:lang="uk">документ WordPerfect</comment>
+ <comment xml:lang="vi">Tài liệu WordPerfect</comment>
+ <comment xml:lang="zh_CN">WordPerfect 文档</comment>
+ <comment xml:lang="zh_TW">WordPerfect 文件</comment>
+ <alias type="application/x-wordperfect"/>
+ <alias type="application/wordperfect"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="WPC" type="string" offset="1"/>
+
+ </magic>
+ <glob pattern="*.wp"/>
+ <glob pattern="*.wp4"/>
+ <glob pattern="*.wp5"/>
+ <glob pattern="*.wp6"/>
+ <glob pattern="*.wpd"/>
+ <glob pattern="*.wpp"/>
+ </mime-type>
+ <mime-type type="application/x-spss-por">
+ <comment>SPSS Portable Data File</comment>
+ <comment xml:lang="ar">ملف بيانات SPSS متنقلة</comment>
+ <comment xml:lang="bg">Данни — SPSS, преносими</comment>
+ <comment xml:lang="ca">fitxer de dades portables SPSS</comment>
+ <comment xml:lang="cs">Soubor přenositelných dat SPSS</comment>
+ <comment xml:lang="da">Portabel SPSS-datafil</comment>
+ <comment xml:lang="de">SPSS portable Datendatei</comment>
+ <comment xml:lang="es">archivo de datos portable SPSS</comment>
+ <comment xml:lang="eu">SPSS datuen fitxategi eramangarria</comment>
+ <comment xml:lang="fo">SPSS flytifør dátufíla</comment>
+ <comment xml:lang="fr">fichier portable de données SPSS</comment>
+ <comment xml:lang="ga">comhad iniompartha sonraí SPSS</comment>
+ <comment xml:lang="gl">ficheiro de datos portábel SPSS</comment>
+ <comment xml:lang="he">קובץ מידע נייד SPSS</comment>
+ <comment xml:lang="hu">SPSS hordozható adatfájl</comment>
+ <comment xml:lang="id">Berkas Data Portabel SPSS</comment>
+ <comment xml:lang="it">File dati SPSS Portable</comment>
+ <comment xml:lang="ja">SPSS ポータブルデータファイル</comment>
+ <comment xml:lang="kk">SPSS тасымалы ақпарат файлы</comment>
+ <comment xml:lang="ko">SPSS 이동식 데이터 파일</comment>
+ <comment xml:lang="lt">SPSS perkeliamų duomenų failas</comment>
+ <comment xml:lang="lv">SPSS pārvietojamu datu fails</comment>
+ <comment xml:lang="pl">Plik przenośnych danych SPSS</comment>
+ <comment xml:lang="ro">Fișier portabil de date SPSS</comment>
+ <comment xml:lang="ru">файл переносимых данных SPSS</comment>
+ <comment xml:lang="sk">Súbor prenosných dát SPSS</comment>
+ <comment xml:lang="sl">Prenosna podatkovna datoteka SPSS</comment>
+ <comment xml:lang="sv">Portabel SPSS-datafil</comment>
+ <comment xml:lang="uk">файл даних SPSS Portable</comment>
+ <comment xml:lang="zh_CN">SPSS 便携式数据文件</comment>
+ <comment xml:lang="zh_TW">SPSS 可攜式資料檔</comment>
+ <magic priority="50">
+ <match value="ASCII SPSS PORT FILE" type="string" offset="40"/>
+ </magic>
+ <glob pattern="*.por"/>
+ </mime-type>
+ <mime-type type="application/x-spss-sav">
+ <comment>SPSS Data File</comment>
+ <comment xml:lang="ar">ملف بيانات SPSS</comment>
+ <comment xml:lang="bg">Данни — SPSS</comment>
+ <comment xml:lang="ca">fitxer de dades SPSS</comment>
+ <comment xml:lang="cs">Datový soubor SPSS</comment>
+ <comment xml:lang="da">SPSS-datafil</comment>
+ <comment xml:lang="de">SPSS-Datendatei</comment>
+ <comment xml:lang="es">archivo de datos SPSS</comment>
+ <comment xml:lang="eu">SPSS datuen fitxategia</comment>
+ <comment xml:lang="fo">SPSS dátufíla</comment>
+ <comment xml:lang="fr">fichier de données SPSS</comment>
+ <comment xml:lang="ga">comhad sonraí SPSS</comment>
+ <comment xml:lang="gl">ficheiro de datos SPSS</comment>
+ <comment xml:lang="he">קובץ מידע SPSS</comment>
+ <comment xml:lang="hu">SPSS adatfájl</comment>
+ <comment xml:lang="id">Berkas Data SPSS</comment>
+ <comment xml:lang="it">File dati SPSS</comment>
+ <comment xml:lang="ja">SPSS データファイル</comment>
+ <comment xml:lang="kk">SPSS ақпарат файлы</comment>
+ <comment xml:lang="ko">SPSS 데이터 파일</comment>
+ <comment xml:lang="lt">SPSS duomenų failas</comment>
+ <comment xml:lang="lv">SPSS datu fails</comment>
+ <comment xml:lang="pl">Plik danych SPSS</comment>
+ <comment xml:lang="ro">Fișier date SPSS</comment>
+ <comment xml:lang="ru">файл данных SPSS</comment>
+ <comment xml:lang="sk">Dátový súbor SPSS</comment>
+ <comment xml:lang="sl">Podatkovna datoteka SPSS</comment>
+ <comment xml:lang="sv">SPSS-datafil</comment>
+ <comment xml:lang="uk">файл даних SPSS</comment>
+ <comment xml:lang="zh_CN">SPSS 数据文件</comment>
+ <comment xml:lang="zh_TW">SPSS 資料檔</comment>
+ <alias type="application/x-spss-savefile"/>
+ <magic priority="50">
+ <match value="$FL2" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.sav"/>
+ </mime-type>
+ <mime-type type="application/x-xbel">
+ <comment>XBEL bookmarks</comment>
+ <comment xml:lang="ar">علامات XBEL</comment>
+ <comment xml:lang="be@latin">Zakładki XBEL</comment>
+ <comment xml:lang="bg">Отметки — XBEL</comment>
+ <comment xml:lang="ca">llista d'adreces d'interès XBEL</comment>
+ <comment xml:lang="cs">Záložky XBEL</comment>
+ <comment xml:lang="da">XBEL-bogmærker</comment>
+ <comment xml:lang="de">XBEL-Lesezeichen</comment>
+ <comment xml:lang="el">σελιδοδείκτες XBEL</comment>
+ <comment xml:lang="en_GB">XBEL bookmarks</comment>
+ <comment xml:lang="eo">XBEL-legosignoj</comment>
+ <comment xml:lang="es">marcadores XBEL</comment>
+ <comment xml:lang="eu">XBEL laster-markak</comment>
+ <comment xml:lang="fi">XBEL-kirjanmerkit</comment>
+ <comment xml:lang="fo">XBEL bókamerki</comment>
+ <comment xml:lang="fr">marque-pages XBEL</comment>
+ <comment xml:lang="ga">leabharmharcanna XBEL</comment>
+ <comment xml:lang="gl">Marcadores XBEL</comment>
+ <comment xml:lang="he">סמניית XBEL</comment>
+ <comment xml:lang="hu">XBEL-könyvjelzők</comment>
+ <comment xml:lang="id">Bookmark XBEL</comment>
+ <comment xml:lang="it">Segnalibri XBEL</comment>
+ <comment xml:lang="ja">XBEL ブックマーク</comment>
+ <comment xml:lang="kk">XBEL бетбелгілері</comment>
+ <comment xml:lang="ko">XBEL 책갈피</comment>
+ <comment xml:lang="lt">XBEL žymelės</comment>
+ <comment xml:lang="lv">XBEL grāmatzīmes</comment>
+ <comment xml:lang="ms">Tandabuku XBEL</comment>
+ <comment xml:lang="nb">XBEL-bokmerker</comment>
+ <comment xml:lang="nl">XBEL-bladwijzers</comment>
+ <comment xml:lang="nn">XBEL-bokmerker</comment>
+ <comment xml:lang="pl">Zakładki XBEL</comment>
+ <comment xml:lang="pt">marcadores XBEL</comment>
+ <comment xml:lang="pt_BR">Marcadores do XBEL</comment>
+ <comment xml:lang="ro">Semne de carte XBEL</comment>
+ <comment xml:lang="ru">закладки XBEL</comment>
+ <comment xml:lang="sk">Záložky XBEL</comment>
+ <comment xml:lang="sl">Datoteka zaznamkov XBEL</comment>
+ <comment xml:lang="sq">Libërshënues XBEL</comment>
+ <comment xml:lang="sr">XBEL обележивачи</comment>
+ <comment xml:lang="sv">XBEL-bokmärken</comment>
+ <comment xml:lang="uk">закладки XBEL</comment>
+ <comment xml:lang="vi">Liên kết đã lưu XBEL</comment>
+ <comment xml:lang="zh_CN">XBEL 书签</comment>
+ <comment xml:lang="zh_TW">XBEL 格式書籤</comment>
+ <acronym>XBEL</acronym>
+ <expanded-acronym>XML Bookmark Exchange Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-html"/>
+ <magic priority="50">
+ <match value="&lt;!DOCTYPE\ xbel" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.xbel"/>
+ </mime-type>
+ <mime-type type="application/x-7z-compressed">
+ <comment>7-zip archive</comment>
+ <comment xml:lang="ar">أرشيف 7-zip</comment>
+ <comment xml:lang="be@latin">Archiŭ 7-zip</comment>
+ <comment xml:lang="bg">Архив — 7-zip</comment>
+ <comment xml:lang="ca">arxiu 7-zip</comment>
+ <comment xml:lang="cs">Archiv 7-zip</comment>
+ <comment xml:lang="da">7-zip-arkiv</comment>
+ <comment xml:lang="de">7zip-Archiv</comment>
+ <comment xml:lang="eo">7z-arkivo</comment>
+ <comment xml:lang="es">archivador 7-zip</comment>
+ <comment xml:lang="eu">7-zip artxiboa</comment>
+ <comment xml:lang="fi">7-zip-arkisto</comment>
+ <comment xml:lang="fo">7-zip skjalasavn</comment>
+ <comment xml:lang="fr">archive 7-zip</comment>
+ <comment xml:lang="ga">cartlann 7-zip</comment>
+ <comment xml:lang="gl">arquivo 7-zip</comment>
+ <comment xml:lang="he">ארכיון 7-zip</comment>
+ <comment xml:lang="hu">7-zip archívum</comment>
+ <comment xml:lang="id">Arsip 7-zip</comment>
+ <comment xml:lang="it">Archivio 7-zip</comment>
+ <comment xml:lang="ja">7-zip アーカイブ</comment>
+ <comment xml:lang="kk">7-zip архиві</comment>
+ <comment xml:lang="ko">7-ZIP 압축 파일</comment>
+ <comment xml:lang="lt">7-zip archyvas</comment>
+ <comment xml:lang="lv">7-zip arhīvs</comment>
+ <comment xml:lang="nb">7-zip-arkiv</comment>
+ <comment xml:lang="nl">7-zip-archief</comment>
+ <comment xml:lang="nn">7-zip-arkiv</comment>
+ <comment xml:lang="pl">Archiwum 7-zip</comment>
+ <comment xml:lang="pt_BR">Pacote 7-zip</comment>
+ <comment xml:lang="ro">Arhivă 7-zip</comment>
+ <comment xml:lang="ru">архив 7-zip</comment>
+ <comment xml:lang="sk">Archív 7-zip</comment>
+ <comment xml:lang="sl">Datoteka arhiva 7-zip</comment>
+ <comment xml:lang="sq">Arkiv 7-zip</comment>
+ <comment xml:lang="sv">7-zip-arkiv</comment>
+ <comment xml:lang="uk">архів 7-zip</comment>
+ <comment xml:lang="vi">Kho nén 7-zip</comment>
+ <comment xml:lang="zh_CN">7-zip 归档文件</comment>
+ <comment xml:lang="zh_TW">7-zip 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="7z\274\257\047\034" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.7z"/>
+ </mime-type>
+ <mime-type type="application/x-abiword">
+ <comment>AbiWord document</comment>
+ <comment xml:lang="ar">مستند آبي وورد</comment>
+ <comment xml:lang="be@latin">Dakument AbiWord</comment>
+ <comment xml:lang="bg">Документ — AbiWord</comment>
+ <comment xml:lang="ca">document d'AbiWord</comment>
+ <comment xml:lang="cs">Dokument AbiWord</comment>
+ <comment xml:lang="da">AbiWord-dokument</comment>
+ <comment xml:lang="de">AbiWord-Dokument</comment>
+ <comment xml:lang="el">έγγραφο AbiWord</comment>
+ <comment xml:lang="en_GB">AbiWord document</comment>
+ <comment xml:lang="eo">AbiWord-dokumento</comment>
+ <comment xml:lang="es">documento de Abiword</comment>
+ <comment xml:lang="eu">AbiWord dokumentua</comment>
+ <comment xml:lang="fi">AbiWord-asiakirja</comment>
+ <comment xml:lang="fo">AbiWord skjal</comment>
+ <comment xml:lang="fr">document AbiWord</comment>
+ <comment xml:lang="ga">cáipéis AbiWord</comment>
+ <comment xml:lang="gl">documento de AbiWord</comment>
+ <comment xml:lang="he">מסמך AbiWord</comment>
+ <comment xml:lang="hu">AbiWord-dokumentum</comment>
+ <comment xml:lang="id">Dokumen AbiWord</comment>
+ <comment xml:lang="it">Documento AbiWord</comment>
+ <comment xml:lang="ja">AbiWord ドキュメント</comment>
+ <comment xml:lang="kk">AbiWord құжаты</comment>
+ <comment xml:lang="ko">AbiWord 문서</comment>
+ <comment xml:lang="lt">AbiWord dokumentas</comment>
+ <comment xml:lang="lv">AbiWord dokuments</comment>
+ <comment xml:lang="ms">Dokumen AbiWord</comment>
+ <comment xml:lang="nb">AbiWord-dokument</comment>
+ <comment xml:lang="nl">AbiWord-document</comment>
+ <comment xml:lang="nn">AbiWord-dokument</comment>
+ <comment xml:lang="pl">Dokument AbiWord</comment>
+ <comment xml:lang="pt">documento AbiWord</comment>
+ <comment xml:lang="pt_BR">Documento do AbiWord</comment>
+ <comment xml:lang="ro">Document AbiWord</comment>
+ <comment xml:lang="ru">документ AbiWord</comment>
+ <comment xml:lang="sk">Dokument AbiWord</comment>
+ <comment xml:lang="sl">Dokument AbiWord</comment>
+ <comment xml:lang="sq">Dokument AbiWord</comment>
+ <comment xml:lang="sr">Абиворд документ</comment>
+ <comment xml:lang="sv">AbiWord-dokument</comment>
+ <comment xml:lang="uk">документ AbiWord</comment>
+ <comment xml:lang="vi">Tài liệu AbiWord</comment>
+ <comment xml:lang="zh_CN">AbiWord 文档</comment>
+ <comment xml:lang="zh_TW">AbiWord 文件</comment>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="&lt;abiword" type="string" offset="0:256"/>
+ <match value="&lt;!DOCTYPE abiword" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.abw"/>
+ <glob pattern="*.abw.CRASHED"/>
+ <glob pattern="*.abw.gz"/>
+ <glob pattern="*.zabw"/>
+ <root-XML namespaceURI="http://www.abisource.com/awml.dtd" localName="abiword"/>
+ </mime-type>
+ <mime-type type="application/x-cue">
+ <comment>CD image cuesheet</comment>
+ <comment xml:lang="ar">صفيحة صورة الـCD جديلة</comment>
+ <comment xml:lang="be@latin">Infarmacyjny arkuš vyjavy CD</comment>
+ <comment xml:lang="bg">Описание на изображение на CD</comment>
+ <comment xml:lang="ca">«cuesheet» d'imatge de CD</comment>
+ <comment xml:lang="cs">Rozvržení stop obrazu CD</comment>
+ <comment xml:lang="da">Cd-aftrykscuesheet</comment>
+ <comment xml:lang="de">CD-Abbild-Cuesheet</comment>
+ <comment xml:lang="en_GB">CD image cuesheet</comment>
+ <comment xml:lang="es">cue sheet de una imagen de CD</comment>
+ <comment xml:lang="eu">CD irudiaren CUE orria</comment>
+ <comment xml:lang="fi">CD-vedos cuesheet</comment>
+ <comment xml:lang="fr">index de pistes de CD</comment>
+ <comment xml:lang="ga">bileog chiúáil íomhá CD</comment>
+ <comment xml:lang="gl">cue sheet dunha imaxe de CD</comment>
+ <comment xml:lang="he">גליון נתונים לתמונת דיסק</comment>
+ <comment xml:lang="hu">CD kép cuesheet</comment>
+ <comment xml:lang="id">Citra cuesheet CD</comment>
+ <comment xml:lang="it">Cuesheet immagine CD</comment>
+ <comment xml:lang="ja">CD イメージキューシート</comment>
+ <comment xml:lang="kk">CD бейнесінің құрама кестесі</comment>
+ <comment xml:lang="ko">CD 이미지 큐시트</comment>
+ <comment xml:lang="lt">CD atvaizdžio aprašas</comment>
+ <comment xml:lang="lv">CD attēla rindulapa</comment>
+ <comment xml:lang="nb">Filliste for CD-avtrykk</comment>
+ <comment xml:lang="nl">CD-inhoudsopgave</comment>
+ <comment xml:lang="nn">CD-bilete-indeksfil</comment>
+ <comment xml:lang="pl">Obraz cuesheet płyty CD</comment>
+ <comment xml:lang="pt_BR">Índice de Imagem de CD</comment>
+ <comment xml:lang="ro">Imagine CD cuesheet</comment>
+ <comment xml:lang="ru">таблица содержания образа CD</comment>
+ <comment xml:lang="sk">Rozvrhnutie stôp obrazu CD</comment>
+ <comment xml:lang="sl">Datoteka razpredelnice odtisa CD cue</comment>
+ <comment xml:lang="sq">Cuesheet imazhi CD</comment>
+ <comment xml:lang="sv">Indexblad för cd-avbild</comment>
+ <comment xml:lang="uk">таблиця CUE образу CD</comment>
+ <comment xml:lang="vi">Tờ tín hiệu báo ảnh CD</comment>
+ <comment xml:lang="zh_CN">CD 映像标记文件</comment>
+ <comment xml:lang="zh_TW">CD 映像指示表</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.cue"/>
+ </mime-type>
+ <mime-type type="application/x-amipro">
+ <comment>Lotus AmiPro document</comment>
+ <comment xml:lang="ar">مستند Lotus AmiPro</comment>
+ <comment xml:lang="az">Lotus AmiPro sənədi</comment>
+ <comment xml:lang="be@latin">Dakument Lotus AmiPro</comment>
+ <comment xml:lang="bg">Документ — Lotus AmiPro</comment>
+ <comment xml:lang="ca">document de Lotus AmiPro</comment>
+ <comment xml:lang="cs">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="cy">Dogfen Lotus AmiPro</comment>
+ <comment xml:lang="da">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="de">Lotus-AmiPro-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Lotus AmiPro</comment>
+ <comment xml:lang="en_GB">Lotus AmiPro document</comment>
+ <comment xml:lang="eo">dokumento de Lotus AmiPro</comment>
+ <comment xml:lang="es">documento de Lotus AmiPro</comment>
+ <comment xml:lang="eu">Lotus AmiPro dokumentua</comment>
+ <comment xml:lang="fi">Lotus AmiPro -asiakirja</comment>
+ <comment xml:lang="fo">Lotus AmiPro skjal</comment>
+ <comment xml:lang="fr">document Lotus AmiPro</comment>
+ <comment xml:lang="ga">cáipéis Lotus AmiPro</comment>
+ <comment xml:lang="gl">documento de Lotus AmiPro</comment>
+ <comment xml:lang="he">מסמך של Lotus AmiPro</comment>
+ <comment xml:lang="hu">Lotus AmiPro-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Lotus AmiPro</comment>
+ <comment xml:lang="it">Documento Lotus AmiPro</comment>
+ <comment xml:lang="ja">Lotus AmiPro ドキュメント</comment>
+ <comment xml:lang="kk">Lotus AmiPro құжаты</comment>
+ <comment xml:lang="ko">Lotus AmiPro 문서</comment>
+ <comment xml:lang="lt">Lotus AmiPro dokumentas</comment>
+ <comment xml:lang="lv">Lotus AmiPro dokuments</comment>
+ <comment xml:lang="ms">Dokumen Lotus AmiPro</comment>
+ <comment xml:lang="nb">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="nl">Lotus AmiPro-document</comment>
+ <comment xml:lang="nn">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="pl">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="pt">documento Lotus AmiPro</comment>
+ <comment xml:lang="pt_BR">Documento do Lotus AmiPro</comment>
+ <comment xml:lang="ro">Document Lotus AmiPro</comment>
+ <comment xml:lang="ru">документ Lotus AmiPro</comment>
+ <comment xml:lang="sk">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="sl">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="sq">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="sr">Лотус АмиПро документ</comment>
+ <comment xml:lang="sv">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="uk">документ Lotus AmiPro</comment>
+ <comment xml:lang="vi">Tài liệu Lotus AmiPro</comment>
+ <comment xml:lang="zh_CN">Lotus AmiPro 文档</comment>
+ <comment xml:lang="zh_TW">Lotus AmiPro 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.sam"/>
+ </mime-type>
+ <mime-type type="application/x-aportisdoc">
+ <comment>AportisDoc document</comment>
+ <comment xml:lang="ar">مستند AportisDoc</comment>
+ <comment xml:lang="bg">Документ — AportisDoc</comment>
+ <comment xml:lang="ca">document AportisDoc</comment>
+ <comment xml:lang="cs">Dokument AportisDoc</comment>
+ <comment xml:lang="da">AportisDoc-dokument</comment>
+ <comment xml:lang="de">AportisDoc-Dokument</comment>
+ <comment xml:lang="eo">AportisDoc-dokumento</comment>
+ <comment xml:lang="es">documento AportisDoc</comment>
+ <comment xml:lang="eu">AportisDoc dokumentua</comment>
+ <comment xml:lang="fi">AportisDoc-asiakirja</comment>
+ <comment xml:lang="fo">AportisDoc skjal</comment>
+ <comment xml:lang="fr">document AportisDoc</comment>
+ <comment xml:lang="ga">cáipéis AportisDoc</comment>
+ <comment xml:lang="gl">documento de AportiDoc</comment>
+ <comment xml:lang="he">מסמך AportisDoc</comment>
+ <comment xml:lang="hu">AportisDoc-dokumentum</comment>
+ <comment xml:lang="id">Dokumen AportisDoc</comment>
+ <comment xml:lang="it">Documento AportisDoc</comment>
+ <comment xml:lang="ja">AportisDoc ドキュメント</comment>
+ <comment xml:lang="kk">AportisDoc құжаты</comment>
+ <comment xml:lang="ko">AportisDoc 문서</comment>
+ <comment xml:lang="lt">AportisDoc dokumentas</comment>
+ <comment xml:lang="lv">AportisDoc dokuments</comment>
+ <comment xml:lang="nl">AportisDoc-document</comment>
+ <comment xml:lang="pl">Dokument AportisDoc</comment>
+ <comment xml:lang="pt_BR">Documento do AportisDoc</comment>
+ <comment xml:lang="ro">Document AportisDoc</comment>
+ <comment xml:lang="ru">документ AportisDoc</comment>
+ <comment xml:lang="sk">Dokument AportisDoc</comment>
+ <comment xml:lang="sl">Dokument AportisDoc</comment>
+ <comment xml:lang="sv">AportisDoc-dokument</comment>
+ <comment xml:lang="uk">документ AportisDoc</comment>
+ <comment xml:lang="vi">Tài liệu AportisDoc</comment>
+ <comment xml:lang="zh_CN">AportisDoc 文档</comment>
+ <comment xml:lang="zh_TW">AportisDoc 文件</comment>
+ <sub-class-of type="application/x-palm-database"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="TEXtREAd" type="string" offset="60"/>
+ <match value="TEXtTlDc" type="string" offset="60"/>
+ </magic>
+ <glob pattern="*.pdb"/>
+ <glob pattern="*.pdc"/>
+ </mime-type>
+ <mime-type type="application/x-applix-spreadsheet">
+ <comment>Applix Spreadsheets spreadsheet</comment>
+ <comment xml:lang="ar">جداول بيانات Applix</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Applix Spreadsheets</comment>
+ <comment xml:lang="bg">Таблица — Applix Spreadsheets</comment>
+ <comment xml:lang="ca">full de càlcul d'Applix Spreadsheets</comment>
+ <comment xml:lang="cs">Sešit Applix Spreadsheets</comment>
+ <comment xml:lang="da">Applix Spreadsheets-regneark</comment>
+ <comment xml:lang="de">Applix-Spreadsheets-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο Applix Spreadsheets</comment>
+ <comment xml:lang="en_GB">Applix Spreadsheets spreadsheet</comment>
+ <comment xml:lang="eo">sterntabelo de Applix Spreadsheets</comment>
+ <comment xml:lang="es">hoja de cálculo de Applix Spreadsheets</comment>
+ <comment xml:lang="eu">Applix Spreadsheets kalkulu-orria</comment>
+ <comment xml:lang="fi">Applix Spreadsheets -taulukko</comment>
+ <comment xml:lang="fo">Applix Spreadsheets rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Applix</comment>
+ <comment xml:lang="ga">scarbhileog Applix Spreadsheets</comment>
+ <comment xml:lang="gl">folla de cálculo de Applix</comment>
+ <comment xml:lang="he">גליון נתונים של Applix Spreadsheets</comment>
+ <comment xml:lang="hu">Applix Spreadsheets-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar Applix Spreadsheets</comment>
+ <comment xml:lang="it">Foglio di calcolo Applix Spreadsheets</comment>
+ <comment xml:lang="ja">Applix Spreadsheets スプレッドシート</comment>
+ <comment xml:lang="kk">Applix Spreadsheets электрондық кестесі</comment>
+ <comment xml:lang="ko">Applix 스프레드시트</comment>
+ <comment xml:lang="lt">Applix Spreadsheets skaičialentė</comment>
+ <comment xml:lang="lv">Applix Spreadsheets izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan Applix Spreadsheets</comment>
+ <comment xml:lang="nb">Applix Spreadsheets-regneark</comment>
+ <comment xml:lang="nl">Applix Spreadsheets-rekenblad</comment>
+ <comment xml:lang="nn">Applix Spreadsheets-dokument</comment>
+ <comment xml:lang="pl">Arkusz Applix Spreadsheets</comment>
+ <comment xml:lang="pt">folha de cálculo Applix Spreadsheets</comment>
+ <comment xml:lang="pt_BR">Planilha do Applix Spreadsheets</comment>
+ <comment xml:lang="ro">Foaie de calcul Applix</comment>
+ <comment xml:lang="ru">электронная таблица Applix Spreadsheets</comment>
+ <comment xml:lang="sk">Zošit Applix Spreadsheets</comment>
+ <comment xml:lang="sl">Razpredelnica Applix Spreadsheets</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh Applix Spreadsheets</comment>
+ <comment xml:lang="sr">Applix табеларни документ</comment>
+ <comment xml:lang="sv">Applix Spreadsheets-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Applix Spreadsheets</comment>
+ <comment xml:lang="vi">Bảng tính Applix Spreadsheets</comment>
+ <comment xml:lang="zh_CN">Applix Spreadsheets 工作簿</comment>
+ <comment xml:lang="zh_TW">Applix Spreadsheets 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="*BEGIN SPREADSHEETS" type="string" offset="0"/>
+ <match value="*BEGIN" type="string" offset="0">
+ <match value="SPREADSHEETS" type="string" offset="7"/>
+ </match>
+ </magic>
+ <glob pattern="*.as"/>
+ </mime-type>
+ <mime-type type="application/x-applix-word">
+ <comment>Applix Words document</comment>
+ <comment xml:lang="ar">مستند كلمات Applix</comment>
+ <comment xml:lang="az">Applix Words sənədi</comment>
+ <comment xml:lang="be@latin">Dakument Applix Words</comment>
+ <comment xml:lang="bg">Документ — Applix Words</comment>
+ <comment xml:lang="ca">document d'Applix Words</comment>
+ <comment xml:lang="cs">Dokument Applix Words</comment>
+ <comment xml:lang="cy">Dogfen Applix Words</comment>
+ <comment xml:lang="da">Applix Words-dokument</comment>
+ <comment xml:lang="de">Applix-Words-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Applix Words</comment>
+ <comment xml:lang="en_GB">Applix Words document</comment>
+ <comment xml:lang="eo">dokumento de Applix Words</comment>
+ <comment xml:lang="es">documento de Applix Words</comment>
+ <comment xml:lang="eu">Applix Words dokumentua</comment>
+ <comment xml:lang="fi">Applix Words -asiakirja</comment>
+ <comment xml:lang="fo">Applix Words skjal</comment>
+ <comment xml:lang="fr">document Applix Words</comment>
+ <comment xml:lang="ga">cáipéis Applix Words</comment>
+ <comment xml:lang="gl">documento de Applix Words</comment>
+ <comment xml:lang="he">מסמך של Applix Words</comment>
+ <comment xml:lang="hu">Applix Words-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Applix Words</comment>
+ <comment xml:lang="it">Documento Applix Words</comment>
+ <comment xml:lang="ja">Applix Words ドキュメント</comment>
+ <comment xml:lang="kk">Applix Words құжаты</comment>
+ <comment xml:lang="ko">Applix Words 문서</comment>
+ <comment xml:lang="lt">Applix Words dokumentas</comment>
+ <comment xml:lang="lv">Applix Words dokuments</comment>
+ <comment xml:lang="ms">Dokumen Perkataan Applix</comment>
+ <comment xml:lang="nb">Applix Words-dokument</comment>
+ <comment xml:lang="nl">Applix Words-document</comment>
+ <comment xml:lang="nn">Applix Words dokument</comment>
+ <comment xml:lang="pl">Dokument Applix Words</comment>
+ <comment xml:lang="pt">documento Applix Words</comment>
+ <comment xml:lang="pt_BR">Documento do Applix Words</comment>
+ <comment xml:lang="ro">Document Applix Words</comment>
+ <comment xml:lang="ru">документ Applix Words</comment>
+ <comment xml:lang="sk">Dokument Applix Words</comment>
+ <comment xml:lang="sl">Dokument Applix Words</comment>
+ <comment xml:lang="sq">Dokument Applix Words</comment>
+ <comment xml:lang="sr">Applix Words документ</comment>
+ <comment xml:lang="sv">Applix Words-dokument</comment>
+ <comment xml:lang="uk">документ Applix Words</comment>
+ <comment xml:lang="vi">Tài liệu Applix Words</comment>
+ <comment xml:lang="zh_CN">Applix Words 文档</comment>
+ <comment xml:lang="zh_TW">Applix Words 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="*BEGIN" type="string" offset="0">
+ <match value="WORDS" type="string" offset="7"/>
+ </match>
+ </magic>
+ <glob pattern="*.aw"/>
+ </mime-type>
+ <mime-type type="application/x-arc">
+ <comment>ARC archive</comment>
+ <comment xml:lang="ar">أرشيف ARC</comment>
+ <comment xml:lang="be@latin">Archiŭ ARC</comment>
+ <comment xml:lang="bg">Архив — ARC</comment>
+ <comment xml:lang="ca">arxiu ARC</comment>
+ <comment xml:lang="cs">Archiv ARC</comment>
+ <comment xml:lang="da">ARC-arkiv</comment>
+ <comment xml:lang="de">ARC-Archiv</comment>
+ <comment xml:lang="eo">ARC-arkivo</comment>
+ <comment xml:lang="es">archivador ARC</comment>
+ <comment xml:lang="eu">ARC artxiboa</comment>
+ <comment xml:lang="fi">ARC-arkisto</comment>
+ <comment xml:lang="fo">ARC skjalasavn</comment>
+ <comment xml:lang="fr">archive ARC</comment>
+ <comment xml:lang="ga">cartlann ARC</comment>
+ <comment xml:lang="gl">arquivo ARC</comment>
+ <comment xml:lang="he">ארכיון ARC</comment>
+ <comment xml:lang="hu">ARC-archívum</comment>
+ <comment xml:lang="id">Arsip ARC</comment>
+ <comment xml:lang="it">Archivio ARC</comment>
+ <comment xml:lang="ja">ARC アーカイブ</comment>
+ <comment xml:lang="kk">ARC архиві</comment>
+ <comment xml:lang="ko">ARC 압축 파일</comment>
+ <comment xml:lang="lt">ARC archyvas</comment>
+ <comment xml:lang="lv">ARC arhīvs</comment>
+ <comment xml:lang="nb">ARC-arkiv</comment>
+ <comment xml:lang="nl">ARC-archief</comment>
+ <comment xml:lang="nn">ARC-arkiv</comment>
+ <comment xml:lang="pl">Archiwum ARC</comment>
+ <comment xml:lang="pt_BR">Pacote ARC</comment>
+ <comment xml:lang="ro">Arhivă ARC</comment>
+ <comment xml:lang="ru">архив ARC</comment>
+ <comment xml:lang="sk">Archív ARC</comment>
+ <comment xml:lang="sl">Datoteka arhiva ARC</comment>
+ <comment xml:lang="sq">Arkiv ARC</comment>
+ <comment xml:lang="sv">ARC-arkiv</comment>
+ <comment xml:lang="uk">архів ARC</comment>
+ <comment xml:lang="vi">Kho nén ARC</comment>
+ <comment xml:lang="zh_CN">ARC 归档文件</comment>
+ <comment xml:lang="zh_TW">ARC 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="0x0000081a" type="little32" offset="0" mask="0x8080ffff"/>
+ <match value="0x0000091a" type="little32" offset="0" mask="0x8080ffff"/>
+ <match value="0x0000021a" type="little32" offset="0" mask="0x8080ffff"/>
+ <match value="0x0000031a" type="little32" offset="0" mask="0x8080ffff"/>
+ <match value="0x0000041a" type="little32" offset="0" mask="0x8080ffff"/>
+ <match value="0x0000061a" type="little32" offset="0" mask="0x8080ffff"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-archive">
+ <comment>AR archive</comment>
+ <comment xml:lang="ar">أرشيف AR</comment>
+ <comment xml:lang="be@latin">Archiŭ AR</comment>
+ <comment xml:lang="bg">Архив — AR</comment>
+ <comment xml:lang="ca">arxiu AR</comment>
+ <comment xml:lang="cs">Archiv AR</comment>
+ <comment xml:lang="da">AR-arkiv</comment>
+ <comment xml:lang="de">AR-Archiv</comment>
+ <comment xml:lang="el">σρχείο AR</comment>
+ <comment xml:lang="en_GB">AR archive</comment>
+ <comment xml:lang="eo">AR-arkivo</comment>
+ <comment xml:lang="es">archivador AR</comment>
+ <comment xml:lang="eu">AR artxiboa</comment>
+ <comment xml:lang="fi">AR-arkisto</comment>
+ <comment xml:lang="fo">AR skjalasavn</comment>
+ <comment xml:lang="fr">archive AR</comment>
+ <comment xml:lang="ga">cartlann AR</comment>
+ <comment xml:lang="gl">arquivo AR</comment>
+ <comment xml:lang="he">ארכיון AR</comment>
+ <comment xml:lang="hu">AR-archívum</comment>
+ <comment xml:lang="id">Arsip AR</comment>
+ <comment xml:lang="it">Archivio AR</comment>
+ <comment xml:lang="ja">AR アーカイブ</comment>
+ <comment xml:lang="kk">AR архиві</comment>
+ <comment xml:lang="ko">AR 묶음 파일</comment>
+ <comment xml:lang="lt">AR archyvas</comment>
+ <comment xml:lang="lv">AR arhīvs</comment>
+ <comment xml:lang="ms">Arkib AR</comment>
+ <comment xml:lang="nb">AR-arkiv</comment>
+ <comment xml:lang="nl">AR-archief</comment>
+ <comment xml:lang="nn">AR-arkiv</comment>
+ <comment xml:lang="pl">Archiwum AR</comment>
+ <comment xml:lang="pt">arquivo AR</comment>
+ <comment xml:lang="pt_BR">Pacote AR</comment>
+ <comment xml:lang="ro">Arhivă AR</comment>
+ <comment xml:lang="ru">архив AR</comment>
+ <comment xml:lang="sk">Archív AR</comment>
+ <comment xml:lang="sl">Datoteka arhiva AR</comment>
+ <comment xml:lang="sq">Arkiv AR</comment>
+ <comment xml:lang="sr">АР архива</comment>
+ <comment xml:lang="sv">AR-arkiv</comment>
+ <comment xml:lang="uk">архів AR</comment>
+ <comment xml:lang="vi">Kho nén AR</comment>
+ <comment xml:lang="zh_CN">AR 归档文件</comment>
+ <comment xml:lang="zh_TW">AR 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="45">
+ <match value="&lt;ar&gt;" type="string" offset="0"/>
+ <match value="!&lt;arch&gt;" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.a"/>
+ </mime-type>
+ <mime-type type="application/x-arj">
+ <comment>ARJ archive</comment>
+ <comment xml:lang="ar">أرشيف ARJ</comment>
+ <comment xml:lang="az">ARJ arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ ARJ</comment>
+ <comment xml:lang="bg">Архив — ARJ</comment>
+ <comment xml:lang="ca">arxiu ARJ</comment>
+ <comment xml:lang="cs">Archiv ARJ</comment>
+ <comment xml:lang="cy">Archif ARJ</comment>
+ <comment xml:lang="da">ARJ-arkiv</comment>
+ <comment xml:lang="de">ARJ-Archiv</comment>
+ <comment xml:lang="el">αρχείο ARJ</comment>
+ <comment xml:lang="en_GB">ARJ archive</comment>
+ <comment xml:lang="eo">ARJ-arkivo</comment>
+ <comment xml:lang="es">archivador ARJ</comment>
+ <comment xml:lang="eu">ARJ artxiboa</comment>
+ <comment xml:lang="fi">ARJ-arkisto</comment>
+ <comment xml:lang="fo">ARJ skjalasavn</comment>
+ <comment xml:lang="fr">archive ARJ</comment>
+ <comment xml:lang="ga">cartlann ARJ</comment>
+ <comment xml:lang="gl">arquivo ARJ</comment>
+ <comment xml:lang="he">ארכיון ARJ</comment>
+ <comment xml:lang="hu">ARJ-archívum</comment>
+ <comment xml:lang="id">Arsip ARJ</comment>
+ <comment xml:lang="it">Archivio ARJ</comment>
+ <comment xml:lang="ja">ARJ アーカイブ</comment>
+ <comment xml:lang="kk">ARJ архиві</comment>
+ <comment xml:lang="ko">ARJ 압축 파일</comment>
+ <comment xml:lang="lt">ARJ archyvas</comment>
+ <comment xml:lang="lv">ARJ arhīvs</comment>
+ <comment xml:lang="ms">Arkib ARJ</comment>
+ <comment xml:lang="nb">ARJ-arkiv</comment>
+ <comment xml:lang="nl">ARJ-archief</comment>
+ <comment xml:lang="nn">ARJ-arkiv</comment>
+ <comment xml:lang="pl">Archiwum ARJ</comment>
+ <comment xml:lang="pt">arquivo ARJ</comment>
+ <comment xml:lang="pt_BR">Pacote ARJ</comment>
+ <comment xml:lang="ro">Arhivă ARJ</comment>
+ <comment xml:lang="ru">архив ARJ</comment>
+ <comment xml:lang="sk">Archív ARJ</comment>
+ <comment xml:lang="sl">Datoteka arhiva ARJ</comment>
+ <comment xml:lang="sq">Arkiv ARJ</comment>
+ <comment xml:lang="sr">ARJ архива</comment>
+ <comment xml:lang="sv">ARJ-arkiv</comment>
+ <comment xml:lang="uk">архів ARJ</comment>
+ <comment xml:lang="vi">Kho nén ARJ</comment>
+ <comment xml:lang="zh_CN">ARJ 归档文件</comment>
+ <comment xml:lang="zh_TW">ARJ 封存檔</comment>
+ <acronym>ARJ</acronym>
+ <expanded-acronym>Archived by Robert Jung</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="0xea60" type="little16" offset="0"/>
+ </magic>
+ <glob pattern="*.arj"/>
+ </mime-type>
+ <mime-type type="application/x-asp">
+ <comment>ASP page</comment>
+ <comment xml:lang="ar">صفحة ASP</comment>
+ <comment xml:lang="be@latin">Staronka ASP</comment>
+ <comment xml:lang="bg">Страница — ASP</comment>
+ <comment xml:lang="ca">pàgina ASP</comment>
+ <comment xml:lang="cs">Stránka ASP</comment>
+ <comment xml:lang="da">ASP-side</comment>
+ <comment xml:lang="de">ASP-Seite</comment>
+ <comment xml:lang="en_GB">ASP page</comment>
+ <comment xml:lang="eo">ASP-paĝo</comment>
+ <comment xml:lang="es">página ASP</comment>
+ <comment xml:lang="eu">ASP orria</comment>
+ <comment xml:lang="fi">ASP-sivu</comment>
+ <comment xml:lang="fo">ASP síða</comment>
+ <comment xml:lang="fr">page ASP</comment>
+ <comment xml:lang="ga">leathanach ASP</comment>
+ <comment xml:lang="gl">páxina ASP</comment>
+ <comment xml:lang="he">עמוד ASP</comment>
+ <comment xml:lang="hu">ASP oldal</comment>
+ <comment xml:lang="id">Halaman ASP</comment>
+ <comment xml:lang="it">Pagina ASP</comment>
+ <comment xml:lang="ja">ASP ページ</comment>
+ <comment xml:lang="kk">ASP парағы</comment>
+ <comment xml:lang="ko">ASP 페이지</comment>
+ <comment xml:lang="lt">ASP puslapis</comment>
+ <comment xml:lang="lv">ASP lapa</comment>
+ <comment xml:lang="nb">ASP-side</comment>
+ <comment xml:lang="nl">ASP-pagina</comment>
+ <comment xml:lang="nn">ASP-side</comment>
+ <comment xml:lang="pl">Strona ASP</comment>
+ <comment xml:lang="pt_BR">Página ASP</comment>
+ <comment xml:lang="ro">Pagină ASP</comment>
+ <comment xml:lang="ru">страница ASP</comment>
+ <comment xml:lang="sk">Stránka ASP</comment>
+ <comment xml:lang="sl">Datoteka spletne strani ASP</comment>
+ <comment xml:lang="sq">Faqe ASP</comment>
+ <comment xml:lang="sv">ASP-sida</comment>
+ <comment xml:lang="uk">сторінка ASP</comment>
+ <comment xml:lang="vi">Trang ASP</comment>
+ <comment xml:lang="zh_CN">ASP 页面</comment>
+ <comment xml:lang="zh_TW">ASP 頁面</comment>
+ <acronym>ASP</acronym>
+ <expanded-acronym>Active Server Page</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.asp"/>
+ </mime-type>
+ <mime-type type="application/x-awk">
+ <comment>AWK script</comment>
+ <comment xml:lang="ar">سكربت AWK</comment>
+ <comment xml:lang="az">AWK skripti</comment>
+ <comment xml:lang="be@latin">Skrypt AWK</comment>
+ <comment xml:lang="bg">Скрипт — AWK</comment>
+ <comment xml:lang="ca">script AWK</comment>
+ <comment xml:lang="cs">Skript AWK</comment>
+ <comment xml:lang="cy">Sgript AWK</comment>
+ <comment xml:lang="da">AWK-program</comment>
+ <comment xml:lang="de">AWK-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών AWK</comment>
+ <comment xml:lang="en_GB">AWK script</comment>
+ <comment xml:lang="eo">AWK-skripto</comment>
+ <comment xml:lang="es">script en AWK</comment>
+ <comment xml:lang="eu">AWK script-a</comment>
+ <comment xml:lang="fi">AWK-komentotiedosto</comment>
+ <comment xml:lang="fo">AWK boðrøð</comment>
+ <comment xml:lang="fr">script AWK</comment>
+ <comment xml:lang="ga">script AWK</comment>
+ <comment xml:lang="gl">script de AWK</comment>
+ <comment xml:lang="he">תסריט AWK</comment>
+ <comment xml:lang="hu">AWK-parancsfájl</comment>
+ <comment xml:lang="id">Skrip AWK</comment>
+ <comment xml:lang="it">Script AWK</comment>
+ <comment xml:lang="ja">AWK スクリプト</comment>
+ <comment xml:lang="kk">AWK сценарийі</comment>
+ <comment xml:lang="ko">AWK 스크립트</comment>
+ <comment xml:lang="lt">AWK scenarijus</comment>
+ <comment xml:lang="lv">AWK skripts</comment>
+ <comment xml:lang="ms">Skrip AWK</comment>
+ <comment xml:lang="nb">AWK-skript</comment>
+ <comment xml:lang="nl">AWK-script</comment>
+ <comment xml:lang="nn">WAK-skript</comment>
+ <comment xml:lang="pl">Skrypt AWK</comment>
+ <comment xml:lang="pt">'script' AWK</comment>
+ <comment xml:lang="pt_BR">Script AWK</comment>
+ <comment xml:lang="ro">Script AWK</comment>
+ <comment xml:lang="ru">сценарий AWK</comment>
+ <comment xml:lang="sk">Skript AWK</comment>
+ <comment xml:lang="sl">Skriptna datoteka AWK</comment>
+ <comment xml:lang="sq">Script AWK</comment>
+ <comment xml:lang="sr">AWK скрипта</comment>
+ <comment xml:lang="sv">AWK-skript</comment>
+ <comment xml:lang="uk">скрипт AWK</comment>
+ <comment xml:lang="vi">Văn lệnh AWK</comment>
+ <comment xml:lang="zh_CN">AWK 脚本</comment>
+ <comment xml:lang="zh_TW">AWK 指令稿</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic priority="50">
+ <match value="#!/bin/gawk" type="string" offset="0"/>
+ <match value="#! /bin/gawk" type="string" offset="0"/>
+ <match value="#!/usr/bin/gawk" type="string" offset="0"/>
+ <match value="#! /usr/bin/gawk" type="string" offset="0"/>
+ <match value="#!/usr/local/bin/gawk" type="string" offset="0"/>
+ <match value="#! /usr/local/bin/gawk" type="string" offset="0"/>
+ <match value="#!/bin/awk" type="string" offset="0"/>
+ <match value="#! /bin/awk" type="string" offset="0"/>
+ <match value="#!/usr/bin/awk" type="string" offset="0"/>
+ <match value="#! /usr/bin/awk" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.awk"/>
+ </mime-type>
+ <mime-type type="application/x-bcpio">
+ <comment>BCPIO document</comment>
+ <comment xml:lang="ar">مستند BCPIO</comment>
+ <comment xml:lang="az">BCPIO sənədi</comment>
+ <comment xml:lang="be@latin">Dakument BCPIO</comment>
+ <comment xml:lang="bg">Документ — BCPIO</comment>
+ <comment xml:lang="ca">document BCPIO</comment>
+ <comment xml:lang="cs">Dokument BCPIO</comment>
+ <comment xml:lang="cy">Dogfen BCPIO</comment>
+ <comment xml:lang="da">BCPIO-dokument</comment>
+ <comment xml:lang="de">BCPIO-Dokument</comment>
+ <comment xml:lang="el">έγγραφο BCPIO</comment>
+ <comment xml:lang="en_GB">BCPIO document</comment>
+ <comment xml:lang="eo">BCPIO-dokumento</comment>
+ <comment xml:lang="es">documento BCPIO</comment>
+ <comment xml:lang="eu">BCPIO dokumentua</comment>
+ <comment xml:lang="fi">BCPIO-asiakirja</comment>
+ <comment xml:lang="fo">BCPIO skjal</comment>
+ <comment xml:lang="fr">document BCPIO</comment>
+ <comment xml:lang="ga">cáipéis BCPIO</comment>
+ <comment xml:lang="gl">documento BCPIO</comment>
+ <comment xml:lang="he">מסמך של BCPO</comment>
+ <comment xml:lang="hu">BCPIO-dokumentum</comment>
+ <comment xml:lang="id">Dokumen BCPIO</comment>
+ <comment xml:lang="it">Documento BCPIO</comment>
+ <comment xml:lang="ja">BCPIO ドキュメント</comment>
+ <comment xml:lang="kk">BCPIO құжаты</comment>
+ <comment xml:lang="ko">BCPIO 문서</comment>
+ <comment xml:lang="lt">BCPIO dokumentas</comment>
+ <comment xml:lang="lv">BCPIO dokuments</comment>
+ <comment xml:lang="ms">Dokumen BCPIO</comment>
+ <comment xml:lang="nb">BCPIO-dokument</comment>
+ <comment xml:lang="nl">BCPIO-document</comment>
+ <comment xml:lang="nn">BCPIO-dokument</comment>
+ <comment xml:lang="pl">Dokument BCPIO</comment>
+ <comment xml:lang="pt">documento BCPIO</comment>
+ <comment xml:lang="pt_BR">Documento BCPIO</comment>
+ <comment xml:lang="ro">Document BCPIO</comment>
+ <comment xml:lang="ru">документ BCPIO</comment>
+ <comment xml:lang="sk">Dokument BCPIO</comment>
+ <comment xml:lang="sl">Dokument BCPIO</comment>
+ <comment xml:lang="sq">Dokument BCPIO</comment>
+ <comment xml:lang="sr">BCPIO документ</comment>
+ <comment xml:lang="sv">BCPIO-dokument</comment>
+ <comment xml:lang="uk">документ BCPIO</comment>
+ <comment xml:lang="vi">Tài liệu BCPIO</comment>
+ <comment xml:lang="zh_CN">BCPIO 文档</comment>
+ <comment xml:lang="zh_TW">BCPIO 文件</comment>
+ <acronym>BCPIO</acronym>
+ <expanded-acronym>Binary CPIO</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.bcpio"/>
+ </mime-type>
+ <mime-type type="application/x-bittorrent">
+ <comment>BitTorrent seed file</comment>
+ <comment xml:lang="ar">ملف باذر البت تورنت</comment>
+ <comment xml:lang="az">BitTorrent seed faylı</comment>
+ <comment xml:lang="be@latin">Fajł krynicy BitTorrent</comment>
+ <comment xml:lang="bg">Файл-източник — BitTorrent</comment>
+ <comment xml:lang="ca">fitxer llavor de BitTorrent</comment>
+ <comment xml:lang="cs">Soubor BitTorrent</comment>
+ <comment xml:lang="cy">Ffeil hadu BitTorrent</comment>
+ <comment xml:lang="da">BitTorrent-frøfil</comment>
+ <comment xml:lang="de">BitTorrent-Seed-Datei</comment>
+ <comment xml:lang="el">αρχείο BitTorrent seed</comment>
+ <comment xml:lang="en_GB">BitTorrent seed file</comment>
+ <comment xml:lang="eo">BitTorrent-semdosiero</comment>
+ <comment xml:lang="es">archivo semilla de BitTorrent</comment>
+ <comment xml:lang="eu">BitTorrent hazi-fitxategia</comment>
+ <comment xml:lang="fi">BitTorrent-siementiedosto</comment>
+ <comment xml:lang="fo">BitTorrent seed fíla</comment>
+ <comment xml:lang="fr">fichier graine BitTorrent</comment>
+ <comment xml:lang="ga">comhad síl BitTorrent</comment>
+ <comment xml:lang="gl">ficheiro de orixe BitTorrent</comment>
+ <comment xml:lang="he">קובץ זריעה של BitTorrent</comment>
+ <comment xml:lang="hu">BitTorrent-magfájl</comment>
+ <comment xml:lang="id">Berkas benih BitTorrent</comment>
+ <comment xml:lang="it">File seed BitTorrent</comment>
+ <comment xml:lang="ja">BitTorrent シードファイル</comment>
+ <comment xml:lang="kk">BitTorrent көз файлы</comment>
+ <comment xml:lang="ko">비트토렌트 시드 파일</comment>
+ <comment xml:lang="lt">BitTorrent šaltinio failas</comment>
+ <comment xml:lang="lv">BitTorrent avota fails</comment>
+ <comment xml:lang="ms">Fail seed BitTorrent</comment>
+ <comment xml:lang="nb">Fil med utgangsverdi for BitTorrent</comment>
+ <comment xml:lang="nl">BitTorrent-bestand</comment>
+ <comment xml:lang="nn">Nedlastingsfil for BitTorrent</comment>
+ <comment xml:lang="pl">Plik ziarna BitTorrent</comment>
+ <comment xml:lang="pt">ficheiro de origem BitTorrent</comment>
+ <comment xml:lang="pt_BR">Arquivo semente BitTorrent</comment>
+ <comment xml:lang="ro">Fișier sursă-completă BitTorrent</comment>
+ <comment xml:lang="ru">файл источника BitTorrent</comment>
+ <comment xml:lang="sk">Súbor BitTorrent</comment>
+ <comment xml:lang="sl">Datoteka sejanja BitTorrent</comment>
+ <comment xml:lang="sq">File bazë BitTorrent</comment>
+ <comment xml:lang="sr">Датотека са БитТорентовим полазиштима</comment>
+ <comment xml:lang="sv">BitTorrent-distributionsfil</comment>
+ <comment xml:lang="uk">файл поширення BitTorrent</comment>
+ <comment xml:lang="vi">Tải tập hạt BitTorrent</comment>
+ <comment xml:lang="zh_CN">BitTorrent 种子文件</comment>
+ <comment xml:lang="zh_TW">BitTorrent 種子檔</comment>
+ <magic priority="50">
+ <match value="d8:announce" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.torrent"/>
+ </mime-type>
+ <mime-type type="application/x-blender">
+ <comment>Blender scene</comment>
+ <comment xml:lang="ar">مشهد بلندر</comment>
+ <comment xml:lang="be@latin">Scena Blender</comment>
+ <comment xml:lang="bg">Сцена — Blender</comment>
+ <comment xml:lang="ca">escena Blender</comment>
+ <comment xml:lang="cs">Scéna Blender</comment>
+ <comment xml:lang="da">Blenderscene</comment>
+ <comment xml:lang="de">Blender-Szene</comment>
+ <comment xml:lang="el">σκηνή Blender</comment>
+ <comment xml:lang="en_GB">Blender scene</comment>
+ <comment xml:lang="eo">Blender-sceno</comment>
+ <comment xml:lang="es">escena de Blender</comment>
+ <comment xml:lang="eu">Blender-eko fitxategia</comment>
+ <comment xml:lang="fi">Blender-näkymä</comment>
+ <comment xml:lang="fo">Blender leikmynd</comment>
+ <comment xml:lang="fr">scène Blender</comment>
+ <comment xml:lang="ga">radharc Blender</comment>
+ <comment xml:lang="gl">escena de Blender</comment>
+ <comment xml:lang="he">סצנת Blender</comment>
+ <comment xml:lang="hu">Blender-jelenet</comment>
+ <comment xml:lang="id">Scene Blender</comment>
+ <comment xml:lang="it">Scena Blender</comment>
+ <comment xml:lang="ja">Blender シーン</comment>
+ <comment xml:lang="kk">Blender сахнасы</comment>
+ <comment xml:lang="ko">Blender 장면</comment>
+ <comment xml:lang="lt">Blender scena</comment>
+ <comment xml:lang="lv">Blender aina</comment>
+ <comment xml:lang="ms">Babak Blender</comment>
+ <comment xml:lang="nb">Blender-scene</comment>
+ <comment xml:lang="nl">Blender-scène</comment>
+ <comment xml:lang="nn">Blender-scene</comment>
+ <comment xml:lang="pl">Scena programu Blender</comment>
+ <comment xml:lang="pt">cenário Blender</comment>
+ <comment xml:lang="pt_BR">Cena do Blender</comment>
+ <comment xml:lang="ro">Scenă Blender</comment>
+ <comment xml:lang="ru">сцена Blender</comment>
+ <comment xml:lang="sk">Scéna Blender</comment>
+ <comment xml:lang="sl">Datoteka scene Blender</comment>
+ <comment xml:lang="sq">Skenë Blender</comment>
+ <comment xml:lang="sr">Блендер сцена</comment>
+ <comment xml:lang="sv">Blender-scen</comment>
+ <comment xml:lang="uk">сцена Blender</comment>
+ <comment xml:lang="vi">Cảnh Blender</comment>
+ <comment xml:lang="zh_CN">Blender 场景</comment>
+ <comment xml:lang="zh_TW">Blender 場景</comment>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.blender"/>
+ <glob pattern="*.blend"/>
+ <glob pattern="*.BLEND"/>
+ <magic priority="50">
+ <match value="BLENDER" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-bzdvi">
+ <comment>TeX DVI document (bzip-compressed)</comment>
+ <comment xml:lang="ar">مستند TeX DVI (مضغوط-bzip)</comment>
+ <comment xml:lang="be@latin">Dakument TeX DVI (bzip-skampresavany)</comment>
+ <comment xml:lang="bg">Документ — TeX DVI, компресиран с bzip</comment>
+ <comment xml:lang="ca">document TeX DVI (comprimit amb bzip)</comment>
+ <comment xml:lang="cs">Dokument TeX DVI (komprimovaný pomocí bzip)</comment>
+ <comment xml:lang="da">TeX DVI-dokument (bzip-komprimeret)</comment>
+ <comment xml:lang="de">TeX-DVI-Dokument (bzip-komprimiert)</comment>
+ <comment xml:lang="es">documento DVI de TeX (comprimido con bzip)</comment>
+ <comment xml:lang="eu">TeX DVI dokumentua (bzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">TeX DVI -asiakirja (bzip-pakattu)</comment>
+ <comment xml:lang="fo">TeX DVI skjal (bzip-stappað)</comment>
+ <comment xml:lang="fr">document DVI TeX (compressé bzip)</comment>
+ <comment xml:lang="ga">cáipéis DVI TeX (comhbhrúite le bzip)</comment>
+ <comment xml:lang="gl">documento DVI de TeX (comprimido con bzip)</comment>
+ <comment xml:lang="he">מסמך מסוג TeX DVI (מכווץ ע"י bzip)</comment>
+ <comment xml:lang="hu">TeX DVI dokumentum (bzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Dokumen TeX DVI (terkompresi bzip)</comment>
+ <comment xml:lang="it">Documento TeX DVI (compresso con bzip)</comment>
+ <comment xml:lang="ja">Tex DVI ドキュメント (bzip 圧縮)</comment>
+ <comment xml:lang="kk">TeX DVI құжаты (bzip-пен сығылған)</comment>
+ <comment xml:lang="ko">TeX DVI 문서 (BZIP 압축)</comment>
+ <comment xml:lang="lt">TeX DVI dokumentas (suglaudintas su bzip)</comment>
+ <comment xml:lang="lv">TeX DVI dokuments (saspiests ar bzip)</comment>
+ <comment xml:lang="nb">TeX DVI-dokument (bzip-komprimert)</comment>
+ <comment xml:lang="nl">TeX DVI-document (ingepakt met bzip)</comment>
+ <comment xml:lang="nn">TeX DVI-dokument (pakka med bzip)</comment>
+ <comment xml:lang="pl">Dokument TeX DVI (kompresja bzip)</comment>
+ <comment xml:lang="pt_BR">Documento DVI TeX (compactado com bzip)</comment>
+ <comment xml:lang="ro">Document TeX DVI (comprimat bzip)</comment>
+ <comment xml:lang="ru">документ TeX DVI (сжатый bzip)</comment>
+ <comment xml:lang="sk">Dokument TeX DVI (komprimovaný pomocou bzip)</comment>
+ <comment xml:lang="sl">Dokument TeX DVI (stisnjen z bzip)</comment>
+ <comment xml:lang="sq">Dokument Tex DVI (i kompresuar me bzip)</comment>
+ <comment xml:lang="sv">TeX DVI-dokument (bzip-komprimerat)</comment>
+ <comment xml:lang="uk">документ TeX DVI (стиснений bzip)</comment>
+ <comment xml:lang="vi">Tài liệu DVI TeX (đã nén bzip)</comment>
+ <comment xml:lang="zh_CN">TeX DVI 文档(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">TeX DVI 文件 (bzip 格式壓縮)</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.dvi.bz2"/>
+ </mime-type>
+ <mime-type type="application/x-bzip">
+ <comment>Bzip archive</comment>
+ <comment xml:lang="ar">أرشيف Bzip</comment>
+ <comment xml:lang="be@latin">Archiŭ bzip</comment>
+ <comment xml:lang="bg">Архив — bzip</comment>
+ <comment xml:lang="ca">arxiu bzip</comment>
+ <comment xml:lang="cs">Archiv bzip</comment>
+ <comment xml:lang="da">Bzip-arkiv</comment>
+ <comment xml:lang="de">Bzip-Archiv</comment>
+ <comment xml:lang="eo">Bzip-arkivo</comment>
+ <comment xml:lang="es">archivador Bzip</comment>
+ <comment xml:lang="eu">Bzip artxiboa</comment>
+ <comment xml:lang="fi">Bzip-arkisto</comment>
+ <comment xml:lang="fo">Bzip skjalasavn</comment>
+ <comment xml:lang="fr">archive bzip</comment>
+ <comment xml:lang="ga">cartlann Bzip</comment>
+ <comment xml:lang="gl">arquivo Bzip</comment>
+ <comment xml:lang="he">ארכיון Bzip</comment>
+ <comment xml:lang="hu">Bzip archívum</comment>
+ <comment xml:lang="id">Arsip Bzip</comment>
+ <comment xml:lang="it">Archivio bzip</comment>
+ <comment xml:lang="ja">Bzip アーカイブ</comment>
+ <comment xml:lang="kk">Bzip архиві</comment>
+ <comment xml:lang="ko">BZIP 압축 파일</comment>
+ <comment xml:lang="lt">Bzip archyvas</comment>
+ <comment xml:lang="lv">Bzip arhīvs</comment>
+ <comment xml:lang="nb">Bzip-arkiv</comment>
+ <comment xml:lang="nl">Bzip-archief</comment>
+ <comment xml:lang="nn">Bzip-arkiv</comment>
+ <comment xml:lang="pl">Archiwum bzip</comment>
+ <comment xml:lang="pt_BR">Pacote Bzip</comment>
+ <comment xml:lang="ro">Arhivă Bzip</comment>
+ <comment xml:lang="ru">архив BZIP</comment>
+ <comment xml:lang="sk">Archív bzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Bzip</comment>
+ <comment xml:lang="sq">Arkiv bzip</comment>
+ <comment xml:lang="sv">Bzip-arkiv</comment>
+ <comment xml:lang="uk">архів bzip</comment>
+ <comment xml:lang="vi">Kho nén bzip</comment>
+ <comment xml:lang="zh_CN">bzip 归档文件</comment>
+ <comment xml:lang="zh_TW">Bzip 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="BZh" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.bz"/>
+ <glob pattern="*.bz2"/>
+ <alias type="application/x-bzip2"/>
+ </mime-type>
+ <mime-type type="application/x-bzip-compressed-tar">
+ <comment>Tar archive (bzip-compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-bzip)</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (bzip-skampresavany)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с bzip</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit amb bzip)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný pomocí bzip)</comment>
+ <comment xml:lang="da">Tar-arkiv (bzip-komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (bzip-komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido con bzip)</comment>
+ <comment xml:lang="eu">Tar artxiboa (bzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">Tar-arkisto (bzip-pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (bzip-stappað)</comment>
+ <comment xml:lang="fr">archive tar (compressée bzip)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le bzip)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con bzip)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע"י bzip)</comment>
+ <comment xml:lang="hu">Tar archívum (bzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi bzip)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con bzip)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (bzip 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (bzip-пен сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (BZIP 압축)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su bzip)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar bzip)</comment>
+ <comment xml:lang="nb">Tar-arkiv (bzip-komprimert)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt met bzip)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med bzip)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja bzip)</comment>
+ <comment xml:lang="pt_BR">Pacote tar (compactado com bzip)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată bzip)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый BZIP)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný pomocou bzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z bzip)</comment>
+ <comment xml:lang="sq">Arkiv tar (i kompresuar me bzip)</comment>
+ <comment xml:lang="sv">Tar-arkiv (bzip-komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений bzip)</comment>
+ <comment xml:lang="vi">Kho nén tar (đã nén bzip)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(bzip 压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (bzip 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <sub-class-of type="application/x-bzip"/>
+ <glob pattern="*.tar.bz"/>
+ <glob pattern="*.tar.bz2"/>
+ <glob pattern="*.tbz"/>
+ <glob pattern="*.tbz2"/>
+ </mime-type>
+ <mime-type type="application/x-bzpdf">
+ <comment>PDF document (bzip-compressed)</comment>
+ <comment xml:lang="ar">مستند PDF (مضغوط-bzip)</comment>
+ <comment xml:lang="be@latin">Dakument PDF (bzip-skampresavany)</comment>
+ <comment xml:lang="bg">Документ — PDF, компресиран с bzip</comment>
+ <comment xml:lang="ca">document PDF (comprimit amb bzip)</comment>
+ <comment xml:lang="cs">Dokument PDF (komprimovaný pomocí bzip)</comment>
+ <comment xml:lang="da">PDF-dokument (bzip-komprimeret)</comment>
+ <comment xml:lang="de">PDF-Dokument (bzip-komprimiert)</comment>
+ <comment xml:lang="es">documento PDF (comprimido con bzip)</comment>
+ <comment xml:lang="eu">PostScript dokumentua (bzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">PDF-asiakirja (bzip-pakattu)</comment>
+ <comment xml:lang="fo">PDF skjal (bzip-stappað)</comment>
+ <comment xml:lang="fr">document PDF (compressé bzip)</comment>
+ <comment xml:lang="ga">cáipéis PDF (comhbhrúite le bzip)</comment>
+ <comment xml:lang="gl">documento PDF (comprimido en bzip)</comment>
+ <comment xml:lang="he">מסמך PDF (מכווץ ע"י bzip)</comment>
+ <comment xml:lang="hu">PDF dokumentum (bzip-tömörítésű)</comment>
+ <comment xml:lang="id">Dokumen PDF (terkompresi bzip)</comment>
+ <comment xml:lang="it">Documento PDF (compresso con bzip)</comment>
+ <comment xml:lang="ja">PDF ドキュメント (bzip 圧縮)</comment>
+ <comment xml:lang="kk">PDF құжаты (bzip-пен сығылған)</comment>
+ <comment xml:lang="ko">PDF 문서 (BZIP 압축)</comment>
+ <comment xml:lang="lt">PDF dokumentas (suglaudintas su bzip)</comment>
+ <comment xml:lang="lv">PDF dokuments (saspiests ar bzip)</comment>
+ <comment xml:lang="nb">PDF-dokument (bzip-komprimert)</comment>
+ <comment xml:lang="nl">PDF-document (ingepakt met bzip)</comment>
+ <comment xml:lang="nn">PDF-dokument (pakka med bzip)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja bzip)</comment>
+ <comment xml:lang="pt_BR">Documento PDF (compactado com bzip)</comment>
+ <comment xml:lang="ro">Document PDF (comprimat bzip)</comment>
+ <comment xml:lang="ru">документ PDF (сжатый bzip)</comment>
+ <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou bzip)</comment>
+ <comment xml:lang="sl">Dokument PDF (stisnjen z bzip)</comment>
+ <comment xml:lang="sq">Dokument PDF (i kompresuar me bzip)</comment>
+ <comment xml:lang="sv">PDF-dokument (bzip-komprimerat)</comment>
+ <comment xml:lang="uk">документ PDF (стиснений bzip)</comment>
+ <comment xml:lang="vi">Tài liệu PDF (đã nén bzip)</comment>
+ <comment xml:lang="zh_CN">PDF 文档(bzip 压缩)</comment>
+ <comment xml:lang="zh_TW">PDF 文件 (bzip 格式壓縮)</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.pdf.bz2"/>
+ </mime-type>
+ <mime-type type="application/x-bzpostscript">
+ <comment>PostScript document (bzip-compressed)</comment>
+ <comment xml:lang="ar">مستند PostScript (مضغوط-bzip)</comment>
+ <comment xml:lang="be@latin">Dakument PostScript (bzip-skampresavany)</comment>
+ <comment xml:lang="bg">Документ — PostScript, компресиран с bzip</comment>
+ <comment xml:lang="ca">document PostScript (comprimit amb bzip)</comment>
+ <comment xml:lang="cs">Dokument PostScript (komprimovaný pomocí bzip)</comment>
+ <comment xml:lang="da">PostScript-dokument (bzip-komprimeret)</comment>
+ <comment xml:lang="de">PostScript-Dokument (bzip-komprimiert)</comment>
+ <comment xml:lang="es">documento PostScript (comprimido con bzip)</comment>
+ <comment xml:lang="eu">PostScript dokumentua (bzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">PostScript-asiakirja (bzip-pakattu)</comment>
+ <comment xml:lang="fo">PostScript skjal (bzip-stappað)</comment>
+ <comment xml:lang="fr">document PostScript (compressé bzip)</comment>
+ <comment xml:lang="ga">cáipéis PostScript (comhbhrúite le bzip)</comment>
+ <comment xml:lang="gl">documento PostScript (comprimido con bzip)</comment>
+ <comment xml:lang="he">מסמך PostDcript (מכווץ ע"י bzip)</comment>
+ <comment xml:lang="hu">PostScript dokumentum (bzip-tömörítésű)</comment>
+ <comment xml:lang="id">Dokumen PostScript (terkompresi bzip)</comment>
+ <comment xml:lang="it">Documento PostScript (compresso con bzip)</comment>
+ <comment xml:lang="ja">PostScript ドキュメント (bzip 圧縮)</comment>
+ <comment xml:lang="kk">PostScript құжаты (bzip-пен сығылған)</comment>
+ <comment xml:lang="ko">포스트스크립트 문서 (BZIP 압축)</comment>
+ <comment xml:lang="lt">PostScript dokumentas (suglaudintas su bzip)</comment>
+ <comment xml:lang="lv">PostScript dokuments (saspiests ar bzip)</comment>
+ <comment xml:lang="nb">PostScript-dokument (bzip-komprimert)</comment>
+ <comment xml:lang="nl">PostScript-document (ingepakt met bzip)</comment>
+ <comment xml:lang="nn">PostScript-dokument (pakka med bzip)</comment>
+ <comment xml:lang="pl">Dokument Postscript (kompresja bzip)</comment>
+ <comment xml:lang="pt_BR">Documento PostScript (compactado com bzip)</comment>
+ <comment xml:lang="ro">Document PostScript (comprimat bzip)</comment>
+ <comment xml:lang="ru">документ PostScript (сжатый bzip)</comment>
+ <comment xml:lang="sk">Dokument PostScript (komprimovaný pomocou bzip)</comment>
+ <comment xml:lang="sl">Dokument PostScript (stisnjen z bzip)</comment>
+ <comment xml:lang="sq">Dokument PostScript (i kompresuar me bzip)</comment>
+ <comment xml:lang="sv">Postscript-dokument (bzip-komprimerat)</comment>
+ <comment xml:lang="uk">документ PostScript (стиснене bzip)</comment>
+ <comment xml:lang="vi">Tài liệu PostScript (đã nén bzip)</comment>
+ <comment xml:lang="zh_CN">PostScript 文档(bzip 压缩)</comment>
+ <comment xml:lang="zh_TW">PostScript 文件 (bzip 格式壓縮)</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.ps.bz2"/>
+ </mime-type>
+ <mime-type type="application/x-cbr">
+ <comment>comic book archive</comment>
+ <comment xml:lang="ar">أرشيف comic book</comment>
+ <comment xml:lang="be@latin">archiŭ komiksaŭ</comment>
+ <comment xml:lang="bg">Архив — комикси</comment>
+ <comment xml:lang="ca">arxiu comic book</comment>
+ <comment xml:lang="cs">Archiv knihy komiksů</comment>
+ <comment xml:lang="da">comic book-arkiv</comment>
+ <comment xml:lang="de">Comic-Book-Archiv</comment>
+ <comment xml:lang="es">archivador de libro de cómic</comment>
+ <comment xml:lang="eu">komiki artxiboa</comment>
+ <comment xml:lang="fi">sarjakuva-arkisto</comment>
+ <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
+ <comment xml:lang="fr">archive Comic Book</comment>
+ <comment xml:lang="ga">cartlann chartúin</comment>
+ <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
+ <comment xml:lang="he">ארכיון ספר קומי</comment>
+ <comment xml:lang="hu">képregényarchívum</comment>
+ <comment xml:lang="id">arsip buku komik</comment>
+ <comment xml:lang="it">Archivio comic book</comment>
+ <comment xml:lang="ja">コミックブックアーカイブ</comment>
+ <comment xml:lang="kk">комикстар архиві</comment>
+ <comment xml:lang="ko">코믹북 묶음 파일</comment>
+ <comment xml:lang="lt">komiksų knygos archyvas</comment>
+ <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
+ <comment xml:lang="nb">Tegneseriearkiv</comment>
+ <comment xml:lang="nl">stripboek-archief</comment>
+ <comment xml:lang="nn">teikneseriearkiv</comment>
+ <comment xml:lang="pl">Archiwum komiksu</comment>
+ <comment xml:lang="pt_BR">Pacote de livro de revista em quadrinhos</comment>
+ <comment xml:lang="ro">arhivă benzi desenate</comment>
+ <comment xml:lang="ru">архив комиксов</comment>
+ <comment xml:lang="sk">Archív knihy komiksov</comment>
+ <comment xml:lang="sl">Datoteka arhiva stripov</comment>
+ <comment xml:lang="sq">Arkiv comic book</comment>
+ <comment xml:lang="sv">serietidningsarkiv</comment>
+ <comment xml:lang="uk">архів коміксів</comment>
+ <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
+ <comment xml:lang="zh_CN">Comic Book 归档文件</comment>
+ <comment xml:lang="zh_TW">漫畫書封存檔</comment>
+ <sub-class-of type="application/x-rar"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.cbr"/>
+ </mime-type>
+ <mime-type type="application/x-cb7">
+ <comment>comic book archive</comment>
+ <comment xml:lang="ar">أرشيف comic book</comment>
+ <comment xml:lang="be@latin">archiŭ komiksaŭ</comment>
+ <comment xml:lang="bg">Архив — комикси</comment>
+ <comment xml:lang="ca">arxiu comic book</comment>
+ <comment xml:lang="cs">Archiv knihy komiksů</comment>
+ <comment xml:lang="da">comic book-arkiv</comment>
+ <comment xml:lang="de">Comic-Book-Archiv</comment>
+ <comment xml:lang="es">archivador de libro de cómic</comment>
+ <comment xml:lang="eu">komiki artxiboa</comment>
+ <comment xml:lang="fi">sarjakuva-arkisto</comment>
+ <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
+ <comment xml:lang="fr">archive Comic Book</comment>
+ <comment xml:lang="ga">cartlann chartúin</comment>
+ <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
+ <comment xml:lang="he">ארכיון ספר קומי</comment>
+ <comment xml:lang="hu">képregényarchívum</comment>
+ <comment xml:lang="id">arsip buku komik</comment>
+ <comment xml:lang="it">Archivio comic book</comment>
+ <comment xml:lang="ja">コミックブックアーカイブ</comment>
+ <comment xml:lang="kk">комикстар архиві</comment>
+ <comment xml:lang="ko">코믹북 묶음 파일</comment>
+ <comment xml:lang="lt">komiksų knygos archyvas</comment>
+ <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
+ <comment xml:lang="nb">Tegneseriearkiv</comment>
+ <comment xml:lang="nl">stripboek-archief</comment>
+ <comment xml:lang="nn">teikneseriearkiv</comment>
+ <comment xml:lang="pl">Archiwum komiksu</comment>
+ <comment xml:lang="pt_BR">Pacote de livro de revista em quadrinhos</comment>
+ <comment xml:lang="ro">arhivă benzi desenate</comment>
+ <comment xml:lang="ru">архив комиксов</comment>
+ <comment xml:lang="sk">Archív knihy komiksov</comment>
+ <comment xml:lang="sl">Datoteka arhiva stripov</comment>
+ <comment xml:lang="sq">Arkiv comic book</comment>
+ <comment xml:lang="sv">serietidningsarkiv</comment>
+ <comment xml:lang="uk">архів коміксів</comment>
+ <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
+ <comment xml:lang="zh_CN">Comic Book 归档文件</comment>
+ <comment xml:lang="zh_TW">漫畫書封存檔</comment>
+ <sub-class-of type="application/x-7z-compressed"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.cb7"/>
+ </mime-type>
+ <mime-type type="application/x-cbt">
+ <comment>comic book archive</comment>
+ <comment xml:lang="ar">أرشيف comic book</comment>
+ <comment xml:lang="be@latin">archiŭ komiksaŭ</comment>
+ <comment xml:lang="bg">Архив — комикси</comment>
+ <comment xml:lang="ca">arxiu comic book</comment>
+ <comment xml:lang="cs">Archiv knihy komiksů</comment>
+ <comment xml:lang="da">comic book-arkiv</comment>
+ <comment xml:lang="de">Comic-Book-Archiv</comment>
+ <comment xml:lang="es">archivador de libro de cómic</comment>
+ <comment xml:lang="eu">komiki artxiboa</comment>
+ <comment xml:lang="fi">sarjakuva-arkisto</comment>
+ <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
+ <comment xml:lang="fr">archive Comic Book</comment>
+ <comment xml:lang="ga">cartlann chartúin</comment>
+ <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
+ <comment xml:lang="he">ארכיון ספר קומי</comment>
+ <comment xml:lang="hu">képregényarchívum</comment>
+ <comment xml:lang="id">arsip buku komik</comment>
+ <comment xml:lang="it">Archivio comic book</comment>
+ <comment xml:lang="ja">コミックブックアーカイブ</comment>
+ <comment xml:lang="kk">комикстар архиві</comment>
+ <comment xml:lang="ko">코믹북 묶음 파일</comment>
+ <comment xml:lang="lt">komiksų knygos archyvas</comment>
+ <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
+ <comment xml:lang="nb">Tegneseriearkiv</comment>
+ <comment xml:lang="nl">stripboek-archief</comment>
+ <comment xml:lang="nn">teikneseriearkiv</comment>
+ <comment xml:lang="pl">Archiwum komiksu</comment>
+ <comment xml:lang="pt_BR">Pacote de livro de revista em quadrinhos</comment>
+ <comment xml:lang="ro">arhivă benzi desenate</comment>
+ <comment xml:lang="ru">архив комиксов</comment>
+ <comment xml:lang="sk">Archív knihy komiksov</comment>
+ <comment xml:lang="sl">Datoteka arhiva stripov</comment>
+ <comment xml:lang="sq">Arkiv comic book</comment>
+ <comment xml:lang="sv">serietidningsarkiv</comment>
+ <comment xml:lang="uk">архів коміксів</comment>
+ <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
+ <comment xml:lang="zh_CN">Comic Book 归档文件</comment>
+ <comment xml:lang="zh_TW">漫畫書封存檔</comment>
+ <sub-class-of type="application/x-tar"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.cbt"/>
+ </mime-type>
+ <mime-type type="application/x-cbz">
+ <comment>comic book archive</comment>
+ <comment xml:lang="ar">أرشيف comic book</comment>
+ <comment xml:lang="be@latin">archiŭ komiksaŭ</comment>
+ <comment xml:lang="bg">Архив — комикси</comment>
+ <comment xml:lang="ca">arxiu comic book</comment>
+ <comment xml:lang="cs">Archiv knihy komiksů</comment>
+ <comment xml:lang="da">comic book-arkiv</comment>
+ <comment xml:lang="de">Comic-Book-Archiv</comment>
+ <comment xml:lang="es">archivador de libro de cómic</comment>
+ <comment xml:lang="eu">komiki artxiboa</comment>
+ <comment xml:lang="fi">sarjakuva-arkisto</comment>
+ <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
+ <comment xml:lang="fr">archive Comic Book</comment>
+ <comment xml:lang="ga">cartlann chartúin</comment>
+ <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
+ <comment xml:lang="he">ארכיון ספר קומי</comment>
+ <comment xml:lang="hu">képregényarchívum</comment>
+ <comment xml:lang="id">arsip buku komik</comment>
+ <comment xml:lang="it">Archivio comic book</comment>
+ <comment xml:lang="ja">コミックブックアーカイブ</comment>
+ <comment xml:lang="kk">комикстар архиві</comment>
+ <comment xml:lang="ko">코믹북 묶음 파일</comment>
+ <comment xml:lang="lt">komiksų knygos archyvas</comment>
+ <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
+ <comment xml:lang="nb">Tegneseriearkiv</comment>
+ <comment xml:lang="nl">stripboek-archief</comment>
+ <comment xml:lang="nn">teikneseriearkiv</comment>
+ <comment xml:lang="pl">Archiwum komiksu</comment>
+ <comment xml:lang="pt_BR">Pacote de livro de revista em quadrinhos</comment>
+ <comment xml:lang="ro">arhivă benzi desenate</comment>
+ <comment xml:lang="ru">архив комиксов</comment>
+ <comment xml:lang="sk">Archív knihy komiksov</comment>
+ <comment xml:lang="sl">Datoteka arhiva stripov</comment>
+ <comment xml:lang="sq">Arkiv comic book</comment>
+ <comment xml:lang="sv">serietidningsarkiv</comment>
+ <comment xml:lang="uk">архів коміксів</comment>
+ <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
+ <comment xml:lang="zh_CN">Comic Book 归档文件</comment>
+ <comment xml:lang="zh_TW">漫畫書封存檔</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.cbz"/>
+ </mime-type>
+ <mime-type type="application/x-lrzip">
+ <comment>Lrzip archive</comment>
+ <comment xml:lang="ar">أرشيف Lrzip</comment>
+ <comment xml:lang="bg">Архив — lrzip</comment>
+ <comment xml:lang="ca">arxiu lrzip</comment>
+ <comment xml:lang="cs">Archiv Lrzip</comment>
+ <comment xml:lang="da">Lrzip-arkiv</comment>
+ <comment xml:lang="de">Lrzip-Archiv</comment>
+ <comment xml:lang="eo">Lrzip-arkivo</comment>
+ <comment xml:lang="es">archivador Lrzip</comment>
+ <comment xml:lang="fi">Lrzip-arkisto</comment>
+ <comment xml:lang="fo">Lrzip skjalasavn</comment>
+ <comment xml:lang="fr">archive lrzip</comment>
+ <comment xml:lang="ga">cartlann Lrzip</comment>
+ <comment xml:lang="gl">arquivo Lrzip</comment>
+ <comment xml:lang="he">ארכיון Lrzip</comment>
+ <comment xml:lang="hu">Lrzip archívum</comment>
+ <comment xml:lang="id">Arsip Lrzip</comment>
+ <comment xml:lang="it">Archivio Lrzip</comment>
+ <comment xml:lang="ja">Lrzip アーカイブ</comment>
+ <comment xml:lang="kk">Lrzip архиві</comment>
+ <comment xml:lang="ko">LRZIP 압축 파일</comment>
+ <comment xml:lang="lt">Lrzip archyvas</comment>
+ <comment xml:lang="lv">Lrzip arhīvs</comment>
+ <comment xml:lang="pl">Archiwum lrzip</comment>
+ <comment xml:lang="ro">Arhivă Lrzip</comment>
+ <comment xml:lang="ru">архив LRZIP</comment>
+ <comment xml:lang="sk">Archív Lrzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Lrzip</comment>
+ <comment xml:lang="sv">Lrzip-arkiv</comment>
+ <comment xml:lang="uk">архів lrzip</comment>
+ <comment xml:lang="zh_CN">Lrzip 归档文件</comment>
+ <comment xml:lang="zh_TW">Lrzip 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="LRZI" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.lrz"/>
+ </mime-type>
+ <mime-type type="application/x-lrzip-compressed-tar">
+ <comment>Tar archive (lrzip-compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-lrzip)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с lrzip</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit amb lrzip)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný pomocí lrzip)</comment>
+ <comment xml:lang="da">Tar-arkiv (lrzip-komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (lrzip-komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido con lrzip)</comment>
+ <comment xml:lang="fi">Tar-arkisto (lrzip-pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (lrzip-stappað)</comment>
+ <comment xml:lang="fr">archive tar (compressée lrzip)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le lrzip)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con lrzip)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע"י lrzip)</comment>
+ <comment xml:lang="hu">Tar archívum (lrzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi lrzip)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con lrzip)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (lrzip 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (lrzip-пен сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (LRZIP 압축)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su lrzip)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar lrzip)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja lrzip)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată lrzip)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый LRZIP)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný pomocou lrzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z lrzip)</comment>
+ <comment xml:lang="sv">Tar-arkiv (lrzip-komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений lrzip)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件 (lrzip 压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (lrzip 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <sub-class-of type="application/x-lrzip"/>
+ <glob pattern="*.tar.lrz"/>
+ <glob pattern="*.tlrz"/>
+ </mime-type>
+ <mime-type type="application/x-apple-diskimage">
+ <comment>Apple disk image</comment>
+ <comment xml:lang="bg">Диск — Apple</comment>
+ <comment xml:lang="ca">imatge de disc d'Apple</comment>
+ <comment xml:lang="cs">Obraz disku Apple</comment>
+ <comment xml:lang="da">Apple-diskaftryk</comment>
+ <comment xml:lang="de">Apple-Datenträgerabbild</comment>
+ <comment xml:lang="es">imagen de disco de Apple</comment>
+ <comment xml:lang="fi">Apple-levytiedosto</comment>
+ <comment xml:lang="fr">image disque Apple</comment>
+ <comment xml:lang="gl">imaxe de disco de Appl</comment>
+ <comment xml:lang="he">תמונת כונן Apple</comment>
+ <comment xml:lang="hu">Apple lemezkép</comment>
+ <comment xml:lang="id">Image disk Apple</comment>
+ <comment xml:lang="it">Immagine disco Apple</comment>
+ <comment xml:lang="ja">Apple ディスクイメージ</comment>
+ <comment xml:lang="kk">Apple диск бейнесі</comment>
+ <comment xml:lang="ko">애플 디스크 이미지</comment>
+ <comment xml:lang="lv">Apple diska attēls</comment>
+ <comment xml:lang="pl">Obraz dysku Apple</comment>
+ <comment xml:lang="ru">образ диска Apple Mac OS X</comment>
+ <comment xml:lang="sk">Obraz disku Apple</comment>
+ <comment xml:lang="sl">Odtis diska Apple</comment>
+ <comment xml:lang="sv">Apple-skivavbild</comment>
+ <comment xml:lang="uk">образ диска Apple</comment>
+ <comment xml:lang="zh_CN">Apple 磁盘镜像</comment>
+ <comment xml:lang="zh_TW">Apple 磁碟映像</comment>
+ <glob pattern="*.dmg"/>
+ </mime-type>
+ <mime-type type="application/x-cd-image">
+ <comment>raw CD image</comment>
+ <comment xml:lang="ar">صورة CD خامة</comment>
+ <comment xml:lang="be@latin">suvoraja vyjava CD</comment>
+ <comment xml:lang="bg">Изображение — raw CD</comment>
+ <comment xml:lang="ca">imatge de CD en cru</comment>
+ <comment xml:lang="cs">Surový obraz CD</comment>
+ <comment xml:lang="da">rå cd-aftryk</comment>
+ <comment xml:lang="de">CD-Roh-Abbild</comment>
+ <comment xml:lang="el">εικόνα περιεχομένου ψηφιακού δίσκου</comment>
+ <comment xml:lang="en_GB">raw CD image</comment>
+ <comment xml:lang="eo">kruda lumdiskbildo</comment>
+ <comment xml:lang="es">imagen de CD en bruto</comment>
+ <comment xml:lang="eu">CD gordinaren irudia </comment>
+ <comment xml:lang="fi">raaka CD-vedos</comment>
+ <comment xml:lang="fo">rá CD mynd</comment>
+ <comment xml:lang="fr">image CD brute</comment>
+ <comment xml:lang="ga">amhíomhá dhlúthdhiosca</comment>
+ <comment xml:lang="gl">imaxe de CD en bruto</comment>
+ <comment xml:lang="he">תמונת דיסק גולמית</comment>
+ <comment xml:lang="hu">nyers CD-lemezkép</comment>
+ <comment xml:lang="id">citra CD mentah</comment>
+ <comment xml:lang="it">Immagine raw CD</comment>
+ <comment xml:lang="ja">生 CD イメージ</comment>
+ <comment xml:lang="kk">өңделмеген CD бейнесі</comment>
+ <comment xml:lang="ko">CD 이미지</comment>
+ <comment xml:lang="lt">raw CD atvaizdis</comment>
+ <comment xml:lang="lv">CD jēlattēls</comment>
+ <comment xml:lang="ms">Imej CD mentah</comment>
+ <comment xml:lang="nb">rått CD-bilde</comment>
+ <comment xml:lang="nl">ruw CD-beeldbestand</comment>
+ <comment xml:lang="nn">rått CD-bilete</comment>
+ <comment xml:lang="pl">Surowy obraz CD</comment>
+ <comment xml:lang="pt">imagem em bruto de CD</comment>
+ <comment xml:lang="pt_BR">imagem bruta de CD</comment>
+ <comment xml:lang="ro">imagine de CD brută</comment>
+ <comment xml:lang="ru">образ компакт-диска</comment>
+ <comment xml:lang="sk">Surový obraz CD</comment>
+ <comment xml:lang="sl">surovi CD odtis</comment>
+ <comment xml:lang="sq">Imazh raw CD</comment>
+ <comment xml:lang="sr">сирови отисак ЦД-а</comment>
+ <comment xml:lang="sv">rå cd-avbild</comment>
+ <comment xml:lang="uk">образ raw CD</comment>
+ <comment xml:lang="vi">ảnh đĩa CD thô</comment>
+ <comment xml:lang="zh_CN">原始 CD 映像</comment>
+ <comment xml:lang="zh_TW">原生 CD 映像</comment>
+ <alias type="application/x-iso9660-image"/>
+ <glob pattern="*.iso"/>
+ <glob pattern="*.iso9660"/>
+ </mime-type>
+ <mime-type type="application/x-cdrdao-toc">
+ <comment>CD Table Of Contents</comment>
+ <comment xml:lang="ar">جدول محتويات الـ CD</comment>
+ <comment xml:lang="be@latin">Źmieściva CD</comment>
+ <comment xml:lang="bg">Съдържание на CD</comment>
+ <comment xml:lang="ca">taula de continguts de CD</comment>
+ <comment xml:lang="cs">Obsah CD</comment>
+ <comment xml:lang="da">Cd-indholdsfotegnelse</comment>
+ <comment xml:lang="de">CD-Inhaltsverzeichnis</comment>
+ <comment xml:lang="es">Índice de contenidos de CD</comment>
+ <comment xml:lang="eu">CDaren edukien aurkibidea</comment>
+ <comment xml:lang="fi">CD-sisällysluettelo</comment>
+ <comment xml:lang="fo">CD innihaldsyvurlit</comment>
+ <comment xml:lang="fr">table des matières de CD</comment>
+ <comment xml:lang="ga">clár ábhar dlúthdhiosca</comment>
+ <comment xml:lang="gl">táboa de contidos de CD</comment>
+ <comment xml:lang="he">תוכן עניינים של דיסק</comment>
+ <comment xml:lang="hu">CD tartalomjegyzék</comment>
+ <comment xml:lang="id">Tabel Isi CD</comment>
+ <comment xml:lang="it">Indice CD</comment>
+ <comment xml:lang="ja">CD Table Of Contents</comment>
+ <comment xml:lang="kk">CD құрама кестесі</comment>
+ <comment xml:lang="ko">CD 내용 목록</comment>
+ <comment xml:lang="lt">CD turinys</comment>
+ <comment xml:lang="lv">CD satura rādītājs</comment>
+ <comment xml:lang="nb">Innholdsfortegnelse for CD</comment>
+ <comment xml:lang="nl">CD-inhoudsopgave</comment>
+ <comment xml:lang="nn">CD innhaldsliste</comment>
+ <comment xml:lang="pl">Plik zawartości płyty CD</comment>
+ <comment xml:lang="pt_BR">Sumário de CD</comment>
+ <comment xml:lang="ro">Tabel conținut CD</comment>
+ <comment xml:lang="ru">таблица содержания CD</comment>
+ <comment xml:lang="sk">Obsah CD</comment>
+ <comment xml:lang="sl">Kazalo vsebine CD nosilca</comment>
+ <comment xml:lang="sq">Tregues CD</comment>
+ <comment xml:lang="sv">Cd-innehållsförteckning</comment>
+ <comment xml:lang="uk">зміст CD</comment>
+ <comment xml:lang="vi">Mục Lục của đĩa CD</comment>
+ <comment xml:lang="zh_CN">CD 索引</comment>
+ <comment xml:lang="zh_TW">CD 內容目錄</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="CD_ROM\n" type="string" offset="0"/>
+ <match value="CD_DA\n" type="string" offset="0"/>
+ <match value="CD_ROM_XA\n" type="string" offset="0"/>
+ <match value="CD_TEXT " type="string" offset="0"/>
+ <match value="CATALOG &quot;" type="string" offset="0">
+ <match value="&quot;" type="string" offset="22"/>
+ </match>
+ </magic>
+ <glob pattern="*.toc"/>
+ </mime-type>
+ <mime-type type="application/x-chess-pgn">
+ <comment>PGN chess game notation</comment>
+ <comment xml:lang="ar">تدوينة لعبة الشطرنج PGN</comment>
+ <comment xml:lang="be@latin">Zaciem ab šachmatnaj partyi PGN</comment>
+ <comment xml:lang="bg">Игра шах — PGN</comment>
+ <comment xml:lang="ca">notació de joc d'escacs PGN</comment>
+ <comment xml:lang="cs">Šachová notace PGN</comment>
+ <comment xml:lang="da">PGN-skakspilsnotation</comment>
+ <comment xml:lang="de">PGN-Schachspielnotation</comment>
+ <comment xml:lang="es">notación para juegos de ajedrez PGN</comment>
+ <comment xml:lang="eu">PGN xake jokoaren notazioa</comment>
+ <comment xml:lang="fi">PGN-šakkipelinotaatio</comment>
+ <comment xml:lang="fo">PGN talv teknskipan</comment>
+ <comment xml:lang="fr">notation de jeu d'échecs PGN</comment>
+ <comment xml:lang="ga">nodaireacht chluiche ficheall PGN</comment>
+ <comment xml:lang="gl">Notación de xogo de xadrez PGN</comment>
+ <comment xml:lang="he">סימון משחק שח PGN</comment>
+ <comment xml:lang="hu">PGN sakkfeljegyzés</comment>
+ <comment xml:lang="id">Notasi permainan catur PGN</comment>
+ <comment xml:lang="it">Notazione partita a scacchi PGN</comment>
+ <comment xml:lang="ja">PGN チェスゲーム記録</comment>
+ <comment xml:lang="kk">PGN шахмат ойыны</comment>
+ <comment xml:lang="ko">PGN 체스게임 기보</comment>
+ <comment xml:lang="lt">PGN šachmatų žaidimo žymėjimas</comment>
+ <comment xml:lang="lv">PGN šaha spēles notācija</comment>
+ <comment xml:lang="nb">PGN sjakkspillnotasjon</comment>
+ <comment xml:lang="nl">PGN-schaakspelnotatie</comment>
+ <comment xml:lang="nn">PGN-sjakkspelnotasjon</comment>
+ <comment xml:lang="pl">Plik PGN notacji gry w szachy</comment>
+ <comment xml:lang="pt_BR">Notação de jogo de xadrez PGN</comment>
+ <comment xml:lang="ro">Notație joc șah PGN</comment>
+ <comment xml:lang="ru">шахматная партия PGN</comment>
+ <comment xml:lang="sk">Šachová notácia PGN</comment>
+ <comment xml:lang="sl">Datoteka opomb šahovske igre PGN</comment>
+ <comment xml:lang="sq">Njoftim loje shahu PGN</comment>
+ <comment xml:lang="sv">PGN-schackpartinotation</comment>
+ <comment xml:lang="uk">запис гри у шахи PGN</comment>
+ <comment xml:lang="vi">Cách ghi lượt chơi cờ PGN</comment>
+ <comment xml:lang="zh_CN">PGN 象棋游戏注记</comment>
+ <comment xml:lang="zh_TW">PGN 國際象棋棋譜</comment>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.pgn"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="[Event " type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/vnd.ms-htmlhelp">
+ <comment>CHM document</comment>
+ <comment xml:lang="ar">مستند CHM</comment>
+ <comment xml:lang="be@latin">Dakument CHM</comment>
+ <comment xml:lang="bg">Документ — CHM</comment>
+ <comment xml:lang="ca">document CHM</comment>
+ <comment xml:lang="cs">Dokument CHM</comment>
+ <comment xml:lang="da">CHM-dokument</comment>
+ <comment xml:lang="de">CHM-Dokument</comment>
+ <comment xml:lang="eo">CHM-dokumento</comment>
+ <comment xml:lang="es">documento CHM</comment>
+ <comment xml:lang="eu">CHM dokumentua</comment>
+ <comment xml:lang="fi">CHM-asiakirja</comment>
+ <comment xml:lang="fo">CHM skjal</comment>
+ <comment xml:lang="fr">document CHM</comment>
+ <comment xml:lang="ga">cáipéis CHM</comment>
+ <comment xml:lang="gl">documento CHM</comment>
+ <comment xml:lang="he">מסמך CHM</comment>
+ <comment xml:lang="hu">CHM dokumentum</comment>
+ <comment xml:lang="id">Dokumen CHM</comment>
+ <comment xml:lang="it">Documento CHM</comment>
+ <comment xml:lang="ja">CHM ドキュメント</comment>
+ <comment xml:lang="kk">CHM құжаты</comment>
+ <comment xml:lang="ko">CHM 문서</comment>
+ <comment xml:lang="lt">CHM dokumentas</comment>
+ <comment xml:lang="lv">CHM dokuments</comment>
+ <comment xml:lang="nb">CHM-dokument</comment>
+ <comment xml:lang="nl">CHM-document</comment>
+ <comment xml:lang="nn">CHM-dokument</comment>
+ <comment xml:lang="pl">Dokument CHM</comment>
+ <comment xml:lang="pt_BR">Documento CHM</comment>
+ <comment xml:lang="ro">Document CHM</comment>
+ <comment xml:lang="ru">документ CHM</comment>
+ <comment xml:lang="sk">Dokument CHM</comment>
+ <comment xml:lang="sl">Dokument CHM</comment>
+ <comment xml:lang="sq">Dokument CHM</comment>
+ <comment xml:lang="sv">CHM-dokument</comment>
+ <comment xml:lang="uk">документ CHM</comment>
+ <comment xml:lang="vi">Tài liệu CHM</comment>
+ <comment xml:lang="zh_CN">CHM 文档</comment>
+ <comment xml:lang="zh_TW">CHM 文件</comment>
+ <acronym>CHM</acronym>
+ <expanded-acronym>Compiled Help Modules</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.chm"/>
+ <alias type="application/x-chm"/>
+ </mime-type>
+ <mime-type type="application/x-class-file">
+ <comment>Java byte code</comment>
+ <comment xml:lang="ar">رمز بايت الـJava</comment>
+ <comment xml:lang="az">Java bayt kodu</comment>
+ <comment xml:lang="be@latin">Bajtavy kod Java</comment>
+ <comment xml:lang="bg">Байт код за Java</comment>
+ <comment xml:lang="ca">codi byte de Java</comment>
+ <comment xml:lang="cs">Bajtový kód Java</comment>
+ <comment xml:lang="cy">Côd beit Java</comment>
+ <comment xml:lang="da">Javabytekode</comment>
+ <comment xml:lang="de">Java-Bytecode</comment>
+ <comment xml:lang="el">συμβολοκώδικας Java</comment>
+ <comment xml:lang="en_GB">Java byte code</comment>
+ <comment xml:lang="eo">Java-bajtkodo</comment>
+ <comment xml:lang="es">bytecode Java</comment>
+ <comment xml:lang="eu">Java byte-kodea</comment>
+ <comment xml:lang="fi">Java-tavukoodi</comment>
+ <comment xml:lang="fo">Java býtkota</comment>
+ <comment xml:lang="fr">code Java binaire</comment>
+ <comment xml:lang="ga">beartchód Java</comment>
+ <comment xml:lang="gl">byte code de Java</comment>
+ <comment xml:lang="he">קוד Java byte</comment>
+ <comment xml:lang="hu">Java-bájtkód</comment>
+ <comment xml:lang="id">Kode bita Java</comment>
+ <comment xml:lang="it">Bytecode Java</comment>
+ <comment xml:lang="ja">Java バイトコード</comment>
+ <comment xml:lang="kk">Java байт коды</comment>
+ <comment xml:lang="ko">자바 바이트코드</comment>
+ <comment xml:lang="lt">Java baitinis kodas</comment>
+ <comment xml:lang="lv">Java bitu kods</comment>
+ <comment xml:lang="ms">Kod bait Java</comment>
+ <comment xml:lang="nb">Java-bytekode</comment>
+ <comment xml:lang="nl">Java-bytecode</comment>
+ <comment xml:lang="nn">Jave byte-kode</comment>
+ <comment xml:lang="pl">Kod bajtowy Java</comment>
+ <comment xml:lang="pt">'byte-code' Java</comment>
+ <comment xml:lang="pt_BR">Código compilado Java</comment>
+ <comment xml:lang="ro">Bytecode Java</comment>
+ <comment xml:lang="ru">байт-код Java</comment>
+ <comment xml:lang="sk">Bajtový kód Java</comment>
+ <comment xml:lang="sl">Datoteka bitne kode Java</comment>
+ <comment xml:lang="sq">Byte code Java</comment>
+ <comment xml:lang="sr">Јава бајтни ко̂д</comment>
+ <comment xml:lang="sv">Java-bytekod</comment>
+ <comment xml:lang="uk">Байт-код Java</comment>
+ <comment xml:lang="vi">Mã byte Java</comment>
+ <comment xml:lang="zh_CN">Java 字节码</comment>
+ <comment xml:lang="zh_TW">Java 位元碼</comment>
+ </mime-type>
+ <mime-type type="application/x-compress">
+ <comment>UNIX-compressed file</comment>
+ <comment xml:lang="ar">ملف يونكس-مضغوط</comment>
+ <comment xml:lang="be@latin">Skampresavany UNIX-fajł</comment>
+ <comment xml:lang="bg">Файл — компресиран за UNIX</comment>
+ <comment xml:lang="ca">fitxer comprimit UNIX</comment>
+ <comment xml:lang="cs">Soubor komprimovaný v Unixu</comment>
+ <comment xml:lang="da">UNIX-komprimeret fil</comment>
+ <comment xml:lang="de">UNIX-komprimierte Datei</comment>
+ <comment xml:lang="el">αρχείο συμπιεσμένο με compress</comment>
+ <comment xml:lang="en_GB">UNIX-compressed file</comment>
+ <comment xml:lang="eo">UNIX-kunpremita dosiero</comment>
+ <comment xml:lang="es">archivo comprimido de Unix</comment>
+ <comment xml:lang="eu">UNIX-en konprimitutako fitxategia</comment>
+ <comment xml:lang="fi">UNIX-pakattu tiedosto</comment>
+ <comment xml:lang="fo">UNIX-stappað fíla</comment>
+ <comment xml:lang="fr">fichier compressé UNIX</comment>
+ <comment xml:lang="ga">comhad UNIX-comhbhrúite</comment>
+ <comment xml:lang="gl">ficheiro comprimido de UNIX</comment>
+ <comment xml:lang="he">קובץ מכווץ של UNIX</comment>
+ <comment xml:lang="hu">Tömörített UNIX-fájl</comment>
+ <comment xml:lang="id">Berkas terkompresi UNIX</comment>
+ <comment xml:lang="it">File compresso-UNIX</comment>
+ <comment xml:lang="ja">UNIX-compress ファイル</comment>
+ <comment xml:lang="kk">файл (UNIX-сығылған)</comment>
+ <comment xml:lang="ko">유닉스 압축 파일</comment>
+ <comment xml:lang="lt">UNIX suglaudintas failas</comment>
+ <comment xml:lang="lv">UNIX saspiests fails</comment>
+ <comment xml:lang="ms">Fail termampat-UNIX</comment>
+ <comment xml:lang="nb">UNIX-komprimert fil</comment>
+ <comment xml:lang="nl">UNIX-ingepakt bestand</comment>
+ <comment xml:lang="nn">UNIX-komprimert fil</comment>
+ <comment xml:lang="pl">Skompresowany plik systemu UNIX</comment>
+ <comment xml:lang="pt">ficheiro comprimido UNIX</comment>
+ <comment xml:lang="pt_BR">Arquivo compactado do UNIX</comment>
+ <comment xml:lang="ro">Fișier comprimat UNIX</comment>
+ <comment xml:lang="ru">файл (UNIX-сжатый)</comment>
+ <comment xml:lang="sk">Súbor komprimovaný v Unixe</comment>
+ <comment xml:lang="sl">Skrčena Unix datoteka</comment>
+ <comment xml:lang="sq">File i kompresuar UNIX</comment>
+ <comment xml:lang="sr">UNIX-компресована датотека</comment>
+ <comment xml:lang="sv">UNIX-komprimerad fil</comment>
+ <comment xml:lang="uk">стиснений файл UNIX</comment>
+ <comment xml:lang="vi">Tập tin đã nén UNIX</comment>
+ <comment xml:lang="zh_CN">UNIX 压缩文件</comment>
+ <comment xml:lang="zh_TW">UNIX 格式壓縮檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="\037\235" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.Z"/>
+ </mime-type>
+ <mime-type type="application/x-compressed-tar">
+ <comment>Tar archive (gzip-compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-gzip)</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (gzip-skampresavany)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с gzip</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit amb gzip)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="da">Tar-arkiv (gzip-komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (gzip-komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido con gzip)</comment>
+ <comment xml:lang="eu">Tar artxiboa (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">Tar-arkisto (gzip-pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (gzip-stappað)</comment>
+ <comment xml:lang="fr">archive tar (compressée gzip)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con gzip)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע"י gzip)</comment>
+ <comment xml:lang="hu">Tar archívum (gzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi gzip)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con gzip)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (gzip 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (GZIP 압축)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar gzip)</comment>
+ <comment xml:lang="nb">Tar-arkiv (gzip-komprimert)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med gzip)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja gzip)</comment>
+ <comment xml:lang="pt_BR">Pacote tar (compactado com gzip)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată gzip)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый GZIP)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z gzip)</comment>
+ <comment xml:lang="sq">Arkiv tar (i kompresuar me gzip)</comment>
+ <comment xml:lang="sv">Tar-arkiv (gzip-komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений gzip)</comment>
+ <comment xml:lang="vi">Kho nén tar (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (gzip 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.tar.gz"/>
+ <glob pattern="*.tgz"/>
+ <glob pattern="*.taz"/>
+ </mime-type>
+ <mime-type type="application/x-core">
+ <comment>program crash data</comment>
+ <comment xml:lang="ar">معلومات انهيار البرنامج</comment>
+ <comment xml:lang="be@latin">źviestki złamanaj prahramy</comment>
+ <comment xml:lang="bg">Данни от забиване на програма</comment>
+ <comment xml:lang="ca">dades de fallada de programa</comment>
+ <comment xml:lang="cs">Data o pádu programu</comment>
+ <comment xml:lang="da">programnedbrudsdata</comment>
+ <comment xml:lang="de">Daten zu Programmabsturz</comment>
+ <comment xml:lang="el">δεδομένα από την κατάρρευση προγράμματος</comment>
+ <comment xml:lang="en_GB">program crash data</comment>
+ <comment xml:lang="eo">datumo pri kraŝo de programo</comment>
+ <comment xml:lang="es">datos de cuelgue de programa</comment>
+ <comment xml:lang="eu">programaren kraskaduraren datuak</comment>
+ <comment xml:lang="fi">ohjelman kaatumistiedot</comment>
+ <comment xml:lang="fo">forrits sordáta</comment>
+ <comment xml:lang="fr">données de plantage de programme</comment>
+ <comment xml:lang="ga">sonraí thuairt ríomhchláir</comment>
+ <comment xml:lang="gl">datos de colgue do programa</comment>
+ <comment xml:lang="he">מידע מקריסת תוכנה</comment>
+ <comment xml:lang="hu">összeomlott program adatai</comment>
+ <comment xml:lang="id">data program macet</comment>
+ <comment xml:lang="it">Dati crash di applicazione</comment>
+ <comment xml:lang="ja">プログラムクラッシュデータ</comment>
+ <comment xml:lang="kk">апатты аяқтаудың мәліметтері</comment>
+ <comment xml:lang="ko">프로그램 비정상 종료 데이터</comment>
+ <comment xml:lang="lt">programos nulūžimo duomenys</comment>
+ <comment xml:lang="lv">programmas avārijas dati</comment>
+ <comment xml:lang="ms">Data program musnah</comment>
+ <comment xml:lang="nb">krasjdata fra program</comment>
+ <comment xml:lang="nl">programma-crashgegevens</comment>
+ <comment xml:lang="nn">data om programkrasj</comment>
+ <comment xml:lang="pl">Dane awarii programu</comment>
+ <comment xml:lang="pt">dados de estoiro de aplicação</comment>
+ <comment xml:lang="pt_BR">dados de travamento de programa</comment>
+ <comment xml:lang="ro">date eroare program</comment>
+ <comment xml:lang="ru">данные аварийного завершения</comment>
+ <comment xml:lang="sk">Údaje o páde programu</comment>
+ <comment xml:lang="sl">podatki sesutja programa</comment>
+ <comment xml:lang="sq">Të dhëna nga programi i bllokuar</comment>
+ <comment xml:lang="sr">подаци о кркљавини програма</comment>
+ <comment xml:lang="sv">programkraschdata</comment>
+ <comment xml:lang="uk">аварійні дані про програму</comment>
+ <comment xml:lang="vi">dữ liệu sụp đổ chương trình</comment>
+ <comment xml:lang="zh_CN">程序崩溃数据</comment>
+ <comment xml:lang="zh_TW">程式當掉資料</comment>
+ <magic priority="50">
+ <match value="\177ELF \004" type="string" offset="0" mask="0xffffffff000000000000000000000000ff"/>
+ <match value="\177ELF" type="string" offset="0">
+ <match value="1" type="byte" offset="5">
+ <match value="4" type="little16" offset="16"/>
+ </match>
+ </match>
+ <match value="\177ELF" type="string" offset="0">
+ <match value="2" type="byte" offset="5">
+ <match value="4" type="big16" offset="16"/>
+ </match>
+ </match>
+ <match value="Core\001" type="string" offset="0"/>
+ <match value="Core\002" type="string" offset="0"/>
+ </magic>
+ <glob pattern="core" case-sensitive="true"/>
+ </mime-type>
+ <mime-type type="application/x-cpio">
+ <comment>CPIO archive</comment>
+ <comment xml:lang="ar">أرشيف CPIO</comment>
+ <comment xml:lang="az">CPIO arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ CPIO</comment>
+ <comment xml:lang="bg">Архив — CPIO</comment>
+ <comment xml:lang="ca">arxiu CPIO</comment>
+ <comment xml:lang="cs">Archiv CPIO</comment>
+ <comment xml:lang="cy">Archif CPIO</comment>
+ <comment xml:lang="da">CPIO-arkiv</comment>
+ <comment xml:lang="de">CPIO-Archiv</comment>
+ <comment xml:lang="el">αρχείο CPIO</comment>
+ <comment xml:lang="en_GB">CPIO archive</comment>
+ <comment xml:lang="eo">CPIO-arkivo</comment>
+ <comment xml:lang="es">archivador CPIO</comment>
+ <comment xml:lang="eu">CPIO artxiboa</comment>
+ <comment xml:lang="fi">CPIO-arkisto</comment>
+ <comment xml:lang="fo">CPIO skjalasavn</comment>
+ <comment xml:lang="fr">archive CPIO</comment>
+ <comment xml:lang="ga">cartlann CPIO</comment>
+ <comment xml:lang="gl">arquivo CPIO</comment>
+ <comment xml:lang="he">ארכיון CPIO</comment>
+ <comment xml:lang="hu">CPIO-archívum</comment>
+ <comment xml:lang="id">Arsip CPIO</comment>
+ <comment xml:lang="it">Archivio CPIO</comment>
+ <comment xml:lang="ja">CPIO アーカイブ</comment>
+ <comment xml:lang="kk">CPIO архиві</comment>
+ <comment xml:lang="ko">CPIO 묶음 파일</comment>
+ <comment xml:lang="lt">CPIO archyvas</comment>
+ <comment xml:lang="lv">CPIO arhīvs</comment>
+ <comment xml:lang="ms">Arkib CPIO</comment>
+ <comment xml:lang="nb">CPIO-arkiv</comment>
+ <comment xml:lang="nl">CPIO-archief</comment>
+ <comment xml:lang="nn">CPIO-arkiv</comment>
+ <comment xml:lang="pl">Archiwum CPIO</comment>
+ <comment xml:lang="pt">arquivo CPIO</comment>
+ <comment xml:lang="pt_BR">Pacote CPIO</comment>
+ <comment xml:lang="ro">Arhivă CPIO</comment>
+ <comment xml:lang="ru">архив CPIO</comment>
+ <comment xml:lang="sk">Archív CPIO</comment>
+ <comment xml:lang="sl">Datoteka arhiva CPIO</comment>
+ <comment xml:lang="sq">Arkiv CPIO</comment>
+ <comment xml:lang="sr">CPIO архива</comment>
+ <comment xml:lang="sv">CPIO-arkiv</comment>
+ <comment xml:lang="uk">архів CPIO</comment>
+ <comment xml:lang="vi">Kho nén CPIO</comment>
+ <comment xml:lang="zh_CN">CPIO 归档文件</comment>
+ <comment xml:lang="zh_TW">CPIO 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="070707" type="host16" offset="0"/>
+ <match value="070701" type="string" offset="0"/>
+ <match value="070702" type="string" offset="0"/>
+ <match value="0143561" type="host16" offset="0"/>
+ </magic>
+ <glob pattern="*.cpio"/>
+ </mime-type>
+ <mime-type type="application/x-cpio-compressed">
+ <comment>CPIO archive (gzip-compressed)</comment>
+ <comment xml:lang="ar">أرشيف CPIO (مضغوط-gzip)</comment>
+ <comment xml:lang="az">CPIO arxivi (gzip ilə sıxışdırılmış)</comment>
+ <comment xml:lang="be@latin">Archiŭ CPIO (gzip-skampresavany)</comment>
+ <comment xml:lang="bg">Архив — CPIO, компресиран с gzip</comment>
+ <comment xml:lang="ca">arxiu CPIO (comprimit amb gzip)</comment>
+ <comment xml:lang="cs">Archiv CPIO (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="cy">Archif CPIO (gywasgwyd drwy gzip)</comment>
+ <comment xml:lang="da">CPIO-arkiv (gzip-komprimeret)</comment>
+ <comment xml:lang="de">CPIO-Archiv (gzip-komprimiert)</comment>
+ <comment xml:lang="el">αρχείο CPIO (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="en_GB">CPIO archive (gzip-compressed)</comment>
+ <comment xml:lang="eo">CPIO-arkivo (kunpremita per gzip)</comment>
+ <comment xml:lang="es">archivador CPIO (comprimido con gzip)</comment>
+ <comment xml:lang="eu">CPIO artxiboa (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">CPIO-arkisto (gzip-pakattu)</comment>
+ <comment xml:lang="fo">CPIO skjalasavn (gzip-stappað)</comment>
+ <comment xml:lang="fr">archive CPIO (compressé gzip)</comment>
+ <comment xml:lang="ga">cartlann CPIO (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">arquivo CPIO (comprimido con gzip)</comment>
+ <comment xml:lang="he">ארכיון CPIO (מכווץ ע"י gzip)</comment>
+ <comment xml:lang="hu">CPIO-archívum (gzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Arsip CPIO (terkompresi gzip)</comment>
+ <comment xml:lang="it">Archivio CPIO (compresso con gzip)</comment>
+ <comment xml:lang="ja">CPIO (gzip 圧縮) アーカイブ</comment>
+ <comment xml:lang="kk">CPIO архиві (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">CPIO 묶음 파일 (GZIP 압축)</comment>
+ <comment xml:lang="lt">CPIO archyvas (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">CPIO arhīvs (saspiests ar gzip)</comment>
+ <comment xml:lang="ms">Arkib CPIO (dimampatkan-gzip)</comment>
+ <comment xml:lang="nb">CPIO-arkiv (gzip-komprimert)</comment>
+ <comment xml:lang="nl">CPIO-archief (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">CPIO-arkiv (gzip-pakka)</comment>
+ <comment xml:lang="pl">Archiwum CPIO (kompresja gzip)</comment>
+ <comment xml:lang="pt">arquivo CPIO (comprimido com gzip)</comment>
+ <comment xml:lang="pt_BR">Pacote CPIO (compactado com gzip)</comment>
+ <comment xml:lang="ro">Arhivă CPIO (compresie gzip)</comment>
+ <comment xml:lang="ru">архив CPIO (сжатый GZIP)</comment>
+ <comment xml:lang="sk">Archív CPIO (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva CPIO (skrčena z gzip)</comment>
+ <comment xml:lang="sq">Arkiv CPIO (kompresuar me gzip)</comment>
+ <comment xml:lang="sr">CPIO архива (компресована gzip-ом)</comment>
+ <comment xml:lang="sv">CPIO-arkiv (gzip-komprimerat)</comment>
+ <comment xml:lang="uk">архів CPIO (стиснений gzip)</comment>
+ <comment xml:lang="vi">Kho nén CPIO (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">CPIO 归档文件(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">CPIO 封存檔 (gzip 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.cpio.gz"/>
+ </mime-type>
+ <mime-type type="application/x-csh">
+ <comment>C shell script</comment>
+ <comment xml:lang="ar">سكربت شِل سي</comment>
+ <comment xml:lang="az">C qabıq skripti</comment>
+ <comment xml:lang="be@latin">Skrypt abałonki C</comment>
+ <comment xml:lang="bg">Скрипт — обвивка C</comment>
+ <comment xml:lang="ca">script en C</comment>
+ <comment xml:lang="cs">Skript shellu C</comment>
+ <comment xml:lang="cy">Sgript plisgyn C</comment>
+ <comment xml:lang="da">C-skalprogram</comment>
+ <comment xml:lang="de">C-Shell-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών φλοιού C</comment>
+ <comment xml:lang="en_GB">C shell script</comment>
+ <comment xml:lang="eo">skripto de C-ŝelo</comment>
+ <comment xml:lang="es">script en C shell</comment>
+ <comment xml:lang="eu">C shell script-a</comment>
+ <comment xml:lang="fi">Csh-komentotiedosto</comment>
+ <comment xml:lang="fo">C skel boðrøð</comment>
+ <comment xml:lang="fr">script C shell</comment>
+ <comment xml:lang="ga">script bhlaosc C</comment>
+ <comment xml:lang="gl">script de C shell</comment>
+ <comment xml:lang="he">תסריט מעטפת C</comment>
+ <comment xml:lang="hu">C héj-parancsfájl</comment>
+ <comment xml:lang="id">Skrip shell C</comment>
+ <comment xml:lang="it">Script C shell</comment>
+ <comment xml:lang="ja">C シェルスクリプト</comment>
+ <comment xml:lang="kk">C shell сценарийі</comment>
+ <comment xml:lang="ko">C쉘 스크립트</comment>
+ <comment xml:lang="lt">C shell scenarijus</comment>
+ <comment xml:lang="lv">C čaulas skripts</comment>
+ <comment xml:lang="ms">Skrip shell C</comment>
+ <comment xml:lang="nb">C-skallskript</comment>
+ <comment xml:lang="nl">C-shellscript</comment>
+ <comment xml:lang="nn">C-skalskript</comment>
+ <comment xml:lang="pl">Skrypt powłoki C</comment>
+ <comment xml:lang="pt">'script' de consola C</comment>
+ <comment xml:lang="pt_BR">Script de shell C</comment>
+ <comment xml:lang="ro">Script C shell</comment>
+ <comment xml:lang="ru">сценарий C shell</comment>
+ <comment xml:lang="sk">Skript shellu C</comment>
+ <comment xml:lang="sl">Skriptna datoteka lupine C</comment>
+ <comment xml:lang="sq">Script shell C</comment>
+ <comment xml:lang="sr">C скрипта окружења</comment>
+ <comment xml:lang="sv">Skalskript (csh)</comment>
+ <comment xml:lang="uk">скрипт оболонки C</comment>
+ <comment xml:lang="vi">Văn lệnh trình bao C</comment>
+ <comment xml:lang="zh_CN">C shell 脚本</comment>
+ <comment xml:lang="zh_TW">C shell 指令稿</comment>
+ <sub-class-of type="application/x-shellscript"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match value="/bin/tcsh" type="string" offset="1:16"/>
+ <match value="/bin/csh" type="string" offset="1:16"/>
+ <match value="#!/usr/bin/env csh" type="string" offset="0"/>
+ <match value="#!/usr/bin/env tcsh" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.csh"/>
+ </mime-type>
+ <mime-type type="application/x-dbf">
+ <comment>Xbase document</comment>
+ <comment xml:lang="ar">مستند Xbase</comment>
+ <comment xml:lang="be@latin">Dakument Xbase</comment>
+ <comment xml:lang="bg">Документ — Xbase</comment>
+ <comment xml:lang="ca">document Xbase</comment>
+ <comment xml:lang="cs">Dokument Xbase</comment>
+ <comment xml:lang="da">Xbasedokument</comment>
+ <comment xml:lang="de">Xbase-Dokument</comment>
+ <comment xml:lang="en_GB">Xbase document</comment>
+ <comment xml:lang="eo">Xbase-dokumento</comment>
+ <comment xml:lang="es">documento Xbase</comment>
+ <comment xml:lang="eu">Xbase dokumentua</comment>
+ <comment xml:lang="fi">Xbase-asiakirja</comment>
+ <comment xml:lang="fo">Xbase skjal</comment>
+ <comment xml:lang="fr">document Xbase</comment>
+ <comment xml:lang="ga">cáipéis Xbase</comment>
+ <comment xml:lang="gl">documento Xbase</comment>
+ <comment xml:lang="he">מסמך Xbase</comment>
+ <comment xml:lang="hu">Xbase dokumentum</comment>
+ <comment xml:lang="id">Dokumen Xbase</comment>
+ <comment xml:lang="it">Documento Xbase</comment>
+ <comment xml:lang="ja">Xbase ドキュメント</comment>
+ <comment xml:lang="kk">Xbase құжаты</comment>
+ <comment xml:lang="ko">Xbase 문서</comment>
+ <comment xml:lang="lt">Xbase dokumentas</comment>
+ <comment xml:lang="lv">Xbase dokuments</comment>
+ <comment xml:lang="nb">Xbase-dokument</comment>
+ <comment xml:lang="nl">Xbase-document</comment>
+ <comment xml:lang="nn">Xbase-dokument</comment>
+ <comment xml:lang="pl">Dokument Xbase</comment>
+ <comment xml:lang="pt_BR">Documento do Xbase</comment>
+ <comment xml:lang="ro">Document Xbase</comment>
+ <comment xml:lang="ru">документ Xbase</comment>
+ <comment xml:lang="sk">Dokument Xbase</comment>
+ <comment xml:lang="sl">Dokument Xbase</comment>
+ <comment xml:lang="sq">Dokument Xbase</comment>
+ <comment xml:lang="sv">Xbase-dokument</comment>
+ <comment xml:lang="uk">документ Xbase</comment>
+ <comment xml:lang="vi">Tài liệu Xbase</comment>
+ <comment xml:lang="zh_CN">Xbase 文档</comment>
+ <comment xml:lang="zh_TW">Xbase 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.dbf"/>
+ <alias type="application/x-dbase"/>
+ <alias type="application/dbf"/>
+ <alias type="application/dbase"/>
+ </mime-type>
+ <mime-type type="application/ecmascript">
+ <comment>ECMAScript program</comment>
+ <comment xml:lang="ar">برنامج ECMAScript</comment>
+ <comment xml:lang="be@latin">Prahrama ECMAScript</comment>
+ <comment xml:lang="bg">Програма — ECMAScript</comment>
+ <comment xml:lang="ca">programa ECMAScript</comment>
+ <comment xml:lang="cs">Program ECMAScript</comment>
+ <comment xml:lang="da">ECMA-program</comment>
+ <comment xml:lang="de">ECMAScript-Programm</comment>
+ <comment xml:lang="es">programa en ECMAScript</comment>
+ <comment xml:lang="eu">ECMAScript programa</comment>
+ <comment xml:lang="fi">ECMAScript-ohjelma</comment>
+ <comment xml:lang="fo">ECMAScript forrit</comment>
+ <comment xml:lang="fr">programme ECMAScript</comment>
+ <comment xml:lang="ga">ríomhchlár ECMAScript</comment>
+ <comment xml:lang="gl">programa en ECMAScript</comment>
+ <comment xml:lang="he">תכנית EMCAScript</comment>
+ <comment xml:lang="hu">ECMAScript program</comment>
+ <comment xml:lang="id">Program ECMAScript</comment>
+ <comment xml:lang="it">Programma ECMAScript</comment>
+ <comment xml:lang="ja">ECMAScript プログラム</comment>
+ <comment xml:lang="kk">ECMAScript программасы</comment>
+ <comment xml:lang="ko">ECMA스크립트 프로그램</comment>
+ <comment xml:lang="lt">ECMAScript programa</comment>
+ <comment xml:lang="lv">ECMAScript programma</comment>
+ <comment xml:lang="nb">ECMAScript-program</comment>
+ <comment xml:lang="nl">ECMAScript-programma</comment>
+ <comment xml:lang="nn">ECMAScript-program</comment>
+ <comment xml:lang="pl">Pogram ECMAScript</comment>
+ <comment xml:lang="pt_BR">Programa ECMAScript</comment>
+ <comment xml:lang="ro">Program ECMAScript</comment>
+ <comment xml:lang="ru">программа ECMAScript</comment>
+ <comment xml:lang="sk">Program ECMAScript</comment>
+ <comment xml:lang="sl">Programska datoteka ECMAScript</comment>
+ <comment xml:lang="sq">Program ECMAScript</comment>
+ <comment xml:lang="sv">ECMAScript-program</comment>
+ <comment xml:lang="uk">програма мовою ECMAScript</comment>
+ <comment xml:lang="vi">Chương trình ECMAScript</comment>
+ <comment xml:lang="zh_CN">ECMAScript 程序</comment>
+ <comment xml:lang="zh_TW">ECMAScript 程式</comment>
+ <alias type="text/ecmascript"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.es"/>
+ </mime-type>
+ <mime-type type="application/x-dc-rom">
+ <comment>Dreamcast ROM</comment>
+ <comment xml:lang="ar">Dreamcast ROM</comment>
+ <comment xml:lang="be@latin">Dreamcast ROM</comment>
+ <comment xml:lang="bg">ROM — Dreamcast</comment>
+ <comment xml:lang="ca">ROM de Dreamcast</comment>
+ <comment xml:lang="cs">ROM pro Dreamcast</comment>
+ <comment xml:lang="da">Dreamcast-rom</comment>
+ <comment xml:lang="de">Dreamcast-ROM</comment>
+ <comment xml:lang="el">εικόνα μνήμης ROM Dreamcast</comment>
+ <comment xml:lang="en_GB">Dreamcast ROM</comment>
+ <comment xml:lang="eo">Dreamcast-NLM</comment>
+ <comment xml:lang="es">ROM de Dreamcast</comment>
+ <comment xml:lang="eu">Dreamcast-en ROM</comment>
+ <comment xml:lang="fi">Dreamcast-ROM</comment>
+ <comment xml:lang="fo">Dreamcast ROM</comment>
+ <comment xml:lang="fr">ROM Dreamcast</comment>
+ <comment xml:lang="ga">ROM Dreamcast</comment>
+ <comment xml:lang="gl">ROM de Dreamcast</comment>
+ <comment xml:lang="he">ROM של Dreamcast</comment>
+ <comment xml:lang="hu">Dreamcast ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Dreamcast</comment>
+ <comment xml:lang="it">ROM Dreamcast</comment>
+ <comment xml:lang="ja">Dreamcast ROM</comment>
+ <comment xml:lang="kk">Dreamcast ROM</comment>
+ <comment xml:lang="ko">드림캐스트 롬</comment>
+ <comment xml:lang="lt">Dreamcast ROM</comment>
+ <comment xml:lang="lv">Dreamcast ROM</comment>
+ <comment xml:lang="ms">ROM Dreamcast</comment>
+ <comment xml:lang="nb">Dreamcast-ROM</comment>
+ <comment xml:lang="nl">Dreamcast-ROM</comment>
+ <comment xml:lang="nn">Dreamcast-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Dreamcast</comment>
+ <comment xml:lang="pt">ROM Dreamcast</comment>
+ <comment xml:lang="pt_BR">ROM do Dreamcast</comment>
+ <comment xml:lang="ro">ROM Dreamcast</comment>
+ <comment xml:lang="ru">Dreamcast ROM </comment>
+ <comment xml:lang="sk">ROM pre Dreamcast</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Dreamcast</comment>
+ <comment xml:lang="sq">ROM Dreamcast</comment>
+ <comment xml:lang="sr">Dreamcast ROM</comment>
+ <comment xml:lang="sv">Dreamcast-rom</comment>
+ <comment xml:lang="uk">ППП Dreamcast</comment>
+ <comment xml:lang="vi">ROM Dreamcast</comment>
+ <comment xml:lang="zh_CN">Dreamcast ROM</comment>
+ <comment xml:lang="zh_TW">Dreamcast ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.dc"/>
+ </mime-type>
+ <mime-type type="application/x-nintendo-ds-rom">
+ <comment>Nintendo DS ROM</comment>
+ <comment xml:lang="ar">Nintendo DS ROM</comment>
+ <comment xml:lang="be@latin">Nintendo DS ROM</comment>
+ <comment xml:lang="bg">ROM — Nintendo DS</comment>
+ <comment xml:lang="ca">ROM de Nintendo DS</comment>
+ <comment xml:lang="cs">ROM pro Nintendo DS</comment>
+ <comment xml:lang="da">Nintendo DS-rom</comment>
+ <comment xml:lang="de">Nintendo-DS-ROM</comment>
+ <comment xml:lang="es">ROM de Nintendo DS</comment>
+ <comment xml:lang="eu">Nintendo DS-ko ROMa</comment>
+ <comment xml:lang="fi">Nintendo DS-ROM</comment>
+ <comment xml:lang="fo">Nintendo DS ROM</comment>
+ <comment xml:lang="fr">ROM Nintendo DS</comment>
+ <comment xml:lang="ga">ROM Nintendo DS</comment>
+ <comment xml:lang="gl">ROM de Nintendo DS</comment>
+ <comment xml:lang="he">ROM של Nintendo</comment>
+ <comment xml:lang="hu">Nintendo DS ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Nintendo DS</comment>
+ <comment xml:lang="it">ROM Nintendo DS</comment>
+ <comment xml:lang="ja">Nintendo DS ROM</comment>
+ <comment xml:lang="kk">Nintendo DS ROM</comment>
+ <comment xml:lang="ko">닌텐도 DS 롬</comment>
+ <comment xml:lang="lt">Nintendo DS ROM</comment>
+ <comment xml:lang="lv">Nintendo DS ROM</comment>
+ <comment xml:lang="nb">Nintendo DS-ROM</comment>
+ <comment xml:lang="nl">Nintendo-DS-ROM</comment>
+ <comment xml:lang="nn">Nintendo DS-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Nintendo DS</comment>
+ <comment xml:lang="pt_BR">ROM do Nintendo DS</comment>
+ <comment xml:lang="ro">ROM Nintendo DS</comment>
+ <comment xml:lang="ru">Nintendo DS ROM</comment>
+ <comment xml:lang="sk">ROM pre Nintendo DS</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Nintendo DS</comment>
+ <comment xml:lang="sq">ROM Nintendo DS</comment>
+ <comment xml:lang="sv">Nintendo DS-rom</comment>
+ <comment xml:lang="uk">ППП Nintendo</comment>
+ <comment xml:lang="vi">ROM DS Nintendo</comment>
+ <comment xml:lang="zh_CN">Nintendo DS ROM</comment>
+ <comment xml:lang="zh_TW">任天堂 DS ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.nds"/>
+ </mime-type>
+ <mime-type type="application/x-deb">
+ <comment>Debian package</comment>
+ <comment xml:lang="ar">حزمة ديبيان</comment>
+ <comment xml:lang="az">Debian paketi</comment>
+ <comment xml:lang="be@latin">Pakunak Debian</comment>
+ <comment xml:lang="bg">Пакет — Debian</comment>
+ <comment xml:lang="ca">paquet Debian</comment>
+ <comment xml:lang="cs">Balíček Debianu</comment>
+ <comment xml:lang="cy">Pecyn Debian</comment>
+ <comment xml:lang="da">Debianpakke</comment>
+ <comment xml:lang="de">Debian-Paket</comment>
+ <comment xml:lang="el">πακέτο Debian</comment>
+ <comment xml:lang="en_GB">Debian package</comment>
+ <comment xml:lang="eo">Debian-pakaĵo</comment>
+ <comment xml:lang="es">paquete Debian</comment>
+ <comment xml:lang="eu">Debian paketea</comment>
+ <comment xml:lang="fi">Debian-paketti</comment>
+ <comment xml:lang="fo">Debian pakki</comment>
+ <comment xml:lang="fr">paquet Debian</comment>
+ <comment xml:lang="ga">pacáiste Debian</comment>
+ <comment xml:lang="gl">paquete de Debian</comment>
+ <comment xml:lang="he">חבילת דביאן</comment>
+ <comment xml:lang="hu">Debian-csomag</comment>
+ <comment xml:lang="id">Paket Debian</comment>
+ <comment xml:lang="it">Pacchetto Debian</comment>
+ <comment xml:lang="ja">Debian パッケージ</comment>
+ <comment xml:lang="kk">Debian дестесі</comment>
+ <comment xml:lang="ko">데비안 패키지</comment>
+ <comment xml:lang="lt">Debian paketas</comment>
+ <comment xml:lang="lv">Debian pakotne</comment>
+ <comment xml:lang="ms">Pakej Debian</comment>
+ <comment xml:lang="nb">Debian pakke</comment>
+ <comment xml:lang="nl">Debian-pakket</comment>
+ <comment xml:lang="nn">Debian pakke</comment>
+ <comment xml:lang="pl">Pakiet Debiana</comment>
+ <comment xml:lang="pt">pacote Debian</comment>
+ <comment xml:lang="pt_BR">Pacote Debian</comment>
+ <comment xml:lang="ro">Pachet Debian</comment>
+ <comment xml:lang="ru">пакет Debian</comment>
+ <comment xml:lang="sk">Balíček Debianu</comment>
+ <comment xml:lang="sl">Datoteka paketa Debian</comment>
+ <comment xml:lang="sq">Paketë Debian</comment>
+ <comment xml:lang="sr">Debian пакет</comment>
+ <comment xml:lang="sv">Debianpaket</comment>
+ <comment xml:lang="uk">пакунок Debian</comment>
+ <comment xml:lang="vi">Gói Debian</comment>
+ <comment xml:lang="zh_CN">Debian 软件包</comment>
+ <comment xml:lang="zh_TW">Debian 套件</comment>
+ <alias type="application/x-debian-package"/>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="!&lt;arch&gt;" type="string" offset="0">
+ <match value="debian" type="string" offset="8"/>
+ </match>
+ </magic>
+ <glob pattern="*.deb"/>
+ </mime-type>
+ <mime-type type="application/x-designer">
+ <comment>Qt Designer file</comment>
+ <comment xml:lang="ar">ملف Qt Designer</comment>
+ <comment xml:lang="be@latin">Fajł Qt Designer</comment>
+ <comment xml:lang="bg">Файл — Qt Designer</comment>
+ <comment xml:lang="ca">fitxer de Qt Designer</comment>
+ <comment xml:lang="cs">Soubor Qt Designer</comment>
+ <comment xml:lang="da">Qt Designer-fil</comment>
+ <comment xml:lang="de">Qt-Designer-Datei</comment>
+ <comment xml:lang="el">αρχείο Qt Designer</comment>
+ <comment xml:lang="en_GB">Qt Designer file</comment>
+ <comment xml:lang="eo">dosiero de Qt Designer</comment>
+ <comment xml:lang="es">archivo de Qt Designer</comment>
+ <comment xml:lang="eu">Qt Designer Fitxategia</comment>
+ <comment xml:lang="fi">Qt Designer -tiedosto</comment>
+ <comment xml:lang="fo">Qt Designer fíla</comment>
+ <comment xml:lang="fr">fichier Qt Designer</comment>
+ <comment xml:lang="ga">comhad Qt Designer</comment>
+ <comment xml:lang="gl">ficheiro de Qt Designer</comment>
+ <comment xml:lang="he">קובץ של Qt Designer</comment>
+ <comment xml:lang="hu">Qt Designer-fájl</comment>
+ <comment xml:lang="id">Berkas Qt Designer</comment>
+ <comment xml:lang="it">File Qt Designer</comment>
+ <comment xml:lang="ja">Qt Designer ファイル</comment>
+ <comment xml:lang="kk">Qt Designer файлы</comment>
+ <comment xml:lang="ko">Qt 디자이너 파일</comment>
+ <comment xml:lang="lt">Qt Designer failas</comment>
+ <comment xml:lang="lv">Qt Designer fails</comment>
+ <comment xml:lang="ms">Fail Qt Designer</comment>
+ <comment xml:lang="nb">Qt Designer-fil</comment>
+ <comment xml:lang="nl">Qt Designer-bestand</comment>
+ <comment xml:lang="nn">Qt Designer-fil</comment>
+ <comment xml:lang="pl">Plik Qt Designer</comment>
+ <comment xml:lang="pt">ficheiro do Qt Designer</comment>
+ <comment xml:lang="pt_BR">Arquivo do Qt Designer</comment>
+ <comment xml:lang="ro">Fișier Qt Designer</comment>
+ <comment xml:lang="ru">файл Qt Designer</comment>
+ <comment xml:lang="sk">Súbor Qt Designer</comment>
+ <comment xml:lang="sl">Datoteka Qt Designer</comment>
+ <comment xml:lang="sq">File Qt Designer</comment>
+ <comment xml:lang="sr">Qt Designer датотека</comment>
+ <comment xml:lang="sv">Qt Designer-fil</comment>
+ <comment xml:lang="uk">файл програми Qt-дизайнер</comment>
+ <comment xml:lang="vi">Tập tin thiết kế Qt Designer</comment>
+ <comment xml:lang="zh_CN">Qt Designer 文件</comment>
+ <comment xml:lang="zh_TW">Qt Designer 檔案</comment>
+ <generic-icon name="x-office-document"/>
+ <sub-class-of type="application/xml"/>
+ <magic>
+ <match value="&lt;ui " type="string" offset="0:256"/>
+ <match value="&lt;UI " type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.ui"/>
+ </mime-type>
+ <mime-type type="text/x-qml">
+ <comment>Qt Markup Language file</comment>
+ <comment xml:lang="bg">Файл — Qt Markup</comment>
+ <comment xml:lang="ca">fitxer de llenguatge de marcadors Qt</comment>
+ <comment xml:lang="cs">Soubor Qt Markup Language</comment>
+ <comment xml:lang="de">Qt-Auszeichnungssprachendatei</comment>
+ <comment xml:lang="es">Archivo de lenguaje de marcado Qt</comment>
+ <comment xml:lang="fr">fichier Qt Markup Language</comment>
+ <comment xml:lang="gl">ficheiro de linguaxe de marcado Qt</comment>
+ <comment xml:lang="he">קובץ שפת סימון של Qt</comment>
+ <comment xml:lang="hu">Qt jelölőnyelvű fájl</comment>
+ <comment xml:lang="id">Berkas Bahasa Markup Qt</comment>
+ <comment xml:lang="it">File Qt Markup Language</comment>
+ <comment xml:lang="ja">Qt マークアップ言語ファイル</comment>
+ <comment xml:lang="kk">Qt Markup Language файлы</comment>
+ <comment xml:lang="ko">Qt 마크업 언어 파일</comment>
+ <comment xml:lang="lv">Qt marķēšanas valodas fails</comment>
+ <comment xml:lang="pl">Plik języka znaczników Qt</comment>
+ <comment xml:lang="ru">файл Qt Markup Language</comment>
+ <comment xml:lang="sl">Datoteka označevalnega jezika Qt</comment>
+ <comment xml:lang="uk">файл мови розмітки Qt</comment>
+ <comment xml:lang="zh_CN">Qt </comment>
+ <comment xml:lang="zh_TW">Qt 標記語言檔</comment>
+ <magic priority="80">
+ <match value="import Qt " type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.qml"/>
+ </mime-type>
+ <mime-type type="application/x-desktop">
+ <comment>desktop configuration file</comment>
+ <comment xml:lang="ar">ملف تضبيط سطح المكتب</comment>
+ <comment xml:lang="be@latin">kanfihuracyjny fajł asiarodździa</comment>
+ <comment xml:lang="bg">Файл с информация за работния плот</comment>
+ <comment xml:lang="ca">fitxer de configuració d'escriptori</comment>
+ <comment xml:lang="cs">Soubor nastavení pracovní plochy</comment>
+ <comment xml:lang="da">skrivebordskonfigurationsfil</comment>
+ <comment xml:lang="de">Desktop-Konfigurationsdatei</comment>
+ <comment xml:lang="el">ρυθμίσεις επιφάνεια εργασίας</comment>
+ <comment xml:lang="en_GB">desktop configuration file</comment>
+ <comment xml:lang="eo">dosiero de agordoj de labortablo</comment>
+ <comment xml:lang="es">archivo de configuración del escritorio</comment>
+ <comment xml:lang="eu">Mahaigainaren konfigurazio-fitxategia</comment>
+ <comment xml:lang="fi">työpöydän asetustiedosto</comment>
+ <comment xml:lang="fo">skriviborðssamansetingarfíla</comment>
+ <comment xml:lang="fr">fichier de configuration desktop</comment>
+ <comment xml:lang="ga">comhad chumraíocht deisce</comment>
+ <comment xml:lang="gl">ficheiro de configuración de escritorio</comment>
+ <comment xml:lang="he">קובץ הגדרות של שולחן העבודה</comment>
+ <comment xml:lang="hu">asztalbeállító fájl</comment>
+ <comment xml:lang="id">berkas konfigurasi destop</comment>
+ <comment xml:lang="it">File configurazione desktop</comment>
+ <comment xml:lang="ja">デスクトップ設定ファイル</comment>
+ <comment xml:lang="kk">жұмыс үстел баптаулар файлы</comment>
+ <comment xml:lang="ko">데스크톱 설정 파일</comment>
+ <comment xml:lang="lt">darbastalio konfigūracijos failas</comment>
+ <comment xml:lang="lv">darbvirsmas konfigurācijas fails</comment>
+ <comment xml:lang="ms">Fail konfigurasi desktop</comment>
+ <comment xml:lang="nb">konfigurasjonsfil for skrivebordet</comment>
+ <comment xml:lang="nl">bureaublad-configuratiebestand</comment>
+ <comment xml:lang="nn">skrivebordsoppsettfil</comment>
+ <comment xml:lang="pl">Plik konfiguracji środowiska</comment>
+ <comment xml:lang="pt">ficheiro de configuração de área de trabalho</comment>
+ <comment xml:lang="pt_BR">arquivo de configuração de área de trabalho</comment>
+ <comment xml:lang="ro">fișier de configurare al desktopului</comment>
+ <comment xml:lang="ru">файл настроек рабочего стола</comment>
+ <comment xml:lang="sk">Súbor nastavení pracovnej plochy</comment>
+ <comment xml:lang="sl">nastavitvena datoteka namizja</comment>
+ <comment xml:lang="sq">File konfigurimi desktop</comment>
+ <comment xml:lang="sr">датотека за подешавања радне површи</comment>
+ <comment xml:lang="sv">skrivbordskonfigurationsfil</comment>
+ <comment xml:lang="uk">файл конфігурації стільниці</comment>
+ <comment xml:lang="vi">tập tin cấu hình môi trường</comment>
+ <comment xml:lang="zh_CN">桌面配置文件</comment>
+ <comment xml:lang="zh_TW">桌面組態檔</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="[Desktop Entry]" type="string" offset="0:32"/>
+ <match value="[Desktop Action" type="string" offset="0"/>
+ <match value="[KDE Desktop Entry]" type="string" offset="0"/>
+ <match value="# Config File" type="string" offset="0"/>
+ <match value="# KDE Config File" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.desktop"/>
+ <glob pattern="*.kdelnk"/>
+ <alias type="application/x-gnome-app-info"/>
+ </mime-type>
+ <mime-type type="application/x-fictionbook+xml">
+ <comment>FictionBook document</comment>
+ <comment xml:lang="ar">مستند FictionBook</comment>
+ <comment xml:lang="bg">Документ — FictionBook</comment>
+ <comment xml:lang="ca">document FictionBook</comment>
+ <comment xml:lang="cs">Dokument FictionBook</comment>
+ <comment xml:lang="da">FictionBook-dokument</comment>
+ <comment xml:lang="de">FictionBook-Dokument</comment>
+ <comment xml:lang="eo">FictionBook-dokumento</comment>
+ <comment xml:lang="es">documento FictionBook</comment>
+ <comment xml:lang="eu">FictionBook dokumentua</comment>
+ <comment xml:lang="fi">FictionBook-asiakirja</comment>
+ <comment xml:lang="fo">FictionBook skjal</comment>
+ <comment xml:lang="fr">document FictionBook</comment>
+ <comment xml:lang="ga">cáipéis FictionBook</comment>
+ <comment xml:lang="gl">documento de FictionBook</comment>
+ <comment xml:lang="he">מסמך FictionBook</comment>
+ <comment xml:lang="hu">FictionBook-dokumentum</comment>
+ <comment xml:lang="id">Dokumen FictionBook</comment>
+ <comment xml:lang="it">Documento FictionBook</comment>
+ <comment xml:lang="ja">FictionBook ドキュメント</comment>
+ <comment xml:lang="kk">FictionBook құжаты</comment>
+ <comment xml:lang="ko">FictionBook 문서</comment>
+ <comment xml:lang="lt">FictionBook dokumentas</comment>
+ <comment xml:lang="lv">FictionBook dokuments</comment>
+ <comment xml:lang="nl">FictionBook-document</comment>
+ <comment xml:lang="pl">Dokument FictionBook</comment>
+ <comment xml:lang="pt_BR">Documento FictionBook</comment>
+ <comment xml:lang="ro">Document FictionBook</comment>
+ <comment xml:lang="ru">документ FictionBook</comment>
+ <comment xml:lang="sk">Dokument FictionBook</comment>
+ <comment xml:lang="sl">Dokument FictionBook</comment>
+ <comment xml:lang="sv">FictionBook-dokument</comment>
+ <comment xml:lang="uk">документ FictionBook</comment>
+ <comment xml:lang="vi">Tài liệu FictionBook</comment>
+ <comment xml:lang="zh_CN">FictionBook 文档</comment>
+ <comment xml:lang="zh_TW">FictionBook 文件</comment>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.fb2"/>
+ <magic priority="80">
+ <match value="&lt;FictionBook" type="string" offset="0:256"/>
+ </magic>
+ <alias type="application/x-fictionbook"/>
+ <root-XML namespaceURI="http://www.gribuser.ru/xml/fictionbook/2.0" localName="FictionBook"/>
+ </mime-type>
+ <mime-type type="application/x-dia-diagram">
+ <comment>Dia diagram</comment>
+ <comment xml:lang="ar">خطاطة Dia</comment>
+ <comment xml:lang="az">Dia diaqramı</comment>
+ <comment xml:lang="be@latin">Dyjahrama Dia</comment>
+ <comment xml:lang="bg">Диаграма — Dia</comment>
+ <comment xml:lang="ca">diagrama de Dia</comment>
+ <comment xml:lang="cs">Diagram Dia</comment>
+ <comment xml:lang="cy">Diagram Dia</comment>
+ <comment xml:lang="da">Dia-diagram</comment>
+ <comment xml:lang="de">Dia-Diagramm</comment>
+ <comment xml:lang="el">διάγραμμα Dia</comment>
+ <comment xml:lang="en_GB">Dia diagram</comment>
+ <comment xml:lang="eo">Dia-diagramo</comment>
+ <comment xml:lang="es">diagrama de Dia</comment>
+ <comment xml:lang="eu">Dia diagrama</comment>
+ <comment xml:lang="fi">Dia-kaavio</comment>
+ <comment xml:lang="fo">Dia ritmynd</comment>
+ <comment xml:lang="fr">diagramme Dia</comment>
+ <comment xml:lang="ga">léaráid Dia</comment>
+ <comment xml:lang="gl">diagrama de Dia</comment>
+ <comment xml:lang="he">גרף של Dia</comment>
+ <comment xml:lang="hu">Dia-diagram</comment>
+ <comment xml:lang="id">Diagram Dia</comment>
+ <comment xml:lang="it">Diagramma Dia</comment>
+ <comment xml:lang="ja">Dia ダイアグラム</comment>
+ <comment xml:lang="kk">Dia диаграммасы</comment>
+ <comment xml:lang="ko">Dia 도표</comment>
+ <comment xml:lang="lt">Dia diagrama</comment>
+ <comment xml:lang="lv">Dia diagramma</comment>
+ <comment xml:lang="ms">Diagram Dia</comment>
+ <comment xml:lang="nb">Dia-diagram</comment>
+ <comment xml:lang="nl">Dia-diagram</comment>
+ <comment xml:lang="nn">Dia diagram</comment>
+ <comment xml:lang="pl">Diagram Dia</comment>
+ <comment xml:lang="pt">diagrama Dia</comment>
+ <comment xml:lang="pt_BR">Diagrama do Dia</comment>
+ <comment xml:lang="ro">Diagramă Dia</comment>
+ <comment xml:lang="ru">диаграмма Dia</comment>
+ <comment xml:lang="sk">Diagram Dia</comment>
+ <comment xml:lang="sl">Datoteka diagrama Dia</comment>
+ <comment xml:lang="sq">Diagramë Dia</comment>
+ <comment xml:lang="sr">Диа дијаграм</comment>
+ <comment xml:lang="sv">Dia-diagram</comment>
+ <comment xml:lang="uk">діаграма Dia</comment>
+ <comment xml:lang="vi">Biểu đồ Dia</comment>
+ <comment xml:lang="zh_CN">Dia 图表</comment>
+ <comment xml:lang="zh_TW">Dia 圖表</comment>
+ <generic-icon name="image-x-generic"/>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.dia"/>
+ <magic priority="50">
+ <match value="&lt;dia:" type="string" offset="5:100"/>
+ </magic>
+ <root-XML namespaceURI="http://www.lysator.liu.se/~alla/dia/" localName="diagram"/>
+ </mime-type>
+ <mime-type type="application/x-dia-shape">
+ <comment>Dia shape</comment>
+ <comment xml:lang="ar">شكل Dia</comment>
+ <comment xml:lang="bg">Фигура — Dia</comment>
+ <comment xml:lang="ca">forma del Dia</comment>
+ <comment xml:lang="cs">Tvary Dia</comment>
+ <comment xml:lang="da">Dia-figur</comment>
+ <comment xml:lang="de">Dia-Form</comment>
+ <comment xml:lang="es">forma de Dia</comment>
+ <comment xml:lang="eu">Dia-ren forma</comment>
+ <comment xml:lang="fo">Dia skapur</comment>
+ <comment xml:lang="fr">forme Dia</comment>
+ <comment xml:lang="ga">cruth Dia</comment>
+ <comment xml:lang="gl">forma de Dia</comment>
+ <comment xml:lang="he">צורה של Dia</comment>
+ <comment xml:lang="hu">Dia alakzat</comment>
+ <comment xml:lang="id">Shape Dia</comment>
+ <comment xml:lang="it">Sagoma Dia</comment>
+ <comment xml:lang="ja">Dia 図形</comment>
+ <comment xml:lang="kk">Dia сызбасы</comment>
+ <comment xml:lang="ko">Dia 그림</comment>
+ <comment xml:lang="lt">Dia forma</comment>
+ <comment xml:lang="lv">Dia forma</comment>
+ <comment xml:lang="pl">Kształt Dia</comment>
+ <comment xml:lang="ro">Figură Dia</comment>
+ <comment xml:lang="ru">фигура Dia</comment>
+ <comment xml:lang="sl">Datoteka oblik Dia</comment>
+ <comment xml:lang="sv">Dia-figur</comment>
+ <comment xml:lang="uk">форма Dia</comment>
+ <comment xml:lang="zh_CN">Dia 形状</comment>
+ <comment xml:lang="zh_TW">Dia 形狀</comment>
+ <generic-icon name="image-x-generic"/>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.shape"/>
+ <magic priority="50">
+ <match value="&lt;shape" type="string" offset="5:100"/>
+ </magic>
+ <root-XML namespaceURI="http://www.daa.com.au/~james/dia-shape-ns" localName="shape"/>
+ </mime-type>
+ <mime-type type="application/x-dvi">
+ <comment>TeX DVI document</comment>
+ <comment xml:lang="ar">مستند TeX DVI</comment>
+ <comment xml:lang="be@latin">Dakument TeX DVI</comment>
+ <comment xml:lang="bg">Документ — TeX DVI</comment>
+ <comment xml:lang="ca">document TeX DVI</comment>
+ <comment xml:lang="cs">Dokument TeX DVI</comment>
+ <comment xml:lang="da">TeX DVI-dokument</comment>
+ <comment xml:lang="de">TeX-DVI-Dokument</comment>
+ <comment xml:lang="el"> έγγραφο TeX DVI</comment>
+ <comment xml:lang="en_GB">TeX DVI document</comment>
+ <comment xml:lang="eo">DVI-dokumento de TeX</comment>
+ <comment xml:lang="es">documento TeX DVI</comment>
+ <comment xml:lang="eu">TeX DVI dokumentua</comment>
+ <comment xml:lang="fi">TeX DVI -asiakirja</comment>
+ <comment xml:lang="fo">TeX DVI skjal</comment>
+ <comment xml:lang="fr">document TeX DVI</comment>
+ <comment xml:lang="ga">cáipéis DVI TeX</comment>
+ <comment xml:lang="gl">documento TeX DVI</comment>
+ <comment xml:lang="he">מסמך מסוג TeX DVI</comment>
+ <comment xml:lang="hu">TeX DVI-dokumentum</comment>
+ <comment xml:lang="id">Dokumen TeX DVI</comment>
+ <comment xml:lang="it">Documento TeX DVI</comment>
+ <comment xml:lang="ja">TeX DVI ドキュメント</comment>
+ <comment xml:lang="kk">TeX DVI құжаты</comment>
+ <comment xml:lang="ko">TeX DVI 문서</comment>
+ <comment xml:lang="lt">TeX DVI dokumentas</comment>
+ <comment xml:lang="lv">TeX DVI dokuments</comment>
+ <comment xml:lang="ms">Dokumen TeX DVI</comment>
+ <comment xml:lang="nb">TeX DVI-dokument</comment>
+ <comment xml:lang="nl">TeX DVI-document</comment>
+ <comment xml:lang="nn">TeX DVI-dokument</comment>
+ <comment xml:lang="pl">Dokument TeX DVI</comment>
+ <comment xml:lang="pt">documento TeX DVI</comment>
+ <comment xml:lang="pt_BR">Documento TeX DVI</comment>
+ <comment xml:lang="ro">Document Tex DVI</comment>
+ <comment xml:lang="ru">документ TeX DVI</comment>
+ <comment xml:lang="sk">Dokument TeX DVI</comment>
+ <comment xml:lang="sl">Dokument TeX DVI</comment>
+ <comment xml:lang="sq">Dokument TeX DVI</comment>
+ <comment xml:lang="sr">ТеХ ДВИ документ</comment>
+ <comment xml:lang="sv">TeX DVI-dokument</comment>
+ <comment xml:lang="uk">документ TeX DVI</comment>
+ <comment xml:lang="vi">Tài liệu DVI Tex</comment>
+ <comment xml:lang="zh_CN">TeX DVI 文档</comment>
+ <comment xml:lang="zh_TW">TeX DVI 文件</comment>
+ <acronym>DVI</acronym>
+ <expanded-acronym>Device independent file format</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="0x02f7" type="little16" offset="0"/>
+ </magic>
+ <glob pattern="*.dvi"/>
+ </mime-type>
+ <mime-type type="application/x-e-theme">
+ <comment>Enlightenment theme</comment>
+ <comment xml:lang="ar">سمة Enlightenment</comment>
+ <comment xml:lang="az">Enlightenment örtüyü</comment>
+ <comment xml:lang="be@latin">Matyŭ Enlightenment</comment>
+ <comment xml:lang="bg">Тема — Enlightenment</comment>
+ <comment xml:lang="ca">tema d'Enlightenment</comment>
+ <comment xml:lang="cs">Motiv Enlightenment</comment>
+ <comment xml:lang="cy">Thema Enlightenment</comment>
+ <comment xml:lang="da">Enlightenmenttema</comment>
+ <comment xml:lang="de">Enlightenment-Thema</comment>
+ <comment xml:lang="el">Θέμα Enlightenment</comment>
+ <comment xml:lang="en_GB">Enlightenment theme</comment>
+ <comment xml:lang="eo">etoso de Enlightenment</comment>
+ <comment xml:lang="es">tema de Enlightenment</comment>
+ <comment xml:lang="eu">Enlightenment gaia</comment>
+ <comment xml:lang="fi">Enlightenment-teema</comment>
+ <comment xml:lang="fo">Enlightenment tema</comment>
+ <comment xml:lang="fr">thème Enlightenment</comment>
+ <comment xml:lang="ga">téama Enlightenment</comment>
+ <comment xml:lang="gl">tema de Enlightenment</comment>
+ <comment xml:lang="he">ערכת נושא של Enlightenment</comment>
+ <comment xml:lang="hu">Enlightenment-téma</comment>
+ <comment xml:lang="id">Tema Enlightenment</comment>
+ <comment xml:lang="it">Tema Enlightenment</comment>
+ <comment xml:lang="ja">Enlightenment テーマ</comment>
+ <comment xml:lang="kk">Enlightenment темасы</comment>
+ <comment xml:lang="ko">인라이트먼트 테마</comment>
+ <comment xml:lang="lt">Enlightenment tema</comment>
+ <comment xml:lang="lv">Enlightenment tēma</comment>
+ <comment xml:lang="ms">Tema Enlightenment</comment>
+ <comment xml:lang="nb">Enlightenment tema</comment>
+ <comment xml:lang="nl">Enlightenment-thema</comment>
+ <comment xml:lang="nn">Enlightenment-tema</comment>
+ <comment xml:lang="pl">Motyw Enlightenment</comment>
+ <comment xml:lang="pt">tema Enlightenment</comment>
+ <comment xml:lang="pt_BR">Tema do Enlightenment</comment>
+ <comment xml:lang="ro">Temă Enlightenment</comment>
+ <comment xml:lang="ru">тема Enlightenment</comment>
+ <comment xml:lang="sk">Motív Enlightenment</comment>
+ <comment xml:lang="sl">Datoteka teme Enlightenment</comment>
+ <comment xml:lang="sq">Tema Enlightenment</comment>
+ <comment xml:lang="sr">Enlightenment тема</comment>
+ <comment xml:lang="sv">Enlightenment-tema</comment>
+ <comment xml:lang="uk">тема Enlightenment</comment>
+ <comment xml:lang="vi">Sắc thái Enlightenment</comment>
+ <comment xml:lang="zh_CN">Enlightenment 主题</comment>
+ <comment xml:lang="zh_TW">Enlightenment 佈景主題</comment>
+ <glob pattern="*.etheme"/>
+ </mime-type>
+ <mime-type type="application/x-egon">
+ <comment>Egon Animator animation</comment>
+ <comment xml:lang="ar">تحريكة محرك Egon</comment>
+ <comment xml:lang="be@latin">Animacyja Egon Animator</comment>
+ <comment xml:lang="bg">Анимация — Egon Animator</comment>
+ <comment xml:lang="ca">animació d'Egon Animator</comment>
+ <comment xml:lang="cs">Animace Egon Animator</comment>
+ <comment xml:lang="da">Egon Animator-animation</comment>
+ <comment xml:lang="de">Egon-Animator-Animation</comment>
+ <comment xml:lang="el">κινούμενα σχέδια Egon Animator</comment>
+ <comment xml:lang="en_GB">Egon Animator animation</comment>
+ <comment xml:lang="eo">animacio de Egon Animator</comment>
+ <comment xml:lang="es">animación de Egon Animator</comment>
+ <comment xml:lang="eu">Egon Animator-eko animazioa</comment>
+ <comment xml:lang="fi">Egon Animator -animaatio</comment>
+ <comment xml:lang="fo">Egon Animator teknimyndagerð</comment>
+ <comment xml:lang="fr">animation Egon Animator</comment>
+ <comment xml:lang="ga">beochan Egon Animator</comment>
+ <comment xml:lang="gl">animación de Egon Animator</comment>
+ <comment xml:lang="he">אנימצייה של Egon Animator</comment>
+ <comment xml:lang="hu">Egon Animator-animáció</comment>
+ <comment xml:lang="id">Animasi Egon Animator</comment>
+ <comment xml:lang="it">Animazione Egon Animator</comment>
+ <comment xml:lang="ja">Egon Animator アニメーション</comment>
+ <comment xml:lang="kk">Egon Animator анимациясы</comment>
+ <comment xml:lang="ko">Egon 애니메이터</comment>
+ <comment xml:lang="lt">Egon Animator animacija</comment>
+ <comment xml:lang="lv">Egon Animator animācija</comment>
+ <comment xml:lang="ms">Animasi Egon Animator</comment>
+ <comment xml:lang="nb">Egon animator-animasjon</comment>
+ <comment xml:lang="nl">Egon Animator-animatie</comment>
+ <comment xml:lang="nn">Egon Animator-animasjon</comment>
+ <comment xml:lang="pl">Animacja Egon Animator</comment>
+ <comment xml:lang="pt">animação Egon Animator</comment>
+ <comment xml:lang="pt_BR">Animação do Egon Animator</comment>
+ <comment xml:lang="ro">Animație Egon Animator</comment>
+ <comment xml:lang="ru">анимация Egon Animator</comment>
+ <comment xml:lang="sk">Animácia Egon Animator</comment>
+ <comment xml:lang="sl">Datoteka animacije Egon Animator</comment>
+ <comment xml:lang="sq">Animim Egon Animator</comment>
+ <comment xml:lang="sr">Егон аниматор анимација</comment>
+ <comment xml:lang="sv">Egon Animator-animering</comment>
+ <comment xml:lang="uk">анімація Egon Animator</comment>
+ <comment xml:lang="vi">Hoạt ảnh Egon Animator</comment>
+ <comment xml:lang="zh_CN">Egon Animator 动画</comment>
+ <comment xml:lang="zh_TW">Egon Animator 動畫</comment>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.egon"/>
+ </mime-type>
+ <mime-type type="application/x-executable">
+ <comment>executable</comment>
+ <comment xml:lang="ar">تنفيذي</comment>
+ <comment xml:lang="be@latin">vykonvalny fajł</comment>
+ <comment xml:lang="bg">Изпълним файл</comment>
+ <comment xml:lang="ca">executable</comment>
+ <comment xml:lang="cs">Spustitelný soubor</comment>
+ <comment xml:lang="da">kørbar</comment>
+ <comment xml:lang="de">Programm</comment>
+ <comment xml:lang="el">εκτελέσιμο</comment>
+ <comment xml:lang="en_GB">executable</comment>
+ <comment xml:lang="eo">plenumebla</comment>
+ <comment xml:lang="es">ejecutable</comment>
+ <comment xml:lang="eu">exekutagarria</comment>
+ <comment xml:lang="fi">suoritettava ohjelma</comment>
+ <comment xml:lang="fo">inningarfør</comment>
+ <comment xml:lang="fr">exécutable</comment>
+ <comment xml:lang="ga">comhad inrite</comment>
+ <comment xml:lang="gl">executábel</comment>
+ <comment xml:lang="he">קובץ הרצה</comment>
+ <comment xml:lang="hu">futtatható</comment>
+ <comment xml:lang="id">dapat dieksekusi</comment>
+ <comment xml:lang="it">Eseguibile</comment>
+ <comment xml:lang="ja">実行ファイル</comment>
+ <comment xml:lang="kk">орындалатын</comment>
+ <comment xml:lang="ko">실행파일</comment>
+ <comment xml:lang="lt">vykdomasis failas</comment>
+ <comment xml:lang="lv">izpildāmais</comment>
+ <comment xml:lang="ms">Bolehlaksana</comment>
+ <comment xml:lang="nb">kjørbar</comment>
+ <comment xml:lang="nl">uitvoerbaar bestand</comment>
+ <comment xml:lang="nn">køyrbar</comment>
+ <comment xml:lang="pl">Program</comment>
+ <comment xml:lang="pt">executável</comment>
+ <comment xml:lang="pt_BR">executável</comment>
+ <comment xml:lang="ro">executabil</comment>
+ <comment xml:lang="ru">исполняемый</comment>
+ <comment xml:lang="sk">Spustiteľný súbor</comment>
+ <comment xml:lang="sl">izvedljiva datoteka</comment>
+ <comment xml:lang="sq">I ekzekutueshëm</comment>
+ <comment xml:lang="sr">извршна</comment>
+ <comment xml:lang="sv">körbar fil</comment>
+ <comment xml:lang="uk">виконуваний файл</comment>
+ <comment xml:lang="vi">thực hiện được</comment>
+ <comment xml:lang="zh_CN">可执行文件</comment>
+ <comment xml:lang="zh_TW">可執行檔</comment>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="40">
+ <match value="\177ELF" type="string" offset="0">
+ <match value="1" type="byte" offset="5">
+ <match value="2" type="little16" offset="16"/>
+ </match>
+ </match>
+ <match value="\177ELF" type="string" offset="0">
+ <match value="2" type="byte" offset="5">
+ <match value="2" type="big16" offset="16"/>
+ </match>
+ </match>
+ <match value="MZ" type="string" offset="0"/>
+ <match value="0x521c" type="little16" offset="0"/>
+ <match value="0420" type="host16" offset="0"/>
+ <match value="0421" type="host16" offset="0"/>
+ <match value="0603" type="little16" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-fluid">
+ <comment>FLTK Fluid file</comment>
+ <comment xml:lang="ar">ملف FLTK Fluid</comment>
+ <comment xml:lang="be@latin">Fajł FLTK Fluid</comment>
+ <comment xml:lang="bg">Интерфейс — FLTK Fluid</comment>
+ <comment xml:lang="ca">fitxer Fluid FLTK</comment>
+ <comment xml:lang="cs">Soubor FLTK Fluid</comment>
+ <comment xml:lang="da">FLTK Fluid-fil</comment>
+ <comment xml:lang="de">FLTK-Fluid-Datei</comment>
+ <comment xml:lang="es">archivo FLTK Fluid</comment>
+ <comment xml:lang="eu">FLTK Fluid fitxategia</comment>
+ <comment xml:lang="fi">FLTK Fluid -tiedosto</comment>
+ <comment xml:lang="fo">FLTK Fluid fíla</comment>
+ <comment xml:lang="fr">fichier Fluid FLTK</comment>
+ <comment xml:lang="ga">comhad FLTK Fluid</comment>
+ <comment xml:lang="gl">ficheiro FLTK Fluid</comment>
+ <comment xml:lang="he">קובץ FLTK Fluid</comment>
+ <comment xml:lang="hu">FLTK Fluid fájl</comment>
+ <comment xml:lang="id">Berkas FLTK Fluid</comment>
+ <comment xml:lang="it">File FLTK Fluid</comment>
+ <comment xml:lang="ja">FLTK Fluid ファイル</comment>
+ <comment xml:lang="kk">FLTK Fluid файлы</comment>
+ <comment xml:lang="ko">FLTK 파일</comment>
+ <comment xml:lang="lt">FLTK Fluid failas</comment>
+ <comment xml:lang="lv">FLTK Fluid fails</comment>
+ <comment xml:lang="nb">FLTK Fluid-fil</comment>
+ <comment xml:lang="nl">FLTK FLUID-bestand</comment>
+ <comment xml:lang="nn">FLTK Fluid-fil</comment>
+ <comment xml:lang="pl">Plik Fluid FLTK</comment>
+ <comment xml:lang="pt_BR">Arquivo Fluid do FLTK</comment>
+ <comment xml:lang="ro">Fișier FLTK Fluid</comment>
+ <comment xml:lang="ru">файл FLTK Fluid</comment>
+ <comment xml:lang="sk">Súbor FLTK Fluid</comment>
+ <comment xml:lang="sl">Datoteka FLTK Fluid</comment>
+ <comment xml:lang="sq">File FLTK Fluid</comment>
+ <comment xml:lang="sv">FLTK Fluid-fil</comment>
+ <comment xml:lang="uk">файл FLTK Fluid</comment>
+ <comment xml:lang="vi">Tập tin Fluid FLTK</comment>
+ <comment xml:lang="zh_CN">FLTK 流体文档</comment>
+ <comment xml:lang="zh_TW">FLTK Fluid 檔</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="# data file for the Fltk" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.fl"/>
+ </mime-type>
+ <mime-type type="application/x-font-type1">
+ <comment>Postscript type-1 font</comment>
+ <comment xml:lang="ar">خط Postscript type-1</comment>
+ <comment xml:lang="be@latin">Šryft Postscript type-1</comment>
+ <comment xml:lang="bg">Шрифт — Postscript Type 1</comment>
+ <comment xml:lang="ca">tipus de lletra Postscript type-1</comment>
+ <comment xml:lang="cs">Písmo Postscript type-1</comment>
+ <comment xml:lang="da">PostScript type-1-skrifttype</comment>
+ <comment xml:lang="de">Postscript-Typ-1-Schrift</comment>
+ <comment xml:lang="es">tipografía PostScript tipo-1</comment>
+ <comment xml:lang="eu">PostScript type-1 letra-tipoa</comment>
+ <comment xml:lang="fi">PostScript tyyppi-1 -asiakirja</comment>
+ <comment xml:lang="fo">Postscript type-1 stavasnið</comment>
+ <comment xml:lang="fr">police Postscript Type 1</comment>
+ <comment xml:lang="ga">cló Postscript type-1</comment>
+ <comment xml:lang="gl">tipo de letra PostScript tipo-1</comment>
+ <comment xml:lang="he">גופן של Postscript type-1</comment>
+ <comment xml:lang="hu">Postscript type-1 betűkészlet</comment>
+ <comment xml:lang="id">Fonta tipe-1 Postscript</comment>
+ <comment xml:lang="it">Tipo carattere Postscript type-1</comment>
+ <comment xml:lang="ja">PostScript type-1 フォント</comment>
+ <comment xml:lang="kk">Postscript type-1 қарібі</comment>
+ <comment xml:lang="ko">포스트스크립트 Type-1 글꼴</comment>
+ <comment xml:lang="lt">Postscript type-1 šriftas</comment>
+ <comment xml:lang="lv">Postscript 1-tipa fonts</comment>
+ <comment xml:lang="nb">Postscript type-1 skrift</comment>
+ <comment xml:lang="nl">PostScript type-1-lettertype</comment>
+ <comment xml:lang="nn">PostScript type 1-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka PostScript Type-1</comment>
+ <comment xml:lang="pt_BR">Fonte PostScript tipo-1</comment>
+ <comment xml:lang="ro">Font Postscript type-1</comment>
+ <comment xml:lang="ru">шрифт PostScript Type-1</comment>
+ <comment xml:lang="sk">Písmo Postscript type-1</comment>
+ <comment xml:lang="sl">Datoteka pisave Postscript vrste-1</comment>
+ <comment xml:lang="sq">Lloj gërmash Postscript type-1</comment>
+ <comment xml:lang="sv">Postscript type-1-typsnitt</comment>
+ <comment xml:lang="uk">шрифт Postscript type-1</comment>
+ <comment xml:lang="vi">Phông kiểu 1 PostScript</comment>
+ <comment xml:lang="zh_CN">Postscript type-1 字体</comment>
+ <comment xml:lang="zh_TW">Postscript type-1 字型</comment>
+ <sub-class-of type="application/postscript"/>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="60">
+ <match value="LWFN" type="string" offset="0"/>
+ <match value="LWFN" type="string" offset="65"/>
+ <match value="%!PS-AdobeFont-1." type="string" offset="0"/>
+ <match value="%!PS-AdobeFont-1." type="string" offset="6"/>
+ <match value="%!FontType1-1." type="string" offset="0"/>
+ <match value="%!FontType1-1." type="string" offset="6"/>
+ </magic>
+ <glob pattern="*.pfa"/>
+ <glob pattern="*.pfb"/>
+ <glob pattern="*.gsf"/>
+ </mime-type>
+ <mime-type type="application/x-font-afm">
+ <comment>Adobe font metrics</comment>
+ <comment xml:lang="ar">مقاييس خط أدوبي</comment>
+ <comment xml:lang="az">Adobe yazı növü metrikləri</comment>
+ <comment xml:lang="be@latin">Metryka šryftu Adobe</comment>
+ <comment xml:lang="bg">Шрифтова метрика — Adobe</comment>
+ <comment xml:lang="ca">mètrica de tipus de lletra Adobe</comment>
+ <comment xml:lang="cs">Metrika písma Adobe</comment>
+ <comment xml:lang="cy">Metrigau Ffont Adobe</comment>
+ <comment xml:lang="da">Adobe skrifttypefil</comment>
+ <comment xml:lang="de">Adobe-Schriftmetriken</comment>
+ <comment xml:lang="el">μετρικά γραμματοσειράς Adobe</comment>
+ <comment xml:lang="en_GB">Adobe font metrics</comment>
+ <comment xml:lang="eo">metrikoj de Adobe-tiparo</comment>
+ <comment xml:lang="es">métricas de tipografía Adobe</comment>
+ <comment xml:lang="eu">Adobe letra-tipoen neurriak</comment>
+ <comment xml:lang="fi">Adobe-kirjasinmitat</comment>
+ <comment xml:lang="fr">métriques de police Adobe</comment>
+ <comment xml:lang="ga">meadarachtaí cló Adobe</comment>
+ <comment xml:lang="gl">métricas de fonte de Adobe</comment>
+ <comment xml:lang="he">מדדי גופן של Adobe</comment>
+ <comment xml:lang="hu">Adobe-betűmetrika</comment>
+ <comment xml:lang="id">Metrik fonta Adobe</comment>
+ <comment xml:lang="it">Metriche tipo carattere Adobe</comment>
+ <comment xml:lang="ja">Adobe フォントメトリック</comment>
+ <comment xml:lang="kk">Adobe қаріп метрикалары</comment>
+ <comment xml:lang="ko">어도비 글꼴 메트릭스</comment>
+ <comment xml:lang="lt">Adobe šriftų metrika</comment>
+ <comment xml:lang="lv">Adobe fonta metrika</comment>
+ <comment xml:lang="ms">Metrik font Adobe</comment>
+ <comment xml:lang="nb">Adobe skrifttypefil</comment>
+ <comment xml:lang="nl">Adobe-lettertype-metrieken</comment>
+ <comment xml:lang="nn">Adobe skrifttypemetrikk</comment>
+ <comment xml:lang="pl">Metryka czcionki Adobe</comment>
+ <comment xml:lang="pt">métrica de tipos de letra Adobe</comment>
+ <comment xml:lang="pt_BR">Métricas de fonte Adobe</comment>
+ <comment xml:lang="ro">Dimensiuni font Adobe</comment>
+ <comment xml:lang="ru">метрика шрифта Adobe</comment>
+ <comment xml:lang="sk">Metrika písma Adobe</comment>
+ <comment xml:lang="sl">Matrika pisave Adobe</comment>
+ <comment xml:lang="sq">Metrik lloj gërmash Adobe</comment>
+ <comment xml:lang="sr">Adobe метрика фонта</comment>
+ <comment xml:lang="sv">Adobe-typsnittsmetrik</comment>
+ <comment xml:lang="uk">метрики шрифту Adobe</comment>
+ <comment xml:lang="vi">Cách đo phông chữ Adobe</comment>
+ <comment xml:lang="zh_CN">Adobe 字体参数</comment>
+ <comment xml:lang="zh_TW">Adobe 字型描述檔</comment>
+ <generic-icon name="font-x-generic"/>
+ <glob pattern="*.afm"/>
+ </mime-type>
+ <mime-type type="application/x-font-bdf">
+ <comment>BDF font</comment>
+ <comment xml:lang="ar">خط BDF</comment>
+ <comment xml:lang="az">BDF yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft BDF</comment>
+ <comment xml:lang="bg">Шрифт — BDF</comment>
+ <comment xml:lang="ca">tipus de lletra BDF</comment>
+ <comment xml:lang="cs">Písmo BDF</comment>
+ <comment xml:lang="cy">Ffont BDF</comment>
+ <comment xml:lang="da">BDF-skrifttype</comment>
+ <comment xml:lang="de">BDF-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά BDF</comment>
+ <comment xml:lang="en_GB">BDF font</comment>
+ <comment xml:lang="eo">BDF-tiparo</comment>
+ <comment xml:lang="es">tipografía BDF</comment>
+ <comment xml:lang="eu">BDF letra-tipoa</comment>
+ <comment xml:lang="fi">BDF-kirjasin</comment>
+ <comment xml:lang="fo">BDF stavasnið</comment>
+ <comment xml:lang="fr">police BDF</comment>
+ <comment xml:lang="ga">cló BDF</comment>
+ <comment xml:lang="gl">tipo de fonte BDF</comment>
+ <comment xml:lang="he">גופן BDF</comment>
+ <comment xml:lang="hu">BDF-betűkészlet</comment>
+ <comment xml:lang="id">Fonta BDF</comment>
+ <comment xml:lang="it">Tipo carattere BDF</comment>
+ <comment xml:lang="ja">BDF フォント</comment>
+ <comment xml:lang="kk">BDF қарібі</comment>
+ <comment xml:lang="ko">BDF 글꼴</comment>
+ <comment xml:lang="lt">BDF šriftas</comment>
+ <comment xml:lang="lv">BDF fonts</comment>
+ <comment xml:lang="ms">Font BDF</comment>
+ <comment xml:lang="nb">BDF-skrifttype</comment>
+ <comment xml:lang="nl">BDF-lettertype</comment>
+ <comment xml:lang="nn">BDF-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka BDF</comment>
+ <comment xml:lang="pt">tipo de letra BDF</comment>
+ <comment xml:lang="pt_BR">Fonte BDF</comment>
+ <comment xml:lang="ro">Font BDF</comment>
+ <comment xml:lang="ru">шрифт BDF</comment>
+ <comment xml:lang="sk">Písmo BDF</comment>
+ <comment xml:lang="sl">Datoteka pisave BDF</comment>
+ <comment xml:lang="sq">Lloj gërme BDF</comment>
+ <comment xml:lang="sr">BDF фонт</comment>
+ <comment xml:lang="sv">BDF-typsnitt</comment>
+ <comment xml:lang="uk">шрифт BDF</comment>
+ <comment xml:lang="vi">Phông chữ BDF</comment>
+ <comment xml:lang="zh_CN">BDF 字体</comment>
+ <comment xml:lang="zh_TW">BDF 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="STARTFONT\040" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.bdf"/>
+ </mime-type>
+ <mime-type type="application/x-font-dos">
+ <comment>DOS font</comment>
+ <comment xml:lang="ar">خط DOS</comment>
+ <comment xml:lang="az">DOS yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft DOS</comment>
+ <comment xml:lang="bg">Шрифт — DOS</comment>
+ <comment xml:lang="ca">tipus de lletra DOS</comment>
+ <comment xml:lang="cs">Písmo pro DOS</comment>
+ <comment xml:lang="cy">Ffont DOS</comment>
+ <comment xml:lang="da">DOS-skrifttype</comment>
+ <comment xml:lang="de">DOS-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά DOS</comment>
+ <comment xml:lang="en_GB">DOS font</comment>
+ <comment xml:lang="eo">DOS-tiparo</comment>
+ <comment xml:lang="es">tipografía DOS</comment>
+ <comment xml:lang="eu">DOS letra-tipoa</comment>
+ <comment xml:lang="fi">DOS-kirjasin</comment>
+ <comment xml:lang="fo">DOS stavasnið</comment>
+ <comment xml:lang="fr">police DOS</comment>
+ <comment xml:lang="ga">cló DOS</comment>
+ <comment xml:lang="gl">tipo de fonte de DOS</comment>
+ <comment xml:lang="he">גופן DOS</comment>
+ <comment xml:lang="hu">DOS-betűkészlet</comment>
+ <comment xml:lang="id">Fonta DOS</comment>
+ <comment xml:lang="it">Tipo carattere DOS</comment>
+ <comment xml:lang="ja">DOS フォント</comment>
+ <comment xml:lang="kk">DOS қарібі</comment>
+ <comment xml:lang="ko">도스 글꼴</comment>
+ <comment xml:lang="lt">DOS šriftas</comment>
+ <comment xml:lang="lv">DOS fonts</comment>
+ <comment xml:lang="ms">Font DOS</comment>
+ <comment xml:lang="nb">DOS-skrifttype</comment>
+ <comment xml:lang="nl">DOS-lettertype</comment>
+ <comment xml:lang="nn">DOS-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka DOS</comment>
+ <comment xml:lang="pt">tipo de letra DOS</comment>
+ <comment xml:lang="pt_BR">Fonte do DOS</comment>
+ <comment xml:lang="ro">Font DOS</comment>
+ <comment xml:lang="ru">шрифт DOS</comment>
+ <comment xml:lang="sk">Písmo pre DOS</comment>
+ <comment xml:lang="sl">Datoteka pisave DOS</comment>
+ <comment xml:lang="sq">Gërmë DOS</comment>
+ <comment xml:lang="sr">DOS фонт</comment>
+ <comment xml:lang="sv">DOS-typsnitt</comment>
+ <comment xml:lang="uk">шрифт DOS</comment>
+ <comment xml:lang="vi">Phông chữ DOS</comment>
+ <comment xml:lang="zh_CN">DOS 字体</comment>
+ <comment xml:lang="zh_TW">DOS 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="\xff\x46\x4f\x4e" type="string" offset="0"/>
+ <match value="\x00\x45\x47\x41" type="string" offset="7"/>
+ <match value="\x00\x56\x49\x44" type="string" offset="7"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-font-framemaker">
+ <comment>Adobe FrameMaker font</comment>
+ <comment xml:lang="ar">خط أدوبي الصانع للإطارات</comment>
+ <comment xml:lang="az">Adobe FrameMaker yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft Adobe FrameMaker</comment>
+ <comment xml:lang="bg">Шрифт — Adobe FrameMaker</comment>
+ <comment xml:lang="ca">tipus de lletra d'Adobe FrameMaker</comment>
+ <comment xml:lang="cs">Písmo Adobe FrameMaker</comment>
+ <comment xml:lang="cy">Ffont Adobe FrameMaker</comment>
+ <comment xml:lang="da">Adobe FrameMaker-skrifttype</comment>
+ <comment xml:lang="de">Adobe-FrameMaker-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά Adobe FrameMaker</comment>
+ <comment xml:lang="en_GB">Adobe FrameMaker font</comment>
+ <comment xml:lang="eo">Tiparo de Adobe FrameMaker</comment>
+ <comment xml:lang="es">tipografía de Adobe FrameMaker</comment>
+ <comment xml:lang="eu">Adobe FrameMaker-en letra-tipoa</comment>
+ <comment xml:lang="fi">Adobe FrameMaker -kirjasin</comment>
+ <comment xml:lang="fo">Adobe FrameMaker stavasnið</comment>
+ <comment xml:lang="fr">police Adobe FrameMaker</comment>
+ <comment xml:lang="ga">cló Adobe FrameMaker</comment>
+ <comment xml:lang="gl">tipo de fonte de Adobe FrameMaker</comment>
+ <comment xml:lang="he">גופן של Adobe FrameMaker</comment>
+ <comment xml:lang="hu">Adobe FrameMaker-betűkészlet</comment>
+ <comment xml:lang="id">Fonta Adobe FrameMaker</comment>
+ <comment xml:lang="it">Tipo carattere Adobe FrameMaker</comment>
+ <comment xml:lang="ja">Adobe FrameMaker フォント</comment>
+ <comment xml:lang="kk">Adobe FrameMaker қарібі</comment>
+ <comment xml:lang="ko">어도비 프레임메이커 글꼴</comment>
+ <comment xml:lang="lt">Adobe FrameMaker šriftas</comment>
+ <comment xml:lang="lv">Adobe FrameMaker fonts</comment>
+ <comment xml:lang="ms">Font Adobe FrameMaker</comment>
+ <comment xml:lang="nb">Adobe FrameMaker skrifttype</comment>
+ <comment xml:lang="nl">Adobe FrameMaker-lettertype</comment>
+ <comment xml:lang="nn">Adobe FrameMaker-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka Adobe FrameMaker</comment>
+ <comment xml:lang="pt">tipo de letra Adobe FrameMaker</comment>
+ <comment xml:lang="pt_BR">Fonte do Adobe FrameMaker</comment>
+ <comment xml:lang="ro">Font Adobe FrameMaker</comment>
+ <comment xml:lang="ru">шрифт Adobe FrameMaker</comment>
+ <comment xml:lang="sk">Písmo Adobe FrameMaker</comment>
+ <comment xml:lang="sl">Datoteka pisave Adobe FrameMaker</comment>
+ <comment xml:lang="sq">Gërma Adobe FrameMaker</comment>
+ <comment xml:lang="sr">Adobe FrameMaker фонт</comment>
+ <comment xml:lang="sv">Adobe FrameMaker-typsnitt</comment>
+ <comment xml:lang="uk">шрифт Adobe FrameMaker</comment>
+ <comment xml:lang="vi">Phông chữ Adobe FrameMaker</comment>
+ <comment xml:lang="zh_CN">Adobe FrameMaker 字体</comment>
+ <comment xml:lang="zh_TW">Adobe FrameMaker 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="&lt;MakerScreenFont" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-font-libgrx">
+ <comment>LIBGRX font</comment>
+ <comment xml:lang="ar">خط LIBGRX</comment>
+ <comment xml:lang="az">LIBGRX yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft LIBGRX</comment>
+ <comment xml:lang="bg">Шрифт — LIBGRX</comment>
+ <comment xml:lang="ca">tipus de lletra LIBGRX</comment>
+ <comment xml:lang="cs">Písmo LIBGRX</comment>
+ <comment xml:lang="cy">Ffont LIBGRX</comment>
+ <comment xml:lang="da">LIBGRX-skrifttype</comment>
+ <comment xml:lang="de">LIBGRX-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά LIBGRX</comment>
+ <comment xml:lang="en_GB">LIBGRX font</comment>
+ <comment xml:lang="eo">LIBGRX-tiparo</comment>
+ <comment xml:lang="es">tipografía LIBGRX</comment>
+ <comment xml:lang="eu">LIBGRX letra-tipoa</comment>
+ <comment xml:lang="fi">LIBGRX-kirjasin</comment>
+ <comment xml:lang="fo">LIBGRX stavasnið</comment>
+ <comment xml:lang="fr">police LIBGRX</comment>
+ <comment xml:lang="ga">cló LIBGRX</comment>
+ <comment xml:lang="gl">tipo de fonte en LIBGRX</comment>
+ <comment xml:lang="he">גופן LIBGRX</comment>
+ <comment xml:lang="hu">LIBGRX-betűkészlet</comment>
+ <comment xml:lang="id">Fonta LIBGRX</comment>
+ <comment xml:lang="it">Tipo carattere LIBGRX</comment>
+ <comment xml:lang="ja">LIBGRX フォーマット</comment>
+ <comment xml:lang="kk">LIBGRX қарібі</comment>
+ <comment xml:lang="ko">LIBGRX 글꼴</comment>
+ <comment xml:lang="lt">LIBGRX šriftas</comment>
+ <comment xml:lang="lv">LIBGRX fonts</comment>
+ <comment xml:lang="ms">Font LIBGRX</comment>
+ <comment xml:lang="nb">LIBGRX-skrifttype</comment>
+ <comment xml:lang="nl">LIBGRX-lettertype</comment>
+ <comment xml:lang="nn">LIBGRX skrifttype</comment>
+ <comment xml:lang="pl">Czcionka LIBGRX</comment>
+ <comment xml:lang="pt">tipo de letra LIBGRX</comment>
+ <comment xml:lang="pt_BR">Fonte LIBGRX</comment>
+ <comment xml:lang="ro">Font LIBGRX</comment>
+ <comment xml:lang="ru">шрифт LIBGRX</comment>
+ <comment xml:lang="sk">Písmo LIBGRX</comment>
+ <comment xml:lang="sl">Datoteka pisave LIBGRX</comment>
+ <comment xml:lang="sq">Lloj gërme LIBGRX</comment>
+ <comment xml:lang="sr">LIBGRX фонт</comment>
+ <comment xml:lang="sv">LIBGRX-typsnitt</comment>
+ <comment xml:lang="uk">шрифт LIBGRX</comment>
+ <comment xml:lang="vi">Phông chữ LIBGRX</comment>
+ <comment xml:lang="zh_CN">LIBGRX 字体</comment>
+ <comment xml:lang="zh_TW">LIBGRX 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="\x14\x02\x59\x19" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-font-linux-psf">
+ <comment>Linux PSF console font</comment>
+ <comment xml:lang="ar">خط كونسول PSF لينكس</comment>
+ <comment xml:lang="az">Linux PSF konsol yazı növü</comment>
+ <comment xml:lang="be@latin">Kansolny šryft PSF dla Linuksa</comment>
+ <comment xml:lang="bg">Шрифт — PSF, за конзолата на Линукс</comment>
+ <comment xml:lang="ca">tipus de lletra de consola Linux PSF</comment>
+ <comment xml:lang="cs">Písmo PSF pro konzolu Linuxu</comment>
+ <comment xml:lang="cy">Ffont Linux PSF</comment>
+ <comment xml:lang="da">Linux PSF-konsolskrifttype</comment>
+ <comment xml:lang="de">Linux-PSF-Konsolenschrift</comment>
+ <comment xml:lang="el">γραμματοσειρά κονσόλας PSF Linux</comment>
+ <comment xml:lang="en_GB">Linux PSF console font</comment>
+ <comment xml:lang="eo">PSF-tiparo de Linux-konzolo</comment>
+ <comment xml:lang="es">tipografía de consola Linux PSF</comment>
+ <comment xml:lang="eu">Linux PSF kontsolako letra-tipoa</comment>
+ <comment xml:lang="fi">Linux PSF -konsolikirjasin</comment>
+ <comment xml:lang="fo">Linux PSF stýristøðs stavasnið</comment>
+ <comment xml:lang="fr">police console Linux PSF</comment>
+ <comment xml:lang="ga">cló chonsól Linux PSF</comment>
+ <comment xml:lang="gl">tipo de fonte de consola Linux PSF</comment>
+ <comment xml:lang="he">גופן לקונסול מסוג Linux PSF</comment>
+ <comment xml:lang="hu">Linux PSF konzolos betűkészlet</comment>
+ <comment xml:lang="id">Fonta konsol Linux PSF</comment>
+ <comment xml:lang="it">Tipo carattere console Linux PSF</comment>
+ <comment xml:lang="ja">Linux PSF コンソールフォント</comment>
+ <comment xml:lang="kk">Linux PSF консольдік қарібі</comment>
+ <comment xml:lang="ko">리눅스 PSF 콘솔 글꼴</comment>
+ <comment xml:lang="lt">Linux PSF konsolės šriftas</comment>
+ <comment xml:lang="lv">Linux PSF konsoles fonts</comment>
+ <comment xml:lang="ms">Font konsol PSF Linux</comment>
+ <comment xml:lang="nb">Linux PSF konsollskrifttype</comment>
+ <comment xml:lang="nl">Linux PSF-console-lettertype</comment>
+ <comment xml:lang="nn">Linux PSF konsoll-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka konsoli PSF Linux</comment>
+ <comment xml:lang="pt">tipo de letra de consola Linux PSF</comment>
+ <comment xml:lang="pt_BR">Fonte de console Linux PSF</comment>
+ <comment xml:lang="ro">Font consolă Linux PSF</comment>
+ <comment xml:lang="ru">консольный шрифт Linux PSF</comment>
+ <comment xml:lang="sk">Písmo PSF pre konzolu Linuxu</comment>
+ <comment xml:lang="sl">Datoteka pisave konzole Linux PSF</comment>
+ <comment xml:lang="sq">Lloj gërme për konsolë Linux PSF</comment>
+ <comment xml:lang="sr">Линукс PSF конзолни фонт</comment>
+ <comment xml:lang="sv">Linux PSF-konsolltypsnitt</comment>
+ <comment xml:lang="uk">консольний шрифт Linux PSF</comment>
+ <comment xml:lang="vi">Phông chữ bàn giao tiếp PSF Linux</comment>
+ <comment xml:lang="zh_CN">Linux PSF 控制台字体</comment>
+ <comment xml:lang="zh_TW">Linux PSF console 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="\x36\x04" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.psf"/>
+ </mime-type>
+ <mime-type type="application/x-gz-font-linux-psf">
+ <comment>Linux PSF console font (gzip-compressed)</comment>
+ <comment xml:lang="ar">خط كونسول PSF لينكس (مضغوط-gzip)</comment>
+ <comment xml:lang="be@latin">Kansolny šryft PSF dla Linuksa (gzip-skampresavany)</comment>
+ <comment xml:lang="bg">Шрифт — Linux PSF, компресиран с gzip</comment>
+ <comment xml:lang="ca">tipus de lletra de consola Linux PSF (comprimida amb gzip)</comment>
+ <comment xml:lang="cs">Písmo PSF pro konzolu Linuxu (komprimované pomocí gzip)</comment>
+ <comment xml:lang="da">Linux PSF-konsolskrifttype (gzip-komprimeret)</comment>
+ <comment xml:lang="de">Linux-PSF-Konsolenschrift (gzip-komprimiert)</comment>
+ <comment xml:lang="es">tipografía de consola Linux PSF (comprimida con gzip)</comment>
+ <comment xml:lang="eu">Linux PSF kontsolako letra-tipoa (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">Linux PSF -konsolikirjasin (gzip-pakattu)</comment>
+ <comment xml:lang="fo">Linux PSF stýristøðs stavasnið (gzip-stappað)</comment>
+ <comment xml:lang="fr">police console Linux PSF (compressée gzip)</comment>
+ <comment xml:lang="ga">cló chonsól Linux PSF (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">tipo de fonte de consola Linux PSF (comprimida con gzip)</comment>
+ <comment xml:lang="he">גופן לקונסול מסוג Linux PSF (מכווץ ע"י gzip)</comment>
+ <comment xml:lang="hu">Linux PSF konzolos betűkészlet (gzip-tömörítésű)</comment>
+ <comment xml:lang="id">Fonta konsol Linux PSF (terkompresi gzip)</comment>
+ <comment xml:lang="it">Tipo carattere console Linux PSF (compresso con gzip)</comment>
+ <comment xml:lang="ja">Linux PSF コンソールフォント (gzip 圧縮)</comment>
+ <comment xml:lang="kk">Linux PSF консольдік қарібі (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">리눅스 PSF 콘솔 글꼴 (GZIP 압축)</comment>
+ <comment xml:lang="lt">Linux PSF konsolės šriftas (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">Linux PSF konsoles fonts (saspiests ar gzip)</comment>
+ <comment xml:lang="nb">Linux PSF konsollskrifttype (gzip-komprimert)</comment>
+ <comment xml:lang="nl">Linux PSF-console-lettertype (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">Linux PSF konsoll-skrifttype (gzip-pakka)</comment>
+ <comment xml:lang="pl">Czcionka konsoli PSF Linux (kompresja gzip)</comment>
+ <comment xml:lang="pt_BR">Fonte de console Linux PSF (compactada com gzip)</comment>
+ <comment xml:lang="ro">Font consolă Linux PSF (compresie gzip)</comment>
+ <comment xml:lang="ru">консольный шрифт Linux PSF (сжатый gzip)</comment>
+ <comment xml:lang="sk">Písmo PSF pre konzolu Linuxu (komprimované pomocou gzip)</comment>
+ <comment xml:lang="sl">Datoteka pisave konzole Linux PSF (skrčena z gzip)</comment>
+ <comment xml:lang="sq">Lloj gërme për konsolë Linux PSF (komresuar me gzip)</comment>
+ <comment xml:lang="sv">Linux PSF-konsolltypsnitt (gzip-komprimerat)</comment>
+ <comment xml:lang="uk">консольний шрифт Linux PSF (стиснений gzip)</comment>
+ <comment xml:lang="vi">Phông chữ bàn giao tiếp PSF Linux (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">Linux PSF 控制台字体(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">Linux PSF console 字型 (gzip 格式壓縮)</comment>
+ <sub-class-of type="application/x-gzip"/>
+ <generic-icon name="font-x-generic"/>
+ <glob pattern="*.psf.gz"/>
+ </mime-type>
+ <mime-type type="application/x-font-pcf">
+ <comment>PCF font</comment>
+ <comment xml:lang="ar">خط PCF</comment>
+ <comment xml:lang="az">PCF yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft PCF</comment>
+ <comment xml:lang="bg">Шрифт — PCF</comment>
+ <comment xml:lang="ca">tipus de lletra PCF</comment>
+ <comment xml:lang="cs">Písmo PCF</comment>
+ <comment xml:lang="cy">Ffont PCF</comment>
+ <comment xml:lang="da">PCF-skrifttype</comment>
+ <comment xml:lang="de">PCF-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά PCF</comment>
+ <comment xml:lang="en_GB">PCF font</comment>
+ <comment xml:lang="eo">PCF-tiparo</comment>
+ <comment xml:lang="es">tipografía PCF</comment>
+ <comment xml:lang="eu">PCF letra-tipoa</comment>
+ <comment xml:lang="fi">PCF-kirjasin</comment>
+ <comment xml:lang="fo">PCF stavasnið</comment>
+ <comment xml:lang="fr">police PCF</comment>
+ <comment xml:lang="ga">cló PCF</comment>
+ <comment xml:lang="gl">tipo de letra PCF</comment>
+ <comment xml:lang="he">פונט PCF</comment>
+ <comment xml:lang="hu">PCF-betűkészlet</comment>
+ <comment xml:lang="id">Fonta PCF</comment>
+ <comment xml:lang="it">Tipo carattere PCF</comment>
+ <comment xml:lang="ja">PCF フォント</comment>
+ <comment xml:lang="kk">PCF қарібі</comment>
+ <comment xml:lang="ko">PCF 글꼴</comment>
+ <comment xml:lang="lt">PCF šriftas</comment>
+ <comment xml:lang="lv">PCF fonts</comment>
+ <comment xml:lang="ms">Font PCF</comment>
+ <comment xml:lang="nb">PCF-skrifttype</comment>
+ <comment xml:lang="nl">PCF-lettertype</comment>
+ <comment xml:lang="nn">PCF-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka PCF</comment>
+ <comment xml:lang="pt">tipo de letra PCF</comment>
+ <comment xml:lang="pt_BR">Fonte PCF</comment>
+ <comment xml:lang="ro">Font PCF</comment>
+ <comment xml:lang="ru">шрифт PCF</comment>
+ <comment xml:lang="sk">Písmo PCF</comment>
+ <comment xml:lang="sl">Datoteka pisave PCF</comment>
+ <comment xml:lang="sq">Gërma PCF</comment>
+ <comment xml:lang="sr">PCF фонт</comment>
+ <comment xml:lang="sv">PCF-typsnitt</comment>
+ <comment xml:lang="uk">шрифт PCF</comment>
+ <comment xml:lang="vi">Phông chữ PCF</comment>
+ <comment xml:lang="zh_CN">PCF 字体</comment>
+ <comment xml:lang="zh_TW">PCF 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="\001fcp" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.pcf"/>
+ <glob pattern="*.pcf.Z"/>
+ <glob pattern="*.pcf.gz"/>
+ </mime-type>
+ <mime-type type="application/x-font-otf">
+ <comment>OpenType font</comment>
+ <comment xml:lang="ar">خط OpenType</comment>
+ <comment xml:lang="az">OpenType yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft OpenType</comment>
+ <comment xml:lang="bg">Шрифт — OpenType</comment>
+ <comment xml:lang="ca">tipus de lletra OpenType</comment>
+ <comment xml:lang="cs">Písmo OpenType</comment>
+ <comment xml:lang="cy">Ffont OpenType</comment>
+ <comment xml:lang="da">OpenType-skrifttype</comment>
+ <comment xml:lang="de">OpenType-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά OpenType </comment>
+ <comment xml:lang="en_GB">OpenType font</comment>
+ <comment xml:lang="eo">OpenType-tiparo</comment>
+ <comment xml:lang="es">tipografía de OpenType</comment>
+ <comment xml:lang="eu">OpenType letra-tipoa</comment>
+ <comment xml:lang="fi">OpenType-kirjasin</comment>
+ <comment xml:lang="fo">OpenType stavasnið</comment>
+ <comment xml:lang="fr">police OpenType</comment>
+ <comment xml:lang="ga">cló OpenType</comment>
+ <comment xml:lang="gl">tipo de fonte OpenType</comment>
+ <comment xml:lang="he">גופן של OpenType</comment>
+ <comment xml:lang="hu">OpenType-betűkészlet</comment>
+ <comment xml:lang="id">Fonta OpenType</comment>
+ <comment xml:lang="it">Tipo carattere OpenType</comment>
+ <comment xml:lang="ja">OpenType フォント</comment>
+ <comment xml:lang="kk">OpenType қарібі</comment>
+ <comment xml:lang="ko">오픈타입 글꼴</comment>
+ <comment xml:lang="lt">OpenType šriftas</comment>
+ <comment xml:lang="lv">OpenType fonts</comment>
+ <comment xml:lang="ms">Font OpenType</comment>
+ <comment xml:lang="nb">OpenType-skrifttype</comment>
+ <comment xml:lang="nl">OpenType-lettertype</comment>
+ <comment xml:lang="nn">OpenType-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka OpenType</comment>
+ <comment xml:lang="pt">tipo de letra OpenType</comment>
+ <comment xml:lang="pt_BR">Fonte OpenType</comment>
+ <comment xml:lang="ro">Font OpenType</comment>
+ <comment xml:lang="ru">шрифт OpenType</comment>
+ <comment xml:lang="sk">Písmo OpenType</comment>
+ <comment xml:lang="sl">Datoteka pisave OpenType</comment>
+ <comment xml:lang="sq">Gërma OpenType</comment>
+ <comment xml:lang="sr">OpenType фонт</comment>
+ <comment xml:lang="sv">OpenType-typsnitt</comment>
+ <comment xml:lang="uk">шрифт OpenType</comment>
+ <comment xml:lang="vi">Phông chữ OpenType</comment>
+ <comment xml:lang="zh_CN">OpenType 字体</comment>
+ <comment xml:lang="zh_TW">OpenType 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="OTTO" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.otf"/>
+ </mime-type>
+ <mime-type type="application/x-font-speedo">
+ <comment>Speedo font</comment>
+ <comment xml:lang="ar">خط Speedo</comment>
+ <comment xml:lang="az">Speedo yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft Speedo</comment>
+ <comment xml:lang="bg">Шрифт — Speedo</comment>
+ <comment xml:lang="ca">tipus de lletra Speedo</comment>
+ <comment xml:lang="cs">Písmo Speedo</comment>
+ <comment xml:lang="cy">Ffont Speedo</comment>
+ <comment xml:lang="da">Speedoskrifttype</comment>
+ <comment xml:lang="de">Speedo-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά Speedo</comment>
+ <comment xml:lang="en_GB">Speedo font</comment>
+ <comment xml:lang="eo">Speedo-tiparo</comment>
+ <comment xml:lang="es">tipografía Speedo</comment>
+ <comment xml:lang="eu">Speedo letra-tipoa</comment>
+ <comment xml:lang="fi">Speedo-kirjasin</comment>
+ <comment xml:lang="fo">Speedo stavasnið</comment>
+ <comment xml:lang="fr">police Speedo</comment>
+ <comment xml:lang="ga">cló Speedo</comment>
+ <comment xml:lang="gl">tipo de letra Speedo</comment>
+ <comment xml:lang="he">גופן של Speedo</comment>
+ <comment xml:lang="hu">Speedo-betűkészlet</comment>
+ <comment xml:lang="id">Fonta Speedo</comment>
+ <comment xml:lang="it">Tipo carattere Speedo</comment>
+ <comment xml:lang="ja">Speedo フォント</comment>
+ <comment xml:lang="kk">Speedo қарібі</comment>
+ <comment xml:lang="ko">Speedo 글꼴</comment>
+ <comment xml:lang="lt">Speedo šriftas</comment>
+ <comment xml:lang="lv">Speedo fonts</comment>
+ <comment xml:lang="ms">Font Speedo</comment>
+ <comment xml:lang="nb">Speedo-skrifttype</comment>
+ <comment xml:lang="nl">Speedo-lettertype</comment>
+ <comment xml:lang="nn">Speedo-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka Speedo</comment>
+ <comment xml:lang="pt">tipo de letra Speedo</comment>
+ <comment xml:lang="pt_BR">Fonte Speedo</comment>
+ <comment xml:lang="ro">Font Speedo</comment>
+ <comment xml:lang="ru">шрифт Speedo</comment>
+ <comment xml:lang="sk">Písmo Speedo</comment>
+ <comment xml:lang="sl">Datoteka pisave Speedo</comment>
+ <comment xml:lang="sq">Gërma Speedo</comment>
+ <comment xml:lang="sr">Speedo фонт</comment>
+ <comment xml:lang="sv">Speedo-typsnitt</comment>
+ <comment xml:lang="uk">шрифт Speedo</comment>
+ <comment xml:lang="vi">Phông chữ Speedo</comment>
+ <comment xml:lang="zh_CN">Speedo 字体</comment>
+ <comment xml:lang="zh_TW">Speedo 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="D1.0\015" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.spd"/>
+ </mime-type>
+ <mime-type type="application/x-font-sunos-news">
+ <comment>SunOS News font</comment>
+ <comment xml:lang="ar">خط SunOS News</comment>
+ <comment xml:lang="az">SunOS News yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft SunOS News</comment>
+ <comment xml:lang="bg">Шрифт — SunOS News</comment>
+ <comment xml:lang="ca">tipus de lletra SunOS News</comment>
+ <comment xml:lang="cs">Písmo SunOS News</comment>
+ <comment xml:lang="cy">Ffont SunOS News</comment>
+ <comment xml:lang="da">SunOS News-skrifttype</comment>
+ <comment xml:lang="de">SunOS-News-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά SunOS News</comment>
+ <comment xml:lang="en_GB">SunOS News font</comment>
+ <comment xml:lang="eo">tiparo de SunOS News</comment>
+ <comment xml:lang="es">tipografía SunOS News</comment>
+ <comment xml:lang="eu">SunOs News letra-tipoa</comment>
+ <comment xml:lang="fi">SunOS News -kirjasin</comment>
+ <comment xml:lang="fo">SunOS News stavasnið</comment>
+ <comment xml:lang="fr">police SunOS News</comment>
+ <comment xml:lang="ga">cló SunOS News</comment>
+ <comment xml:lang="gl">tipo de letra SunOS News</comment>
+ <comment xml:lang="he">גופן של SunOS News</comment>
+ <comment xml:lang="hu">SunOS News-betűkészlet</comment>
+ <comment xml:lang="id">Fonta SunOS News</comment>
+ <comment xml:lang="it">Tipo carattere SunOS News</comment>
+ <comment xml:lang="ja">SunOS News フォント</comment>
+ <comment xml:lang="kk">SunOS News қарібі</comment>
+ <comment xml:lang="ko">SunOS News 글꼴</comment>
+ <comment xml:lang="lt">SunOS News šriftas</comment>
+ <comment xml:lang="lv">SunOS News fonts</comment>
+ <comment xml:lang="ms">Font News SunOS</comment>
+ <comment xml:lang="nb">SunOS News-skrifttype</comment>
+ <comment xml:lang="nl">SunOS News-lettertype</comment>
+ <comment xml:lang="nn">SunOS NEWS-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka SunOS News</comment>
+ <comment xml:lang="pt">tipo de letra SunOS News</comment>
+ <comment xml:lang="pt_BR">Fonte SunOS News</comment>
+ <comment xml:lang="ro">Font SunOS News</comment>
+ <comment xml:lang="ru">шрифт SunOS News</comment>
+ <comment xml:lang="sk">Písmo SunOS News</comment>
+ <comment xml:lang="sl">Datoteka pisave SunOS News</comment>
+ <comment xml:lang="sq">Gërma SunOS News</comment>
+ <comment xml:lang="sr">SunOS News фонт</comment>
+ <comment xml:lang="sv">SunOS News-typsnitt</comment>
+ <comment xml:lang="uk">шрифт SunOS News</comment>
+ <comment xml:lang="vi">Phông chữ SunOS News</comment>
+ <comment xml:lang="zh_CN">SunOS News 字体</comment>
+ <comment xml:lang="zh_TW">SunOS News 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="StartFont" type="string" offset="0"/>
+ <match value="\x13\x7A\x29" type="string" offset="0"/>
+ <match value="\x13\x7A\x2B" type="string" offset="8"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-font-tex">
+ <comment>TeX font</comment>
+ <comment xml:lang="ar">خط TeX</comment>
+ <comment xml:lang="az">TeX yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft TeX</comment>
+ <comment xml:lang="bg">Шрифт — TeX</comment>
+ <comment xml:lang="ca">tipus de lletra TeX</comment>
+ <comment xml:lang="cs">Písmo TeX</comment>
+ <comment xml:lang="cy">Ffont TeX</comment>
+ <comment xml:lang="da">TeX-skrifttype</comment>
+ <comment xml:lang="de">TeX-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά TeX</comment>
+ <comment xml:lang="en_GB">TeX font</comment>
+ <comment xml:lang="eo">TeX-tiparo</comment>
+ <comment xml:lang="es">tipografía de TeX</comment>
+ <comment xml:lang="eu">TeX letra-tipoa</comment>
+ <comment xml:lang="fi">TeX-kirjasin</comment>
+ <comment xml:lang="fo">TeX stavasnið</comment>
+ <comment xml:lang="fr">police TeX</comment>
+ <comment xml:lang="ga">cló TeX</comment>
+ <comment xml:lang="gl">tipo de letra de TeX</comment>
+ <comment xml:lang="he">גופן TeX</comment>
+ <comment xml:lang="hu">TeX-betűkészlet</comment>
+ <comment xml:lang="id">Fonta TeX</comment>
+ <comment xml:lang="it">Tipo carattere TeX</comment>
+ <comment xml:lang="ja">TeX フォント</comment>
+ <comment xml:lang="kk">TeX қарібі</comment>
+ <comment xml:lang="ko">TeX 글꼴</comment>
+ <comment xml:lang="lt">TeX šriftas</comment>
+ <comment xml:lang="lv">TeX fonts</comment>
+ <comment xml:lang="ms">Font TeX</comment>
+ <comment xml:lang="nb">TeX-skrift</comment>
+ <comment xml:lang="nl">TeX-lettertype</comment>
+ <comment xml:lang="nn">TeX-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka TeX</comment>
+ <comment xml:lang="pt">tipo de letra TeX</comment>
+ <comment xml:lang="pt_BR">Fonte TeX</comment>
+ <comment xml:lang="ro">Font TeX</comment>
+ <comment xml:lang="ru">шрифт TeX</comment>
+ <comment xml:lang="sk">Písmo TeX</comment>
+ <comment xml:lang="sl">Datoteka pisave TeX</comment>
+ <comment xml:lang="sq">Gërma TeX</comment>
+ <comment xml:lang="sr">ТеХ фонт</comment>
+ <comment xml:lang="sv">TeX-typsnitt</comment>
+ <comment xml:lang="uk">шрифт TeX</comment>
+ <comment xml:lang="vi">Phông chữ TeX</comment>
+ <comment xml:lang="zh_CN">TeX 字体</comment>
+ <comment xml:lang="zh_TW">TeX 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="\367\203" type="string" offset="0"/>
+ <match value="\367\131" type="string" offset="0"/>
+ <match value="\367\312" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-font-tex-tfm">
+ <comment>TeX font metrics</comment>
+ <comment xml:lang="ar">مقاييس خط TeX</comment>
+ <comment xml:lang="az">TeX yazı növü metrikləri</comment>
+ <comment xml:lang="be@latin">Metryka šryftu TeX</comment>
+ <comment xml:lang="bg">Шрифтова метрика — TeX</comment>
+ <comment xml:lang="ca">mètrica de tipus de lletra TeX</comment>
+ <comment xml:lang="cs">Metrika písma TeX</comment>
+ <comment xml:lang="cy">Metrigau Ffont TeX</comment>
+ <comment xml:lang="da">TeX-skrifttypeinformation</comment>
+ <comment xml:lang="de">TeX-Schriftmetriken</comment>
+ <comment xml:lang="el">μετρικά γραμματοσειράς TeX</comment>
+ <comment xml:lang="en_GB">TeX font metrics</comment>
+ <comment xml:lang="eo">metrikoj de TeX-tiparo</comment>
+ <comment xml:lang="es">métricas de tipografía de TeX</comment>
+ <comment xml:lang="eu">TeX letra-tipoen neurriak</comment>
+ <comment xml:lang="fi">TeX-kirjasinmitat</comment>
+ <comment xml:lang="fr">métriques de police TeX</comment>
+ <comment xml:lang="ga">meadarachtaí cló TeX</comment>
+ <comment xml:lang="gl">Métricas de tipo de letra de TeX</comment>
+ <comment xml:lang="he">גופן מטריקס של TeX</comment>
+ <comment xml:lang="hu">TeX-betűmetrika</comment>
+ <comment xml:lang="id">Fonta metrik TeX</comment>
+ <comment xml:lang="it">Metriche tipo carattere TeX</comment>
+ <comment xml:lang="ja">TeX フォントメトリック</comment>
+ <comment xml:lang="kk">TeX қаріп метрикалары</comment>
+ <comment xml:lang="ko">Tex 글꼴 메트릭스</comment>
+ <comment xml:lang="lt">TeX šriftų metrika</comment>
+ <comment xml:lang="lv">TeX fonta metrikas</comment>
+ <comment xml:lang="ms">Metrik font TeX</comment>
+ <comment xml:lang="nb">TeX skrifttypemetrikk</comment>
+ <comment xml:lang="nl">TeX-lettertype-metrieken</comment>
+ <comment xml:lang="nn">TeX skrifttypemetrikk</comment>
+ <comment xml:lang="pl">Metryki czcionki TeX</comment>
+ <comment xml:lang="pt">métricas de tipo de letra TeX</comment>
+ <comment xml:lang="pt_BR">Métrica de fonte TeX</comment>
+ <comment xml:lang="ro">Dimensiuni font TeX</comment>
+ <comment xml:lang="ru">метрика шрифта TeX</comment>
+ <comment xml:lang="sk">Metrika písma TeX</comment>
+ <comment xml:lang="sl">Matrika pisave Tex</comment>
+ <comment xml:lang="sq">Gërma TeX metrics</comment>
+ <comment xml:lang="sr">ТеХ метрика фонта</comment>
+ <comment xml:lang="sv">TeX-typsnittsmetrik</comment>
+ <comment xml:lang="uk">метрики шрифту TeX</comment>
+ <comment xml:lang="vi">Cách đo phông chữ TeX</comment>
+ <comment xml:lang="zh_CN">TeX 字体参数</comment>
+ <comment xml:lang="zh_TW">TeX 字型描述檔</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="\000\021" type="string" offset="2"/>
+ <match value="\000\022" type="string" offset="2"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-font-ttf">
+ <comment>TrueType font</comment>
+ <comment xml:lang="ar">خط TrueType</comment>
+ <comment xml:lang="be@latin">Šryft TrueType</comment>
+ <comment xml:lang="bg">Шрифт — TrueType</comment>
+ <comment xml:lang="ca">tipus de lletra TrueType</comment>
+ <comment xml:lang="cs">Písmo TrueType</comment>
+ <comment xml:lang="da">TrueType-skrifttype</comment>
+ <comment xml:lang="de">TrueType-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά TrueType</comment>
+ <comment xml:lang="en_GB">TrueType font</comment>
+ <comment xml:lang="eo">TrueType-tiparo</comment>
+ <comment xml:lang="es">tipografía TrueType</comment>
+ <comment xml:lang="eu">TrueType letra-tipoa</comment>
+ <comment xml:lang="fi">TrueType-kirjasin</comment>
+ <comment xml:lang="fo">TrueType stavasnið</comment>
+ <comment xml:lang="fr">police Truetype</comment>
+ <comment xml:lang="ga">cló TrueType</comment>
+ <comment xml:lang="gl">tipo de letra TrueType</comment>
+ <comment xml:lang="he">גופן מסוג TrueType</comment>
+ <comment xml:lang="hu">TrueType-betűkészlet</comment>
+ <comment xml:lang="id">Fonta TrueType</comment>
+ <comment xml:lang="it">Tipo carattere TrueType</comment>
+ <comment xml:lang="ja">TrueType フォント</comment>
+ <comment xml:lang="kk">TrueType қарібі</comment>
+ <comment xml:lang="ko">트루타입 글꼴</comment>
+ <comment xml:lang="lt">TrueType šriftas</comment>
+ <comment xml:lang="lv">TrueType fonts</comment>
+ <comment xml:lang="ms">Font TrueType</comment>
+ <comment xml:lang="nb">TrueType-skrift</comment>
+ <comment xml:lang="nl">TrueType-lettertype</comment>
+ <comment xml:lang="nn">TrueType-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka TrueType</comment>
+ <comment xml:lang="pt">tipo de letra TrueType</comment>
+ <comment xml:lang="pt_BR">Fonte TrueType</comment>
+ <comment xml:lang="ro">Font TrueType</comment>
+ <comment xml:lang="ru">шрифт TrueType</comment>
+ <comment xml:lang="sk">Písmo TrueType</comment>
+ <comment xml:lang="sl">Datoteka pisave TrueType</comment>
+ <comment xml:lang="sq">Lloj gërme TrueType</comment>
+ <comment xml:lang="sr">Трутајп фонт</comment>
+ <comment xml:lang="sv">Truetype-typsnitt</comment>
+ <comment xml:lang="uk">шрифт TrueType</comment>
+ <comment xml:lang="vi">Phông chữ TrueType</comment>
+ <comment xml:lang="zh_CN">TrueType 字体</comment>
+ <comment xml:lang="zh_TW">TrueType 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="FFIL" type="string" offset="0"/>
+ <match value="FFIL" type="string" offset="65"/>
+ <match value="\000\001\000\000\000" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ttf"/>
+ <glob pattern="*.ttc"/>
+ </mime-type>
+ <mime-type type="application/x-font-ttx">
+ <comment>TrueType XML font</comment>
+ <comment xml:lang="ar">خط TrueType XML</comment>
+ <comment xml:lang="be@latin">Šryft TrueType XML</comment>
+ <comment xml:lang="bg">Шрифт — TrueType XML</comment>
+ <comment xml:lang="ca">tipus de lletra TrueType XML</comment>
+ <comment xml:lang="cs">Písmo TrueType XML</comment>
+ <comment xml:lang="da">TrueType XML-skrifttype</comment>
+ <comment xml:lang="de">TrueType-XML-Schrift</comment>
+ <comment xml:lang="es">tipografía TrueType XML</comment>
+ <comment xml:lang="eu">TrueType XML letra-tipoa</comment>
+ <comment xml:lang="fi">TrueType-XML-kirjasin</comment>
+ <comment xml:lang="fo">TrueType XML stavasnið</comment>
+ <comment xml:lang="fr">police Truetype XML</comment>
+ <comment xml:lang="ga">cló XML TrueType</comment>
+ <comment xml:lang="gl">tipo de letra TrueType XML</comment>
+ <comment xml:lang="he">גופן XML מסוג TrueType</comment>
+ <comment xml:lang="hu">TrueType XML betűkészlet</comment>
+ <comment xml:lang="id">Fonta TrueType XML</comment>
+ <comment xml:lang="it">Tipo carattere TrueType XML</comment>
+ <comment xml:lang="ja">TrueType XML フォント</comment>
+ <comment xml:lang="kk">TrueType XML қарібі</comment>
+ <comment xml:lang="ko">트루타입 XML 글꼴</comment>
+ <comment xml:lang="lt">TrueType XML šriftas</comment>
+ <comment xml:lang="lv">TrueType XML fonts</comment>
+ <comment xml:lang="nb">TrueType XML-skrift</comment>
+ <comment xml:lang="nl">TrueType XML-lettertype</comment>
+ <comment xml:lang="nn">TrueType XML-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka TrueType XML</comment>
+ <comment xml:lang="pt_BR">Fonte TrueType XML</comment>
+ <comment xml:lang="ro">Font XML TrueType</comment>
+ <comment xml:lang="ru">шрифт TrueType XML</comment>
+ <comment xml:lang="sk">Písmo TrueType XML</comment>
+ <comment xml:lang="sl">Datoteka pisave TrueType XML</comment>
+ <comment xml:lang="sq">Lloj gërme TrueType XML</comment>
+ <comment xml:lang="sv">Truetype XML-typsnitt</comment>
+ <comment xml:lang="uk">шрифт TrueType XML</comment>
+ <comment xml:lang="vi">Phông chữ XML TrueType</comment>
+ <comment xml:lang="zh_CN">TrueType XML 字体</comment>
+ <comment xml:lang="zh_TW">TrueType XML 字型</comment>
+ <sub-class-of type="text/xml"/>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="&lt;ttFont sfntVersion=&quot;\\x00\\x01\\x00\\x00&quot; ttLibVersion=&quot;" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.ttx"/>
+ </mime-type>
+ <mime-type type="application/x-font-vfont">
+ <comment>V font</comment>
+ <comment xml:lang="ar">خط V</comment>
+ <comment xml:lang="az">V yazı növü</comment>
+ <comment xml:lang="be@latin">Šryft V</comment>
+ <comment xml:lang="bg">Шрифт — V</comment>
+ <comment xml:lang="ca">tipus de lletra V</comment>
+ <comment xml:lang="cs">Písmo V</comment>
+ <comment xml:lang="cy">Ffont V</comment>
+ <comment xml:lang="da">V-skrifttype</comment>
+ <comment xml:lang="de">V-Schrift</comment>
+ <comment xml:lang="el">γραμματοσειρά V</comment>
+ <comment xml:lang="en_GB">V font</comment>
+ <comment xml:lang="eo">V-tiparo</comment>
+ <comment xml:lang="es">tipografía V</comment>
+ <comment xml:lang="eu">V letra-tipoa</comment>
+ <comment xml:lang="fi">V-kirjasin</comment>
+ <comment xml:lang="fo">V stavasnið</comment>
+ <comment xml:lang="fr">police V</comment>
+ <comment xml:lang="ga">cló V</comment>
+ <comment xml:lang="gl">tipo de letra V</comment>
+ <comment xml:lang="he">גופן של V</comment>
+ <comment xml:lang="hu">V-betűkészlet</comment>
+ <comment xml:lang="id">Fonta V</comment>
+ <comment xml:lang="it">Tipo carattere V</comment>
+ <comment xml:lang="ja">V フォント</comment>
+ <comment xml:lang="kk">V font қарібі</comment>
+ <comment xml:lang="ko">V 글꼴</comment>
+ <comment xml:lang="lt">V šriftas</comment>
+ <comment xml:lang="lv">V fonts</comment>
+ <comment xml:lang="ms">Font V</comment>
+ <comment xml:lang="nb">V-skrift</comment>
+ <comment xml:lang="nl">V-lettertype</comment>
+ <comment xml:lang="nn">V-skrifttype</comment>
+ <comment xml:lang="pl">Czcionka V</comment>
+ <comment xml:lang="pt">tipo de letra V</comment>
+ <comment xml:lang="pt_BR">Fonte V</comment>
+ <comment xml:lang="ro">Font V</comment>
+ <comment xml:lang="ru">шрифт V font</comment>
+ <comment xml:lang="sk">Písmo V</comment>
+ <comment xml:lang="sl">Datoteka pisave V</comment>
+ <comment xml:lang="sq">Gërmë V</comment>
+ <comment xml:lang="sr">V фонт</comment>
+ <comment xml:lang="sv">V-typsnitt</comment>
+ <comment xml:lang="uk">V-шрифт</comment>
+ <comment xml:lang="vi">Phông chữ V</comment>
+ <comment xml:lang="zh_CN">V 字体</comment>
+ <comment xml:lang="zh_TW">V 字型</comment>
+ <generic-icon name="font-x-generic"/>
+ <magic priority="50">
+ <match value="FONT" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-frame">
+ <comment>Adobe FrameMaker document</comment>
+ <comment xml:lang="ar">مستند أدوبي الصانع للإطارات</comment>
+ <comment xml:lang="be@latin">Dakument Adobe FrameMaker</comment>
+ <comment xml:lang="bg">Документ — Adobe FrameMaker</comment>
+ <comment xml:lang="ca">document FrameMaker d'Adobe</comment>
+ <comment xml:lang="cs">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="da">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="de">Adobe-FrameMaker-Dokument</comment>
+ <comment xml:lang="eo">Dokumento de Adobe FrameMaker</comment>
+ <comment xml:lang="es">documento de Adobe FrameMaker</comment>
+ <comment xml:lang="eu">Adobe FrameMaker-en dokumentua</comment>
+ <comment xml:lang="fi">Adobe FrameMaker -asiakirja</comment>
+ <comment xml:lang="fo">Adobe FrameMaker skjal</comment>
+ <comment xml:lang="fr">document Adobe FrameMaker</comment>
+ <comment xml:lang="ga">cáipéis Adobe FrameMaker</comment>
+ <comment xml:lang="gl">documento de Adobe FrameMaker</comment>
+ <comment xml:lang="he">מסמך Adobe FrameMaker</comment>
+ <comment xml:lang="hu">Adobe FrameMaker-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Adobe FrameMaker</comment>
+ <comment xml:lang="it">Documento Adobe FrameMaker</comment>
+ <comment xml:lang="ja">Adobe FrameMaker ドキュメント</comment>
+ <comment xml:lang="kk">Adobe FrameMaker құжаты</comment>
+ <comment xml:lang="ko">어도비 프레임메이커 문서</comment>
+ <comment xml:lang="lt">Adobe FrameMaker dokumentas</comment>
+ <comment xml:lang="lv">Adobe FrameMaker dokuments</comment>
+ <comment xml:lang="nb">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="nl">Adobe FrameMaker-document</comment>
+ <comment xml:lang="nn">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="pl">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="pt_BR">Documento do Adobe FrameMaker</comment>
+ <comment xml:lang="ro">Document Adobe FrameMaker</comment>
+ <comment xml:lang="ru">документ Adobe FrameMaker</comment>
+ <comment xml:lang="sk">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="sl">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="sq">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="sv">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="uk">документ Adobe FrameMaker</comment>
+ <comment xml:lang="vi">Tài liệu Adobe FrameMaker</comment>
+ <comment xml:lang="zh_CN">Adobe FrameMaker 文档</comment>
+ <comment xml:lang="zh_TW">Adobe FrameMaker 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="&lt;MakerFile" type="string" offset="0"/>
+ <match value="&lt;MIFFile" type="string" offset="0"/>
+ <match value="&lt;MakerDictionary" type="string" offset="0"/>
+ <match value="&lt;MakerScreenFon" type="string" offset="0"/>
+ <match value="&lt;MML" type="string" offset="0"/>
+ <match value="&lt;Book" type="string" offset="0"/>
+ <match value="&lt;Maker" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-gameboy-rom">
+ <comment>Game Boy ROM</comment>
+ <comment xml:lang="ar">Game Boy ROM</comment>
+ <comment xml:lang="be@latin">Game Boy ROM</comment>
+ <comment xml:lang="bg">ROM — Game Boy</comment>
+ <comment xml:lang="ca">ROM de Game Boy</comment>
+ <comment xml:lang="cs">ROM pro Game Boy</comment>
+ <comment xml:lang="da">Game Boy-rom</comment>
+ <comment xml:lang="de">Game-Boy-ROM</comment>
+ <comment xml:lang="el">εικόνα μνήμης ROM GameBoy</comment>
+ <comment xml:lang="en_GB">Game Boy ROM</comment>
+ <comment xml:lang="eo">NLM de Game Boy</comment>
+ <comment xml:lang="es">ROM de Game Boy</comment>
+ <comment xml:lang="eu">Game Boy-eko ROMa</comment>
+ <comment xml:lang="fi">Game Boy -ROM</comment>
+ <comment xml:lang="fo">Game Boy ROM</comment>
+ <comment xml:lang="fr">ROM Game Boy</comment>
+ <comment xml:lang="ga">ROM Game Boy</comment>
+ <comment xml:lang="gl">ROM de Game Boy</comment>
+ <comment xml:lang="he">ROM של Game Boy</comment>
+ <comment xml:lang="hu">Game Boy ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Game Boy</comment>
+ <comment xml:lang="it">ROM Game Boy</comment>
+ <comment xml:lang="ja">ゲームボーイ ROM</comment>
+ <comment xml:lang="kk">Game Boy ROM</comment>
+ <comment xml:lang="ko">게임보이 롬</comment>
+ <comment xml:lang="lt">Game Boy ROM</comment>
+ <comment xml:lang="lv">Game Boy ROM</comment>
+ <comment xml:lang="ms">ROM Game Boy</comment>
+ <comment xml:lang="nb">Game Boy-ROM</comment>
+ <comment xml:lang="nl">Game Boy-ROM</comment>
+ <comment xml:lang="nn">Game Boy-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Game Boy</comment>
+ <comment xml:lang="pt">ROM Game Boy</comment>
+ <comment xml:lang="pt_BR">ROM do Game Boy</comment>
+ <comment xml:lang="ro">ROM Game Boy</comment>
+ <comment xml:lang="ru">Game Boy ROM</comment>
+ <comment xml:lang="sk">ROM pre Game Boy</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Game Boy</comment>
+ <comment xml:lang="sq">ROM Game Boy</comment>
+ <comment xml:lang="sr">Гејмбој РОМ</comment>
+ <comment xml:lang="sv">Game Boy-rom</comment>
+ <comment xml:lang="uk">ППП Game Boy</comment>
+ <comment xml:lang="vi">ROM Game Boy</comment>
+ <comment xml:lang="zh_CN">Game Boy ROM</comment>
+ <comment xml:lang="zh_TW">Game Boy ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.gb"/>
+ </mime-type>
+ <mime-type type="application/x-gba-rom">
+ <comment>Game Boy Advance ROM</comment>
+ <comment xml:lang="ar">Game Boy Advance ROM</comment>
+ <comment xml:lang="be@latin">Game Boy Advance ROM</comment>
+ <comment xml:lang="bg">ROM — Game Boy Advance</comment>
+ <comment xml:lang="ca">ROM de Game Boy Advance</comment>
+ <comment xml:lang="cs">ROM pro Game Boy Advance</comment>
+ <comment xml:lang="da">Game Boy Advance-rom</comment>
+ <comment xml:lang="de">Game-Boy-Advance-ROM</comment>
+ <comment xml:lang="es">ROM de Game Boy Advance</comment>
+ <comment xml:lang="eu">Game Boy Advance-ko ROMa</comment>
+ <comment xml:lang="fi">Game Boy Advance -ROM</comment>
+ <comment xml:lang="fo">Game Boy Advance ROM</comment>
+ <comment xml:lang="fr">ROM Game Boy Advance</comment>
+ <comment xml:lang="ga">ROM Game Boy Advance</comment>
+ <comment xml:lang="gl">ROM de Game Boy Advance</comment>
+ <comment xml:lang="he">ROM של Game Boy Advance</comment>
+ <comment xml:lang="hu">Game Boy Advance ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Game Boy Advance</comment>
+ <comment xml:lang="it">ROM Game Boy Advance</comment>
+ <comment xml:lang="ja">ゲームボーイアドバンス ROM</comment>
+ <comment xml:lang="kk">Game Boy Advance ROM</comment>
+ <comment xml:lang="ko">게임보이 어드밴스 롬</comment>
+ <comment xml:lang="lt">Game Boy Advance ROM</comment>
+ <comment xml:lang="lv">Game Boy Advance ROM</comment>
+ <comment xml:lang="nb">Game Boy Advance-ROM</comment>
+ <comment xml:lang="nl">Game Boy Advance-ROM</comment>
+ <comment xml:lang="nn">Game Boy Advance-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Game Boy Advance</comment>
+ <comment xml:lang="pt_BR">ROM do Game Boy Advance</comment>
+ <comment xml:lang="ro">ROM Game Boy Advance</comment>
+ <comment xml:lang="ru">Game Boy Advance ROM</comment>
+ <comment xml:lang="sk">ROM pre Game Boy Advance</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Game Boy Advance</comment>
+ <comment xml:lang="sq">ROM Game Boy Advance</comment>
+ <comment xml:lang="sv">Game Boy Advance-rom</comment>
+ <comment xml:lang="uk">розширений ППП Game Boy</comment>
+ <comment xml:lang="vi">ROM Game Boy Advance</comment>
+ <comment xml:lang="zh_CN">Game Boy Advance ROM</comment>
+ <comment xml:lang="zh_TW">Game Boy Advance ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.gba"/>
+ </mime-type>
+ <mime-type type="application/x-gdbm">
+ <comment>GDBM database</comment>
+ <comment xml:lang="ar">قاعدة بيانات GDBM</comment>
+ <comment xml:lang="be@latin">Baza źviestak GDBM</comment>
+ <comment xml:lang="bg">База от данни — GDBM</comment>
+ <comment xml:lang="ca">base de dades GDBM</comment>
+ <comment xml:lang="cs">Databáze GDBM</comment>
+ <comment xml:lang="da">GDBM-database</comment>
+ <comment xml:lang="de">GDBM-Datenbank</comment>
+ <comment xml:lang="eo">GDBM-datumbazo</comment>
+ <comment xml:lang="es">base de datos GDBM</comment>
+ <comment xml:lang="eu">GDBM datu-basea</comment>
+ <comment xml:lang="fi">GDBM-tietokanta</comment>
+ <comment xml:lang="fo">GDBM dátustovnur</comment>
+ <comment xml:lang="fr">base de données GDBM</comment>
+ <comment xml:lang="ga">bunachar sonraí GDBM</comment>
+ <comment xml:lang="gl">base de datos GDBM</comment>
+ <comment xml:lang="he">בסיס נתונים GDBM</comment>
+ <comment xml:lang="hu">GDBM adatbázis</comment>
+ <comment xml:lang="id">Basis data GDBM</comment>
+ <comment xml:lang="it">Database GDBM</comment>
+ <comment xml:lang="ja">GDBM データベース</comment>
+ <comment xml:lang="kk">GDBM дерекқоры</comment>
+ <comment xml:lang="ko">GDBM 데이터베이스</comment>
+ <comment xml:lang="lt">GDBM duomenų bazė</comment>
+ <comment xml:lang="lv">GDBM datubāze</comment>
+ <comment xml:lang="nb">GDBM-database</comment>
+ <comment xml:lang="nl">GDBM-gegevensbank</comment>
+ <comment xml:lang="nn">GDBM-database</comment>
+ <comment xml:lang="pl">Baza danych GDBM</comment>
+ <comment xml:lang="pt_BR">Banco de dados GDBM</comment>
+ <comment xml:lang="ro">Bază de date GDBM</comment>
+ <comment xml:lang="ru">база данных GDBM</comment>
+ <comment xml:lang="sk">Databáza GDBM</comment>
+ <comment xml:lang="sl">Podatkovna zbirka GDBM</comment>
+ <comment xml:lang="sq">Bazë me të dhëna GDBM</comment>
+ <comment xml:lang="sv">GDBM-databas</comment>
+ <comment xml:lang="uk">база даних GDBM</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu GDBM</comment>
+ <comment xml:lang="zh_CN">GDBM 数据库</comment>
+ <comment xml:lang="zh_TW">GDBM 資料庫</comment>
+ <acronym>GDBM</acronym>
+ <expanded-acronym>GNU Database Manager</expanded-acronym>
+ <magic priority="50">
+ <match value="0x13579ace" type="big32" offset="0"/>
+ <match value="0x13579ace" type="little32" offset="0"/>
+ <match value="GDBM" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-genesis-rom">
+
+ <comment>Genesis ROM</comment>
+ <comment xml:lang="ar">Genesis ROM</comment>
+ <comment xml:lang="be@latin">Genesis ROM</comment>
+ <comment xml:lang="bg">ROM — Genesis</comment>
+ <comment xml:lang="ca">ROM de Genesis</comment>
+ <comment xml:lang="cs">ROM pro Genesis</comment>
+ <comment xml:lang="da">Genesis-rom</comment>
+ <comment xml:lang="de">Genesis-ROM</comment>
+ <comment xml:lang="el">εικόνα μνήμης ROM Genesis</comment>
+ <comment xml:lang="en_GB">Genesis ROM</comment>
+ <comment xml:lang="eo">Genesis-NLM</comment>
+ <comment xml:lang="es">ROM de Genesis (Mega Drive)</comment>
+ <comment xml:lang="eu">Genesis-eko ROMa</comment>
+ <comment xml:lang="fi">Genesis-ROM</comment>
+ <comment xml:lang="fo">Genesis ROM</comment>
+ <comment xml:lang="fr">ROM Mega Drive/Genesis</comment>
+ <comment xml:lang="ga">ROM Genesis</comment>
+ <comment xml:lang="gl">ROM xenérica</comment>
+ <comment xml:lang="he">ROM של Genesis</comment>
+ <comment xml:lang="hu">Genesis ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Genesis</comment>
+ <comment xml:lang="it">ROM Megadrive</comment>
+ <comment xml:lang="ja">メガドライブ ROM</comment>
+ <comment xml:lang="kk">Genesis ROM</comment>
+ <comment xml:lang="ko">제네시스 롬</comment>
+ <comment xml:lang="lt">Genesis ROM</comment>
+ <comment xml:lang="lv">Genesis ROM</comment>
+ <comment xml:lang="ms">ROM Genesis</comment>
+ <comment xml:lang="nb">Genesis-ROM</comment>
+ <comment xml:lang="nl">Mega Drive</comment>
+ <comment xml:lang="nn">Genesis-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Mega Drive</comment>
+ <comment xml:lang="pt">ROM Genesis</comment>
+ <comment xml:lang="pt_BR">ROM do Gênesis (Mega Drive)</comment>
+ <comment xml:lang="ro">ROM Genesis</comment>
+ <comment xml:lang="ru">Genesis ROM</comment>
+ <comment xml:lang="sk">ROM pre Megadrive</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Genesis</comment>
+ <comment xml:lang="sq">ROM Genesis</comment>
+ <comment xml:lang="sr">Genesis РОМ</comment>
+ <comment xml:lang="sv">Genesis-rom</comment>
+ <comment xml:lang="uk">ППП Genesis</comment>
+ <comment xml:lang="vi">ROM Genesis</comment>
+ <comment xml:lang="zh_CN">Genesis ROM</comment>
+ <comment xml:lang="zh_TW">Genesis ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="50">
+ <match value="SEGA" type="string" offset="256"/>
+ <match value="EAGN" type="string" offset="640"/>
+ <match value="EAMG" type="string" offset="640"/>
+ </magic>
+ <glob pattern="*.gen"/>
+ </mime-type>
+ <mime-type type="application/x-gettext-translation">
+ <comment>translated messages (machine-readable)</comment>
+ <comment xml:lang="ar">رسائل مترجمة (مقروءة آليا)</comment>
+ <comment xml:lang="be@latin">pierakładzienyja paviedamleńni (dla čytańnia kamputaram)</comment>
+ <comment xml:lang="bg">Преведени съобщения — машинен формат</comment>
+ <comment xml:lang="ca">missatges traduïts (llegible per màquina)</comment>
+ <comment xml:lang="cs">Přeložené zprávy (strojově čitelné)</comment>
+ <comment xml:lang="da">oversatte meddelelser (maskinlæsbare)</comment>
+ <comment xml:lang="de">Übersetzte Meldungen (maschinenlesbar)</comment>
+ <comment xml:lang="el">μεταφρασμένα μηνύματα (για μηχανική ανάγνωση)</comment>
+ <comment xml:lang="en_GB">translated messages (machine-readable)</comment>
+ <comment xml:lang="eo">tradukitaj mesaĝoj (maŝinlegebla)</comment>
+ <comment xml:lang="es">mensajes traducidos (legibles por máquinas)</comment>
+ <comment xml:lang="eu">itzulitako mezuak (ordenagailuek irakurtzeko)</comment>
+ <comment xml:lang="fi">käännetyt viestit (koneluettava)</comment>
+ <comment xml:lang="fo">týdd boð (maskin-lesifør)</comment>
+ <comment xml:lang="fr">messages traduits (lisibles par machine)</comment>
+ <comment xml:lang="ga">teachtaireachtaí aistrithe (inléite ag meaisín)</comment>
+ <comment xml:lang="gl">mensaxes traducidos (lexíbeis por máquinas)</comment>
+ <comment xml:lang="he">מסר מתורגם (מובן ע"י מכונה)</comment>
+ <comment xml:lang="hu">lefordított üzenetek (gépi kód)</comment>
+ <comment xml:lang="id">pesan diterjemahkan (dapat dibaca mesin)</comment>
+ <comment xml:lang="it">Messaggi tradotti (leggibili da macchina)</comment>
+ <comment xml:lang="ja">翻訳メッセージ (マシン用)</comment>
+ <comment xml:lang="kk">аударылған хабарламалар (машиналық түрде)</comment>
+ <comment xml:lang="ko">번역 메시지 (컴퓨터 사용 형식)</comment>
+ <comment xml:lang="lt">išversti užrašai (kompiuteriniu formatu)</comment>
+ <comment xml:lang="lv">pārtulkotie ziņojumi (mašīnlasāms)</comment>
+ <comment xml:lang="ms">Mesej diterjemah (bolehdibaca-mesin)</comment>
+ <comment xml:lang="nb">oversatte meldinger (maskinlesbar)</comment>
+ <comment xml:lang="nl">vertaalde berichten (machine-leesbaar)</comment>
+ <comment xml:lang="nn">oversette meldingar (maskinlesbare)</comment>
+ <comment xml:lang="pl">Przetłumaczone komunikaty (czytelne dla komputera)</comment>
+ <comment xml:lang="pt">mensagens traduzidas (leitura pelo computador)</comment>
+ <comment xml:lang="pt_BR">mensagens traduzidas (legível por máquinas)</comment>
+ <comment xml:lang="ro">mesaje traduse (citite de calculator)</comment>
+ <comment xml:lang="ru">переводы сообщений (откомпилированые)</comment>
+ <comment xml:lang="sk">Preložené správy (strojovo čitateľné)</comment>
+ <comment xml:lang="sl">prevedena sporočila (strojni zapis)</comment>
+ <comment xml:lang="sq">Mesazhe të përkthyer (të lexueshëm nga makina)</comment>
+ <comment xml:lang="sr">преведене поруке (машинама читљиво)</comment>
+ <comment xml:lang="sv">översatta meddelanden (maskinläsbara)</comment>
+ <comment xml:lang="uk">перекладені повідомлення (у машинній формі)</comment>
+ <comment xml:lang="vi">thông điệp đã dịch (máy đọc được)</comment>
+ <comment xml:lang="zh_CN">消息翻译(机读)</comment>
+ <comment xml:lang="zh_TW">翻譯訊息 (程式讀取格式)</comment>
+ <glob pattern="*.gmo"/>
+ <glob pattern="*.mo"/>
+ </mime-type>
+ <mime-type type="application/x-glade">
+ <comment>Glade project</comment>
+ <comment xml:lang="ar">مشروع Glade</comment>
+ <comment xml:lang="az">Glade layihəsi</comment>
+ <comment xml:lang="be@latin">Prajekt Glade</comment>
+ <comment xml:lang="bg">Проект — Glade</comment>
+ <comment xml:lang="ca">projecte de Glade</comment>
+ <comment xml:lang="cs">Projekt Glade</comment>
+ <comment xml:lang="cy">Prosiect Glade</comment>
+ <comment xml:lang="da">Gladeprojekt</comment>
+ <comment xml:lang="de">Glade-Projekt</comment>
+ <comment xml:lang="el">έργο Glade</comment>
+ <comment xml:lang="en_GB">Glade project</comment>
+ <comment xml:lang="eo">Glade-projekto</comment>
+ <comment xml:lang="es">proyecto de Glade</comment>
+ <comment xml:lang="eu">Glade proiektua</comment>
+ <comment xml:lang="fi">Glade-projekti</comment>
+ <comment xml:lang="fo">Glade verkætlan</comment>
+ <comment xml:lang="fr">projet Glade</comment>
+ <comment xml:lang="ga">tionscadal Glade</comment>
+ <comment xml:lang="gl">proxecto de Glade</comment>
+ <comment xml:lang="he">מיזם Glade</comment>
+ <comment xml:lang="hu">Glade-projekt</comment>
+ <comment xml:lang="id">Proyek Glade</comment>
+ <comment xml:lang="it">Progetto Glade</comment>
+ <comment xml:lang="ja">Glade プロジェクト</comment>
+ <comment xml:lang="kk">Glade жобасы</comment>
+ <comment xml:lang="ko">Glade 프로젝트</comment>
+ <comment xml:lang="lt">Glade projektas</comment>
+ <comment xml:lang="lv">Glade projekts</comment>
+ <comment xml:lang="ms">Projek Glade</comment>
+ <comment xml:lang="nb">Glade prosjekt</comment>
+ <comment xml:lang="nl">Glade-project</comment>
+ <comment xml:lang="nn">Glade prosjekt</comment>
+ <comment xml:lang="pl">Projekt Glade</comment>
+ <comment xml:lang="pt">projecto Glade</comment>
+ <comment xml:lang="pt_BR">Projeto do Glade</comment>
+ <comment xml:lang="ro">Proiect Glade</comment>
+ <comment xml:lang="ru">проект Glade</comment>
+ <comment xml:lang="sk">Projekt Glade</comment>
+ <comment xml:lang="sl">Datoteka projekta Glade</comment>
+ <comment xml:lang="sq">Projekt Glade</comment>
+ <comment xml:lang="sr">Глејд пројекат</comment>
+ <comment xml:lang="sv">Glade-projekt</comment>
+ <comment xml:lang="uk">проект Glade</comment>
+ <comment xml:lang="vi">Dự án Glade</comment>
+ <comment xml:lang="zh_CN">Glade 工程</comment>
+ <comment xml:lang="zh_TW">Glade 專案</comment>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.glade"/>
+ <magic priority="50">
+ <match value="&lt;glade-interface" type="string" offset="0:256"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-gmc-link">
+ <comment>GMC link</comment>
+ <comment xml:lang="ar">وصلة GMC</comment>
+ <comment xml:lang="az">GMC körpüsü</comment>
+ <comment xml:lang="be@latin">Spasyłka GMC</comment>
+ <comment xml:lang="bg">Връзка — GMC</comment>
+ <comment xml:lang="ca">enllaç GMC</comment>
+ <comment xml:lang="cs">Odkaz GMC</comment>
+ <comment xml:lang="cy">Cyswllt GMC</comment>
+ <comment xml:lang="da">GMC-henvisning</comment>
+ <comment xml:lang="de">GMC-Verweis</comment>
+ <comment xml:lang="el">σύνδεσμος GMC</comment>
+ <comment xml:lang="en_GB">GMC link</comment>
+ <comment xml:lang="eo">GMC-ligilo</comment>
+ <comment xml:lang="es">enlace GMC</comment>
+ <comment xml:lang="eu">GMC esteka</comment>
+ <comment xml:lang="fi">GMC-linkki</comment>
+ <comment xml:lang="fo">GMC leinkja</comment>
+ <comment xml:lang="fr">lien GMC</comment>
+ <comment xml:lang="ga">nasc GMC</comment>
+ <comment xml:lang="gl">ligazón GMC</comment>
+ <comment xml:lang="he">קישור GMC</comment>
+ <comment xml:lang="hu">GMC-link</comment>
+ <comment xml:lang="id">Taut GMC</comment>
+ <comment xml:lang="it">Collegamento GMC</comment>
+ <comment xml:lang="ja">GMC リンク</comment>
+ <comment xml:lang="kk">GMC сілтемесі</comment>
+ <comment xml:lang="ko">GMC 연결</comment>
+ <comment xml:lang="lt">GMC nuoroda</comment>
+ <comment xml:lang="lv">GMC saite</comment>
+ <comment xml:lang="ms">Pautan GMC</comment>
+ <comment xml:lang="nb">GMC-lenke</comment>
+ <comment xml:lang="nl">GMC-verwijzing</comment>
+ <comment xml:lang="nn">GMC-lenkje</comment>
+ <comment xml:lang="pl">Odnośnik GMC</comment>
+ <comment xml:lang="pt">'link' GMC</comment>
+ <comment xml:lang="pt_BR">Link GMC</comment>
+ <comment xml:lang="ro">Legătură GMC</comment>
+ <comment xml:lang="ru">ссылка GMC</comment>
+ <comment xml:lang="sk">Odkaz GMC</comment>
+ <comment xml:lang="sl">Datoteka povezave GMC</comment>
+ <comment xml:lang="sq">Lidhje GMC</comment>
+ <comment xml:lang="sr">GMC веза</comment>
+ <comment xml:lang="sv">GMC-länk</comment>
+ <comment xml:lang="uk">посилання GMC</comment>
+ <comment xml:lang="vi">Liên kết GMC</comment>
+ <comment xml:lang="zh_CN">GMC 链接</comment>
+ <comment xml:lang="zh_TW">GMC 鏈結</comment>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="URL:" type="string" offset="0:32"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-gnucash">
+ <comment>GnuCash financial data</comment>
+ <comment xml:lang="ar">معلومات GnuCash المالية</comment>
+ <comment xml:lang="bg">Финансови данни — GnuCash</comment>
+ <comment xml:lang="ca">dades financeres del GnuCash</comment>
+ <comment xml:lang="cs">Finanční data GnuCash</comment>
+ <comment xml:lang="da">Finansielle data til GnuCash</comment>
+ <comment xml:lang="de">GnuCash-Finanzdaten</comment>
+ <comment xml:lang="es">datos financieros GnuCash</comment>
+ <comment xml:lang="eu">GnuCash finantzako datuak</comment>
+ <comment xml:lang="fi">GnuCash-taloustiedot</comment>
+ <comment xml:lang="fo">GnuCash fíggjarligar dátur</comment>
+ <comment xml:lang="fr">données financières GnuCash</comment>
+ <comment xml:lang="ga">sonraí airgeadúla GnuCash</comment>
+ <comment xml:lang="gl">datos financeiros de GNUCash</comment>
+ <comment xml:lang="he">מידע כלכלי של GnuCash</comment>
+ <comment xml:lang="hu">GnuCash pénzügyi adatok</comment>
+ <comment xml:lang="id">Data keuangan GnuCash</comment>
+ <comment xml:lang="it">Dati finanziari GnuCash</comment>
+ <comment xml:lang="ja">GnuCash 会計データ</comment>
+ <comment xml:lang="kk">GnuCash қаржы ақпараты</comment>
+ <comment xml:lang="ko">GnuCash 재정 자료</comment>
+ <comment xml:lang="lt">GnuCash finansiniai duomenys</comment>
+ <comment xml:lang="lv">GnuCash finanšu dati</comment>
+ <comment xml:lang="nl">GnuCash financiële gegevens</comment>
+ <comment xml:lang="pl">Dane finansowe GnuCash</comment>
+ <comment xml:lang="pt_BR">Dados financeiros do GnuCash</comment>
+ <comment xml:lang="ro">Date financiare GnuCash</comment>
+ <comment xml:lang="ru">финансовые данные GnuCash</comment>
+ <comment xml:lang="sk">Finančné údaje GnuCash</comment>
+ <comment xml:lang="sl">Datoteka finančnih podatkov GnuCash</comment>
+ <comment xml:lang="sv">GnuCash-finansdata</comment>
+ <comment xml:lang="uk">фінансові дані GnuCash</comment>
+ <comment xml:lang="vi">Dữ liệu tài chính GnuCash</comment>
+ <comment xml:lang="zh_CN">GnuCash 财务数据</comment>
+ <comment xml:lang="zh_TW">GnuCash 財務資料</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.gnucash"/>
+ <glob pattern="*.gnc"/>
+ <glob pattern="*.xac"/>
+ </mime-type>
+ <mime-type type="application/x-gnumeric">
+ <comment>Gnumeric spreadsheet</comment>
+ <comment xml:lang="ar">جدول Gnumeric</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Gnumeric</comment>
+ <comment xml:lang="bg">Таблица — Gnumeric</comment>
+ <comment xml:lang="ca">full de càlcul de Gnumeric</comment>
+ <comment xml:lang="cs">Sešit Gnumeric</comment>
+ <comment xml:lang="da">Gnumeric-regneark</comment>
+ <comment xml:lang="de">Gnumeric-Tabelle</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Gnumeric</comment>
+ <comment xml:lang="en_GB">Gnumeric spreadsheet</comment>
+ <comment xml:lang="eo">Gnumeric-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo de Gnumeric</comment>
+ <comment xml:lang="eu">Gnumeric kalkulu-orria</comment>
+ <comment xml:lang="fi">Gnumeric-taulukko</comment>
+ <comment xml:lang="fo">Gnumeric rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Gnumeric</comment>
+ <comment xml:lang="ga">scarbhileog Gnumeric</comment>
+ <comment xml:lang="gl">folla de cálculo de Gnumeric</comment>
+ <comment xml:lang="he">גליון עבודה Gnumeric</comment>
+ <comment xml:lang="hu">Gnumeric-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar Gnumeric</comment>
+ <comment xml:lang="it">Foglio di calcolo Gnumeric</comment>
+ <comment xml:lang="ja">Gnumeric スプレッドシート</comment>
+ <comment xml:lang="kk">Gnumeric электрондық кестесі</comment>
+ <comment xml:lang="ko">Gnumeric 스프레드시트</comment>
+ <comment xml:lang="lt">Gnumeric skaičialentė</comment>
+ <comment xml:lang="lv">Gnumeric izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan Gnumeric</comment>
+ <comment xml:lang="nb">Gnumeric-regneark</comment>
+ <comment xml:lang="nl">Gnumeric-rekenblad</comment>
+ <comment xml:lang="nn">Gnumeric-rekneark</comment>
+ <comment xml:lang="pl">Arkusz Gnumeric</comment>
+ <comment xml:lang="pt">folha de cálculo Gnumeric</comment>
+ <comment xml:lang="pt_BR">Planilha do Gnumeric</comment>
+ <comment xml:lang="ro">Foaie de calcul Gnumeric</comment>
+ <comment xml:lang="ru">электронная таблица Gnumeric</comment>
+ <comment xml:lang="sk">Zošit Gnumeric</comment>
+ <comment xml:lang="sl">Razpredelnica Gnumeric</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh Gnumeric</comment>
+ <comment xml:lang="sr">Гнумерик табеларни рачун</comment>
+ <comment xml:lang="sv">Gnumeric-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Gnumeric</comment>
+ <comment xml:lang="vi">Bảng tính Gnumeric.</comment>
+ <comment xml:lang="zh_CN">Gnumeric 工作簿</comment>
+ <comment xml:lang="zh_TW">Gnumeric 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="gmr:Workbook" type="string" offset="0:64"/>
+ <match value="gnm:Workbook" type="string" offset="0:64"/>
+ </magic>
+ <glob pattern="*.gnumeric"/>
+ </mime-type>
+ <mime-type type="application/x-gnuplot">
+ <comment>Gnuplot document</comment>
+ <comment xml:lang="ar">مستند Gnuplot</comment>
+ <comment xml:lang="be@latin">Dakument Gnuplot</comment>
+ <comment xml:lang="bg">Документ — Gnuplot</comment>
+ <comment xml:lang="ca">document gnuplot</comment>
+ <comment xml:lang="cs">Dokument Gnuplot</comment>
+ <comment xml:lang="da">Gnuplotdokument</comment>
+ <comment xml:lang="de">Gnuplot-Dokument</comment>
+ <comment xml:lang="en_GB">Gnuplot document</comment>
+ <comment xml:lang="eo">Gnuplot-dokumento</comment>
+ <comment xml:lang="es">documento de Gnuplot</comment>
+ <comment xml:lang="eu">Gnuplot dokumentua</comment>
+ <comment xml:lang="fi">Gnuplot-asiakirja</comment>
+ <comment xml:lang="fo">Gnuplot skjal</comment>
+ <comment xml:lang="fr">document Gnuplot</comment>
+ <comment xml:lang="ga">cáipéis Gnuplot</comment>
+ <comment xml:lang="gl">documento de Gnuplot</comment>
+ <comment xml:lang="he">מסמך Gnuplot</comment>
+ <comment xml:lang="hu">Gnuplot dokumentum</comment>
+ <comment xml:lang="id">Dokumen Gnuplot</comment>
+ <comment xml:lang="it">Documento Gnuplot</comment>
+ <comment xml:lang="ja">Gnuplot ドキュメント</comment>
+ <comment xml:lang="kk">Gnuplot құжаты</comment>
+ <comment xml:lang="ko">Gnuplot 문서</comment>
+ <comment xml:lang="lt">Gnuplot dokumentas</comment>
+ <comment xml:lang="lv">Gnuplot dokuments</comment>
+ <comment xml:lang="nb">Gnuplot-dokument</comment>
+ <comment xml:lang="nl">Gnuplot-document</comment>
+ <comment xml:lang="nn">Gnuplot-dokument</comment>
+ <comment xml:lang="pl">Dokument Gnuplot</comment>
+ <comment xml:lang="pt_BR">Documento do Gnuplot</comment>
+ <comment xml:lang="ro">Document Gnuplot</comment>
+ <comment xml:lang="ru">документ Gnuplot</comment>
+ <comment xml:lang="sk">Dokument Gnuplot</comment>
+ <comment xml:lang="sl">Dokument Gnuplot</comment>
+ <comment xml:lang="sq">Dokument Gnuplot</comment>
+ <comment xml:lang="sv">Gnuplot-dokument</comment>
+ <comment xml:lang="uk">документ Gnuplot</comment>
+ <comment xml:lang="vi">Tài liệu Gnuplot</comment>
+ <comment xml:lang="zh_CN">Gnuplot 文档</comment>
+ <comment xml:lang="zh_TW">Gnuplot 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.gp"/>
+ <glob pattern="*.gplt"/>
+ <glob pattern="*.gnuplot"/>
+ </mime-type>
+ <mime-type type="application/x-graphite">
+ <comment>Graphite scientific graph</comment>
+ <comment xml:lang="ar">مبيان الجرافيت العلمي</comment>
+ <comment xml:lang="be@latin">Navukovy hrafik Graphite</comment>
+ <comment xml:lang="bg">Графика — Graphite</comment>
+ <comment xml:lang="ca">gràfic científic Graphite</comment>
+ <comment xml:lang="cs">Vědecký graf Graphite</comment>
+ <comment xml:lang="da">Graphite videnskabelig graf</comment>
+ <comment xml:lang="de">Wissenschaftlicher Graphite-Graph</comment>
+ <comment xml:lang="el">επιστημονικό γράφημα Graphite</comment>
+ <comment xml:lang="en_GB">Graphite scientific graph</comment>
+ <comment xml:lang="eo">scienca grafikaĵo de Graphite</comment>
+ <comment xml:lang="es">gráfica científica de Graphite</comment>
+ <comment xml:lang="eu">Graphite - grafiko zientifikoak</comment>
+ <comment xml:lang="fi">Graphite- tieteellinen graafi</comment>
+ <comment xml:lang="fo">Grapite vísindarlig ritmynd</comment>
+ <comment xml:lang="fr">graphe Graphite scientific</comment>
+ <comment xml:lang="ga">graf eolaíoch Graphite</comment>
+ <comment xml:lang="gl">gráfica científica de Graphite</comment>
+ <comment xml:lang="he">גרך מדעי של Graphite</comment>
+ <comment xml:lang="hu">Graphite tudományos grafikon</comment>
+ <comment xml:lang="id">Grafik sains Graphite</comment>
+ <comment xml:lang="it">Grafico scientifico Graphite</comment>
+ <comment xml:lang="ja">Graphite scientific グラフ</comment>
+ <comment xml:lang="kk">Graphite ғылыми кескіні</comment>
+ <comment xml:lang="ko">Graphite 공학 그래프</comment>
+ <comment xml:lang="lt">Graphite mokslinė diagrama</comment>
+ <comment xml:lang="lv">Graphite zinātniskais grafiks</comment>
+ <comment xml:lang="ms">Graf saintifik Graphite</comment>
+ <comment xml:lang="nb">Vitenskapelig graf fra Graphite</comment>
+ <comment xml:lang="nl">Graphite wetenschappelijke grafiek</comment>
+ <comment xml:lang="nn">Graphite vitskaplege graf</comment>
+ <comment xml:lang="pl">Wykres naukowy Graphite</comment>
+ <comment xml:lang="pt">gráfico científico Graphite</comment>
+ <comment xml:lang="pt_BR">Gráfico científico do Graphite</comment>
+ <comment xml:lang="ro">Grafic științific Graphite</comment>
+ <comment xml:lang="ru">научная диаграмма Graphite</comment>
+ <comment xml:lang="sk">Vedecký graf Graphite</comment>
+ <comment xml:lang="sl">Datoteka znanstvenega grafa Graphite</comment>
+ <comment xml:lang="sq">Grafik shkencor Graphite </comment>
+ <comment xml:lang="sr">Graphite научни графикони</comment>
+ <comment xml:lang="sv">Vetenskaplig Graphite-grafer</comment>
+ <comment xml:lang="uk">наукова графіка Graphite</comment>
+ <comment xml:lang="vi">Biểu đồ khoa học Graphite</comment>
+ <comment xml:lang="zh_CN">Graphite 科学图形</comment>
+ <comment xml:lang="zh_TW">Graphite 科學圖表</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.gra"/>
+ </mime-type>
+ <mime-type type="application/x-gtktalog">
+ <comment>GTKtalog catalog</comment>
+ <comment xml:lang="ar">كتالوج GTKtalog</comment>
+ <comment xml:lang="be@latin">Kataloh GTKtalog</comment>
+ <comment xml:lang="bg">Каталог — Gtktalog</comment>
+ <comment xml:lang="ca">catàleg de GTKtalog</comment>
+ <comment xml:lang="cs">Katalog GTKtalog</comment>
+ <comment xml:lang="da">GTKtalog-katalog</comment>
+ <comment xml:lang="de">GTKtalog-Katalog</comment>
+ <comment xml:lang="el">Κατάλογος GTKtalog</comment>
+ <comment xml:lang="en_GB">GTKtalog catalogue</comment>
+ <comment xml:lang="eo">katalogo de GTKtalog</comment>
+ <comment xml:lang="es">catálogo de GTKtalog</comment>
+ <comment xml:lang="eu">Gtktalog katalogoa</comment>
+ <comment xml:lang="fi">GTKtalog-luettelo</comment>
+ <comment xml:lang="fo">GTKtalog skrá</comment>
+ <comment xml:lang="fr">catalogue Gtktalog</comment>
+ <comment xml:lang="ga">catalóg GTKtalog</comment>
+ <comment xml:lang="gl">catálogo de GTKtalog</comment>
+ <comment xml:lang="he">קטלוג GTKtalog</comment>
+ <comment xml:lang="hu">GTKtalog-katalógus</comment>
+ <comment xml:lang="id">Katalog GTKtalog</comment>
+ <comment xml:lang="it">Catalogo GTKtalog</comment>
+ <comment xml:lang="ja">GTKtalog カタログ</comment>
+ <comment xml:lang="kk">GTKtalog каталогы</comment>
+ <comment xml:lang="ko">GTKtalog 카탈로그</comment>
+ <comment xml:lang="lt">GTKtalog katalogas</comment>
+ <comment xml:lang="lv">GTKtalog katalogs</comment>
+ <comment xml:lang="ms">Katalog GTKtalog</comment>
+ <comment xml:lang="nb">GTKtalog-katalog</comment>
+ <comment xml:lang="nl">GTKtalog-catalogus</comment>
+ <comment xml:lang="nn">GTKtalog-katalog</comment>
+ <comment xml:lang="pl">Katalog programu GTKtalog</comment>
+ <comment xml:lang="pt">catálogo GTKtalog</comment>
+ <comment xml:lang="pt_BR">Catálogo GTKtalog</comment>
+ <comment xml:lang="ro">Catalog GTKalog</comment>
+ <comment xml:lang="ru">каталог GTKtalog</comment>
+ <comment xml:lang="sk">Katalóg GTKtalog</comment>
+ <comment xml:lang="sl">Datoteka kataloga GTKtalog</comment>
+ <comment xml:lang="sq">Katallog GTKtalog</comment>
+ <comment xml:lang="sr">Гткталог каталог</comment>
+ <comment xml:lang="sv">GTKtalog-katalog</comment>
+ <comment xml:lang="uk">каталог GTKtalog</comment>
+ <comment xml:lang="vi">Phân loại GTKtalog</comment>
+ <comment xml:lang="zh_CN">GTKtalog 目录</comment>
+ <comment xml:lang="zh_TW">GTKtalog 光碟目錄</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="gtktalog " type="string" offset="4"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-gzdvi">
+ <comment>TeX DVI document (gzip-compressed)</comment>
+ <comment xml:lang="ar">مستند TeX DVI (مضغوط-gzip)</comment>
+ <comment xml:lang="be@latin">Dakument TeX DVI (gzip-skampresavany)</comment>
+ <comment xml:lang="bg">Документ — TeX DVI, компресиран с gzip</comment>
+ <comment xml:lang="ca">document TeX DVI (comprimit amb gzip)</comment>
+ <comment xml:lang="cs">Dokument TeX DVI (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="da">TeX DVI-dokument (gzip-komprimeret)</comment>
+ <comment xml:lang="de">TeX-DVI-Dokument (gzip-komprimiert)</comment>
+ <comment xml:lang="es">documento DVI de TeX (comprimido con gzip)</comment>
+ <comment xml:lang="eu">TeX DVI dokumentua (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">TeX DVI -asiakirja (gzip-pakattu)</comment>
+ <comment xml:lang="fo">TeX DVI skjal (gzip-stappað)</comment>
+ <comment xml:lang="fr">document DVI TeX (compressé gzip)</comment>
+ <comment xml:lang="ga">cáipéis DVI TeX (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">documento DVI de TeX (comprimido con gzip)</comment>
+ <comment xml:lang="he">מסמך מסוג TeX DVI (מכווץ ע"י gzip)</comment>
+ <comment xml:lang="hu">TeX DVI dokumentum (gzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Dokumen TeX DVI (terkompresi gzip)</comment>
+ <comment xml:lang="it">Documento Tex DVI (compresso con gzip)</comment>
+ <comment xml:lang="ja">Tex DVI ドキュメント (gzip 圧縮)</comment>
+ <comment xml:lang="kk">TeX DVI құжаты (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">TeX DVI 문서 (GZIP 압축)</comment>
+ <comment xml:lang="lt">TeX DVI dokumentas (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">TeX DVI dokuments (saspiests ar gzip)</comment>
+ <comment xml:lang="nb">TeX DVI-dokument (gzip-komprimert)</comment>
+ <comment xml:lang="nl">TeX DVI-document (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">TeX DVI-dokument (pakka med gzip)</comment>
+ <comment xml:lang="pl">Dokument TeX DVI (kompresja gzip)</comment>
+ <comment xml:lang="pt_BR">Documento DVI TeX (compactado com gzip)</comment>
+ <comment xml:lang="ro">Document TeX DVI (comprimat gzip)</comment>
+ <comment xml:lang="ru">документ TeX DVI (сжатый gzip)</comment>
+ <comment xml:lang="sk">Dokument TeX DVI (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="sl">Dokument TeX DVI (stisnjen z gzip)</comment>
+ <comment xml:lang="sq">Dokument TeX DVI (i kompresuar me gzip)</comment>
+ <comment xml:lang="sv">TeX DVI-dokument (gzip-komprimerat)</comment>
+ <comment xml:lang="uk">документ TeX DVI (стиснений gzip)</comment>
+ <comment xml:lang="vi">Tài liệu DVI TeX (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">TeX DVI 文档(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">TeX DVI 文件 (gzip 格式壓縮)</comment>
+ <sub-class-of type="application/x-gzip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.dvi.gz"/>
+ </mime-type>
+ <mime-type type="application/x-gzip">
+ <comment>Gzip archive</comment>
+ <comment xml:lang="ar">أرشيف Gzip</comment>
+ <comment xml:lang="be@latin">Archiŭ gzip</comment>
+ <comment xml:lang="bg">Архив — gzip</comment>
+ <comment xml:lang="ca">arxiu gzip</comment>
+ <comment xml:lang="cs">Archiv gzip</comment>
+ <comment xml:lang="da">Gzip-arkiv</comment>
+ <comment xml:lang="de">Gzip-Archiv</comment>
+ <comment xml:lang="eo">Gzip-arkivo</comment>
+ <comment xml:lang="es">archivador Gzip</comment>
+ <comment xml:lang="eu">Gzip artxiboa</comment>
+ <comment xml:lang="fi">Gzip-arkisto</comment>
+ <comment xml:lang="fo">Gzip skjalasavn</comment>
+ <comment xml:lang="fr">archive gzip</comment>
+ <comment xml:lang="ga">cartlann Gzip</comment>
+ <comment xml:lang="gl">arquivo Gzip</comment>
+ <comment xml:lang="he">ארכיון Gzip</comment>
+ <comment xml:lang="hu">Gzip archívum</comment>
+ <comment xml:lang="id">Arsip Gzip</comment>
+ <comment xml:lang="it">Archivio gzip</comment>
+ <comment xml:lang="ja">Gzip アーカイブ</comment>
+ <comment xml:lang="kk">Gzip архиві</comment>
+ <comment xml:lang="ko">GZIP 압축 파일</comment>
+ <comment xml:lang="lt">Gzip archyvas</comment>
+ <comment xml:lang="lv">Gzip arhīvs</comment>
+ <comment xml:lang="nb">Gzip-arkiv</comment>
+ <comment xml:lang="nl">Gzip-archief</comment>
+ <comment xml:lang="nn">Gzip-arkiv</comment>
+ <comment xml:lang="pl">Archiwum gzip</comment>
+ <comment xml:lang="pt_BR">Pacote Gzip</comment>
+ <comment xml:lang="ro">Arhivă Gzip</comment>
+ <comment xml:lang="ru">архив GZIP</comment>
+ <comment xml:lang="sk">Archív gzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Gzip</comment>
+ <comment xml:lang="sq">Arkiv gzip</comment>
+ <comment xml:lang="sv">Gzip-arkiv</comment>
+ <comment xml:lang="uk">архів gzip</comment>
+ <comment xml:lang="vi">Kho nén gzip</comment>
+ <comment xml:lang="zh_CN">Gzip 归档文件</comment>
+ <comment xml:lang="zh_TW">Gzip 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="\037\213" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.gz"/>
+ </mime-type>
+ <mime-type type="application/x-gzpdf">
+ <comment>PDF document (gzip-compressed)</comment>
+ <comment xml:lang="ar">مستند PDF (مضغوط-gzip)</comment>
+ <comment xml:lang="be@latin">Dakument PDF (gzip-skampresavany)</comment>
+ <comment xml:lang="bg">Документ — PDF, компресиран с gzip</comment>
+ <comment xml:lang="ca">document PDF (comprimit amb gzip)</comment>
+ <comment xml:lang="cs">Dokument PDF (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="da">PDF-dokument (gzip-komprimeret)</comment>
+ <comment xml:lang="de">PDF-Dokument (gzip-komprimiert)</comment>
+ <comment xml:lang="es">documento PDF (comprimido con gzip)</comment>
+ <comment xml:lang="eu">PDF dokumentua (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">PDF-asiakirja (gzip-pakattu)</comment>
+ <comment xml:lang="fo">PDF skjal (gzip-stappað)</comment>
+ <comment xml:lang="fr">document PDF (compressé gzip)</comment>
+ <comment xml:lang="ga">cáipéis PDF (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">documento PDF (comprimido en gzip)</comment>
+ <comment xml:lang="he">מסמך PDF (מכווץ ע"י gzip)</comment>
+ <comment xml:lang="hu">PDF dokumentum (gzip-tömörítésű)</comment>
+ <comment xml:lang="id">Dokumen PDF (terkompresi gzip)</comment>
+ <comment xml:lang="it">Documento PDF (compresso con gzip)</comment>
+ <comment xml:lang="ja">PDF ドキュメント (gzip 圧縮)</comment>
+ <comment xml:lang="kk">PDF құжаты (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">PDF 문서 (GZIP 압축)</comment>
+ <comment xml:lang="lt">PDF dokumentas (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">PDF dokuments (saspiests ar gzip)</comment>
+ <comment xml:lang="nb">PDF-dokument (gzip-komprimert)</comment>
+ <comment xml:lang="nl">PDF-document (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">PDF-dokument (pakka med gzip)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja gzip)</comment>
+ <comment xml:lang="pt_BR">Documento PDF (compactado com gzip)</comment>
+ <comment xml:lang="ro">Document PDF (comprimat gzip)</comment>
+ <comment xml:lang="ru">документ PDF (сжатый gzip)</comment>
+ <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="sl">Dokument PDF (stisnjen z gzip)</comment>
+ <comment xml:lang="sq">Dokument PDF (i kompresuar me gzip)</comment>
+ <comment xml:lang="sv">PDF-dokument (gzip-komprimerat)</comment>
+ <comment xml:lang="uk">документ PDF (стиснений gzip)</comment>
+ <comment xml:lang="vi">Tài liệu PDF (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">PDF 文档(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">PDF 文件 (gzip 格式壓縮)</comment>
+ <sub-class-of type="application/x-gzip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.pdf.gz"/>
+ </mime-type>
+ <mime-type type="application/x-gzpostscript">
+ <comment>PostScript document (gzip-compressed)</comment>
+ <comment xml:lang="ar">مستند PostScript (مضغوط-gzip)</comment>
+ <comment xml:lang="be@latin">Dakument PostScript (gzip-skampresavany)</comment>
+ <comment xml:lang="bg">Документ — PostScript, компресиран с gzip</comment>
+ <comment xml:lang="ca">document PostScript (comprimit amb gzip)</comment>
+ <comment xml:lang="cs">Dokument PostScript (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="da">PostScript-dokument (gzip-komprimeret)</comment>
+ <comment xml:lang="de">PostScript-Dokument (gzip-komprimiert)</comment>
+ <comment xml:lang="el">έγγραφο PostScript (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="en_GB">PostScript document (gzip-compressed)</comment>
+ <comment xml:lang="eo">PostScript-dokumento (kunpremita per gzip)</comment>
+ <comment xml:lang="es">documento PostScript (comprimido con gzip)</comment>
+ <comment xml:lang="eu">PostScript dokumentua (gzip-konprimitua)</comment>
+ <comment xml:lang="fi">PostScript-asiakirja (gzip-pakattu)</comment>
+ <comment xml:lang="fo">PostScript skjal (gzip-stappað)</comment>
+ <comment xml:lang="fr">document PostScript (compressé gzip)</comment>
+ <comment xml:lang="ga">cáipéis PostScript (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">documento PostScript (comprimido con gzip)</comment>
+ <comment xml:lang="he">מסמך PostScript (מכוות ע"י gzip)</comment>
+ <comment xml:lang="hu">PostScript-dokumentum (gzip-pel tömörítve)</comment>
+ <comment xml:lang="id">Dokumen PostScript (terkompresi gzip)</comment>
+ <comment xml:lang="it">Documento PostScript (compresso con gzip)</comment>
+ <comment xml:lang="ja">PostScript ドキュメント (gzip 圧縮)</comment>
+ <comment xml:lang="kk">PostScript құжаты (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">포스트스크립트 문서 (GZIP 압축)</comment>
+ <comment xml:lang="lt">PostScript dokumentas (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">PostScript dokuments (saspiests ar gzip)</comment>
+ <comment xml:lang="ms">Dokumen PostScript (dimampatkan-gzip)</comment>
+ <comment xml:lang="nb">PostScript-dokument (gzip-komprimert)</comment>
+ <comment xml:lang="nl">PostScript-document (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">PostScript-dokument (pakka med gzip)</comment>
+ <comment xml:lang="pl">Dokument Postscript (kompresja gzip)</comment>
+ <comment xml:lang="pt">documento PostScript (comprimido com gzip)</comment>
+ <comment xml:lang="pt_BR">Documento PostScript (compactado com gzip)</comment>
+ <comment xml:lang="ro">Document PostScript (comprimat gzip)</comment>
+ <comment xml:lang="ru">документ PostScript (сжатый gzip)</comment>
+ <comment xml:lang="sk">Dokument PostScript (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="sl">Dokument PostScript (stisnjen z gzip)</comment>
+ <comment xml:lang="sq">Dokument PostScript (i kompresuar me gzip)</comment>
+ <comment xml:lang="sr">Постскрипт документ (компресована gzip-ом)</comment>
+ <comment xml:lang="sv">Postscript-dokument (gzip-komprimerat)</comment>
+ <comment xml:lang="uk">документ PostScript (стиснене gzip)</comment>
+ <comment xml:lang="vi">Tài liệu PostScript (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">PostScript 文档(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">PostScript 文件 (gzip 格式壓縮)</comment>
+ <sub-class-of type="application/x-gzip"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.ps.gz"/>
+ </mime-type>
+ <mime-type type="application/x-hdf">
+ <comment>HDF document</comment>
+ <comment xml:lang="ar">مستند HDF</comment>
+ <comment xml:lang="az">HDF sənədi</comment>
+ <comment xml:lang="be@latin">Dakument HDF</comment>
+ <comment xml:lang="bg">Документ — HDF</comment>
+ <comment xml:lang="ca">document HDF</comment>
+ <comment xml:lang="cs">Dokument HDF</comment>
+ <comment xml:lang="cy">Dogfen HDF</comment>
+ <comment xml:lang="da">HDF-dokument</comment>
+ <comment xml:lang="de">HDF-Dokument</comment>
+ <comment xml:lang="el">έγγραφο HDF</comment>
+ <comment xml:lang="en_GB">HDF document</comment>
+ <comment xml:lang="eo">HDF-dokumento</comment>
+ <comment xml:lang="es">documento HDF</comment>
+ <comment xml:lang="eu">HDF dokumentua</comment>
+ <comment xml:lang="fi">HDF-asiakirja</comment>
+ <comment xml:lang="fo">HDF skjal</comment>
+ <comment xml:lang="fr">document HDF</comment>
+ <comment xml:lang="ga">cáipéis HDF</comment>
+ <comment xml:lang="gl">documento HDF</comment>
+ <comment xml:lang="he">מסמך HDF</comment>
+ <comment xml:lang="hu">HDF-dokumentum</comment>
+ <comment xml:lang="id">Dokumen HDF</comment>
+ <comment xml:lang="it">Documento HDF</comment>
+ <comment xml:lang="ja">HDF ドキュメント</comment>
+ <comment xml:lang="kk">HDF құжаты</comment>
+ <comment xml:lang="ko">HDF 문서</comment>
+ <comment xml:lang="lt">HDF dokumentas</comment>
+ <comment xml:lang="lv">HDF dokuments</comment>
+ <comment xml:lang="ms">Dokumen HDF</comment>
+ <comment xml:lang="nb">HDF-dokument</comment>
+ <comment xml:lang="nl">HDF-document</comment>
+ <comment xml:lang="nn">HDF-dokument</comment>
+ <comment xml:lang="pl">Dokument HDF</comment>
+ <comment xml:lang="pt">documento HDF</comment>
+ <comment xml:lang="pt_BR">Documento HDF</comment>
+ <comment xml:lang="ro">Document HDF</comment>
+ <comment xml:lang="ru">документ HDF</comment>
+ <comment xml:lang="sk">Dokument HDF</comment>
+ <comment xml:lang="sl">Dokument HDF</comment>
+ <comment xml:lang="sq">Dokument HDF</comment>
+ <comment xml:lang="sr">HDF документ</comment>
+ <comment xml:lang="sv">HDF-dokument</comment>
+ <comment xml:lang="uk">документ HDF</comment>
+ <comment xml:lang="vi">Tài liệu HDF</comment>
+ <comment xml:lang="zh_CN">HDF 文档</comment>
+ <comment xml:lang="zh_TW">HDF 文件</comment>
+ <acronym>HDF</acronym>
+ <expanded-acronym>Hierarchical Data Format</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="\211HDF\r\n\032\n" type="string" offset="0"/>
+ <match value="\016\003\023\001" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.hdf"/>
+ <glob pattern="*.hdf4"/>
+ <glob pattern="*.h4"/>
+ <glob pattern="*.hdf5"/>
+ <glob pattern="*.h5"/>
+ </mime-type>
+ <mime-type type="application/x-ipod-firmware">
+ <comment>iPod firmware</comment>
+ <comment xml:lang="ar">برنامج عتاد الـiPod</comment>
+ <comment xml:lang="be@latin">Firmware iPod</comment>
+ <comment xml:lang="bg">Фърмуер за iPod</comment>
+ <comment xml:lang="ca">microprogramari d'iPod</comment>
+ <comment xml:lang="cs">Firmware iPod</comment>
+ <comment xml:lang="da">iPod-styreprogram</comment>
+ <comment xml:lang="de">iPod-Firmware</comment>
+ <comment xml:lang="el">εικόνα μνήμης firmware iPod</comment>
+ <comment xml:lang="en_GB">iPod firmware</comment>
+ <comment xml:lang="eo">iPod-mikroprogramaro</comment>
+ <comment xml:lang="es">firmware de iPod</comment>
+ <comment xml:lang="eu">iPod firmwarea</comment>
+ <comment xml:lang="fi">iPod-laiteohjelmisto</comment>
+ <comment xml:lang="fo">iPod fastbúnaður</comment>
+ <comment xml:lang="fr">firmware iPod</comment>
+ <comment xml:lang="ga">dochtearraí iPod</comment>
+ <comment xml:lang="gl">firmware de iPod</comment>
+ <comment xml:lang="he">קושחת ipod</comment>
+ <comment xml:lang="hu">iPod-firmware</comment>
+ <comment xml:lang="id">peranti tegar iPod</comment>
+ <comment xml:lang="it">Firmware iPod</comment>
+ <comment xml:lang="ja">iPod ファームウェア</comment>
+ <comment xml:lang="kk">iPod микробағдарламасы</comment>
+ <comment xml:lang="ko">iPod 펌웨어</comment>
+ <comment xml:lang="lt">iPod programinė įranga</comment>
+ <comment xml:lang="lv">iPod aparātprogrammatūra</comment>
+ <comment xml:lang="ms">Firmware iPod</comment>
+ <comment xml:lang="nb">iPod-firmware</comment>
+ <comment xml:lang="nl">iPod-firmware</comment>
+ <comment xml:lang="nn">iPod-firmvare</comment>
+ <comment xml:lang="pl">Oprogramowanie wewnętrzne iPod</comment>
+ <comment xml:lang="pt">'firmware' iPod</comment>
+ <comment xml:lang="pt_BR">Firmware do iPod</comment>
+ <comment xml:lang="ro">Firmware iPod</comment>
+ <comment xml:lang="ru">микропрограмма iPod</comment>
+ <comment xml:lang="sk">Firmware iPod</comment>
+ <comment xml:lang="sl">Programska strojna oprema iPod</comment>
+ <comment xml:lang="sq">Firmware iPod</comment>
+ <comment xml:lang="sr">iPod програм</comment>
+ <comment xml:lang="sv">fast iPod-program</comment>
+ <comment xml:lang="uk">мікропрограма iPod</comment>
+ <comment xml:lang="vi">phần vững iPod</comment>
+ <comment xml:lang="zh_CN">iPod 固件</comment>
+ <comment xml:lang="zh_TW">iPod 韌體</comment>
+ <magic priority="50">
+ <match value="S T O P" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-java-archive">
+ <comment>Java archive</comment>
+ <comment xml:lang="ar">أرشيف Java</comment>
+ <comment xml:lang="be@latin">Archiŭ Java</comment>
+ <comment xml:lang="bg">Архив — Java</comment>
+ <comment xml:lang="ca">arxiu Java</comment>
+ <comment xml:lang="cs">Archiv Java</comment>
+ <comment xml:lang="da">Javaarkiv</comment>
+ <comment xml:lang="de">Java-Archiv</comment>
+ <comment xml:lang="el">αρχείο Java</comment>
+ <comment xml:lang="en_GB">Java archive</comment>
+ <comment xml:lang="eo">Java-arkivo</comment>
+ <comment xml:lang="es">archivador Java</comment>
+ <comment xml:lang="eu">Java artxiboa</comment>
+ <comment xml:lang="fi">Java-arkisto</comment>
+ <comment xml:lang="fo">Java skjalasavn</comment>
+ <comment xml:lang="fr">archive Java</comment>
+ <comment xml:lang="ga">cartlann Java</comment>
+ <comment xml:lang="gl">arquivo Java</comment>
+ <comment xml:lang="he">ארכיון Java</comment>
+ <comment xml:lang="hu">Java-archívum</comment>
+ <comment xml:lang="id">Arsip Java</comment>
+ <comment xml:lang="it">Archivio Java</comment>
+ <comment xml:lang="ja">Java アーカイブ</comment>
+ <comment xml:lang="kk">Java архиві</comment>
+ <comment xml:lang="ko">자바 묶음 파일</comment>
+ <comment xml:lang="lt">Java archyvas</comment>
+ <comment xml:lang="lv">Java arhīvs</comment>
+ <comment xml:lang="ms">Arkib Java</comment>
+ <comment xml:lang="nb">Java-arkiv</comment>
+ <comment xml:lang="nl">Java-archief</comment>
+ <comment xml:lang="nn">Java-arkiv</comment>
+ <comment xml:lang="pl">Archiwum Java</comment>
+ <comment xml:lang="pt">arquivo Java</comment>
+ <comment xml:lang="pt_BR">Pacote Java</comment>
+ <comment xml:lang="ro">Arhivă Java</comment>
+ <comment xml:lang="ru">архив Java</comment>
+ <comment xml:lang="sk">Archív Java</comment>
+ <comment xml:lang="sl">Datoteka arhiva Java</comment>
+ <comment xml:lang="sq">Arkiv Java</comment>
+ <comment xml:lang="sr">Јава архива</comment>
+ <comment xml:lang="sv">Java-arkiv</comment>
+ <comment xml:lang="uk">архів Java</comment>
+ <comment xml:lang="vi">Kho nén Java</comment>
+ <comment xml:lang="zh_CN">Java 归档文件</comment>
+ <comment xml:lang="zh_TW">Java 封存檔</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="package-x-generic"/>
+ <alias type="application/x-jar"/>
+ <alias type="application/java-archive"/>
+ <glob pattern="*.jar"/>
+ </mime-type>
+ <mime-type type="application/x-java">
+ <comment>Java class</comment>
+ <comment xml:lang="ar">صنف java</comment>
+ <comment xml:lang="be@latin">Klasa Java</comment>
+ <comment xml:lang="bg">Клас на Java</comment>
+ <comment xml:lang="ca">classe Java</comment>
+ <comment xml:lang="cs">Třída Java</comment>
+ <comment xml:lang="da">Javaklasse</comment>
+ <comment xml:lang="de">Java-Klasse</comment>
+ <comment xml:lang="el">κλάση Java</comment>
+ <comment xml:lang="en_GB">Java class</comment>
+ <comment xml:lang="eo">Java-klaso</comment>
+ <comment xml:lang="es">clase Java</comment>
+ <comment xml:lang="eu">Java-ko klasea</comment>
+ <comment xml:lang="fi">Java-luokka</comment>
+ <comment xml:lang="fo">Java flokkur</comment>
+ <comment xml:lang="fr">classe Java</comment>
+ <comment xml:lang="ga">aicme Java</comment>
+ <comment xml:lang="gl">clase de Java</comment>
+ <comment xml:lang="he">מחלקת Java</comment>
+ <comment xml:lang="hu">Java-osztály</comment>
+ <comment xml:lang="id">Kelas Java</comment>
+ <comment xml:lang="it">Classe Java</comment>
+ <comment xml:lang="ja">Java クラス</comment>
+ <comment xml:lang="kk">Java класы</comment>
+ <comment xml:lang="ko">자바 클래스</comment>
+ <comment xml:lang="lt">Java klasė</comment>
+ <comment xml:lang="lv">Java klase</comment>
+ <comment xml:lang="ms">Kelas Java</comment>
+ <comment xml:lang="nb">Java-klasse</comment>
+ <comment xml:lang="nl">Java-klasse</comment>
+ <comment xml:lang="nn">Java-klasse</comment>
+ <comment xml:lang="pl">Klasa Java</comment>
+ <comment xml:lang="pt">classe Java</comment>
+ <comment xml:lang="pt_BR">Classe Java</comment>
+ <comment xml:lang="ro">Clasă Java</comment>
+ <comment xml:lang="ru">класс Java</comment>
+ <comment xml:lang="sk">Trieda Java</comment>
+ <comment xml:lang="sl">Datoteka razreda Java</comment>
+ <comment xml:lang="sq">Klasë Java</comment>
+ <comment xml:lang="sr">Јава класа</comment>
+ <comment xml:lang="sv">Java-klass</comment>
+ <comment xml:lang="uk">клас Java</comment>
+ <comment xml:lang="vi">Hạng Java</comment>
+ <comment xml:lang="zh_CN">Java 类</comment>
+ <comment xml:lang="zh_TW">Java class</comment>
+ <magic priority="50">
+ <match value="0xcafebabe" type="big32" offset="0"/>
+ </magic>
+ <alias type="application/java"/>
+ <alias type="application/java-byte-code"/>
+ <alias type="application/java-vm"/>
+ <alias type="application/x-java-class"/>
+ <alias type="application/x-java-vm"/>
+ <glob pattern="*.class"/>
+ </mime-type>
+ <mime-type type="application/x-java-jnlp-file">
+ <comment>JNLP file</comment>
+ <comment xml:lang="ar">ملف JNLP</comment>
+ <comment xml:lang="be@latin">Fajł JNLP</comment>
+ <comment xml:lang="bg">Файл — JNLP</comment>
+ <comment xml:lang="ca">fitxer JNLP</comment>
+ <comment xml:lang="cs">Soubor JNLP</comment>
+ <comment xml:lang="da">JNPL-fil</comment>
+ <comment xml:lang="de">JNLP-Datei</comment>
+ <comment xml:lang="en_GB">JNLP file</comment>
+ <comment xml:lang="eo">JNLP-dosiero</comment>
+ <comment xml:lang="es">archivo JNPL</comment>
+ <comment xml:lang="eu">JNLP fitxategia</comment>
+ <comment xml:lang="fi">JNLP-tiedosto</comment>
+ <comment xml:lang="fo">JNLP fíla</comment>
+ <comment xml:lang="fr">fichier JNLP</comment>
+ <comment xml:lang="ga">comhad JNLP</comment>
+ <comment xml:lang="gl">ficheiro JNLP</comment>
+ <comment xml:lang="he">קובץ JNLP</comment>
+ <comment xml:lang="hu">JNLP fájl</comment>
+ <comment xml:lang="id">Berkas JNLP</comment>
+ <comment xml:lang="it">File JNPL</comment>
+ <comment xml:lang="ja">JNLP ファイル</comment>
+ <comment xml:lang="kk">JNLP файлы</comment>
+ <comment xml:lang="ko">JNLP 파일</comment>
+ <comment xml:lang="lt">JNLP failas</comment>
+ <comment xml:lang="lv">JNLP fails</comment>
+ <comment xml:lang="nb">JNLP-fil</comment>
+ <comment xml:lang="nl">JNLP-bestand</comment>
+ <comment xml:lang="nn">JNLP-fil</comment>
+ <comment xml:lang="pl">Plik JNLP</comment>
+ <comment xml:lang="pt_BR">Arquivo JNLP</comment>
+ <comment xml:lang="ro">Fișier JNLP</comment>
+ <comment xml:lang="ru">файл JNLP</comment>
+ <comment xml:lang="sk">Súbor JNLP</comment>
+ <comment xml:lang="sl">Datoteka JNLP</comment>
+ <comment xml:lang="sq">File JNLP</comment>
+ <comment xml:lang="sv">JNLP-fil</comment>
+ <comment xml:lang="uk">файл JNLP</comment>
+ <comment xml:lang="vi">Tập tin JNLP</comment>
+ <comment xml:lang="zh_CN">JNLP 文件</comment>
+ <comment xml:lang="zh_TW">JNLP 檔案</comment>
+ <acronym>JNLP</acronym>
+ <expanded-acronym>Java Network Launching Protocol</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.jnlp"/>
+ <magic priority="50">
+ <match value="&lt;jnlp" type="string" offset="0:256"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-java-keystore">
+ <comment>Java keystore</comment>
+ <comment xml:lang="ar">مخزن مفاتيح جافا</comment>
+ <comment xml:lang="bg">Ключодържател — Java</comment>
+ <comment xml:lang="ca">magatzem de claus Java</comment>
+ <comment xml:lang="cs">Java keystore</comment>
+ <comment xml:lang="da">Javanøglelager</comment>
+ <comment xml:lang="de">Java-Schlüsselbund</comment>
+ <comment xml:lang="es">almacén de claves de Java</comment>
+ <comment xml:lang="eu">Java-ren gako-biltegia</comment>
+ <comment xml:lang="fi">Java-avainvarasto</comment>
+ <comment xml:lang="fo">Java lyklagoymsla</comment>
+ <comment xml:lang="fr">stockage de clés Java</comment>
+ <comment xml:lang="ga">eochairstór Java</comment>
+ <comment xml:lang="gl">almacén de chaves de Java</comment>
+ <comment xml:lang="he">הקשת מקלדת של Java</comment>
+ <comment xml:lang="hu">Java kulcstároló</comment>
+ <comment xml:lang="id">Penyimpanan kunci Java</comment>
+ <comment xml:lang="it">Keystore Java</comment>
+ <comment xml:lang="ja">Java キーストア</comment>
+ <comment xml:lang="kk">Java сақталымы</comment>
+ <comment xml:lang="ko">자바 키스토어</comment>
+ <comment xml:lang="lt">Java raktų saugykla</comment>
+ <comment xml:lang="lv">Java keystore</comment>
+ <comment xml:lang="pl">Baza kluczy Java</comment>
+ <comment xml:lang="ro">Stocare chei Java</comment>
+ <comment xml:lang="ru">хранилище ключей Java</comment>
+ <comment xml:lang="sk">Úložisko kľúčov Java</comment>
+ <comment xml:lang="sl">Datoteka tipkovne razporeditve Java</comment>
+ <comment xml:lang="sv">Java-nyckellager</comment>
+ <comment xml:lang="uk">сховище ключів Java</comment>
+ <comment xml:lang="zh_CN">Java 密钥库</comment>
+ <comment xml:lang="zh_TW">Java 金鑰儲存</comment>
+ <magic priority="50">
+ <match value="0xfeedfeed" type="host32" offset="0"/>
+ </magic>
+ <glob pattern="*.jks"/>
+ <glob pattern="*.ks"/>
+ <glob pattern="cacerts"/>
+ </mime-type>
+ <mime-type type="application/x-java-jce-keystore">
+ <comment>Java JCE keystore</comment>
+ <comment xml:lang="ar">مخزن مفاتيح Java JCE</comment>
+ <comment xml:lang="bg">Ключодържател — Java JCE</comment>
+ <comment xml:lang="ca">magatzem de claus JCE Java</comment>
+ <comment xml:lang="cs">Java JCE keystore</comment>
+ <comment xml:lang="da">Java JCE-nøglelager</comment>
+ <comment xml:lang="de">Java JCE-Schlüsselbund</comment>
+ <comment xml:lang="es">almacén de claves JCE de Java</comment>
+ <comment xml:lang="eu">Java JCE-ren gako-biltegia</comment>
+ <comment xml:lang="fi">Java JCE -avainvarasto</comment>
+ <comment xml:lang="fo">Java JCE lyklagoymsla</comment>
+ <comment xml:lang="fr">stockage de clés Java JCE</comment>
+ <comment xml:lang="ga">eochairstór Java JCE</comment>
+ <comment xml:lang="gl">almacén de chves JCE de Java</comment>
+ <comment xml:lang="he">הקשה מסוג Java JCE</comment>
+ <comment xml:lang="hu">Java JCE kulcstároló</comment>
+ <comment xml:lang="id">Penyimpanan kunci Java JCE</comment>
+ <comment xml:lang="it">Keystore Java JCE</comment>
+ <comment xml:lang="ja">Java JCE キーストア</comment>
+ <comment xml:lang="kk">Java JCE сақталымы</comment>
+ <comment xml:lang="ko">wkqk JCE 키스토어</comment>
+ <comment xml:lang="lt">Java JCE raktų saugykla</comment>
+ <comment xml:lang="lv">Java JCE keystore</comment>
+ <comment xml:lang="pl">Baza kluczy Java JCE</comment>
+ <comment xml:lang="ro">Stocare chei Java JCE</comment>
+ <comment xml:lang="ru">хранилище ключей Java JCE</comment>
+ <comment xml:lang="sk">Úložisko kľúčov Java JCE</comment>
+ <comment xml:lang="sl">Datoteka tipkovne razporeditve Java JCE</comment>
+ <comment xml:lang="sv">Java JCE-nyckellager</comment>
+ <comment xml:lang="uk">сховище ключів JCE Java</comment>
+ <comment xml:lang="zh_CN">Java JCE 密钥库</comment>
+ <comment xml:lang="zh_TW">Java JCE 金鑰儲存</comment>
+ <acronym>JCE</acronym>
+ <expanded-acronym>Java Cryptography Extension</expanded-acronym>
+ <magic priority="50">
+ <match value="0xcececece" type="host32" offset="0"/>
+ </magic>
+ <glob pattern="*.jceks"/>
+ </mime-type>
+ <mime-type type="application/x-java-pack200">
+ <comment>Pack200 Java archive</comment>
+ <comment xml:lang="ar">أرشيف Pack200 Java</comment>
+ <comment xml:lang="be@latin">Archiŭ Pack200 Java</comment>
+ <comment xml:lang="bg">Архив — Java Pack200</comment>
+ <comment xml:lang="ca">arxiu Java Pack200</comment>
+ <comment xml:lang="cs">Archiv Java Pack200</comment>
+ <comment xml:lang="da">Pack200 Java-arkiv</comment>
+ <comment xml:lang="de">Pack200-Java-Archiv</comment>
+ <comment xml:lang="es">archivador Pack200 Java</comment>
+ <comment xml:lang="eu">Pack2000 Java artxiboa</comment>
+ <comment xml:lang="fi">Pack200-Java-arkisto</comment>
+ <comment xml:lang="fo">Pack200 Java skjalasavn</comment>
+ <comment xml:lang="fr">archive Java Pack200</comment>
+ <comment xml:lang="ga">cartlann Java Pack200</comment>
+ <comment xml:lang="gl">arquivo Pack200 Java</comment>
+ <comment xml:lang="he">ארכיון מסוג Pack200 Java</comment>
+ <comment xml:lang="hu">Pack200 Java-archívum</comment>
+ <comment xml:lang="id">Arsip Pack200 Java</comment>
+ <comment xml:lang="it">Archivio Pack200 Java</comment>
+ <comment xml:lang="ja">Pack200 Java アーカイブ</comment>
+ <comment xml:lang="kk">Pack200 Java архиві</comment>
+ <comment xml:lang="ko">Pack200 자바 묶음 파일</comment>
+ <comment xml:lang="lt">Pack200 Java archyvas</comment>
+ <comment xml:lang="lv">Pack200 Java arhīvs</comment>
+ <comment xml:lang="nb">Pack200 Java-arkiv</comment>
+ <comment xml:lang="nl">Pack200 Java-archief</comment>
+ <comment xml:lang="nn">Pack200 Java-arkiv</comment>
+ <comment xml:lang="pl">Archiwum Java Pack200</comment>
+ <comment xml:lang="pt_BR">Pacote Java Pack200</comment>
+ <comment xml:lang="ro">Arhivă Java Pack2000</comment>
+ <comment xml:lang="ru">архив Java Pack200</comment>
+ <comment xml:lang="sk">Archív Java Pack200</comment>
+ <comment xml:lang="sl">Datoteka arhiva Pack200 Java</comment>
+ <comment xml:lang="sq">Arkiv Java Pack200</comment>
+ <comment xml:lang="sv">Pack200 Java-arkiv</comment>
+ <comment xml:lang="uk">архів Java Pack200</comment>
+ <comment xml:lang="vi">Kho nén Java Pack200</comment>
+ <comment xml:lang="zh_CN">Pack200 Java 归档文件</comment>
+ <comment xml:lang="zh_TW">Pack200 Java 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="0xcafed00d" type="big32" offset="0"/>
+ </magic>
+ <glob pattern="*.pack"/>
+ </mime-type>
+ <mime-type type="application/javascript">
+ <comment>JavaScript program</comment>
+ <comment xml:lang="ar">برنامج جافاسكربت</comment>
+ <comment xml:lang="be@latin">Prahrama JavaScript</comment>
+ <comment xml:lang="bg">Програма на JavaScript</comment>
+ <comment xml:lang="ca">programa JavaScript</comment>
+ <comment xml:lang="cs">Program v JavaScriptu</comment>
+ <comment xml:lang="da">JavaScript-program</comment>
+ <comment xml:lang="de">JavaScript-Programm</comment>
+ <comment xml:lang="el">πρόγραμμα JavaScript</comment>
+ <comment xml:lang="eo">JavaScript-programo</comment>
+ <comment xml:lang="es">programa en JavaScript</comment>
+ <comment xml:lang="eu">JavaScript programa</comment>
+ <comment xml:lang="fi">JavaScript-ohjelma</comment>
+ <comment xml:lang="fo">JavaScript forrit</comment>
+ <comment xml:lang="fr">programme JavaScript</comment>
+ <comment xml:lang="ga">ríomhchlár JavaScript</comment>
+ <comment xml:lang="gl">programa JavaScript</comment>
+ <comment xml:lang="he">תכנית JavaScript</comment>
+ <comment xml:lang="hu">JavaScript-program</comment>
+ <comment xml:lang="id">Program JavaScript</comment>
+ <comment xml:lang="it">Programma JavaScript</comment>
+ <comment xml:lang="ja">JavaScript プログラム</comment>
+ <comment xml:lang="kk">JavaScript бағдарламасы</comment>
+ <comment xml:lang="ko">자바스크립트 프로그램</comment>
+ <comment xml:lang="lt">JavaScript programa</comment>
+ <comment xml:lang="lv">JavaScript programma</comment>
+ <comment xml:lang="ms">Program JavaScript</comment>
+ <comment xml:lang="nb">JavaScript-program</comment>
+ <comment xml:lang="nl">JavaScript-programma</comment>
+ <comment xml:lang="nn">JavaScript-program</comment>
+ <comment xml:lang="pl">Pogram JavaScript</comment>
+ <comment xml:lang="pt_BR">Programa JavaScript</comment>
+ <comment xml:lang="ro">Program JavaScript</comment>
+ <comment xml:lang="ru">сценарий JavaScript</comment>
+ <comment xml:lang="sk">Program jazyka JavaScript</comment>
+ <comment xml:lang="sl">Programska datoteka JavaScript</comment>
+ <comment xml:lang="sq">Program JavaScript</comment>
+ <comment xml:lang="sv">JavaScript-program</comment>
+ <comment xml:lang="uk">програма мовою JavaScript</comment>
+ <comment xml:lang="vi">Chương trình JavaScript</comment>
+ <comment xml:lang="zh_CN">Javascript 程序</comment>
+ <comment xml:lang="zh_TW">JavaScript 程式</comment>
+ <alias type="application/x-javascript"/>
+ <alias type="text/javascript"/>
+ <sub-class-of type="text/x-csrc"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.js"/>
+ </mime-type>
+ <mime-type type="application/x-jbuilder-project">
+ <comment>JBuilder project</comment>
+ <comment xml:lang="ar">مشروع JBuilder</comment>
+ <comment xml:lang="be@latin">Prajekt JBuilder</comment>
+ <comment xml:lang="bg">Проект — JBuilder</comment>
+ <comment xml:lang="ca">projecte de JBuilder</comment>
+ <comment xml:lang="cs">Projekt JBuilder</comment>
+ <comment xml:lang="da">JBuilder-projekt</comment>
+ <comment xml:lang="de">JBuilder-Projekt</comment>
+ <comment xml:lang="el">έργο JBuilder</comment>
+ <comment xml:lang="en_GB">JBuilder project</comment>
+ <comment xml:lang="eo">JBuilder-projekto</comment>
+ <comment xml:lang="es">proyecto JBuilder</comment>
+ <comment xml:lang="eu">JBuilder proiektua</comment>
+ <comment xml:lang="fi">JBuilder-projekti</comment>
+ <comment xml:lang="fo">JBuilder verkætlan</comment>
+ <comment xml:lang="fr">projet JBuilder</comment>
+ <comment xml:lang="ga">tionscadal JBuilder</comment>
+ <comment xml:lang="gl">proxecto de JBuilder</comment>
+ <comment xml:lang="he">מיזם JBuilder</comment>
+ <comment xml:lang="hu">JBuilder-projekt</comment>
+ <comment xml:lang="id">Proyek JBuilder</comment>
+ <comment xml:lang="it">Progetto JBuilder</comment>
+ <comment xml:lang="ja">JBuilder プロジェクト</comment>
+ <comment xml:lang="kk">JBuilder жобасы</comment>
+ <comment xml:lang="ko">JBuilder 프로젝트</comment>
+ <comment xml:lang="lt">JBuilder projektas</comment>
+ <comment xml:lang="lv">JBuilder projekts</comment>
+ <comment xml:lang="ms">Projek JBuilder</comment>
+ <comment xml:lang="nb">JBuilder-prosjekt</comment>
+ <comment xml:lang="nl">JBuilder-project</comment>
+ <comment xml:lang="nn">JBuilder-prosjekt</comment>
+ <comment xml:lang="pl">Projekt JBuilder</comment>
+ <comment xml:lang="pt">projecto JBuilder</comment>
+ <comment xml:lang="pt_BR">Projeto do JBuilder</comment>
+ <comment xml:lang="ro">Proiect JBuilder</comment>
+ <comment xml:lang="ru">проект JBuilder</comment>
+ <comment xml:lang="sk">Projekt JBuilder</comment>
+ <comment xml:lang="sl">Datoteka projekta JBuilder</comment>
+ <comment xml:lang="sq">Projekt JBuilder</comment>
+ <comment xml:lang="sr">JBuilder пројекат</comment>
+ <comment xml:lang="sv">JBuilder-projekt</comment>
+ <comment xml:lang="uk">проект JBuilder</comment>
+ <comment xml:lang="vi">Dự án JBuilder</comment>
+ <comment xml:lang="zh_CN">JBuilder 工程</comment>
+ <comment xml:lang="zh_TW">JBuilder 專案</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.jpr"/>
+ <glob pattern="*.jpx"/>
+ </mime-type>
+ <mime-type type="application/x-karbon">
+ <comment>Karbon14 drawing</comment>
+ <comment xml:lang="ar">تصميم Karbon14</comment>
+ <comment xml:lang="be@latin">Rysunak Karbon14</comment>
+ <comment xml:lang="bg">Чертеж — Karbon14</comment>
+ <comment xml:lang="ca">dibuix de Karbon14</comment>
+ <comment xml:lang="cs">Kresba Karbon14</comment>
+ <comment xml:lang="da">Karbon14-tegning</comment>
+ <comment xml:lang="de">Karbon14-Zeichnung</comment>
+ <comment xml:lang="el">σχέδιο Karbon14</comment>
+ <comment xml:lang="en_GB">Karbon14 drawing</comment>
+ <comment xml:lang="eo">Karbon14-grafikaĵo</comment>
+ <comment xml:lang="es">dibujo de Karbon14</comment>
+ <comment xml:lang="eu">Karbon14 marrazkia</comment>
+ <comment xml:lang="fi">Karbon14-piirros</comment>
+ <comment xml:lang="fo">Karbon14 tekning</comment>
+ <comment xml:lang="fr">dessin Karbon14</comment>
+ <comment xml:lang="ga">líníocht Karbon14</comment>
+ <comment xml:lang="gl">debuxo de Karbon14</comment>
+ <comment xml:lang="he">ציור Karbon14</comment>
+ <comment xml:lang="hu">Karbon14-rajz</comment>
+ <comment xml:lang="id">Gambar Karbon14</comment>
+ <comment xml:lang="it">Disegno Karbon14</comment>
+ <comment xml:lang="ja">Karbon14 ドロー</comment>
+ <comment xml:lang="kk">Karbon14 суреті</comment>
+ <comment xml:lang="ko">Karbon14 그림</comment>
+ <comment xml:lang="lt">Karbon14 piešinys</comment>
+ <comment xml:lang="lv">Karbon14 zīmējums</comment>
+ <comment xml:lang="ms">Lukisan Karbon14</comment>
+ <comment xml:lang="nb">Karbon14-tegning</comment>
+ <comment xml:lang="nl">Karbon14-tekening</comment>
+ <comment xml:lang="nn">Karbon14-teikning</comment>
+ <comment xml:lang="pl">Rysunek Karbon14</comment>
+ <comment xml:lang="pt">desenho Karbon14</comment>
+ <comment xml:lang="pt_BR">Desenho do Karbon14</comment>
+ <comment xml:lang="ro">Desen Karbon14</comment>
+ <comment xml:lang="ru">изображение Karbon14</comment>
+ <comment xml:lang="sk">Kresba Karbon14</comment>
+ <comment xml:lang="sl">Datoteka risbe Karbon14</comment>
+ <comment xml:lang="sq">Vizatim Karbon14</comment>
+ <comment xml:lang="sr">Karbon14 цртеж</comment>
+ <comment xml:lang="sv">Karbon14-teckning</comment>
+ <comment xml:lang="uk">малюнок Karbon14</comment>
+ <comment xml:lang="vi">Bản vẽ Karbon14</comment>
+ <comment xml:lang="zh_CN">Karbon14 绘图</comment>
+ <comment xml:lang="zh_TW">Karbon14 繪圖</comment>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-karbon\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-karbon" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.karbon"/>
+ </mime-type>
+ <mime-type type="application/x-kchart">
+ <comment>KChart chart</comment>
+ <comment xml:lang="ar">رسم بياني KChart</comment>
+ <comment xml:lang="be@latin">Hrafik KChart</comment>
+ <comment xml:lang="bg">Диаграма — KChart</comment>
+ <comment xml:lang="ca">diagrama de KChart</comment>
+ <comment xml:lang="cs">Graf Chart</comment>
+ <comment xml:lang="da">KChart-diagram</comment>
+ <comment xml:lang="de">KChart-Diagramm</comment>
+ <comment xml:lang="el">γράφημα KChart</comment>
+ <comment xml:lang="en_GB">KChart chart</comment>
+ <comment xml:lang="eo">KChart-diagramo</comment>
+ <comment xml:lang="es">gráfica de KChart</comment>
+ <comment xml:lang="eu">KChart diagrama</comment>
+ <comment xml:lang="fi">KChart-kaavio</comment>
+ <comment xml:lang="fo">KChart strikumynd</comment>
+ <comment xml:lang="fr">graphique KChart</comment>
+ <comment xml:lang="ga">cairt KChart</comment>
+ <comment xml:lang="gl">gráfica de KChart</comment>
+ <comment xml:lang="he">תרשים KChart</comment>
+ <comment xml:lang="hu">KChart-grafikon</comment>
+ <comment xml:lang="id">Bagan KChart</comment>
+ <comment xml:lang="it">Grafico KChart</comment>
+ <comment xml:lang="ja">KChart チャート</comment>
+ <comment xml:lang="kk">KChart диаграммасы</comment>
+ <comment xml:lang="ko">KChart 차트</comment>
+ <comment xml:lang="lt">KChart diagrama</comment>
+ <comment xml:lang="lv">KChart diagramma</comment>
+ <comment xml:lang="ms">Carta KChart</comment>
+ <comment xml:lang="nb">KChart-graf</comment>
+ <comment xml:lang="nl">KChart-grafiek</comment>
+ <comment xml:lang="nn">KChart-diagram</comment>
+ <comment xml:lang="pl">Wykres KChart</comment>
+ <comment xml:lang="pt">gráfico KChart</comment>
+ <comment xml:lang="pt_BR">Gráfico do KChart</comment>
+ <comment xml:lang="ro">Diagramă KChart</comment>
+ <comment xml:lang="ru">диаграмма KChart</comment>
+ <comment xml:lang="sk">Graf KChart</comment>
+ <comment xml:lang="sl">Datoteka grafikona KChart</comment>
+ <comment xml:lang="sq">Grafik KChart</comment>
+ <comment xml:lang="sr">KChart графикон</comment>
+ <comment xml:lang="sv">KChart-diagram</comment>
+ <comment xml:lang="uk">діаграма KChart</comment>
+ <comment xml:lang="vi">Sơ đồ KChart</comment>
+ <comment xml:lang="zh_CN">KChart 图表</comment>
+ <comment xml:lang="zh_TW">KChart 圖表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kchart\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kchart" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.chrt"/>
+ </mime-type>
+ <mime-type type="application/x-kexi-connectiondata">
+ <comment>Kexi settings for database server connection</comment>
+ <comment xml:lang="ar">إعدادات Kexi للإتصال بخادم قاعدة البيانات</comment>
+ <comment xml:lang="bg">Връзка към база от данни — Kexi</comment>
+ <comment xml:lang="ca">configuració del Kexi per a la connexió al servidor de bases de dades</comment>
+ <comment xml:lang="cs">Nastavení Kexi ke spojení s databázovým serverem</comment>
+ <comment xml:lang="da">Kexiopsætning til forbindelsen for databaseserveren</comment>
+ <comment xml:lang="de">Kexi-Einstellungen für Verbindung zum Datenbankserver</comment>
+ <comment xml:lang="es">configuración de Kexi para la conexión con el servidor de bases de datos</comment>
+ <comment xml:lang="eu">Kexi-ren ezarpenak datu-basearen zerbitzariarekin konektatzeko</comment>
+ <comment xml:lang="fi">Kexi-tietokantayhteysasetukset</comment>
+ <comment xml:lang="fo">Kexi stillingar fyri dátustovnsambætara sambinding</comment>
+ <comment xml:lang="fr">paramètres Kexi pour connexion au serveur de base de données</comment>
+ <comment xml:lang="ga">socruithe Kexi do cheangal le freastalaí bunachair sonraí</comment>
+ <comment xml:lang="gl">configuración de Kexi para conexión con servidor de base de datos </comment>
+ <comment xml:lang="he">הגדרות של Kexi עבור חיבור שרת לבסיס נתונים</comment>
+ <comment xml:lang="hu">Kexi beállítások adatbáziskiszolgáló-kapcsolathoz</comment>
+ <comment xml:lang="id">Tatanan Kexi bagi koneksi server basis data</comment>
+ <comment xml:lang="it">Impostazioni Kexi per connessione a server di database</comment>
+ <comment xml:lang="ja">データベースサーバ接続用の Kexi 設定</comment>
+ <comment xml:lang="kk">Дерекқор серверге байланыс Kexi баптаулары</comment>
+ <comment xml:lang="ko">Kexi 데이터베이스 서버 연결 설정</comment>
+ <comment xml:lang="lt">Kexi duomenų bazės ryšio su serveriu parametrai</comment>
+ <comment xml:lang="lv">Kexi iestatījumi datubāzes servera savienojumam</comment>
+ <comment xml:lang="pl">Ustawienia Kexi dla połączenia serwera bazy danych</comment>
+ <comment xml:lang="ro">Configurări Kexi pentru conexiunea la serverul de baze de date</comment>
+ <comment xml:lang="ru">параметры Kexi для подключения к серверу БД</comment>
+ <comment xml:lang="sk">Nastavenia Kexi pre pripojenie k databázovému serveru</comment>
+ <comment xml:lang="sl">Strežniška povezava do nastavitvene datoteke Kexi.</comment>
+ <comment xml:lang="sv">Kexi-inställningar för anslutning till databasserver</comment>
+ <comment xml:lang="uk">параметри Kexi для встановлення з’єднання з сервером бази даних</comment>
+ <comment xml:lang="zh_CN">Kexi 数据库服务器连接设置</comment>
+ <comment xml:lang="zh_TW">Kexi 設定值 (資料庫伺服器連線用)</comment>
+ <glob pattern="*.kexic"/>
+ </mime-type>
+ <mime-type type="application/x-kexiproject-shortcut">
+ <comment>shortcut to Kexi project on database server</comment>
+ <comment xml:lang="ar">اختصار لمشروع Kexi على خادم قاعدة بيانات</comment>
+ <comment xml:lang="bg">Връзка към проект — Kexi</comment>
+ <comment xml:lang="ca">drecera a projecte del Kexi en un servidor de base de dades</comment>
+ <comment xml:lang="cs">Zástupce projektu Kexi na databázovém serveru</comment>
+ <comment xml:lang="da">genvej til Kexiprojekt på databaseserver</comment>
+ <comment xml:lang="de">Schnellzugriff zum Kexi-Projekt auf dem Datenbankserver</comment>
+ <comment xml:lang="es">acceso directo a proyecto Kexi en el servidor de bases de datos</comment>
+ <comment xml:lang="eu">lasterbidea datu-basearen zerbitzariko Kexi proiekturako</comment>
+ <comment xml:lang="fo">snarvegur til Kexi verkætlan á dátustovnsambætara</comment>
+ <comment xml:lang="fr">raccourci vers projet Kexi sur serveur de base de données</comment>
+ <comment xml:lang="ga">aicearra go tionscadal Kexi ar fhreastalaí bunachair sonraí</comment>
+ <comment xml:lang="gl">acceso directo a proxecto Kexi no servidor de bases de datos</comment>
+ <comment xml:lang="he">קיצור דרך לפרוירט Kexi בשרת נתונים</comment>
+ <comment xml:lang="hu">indítóikon adatbázis-kiszolgálón lévő Kexi projektre</comment>
+ <comment xml:lang="id">pintasan ke projek Kexi pada server basis data</comment>
+ <comment xml:lang="it">Scorciatoia a progetto Kexi su server di database</comment>
+ <comment xml:lang="ja">データベースサーバの Kexi プロジェクトへのショートカット</comment>
+ <comment xml:lang="kk">дерекқор серверіндегі Kexi жобасына сілтеме</comment>
+ <comment xml:lang="ko">Kexi 데이터베이스 서버 사용 프로젝트 바로 가기</comment>
+ <comment xml:lang="lt">nuoroda į Kexi projektą duomenų bazės serveryje</comment>
+ <comment xml:lang="lv">īsceļš uz Kexi projektu datubāzes serverī</comment>
+ <comment xml:lang="pl">Skrót do projektu Kexi na serwerze bazy danych</comment>
+ <comment xml:lang="ro">scurtătură către un proiect Kexi pe un server de baze de date</comment>
+ <comment xml:lang="ru">ссылка на проект Kexi на сервере БД</comment>
+ <comment xml:lang="sl">bližnjica do Kexi projekta na podatkovnem strežniku</comment>
+ <comment xml:lang="sv">genväg till Kexi-projekt på databasserver</comment>
+ <comment xml:lang="uk">скорочення для проекту Kexi на сервері бази даних</comment>
+ <comment xml:lang="zh_CN">数据库服务器上 Kexi 项目的快捷方式</comment>
+ <comment xml:lang="zh_TW">資料庫伺服器上 Kexi 專案的捷徑</comment>
+ <glob pattern="*.kexis"/>
+ </mime-type>
+ <mime-type type="application/x-kexiproject-sqlite2">
+ <comment>Kexi database file-based project</comment>
+ <comment xml:lang="ar">مشروع قاعدة بيانات Kexi يعتمد على ملفات</comment>
+ <comment xml:lang="bg">Проект с база от данни — Kexi</comment>
+ <comment xml:lang="ca">projecte basat en fitxer de base de dades del Kexi</comment>
+ <comment xml:lang="cs">Projekt založený na souboru databáze Kexi</comment>
+ <comment xml:lang="da">Filbaseret projekt for Kexidatabase</comment>
+ <comment xml:lang="de">Dateibasiertes Kexi-Datenbankprojekt</comment>
+ <comment xml:lang="es">proyecto basado en el archivo-base de datos Kexi</comment>
+ <comment xml:lang="eu">Kexi datu-baseko fitxategian oinarritutako proiektua</comment>
+ <comment xml:lang="fo">Kexi dátustovns fílugrundað verkætlan</comment>
+ <comment xml:lang="fr">projet de base de données Kexi en mode fichier</comment>
+ <comment xml:lang="ga">tionscadal bunachair sonraí Kexi bunaithe ar chomhaid</comment>
+ <comment xml:lang="gl">proxecto baseado no ficheiro-base de datos Kexi</comment>
+ <comment xml:lang="he">פרויקט בסיס נתונים מבוסס-קובץ של Kexi</comment>
+ <comment xml:lang="hu">Kexi adatbázisfájl-alapú projekt</comment>
+ <comment xml:lang="id">Projek berbasis berkas basis data Kexi</comment>
+ <comment xml:lang="it">Progetto su file di database Kexi</comment>
+ <comment xml:lang="ja">Kexi データベース ファイルベースプロジェクト</comment>
+ <comment xml:lang="kk">Файл негізінде жоба үшін Kexi дерекқоры</comment>
+ <comment xml:lang="ko">Kexi 데이터베이스 파일 사용 프로젝트</comment>
+ <comment xml:lang="lt">Kexi duomenų bazės failo tipo projektas</comment>
+ <comment xml:lang="lv">Kexi datubāzes faila balstīts projekts</comment>
+ <comment xml:lang="pl">Projekt bazy danych Kexi oparty na pliku</comment>
+ <comment xml:lang="ro">Proiect bazat pe fișiere al bazei de date Kexi</comment>
+ <comment xml:lang="ru">файловый проект базы данных Kexi</comment>
+ <comment xml:lang="sl">Datoteka projekta podatkovne zbirke Kexi</comment>
+ <comment xml:lang="sv">Kexi-databas för filbaserat projekt</comment>
+ <comment xml:lang="uk">проект файлової бази даних Kexi</comment>
+ <comment xml:lang="zh_CN">Kexi 基于文件的数据库项目</comment>
+ <comment xml:lang="zh_TW">Kexi 資料庫檔案基礎專案</comment>
+ <sub-class-of type="application/x-sqlite2"/>
+ <glob pattern="*.kexi"/>
+ </mime-type>
+ <mime-type type="application/x-kexiproject-sqlite3">
+ <comment>Kexi database file-based project</comment>
+ <comment xml:lang="ar">مشروع قاعدة بيانات Kexi يعتمد على ملفات</comment>
+ <comment xml:lang="bg">Проект с база от данни — Kexi</comment>
+ <comment xml:lang="ca">projecte basat en fitxer de base de dades del Kexi</comment>
+ <comment xml:lang="cs">Projekt založený na souboru databáze Kexi</comment>
+ <comment xml:lang="da">Filbaseret projekt for Kexidatabase</comment>
+ <comment xml:lang="de">Dateibasiertes Kexi-Datenbankprojekt</comment>
+ <comment xml:lang="es">proyecto basado en el archivo-base de datos Kexi</comment>
+ <comment xml:lang="eu">Kexi datu-baseko fitxategian oinarritutako proiektua</comment>
+ <comment xml:lang="fo">Kexi dátustovns fílugrundað verkætlan</comment>
+ <comment xml:lang="fr">projet de base de données Kexi en mode fichier</comment>
+ <comment xml:lang="ga">tionscadal bunachair sonraí Kexi bunaithe ar chomhaid</comment>
+ <comment xml:lang="gl">proxecto baseado no ficheiro-base de datos Kexi</comment>
+ <comment xml:lang="he">פרויקט בסיס נתונים מבוסס-קובץ של Kexi</comment>
+ <comment xml:lang="hu">Kexi adatbázisfájl-alapú projekt</comment>
+ <comment xml:lang="id">Projek berbasis berkas basis data Kexi</comment>
+ <comment xml:lang="it">Progetto su file di database Kexi</comment>
+ <comment xml:lang="ja">Kexi データベース ファイルベースプロジェクト</comment>
+ <comment xml:lang="kk">Файл негізінде жоба үшін Kexi дерекқоры</comment>
+ <comment xml:lang="ko">Kexi 데이터베이스 파일 사용 프로젝트</comment>
+ <comment xml:lang="lt">Kexi duomenų bazės failo tipo projektas</comment>
+ <comment xml:lang="lv">Kexi datubāzes faila balstīts projekts</comment>
+ <comment xml:lang="pl">Projekt bazy danych Kexi oparty na pliku</comment>
+ <comment xml:lang="ro">Proiect bazat pe fișiere al bazei de date Kexi</comment>
+ <comment xml:lang="ru">файловый проект базы данных Kexi</comment>
+ <comment xml:lang="sl">Datoteka projekta podatkovne zbirke Kexi</comment>
+ <comment xml:lang="sv">Kexi-databas för filbaserat projekt</comment>
+ <comment xml:lang="uk">проект файлової бази даних Kexi</comment>
+ <comment xml:lang="zh_CN">Kexi 基于文件的数据库项目</comment>
+ <comment xml:lang="zh_TW">Kexi 資料庫檔案基礎專案</comment>
+ <sub-class-of type="application/x-sqlite3"/>
+ <glob pattern="*.kexi"/>
+ <alias type="application/x-vnd.kde.kexi"/>
+ <alias type="application/x-kexiproject-sqlite"/>
+ </mime-type>
+ <mime-type type="application/x-kformula">
+ <comment>KFormula formula</comment>
+ <comment xml:lang="ar">صيغة KFormula</comment>
+ <comment xml:lang="be@latin">Formuła KFormula</comment>
+ <comment xml:lang="bg">Формула — KFormula</comment>
+ <comment xml:lang="ca">fórmula de KFormula</comment>
+ <comment xml:lang="cs">Vzorec KFormula</comment>
+ <comment xml:lang="da">KFormula-formel</comment>
+ <comment xml:lang="de">KFormula-Formel</comment>
+ <comment xml:lang="el">μαθηματικός τύπος KFormula</comment>
+ <comment xml:lang="en_GB">KFormula formula</comment>
+ <comment xml:lang="eo">KFormula-formulo</comment>
+ <comment xml:lang="es">fórmula de KFormula</comment>
+ <comment xml:lang="eu">KFormula formula</comment>
+ <comment xml:lang="fi">KFormula-kaava</comment>
+ <comment xml:lang="fo">KFormula frymil</comment>
+ <comment xml:lang="fr">formule KFormula</comment>
+ <comment xml:lang="ga">foirmle KFormula</comment>
+ <comment xml:lang="gl">fórmula de KFormula</comment>
+ <comment xml:lang="he">נוסחת KFormula</comment>
+ <comment xml:lang="hu">KFormula-képlet</comment>
+ <comment xml:lang="id">Formula KFormula</comment>
+ <comment xml:lang="it">Formula KFormula</comment>
+ <comment xml:lang="ja">KFormula 計算式</comment>
+ <comment xml:lang="kk">KFormula формуласы</comment>
+ <comment xml:lang="ko">KFormula 수식</comment>
+ <comment xml:lang="lt">KFormula formulė</comment>
+ <comment xml:lang="lv">KFormula formula</comment>
+ <comment xml:lang="ms">Formula KFormula</comment>
+ <comment xml:lang="nb">KFormula-formel</comment>
+ <comment xml:lang="nl">KFormula-formule</comment>
+ <comment xml:lang="nn">KFormula-formel</comment>
+ <comment xml:lang="pl">Formuła KFormula</comment>
+ <comment xml:lang="pt">fórmula KFormula</comment>
+ <comment xml:lang="pt_BR">Fórmula do KFormula</comment>
+ <comment xml:lang="ro">Formulă KFormula</comment>
+ <comment xml:lang="ru">формула KFormula</comment>
+ <comment xml:lang="sk">Vzorec KFormula</comment>
+ <comment xml:lang="sl">Datoteka formule KFormula</comment>
+ <comment xml:lang="sq">Formulë KFormula</comment>
+ <comment xml:lang="sr">KFormula формула</comment>
+ <comment xml:lang="sv">KFormula-formel</comment>
+ <comment xml:lang="uk">формула KFormula</comment>
+ <comment xml:lang="vi">Công thức KFormula</comment>
+ <comment xml:lang="zh_CN">KFormula 公式</comment>
+ <comment xml:lang="zh_TW">KFormula 公式</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kformula\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kformula" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.kfo"/>
+ </mime-type>
+ <mime-type type="application/x-killustrator">
+ <comment>KIllustrator drawing</comment>
+ <comment xml:lang="ar">تصميم KIllustrator</comment>
+ <comment xml:lang="be@latin">Rysunak KIllustrator</comment>
+ <comment xml:lang="bg">Чертеж — KIllustrator</comment>
+ <comment xml:lang="ca">dibuix de KIllustrator</comment>
+ <comment xml:lang="cs">Kresba KIllustrator</comment>
+ <comment xml:lang="da">KIllustrator-tegning</comment>
+ <comment xml:lang="de">KIllustrator-Zeichnung</comment>
+ <comment xml:lang="el">σχέδιο KIllustrator</comment>
+ <comment xml:lang="en_GB">KIllustrator drawing</comment>
+ <comment xml:lang="eo">KIllustrator-grafikaĵo</comment>
+ <comment xml:lang="es">dibujo de KIllustrator</comment>
+ <comment xml:lang="eu">KIllustrator marrazkia</comment>
+ <comment xml:lang="fi">KIllustrator-piirros</comment>
+ <comment xml:lang="fo">KIllustrator tekning</comment>
+ <comment xml:lang="fr">dessin KIllustrator</comment>
+ <comment xml:lang="ga">líníocht KIllustrator</comment>
+ <comment xml:lang="gl">debuxo de KIllustrator</comment>
+ <comment xml:lang="he">ציור KIllustrator</comment>
+ <comment xml:lang="hu">KIllustrator-rajz</comment>
+ <comment xml:lang="id">Gambar KIllustrator</comment>
+ <comment xml:lang="it">Disegno KIllustrator</comment>
+ <comment xml:lang="ja">KIllustrator ドロー</comment>
+ <comment xml:lang="kk">KIllustrator суреті</comment>
+ <comment xml:lang="ko">KIllustrator 그림</comment>
+ <comment xml:lang="lt">KIllustrator piešinys</comment>
+ <comment xml:lang="lv">KIllustrator zīmējums</comment>
+ <comment xml:lang="ms">Lukisan KIllustrator</comment>
+ <comment xml:lang="nb">KIllustrator-tegning</comment>
+ <comment xml:lang="nl">KIllustrator-tekening</comment>
+ <comment xml:lang="nn">KIllustrator-teikning</comment>
+ <comment xml:lang="pl">Rysunek KIllustrator</comment>
+ <comment xml:lang="pt">desenho KIllustrator</comment>
+ <comment xml:lang="pt_BR">Desenho do KIllustrator</comment>
+ <comment xml:lang="ro">Desen KIllustrator</comment>
+ <comment xml:lang="ru">изображение KIllustrator</comment>
+ <comment xml:lang="sk">Kresba KIllustrator</comment>
+ <comment xml:lang="sl">Datoteka risbe KIllustrator</comment>
+ <comment xml:lang="sq">Vizatim KIllustrator</comment>
+ <comment xml:lang="sr">KIllustrator цртеж</comment>
+ <comment xml:lang="sv">KIllustrator-teckning</comment>
+ <comment xml:lang="uk">малюнок KIllustrator</comment>
+ <comment xml:lang="vi">Bản vẽ KIllustrator</comment>
+ <comment xml:lang="zh_CN">KIllustrator 绘图</comment>
+ <comment xml:lang="zh_TW">KIllustrator 繪圖</comment>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-killustrator\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.kil"/>
+ </mime-type>
+ <mime-type type="application/x-kivio">
+ <comment>Kivio flowchart</comment>
+ <comment xml:lang="ar">قائمة تدفق Kivio</comment>
+ <comment xml:lang="be@latin">Blok-schiema Kivio</comment>
+ <comment xml:lang="bg">Диаграма — Kivio</comment>
+ <comment xml:lang="ca">diagrama de flux de Kivio</comment>
+ <comment xml:lang="cs">Vývojový diagram Kivio</comment>
+ <comment xml:lang="da">Kiviorutediagram</comment>
+ <comment xml:lang="de">Kivio-Flussdiagramm</comment>
+ <comment xml:lang="el">διάγραμμα ροής Kivio</comment>
+ <comment xml:lang="en_GB">Kivio flowchart</comment>
+ <comment xml:lang="eo">Kivo-fluskemo</comment>
+ <comment xml:lang="es">diagrama de flujo de Kivio</comment>
+ <comment xml:lang="eu">Kivio diagrama</comment>
+ <comment xml:lang="fi">Kivio-vuokaavio</comment>
+ <comment xml:lang="fo">Kivio leiðarit</comment>
+ <comment xml:lang="fr">diagramme de flux Kivio</comment>
+ <comment xml:lang="ga">sreabhchairt Kivio</comment>
+ <comment xml:lang="gl">gráfica de fluxo de Kivio</comment>
+ <comment xml:lang="he">תרשים זרימה של Kivio</comment>
+ <comment xml:lang="hu">Kivio-folyamatábra</comment>
+ <comment xml:lang="id">Bagan Kivio</comment>
+ <comment xml:lang="it">Diagramma di flusso Kivio</comment>
+ <comment xml:lang="ja">Kivio フローチャート</comment>
+ <comment xml:lang="kk">Kivio диаграммасы</comment>
+ <comment xml:lang="ko">Kivio 흐름도</comment>
+ <comment xml:lang="lt">Kivio eigos diagrama</comment>
+ <comment xml:lang="lv">Kivio blokshēma</comment>
+ <comment xml:lang="ms">Cartalir Kivio</comment>
+ <comment xml:lang="nb">Kivio-flytdiagram</comment>
+ <comment xml:lang="nl">Kivio-stroomschema</comment>
+ <comment xml:lang="nn">Kivio-flytdiagram</comment>
+ <comment xml:lang="pl">Diagram przepływów Kivio</comment>
+ <comment xml:lang="pt">gráfico de fluxo Kivio</comment>
+ <comment xml:lang="pt_BR">Fluxograma do Kivio</comment>
+ <comment xml:lang="ro">Diagramă Kivio</comment>
+ <comment xml:lang="ru">диаграмма Kivio</comment>
+ <comment xml:lang="sk">Vývojový diagram Kivio</comment>
+ <comment xml:lang="sl">Datoteka grafikona Kivio</comment>
+ <comment xml:lang="sq">Diagramë fluksi Kivio</comment>
+ <comment xml:lang="sr">Kivio дијаграм</comment>
+ <comment xml:lang="sv">Kivio-flödesschema</comment>
+ <comment xml:lang="uk">блок-схема Kivio</comment>
+ <comment xml:lang="vi">Lược đồ Kivio</comment>
+ <comment xml:lang="zh_CN">Kivio 流程图</comment>
+ <comment xml:lang="zh_TW">Kivio 圖表</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kivio\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kivio" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.flw"/>
+ </mime-type>
+ <mime-type type="application/x-kontour">
+ <comment>Kontour drawing</comment>
+ <comment xml:lang="ar">تصميم Kontour</comment>
+ <comment xml:lang="be@latin">Rysunak Kontour</comment>
+ <comment xml:lang="bg">Чертеж — Kontour</comment>
+ <comment xml:lang="ca">dibuix de Kontour</comment>
+ <comment xml:lang="cs">Kresba Kontour</comment>
+ <comment xml:lang="da">Kontourtegning</comment>
+ <comment xml:lang="de">Kontour-Zeichnung</comment>
+ <comment xml:lang="el">σχέδιο Kontour</comment>
+ <comment xml:lang="en_GB">Kontour drawing</comment>
+ <comment xml:lang="eo">Kontour-grafikaĵo</comment>
+ <comment xml:lang="es">dibujo de Kontour</comment>
+ <comment xml:lang="eu">Kontour marrazkia</comment>
+ <comment xml:lang="fi">Kontour-piirros</comment>
+ <comment xml:lang="fo">Kontour tekning</comment>
+ <comment xml:lang="fr">dessin Kontour</comment>
+ <comment xml:lang="ga">líníocht Kontour</comment>
+ <comment xml:lang="gl">debuxo de Kontour</comment>
+ <comment xml:lang="he">ציור Kontour</comment>
+ <comment xml:lang="hu">Kontour-rajz</comment>
+ <comment xml:lang="id">Gambar Kontour</comment>
+ <comment xml:lang="it">Disegno Kontour</comment>
+ <comment xml:lang="ja">Kontour ドロー</comment>
+ <comment xml:lang="kk">Kontour суреті</comment>
+ <comment xml:lang="ko">Kontour 그림</comment>
+ <comment xml:lang="lt">Kontour piešinys</comment>
+ <comment xml:lang="lv">Kontour zīmējums</comment>
+ <comment xml:lang="ms">Lukisan Kontour</comment>
+ <comment xml:lang="nb">Kontour-tegning</comment>
+ <comment xml:lang="nl">Kontour-tekening</comment>
+ <comment xml:lang="nn">Kontour-teikning</comment>
+ <comment xml:lang="pl">Rysunek Kontour</comment>
+ <comment xml:lang="pt">desenho Kontour</comment>
+ <comment xml:lang="pt_BR">Desenho do Kontour</comment>
+ <comment xml:lang="ro">Desen Kontour</comment>
+ <comment xml:lang="ru">изображение Kontour</comment>
+ <comment xml:lang="sk">Kresba Kontour</comment>
+ <comment xml:lang="sl">Datoteka risbe Kontour</comment>
+ <comment xml:lang="sq">Vizatim Kontour</comment>
+ <comment xml:lang="sr">Kontour цртеж</comment>
+ <comment xml:lang="sv">Kontour-teckning</comment>
+ <comment xml:lang="uk">малюнок Kontour</comment>
+ <comment xml:lang="vi">Bản vẽ Kontour</comment>
+ <comment xml:lang="zh_CN">Kontour 绘图</comment>
+ <comment xml:lang="zh_TW">Kontour 繪圖</comment>
+ <generic-icon name="image-x-generic"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kontour\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kontour" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.kon"/>
+ </mime-type>
+ <mime-type type="application/x-kpovmodeler">
+ <comment>KPovModeler scene</comment>
+ <comment xml:lang="ar">مشهد KPovModeler</comment>
+ <comment xml:lang="be@latin">Scena KPovModeler</comment>
+ <comment xml:lang="bg">Сцена — KPovModeler</comment>
+ <comment xml:lang="ca">escena de KPovModeler</comment>
+ <comment xml:lang="cs">Scéna KPovModeler</comment>
+ <comment xml:lang="da">KPovModeler-scene</comment>
+ <comment xml:lang="de">KPovModeler-Szene</comment>
+ <comment xml:lang="el">σκηνή KPovModeler</comment>
+ <comment xml:lang="en_GB">KPovModeler scene</comment>
+ <comment xml:lang="eo">KPovModeler-sceno</comment>
+ <comment xml:lang="es">escena de KPovModeler</comment>
+ <comment xml:lang="eu">KPovModeler eszena</comment>
+ <comment xml:lang="fi">KPovModeler-näkymä</comment>
+ <comment xml:lang="fo">KPovModeler leikmynd</comment>
+ <comment xml:lang="fr">scène KPovModeler</comment>
+ <comment xml:lang="ga">radharc KPovModeler</comment>
+ <comment xml:lang="gl">escena de KPovModeler</comment>
+ <comment xml:lang="he">סצנת KPovModeler</comment>
+ <comment xml:lang="hu">KPovModeler-jelenet</comment>
+ <comment xml:lang="id">Scene KPovModeler</comment>
+ <comment xml:lang="it">Scena KPovModeler</comment>
+ <comment xml:lang="ja">KPovModeler シーン</comment>
+ <comment xml:lang="kk">KPovModeler сахнасы</comment>
+ <comment xml:lang="ko">KPovModeler 장면</comment>
+ <comment xml:lang="lt">KPovModeler scena</comment>
+ <comment xml:lang="lv">KPovModeler aina</comment>
+ <comment xml:lang="ms">Babak KPovModeler</comment>
+ <comment xml:lang="nb">KPovModeler-scene</comment>
+ <comment xml:lang="nl">KPovModeler-scène</comment>
+ <comment xml:lang="nn">KPovModeler-scene</comment>
+ <comment xml:lang="pl">Scena KPovModeler</comment>
+ <comment xml:lang="pt">cenário KPovModeler</comment>
+ <comment xml:lang="pt_BR">Cena do KPovModeler</comment>
+ <comment xml:lang="ro">Scenă KPovModeler</comment>
+ <comment xml:lang="ru">сцена KPovModeler</comment>
+ <comment xml:lang="sk">Scéna KPovModeler</comment>
+ <comment xml:lang="sl">Datoteka scene KPovModeler</comment>
+ <comment xml:lang="sq">Skenë KPovModeler</comment>
+ <comment xml:lang="sr">KPovModeler сцена</comment>
+ <comment xml:lang="sv">KPovModeler-scen</comment>
+ <comment xml:lang="uk">сцена KPovModeler</comment>
+ <comment xml:lang="vi">Cảnh KPovModeler</comment>
+ <comment xml:lang="zh_CN">KPovModeler 场景</comment>
+ <comment xml:lang="zh_TW">KPovModeler 場景</comment>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.kpm"/>
+ </mime-type>
+ <mime-type type="application/x-kpresenter">
+ <comment>KPresenter presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي KPresenter</comment>
+ <comment xml:lang="be@latin">Prezentacyja KPresenter</comment>
+ <comment xml:lang="bg">Презентация — KPresenter</comment>
+ <comment xml:lang="ca">presentació de KPresenter</comment>
+ <comment xml:lang="cs">Prezentace KPresenter</comment>
+ <comment xml:lang="da">KPresenter-præsentation</comment>
+ <comment xml:lang="de">KPresenter-Präsentation</comment>
+ <comment xml:lang="el">παρουσίαση KPresenter</comment>
+ <comment xml:lang="en_GB">KPresenter presentation</comment>
+ <comment xml:lang="eo">KPresenter-prezentaĵo</comment>
+ <comment xml:lang="es">presentación de KPresenter</comment>
+ <comment xml:lang="eu">Kpresenter aurkezpena</comment>
+ <comment xml:lang="fi">KPresenter-esitys</comment>
+ <comment xml:lang="fo">KPresenter framløga</comment>
+ <comment xml:lang="fr">présentation KPresenter</comment>
+ <comment xml:lang="ga">láithreoireacht KPresenter</comment>
+ <comment xml:lang="gl">presentación de KPresenter</comment>
+ <comment xml:lang="he">מצגת KPresenter</comment>
+ <comment xml:lang="hu">KPresenter-bemutató</comment>
+ <comment xml:lang="id">Presentasi KPresenter</comment>
+ <comment xml:lang="it">Presentazione KPresenter</comment>
+ <comment xml:lang="ja">KPresenter プレゼンテーション</comment>
+ <comment xml:lang="kk">KPresenter презентациясы</comment>
+ <comment xml:lang="ko">KPresenter 프리젠테이션</comment>
+ <comment xml:lang="lt">KPresenter pateiktis</comment>
+ <comment xml:lang="lv">KPresenter prezentācija</comment>
+ <comment xml:lang="ms">Persembahan Kpresenter</comment>
+ <comment xml:lang="nb">KPresenter-presentasjon</comment>
+ <comment xml:lang="nl">KPresenter-presentatie</comment>
+ <comment xml:lang="nn">KPresenter-presentasjon</comment>
+ <comment xml:lang="pl">Prezentacja KPresenter</comment>
+ <comment xml:lang="pt">apresentação KPresenter</comment>
+ <comment xml:lang="pt_BR">Apresentação do KPresenter</comment>
+ <comment xml:lang="ro">Prezentare KPresenter</comment>
+ <comment xml:lang="ru">презентация KPresenter</comment>
+ <comment xml:lang="sk">Prezentácia KPresenter</comment>
+ <comment xml:lang="sl">Predstavitev KPresenter</comment>
+ <comment xml:lang="sq">Prezantim i KPresenter</comment>
+ <comment xml:lang="sr">KPresenter презентација</comment>
+ <comment xml:lang="sv">KPresenter-presentation</comment>
+ <comment xml:lang="uk">презентація KPresenter</comment>
+ <comment xml:lang="vi">Trình diễn KPresenter</comment>
+ <comment xml:lang="zh_CN">KPresenter 演示文稿</comment>
+ <comment xml:lang="zh_TW">KPresenter 簡報檔</comment>
+ <generic-icon name="x-office-presentation"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kpresenter\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kpresenter" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.kpr"/>
+ <glob pattern="*.kpt"/>
+ </mime-type>
+ <mime-type type="application/x-krita">
+ <comment>Krita document</comment>
+ <comment xml:lang="ar">مستند Krita</comment>
+ <comment xml:lang="be@latin">Dakument Krita</comment>
+ <comment xml:lang="bg">Документ — Krita</comment>
+ <comment xml:lang="ca">document de Krita</comment>
+ <comment xml:lang="cs">Dokument Krita</comment>
+ <comment xml:lang="da">Kritadokument</comment>
+ <comment xml:lang="de">Krita-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Krita</comment>
+ <comment xml:lang="en_GB">Krita document</comment>
+ <comment xml:lang="eo">Krita-dokumento</comment>
+ <comment xml:lang="es">documento de Krita</comment>
+ <comment xml:lang="eu">Krita dokumentua</comment>
+ <comment xml:lang="fi">Krita-asiakirja</comment>
+ <comment xml:lang="fo">Krita skjal</comment>
+ <comment xml:lang="fr">document Krita</comment>
+ <comment xml:lang="ga">cáipéis Krita</comment>
+ <comment xml:lang="gl">documento de Krita</comment>
+ <comment xml:lang="he">מסמך Krita</comment>
+ <comment xml:lang="hu">Krita-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Krita</comment>
+ <comment xml:lang="it">Documento Krita</comment>
+ <comment xml:lang="ja">Krita ドキュメント</comment>
+ <comment xml:lang="kk">Krita құжаты</comment>
+ <comment xml:lang="ko">Krita 문서</comment>
+ <comment xml:lang="lt">Krita dokumentas</comment>
+ <comment xml:lang="lv">Krita dokuments</comment>
+ <comment xml:lang="ms">Dokumen Krita</comment>
+ <comment xml:lang="nb">Krita-dokument</comment>
+ <comment xml:lang="nl">Krita-document</comment>
+ <comment xml:lang="nn">Krita-dokument</comment>
+ <comment xml:lang="pl">Dokument Krita</comment>
+ <comment xml:lang="pt">documento Krita</comment>
+ <comment xml:lang="pt_BR">Documento do Krita</comment>
+ <comment xml:lang="ro">Document Krita</comment>
+ <comment xml:lang="ru">документ Krita</comment>
+ <comment xml:lang="sk">Dokument Krita</comment>
+ <comment xml:lang="sl">Dokument Krita</comment>
+ <comment xml:lang="sq">Dokument Krita</comment>
+ <comment xml:lang="sr">Krita документ</comment>
+ <comment xml:lang="sv">Krita-dokument</comment>
+ <comment xml:lang="uk">документ Krita</comment>
+ <comment xml:lang="vi">Tài liệu Krita</comment>
+ <comment xml:lang="zh_CN">Krita 文档</comment>
+ <comment xml:lang="zh_TW">Krita 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-krita\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-krita" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.kra"/>
+ </mime-type>
+ <mime-type type="application/x-kspread">
+ <comment>KSpread spreadsheet</comment>
+ <comment xml:lang="ar">جدول KSpread</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš KSpread</comment>
+ <comment xml:lang="bg">Таблица — KSpread</comment>
+ <comment xml:lang="ca">full de càlcul de KSpread</comment>
+ <comment xml:lang="cs">Sešit KSpread</comment>
+ <comment xml:lang="da">KSpread-regneark</comment>
+ <comment xml:lang="de">KSpread-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο KSpread</comment>
+ <comment xml:lang="en_GB">KSpread spreadsheet</comment>
+ <comment xml:lang="eo">KSpread-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo de KSpread</comment>
+ <comment xml:lang="eu">KSpread kalkulu-orria</comment>
+ <comment xml:lang="fi">KSpread-taulukko</comment>
+ <comment xml:lang="fo">KSpread rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul KSpread</comment>
+ <comment xml:lang="ga">scarbhileog KSpread</comment>
+ <comment xml:lang="gl">folla de cálculo de KSpread</comment>
+ <comment xml:lang="he">גליון נתונים של Kspread</comment>
+ <comment xml:lang="hu">KSpread-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar KSpread</comment>
+ <comment xml:lang="it">Foglio di calcolo KSpread</comment>
+ <comment xml:lang="ja">KSpread スプレッドシート</comment>
+ <comment xml:lang="kk">KSpread электрондық кестесі</comment>
+ <comment xml:lang="ko">KSpread 스프레드시트</comment>
+ <comment xml:lang="lt">KSpread skaičialentė</comment>
+ <comment xml:lang="lv">KSpread izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan KSpread</comment>
+ <comment xml:lang="nb">KSpread-regneark</comment>
+ <comment xml:lang="nl">KSpread-rekenblad</comment>
+ <comment xml:lang="nn">KSpread-rekneark</comment>
+ <comment xml:lang="pl">Arkusz KSpread</comment>
+ <comment xml:lang="pt">folha de cálculo KSpread</comment>
+ <comment xml:lang="pt_BR">Planilha do KSpread</comment>
+ <comment xml:lang="ro">Foaie de calcul KSpread</comment>
+ <comment xml:lang="ru">электронная таблица KSpread</comment>
+ <comment xml:lang="sk">Zošit KSpread</comment>
+ <comment xml:lang="sl">Razpredelnica KSpread</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh KSpread</comment>
+ <comment xml:lang="sr">KSpread табеларни прорачун</comment>
+ <comment xml:lang="sv">KSpread-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця KSpread</comment>
+ <comment xml:lang="vi">Bảng tính KSpread</comment>
+ <comment xml:lang="zh_CN">KSpread 工作簿</comment>
+ <comment xml:lang="zh_TW">KSpread 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kspread\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kspread" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.ksp"/>
+ </mime-type>
+ <mime-type type="application/x-kspread-crypt">
+ <comment>KSpread spreadsheet (encrypted)</comment>
+ <comment xml:lang="ar">جدول KSpread (مشفر)</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš KSpread (zašyfravany)</comment>
+ <comment xml:lang="bg">Таблица — KSpread, шифрирана</comment>
+ <comment xml:lang="ca">full de càlcul de KSpread (xifrat)</comment>
+ <comment xml:lang="cs">Sešit KSpread (šifrovaný)</comment>
+ <comment xml:lang="da">KSpread-regneark (krypteret)</comment>
+ <comment xml:lang="de">KSpread-Tabelle (verschlüsselt)</comment>
+ <comment xml:lang="el">λογιστικό φύλλο KSpread (κρυπτογραφημένο)</comment>
+ <comment xml:lang="en_GB">KSpread spreadsheet (encrypted)</comment>
+ <comment xml:lang="eo">KSpread-kalkultabelo (ĉifrita)</comment>
+ <comment xml:lang="es">hoja de cálculo de KSpread (cifrada)</comment>
+ <comment xml:lang="eu">KSpread kalkulu-orria (enkriptatua)</comment>
+ <comment xml:lang="fi">KSpread-taulukko (salattu)</comment>
+ <comment xml:lang="fo">KSpread rokniark (bronglað)</comment>
+ <comment xml:lang="fr">feuille de calcul KSpread (chiffrée)</comment>
+ <comment xml:lang="ga">scarbhileog KSpread (criptithe)</comment>
+ <comment xml:lang="gl">folla de cálculo de KSpread (cifrada)</comment>
+ <comment xml:lang="he">גליון נתונים של KSpread (מוצפן)</comment>
+ <comment xml:lang="hu">KSpread-munkafüzet (titkosított)</comment>
+ <comment xml:lang="id">Lembar sebar KSpread (terenkripsi)</comment>
+ <comment xml:lang="it">Foglio di calcolo KSpread (cifrato)</comment>
+ <comment xml:lang="ja">KSpread (暗号化) スプレッドシート</comment>
+ <comment xml:lang="kk">KSpread электрондық кестесі (шифрленген)</comment>
+ <comment xml:lang="ko">암호화된 KSpread 스프레드시트</comment>
+ <comment xml:lang="lt">KSpread skaičialentė (užšifruota)</comment>
+ <comment xml:lang="lv">KSpread izklājlapa (šifrēta)</comment>
+ <comment xml:lang="ms">Hampatan KSpread (terenkripsi)</comment>
+ <comment xml:lang="nb">KSpread-regneark (kryptert)</comment>
+ <comment xml:lang="nl">KSpread-rekenblad (versleuteld)</comment>
+ <comment xml:lang="nn">Kryptert KSpread-rekneark</comment>
+ <comment xml:lang="pl">Arkusz KSpread (zaszyfrowany)</comment>
+ <comment xml:lang="pt">folha de cálculo KSpread (cifrada)</comment>
+ <comment xml:lang="pt_BR">Planilha do KSpread (criptografada)</comment>
+ <comment xml:lang="ro">Foaie de calcul KSpread (criptat)</comment>
+ <comment xml:lang="ru">электронная таблица KSpread (зашифрованная)</comment>
+ <comment xml:lang="sk">Zošit KSpread (šifrovaný)</comment>
+ <comment xml:lang="sl">Razpredelnica KSpread (šifrirana)</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh KSpread (e kriptuar)</comment>
+ <comment xml:lang="sr">KSpread табеларни прорачун (шифровани)</comment>
+ <comment xml:lang="sv">KSpread-kalkylblad (krypterat)</comment>
+ <comment xml:lang="uk">ел. таблиця KSpread (зашифрована)</comment>
+ <comment xml:lang="vi">Bảng tính KSpread (đã mật mã)</comment>
+ <comment xml:lang="zh_CN">KSpread 加密工作簿</comment>
+ <comment xml:lang="zh_TW">KSpread 試算表 (已加密)</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="0x0d1a2702" type="big32" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-ksysv-package">
+ <comment>KSysV init package</comment>
+ <comment xml:lang="ar">حزمة KSysV init</comment>
+ <comment xml:lang="be@latin">Inicyjalny pakunak KSysV</comment>
+ <comment xml:lang="bg">Пакет — KSysV init</comment>
+ <comment xml:lang="ca">paquet d'inici KSysV</comment>
+ <comment xml:lang="cs">Balíček init KSysV</comment>
+ <comment xml:lang="da">KSsV init-pakke</comment>
+ <comment xml:lang="de">KSysV-Init-Paket</comment>
+ <comment xml:lang="es">paquete de configuración de init para KSysV</comment>
+ <comment xml:lang="eu">KSysV hasieratzeko paketea</comment>
+ <comment xml:lang="fi">KSysV init -paketti</comment>
+ <comment xml:lang="fo">KSysV init pakki</comment>
+ <comment xml:lang="fr">paquet d'initialisation KSysV</comment>
+ <comment xml:lang="ga">pacáiste thosú KSysV</comment>
+ <comment xml:lang="gl">paquete de KsysV init</comment>
+ <comment xml:lang="he">חבילת KSysV init</comment>
+ <comment xml:lang="hu">KSysV init csomag</comment>
+ <comment xml:lang="id">Paket init KSysV</comment>
+ <comment xml:lang="it">Pacchetto init KSysV</comment>
+ <comment xml:lang="ja">KSysV init パッケージ</comment>
+ <comment xml:lang="kk">KSysV инициализация дестесі</comment>
+ <comment xml:lang="ko">KSysV init 패키지</comment>
+ <comment xml:lang="lt">KSysV init paketas</comment>
+ <comment xml:lang="lv">KSysV inicializācijas pakotne</comment>
+ <comment xml:lang="nb">KSysV init-pakke</comment>
+ <comment xml:lang="nl">KSysV-init-pakket</comment>
+ <comment xml:lang="nn">KSysV init-pakke</comment>
+ <comment xml:lang="pl">Pakiet KSysV init</comment>
+ <comment xml:lang="pt_BR">Pacote init do KSysV</comment>
+ <comment xml:lang="ro">Pachet KSysV init</comment>
+ <comment xml:lang="ru">пакет инициализации KSysV</comment>
+ <comment xml:lang="sk">Balíček KSysV init</comment>
+ <comment xml:lang="sl">Datoteka paketa KSysV init</comment>
+ <comment xml:lang="sq">Paketë init KSysV</comment>
+ <comment xml:lang="sv">KSysV init-paket</comment>
+ <comment xml:lang="uk">пакунок KSysV init</comment>
+ <comment xml:lang="vi">Gói sở khởi KSysV</comment>
+ <comment xml:lang="zh_CN">KSysV init 软件包</comment>
+ <comment xml:lang="zh_TW">KSysV init 套件</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="KSysV" type="string" offset="4">
+ <match value="1" type="byte" offset="15"/>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-kugar">
+ <comment>Kugar document</comment>
+ <comment xml:lang="ar">مستند Kugar</comment>
+ <comment xml:lang="be@latin">Dakument Kugar</comment>
+ <comment xml:lang="bg">Документ — Kugar</comment>
+ <comment xml:lang="ca">document de Kugar</comment>
+ <comment xml:lang="cs">Dokument Kugar</comment>
+ <comment xml:lang="da">Kugardokument</comment>
+ <comment xml:lang="de">Kugar-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Kugar</comment>
+ <comment xml:lang="en_GB">Kugar document</comment>
+ <comment xml:lang="eo">Kugar-dokumento</comment>
+ <comment xml:lang="es">documento de Kugar</comment>
+ <comment xml:lang="eu">Kugar dokumentua</comment>
+ <comment xml:lang="fi">Kugar-asiakirja</comment>
+ <comment xml:lang="fo">Kugar skjal</comment>
+ <comment xml:lang="fr">document Kugar</comment>
+ <comment xml:lang="ga">cáipéis Kugar</comment>
+ <comment xml:lang="gl">documento de Kugar</comment>
+ <comment xml:lang="he">מסמך Kugar</comment>
+ <comment xml:lang="hu">Kugar-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Kugar</comment>
+ <comment xml:lang="it">Documento Kugar</comment>
+ <comment xml:lang="ja">KuKrita ドキュメント</comment>
+ <comment xml:lang="kk">Kugar құжаты</comment>
+ <comment xml:lang="ko">Kugar 문서</comment>
+ <comment xml:lang="lt">Kugar dokumentas</comment>
+ <comment xml:lang="lv">Kugar dokuments</comment>
+ <comment xml:lang="ms">Dokumen Kugar</comment>
+ <comment xml:lang="nb">Kugar-dokument</comment>
+ <comment xml:lang="nl">Kugar-document</comment>
+ <comment xml:lang="nn">Kugar-dokument</comment>
+ <comment xml:lang="pl">Dokument Kuguar</comment>
+ <comment xml:lang="pt">documento Kugar</comment>
+ <comment xml:lang="pt_BR">Documento do Kugar</comment>
+ <comment xml:lang="ro">Document Kugar</comment>
+ <comment xml:lang="ru">документ Kugar</comment>
+ <comment xml:lang="sk">Dokument Kugar</comment>
+ <comment xml:lang="sl">Dokument Kugar</comment>
+ <comment xml:lang="sq">Dokument Kugar</comment>
+ <comment xml:lang="sr">Kugar документ</comment>
+ <comment xml:lang="sv">Kugar-dokument</comment>
+ <comment xml:lang="uk">документ Kugar</comment>
+ <comment xml:lang="vi">Tài liệu Kugar</comment>
+ <comment xml:lang="zh_CN">Kugar 文档</comment>
+ <comment xml:lang="zh_TW">Kugar 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.kud"/>
+ </mime-type>
+ <mime-type type="application/x-kword">
+ <comment>KWord document</comment>
+ <comment xml:lang="ar">مستند KWord</comment>
+ <comment xml:lang="be@latin">Dakument KWord</comment>
+ <comment xml:lang="bg">Документ — KWord</comment>
+ <comment xml:lang="ca">document de KWord</comment>
+ <comment xml:lang="cs">Dokument KWord</comment>
+ <comment xml:lang="cy">Dogfen KWord</comment>
+ <comment xml:lang="da">KWord-dokument</comment>
+ <comment xml:lang="de">KWord-Dokument</comment>
+ <comment xml:lang="el">έγγραφο KWord</comment>
+ <comment xml:lang="en_GB">KWord document</comment>
+ <comment xml:lang="eo">KWord-dokumento</comment>
+ <comment xml:lang="es">documento de KWord</comment>
+ <comment xml:lang="eu">KWord dokumentua</comment>
+ <comment xml:lang="fi">KWord-asiakirja</comment>
+ <comment xml:lang="fo">KWord skjal</comment>
+ <comment xml:lang="fr">document KWord</comment>
+ <comment xml:lang="ga">cáipéis KWord</comment>
+ <comment xml:lang="gl">documento de KWord</comment>
+ <comment xml:lang="he">מסמך KWord</comment>
+ <comment xml:lang="hu">KWord-dokumentum</comment>
+ <comment xml:lang="id">Dokumen KWord</comment>
+ <comment xml:lang="it">Documento KWord</comment>
+ <comment xml:lang="ja">KWord ドキュメント</comment>
+ <comment xml:lang="kk">KWord құжаты</comment>
+ <comment xml:lang="ko">KWord 문서</comment>
+ <comment xml:lang="lt">KWord dokumentas</comment>
+ <comment xml:lang="lv">KWord dokuments</comment>
+ <comment xml:lang="ms">Dokumen KWord</comment>
+ <comment xml:lang="nb">KWord-dokument</comment>
+ <comment xml:lang="nl">KWord-document</comment>
+ <comment xml:lang="nn">KWord-dokument</comment>
+ <comment xml:lang="pl">Dokument KWord</comment>
+ <comment xml:lang="pt">documento KWord</comment>
+ <comment xml:lang="pt_BR">Documento do KWord</comment>
+ <comment xml:lang="ro">Document KWord</comment>
+ <comment xml:lang="ru">документ KWord</comment>
+ <comment xml:lang="sk">Dokument KWord</comment>
+ <comment xml:lang="sl">Dokument KWord</comment>
+ <comment xml:lang="sq">Dokument KWord</comment>
+ <comment xml:lang="sr">KWord документ</comment>
+ <comment xml:lang="sv">KWord-dokument</comment>
+ <comment xml:lang="uk">документ KWord</comment>
+ <comment xml:lang="vi">Tài liệu KWord</comment>
+ <comment xml:lang="zh_CN">KWord 文档</comment>
+ <comment xml:lang="zh_TW">KWord 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="60">
+ <match value="\037\213" type="string" offset="0">
+ <match value="KOffice" type="string" offset="10">
+ <match value="application/x-kword\004\006" type="string" offset="18"/>
+ </match>
+ </match>
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="application/x-kword" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.kwd"/>
+ <glob pattern="*.kwt"/>
+ </mime-type>
+ <mime-type type="application/x-kword-crypt">
+ <comment>KWord document (encrypted)</comment>
+ <comment xml:lang="ar">مستند KWord (مشفر)</comment>
+ <comment xml:lang="be@latin">Dakument KWord (zašyfravany)</comment>
+ <comment xml:lang="bg">Документ — KWord, шифриран</comment>
+ <comment xml:lang="ca">document de KWord (xifrat)</comment>
+ <comment xml:lang="cs">Dokument KWord (šifrovaný)</comment>
+ <comment xml:lang="da">KWord-dokument (krypteret)</comment>
+ <comment xml:lang="de">KWord-Dokument (verschlüsselt)</comment>
+ <comment xml:lang="el">έγγραφο KWord (κρυπτογραφημένο)</comment>
+ <comment xml:lang="en_GB">KWord document (encrypted)</comment>
+ <comment xml:lang="eo">KWord-dokumento (ĉifrita)</comment>
+ <comment xml:lang="es">documento de KWord (cifrado)</comment>
+ <comment xml:lang="eu">KWord dokumentua (enkriptatua)</comment>
+ <comment xml:lang="fi">KWord-asiakirja (salattu)</comment>
+ <comment xml:lang="fo">KWord skjal (bronglað)</comment>
+ <comment xml:lang="fr">document KWord (chiffré)</comment>
+ <comment xml:lang="ga">cáipéis KWord (criptithe)</comment>
+ <comment xml:lang="gl">documento de KWord (cifrado)</comment>
+ <comment xml:lang="he">מסמך KWord (מוצפן)</comment>
+ <comment xml:lang="hu">KWord-dokumentum (titkosított)</comment>
+ <comment xml:lang="id">Dokumen KWord (terenkripsi)</comment>
+ <comment xml:lang="it">Documento KWord (cifrato)</comment>
+ <comment xml:lang="ja">KWord (暗号化) ドキュメント</comment>
+ <comment xml:lang="kk">KWord құжаты (шифрленген)</comment>
+ <comment xml:lang="ko">암호화된 KWord 문서</comment>
+ <comment xml:lang="lt">KWord dokumentas (užšifruotas)</comment>
+ <comment xml:lang="lv">KWord dokuments (šifrēts)</comment>
+ <comment xml:lang="ms">Dokumen Kword (terenkripsi)</comment>
+ <comment xml:lang="nb">KWord-dokument (kryptert)</comment>
+ <comment xml:lang="nl">KWord-document (versleuteld)</comment>
+ <comment xml:lang="nn">Kryptert KWord-dokument</comment>
+ <comment xml:lang="pl">Dokument KWord (zaszyfrowany)</comment>
+ <comment xml:lang="pt">documento KWord (cifrado)</comment>
+ <comment xml:lang="pt_BR">Documento do KWord (criptografado)</comment>
+ <comment xml:lang="ro">Document KWord (criptat)</comment>
+ <comment xml:lang="ru">документ KWord (зашифрованный)</comment>
+ <comment xml:lang="sk">Dokument KWord (šifrovaný)</comment>
+ <comment xml:lang="sl">Dokument KWord (šifriran)</comment>
+ <comment xml:lang="sq">Dokument KWord (i kriptuar)</comment>
+ <comment xml:lang="sr">KWord документ (шифровани)</comment>
+ <comment xml:lang="sv">KWord-dokument (krypterat)</comment>
+ <comment xml:lang="uk">документ KWord (зашифрований)</comment>
+ <comment xml:lang="vi">Tài liệu KWord (đã mật mã)</comment>
+ <comment xml:lang="zh_CN">KWord 加密文档</comment>
+ <comment xml:lang="zh_TW">KWord 文件 (已加密)</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="0x0d1a2701" type="big32" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-lha">
+ <comment>LHA archive</comment>
+ <comment xml:lang="ar">أرشيف LHA</comment>
+ <comment xml:lang="az">LHA arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ LHA</comment>
+ <comment xml:lang="bg">Архив — LHA</comment>
+ <comment xml:lang="ca">arxiu LHA</comment>
+ <comment xml:lang="cs">Archiv LHA</comment>
+ <comment xml:lang="cy">Archif LHA</comment>
+ <comment xml:lang="da">LHA-arkiv</comment>
+ <comment xml:lang="de">LHA-Archiv</comment>
+ <comment xml:lang="el">αρχείο LHA</comment>
+ <comment xml:lang="en_GB">LHA archive</comment>
+ <comment xml:lang="eo">LHA-arkivo</comment>
+ <comment xml:lang="es">archivador LHA</comment>
+ <comment xml:lang="eu">LHA artxiboa</comment>
+ <comment xml:lang="fi">LHA-arkisto</comment>
+ <comment xml:lang="fo">LHA skjalasavn</comment>
+ <comment xml:lang="fr">archive LHA</comment>
+ <comment xml:lang="ga">cartlann LHA</comment>
+ <comment xml:lang="gl">arquivo LHA</comment>
+ <comment xml:lang="he">ארכיון LHA</comment>
+ <comment xml:lang="hu">LHA-archívum</comment>
+ <comment xml:lang="id">Arsip LHA</comment>
+ <comment xml:lang="it">Archivio LHA</comment>
+ <comment xml:lang="ja">LHA アーカイブ</comment>
+ <comment xml:lang="kk">LHA архиві</comment>
+ <comment xml:lang="ko">LHA 압축 파일</comment>
+ <comment xml:lang="lt">LHA archyvas</comment>
+ <comment xml:lang="lv">LHA arhīvs</comment>
+ <comment xml:lang="ms">Arkib LHA</comment>
+ <comment xml:lang="nb">LHA-arkiv</comment>
+ <comment xml:lang="nl">LHA-archief</comment>
+ <comment xml:lang="nn">LHA-arkiv</comment>
+ <comment xml:lang="pl">Archiwum LHA</comment>
+ <comment xml:lang="pt">arquivo LHA</comment>
+ <comment xml:lang="pt_BR">Pacote LHA</comment>
+ <comment xml:lang="ro">Arhivă LHA</comment>
+ <comment xml:lang="ru">архив LHA</comment>
+ <comment xml:lang="sk">Archív LHA</comment>
+ <comment xml:lang="sl">Datoteka arhiva LHA</comment>
+ <comment xml:lang="sq">Arkiv LHA</comment>
+ <comment xml:lang="sr">LHA архива</comment>
+ <comment xml:lang="sv">LHA-arkiv</comment>
+ <comment xml:lang="uk">архів LHA</comment>
+ <comment xml:lang="vi">Kho nén LHA</comment>
+ <comment xml:lang="zh_CN">LHA 归档文件</comment>
+ <comment xml:lang="zh_TW">LHA 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="-lh -" type="string" offset="2"/>
+ <match value="-lh0-" type="string" offset="2"/>
+ <match value="-lh1-" type="string" offset="2"/>
+ <match value="-lh2-" type="string" offset="2"/>
+ <match value="-lh3-" type="string" offset="2"/>
+ <match value="-lh4-" type="string" offset="2"/>
+ <match value="-lh5-" type="string" offset="2"/>
+ <match value="-lh40-" type="string" offset="2"/>
+ <match value="-lhd-" type="string" offset="2"/>
+ <match value="-lz4-" type="string" offset="2"/>
+ <match value="-lz5-" type="string" offset="2"/>
+ <match value="-lzs-" type="string" offset="2"/>
+ </magic>
+ <glob pattern="*.lha"/>
+ <glob pattern="*.lzh"/>
+ </mime-type>
+ <mime-type type="application/x-lhz">
+ <comment>LHZ archive</comment>
+ <comment xml:lang="ar">أرشيف LHZ</comment>
+ <comment xml:lang="be@latin">Archiŭ LHZ</comment>
+ <comment xml:lang="bg">Архив — LHZ</comment>
+ <comment xml:lang="ca">arxiu LHZ</comment>
+ <comment xml:lang="cs">Archiv LHZ</comment>
+ <comment xml:lang="da">LHZ-arkiv</comment>
+ <comment xml:lang="de">LHZ-Archiv</comment>
+ <comment xml:lang="el">αρχείο LHZ</comment>
+ <comment xml:lang="en_GB">LHZ archive</comment>
+ <comment xml:lang="eo">LHZ-arkivo</comment>
+ <comment xml:lang="es">archivador LHZ</comment>
+ <comment xml:lang="eu">LHZ artxiboa</comment>
+ <comment xml:lang="fi">LHZ-arkisto</comment>
+ <comment xml:lang="fo">LHZ skjalasavn</comment>
+ <comment xml:lang="fr">archive LHZ</comment>
+ <comment xml:lang="ga">cartlann LHZ</comment>
+ <comment xml:lang="gl">arquivo LHZ</comment>
+ <comment xml:lang="he">ארכיון LHZ</comment>
+ <comment xml:lang="hu">LHZ-archívum</comment>
+ <comment xml:lang="id">Arsip LHZ</comment>
+ <comment xml:lang="it">Archivio LHZ</comment>
+ <comment xml:lang="ja">LHZ アーカイブ</comment>
+ <comment xml:lang="kk">LHZ архиві</comment>
+ <comment xml:lang="ko">LHZ 압축 파일</comment>
+ <comment xml:lang="lt">LHZ archyvas</comment>
+ <comment xml:lang="lv">LHZ arhīvs</comment>
+ <comment xml:lang="ms">Arkib LHZ</comment>
+ <comment xml:lang="nb">LHZ-arkiv</comment>
+ <comment xml:lang="nl">LHZ-archief</comment>
+ <comment xml:lang="nn">LHZ-arkiv</comment>
+ <comment xml:lang="pl">Archiwum LHZ</comment>
+ <comment xml:lang="pt">arquivo LHZ</comment>
+ <comment xml:lang="pt_BR">Pacote LZH</comment>
+ <comment xml:lang="ro">Arhivă LHZ</comment>
+ <comment xml:lang="ru">архив LHZ</comment>
+ <comment xml:lang="sk">Archív LHZ</comment>
+ <comment xml:lang="sl">Datoteka arhiva LHZ</comment>
+ <comment xml:lang="sq">Arkiv LHZ</comment>
+ <comment xml:lang="sr">LHZ архива</comment>
+ <comment xml:lang="sv">LHZ-arkiv</comment>
+ <comment xml:lang="uk">архів LHZ</comment>
+ <comment xml:lang="vi">Kho nén LHZ (LHA đã nén)</comment>
+ <comment xml:lang="zh_CN">LHZ 归档文件</comment>
+ <comment xml:lang="zh_TW">LHZ 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.lhz"/>
+ </mime-type>
+ <mime-type type="text/vnd.trolltech.linguist">
+ <comment>message catalog</comment>
+ <comment xml:lang="ar">كتالوج الرسالة</comment>
+ <comment xml:lang="be@latin">kataloh paviedamleńniaŭ</comment>
+ <comment xml:lang="bg">Каталог със съобщения</comment>
+ <comment xml:lang="ca">catàleg de missatges</comment>
+ <comment xml:lang="cs">Katalog zpráv</comment>
+ <comment xml:lang="da">meddelelseskatalog</comment>
+ <comment xml:lang="de">Nachrichtenkatalog</comment>
+ <comment xml:lang="el">κατάλογος μηνυμάτων</comment>
+ <comment xml:lang="en_GB">message catalogue</comment>
+ <comment xml:lang="eo">katalogo de mesaĝoj</comment>
+ <comment xml:lang="es">catálogo de mensajes</comment>
+ <comment xml:lang="eu">mezuen katalogoa</comment>
+ <comment xml:lang="fi">viestiluettelo</comment>
+ <comment xml:lang="fo">boðskrá</comment>
+ <comment xml:lang="fr">catalogue de messages</comment>
+ <comment xml:lang="ga">catalóg theachtaireachtaí</comment>
+ <comment xml:lang="gl">catálogo de mensaxes</comment>
+ <comment xml:lang="he">קטלוג הודעות</comment>
+ <comment xml:lang="hu">üzenetkatalógus</comment>
+ <comment xml:lang="id">katalog pesan</comment>
+ <comment xml:lang="it">Catalogo di messaggi</comment>
+ <comment xml:lang="ja">メッセージカタログ</comment>
+ <comment xml:lang="kk">мәлімдемелер каталогы</comment>
+ <comment xml:lang="ko">메시지 카탈로그</comment>
+ <comment xml:lang="lt">laiškų katalogas</comment>
+ <comment xml:lang="lv">ziņojumu katalogs</comment>
+ <comment xml:lang="ms">Katalog mesej</comment>
+ <comment xml:lang="nb">meldingskatalog</comment>
+ <comment xml:lang="nl">berichtencatalogus</comment>
+ <comment xml:lang="nn">meldingskatalog</comment>
+ <comment xml:lang="pl">Katalog wiadomości</comment>
+ <comment xml:lang="pt">catálogo de mensagens</comment>
+ <comment xml:lang="pt_BR">católogo de mensagens</comment>
+ <comment xml:lang="ro">catalog de mesaje</comment>
+ <comment xml:lang="ru">каталог сообщений</comment>
+ <comment xml:lang="sk">Katalóg správ</comment>
+ <comment xml:lang="sl">katalogov sporočil</comment>
+ <comment xml:lang="sq">Katallog mesazhesh</comment>
+ <comment xml:lang="sr">каталог порука</comment>
+ <comment xml:lang="sv">meddelandekatalog</comment>
+ <comment xml:lang="uk">каталог повідомлень</comment>
+ <comment xml:lang="vi">phân loại thông điệp</comment>
+ <comment xml:lang="zh_CN">消息库</comment>
+ <comment xml:lang="zh_TW">訊息目錄</comment>
+ <sub-class-of type="application/xml"/>
+ <magic>
+ <match value="&lt;TS" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.ts"/>
+ <alias type="application/x-linguist"/>
+ </mime-type>
+ <mime-type type="application/x-lyx">
+ <comment>LyX document</comment>
+ <comment xml:lang="ar">مستند LyX</comment>
+ <comment xml:lang="be@latin">Dakument LyX</comment>
+ <comment xml:lang="bg">Документ — LyX</comment>
+ <comment xml:lang="ca">document de LyX</comment>
+ <comment xml:lang="cs">Dokument LyX</comment>
+ <comment xml:lang="da">LyX-dokument</comment>
+ <comment xml:lang="de">LyX-Dokument</comment>
+ <comment xml:lang="el">έγγραφο LyX</comment>
+ <comment xml:lang="en_GB">LyX document</comment>
+ <comment xml:lang="eo">LyX-dokumento</comment>
+ <comment xml:lang="es">documento de LyX</comment>
+ <comment xml:lang="eu">LyX dokumentua</comment>
+ <comment xml:lang="fi">LyX-asiakirja</comment>
+ <comment xml:lang="fo">LyX skjal</comment>
+ <comment xml:lang="fr">document LyX</comment>
+ <comment xml:lang="ga">cáipéis LyX</comment>
+ <comment xml:lang="gl">documento LyX</comment>
+ <comment xml:lang="he">מסמך Lyx</comment>
+ <comment xml:lang="hu">LyX-dokumentum</comment>
+ <comment xml:lang="id">Dokumen LyX</comment>
+ <comment xml:lang="it">Documento LyX</comment>
+ <comment xml:lang="ja">LyX ドキュメント</comment>
+ <comment xml:lang="kk">LyX құжаты</comment>
+ <comment xml:lang="ko">LyX 문서</comment>
+ <comment xml:lang="lt">LyX dokumentas</comment>
+ <comment xml:lang="lv">LyX dokuments</comment>
+ <comment xml:lang="ms">Dokumen LyX</comment>
+ <comment xml:lang="nb">LyX-dokument</comment>
+ <comment xml:lang="nl">LyX-document</comment>
+ <comment xml:lang="nn">LyX-dokument</comment>
+ <comment xml:lang="pl">Dokument LyX</comment>
+ <comment xml:lang="pt">documento LyX</comment>
+ <comment xml:lang="pt_BR">Documento LyX</comment>
+ <comment xml:lang="ro">Document LyX</comment>
+ <comment xml:lang="ru">документ LyX</comment>
+ <comment xml:lang="sk">Dokument LyX</comment>
+ <comment xml:lang="sl">Dokument LyX</comment>
+ <comment xml:lang="sq">Dokument LyX</comment>
+ <comment xml:lang="sr">LyX документ</comment>
+ <comment xml:lang="sv">LyX-dokument</comment>
+ <comment xml:lang="uk">документ LyX</comment>
+ <comment xml:lang="vi">Tài liệu LyX</comment>
+ <comment xml:lang="zh_CN">LyX 文档</comment>
+ <comment xml:lang="zh_TW">LyX 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="#LyX" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.lyx"/>
+ <alias type="text/x-lyx"/>
+ </mime-type>
+ <mime-type type="application/x-lzip">
+ <comment>Lzip archive</comment>
+ <comment xml:lang="ar">أرشيف Lzip</comment>
+ <comment xml:lang="bg">Архив — lzip</comment>
+ <comment xml:lang="ca">arxiu lzip</comment>
+ <comment xml:lang="cs">Archiv Lzip</comment>
+ <comment xml:lang="da">Lzip-arkiv</comment>
+ <comment xml:lang="de">Lzip-Archiv</comment>
+ <comment xml:lang="eo">Lzip-arkivo</comment>
+ <comment xml:lang="es">archivador Lzip</comment>
+ <comment xml:lang="eu">Lzip artxiboa</comment>
+ <comment xml:lang="fi">Lzip-arkisto</comment>
+ <comment xml:lang="fo">Lzip skjalasavn</comment>
+ <comment xml:lang="fr">archive lzip</comment>
+ <comment xml:lang="ga">cartlann Lzip</comment>
+ <comment xml:lang="gl">arquivo Lzip</comment>
+ <comment xml:lang="he">ארכיון Lzip</comment>
+ <comment xml:lang="hu">Lzip archívum</comment>
+ <comment xml:lang="id">Arsip Lzip</comment>
+ <comment xml:lang="it">Archivio Lzip</comment>
+ <comment xml:lang="ja">Lzip アーカイブ</comment>
+ <comment xml:lang="kk">Lzip архиві</comment>
+ <comment xml:lang="ko">LZIP 압축 파일</comment>
+ <comment xml:lang="lt">Lzip archyvas</comment>
+ <comment xml:lang="lv">Lzip arhīvs</comment>
+ <comment xml:lang="pl">Archiwum lzip</comment>
+ <comment xml:lang="ro">Arhivă Lzip</comment>
+ <comment xml:lang="ru">архив LZIP</comment>
+ <comment xml:lang="sk">Archív Lzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Lzip</comment>
+ <comment xml:lang="sv">Lzip-arkiv</comment>
+ <comment xml:lang="uk">архів lzip</comment>
+ <comment xml:lang="zh_CN">Lzip 归档文件</comment>
+ <comment xml:lang="zh_TW">Lzip 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="LZIP" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.lz"/>
+ </mime-type>
+ <mime-type type="application/x-lzma">
+ <comment>LZMA archive</comment>
+ <comment xml:lang="ar">أرشيف LZMA</comment>
+ <comment xml:lang="be@latin">Archiŭ LZMA</comment>
+ <comment xml:lang="bg">Архив — LZMA</comment>
+ <comment xml:lang="ca">arxiu LZMA</comment>
+ <comment xml:lang="cs">Archiv LZMA</comment>
+ <comment xml:lang="da">LZHA-arkiv</comment>
+ <comment xml:lang="de">LZMA-Archiv</comment>
+ <comment xml:lang="eo">LZMA-arkivo</comment>
+ <comment xml:lang="es">archivador LZMA</comment>
+ <comment xml:lang="eu">LZMA artxiboa</comment>
+ <comment xml:lang="fi">LZMA-arkisto</comment>
+ <comment xml:lang="fo">LZMA skjalasavn</comment>
+ <comment xml:lang="fr">archive LZMA</comment>
+ <comment xml:lang="ga">cartlann LZMA</comment>
+ <comment xml:lang="gl">arquivo LZMA</comment>
+ <comment xml:lang="he">ארכיון LZMA</comment>
+ <comment xml:lang="hu">LZMA-archívum</comment>
+ <comment xml:lang="id">Arsip LZMA</comment>
+ <comment xml:lang="it">Archivio LZMA</comment>
+ <comment xml:lang="ja">LZMA アーカイブ</comment>
+ <comment xml:lang="kk">LZMA архиві</comment>
+ <comment xml:lang="ko">LZMA 압축 파일</comment>
+ <comment xml:lang="lt">LZMA archyvas</comment>
+ <comment xml:lang="lv">LZMA arhīvs</comment>
+ <comment xml:lang="nb">LZMA-arkiv</comment>
+ <comment xml:lang="nl">LZMA-archief</comment>
+ <comment xml:lang="nn">LZMA-arkiv</comment>
+ <comment xml:lang="pl">Archiwum LZMA</comment>
+ <comment xml:lang="pt_BR">Pacote LZMA</comment>
+ <comment xml:lang="ro">Arhivă LZMA</comment>
+ <comment xml:lang="ru">архив LZMA</comment>
+ <comment xml:lang="sk">Archív LZMA</comment>
+ <comment xml:lang="sl">Datoteka arhiva LZMA</comment>
+ <comment xml:lang="sq">Arkiv LZMA</comment>
+ <comment xml:lang="sv">LZMA-arkiv</comment>
+ <comment xml:lang="uk">архів LZMA</comment>
+ <comment xml:lang="vi">Kho nén LZMA</comment>
+ <comment xml:lang="zh_CN">LZMA 归档文件</comment>
+ <comment xml:lang="zh_TW">LZMA 封存檔</comment>
+ <acronym>LZMA</acronym>
+ <expanded-acronym>Lempel-Ziv-Markov chain-Algorithm</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.lzma"/>
+ </mime-type>
+ <mime-type type="application/x-lzma-compressed-tar">
+ <comment>Tar archive (LZMA-compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-LZMA)</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (LZMA-skampresavany)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с LZMA</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit amb LZMA)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný pomocí LZMA)</comment>
+ <comment xml:lang="da">Tar-arkiv (LZMA-komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (LZMA-komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido con LZMA)</comment>
+ <comment xml:lang="eu">Tar artxiboa (LZMA-rekin konprimitua)</comment>
+ <comment xml:lang="fi">Tar-arkisto (LZMA-pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (LZMA-stappað)</comment>
+ <comment xml:lang="fr">archive tar (compression LZMA)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZMA)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con LZMA)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע"י LZMA)</comment>
+ <comment xml:lang="hu">Tar archívum (LZMA-val tömörítve)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi LZMA)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con LZMA)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (LZMA 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (LZMA-мен сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (LZMA 압축)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su LZMA)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar LZMA)</comment>
+ <comment xml:lang="nb">Tar-arkiv (LZMA-komprimert)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt met LZMA)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med LZMA)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja LZMA)</comment>
+ <comment xml:lang="pt_BR">Pacote tar (compactado com LZO)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată LZMA)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый LZMA)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný pomocou LZMA)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z LZMA)</comment>
+ <comment xml:lang="sq">Arkiv tar (i kompresuar me LZMA)</comment>
+ <comment xml:lang="sv">Tar-arkiv (LZMA-komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений LZMA)</comment>
+ <comment xml:lang="vi">Kho nén tar (đã nén LZMA)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件 (LZMA 压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (LZMA 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.tar.lzma"/>
+ <glob pattern="*.tlz"/>
+ </mime-type>
+ <mime-type type="application/x-lzop">
+ <comment>LZO archive</comment>
+ <comment xml:lang="ar">أرشيف LZO</comment>
+ <comment xml:lang="be@latin">Archiŭ LZO</comment>
+ <comment xml:lang="bg">Архив — LZO</comment>
+ <comment xml:lang="ca">arxiu LZO</comment>
+ <comment xml:lang="cs">Archiv LZO</comment>
+ <comment xml:lang="da">LZO-arkiv</comment>
+ <comment xml:lang="de">LZO-Archiv</comment>
+ <comment xml:lang="el">αρχείο LZO</comment>
+ <comment xml:lang="en_GB">LZO archive</comment>
+ <comment xml:lang="eo">LZO-arkivo</comment>
+ <comment xml:lang="es">archivador LZO</comment>
+ <comment xml:lang="eu">LZO artxiboa</comment>
+ <comment xml:lang="fi">LZO-arkisto</comment>
+ <comment xml:lang="fo">LZO skjalasavn</comment>
+ <comment xml:lang="fr">archive LZO</comment>
+ <comment xml:lang="ga">cartlann LZO</comment>
+ <comment xml:lang="gl">arquivo LZO</comment>
+ <comment xml:lang="he">ארכיון LZO</comment>
+ <comment xml:lang="hu">LZO-archívum</comment>
+ <comment xml:lang="id">Arsip LZO</comment>
+ <comment xml:lang="it">Archivio LZO</comment>
+ <comment xml:lang="ja">LZO アーカイブ</comment>
+ <comment xml:lang="kk">LZO архиві</comment>
+ <comment xml:lang="ko">LZO 압축 파일</comment>
+ <comment xml:lang="lt">LZO archyvas</comment>
+ <comment xml:lang="lv">LZO arhīvs</comment>
+ <comment xml:lang="ms">Arkib LZO</comment>
+ <comment xml:lang="nb">LZO-arkiv</comment>
+ <comment xml:lang="nl">LZO-archief</comment>
+ <comment xml:lang="nn">LZO-arkiv</comment>
+ <comment xml:lang="pl">Archiwum LZO</comment>
+ <comment xml:lang="pt">arquivo LZO</comment>
+ <comment xml:lang="pt_BR">Pacote LZO</comment>
+ <comment xml:lang="ro">Arhivă LZO</comment>
+ <comment xml:lang="ru">архив LZO</comment>
+ <comment xml:lang="sk">Archív LZO</comment>
+ <comment xml:lang="sl">Datoteka arhiva LZO</comment>
+ <comment xml:lang="sq">Arkiv LZO</comment>
+ <comment xml:lang="sr">LZO архива</comment>
+ <comment xml:lang="sv">LZO-arkiv</comment>
+ <comment xml:lang="uk">архів LZO</comment>
+ <comment xml:lang="vi">Kho nén LZO</comment>
+ <comment xml:lang="zh_CN">LZO 归档文件</comment>
+ <comment xml:lang="zh_TW">LZO 封存檔</comment>
+ <acronym>LZO</acronym>
+ <expanded-acronym>Lempel-Ziv-Oberhumer</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.lzo"/>
+ </mime-type>
+ <mime-type type="application/x-magicpoint">
+ <comment>MagicPoint presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي MagicPoint</comment>
+ <comment xml:lang="be@latin">Prezentacyja MagicPoint</comment>
+ <comment xml:lang="bg">Презентация — MagicPoint</comment>
+ <comment xml:lang="ca">presentació de MagicPoint</comment>
+ <comment xml:lang="cs">Prezentace MagicPoint</comment>
+ <comment xml:lang="cy">Cyflwyniad MagicPoint</comment>
+ <comment xml:lang="da">MagicPoint-præsentation</comment>
+ <comment xml:lang="de">MagicPoint-Präsentation</comment>
+ <comment xml:lang="el">παρουσίαση MagicPoint</comment>
+ <comment xml:lang="en_GB">MagicPoint presentation</comment>
+ <comment xml:lang="eo">MagicPoint-prezentaĵo</comment>
+ <comment xml:lang="es">presentación de MagicPoint</comment>
+ <comment xml:lang="eu">MagicPoint aurkezpena</comment>
+ <comment xml:lang="fi">MagicPoint-esitys</comment>
+ <comment xml:lang="fo">MagicPoint framløga</comment>
+ <comment xml:lang="fr">présentation MagicPoint</comment>
+ <comment xml:lang="ga">láithreoireacht MagicPoint</comment>
+ <comment xml:lang="gl">presentación de MagicPoint</comment>
+ <comment xml:lang="he">מצגת MagicPoint</comment>
+ <comment xml:lang="hu">MagicPoint-bemutató</comment>
+ <comment xml:lang="id">Presentasi MagicPoint</comment>
+ <comment xml:lang="it">Presentazione MagicPoint</comment>
+ <comment xml:lang="ja">MagicPoint プレゼンテーション</comment>
+ <comment xml:lang="kk">MagicPoint презентациясы</comment>
+ <comment xml:lang="ko">MagicPoint 프리젠테이션</comment>
+ <comment xml:lang="lt">MagicPoint pateiktis</comment>
+ <comment xml:lang="lv">MagicPoint prezentācija</comment>
+ <comment xml:lang="ms">Persembahan MagicPoint</comment>
+ <comment xml:lang="nb">MagicPoint-presentasjon</comment>
+ <comment xml:lang="nl">MagicPoint-presentatie</comment>
+ <comment xml:lang="nn">MagicPoint-presentasjon</comment>
+ <comment xml:lang="pl">Prezentacja programu MagicPoint</comment>
+ <comment xml:lang="pt">apresentação MagicPoint</comment>
+ <comment xml:lang="pt_BR">Apresentação do MagicPoint</comment>
+ <comment xml:lang="ro">Prezentare MagicPoint</comment>
+ <comment xml:lang="ru">презентация MagicPoint</comment>
+ <comment xml:lang="sk">Prezentácia MagicPoint</comment>
+ <comment xml:lang="sl">Predstavitev MagicPoint</comment>
+ <comment xml:lang="sq">Prezantim MagicPoint</comment>
+ <comment xml:lang="sr">MagicPoint презентација</comment>
+ <comment xml:lang="sv">MagicPoint-presentation</comment>
+ <comment xml:lang="uk">презентація MagicPoint</comment>
+ <comment xml:lang="vi">Trình diễn MagicPoint</comment>
+ <comment xml:lang="zh_CN">MagicPoint 演示文稿</comment>
+ <comment xml:lang="zh_TW">MagicPoint 簡報檔</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-presentation"/>
+ <glob pattern="*.mgp"/>
+ </mime-type>
+ <mime-type type="application/x-macbinary">
+ <comment>Macintosh MacBinary file</comment>
+ <comment xml:lang="ar">ملف Macintosh MacBinary</comment>
+ <comment xml:lang="be@latin">Fajł Macintosh MacBinary</comment>
+ <comment xml:lang="bg">Файл — MacBinary</comment>
+ <comment xml:lang="ca">fitxer MacBinary de Macintosh</comment>
+ <comment xml:lang="cs">Soubor MacBinary pro Macintosh </comment>
+ <comment xml:lang="da">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="de">Macintosh-MacBinary-Datei</comment>
+ <comment xml:lang="el">εκτελέσιμο Macintosh MacBinary</comment>
+ <comment xml:lang="en_GB">Macintosh MacBinary file</comment>
+ <comment xml:lang="eo">MacBinary-dosiero de Macintosh</comment>
+ <comment xml:lang="es">archivo de Macintosh MacBinary</comment>
+ <comment xml:lang="eu">Macintosh MacBinary fitxategia</comment>
+ <comment xml:lang="fi">Macintosh MacBinary -tiedosto</comment>
+ <comment xml:lang="fo">Macintosh MacBinary fíla</comment>
+ <comment xml:lang="fr">fichier Macintosh MacBinary</comment>
+ <comment xml:lang="ga">comhad Macintosh MacBinary</comment>
+ <comment xml:lang="gl">ficheiro MacBinary de Macintosh</comment>
+ <comment xml:lang="he">קובץ בינארי של מקינטוש</comment>
+ <comment xml:lang="hu">Macintosh MacBinary-fájl</comment>
+ <comment xml:lang="id">Berkas Macintosh MacBinary</comment>
+ <comment xml:lang="it">File Macintosh MacBinary</comment>
+ <comment xml:lang="ja">MacBinary MacBinary ファイル</comment>
+ <comment xml:lang="kk">Macintosh MacBinary файлы</comment>
+ <comment xml:lang="ko">MacBinary 파일</comment>
+ <comment xml:lang="lt">Macintosh MacBinary failas</comment>
+ <comment xml:lang="lv">Macintosh MacBinary fails</comment>
+ <comment xml:lang="ms">Fail MacBinary Macintosh</comment>
+ <comment xml:lang="nb">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="nl">Macintosh MacBinary-bestand</comment>
+ <comment xml:lang="nn">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="pl">Plik MacBinary Macintosh</comment>
+ <comment xml:lang="pt">ficheiro MacBinary de Macintosh</comment>
+ <comment xml:lang="pt_BR">Arquivo do Macintosh MacBinary</comment>
+ <comment xml:lang="ro">Fișier Macintosh MacBinary</comment>
+ <comment xml:lang="ru">файл Macintosh MacBinary</comment>
+ <comment xml:lang="sk">Súbor pre Macintosh MacBinary</comment>
+ <comment xml:lang="sl">Izvedljiva dvojiška datoteka Macintosh MacBinary</comment>
+ <comment xml:lang="sq">File MacBinary Macintosh</comment>
+ <comment xml:lang="sr">Мекинтош MacBinary датотека</comment>
+ <comment xml:lang="sv">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="uk">файл Macintosh MacBinary</comment>
+ <comment xml:lang="vi">Tập tin nhị phân MacBinary của Macintosh</comment>
+ <comment xml:lang="zh_CN">Macintosh MacBinary 文件</comment>
+ <comment xml:lang="zh_TW">Macintosh MacBinary 檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="mBIN" type="string" offset="102"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-matroska">
+ <comment>Matroska stream</comment>
+ <comment xml:lang="ar">دفق Matroska</comment>
+ <comment xml:lang="be@latin">Płyń Matroska</comment>
+ <comment xml:lang="bg">Поток — Matroska</comment>
+ <comment xml:lang="ca">flux Matroska</comment>
+ <comment xml:lang="cs">Proud Matroska</comment>
+ <comment xml:lang="da">Matroskastrøm</comment>
+ <comment xml:lang="de">Matroska-Datenstrom</comment>
+ <comment xml:lang="es">flujo Matroska</comment>
+ <comment xml:lang="eu">Matroska korrontea</comment>
+ <comment xml:lang="fi">Matroska-virta</comment>
+ <comment xml:lang="fo">Matroska streymur</comment>
+ <comment xml:lang="fr">flux Matroska</comment>
+ <comment xml:lang="ga">sruth Matroska</comment>
+ <comment xml:lang="gl">fluxo de Matroska</comment>
+ <comment xml:lang="he">זרימת Matroska</comment>
+ <comment xml:lang="hu">Matroska adatfolyam</comment>
+ <comment xml:lang="id">Stream Matroska</comment>
+ <comment xml:lang="it">Stream Matroska</comment>
+ <comment xml:lang="ja">Matroska ストリーム</comment>
+ <comment xml:lang="kk">Matroska ағымы</comment>
+ <comment xml:lang="ko">매트로스카 스트림</comment>
+ <comment xml:lang="lt">Matroska srautas</comment>
+ <comment xml:lang="lv">Matroska straume</comment>
+ <comment xml:lang="nl">Matroska-stream</comment>
+ <comment xml:lang="nn">Matroska-straum</comment>
+ <comment xml:lang="pl">Strumień Matroska</comment>
+ <comment xml:lang="pt_BR">Transmissão do Matroska</comment>
+ <comment xml:lang="ro">Flux Matroska</comment>
+ <comment xml:lang="ru">поток Matroska</comment>
+ <comment xml:lang="sk">Stream Matroska</comment>
+ <comment xml:lang="sl">Pretočni vir Matroska</comment>
+ <comment xml:lang="sq">Stream Matroska</comment>
+ <comment xml:lang="sv">Matroska-ström</comment>
+ <comment xml:lang="uk">потік даних Matroska</comment>
+ <comment xml:lang="vi">Luồng Matroska</comment>
+ <comment xml:lang="zh_CN">Matroska 流</comment>
+ <comment xml:lang="zh_TW">Matroska 串流</comment>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+
+ <match value="0x1a45dfa3" type="big32" offset="0">
+
+ <match value="0x4282" type="big16" offset="5:65">
+
+ <match value="matroska" type="string" offset="8:75"/>
+ </match>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="video/x-matroska">
+ <comment>Matroska video</comment>
+ <comment xml:lang="ar">Matroska مرئي</comment>
+ <comment xml:lang="be@latin">Videa Matroska</comment>
+ <comment xml:lang="bg">Видео — Matroska</comment>
+ <comment xml:lang="ca">vídeo Matroska</comment>
+ <comment xml:lang="cs">Video Matroska</comment>
+ <comment xml:lang="da">Matroskavideo</comment>
+ <comment xml:lang="de">Matroska-Video</comment>
+ <comment xml:lang="el">βίντεο Matroska</comment>
+ <comment xml:lang="en_GB">Matroska video</comment>
+ <comment xml:lang="eo">Matroska-video</comment>
+ <comment xml:lang="es">vídeo Matroska</comment>
+ <comment xml:lang="eu">Matroska bideoa</comment>
+ <comment xml:lang="fi">Matroska-video</comment>
+ <comment xml:lang="fo">Matroska video</comment>
+ <comment xml:lang="fr">vidéo Matroska</comment>
+ <comment xml:lang="ga">físeán Matroska</comment>
+ <comment xml:lang="gl">vídeo de Matroska</comment>
+ <comment xml:lang="he">וידאו Matroska</comment>
+ <comment xml:lang="hu">Matroska-videó</comment>
+ <comment xml:lang="id">Video Matroska</comment>
+ <comment xml:lang="it">Video Matroska</comment>
+ <comment xml:lang="ja">Matroska 動画</comment>
+ <comment xml:lang="kk">Matroska видеосы</comment>
+ <comment xml:lang="ko">매트로스카 비디오</comment>
+ <comment xml:lang="lt">Matroska vaizdo įrašas</comment>
+ <comment xml:lang="lv">Matroska video</comment>
+ <comment xml:lang="ms">Video Matroska</comment>
+ <comment xml:lang="nb">Matroska-film</comment>
+ <comment xml:lang="nl">Matroska-video</comment>
+ <comment xml:lang="nn">Matroska-video</comment>
+ <comment xml:lang="pl">Plik wideo Matroska</comment>
+ <comment xml:lang="pt">vídeo Matroska</comment>
+ <comment xml:lang="pt_BR">Vídeo Matroska</comment>
+ <comment xml:lang="ro">Video Matroska</comment>
+ <comment xml:lang="ru">видео Matroska</comment>
+ <comment xml:lang="sk">Video Matroska</comment>
+ <comment xml:lang="sl">Video datoteka Matroska</comment>
+ <comment xml:lang="sq">Video Matroska</comment>
+ <comment xml:lang="sr">Матрошка видео</comment>
+ <comment xml:lang="sv">Matroska-video</comment>
+ <comment xml:lang="uk">відеокліп Matroska</comment>
+ <comment xml:lang="vi">Ảnh động Matroska</comment>
+ <comment xml:lang="zh_CN">Matroska 视频</comment>
+ <comment xml:lang="zh_TW">Matroska 視訊</comment>
+ <glob pattern="*.mkv"/>
+ <sub-class-of type="application/x-matroska"/>
+ </mime-type>
+ <mime-type type="audio/x-matroska">
+ <comment>Matroska audio</comment>
+ <comment xml:lang="ar">سمعي Matroska</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Matroska</comment>
+ <comment xml:lang="bg">Аудио — Matroska</comment>
+ <comment xml:lang="ca">àudio Matroska</comment>
+ <comment xml:lang="cs">Zvuk Matroska</comment>
+ <comment xml:lang="da">Matroskalyd</comment>
+ <comment xml:lang="de">Matroska-Audio</comment>
+ <comment xml:lang="eo">Matroska-sondosiero</comment>
+ <comment xml:lang="es">sonido Matroska</comment>
+ <comment xml:lang="eu">Matroska audioa</comment>
+ <comment xml:lang="fi">Matroska-ääni</comment>
+ <comment xml:lang="fo">Matroska ljóður</comment>
+ <comment xml:lang="fr">audio Matroska</comment>
+ <comment xml:lang="ga">fuaim Matroska</comment>
+ <comment xml:lang="gl">son de Matroska</comment>
+ <comment xml:lang="he">שמע Matroska</comment>
+ <comment xml:lang="hu">Matroska hang</comment>
+ <comment xml:lang="id">Audio Matroska</comment>
+ <comment xml:lang="it">Audio Matroska</comment>
+ <comment xml:lang="ja">Matroska オーディオ</comment>
+ <comment xml:lang="kk">Matroska аудиосы</comment>
+ <comment xml:lang="ko">매트로스카 오디오</comment>
+ <comment xml:lang="lt">Matroska garso įrašas</comment>
+ <comment xml:lang="lv">Matroska audio</comment>
+ <comment xml:lang="nb">Matroska-lyd</comment>
+ <comment xml:lang="nl">Matroska-audio</comment>
+ <comment xml:lang="nn">Matroska-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Matroska</comment>
+ <comment xml:lang="pt_BR">Áudio do Matroska</comment>
+ <comment xml:lang="ro">Audio Matroska</comment>
+ <comment xml:lang="ru">аудио Matroska</comment>
+ <comment xml:lang="sk">Zvuk Matroska</comment>
+ <comment xml:lang="sl">Zvočna datoteka Matroska</comment>
+ <comment xml:lang="sq">Audio Matroska</comment>
+ <comment xml:lang="sv">Matroska-ljud</comment>
+ <comment xml:lang="uk">звук Matroska</comment>
+ <comment xml:lang="vi">Âm thanh Matroska</comment>
+ <comment xml:lang="zh_CN">Matroska 音频</comment>
+ <comment xml:lang="zh_TW">Matroska 音訊</comment>
+ <glob pattern="*.mka"/>
+ <sub-class-of type="application/x-matroska"/>
+ </mime-type>
+ <mime-type type="video/webm">
+ <comment>WebM video</comment>
+ <comment xml:lang="ar">WebM مرئي</comment>
+ <comment xml:lang="bg">Видео — WebM</comment>
+ <comment xml:lang="ca">vídeo WebM</comment>
+ <comment xml:lang="cs">Video WebM</comment>
+ <comment xml:lang="da">WebM-video</comment>
+ <comment xml:lang="de">WebM-Video</comment>
+ <comment xml:lang="eo">WebM-video</comment>
+ <comment xml:lang="es">vídeo WebM</comment>
+ <comment xml:lang="fi">WebM-video</comment>
+ <comment xml:lang="fo">WebM video</comment>
+ <comment xml:lang="fr">vidéo WebM</comment>
+ <comment xml:lang="ga">físeán WebM</comment>
+ <comment xml:lang="gl">vídeo WebM</comment>
+ <comment xml:lang="he">וידאו WebM</comment>
+ <comment xml:lang="hu">WebM videó</comment>
+ <comment xml:lang="id">Video WebM</comment>
+ <comment xml:lang="it">Video WebM</comment>
+ <comment xml:lang="ja">WebM 動画</comment>
+ <comment xml:lang="kk">WebM видеосы</comment>
+ <comment xml:lang="ko">WebM 비디오</comment>
+ <comment xml:lang="lt">WebM vaizdo įrašas</comment>
+ <comment xml:lang="lv">WebM video</comment>
+ <comment xml:lang="pl">Plik wideo WebM</comment>
+ <comment xml:lang="ro">Video WebM</comment>
+ <comment xml:lang="ru">видео WebM</comment>
+ <comment xml:lang="sk">Video WebM</comment>
+ <comment xml:lang="sl">Video datoteka WebM</comment>
+ <comment xml:lang="sv">WebM-video</comment>
+ <comment xml:lang="uk">відео WebM</comment>
+ <comment xml:lang="zh_CN">WebM 视频</comment>
+ <comment xml:lang="zh_TW">WebM 視訊</comment>
+ <glob pattern="*.webm"/>
+ <magic priority="50">
+
+ <match value="0x1a45dfa3" type="big32" offset="0">
+
+ <match value="0x4282" type="big16" offset="5:65">
+
+ <match value="webm" type="string" offset="8:75"/>
+ </match>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="audio/webm">
+ <comment>WebM audio</comment>
+ <comment xml:lang="ar">WebM سمعي</comment>
+ <comment xml:lang="bg">Аудио — WebM</comment>
+ <comment xml:lang="ca">àudio WebM</comment>
+ <comment xml:lang="cs">Zvuk WebM</comment>
+ <comment xml:lang="da">WebM-lyd</comment>
+ <comment xml:lang="de">WebM-Audio</comment>
+ <comment xml:lang="eo">WebM-sondosiero</comment>
+ <comment xml:lang="es">sonido WebM</comment>
+ <comment xml:lang="fi">WebM-ääni</comment>
+ <comment xml:lang="fo">WebM ljóður</comment>
+ <comment xml:lang="fr">audio WebM</comment>
+ <comment xml:lang="ga">fuaim WebM</comment>
+ <comment xml:lang="gl">son WebM</comment>
+ <comment xml:lang="he">שמע WebM</comment>
+ <comment xml:lang="hu">WebM hang</comment>
+ <comment xml:lang="id">Audio WebM</comment>
+ <comment xml:lang="it">Audio WebM</comment>
+ <comment xml:lang="ja">WebM オーディオ</comment>
+ <comment xml:lang="kk">WebM аудиосы</comment>
+ <comment xml:lang="ko">WebM 오디오</comment>
+ <comment xml:lang="lt">WebM garso įrašas</comment>
+ <comment xml:lang="lv">WebM audio</comment>
+ <comment xml:lang="pl">Plik dźwiękowy WebM</comment>
+ <comment xml:lang="ro">Audio WebM</comment>
+ <comment xml:lang="ru">аудио WebM</comment>
+ <comment xml:lang="sk">Zvuk WebM</comment>
+ <comment xml:lang="sl">Zvočna datoteka WebM</comment>
+ <comment xml:lang="sv">WebM-ljud</comment>
+ <comment xml:lang="uk">звук WebM</comment>
+ <comment xml:lang="zh_CN">WebM 音频</comment>
+ <comment xml:lang="zh_TW">WebM 音訊</comment>
+ <sub-class-of type="video/webm"/>
+ </mime-type>
+ <mime-type type="application/mxf">
+ <comment>MXF video</comment>
+ <comment xml:lang="ar">MXF مرئي</comment>
+ <comment xml:lang="bg">Видео — MXF</comment>
+ <comment xml:lang="ca">vídeo MXF</comment>
+ <comment xml:lang="cs">Video MXF</comment>
+ <comment xml:lang="da">MXF-video</comment>
+ <comment xml:lang="de">MXF-Video</comment>
+ <comment xml:lang="eo">MXF-video</comment>
+ <comment xml:lang="es">vídeo MXF</comment>
+ <comment xml:lang="eu">MXF bideoa</comment>
+ <comment xml:lang="fi">MXF-video</comment>
+ <comment xml:lang="fo">MXF video</comment>
+ <comment xml:lang="fr">vidéo MXF</comment>
+ <comment xml:lang="ga">físeán MXF</comment>
+ <comment xml:lang="gl">vídeo MXF</comment>
+ <comment xml:lang="he">וידאו MXF</comment>
+ <comment xml:lang="hu">MXF videó</comment>
+ <comment xml:lang="id">Video MXF</comment>
+ <comment xml:lang="it">Video MXF</comment>
+ <comment xml:lang="ja">MXF 動画</comment>
+ <comment xml:lang="kk">MXF видеосы</comment>
+ <comment xml:lang="ko">MXF 비디오</comment>
+ <comment xml:lang="lt">MXF vaizdo įrašas</comment>
+ <comment xml:lang="lv">MXF video</comment>
+ <comment xml:lang="pl">Plik wideo MXF</comment>
+ <comment xml:lang="ro">Video MXF</comment>
+ <comment xml:lang="ru">видео MXF</comment>
+ <comment xml:lang="sk">Video MXF</comment>
+ <comment xml:lang="sl">Video datoteka MXF</comment>
+ <comment xml:lang="sv">MXF-video</comment>
+ <comment xml:lang="uk">відеокліп MXF</comment>
+ <comment xml:lang="zh_CN">MXF 视频</comment>
+ <comment xml:lang="zh_TW">MXF 視訊</comment>
+ <acronym>MXF</acronym>
+ <expanded-acronym>Material Exchange Format</expanded-acronym>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+ <match value="\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02\x01\x01\x02" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.mxf"/>
+ </mime-type>
+ <mime-type type="text/x-ocl">
+ <comment>OCL file</comment>
+ <comment xml:lang="ar">ملف OCL</comment>
+ <comment xml:lang="be@latin">Fajł OCL</comment>
+ <comment xml:lang="bg">Файл — OCL</comment>
+ <comment xml:lang="ca">fitxer OCL</comment>
+ <comment xml:lang="cs">Soubor OCL</comment>
+ <comment xml:lang="da">OCL-fil</comment>
+ <comment xml:lang="de">OCL-Datei</comment>
+ <comment xml:lang="eo">OCL-dosiero</comment>
+ <comment xml:lang="es">archivo OCL</comment>
+ <comment xml:lang="eu">OCL fitxategia</comment>
+ <comment xml:lang="fi">OCL-tiedosto</comment>
+ <comment xml:lang="fo">OCL fíla</comment>
+ <comment xml:lang="fr">fichier OCL</comment>
+ <comment xml:lang="ga">comhad OCL</comment>
+ <comment xml:lang="gl">ficheiro OCL</comment>
+ <comment xml:lang="he">קובץ OCL</comment>
+ <comment xml:lang="hu">OCL fájl</comment>
+ <comment xml:lang="id">Berkas OCL</comment>
+ <comment xml:lang="it">File OCL</comment>
+ <comment xml:lang="ja">OCL ファイル</comment>
+ <comment xml:lang="kk">OCL файлы</comment>
+ <comment xml:lang="ko">OCL 파일</comment>
+ <comment xml:lang="lt">OCL failas</comment>
+ <comment xml:lang="lv">OCL fails</comment>
+ <comment xml:lang="nb">OCL-fil</comment>
+ <comment xml:lang="nl">OCL-bestand</comment>
+ <comment xml:lang="nn">OCL-fil</comment>
+ <comment xml:lang="pl">Plik OCL</comment>
+ <comment xml:lang="pt_BR">Arquivo OCL</comment>
+ <comment xml:lang="ro">Fișier OCL</comment>
+ <comment xml:lang="ru">файл OCL</comment>
+ <comment xml:lang="sk">Súbor OCL</comment>
+ <comment xml:lang="sl">Datoteka OCL</comment>
+ <comment xml:lang="sq">File OCL</comment>
+ <comment xml:lang="sv">OCL-fil</comment>
+ <comment xml:lang="uk">файл OCL</comment>
+ <comment xml:lang="vi">Tập tin OCL</comment>
+ <comment xml:lang="zh_CN">OCL 文件</comment>
+ <comment xml:lang="zh_TW">OCL 檔</comment>
+ <acronym>OCL</acronym>
+ <expanded-acronym>Object Constraint Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.ocl"/>
+ </mime-type>
+ <mime-type type="text/x-cobol">
+ <comment>COBOL source file</comment>
+ <comment xml:lang="bg">Изходен код — COBOL</comment>
+ <comment xml:lang="ca">codi font en COBOL</comment>
+ <comment xml:lang="cs">Zdrojový soubor COBOL</comment>
+ <comment xml:lang="de">COBOL-Quelldatei</comment>
+ <comment xml:lang="eo">COBOL-fontdosiero</comment>
+ <comment xml:lang="es">Archivo fuente de COBOL</comment>
+ <comment xml:lang="fi">COBOL-lähdekoodi</comment>
+ <comment xml:lang="fr">fichier source COBOL</comment>
+ <comment xml:lang="gl">ficheiro fonte de COBOL</comment>
+ <comment xml:lang="he">קובץ מקור של COBOL</comment>
+ <comment xml:lang="hu">COBOL forrásfájl</comment>
+ <comment xml:lang="id">Berkas sumber COBOL</comment>
+ <comment xml:lang="it">File sorgente COBOL</comment>
+ <comment xml:lang="ja">COBOL ソースファイル</comment>
+ <comment xml:lang="kk">COBOL бастапқы коды</comment>
+ <comment xml:lang="ko">COBOL 소스 파일</comment>
+ <comment xml:lang="lv">COBOL pirmkods</comment>
+ <comment xml:lang="pl">Plik źródłowy COBOL</comment>
+ <comment xml:lang="ru">файл исходного кода на COBOL</comment>
+ <comment xml:lang="sl">Izvorna koda COBOL</comment>
+ <comment xml:lang="sv">COBOL-källkodsfil</comment>
+ <comment xml:lang="uk">вихідний код мовою COBOL</comment>
+ <comment xml:lang="zh_CN">COBOL 源</comment>
+ <comment xml:lang="zh_TW">COBOL 源檔</comment>
+ <acronym>COBOL</acronym>
+ <expanded-acronym>COmmon Business Oriented Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.cbl"/>
+ <glob pattern="*.cob"/>
+ </mime-type>
+ <mime-type type="application/x-mobipocket-ebook">
+ <comment>Mobipocket e-book</comment>
+ <comment xml:lang="bg">Е-книга — Mobipocket</comment>
+ <comment xml:lang="ca">llibre electrònic Mobipocket </comment>
+ <comment xml:lang="cs">Elektronická kniha Mobipocket</comment>
+ <comment xml:lang="de">Mobipocket E-Book</comment>
+ <comment xml:lang="es">Libro electrónico Mobipocket</comment>
+ <comment xml:lang="fi">Mobipocket e-kirja</comment>
+ <comment xml:lang="fr">livre numérique Mobipocket</comment>
+ <comment xml:lang="gl">E-book Mobipocket</comment>
+ <comment xml:lang="he">ספר אלקטרוני של Mobipocket</comment>
+ <comment xml:lang="hu">Mobipocket e-könyv</comment>
+ <comment xml:lang="id">e-book Mobipocket</comment>
+ <comment xml:lang="it">E-book Mobipocket</comment>
+ <comment xml:lang="ja">Mobipocket 電子書籍</comment>
+ <comment xml:lang="kk">Mobipocket эл. кітабы</comment>
+ <comment xml:lang="ko">Mobipocket 이북</comment>
+ <comment xml:lang="lv">Mobipocket e-grāmata</comment>
+ <comment xml:lang="pl">E-book Mobipocket</comment>
+ <comment xml:lang="ru">электронная книга Mobipocket</comment>
+ <comment xml:lang="sl">e-knjiga Mobipocket</comment>
+ <comment xml:lang="uk">електронна книга Mobipocket</comment>
+ <comment xml:lang="zh_TW">Mobipocket e-book</comment>
+ <sub-class-of type="application/x-palm-database"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.mobi"/>
+ <glob pattern="*.prc"/>
+ <magic priority="30">
+
+ <match value="TEXtREAd" type="string" offset="60"/>
+ </magic>
+ <magic priority="80">
+ <match value="BOOKMOBI" type="string" offset="60"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-mif">
+ <comment>Adobe FrameMaker MIF document</comment>
+ <comment xml:lang="ar">مستند أدوبي الصانع للإطارات MIF</comment>
+ <comment xml:lang="be@latin">Dakument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="bg">Документ — Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ca">document de FrameMaker MIF d'Adobe</comment>
+ <comment xml:lang="cs">Dokument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="da">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="de">Adobe-FrameMaker-MIF-Dokument</comment>
+ <comment xml:lang="eo">MIF-dokumento de Adobe FrameMaker</comment>
+ <comment xml:lang="es">documento MIF de Adobe FrameMaker</comment>
+ <comment xml:lang="eu">Adobe FrameMaker-en MIF dokumentua</comment>
+ <comment xml:lang="fi">Adobe FrameMaker MIF -asiakirja</comment>
+ <comment xml:lang="fo">Adobe FrameMaker MIF skjal</comment>
+ <comment xml:lang="fr">document MIF Adobe FrameMaker</comment>
+ <comment xml:lang="ga">cáipéis MIF Adobe FrameMaker</comment>
+ <comment xml:lang="gl">documento MIF de Adobe FrameMaker</comment>
+ <comment xml:lang="he">מסמך MIF של Adobe FrameMaker</comment>
+ <comment xml:lang="hu">Adobe FrameMaker MIF-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Adobe FrameMaker MIF</comment>
+ <comment xml:lang="it">Documento MIF Adobe FrameMaker</comment>
+ <comment xml:lang="ja">Adobe FrameMaker MIF ドキュメント</comment>
+ <comment xml:lang="kk">Adobe FrameMaker MIF құжаты</comment>
+ <comment xml:lang="ko">어도비 프레임메이커 MIF 문서</comment>
+ <comment xml:lang="lt">Adobe FrameMaker MIF dokumentas</comment>
+ <comment xml:lang="lv">Adobe FrameMaker MIF dokuments</comment>
+ <comment xml:lang="nb">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="nl">Adobe FrameMaker MIF-document</comment>
+ <comment xml:lang="nn">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="pl">Dokument MIF Adobe FrameMaker</comment>
+ <comment xml:lang="pt_BR">Documento MIF do Adobe FrameMaker</comment>
+ <comment xml:lang="ro">Document Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ru">документ Adobe FrameMaker MIF</comment>
+ <comment xml:lang="sk">Dokument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="sl">Dokument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="sq">Dokument MIF Adobe FrameMaker</comment>
+ <comment xml:lang="sv">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="uk">документ Adobe FrameMaker MIF</comment>
+ <comment xml:lang="vi">Tài liệu Adobe FrameMaker MIF</comment>
+ <comment xml:lang="zh_CN">Adobe FrameMaker MIF 文档</comment>
+ <comment xml:lang="zh_TW">Adobe FrameMaker MIF 文件</comment>
+ <glob pattern="*.mif"/>
+ </mime-type>
+ <mime-type type="application/x-mozilla-bookmarks">
+ <comment>Mozilla bookmarks</comment>
+ <comment xml:lang="ar">علامات موزيلا</comment>
+ <comment xml:lang="be@latin">Zakładki Mozilla</comment>
+ <comment xml:lang="bg">Отметки — Mozilla</comment>
+ <comment xml:lang="ca">llista d'adreces d'interès de Mozilla</comment>
+ <comment xml:lang="cs">Záložky Mozilla</comment>
+ <comment xml:lang="da">Mozillabogmærker</comment>
+ <comment xml:lang="de">Mozilla-Lesezeichen</comment>
+ <comment xml:lang="el">σελιδοδείκτες Mozilla</comment>
+ <comment xml:lang="en_GB">Mozilla bookmarks</comment>
+ <comment xml:lang="eo">Mozilla-legosignoj</comment>
+ <comment xml:lang="es">marcadores de Mozilla</comment>
+ <comment xml:lang="eu">Mozillako laster-markak</comment>
+ <comment xml:lang="fi">Mozilla-kirjanmerkit</comment>
+ <comment xml:lang="fo">Mozilla bókamerki</comment>
+ <comment xml:lang="fr">marque-pages Mozilla</comment>
+ <comment xml:lang="ga">leabharmharcanna Mozilla</comment>
+ <comment xml:lang="gl">Marcadores de Mozilla</comment>
+ <comment xml:lang="he">סמניה של Mozilla</comment>
+ <comment xml:lang="hu">Mozilla-könyvjelzők</comment>
+ <comment xml:lang="id">Bookmark Mozilla</comment>
+ <comment xml:lang="it">Segnalibri Mozilla</comment>
+ <comment xml:lang="ja">Mozilla ブックマーク</comment>
+ <comment xml:lang="kk">Mozilla бетбелгілері</comment>
+ <comment xml:lang="ko">모질라 책갈피</comment>
+ <comment xml:lang="lt">Mozilla žymelės</comment>
+ <comment xml:lang="lv">Mozilla grāmatzīmes</comment>
+ <comment xml:lang="ms">Tandabuku Mozilla</comment>
+ <comment xml:lang="nb">Mozilla-bokmerker</comment>
+ <comment xml:lang="nl">Mozilla-bladwijzers</comment>
+ <comment xml:lang="nn">Mozilla-bokmerker</comment>
+ <comment xml:lang="pl">Zakładki Mozilla</comment>
+ <comment xml:lang="pt">marcadores do Mozilla</comment>
+ <comment xml:lang="pt_BR">Marcadores do Mozilla</comment>
+ <comment xml:lang="ro">Semne de carte Mozilla</comment>
+ <comment xml:lang="ru">закладки Mozilla</comment>
+ <comment xml:lang="sk">Záložky Mozilla</comment>
+ <comment xml:lang="sl">Datoteka zaznamkov Mozilla</comment>
+ <comment xml:lang="sq">Libërshënues Mozilla</comment>
+ <comment xml:lang="sr">Mozilla обележивачи</comment>
+ <comment xml:lang="sv">Mozilla-bokmärken</comment>
+ <comment xml:lang="uk">закладки Mozilla</comment>
+ <comment xml:lang="vi">Liên kết đã lưu Mozilla</comment>
+ <comment xml:lang="zh_CN">Mozilla 书签</comment>
+ <comment xml:lang="zh_TW">Mozilla 書籤</comment>
+ <sub-class-of type="text/html"/>
+ <generic-icon name="text-html"/>
+ <magic priority="80">
+ <match value="&lt;!DOCTYPE NETSCAPE-Bookmark-file-1&gt;" type="string" offset="0:64"/>
+ </magic>
+ <alias type="application/x-netscape-bookmarks"/>
+ </mime-type>
+ <mime-type type="application/x-ms-dos-executable">
+ <comment>DOS/Windows executable</comment>
+ <comment xml:lang="ar">تنفيذي DOS/Windows</comment>
+ <comment xml:lang="be@latin">Vykonvalny fajł DOS/Windows</comment>
+ <comment xml:lang="bg">Изпълним файл — DOS/Windows</comment>
+ <comment xml:lang="ca">executable de DOS/Windows</comment>
+ <comment xml:lang="cs">Spustitelný soubor pro DOS/Windows</comment>
+ <comment xml:lang="da">DOS-/Windowskørbar</comment>
+ <comment xml:lang="de">DOS/Windows-Programm</comment>
+ <comment xml:lang="el">εκτελέσιμο DOS/Windows</comment>
+ <comment xml:lang="en_GB">DOS/Windows executable</comment>
+ <comment xml:lang="eo">DOS/Windows-plenumebla</comment>
+ <comment xml:lang="es">ejecutable de DOS/Windows</comment>
+ <comment xml:lang="eu">DOS/Windows-eko exekutagarria</comment>
+ <comment xml:lang="fi">DOS/Windows-ohjelma</comment>
+ <comment xml:lang="fo">DOS/Windows inningarfør</comment>
+ <comment xml:lang="fr">exécutable DOS/Windows</comment>
+ <comment xml:lang="ga">comhad inrite DOS/Windows</comment>
+ <comment xml:lang="gl">executábel de DOS/Windows</comment>
+ <comment xml:lang="he">קובץ בר־הרצה של DOS/חלונות</comment>
+ <comment xml:lang="hu">DOS/Windows futtatható</comment>
+ <comment xml:lang="id">DOS/Windows dapat dieksekusi</comment>
+ <comment xml:lang="it">Eseguibile DOS/Windows</comment>
+ <comment xml:lang="ja">DOS/Windows 実行ファイル</comment>
+ <comment xml:lang="kk">DOS/Windows орындалатын файлы</comment>
+ <comment xml:lang="ko">DOS/윈도우 실행파일</comment>
+ <comment xml:lang="lt">DOS/Windows vykdomasis failas</comment>
+ <comment xml:lang="lv">DOS/Windows izpildāmais</comment>
+ <comment xml:lang="ms">Bolehlaksana DOS/Windows</comment>
+ <comment xml:lang="nb">Kjørbar fil for DOS/Windows</comment>
+ <comment xml:lang="nl">DOS/Windows-uitvoerbaar bestand</comment>
+ <comment xml:lang="nn">DOS/Windows køyrbar fil</comment>
+ <comment xml:lang="pl">Program DOS/Windows</comment>
+ <comment xml:lang="pt">executável DOS/Windows</comment>
+ <comment xml:lang="pt_BR">Executável do DOS/Windows</comment>
+ <comment xml:lang="ro">Executabil DOS/Windows</comment>
+ <comment xml:lang="ru">исполняемый файл DOS/Windows</comment>
+ <comment xml:lang="sk">Spustiteľný súbor pre DOS/Windows</comment>
+ <comment xml:lang="sl">Izvedljiva datoteka DOS/Windows</comment>
+ <comment xml:lang="sq">I ekzekutueshëm DOS/Windows</comment>
+ <comment xml:lang="sr">ДОС/Виндоуз извршна датотека</comment>
+ <comment xml:lang="sv">Körbar DOS/Windows-fil</comment>
+ <comment xml:lang="uk">виконуваний файл DOS/Windows</comment>
+ <comment xml:lang="vi">Tập tin có thực hiện được DOS/Windows</comment>
+ <comment xml:lang="zh_CN">DOS/Windows 可执行文件</comment>
+ <comment xml:lang="zh_TW">DOS/Windows 可執行檔</comment>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="50">
+ <match value="MZ" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.exe"/>
+ </mime-type>
+ <mime-type type="application/x-mswinurl">
+ <comment>Internet shortcut</comment>
+ <comment xml:lang="ar">اختصار الإنترنت</comment>
+ <comment xml:lang="be@latin">Sieciŭnaja spasyłka</comment>
+ <comment xml:lang="bg">Адрес в Интернет</comment>
+ <comment xml:lang="ca">drecera d'Internet</comment>
+ <comment xml:lang="cs">Odkaz do Internetu</comment>
+ <comment xml:lang="da">Internetgenvej</comment>
+ <comment xml:lang="de">Internet-Verweis</comment>
+ <comment xml:lang="es">acceso directo a Internet</comment>
+ <comment xml:lang="eu">Interneteko lasterbidea</comment>
+ <comment xml:lang="fi">Internet-pikakuvake</comment>
+ <comment xml:lang="fo">Alnetssnarvegur</comment>
+ <comment xml:lang="fr">raccourci Internet</comment>
+ <comment xml:lang="ga">aicearra Idirlín</comment>
+ <comment xml:lang="gl">atallo de Internet</comment>
+ <comment xml:lang="he">קיצור דרך של האינטרנט</comment>
+ <comment xml:lang="hu">Internetes indítóikon</comment>
+ <comment xml:lang="id">Jalan pintas Internet</comment>
+ <comment xml:lang="it">Scorciatoia Internet</comment>
+ <comment xml:lang="ja">インターネットショートカット</comment>
+ <comment xml:lang="kk">Интернет сілтемесі</comment>
+ <comment xml:lang="ko">인터넷 단축아이콘</comment>
+ <comment xml:lang="lt">Interneto nuoroda</comment>
+ <comment xml:lang="lv">Interneta īsceļš</comment>
+ <comment xml:lang="nb">Internettsnarvei</comment>
+ <comment xml:lang="nl">internetkoppeling</comment>
+ <comment xml:lang="nn">Internett-snarveg</comment>
+ <comment xml:lang="pl">Skrót internetowy</comment>
+ <comment xml:lang="pt_BR">Atalho da internet</comment>
+ <comment xml:lang="ro">Scurtătură Internet</comment>
+ <comment xml:lang="ru">Интернет-ссылка</comment>
+ <comment xml:lang="sk">Internetový odkaz</comment>
+ <comment xml:lang="sl">Internetna bližnjica</comment>
+ <comment xml:lang="sq">Shkurtim internet</comment>
+ <comment xml:lang="sv">Internetgenväg</comment>
+ <comment xml:lang="uk">інтернет-посилання</comment>
+ <comment xml:lang="vi">Lối tắt Internet</comment>
+ <comment xml:lang="zh_CN">Internet 快捷方式</comment>
+ <comment xml:lang="zh_TW">網際網路捷徑</comment>
+ <magic priority="50">
+ <match value="InternetShortcut" type="string" offset="1"/>
+ <match value="DEFAULT" type="string" offset="1">
+ <match value="BASEURL=" type="string" offset="11"/>
+ </match>
+ </magic>
+ <glob pattern="*.url"/>
+ </mime-type>
+ <mime-type type="application/x-mswrite">
+ <comment>WRI document</comment>
+ <comment xml:lang="ar">مستند WRI</comment>
+ <comment xml:lang="be@latin">Dakument WRI</comment>
+ <comment xml:lang="bg">Документ — WRI</comment>
+ <comment xml:lang="ca">document WRI</comment>
+ <comment xml:lang="cs">Dokument WRI</comment>
+ <comment xml:lang="da">WRI-dokument</comment>
+ <comment xml:lang="de">WRI-Dokument</comment>
+ <comment xml:lang="en_GB">WRI document</comment>
+ <comment xml:lang="eo">WRI-dokumento</comment>
+ <comment xml:lang="es">documento WRI</comment>
+ <comment xml:lang="eu">WRI dokumentua</comment>
+ <comment xml:lang="fi">WRI-asiakirja</comment>
+ <comment xml:lang="fo">WRI skjal</comment>
+ <comment xml:lang="fr">document WRI</comment>
+ <comment xml:lang="ga">cáipéis WRI</comment>
+ <comment xml:lang="gl">documento WRI</comment>
+ <comment xml:lang="he">מסמך WRI</comment>
+ <comment xml:lang="hu">WRI dokumentum</comment>
+ <comment xml:lang="id">Dokumen WRI</comment>
+ <comment xml:lang="it">Documento WRI</comment>
+ <comment xml:lang="ja">WRI ドキュメント</comment>
+ <comment xml:lang="kk">WRI құжаты</comment>
+ <comment xml:lang="ko">WRI 문서</comment>
+ <comment xml:lang="lt">WRI dokumentas</comment>
+ <comment xml:lang="lv">WRI dokuments</comment>
+ <comment xml:lang="nb">WRI-dokument</comment>
+ <comment xml:lang="nl">WRI-document</comment>
+ <comment xml:lang="nn">WRI-dokument</comment>
+ <comment xml:lang="pl">Dokument WRI</comment>
+ <comment xml:lang="pt_BR">Documento WRI</comment>
+ <comment xml:lang="ro">Document WRI</comment>
+ <comment xml:lang="ru">документ WRI</comment>
+ <comment xml:lang="sk">Dokument WRI</comment>
+ <comment xml:lang="sl">Dokument WRI</comment>
+ <comment xml:lang="sq">Dokument WRI</comment>
+ <comment xml:lang="sv">WRI-dokument</comment>
+ <comment xml:lang="uk">документ WRI</comment>
+ <comment xml:lang="vi">Tài liệu WRI</comment>
+ <comment xml:lang="zh_CN">WRI 文档</comment>
+ <comment xml:lang="zh_TW">WRI 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.wri"/>
+ </mime-type>
+ <mime-type type="application/x-msx-rom">
+ <comment>MSX ROM</comment>
+ <comment xml:lang="ar">MSX ROM</comment>
+ <comment xml:lang="be@latin">MSX ROM</comment>
+ <comment xml:lang="bg">ROM — MSX</comment>
+ <comment xml:lang="ca">ROM de MSX</comment>
+ <comment xml:lang="cs">ROM pro MSX</comment>
+ <comment xml:lang="cy">ROM MSX</comment>
+ <comment xml:lang="da">MSX-rom</comment>
+ <comment xml:lang="de">MSX-ROM</comment>
+ <comment xml:lang="el">εικόνα μνήμης ROM MSX</comment>
+ <comment xml:lang="en_GB">MSX ROM</comment>
+ <comment xml:lang="eo">MSX-NLM</comment>
+ <comment xml:lang="es">ROM de MSX</comment>
+ <comment xml:lang="eu">MSX-ko ROMa</comment>
+ <comment xml:lang="fi">MSX-ROM</comment>
+ <comment xml:lang="fo">MSX ROM</comment>
+ <comment xml:lang="fr">ROM MSX</comment>
+ <comment xml:lang="ga">ROM MSX</comment>
+ <comment xml:lang="gl">ROM de MSX</comment>
+ <comment xml:lang="he">MSX ROM</comment>
+ <comment xml:lang="hu">MSX ROM</comment>
+ <comment xml:lang="id">Memori baca-saja MSX</comment>
+ <comment xml:lang="it">ROM MSX</comment>
+ <comment xml:lang="ja">MSX ROM</comment>
+ <comment xml:lang="kk">MSX ROM</comment>
+ <comment xml:lang="ko">MSX 롬</comment>
+ <comment xml:lang="lt">MSX ROM</comment>
+ <comment xml:lang="lv">MSX ROM</comment>
+ <comment xml:lang="ms">ROM MSX</comment>
+ <comment xml:lang="nb">MSX-ROM</comment>
+ <comment xml:lang="nl">MSX-ROM</comment>
+ <comment xml:lang="nn">MSX-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli MSX</comment>
+ <comment xml:lang="pt">ROM MSX</comment>
+ <comment xml:lang="pt_BR">ROM do MSX</comment>
+ <comment xml:lang="ro">ROM MSX</comment>
+ <comment xml:lang="ru">MSX ROM</comment>
+ <comment xml:lang="sk">ROM pre MSX</comment>
+ <comment xml:lang="sl">Bralni pomnilnik MSX</comment>
+ <comment xml:lang="sq">ROM MSX</comment>
+ <comment xml:lang="sr">MSX ром</comment>
+ <comment xml:lang="sv">MSX-rom</comment>
+ <comment xml:lang="uk">ППП MSX</comment>
+ <comment xml:lang="vi">ROM MSX</comment>
+ <comment xml:lang="zh_CN">MSX ROM</comment>
+ <comment xml:lang="zh_TW">MSX ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.msx"/>
+ </mime-type>
+ <mime-type type="application/x-m4">
+ <comment>M4 macro</comment>
+ <comment xml:lang="ar">M4 macro</comment>
+ <comment xml:lang="be@latin">Makras M4</comment>
+ <comment xml:lang="bg">Макроси — M4</comment>
+ <comment xml:lang="ca">macro M4</comment>
+ <comment xml:lang="cs">Makro M4</comment>
+ <comment xml:lang="da">M4-makro</comment>
+ <comment xml:lang="de">M4-Makro</comment>
+ <comment xml:lang="en_GB">M4 macro</comment>
+ <comment xml:lang="es">macro M4</comment>
+ <comment xml:lang="eu">M4 makroa</comment>
+ <comment xml:lang="fi">M4-makro</comment>
+ <comment xml:lang="fo">M4 fjølvi</comment>
+ <comment xml:lang="fr">macro M4</comment>
+ <comment xml:lang="ga">macra M4</comment>
+ <comment xml:lang="gl">macro M4</comment>
+ <comment xml:lang="he">מאקרו M4</comment>
+ <comment xml:lang="hu">M4 makró</comment>
+ <comment xml:lang="id">Makro M4</comment>
+ <comment xml:lang="it">Macro M4</comment>
+ <comment xml:lang="ja">M4 マクロ</comment>
+ <comment xml:lang="kk">M4 макросы</comment>
+ <comment xml:lang="ko">M4 매크로</comment>
+ <comment xml:lang="lt">M4 macro</comment>
+ <comment xml:lang="lv">M4 makross</comment>
+ <comment xml:lang="nb">M4-makro</comment>
+ <comment xml:lang="nl">M4-macro</comment>
+ <comment xml:lang="nn">M4-makro</comment>
+ <comment xml:lang="pl">Makro M4</comment>
+ <comment xml:lang="pt_BR">Macro M4</comment>
+ <comment xml:lang="ro">Macro M4</comment>
+ <comment xml:lang="ru">макрос M4</comment>
+ <comment xml:lang="sk">Makro M4</comment>
+ <comment xml:lang="sl">Makro datoteka M4</comment>
+ <comment xml:lang="sq">Macro M4</comment>
+ <comment xml:lang="sv">M4-makro</comment>
+ <comment xml:lang="uk">макрос M4</comment>
+ <comment xml:lang="vi">Vĩ lệnh M4</comment>
+ <comment xml:lang="zh_CN">M4 宏</comment>
+ <comment xml:lang="zh_TW">M4 巨集</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.m4"/>
+ </mime-type>
+ <mime-type type="application/x-n64-rom">
+ <comment>Nintendo64 ROM</comment>
+ <comment xml:lang="ar">Nintendo64 ROM</comment>
+ <comment xml:lang="be@latin">Nintendo64 ROM</comment>
+ <comment xml:lang="bg">ROM — Nintendo64</comment>
+ <comment xml:lang="ca">ROM de Nintendo64</comment>
+ <comment xml:lang="cs">ROM pro Nintendo64</comment>
+ <comment xml:lang="da">Nintendo64-rom</comment>
+ <comment xml:lang="de">Nintendo64-ROM</comment>
+ <comment xml:lang="el">εικόνα μνήμης ROM Nintendo64</comment>
+ <comment xml:lang="en_GB">Nintendo64 ROM</comment>
+ <comment xml:lang="eo">Nintendo64-NLM</comment>
+ <comment xml:lang="es">ROM de Nintendo64</comment>
+ <comment xml:lang="eu">Nintendo64-ko ROMa</comment>
+ <comment xml:lang="fi">Nintendo64-ROM</comment>
+ <comment xml:lang="fo">Nintendo64 ROM</comment>
+ <comment xml:lang="fr">ROM Nintendo64</comment>
+ <comment xml:lang="ga">ROM Nintendo64</comment>
+ <comment xml:lang="gl">ROM de Nintendo64</comment>
+ <comment xml:lang="he">ROM של Nןמאקמגם64</comment>
+ <comment xml:lang="hu">Nintendo64 ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Nintendo64</comment>
+ <comment xml:lang="it">ROM Nintendo64</comment>
+ <comment xml:lang="ja">Nintendo64 ROM</comment>
+ <comment xml:lang="kk">Nintendo64 ROM</comment>
+ <comment xml:lang="ko">닌텐도 64 롬</comment>
+ <comment xml:lang="lt">Nintendo64 ROM</comment>
+ <comment xml:lang="lv">Nintendo64 ROM</comment>
+ <comment xml:lang="ms">ROM Nintendo64</comment>
+ <comment xml:lang="nb">Nintendo64-ROM</comment>
+ <comment xml:lang="nl">Nintendo64-ROM</comment>
+ <comment xml:lang="nn">Nintendo64-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Nintendo64</comment>
+ <comment xml:lang="pt">ROM Nintendo64</comment>
+ <comment xml:lang="pt_BR">ROM do Nintendo64</comment>
+ <comment xml:lang="ro">ROM Nintendo64</comment>
+ <comment xml:lang="ru">Nintendo64 ROM</comment>
+ <comment xml:lang="sk">ROM pre Nintendo64</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Nintendo64</comment>
+ <comment xml:lang="sq">ROM Nintendo64</comment>
+ <comment xml:lang="sr">Нинтендо64 РОМ</comment>
+ <comment xml:lang="sv">Nintendo64-rom</comment>
+ <comment xml:lang="uk">ППП Nintendo64</comment>
+ <comment xml:lang="vi">ROM Nintendo64</comment>
+ <comment xml:lang="zh_CN">Nintendo64 ROM</comment>
+ <comment xml:lang="zh_TW">Nintendo64 ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.n64"/>
+ </mime-type>
+ <mime-type type="application/x-nautilus-link">
+ <comment>Nautilus link</comment>
+ <comment xml:lang="ar">وصلة Nautilus</comment>
+ <comment xml:lang="az">Nautilus körpüsü</comment>
+ <comment xml:lang="be@latin">Spasyłka Nautilus</comment>
+ <comment xml:lang="bg">Връзка — Nautilus</comment>
+ <comment xml:lang="ca">enllaç de Nautilus</comment>
+ <comment xml:lang="cs">Odkaz Nautilus</comment>
+ <comment xml:lang="cy">Cyswllt Nautilus</comment>
+ <comment xml:lang="da">Nautilus-henvisning</comment>
+ <comment xml:lang="de">Nautilus-Verknüpfung</comment>
+ <comment xml:lang="el">σύνδεσμος Nautilus</comment>
+ <comment xml:lang="en_GB">Nautilus link</comment>
+ <comment xml:lang="eo">Nautilus-ligilo</comment>
+ <comment xml:lang="es">enlace de Nautilus</comment>
+ <comment xml:lang="eu">Nautilus esteka</comment>
+ <comment xml:lang="fi">Nautilus-linkki</comment>
+ <comment xml:lang="fo">Nautilus leinkja</comment>
+ <comment xml:lang="fr">lien Nautilus</comment>
+ <comment xml:lang="ga">nasc Nautilus</comment>
+ <comment xml:lang="gl">ligazón de nautilus</comment>
+ <comment xml:lang="he">קישור של Nautilus</comment>
+ <comment xml:lang="hu">Nautilus-link</comment>
+ <comment xml:lang="id">Taut Nautilus</comment>
+ <comment xml:lang="it">Collegamento Nautilus</comment>
+ <comment xml:lang="ja">Nautilus リンク</comment>
+ <comment xml:lang="kk">Nautilus сілтемесі</comment>
+ <comment xml:lang="ko">노틸러스 링크</comment>
+ <comment xml:lang="lt">Nautilus nuoroda</comment>
+ <comment xml:lang="lv">Nautilus saite</comment>
+ <comment xml:lang="ms">Pautan Nautilus</comment>
+ <comment xml:lang="nb">Nautilus-lenke</comment>
+ <comment xml:lang="nl">Nautilus-verwijzing</comment>
+ <comment xml:lang="nn">Nautilus-lenke</comment>
+ <comment xml:lang="pl">Odnośnik Nautilus</comment>
+ <comment xml:lang="pt">atalho Nautilus</comment>
+ <comment xml:lang="pt_BR">Link do Nautilus</comment>
+ <comment xml:lang="ro">Legătură Nautilus</comment>
+ <comment xml:lang="ru">ссылка Nautilus</comment>
+ <comment xml:lang="sk">Odkaz Nautilus</comment>
+ <comment xml:lang="sl">Datoteka povezave Nautilus</comment>
+ <comment xml:lang="sq">Lidhje Nautilus</comment>
+ <comment xml:lang="sr">Наутилус веза</comment>
+ <comment xml:lang="sv">Nautiluslänk</comment>
+ <comment xml:lang="uk">посилання Nautilus</comment>
+ <comment xml:lang="vi">Liên kết Nautilus</comment>
+ <comment xml:lang="zh_CN">Nautilus 链接</comment>
+ <comment xml:lang="zh_TW">Nautilus 鏈結</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="&lt;nautilus_object nautilus_link" type="string" offset="0:32"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-nes-rom">
+
+ <comment>NES ROM</comment>
+ <comment xml:lang="ar">NES ROM</comment>
+ <comment xml:lang="be@latin">NES ROM</comment>
+ <comment xml:lang="bg">ROM — NES</comment>
+ <comment xml:lang="ca">ROM de NES</comment>
+ <comment xml:lang="cs">ROM pro NES</comment>
+ <comment xml:lang="cy">ROM NES</comment>
+ <comment xml:lang="da">NES-rom</comment>
+ <comment xml:lang="de">NES-ROM</comment>
+ <comment xml:lang="el">εικόνα μνήμης ROM NES</comment>
+ <comment xml:lang="en_GB">NES ROM</comment>
+ <comment xml:lang="eo">NES-NLM</comment>
+ <comment xml:lang="es">ROM de NES</comment>
+ <comment xml:lang="eu">NES-eko ROMa</comment>
+ <comment xml:lang="fi">NES-ROM</comment>
+ <comment xml:lang="fo">NES ROM</comment>
+ <comment xml:lang="fr">ROM NES</comment>
+ <comment xml:lang="ga">ROM NES</comment>
+ <comment xml:lang="gl">ROM de NES</comment>
+ <comment xml:lang="he">ROM של NES</comment>
+ <comment xml:lang="hu">NES ROM</comment>
+ <comment xml:lang="id">Memori baca-saja NES</comment>
+ <comment xml:lang="it">ROM NES</comment>
+ <comment xml:lang="ja">ファミコン ROM</comment>
+ <comment xml:lang="kk">NES ROM</comment>
+ <comment xml:lang="ko">NES 롬</comment>
+ <comment xml:lang="lt">NES ROM</comment>
+ <comment xml:lang="lv">NES ROM</comment>
+ <comment xml:lang="ms">ROM NES</comment>
+ <comment xml:lang="nb">NES ROM</comment>
+ <comment xml:lang="nl">Nintendo</comment>
+ <comment xml:lang="nn">NES-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli NES</comment>
+ <comment xml:lang="pt">ROM NES</comment>
+ <comment xml:lang="pt_BR">ROM do NES</comment>
+ <comment xml:lang="ro">ROM NES</comment>
+ <comment xml:lang="ru">NES ROM</comment>
+ <comment xml:lang="sk">ROM pre NES</comment>
+ <comment xml:lang="sl">Bralni pomnilnik NES</comment>
+ <comment xml:lang="sq">ROM NES</comment>
+ <comment xml:lang="sr">NES ром</comment>
+ <comment xml:lang="sv">NES-rom</comment>
+ <comment xml:lang="uk">ППП NES</comment>
+ <comment xml:lang="vi">ROM NES</comment>
+ <comment xml:lang="zh_CN">NES ROM</comment>
+ <comment xml:lang="zh_TW">任天堂 ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.nes"/>
+ </mime-type>
+ <mime-type type="application/x-netcdf">
+ <comment>Unidata NetCDF document</comment>
+ <comment xml:lang="ar">مستند Unidata NetCDF</comment>
+ <comment xml:lang="be@latin">Dakument Unidata NetCDF</comment>
+ <comment xml:lang="bg">Документ — Unidata NetCDF</comment>
+ <comment xml:lang="ca">document Unidata NetCDF</comment>
+ <comment xml:lang="cs">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="da">Unidata NetCDF-dokument</comment>
+ <comment xml:lang="de">Unidata-NetCDF-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Unidata NetCDF</comment>
+ <comment xml:lang="en_GB">Unidata NetCDF document</comment>
+ <comment xml:lang="eo">dokumento en NetCDF-formato de Unidata</comment>
+ <comment xml:lang="es">documento de Unidata NetCDF</comment>
+ <comment xml:lang="eu">Unidata NetCDF dokumentua</comment>
+ <comment xml:lang="fi">Unidata NetCDF -asiakirja</comment>
+ <comment xml:lang="fo">Unidata NetCDF skjal</comment>
+ <comment xml:lang="fr">document Unidata NetCDF</comment>
+ <comment xml:lang="ga">cáipéis Unidata NetCDF</comment>
+ <comment xml:lang="gl">Documentno de Unixdata NetCDF</comment>
+ <comment xml:lang="he">מסמך של Unidata NetCDF</comment>
+ <comment xml:lang="hu">Unidata NetCDF-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Unidata NetCDF</comment>
+ <comment xml:lang="it">Documento Unidata NetCDF</comment>
+ <comment xml:lang="ja">Unidata NetCDF ドキュメント</comment>
+ <comment xml:lang="kk">Unidata NetCDF құжаты</comment>
+ <comment xml:lang="ko">Unidata NetCDF 문서</comment>
+ <comment xml:lang="lt">Unidata NetCDF dokumentas</comment>
+ <comment xml:lang="lv">Unidata NetCDF dokuments</comment>
+ <comment xml:lang="ms">Dokumen Unidata NetCDF</comment>
+ <comment xml:lang="nb">Unidata NetCDF-dokument</comment>
+ <comment xml:lang="nl">Unidata NetCDF-document</comment>
+ <comment xml:lang="nn">Unidata netCDF-dokument</comment>
+ <comment xml:lang="pl">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="pt">documento Unidata NetCDF</comment>
+ <comment xml:lang="pt_BR">Documento do Unidata NetCDF</comment>
+ <comment xml:lang="ro">Document Unidata NetCDF</comment>
+ <comment xml:lang="ru">документ Unidata NetCDF</comment>
+ <comment xml:lang="sk">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="sl">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="sq">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="sr">Unidata NetCDF документ</comment>
+ <comment xml:lang="sv">Unidata NetCDF-dokument</comment>
+ <comment xml:lang="uk">документ Unidata NetCDF</comment>
+ <comment xml:lang="vi">Tài liệu NetCDF Unidata</comment>
+ <comment xml:lang="zh_CN">Unidata NetCDF 文档</comment>
+ <comment xml:lang="zh_TW">Unidata NetCDF 文件</comment>
+ <acronym>NetCDF</acronym>
+ <expanded-acronym>Network Common Data Form</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.cdf"/>
+ <glob pattern="*.nc"/>
+ </mime-type>
+ <mime-type type="application/x-nzb">
+ <comment>NewzBin usenet index</comment>
+ <comment xml:lang="bg">Индекс — Usenet, NewzBin</comment>
+ <comment xml:lang="ca">índex d'Usenet NewzBin</comment>
+ <comment xml:lang="cs">Index NewzBin diskuzních skupin Usenet</comment>
+ <comment xml:lang="es">Índice NewzBin de usenet</comment>
+ <comment xml:lang="fr">index usenet </comment>
+ <comment xml:lang="gl">Índice de usenet NEwzBin</comment>
+ <comment xml:lang="he">אינדקס שרתי חדשות NewzBin</comment>
+ <comment xml:lang="id">Indeks usenet NewzBin</comment>
+ <comment xml:lang="it">Indice Usenet NewzBiz</comment>
+ <comment xml:lang="ja">NewzBin Usenet インデックス</comment>
+ <comment xml:lang="kk">NewzBin usenet индексі</comment>
+ <comment xml:lang="lv">NewzBin usenet rādītājs</comment>
+ <comment xml:lang="pl">Indeks grup dyskusyjnych NewzBin</comment>
+ <comment xml:lang="ru">индекс usenet NewzBin</comment>
+ <comment xml:lang="sl">Kazalo usenet NewzBin</comment>
+ <comment xml:lang="uk">покажчик usenet NewzBin</comment>
+ <sub-class-of type="application/xml"/>
+ <magic priority="80">
+ <match value="&lt;nzb" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.nzb"/>
+ </mime-type>
+ <mime-type type="application/x-object">
+ <comment>object code</comment>
+ <comment xml:lang="ar">رمز الكائن</comment>
+ <comment xml:lang="be@latin">abjektny kod</comment>
+ <comment xml:lang="bg">Обектен код</comment>
+ <comment xml:lang="ca">codi objecte</comment>
+ <comment xml:lang="cs">Objektový kód</comment>
+ <comment xml:lang="da">objektkode</comment>
+ <comment xml:lang="de">Objekt-Code</comment>
+ <comment xml:lang="el">μεταφρασμένος κώδικας</comment>
+ <comment xml:lang="en_GB">object code</comment>
+ <comment xml:lang="eo">celkodo</comment>
+ <comment xml:lang="es">código objeto</comment>
+ <comment xml:lang="eu">objektu kodea</comment>
+ <comment xml:lang="fi">objektikoodi</comment>
+ <comment xml:lang="fr">code objet</comment>
+ <comment xml:lang="ga">cód réada</comment>
+ <comment xml:lang="gl">código obxecto</comment>
+ <comment xml:lang="he">קוד אובייקט</comment>
+ <comment xml:lang="hu">tárgykód</comment>
+ <comment xml:lang="id">kode object</comment>
+ <comment xml:lang="it">Codice oggetto</comment>
+ <comment xml:lang="ja">オブジェクトコード</comment>
+ <comment xml:lang="kk">объектті коды</comment>
+ <comment xml:lang="ko">개체 코드</comment>
+ <comment xml:lang="lt">objektinis kodas</comment>
+ <comment xml:lang="lv">objekta kods</comment>
+ <comment xml:lang="ms">Kod objek</comment>
+ <comment xml:lang="nb">objektkode</comment>
+ <comment xml:lang="nl">objectcode</comment>
+ <comment xml:lang="nn">objektkode</comment>
+ <comment xml:lang="pl">Kod obiektowy</comment>
+ <comment xml:lang="pt">código de objecto</comment>
+ <comment xml:lang="pt_BR">código objeto</comment>
+ <comment xml:lang="ro">cod sursă obiect</comment>
+ <comment xml:lang="ru">объектный код</comment>
+ <comment xml:lang="sk">Objektový kód</comment>
+ <comment xml:lang="sl">predmetna koda</comment>
+ <comment xml:lang="sq">Kod objekti</comment>
+ <comment xml:lang="sr">објектни ко̂д</comment>
+ <comment xml:lang="sv">objektkod</comment>
+ <comment xml:lang="uk">об'єктний код</comment>
+ <comment xml:lang="vi">mã đối tượng</comment>
+ <comment xml:lang="zh_CN">目标代码</comment>
+ <comment xml:lang="zh_TW">目的碼</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="\177ELF" type="string" offset="0">
+ <match value="1" type="byte" offset="5">
+ <match value="1" type="little16" offset="16"/>
+ </match>
+ </match>
+ <match value="\177ELF" type="string" offset="0">
+ <match value="2" type="byte" offset="5">
+ <match value="1" type="big16" offset="16"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.o"/>
+ </mime-type>
+ <mime-type type="application/annodex">
+ <comment>Annodex exchange format</comment>
+ <comment xml:lang="ar">صيغة Annodex البديلة</comment>
+ <comment xml:lang="bg">Формат за обмяна — Annodex</comment>
+ <comment xml:lang="ca">format d'intercanvi Annodex</comment>
+ <comment xml:lang="cs">Výměnný formát Annodex</comment>
+ <comment xml:lang="da">Udvekslingsformat for Annodex</comment>
+ <comment xml:lang="de">Annodex-Wechselformat</comment>
+ <comment xml:lang="es">formato de intercambio Annodex</comment>
+ <comment xml:lang="eu">Annodex trukatze-formatua</comment>
+ <comment xml:lang="fi">Annodex-siirtomuoto</comment>
+ <comment xml:lang="fo">Annodex umbýtingarsnið</comment>
+ <comment xml:lang="fr">format d'échange Annodex</comment>
+ <comment xml:lang="ga">formáid mhalairte Annodex</comment>
+ <comment xml:lang="gl">formato intercambiábel de Annodex</comment>
+ <comment xml:lang="he">פורמט החלפת Annodex</comment>
+ <comment xml:lang="hu">Annodex csereformátum</comment>
+ <comment xml:lang="id">Format pertukaran Annodex</comment>
+ <comment xml:lang="it">Formato di scambio Annodex</comment>
+ <comment xml:lang="ja">Annodex 交換フォーマット</comment>
+ <comment xml:lang="kk">Annodex алмасу пішімі</comment>
+ <comment xml:lang="ko">Annodex 교환 형식</comment>
+ <comment xml:lang="lt">Annodex mainų formatas</comment>
+ <comment xml:lang="lv">Annodex apmaiņas formāts</comment>
+ <comment xml:lang="nl">Annodex-exchange</comment>
+ <comment xml:lang="pl">Format wymiany Annodex</comment>
+ <comment xml:lang="pt_BR">Formato de troca Annodex</comment>
+ <comment xml:lang="ro">Format schimb Annodex</comment>
+ <comment xml:lang="ru">формат обмена Annodex</comment>
+ <comment xml:lang="sk">Formát pre výmenu Annodex</comment>
+ <comment xml:lang="sl">Izmenjalna datoteka Annodex</comment>
+ <comment xml:lang="sv">Annodex-utväxlingsformat</comment>
+ <comment xml:lang="uk">формат обміну даними Annodex</comment>
+ <comment xml:lang="vi">Định dạng trao đổi Annodex</comment>
+ <comment xml:lang="zh_CN">Annodex 交换格式</comment>
+ <comment xml:lang="zh_TW">Annodex 交換格式</comment>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+ <match value="OggS" type="string" offset="0">
+ <match value="fishead\0" type="string" offset="28">
+ <match value="CMML\0\0\0\0" type="string" offset="56:512"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.anx"/>
+ <alias type="application/x-annodex"/>
+ </mime-type>
+ <mime-type type="video/annodex">
+ <comment>Annodex Video</comment>
+ <comment xml:lang="ar">Annodex مرئي</comment>
+ <comment xml:lang="bg">Видео — Annodex</comment>
+ <comment xml:lang="ca">Annodex Video</comment>
+ <comment xml:lang="cs">Annodex Video</comment>
+ <comment xml:lang="da">Annodexvideo</comment>
+ <comment xml:lang="de">Annodex-Video</comment>
+ <comment xml:lang="eo">Annodex-video</comment>
+ <comment xml:lang="es">vídeo Annodex</comment>
+ <comment xml:lang="eu">Annodex bideoa</comment>
+ <comment xml:lang="fi">Annodex-video</comment>
+ <comment xml:lang="fo">Annodex video</comment>
+ <comment xml:lang="fr">vidéo Annodex</comment>
+ <comment xml:lang="ga">físeán Annodex</comment>
+ <comment xml:lang="gl">vídeo de Annodex</comment>
+ <comment xml:lang="he">וידאו Annodex</comment>
+ <comment xml:lang="hu">Annodex videó</comment>
+ <comment xml:lang="id">Video Annodex</comment>
+ <comment xml:lang="it">Video Annodex</comment>
+ <comment xml:lang="ja">Annodex 動画</comment>
+ <comment xml:lang="kk">Annodex видеосы</comment>
+ <comment xml:lang="ko">Annodex 비디오</comment>
+ <comment xml:lang="lt">Annodex vaizdo įrašas</comment>
+ <comment xml:lang="lv">Annodex video</comment>
+ <comment xml:lang="nl">Annodex Video</comment>
+ <comment xml:lang="pl">Plik wideo Annodex</comment>
+ <comment xml:lang="pt_BR">Vídeo Annodex</comment>
+ <comment xml:lang="ro">Video Annodex</comment>
+ <comment xml:lang="ru">видео Annodex</comment>
+ <comment xml:lang="sk">Video Annodex</comment>
+ <comment xml:lang="sl">Video datoteka Annodex</comment>
+ <comment xml:lang="sv">Annodex-video</comment>
+ <comment xml:lang="uk">відеокліп Annodex</comment>
+ <comment xml:lang="vi">Ảnh động Annodex</comment>
+ <comment xml:lang="zh_CN">Annodex 视频</comment>
+ <comment xml:lang="zh_TW">Annodex 視訊</comment>
+ <sub-class-of type="application/annodex"/>
+ <magic priority="50">
+ <match value="OggS" type="string" offset="0">
+ <match value="fishead\0" type="string" offset="28">
+ <match value="CMML\0\0\0\0" type="string" offset="56:512"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.axv"/>
+ <alias type="video/x-annodex"/>
+ </mime-type>
+ <mime-type type="audio/annodex">
+ <comment>Annodex Audio</comment>
+ <comment xml:lang="ar">Annodex سمعي</comment>
+ <comment xml:lang="bg">Аудио — Annodex</comment>
+ <comment xml:lang="ca">Annodex Audio</comment>
+ <comment xml:lang="cs">Annodex Audio</comment>
+ <comment xml:lang="da">Annodexlyd</comment>
+ <comment xml:lang="de">Annodex-Audio</comment>
+ <comment xml:lang="eo">Annodex-sondosiero</comment>
+ <comment xml:lang="es">sonido Annodex</comment>
+ <comment xml:lang="eu">Annodex audioa</comment>
+ <comment xml:lang="fi">Annodex-ääni</comment>
+ <comment xml:lang="fo">Annodex ljóður</comment>
+ <comment xml:lang="fr">audio Annodex</comment>
+ <comment xml:lang="ga">fuaim Annodex</comment>
+ <comment xml:lang="gl">son de Annodex</comment>
+ <comment xml:lang="he">שמע Annodex</comment>
+ <comment xml:lang="hu">Annodex hang</comment>
+ <comment xml:lang="id">Audio Annodex</comment>
+ <comment xml:lang="it">Audio Annodex</comment>
+ <comment xml:lang="ja">Annodex オーディオ</comment>
+ <comment xml:lang="kk">Annodex аудиосы</comment>
+ <comment xml:lang="ko">Annodex 오디오</comment>
+ <comment xml:lang="lt">Annodex garso įrašas</comment>
+ <comment xml:lang="lv">Annodex audio</comment>
+ <comment xml:lang="nl">Annodex Audio</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Annodex</comment>
+ <comment xml:lang="pt_BR">Áudio Annodex</comment>
+ <comment xml:lang="ro">Audio Annodex</comment>
+ <comment xml:lang="ru">аудио Annodex</comment>
+ <comment xml:lang="sk">Zvuk Annodex</comment>
+ <comment xml:lang="sl">Zvočna datoteka Annodex</comment>
+ <comment xml:lang="sv">Annodex-ljud</comment>
+ <comment xml:lang="uk">звук Annodex</comment>
+ <comment xml:lang="vi">Âm thanh Annodex</comment>
+ <comment xml:lang="zh_CN">Annodex 音频</comment>
+ <comment xml:lang="zh_TW">Annodex 音訊</comment>
+ <sub-class-of type="application/annodex"/>
+ <magic priority="50">
+ <match value="OggS" type="string" offset="0">
+ <match value="fishead\0" type="string" offset="28">
+ <match value="CMML\0\0\0\0" type="string" offset="56:512"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.axa"/>
+ <alias type="audio/x-annodex"/>
+ </mime-type>
+ <mime-type type="application/ogg">
+ <comment>Ogg multimedia file</comment>
+ <comment xml:lang="ar">ملف وسائط متعددة Ogg</comment>
+ <comment xml:lang="be@latin">Multymedyjny fajł Ogg</comment>
+ <comment xml:lang="bg">Мултимедия — Ogg</comment>
+ <comment xml:lang="ca">fitxer Ogg multimèdia</comment>
+ <comment xml:lang="cs">Soubor multimédií Ogg</comment>
+ <comment xml:lang="da">Ogg multimedie-fil</comment>
+ <comment xml:lang="de">Ogg-Multimediadatei</comment>
+ <comment xml:lang="es">archivo multimedia Ogg</comment>
+ <comment xml:lang="eu">Ogg multimediako fitxategia</comment>
+ <comment xml:lang="fi">Ogg-multimediatiedosto</comment>
+ <comment xml:lang="fo">Ogg margmiðlafíla</comment>
+ <comment xml:lang="fr">fichier multimédia Ogg</comment>
+ <comment xml:lang="ga">comhad ilmheán Ogg</comment>
+ <comment xml:lang="gl">ficheiro multimedia Ogg</comment>
+ <comment xml:lang="he">קובץ מולטימדיה Ogg</comment>
+ <comment xml:lang="hu">Ogg multimédiafájl</comment>
+ <comment xml:lang="id">Berkas multimedia Ogg</comment>
+ <comment xml:lang="it">File multimediale Ogg</comment>
+ <comment xml:lang="ja">Ogg マルチメディアファイル</comment>
+ <comment xml:lang="kk">Ogg мультимедиа файлы</comment>
+ <comment xml:lang="ko">Ogg 멀티미디어 파일</comment>
+ <comment xml:lang="lt">Ogg multimedijos failas</comment>
+ <comment xml:lang="lv">Ogg multimediju fails</comment>
+ <comment xml:lang="nb">Ogg-multimediafil</comment>
+ <comment xml:lang="nl">Ogg-multimediabestand</comment>
+ <comment xml:lang="nn">Ogg multimediafil</comment>
+ <comment xml:lang="pl">Plik multimedialny Ogg</comment>
+ <comment xml:lang="pt_BR">Arquivo multimídia Ogg</comment>
+ <comment xml:lang="ro">Fișier multimedia Ogg</comment>
+ <comment xml:lang="ru">мультимедийный файл Ogg</comment>
+ <comment xml:lang="sk">Súbor multimédií Ogg</comment>
+ <comment xml:lang="sl">Večpredstavnostna datoteka Ogg</comment>
+ <comment xml:lang="sq">File multimedial Ogg</comment>
+ <comment xml:lang="sv">Ogg-multimediafil</comment>
+ <comment xml:lang="uk">мультимедійний файл Ogg</comment>
+ <comment xml:lang="vi">Tập tin đa phương tiện Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg 多媒体文件</comment>
+ <comment xml:lang="zh_TW">Ogg 多媒體檔案</comment>
+ <generic-icon name="video-x-generic"/>
+ <alias type="application/x-ogg"/>
+ <magic priority="50">
+ <match value="OggS" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ogx"/>
+ </mime-type>
+ <mime-type type="audio/ogg">
+ <comment>Ogg Audio</comment>
+ <comment xml:lang="ar">Ogg سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg</comment>
+ <comment xml:lang="bg">Аудио — Ogg</comment>
+ <comment xml:lang="ca">àudio Ogg</comment>
+ <comment xml:lang="cs">Zvuk Ogg</comment>
+ <comment xml:lang="da">Ogg-lyd</comment>
+ <comment xml:lang="de">Ogg-Audio</comment>
+ <comment xml:lang="es">sonido Ogg</comment>
+ <comment xml:lang="eu">Ogg audioa</comment>
+ <comment xml:lang="fi">Ogg-ääni</comment>
+ <comment xml:lang="fo">Ogg ljóður</comment>
+ <comment xml:lang="fr">audio Ogg</comment>
+ <comment xml:lang="ga">fuaim Ogg</comment>
+ <comment xml:lang="gl">son Ogg</comment>
+ <comment xml:lang="he">שמע Ogg</comment>
+ <comment xml:lang="hu">Ogg hang</comment>
+ <comment xml:lang="id">Audio Ogg</comment>
+ <comment xml:lang="it">Audio Ogg</comment>
+ <comment xml:lang="ja">Ogg オーディオ</comment>
+ <comment xml:lang="kk">Ogg аудиосы</comment>
+ <comment xml:lang="ko">Ogg 오디오</comment>
+ <comment xml:lang="lt">Ogg garso įrašas</comment>
+ <comment xml:lang="lv">Ogg audio</comment>
+ <comment xml:lang="nb">Ogg lyd</comment>
+ <comment xml:lang="nl">Ogg-audio</comment>
+ <comment xml:lang="nn">Ogg-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg</comment>
+ <comment xml:lang="pt_BR">Áudio Ogg</comment>
+ <comment xml:lang="ro">Audio Ogg</comment>
+ <comment xml:lang="ru">аудио Ogg</comment>
+ <comment xml:lang="sk">Zvuk Ogg</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg</comment>
+ <comment xml:lang="sq">Audio Ogg</comment>
+ <comment xml:lang="sv">Ogg-ljud</comment>
+ <comment xml:lang="uk">звук ogg</comment>
+ <comment xml:lang="vi">Âm thanh Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg 音频</comment>
+ <comment xml:lang="zh_TW">Ogg 音訊</comment>
+ <sub-class-of type="application/ogg"/>
+ <magic priority="50">
+ <match value="OggS" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.oga"/>
+ <glob pattern="*.ogg"/>
+ <glob pattern="*.spx"/>
+ <alias type="audio/x-ogg"/>
+ </mime-type>
+ <mime-type type="video/ogg">
+ <comment>Ogg Video</comment>
+ <comment xml:lang="ar">Ogg مرئي</comment>
+ <comment xml:lang="be@latin">Videa Ogg</comment>
+ <comment xml:lang="bg">Видео — Ogg</comment>
+ <comment xml:lang="ca">vídeo Ogg</comment>
+ <comment xml:lang="cs">Video Ogg</comment>
+ <comment xml:lang="da">Ogg-video</comment>
+ <comment xml:lang="de">Ogg-Video</comment>
+ <comment xml:lang="es">vídeo Ogg</comment>
+ <comment xml:lang="eu">Ogg bideoa</comment>
+ <comment xml:lang="fi">Ogg-video</comment>
+ <comment xml:lang="fo">Ogg Video</comment>
+ <comment xml:lang="fr">vidéo Ogg</comment>
+ <comment xml:lang="ga">físeán Ogg</comment>
+ <comment xml:lang="gl">vídeo Ogg</comment>
+ <comment xml:lang="he">וידאו Ogg</comment>
+ <comment xml:lang="hu">Ogg videó</comment>
+ <comment xml:lang="id">Video Ogg</comment>
+ <comment xml:lang="it">Video Ogg</comment>
+ <comment xml:lang="ja">Ogg 動画</comment>
+ <comment xml:lang="kk">Ogg видеосы</comment>
+ <comment xml:lang="ko">Ogg 비디오</comment>
+ <comment xml:lang="lt">Ogg vaizdo įrašas</comment>
+ <comment xml:lang="lv">Ogg video</comment>
+ <comment xml:lang="nb">Ogg video</comment>
+ <comment xml:lang="nl">Ogg-video</comment>
+ <comment xml:lang="nn">Ogg-video</comment>
+ <comment xml:lang="pl">Plik wideo Ogg</comment>
+ <comment xml:lang="pt_BR">Vídeo Ogg</comment>
+ <comment xml:lang="ro">Video Ogg</comment>
+ <comment xml:lang="ru">видео Ogg</comment>
+ <comment xml:lang="sk">Video Ogg</comment>
+ <comment xml:lang="sl">Video datoteka Ogg</comment>
+ <comment xml:lang="sq">Video Ogg</comment>
+ <comment xml:lang="sv">Ogg-video</comment>
+ <comment xml:lang="uk">відеокліп ogg</comment>
+ <comment xml:lang="vi">Ảnh động Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg 视频</comment>
+ <comment xml:lang="zh_TW">Ogg 視訊</comment>
+ <sub-class-of type="application/ogg"/>
+ <magic priority="50">
+ <match value="OggS" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ogv"/>
+ <alias type="video/x-ogg"/>
+ </mime-type>
+ <mime-type type="audio/x-vorbis+ogg">
+ <comment>Ogg Vorbis audio</comment>
+ <comment xml:lang="ar">Ogg Vorbis سمعي</comment>
+ <comment xml:lang="az">Ogg Vorbis audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg Vorbis</comment>
+ <comment xml:lang="bg">Аудио — Ogg Vorbis</comment>
+ <comment xml:lang="ca">àudio Ogg Vorbis</comment>
+ <comment xml:lang="cs">Zvuk Ogg Vorbis</comment>
+ <comment xml:lang="cy">Sain Ogg Vorbis</comment>
+ <comment xml:lang="da">Ogg Vorbis-lyd</comment>
+ <comment xml:lang="de">Ogg-Vorbis-Audio</comment>
+ <comment xml:lang="el">ήχος Ogg Vobris</comment>
+ <comment xml:lang="eo">Ogg-Vorbis-sondosiero</comment>
+ <comment xml:lang="es">sonido Ogg Vorbis</comment>
+ <comment xml:lang="eu">Ogg Vorbis audioa</comment>
+ <comment xml:lang="fi">Ogg Vorbis -ääni</comment>
+ <comment xml:lang="fo">Ogg Vorbis ljóður</comment>
+ <comment xml:lang="fr">audio Ogg Vorbis</comment>
+ <comment xml:lang="ga">fuaim Ogg Vorbis</comment>
+ <comment xml:lang="gl">son Ogg Vorbis</comment>
+ <comment xml:lang="he">שמע Ogg Vorbis</comment>
+ <comment xml:lang="hu">Ogg Vorbis hang</comment>
+ <comment xml:lang="id">Audio Ogg Vorbis</comment>
+ <comment xml:lang="it">Audio Ogg Vorbis</comment>
+ <comment xml:lang="ja">Ogg Vorbis オーディオ</comment>
+ <comment xml:lang="kk">Ogg Vorbis аудиосы</comment>
+ <comment xml:lang="ko">Ogg Vorbis 오디오</comment>
+ <comment xml:lang="lt">Ogg Vorbis garso įrašas</comment>
+ <comment xml:lang="lv">Ogg Vorbis audio</comment>
+ <comment xml:lang="ms">Audio Ogg Vorbis</comment>
+ <comment xml:lang="nb">Ogg Vorbis lyd</comment>
+ <comment xml:lang="nl">Ogg Vorbis-audio</comment>
+ <comment xml:lang="nn">Ogg Vorbis-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg Vorbis</comment>
+ <comment xml:lang="pt">áudio Ogg Vorbis</comment>
+ <comment xml:lang="pt_BR">Áudio do Ogg Vorbis</comment>
+ <comment xml:lang="ro">Audio Ogg Vorbis</comment>
+ <comment xml:lang="ru">аудио Ogg Vorbis</comment>
+ <comment xml:lang="sk">Zvuk Ogg Vorbis</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg Vorbis</comment>
+ <comment xml:lang="sq">Audio Ogg Vorbis</comment>
+ <comment xml:lang="sr">Ог-ворбис звучни запис</comment>
+ <comment xml:lang="sv">Ogg Vorbis-ljud</comment>
+ <comment xml:lang="uk">звук ogg Vorbis</comment>
+ <comment xml:lang="vi">Âm thanh Vorbis Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg Vorbis 音频</comment>
+ <comment xml:lang="zh_TW">Ogg Vorbis 音訊</comment>
+ <sub-class-of type="audio/ogg"/>
+ <alias type="audio/vorbis"/>
+ <alias type="audio/x-vorbis"/>
+ <magic priority="80">
+ <match value="OggS" type="string" offset="0">
+ <match value="\x01vorbis" type="string" offset="28"/>
+ </match>
+ </magic>
+ <glob pattern="*.ogg"/>
+ </mime-type>
+ <mime-type type="audio/x-flac+ogg">
+ <comment>Ogg FLAC audio</comment>
+ <comment xml:lang="ar">Ogg FLAC سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg FLAC</comment>
+ <comment xml:lang="bg">Аудио — Ogg FLAC</comment>
+ <comment xml:lang="ca">àudio Ogg FLAC</comment>
+ <comment xml:lang="cs">Zvuk Ogg FLAC</comment>
+ <comment xml:lang="da">Ogg FLAC-lyd</comment>
+ <comment xml:lang="de">Ogg-FLAC-Audio</comment>
+ <comment xml:lang="es">sonido Ogg FLAC</comment>
+ <comment xml:lang="eu">Ogg FLAC audioa</comment>
+ <comment xml:lang="fi">Ogg FLAC -ääni</comment>
+ <comment xml:lang="fo">Ogg FLAC ljóður</comment>
+ <comment xml:lang="fr">audio Ogg FLAC</comment>
+ <comment xml:lang="ga">fuaim Ogg FLAC</comment>
+ <comment xml:lang="gl">son Ogg FLAC</comment>
+ <comment xml:lang="he">שמע Ogg FLAC</comment>
+ <comment xml:lang="hu">Ogg FLAC hang</comment>
+ <comment xml:lang="id">Audio Ogg FLAC</comment>
+ <comment xml:lang="it">Audio Ogg FLAC</comment>
+ <comment xml:lang="ja">Ogg FLAC オーディオ</comment>
+ <comment xml:lang="kk">Ogg FLAC аудиосы</comment>
+ <comment xml:lang="ko">Ogg FLAC 오디오</comment>
+ <comment xml:lang="lt">Ogg FLAC garso įrašas</comment>
+ <comment xml:lang="lv">Ogg FLAC audio</comment>
+ <comment xml:lang="nb">Ogg FLAC-lyd</comment>
+ <comment xml:lang="nl">Ogg FLAC-audio</comment>
+ <comment xml:lang="nn">Ogg FLAC-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg FLAC</comment>
+ <comment xml:lang="pt_BR">Áudio FLAC Ogg</comment>
+ <comment xml:lang="ro">Audio Ogg FLAC</comment>
+ <comment xml:lang="ru">аудио Ogg FLAC</comment>
+ <comment xml:lang="sk">Zvuk Ogg FLAC</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg FLAC</comment>
+ <comment xml:lang="sq">Audio Ogg FLAC</comment>
+ <comment xml:lang="sv">Ogg FLAC-ljud</comment>
+ <comment xml:lang="uk">звук ogg FLAC</comment>
+ <comment xml:lang="vi">Âm thanh FLAC Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg FLAC 音频</comment>
+ <comment xml:lang="zh_TW">Ogg FLAC 音訊</comment>
+ <sub-class-of type="audio/ogg"/>
+ <alias type="audio/x-oggflac"/>
+ <magic priority="80">
+ <match value="OggS" type="string" offset="0">
+ <match value="fLaC" type="string" offset="28"/>
+ </match>
+ <match value="OggS" type="string" offset="0">
+ <match value="\177FLAC" type="string" offset="28"/>
+ </match>
+ </magic>
+ <glob pattern="*.ogg"/>
+ </mime-type>
+ <mime-type type="audio/x-speex+ogg">
+ <comment>Ogg Speex audio</comment>
+ <comment xml:lang="ar">Ogg Speex سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg Speex</comment>
+ <comment xml:lang="bg">Аудио — Ogg Speex</comment>
+ <comment xml:lang="ca">àudio Ogg Speex</comment>
+ <comment xml:lang="cs">Zvuk Ogg Speex</comment>
+ <comment xml:lang="da">Ogg Speex-lyd</comment>
+ <comment xml:lang="de">Ogg-Speex-Audio</comment>
+ <comment xml:lang="es">sonido Ogg Speex</comment>
+ <comment xml:lang="eu">Ogg Speex audioa</comment>
+ <comment xml:lang="fi">Ogg Speex -ääni</comment>
+ <comment xml:lang="fo">Ogg Speex ljóður</comment>
+ <comment xml:lang="fr">audio Ogg Speex</comment>
+ <comment xml:lang="ga">fuaim Ogg Speex</comment>
+ <comment xml:lang="gl">son Ogg Speex</comment>
+ <comment xml:lang="he">שמע Ogg Speex</comment>
+ <comment xml:lang="hu">Ogg Speex hang</comment>
+ <comment xml:lang="id">Audio Ogg Speex</comment>
+ <comment xml:lang="it">Audio Ogg Speex</comment>
+ <comment xml:lang="ja">Ogg Speex オーディオ</comment>
+ <comment xml:lang="kk">Ogg Speex аудиосы</comment>
+ <comment xml:lang="ko">Ogg Speex 오디오</comment>
+ <comment xml:lang="lt">Ogg Speex garso įrašas</comment>
+ <comment xml:lang="lv">Ogg Speex audio</comment>
+ <comment xml:lang="nb">Ogg Speex lyd</comment>
+ <comment xml:lang="nl">Ogg Speex-audio</comment>
+ <comment xml:lang="nn">Ogg Speex-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg Speex</comment>
+ <comment xml:lang="pt_BR">Áudio Speex Ogg</comment>
+ <comment xml:lang="ro">Audio Ogg Speex</comment>
+ <comment xml:lang="ru">аудио Ogg Speex</comment>
+ <comment xml:lang="sk">Zvuk Ogg Speex</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg Speex</comment>
+ <comment xml:lang="sq">Audio Ogg Speex</comment>
+ <comment xml:lang="sv">Ogg Speex-ljud</comment>
+ <comment xml:lang="uk">звук ogg Speex</comment>
+ <comment xml:lang="vi">Âm thanh Speex Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg Speex 音频</comment>
+ <comment xml:lang="zh_TW">Ogg Speex 音訊</comment>
+ <sub-class-of type="audio/ogg"/>
+ <magic priority="80">
+ <match value="OggS" type="string" offset="0">
+ <match value="Speex " type="string" offset="28"/>
+ </match>
+ </magic>
+ <glob pattern="*.ogg"/>
+ </mime-type>
+ <mime-type type="audio/x-speex">
+ <comment>Speex audio</comment>
+ <comment xml:lang="ar">Speex سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Speex</comment>
+ <comment xml:lang="bg">Аудио — Speex</comment>
+ <comment xml:lang="ca">àudio Speex</comment>
+ <comment xml:lang="cs">Zvuk Speex</comment>
+ <comment xml:lang="da">Speexlyd</comment>
+ <comment xml:lang="de">Speex-Audio</comment>
+ <comment xml:lang="es">sonido Speex</comment>
+ <comment xml:lang="eu">Speex audioa</comment>
+ <comment xml:lang="fi">Speex-ääni</comment>
+ <comment xml:lang="fo">Speex ljóður</comment>
+ <comment xml:lang="fr">audio Speex</comment>
+ <comment xml:lang="ga">fuaim Speex</comment>
+ <comment xml:lang="gl">son Speex</comment>
+ <comment xml:lang="he">שמע של Speex</comment>
+ <comment xml:lang="hu">Speex hang</comment>
+ <comment xml:lang="id">Audio Speex</comment>
+ <comment xml:lang="it">Audio Speex</comment>
+ <comment xml:lang="ja">Speex オーディオ</comment>
+ <comment xml:lang="kk">Speex аудиосы</comment>
+ <comment xml:lang="ko">Speex 오디오</comment>
+ <comment xml:lang="lt">Speex garso įrašas</comment>
+ <comment xml:lang="lv">Speex audio</comment>
+ <comment xml:lang="nb">Speex lyd</comment>
+ <comment xml:lang="nl">Speex-audio</comment>
+ <comment xml:lang="nn">Speex-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Speex</comment>
+ <comment xml:lang="pt_BR">Áudio Speex</comment>
+ <comment xml:lang="ro">Audio Speex</comment>
+ <comment xml:lang="ru">аудио Speex</comment>
+ <comment xml:lang="sk">Zvuk Speex</comment>
+ <comment xml:lang="sl">Zvočna datoteka Speex</comment>
+ <comment xml:lang="sq">Audio Speex</comment>
+ <comment xml:lang="sv">Speex-ljud</comment>
+ <comment xml:lang="uk">звук Speex</comment>
+ <comment xml:lang="vi">Âm thanh Speex</comment>
+ <comment xml:lang="zh_CN">Speex 音频</comment>
+ <comment xml:lang="zh_TW">Speex 音訊</comment>
+ <magic priority="50">
+ <match value="Speex" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.spx"/>
+ </mime-type>
+ <mime-type type="video/x-theora+ogg">
+ <comment>Ogg Theora video</comment>
+ <comment xml:lang="ar">Ogg Theora مرئي</comment>
+ <comment xml:lang="be@latin">Videa Ogg Theora</comment>
+ <comment xml:lang="bg">Видео — Ogg Theora</comment>
+ <comment xml:lang="ca">vídeo Ogg Theora</comment>
+ <comment xml:lang="cs">Video Ogg Theora</comment>
+ <comment xml:lang="da">Ogg Theora-video</comment>
+ <comment xml:lang="de">Ogg-Theora-Video</comment>
+ <comment xml:lang="es">vídeo Ogg Theora</comment>
+ <comment xml:lang="eu">Ogg Theora bideoa</comment>
+ <comment xml:lang="fi">Ogg Theora -video</comment>
+ <comment xml:lang="fo">Ogg Theora video</comment>
+ <comment xml:lang="fr">vidéo Ogg Theora</comment>
+ <comment xml:lang="ga">físeán Ogg Theora</comment>
+ <comment xml:lang="gl">vídeo Ogg Theora</comment>
+ <comment xml:lang="he">שמע Ogg Theora</comment>
+ <comment xml:lang="hu">Ogg Theora videó</comment>
+ <comment xml:lang="id">Video Ogg Theora</comment>
+ <comment xml:lang="it">Video Ogg Theora</comment>
+ <comment xml:lang="ja">Ogg Theora 動画</comment>
+ <comment xml:lang="kk">Ogg Theora видеосы</comment>
+ <comment xml:lang="ko">Ogg Theora 비디오</comment>
+ <comment xml:lang="lt">Ogg Theora vaizdo įrašas</comment>
+ <comment xml:lang="lv">Ogg Theora video</comment>
+ <comment xml:lang="nb">Ogg Theora video</comment>
+ <comment xml:lang="nl">Ogg Theora-video</comment>
+ <comment xml:lang="nn">Ogg Theora-video</comment>
+ <comment xml:lang="pl">Plik wideo Ogg Theora</comment>
+ <comment xml:lang="pt_BR">Vídeo do Ogg Theora</comment>
+ <comment xml:lang="ro">Video Ogg Theora</comment>
+ <comment xml:lang="ru">видео Ogg Theora</comment>
+ <comment xml:lang="sk">Video Ogg Theora</comment>
+ <comment xml:lang="sl">Video datoteka Ogg Theora</comment>
+ <comment xml:lang="sq">Video Ogg Theora</comment>
+ <comment xml:lang="sv">Ogg Theora-video</comment>
+ <comment xml:lang="uk">відеокліп ogg Theora</comment>
+ <comment xml:lang="vi">Ảnh động Theora Ogg</comment>
+ <comment xml:lang="zh_CN">Ogg Theora 视频</comment>
+ <comment xml:lang="zh_TW">Ogg Theora 視訊</comment>
+ <sub-class-of type="video/ogg"/>
+ <alias type="video/x-theora"/>
+ <magic priority="80">
+ <match value="OggS" type="string" offset="0">
+ <match value="\x80theora" type="string" offset="28"/>
+ </match>
+ </magic>
+ <glob pattern="*.ogg"/>
+ </mime-type>
+ <mime-type type="video/x-ogm+ogg">
+ <comment>OGM video</comment>
+ <comment xml:lang="ar">OGM مرئي</comment>
+ <comment xml:lang="be@latin">Videa OGM</comment>
+ <comment xml:lang="bg">Видео — OGM</comment>
+ <comment xml:lang="ca">vídeo OGM</comment>
+ <comment xml:lang="cs">Video OGM</comment>
+ <comment xml:lang="da">OGM-video</comment>
+ <comment xml:lang="de">OGM-Video</comment>
+ <comment xml:lang="eo">OGM-video</comment>
+ <comment xml:lang="es">vídeo OGM</comment>
+ <comment xml:lang="eu">OGM bideoa</comment>
+ <comment xml:lang="fi">OGM-video</comment>
+ <comment xml:lang="fo">OGM video</comment>
+ <comment xml:lang="fr">vidéo OGM</comment>
+ <comment xml:lang="ga">físeán OGM</comment>
+ <comment xml:lang="gl">vídeo OGM</comment>
+ <comment xml:lang="he">וידאו OGM</comment>
+ <comment xml:lang="hu">OGM-videó</comment>
+ <comment xml:lang="id">Video OGM</comment>
+ <comment xml:lang="it">Video OGM</comment>
+ <comment xml:lang="ja">OGM 動画</comment>
+ <comment xml:lang="kk">OGM видеосы</comment>
+ <comment xml:lang="ko">OGM 비디오</comment>
+ <comment xml:lang="lt">OGM vaizdo įrašas</comment>
+ <comment xml:lang="lv">OGM video</comment>
+ <comment xml:lang="nb">OGM-film</comment>
+ <comment xml:lang="nl">OGM-video</comment>
+ <comment xml:lang="nn">OGM-video</comment>
+ <comment xml:lang="pl">Plik wideo OGM</comment>
+ <comment xml:lang="pt_BR">Vídeo OGM</comment>
+ <comment xml:lang="ro">Video OGM</comment>
+ <comment xml:lang="ru">видео OGM</comment>
+ <comment xml:lang="sk">Video OGM</comment>
+ <comment xml:lang="sl">Video datoteka OGM</comment>
+ <comment xml:lang="sq">Video OGM</comment>
+ <comment xml:lang="sv">OGM-video</comment>
+ <comment xml:lang="uk">відеокліп OGM</comment>
+ <comment xml:lang="vi">Ảnh động OGM</comment>
+ <comment xml:lang="zh_CN">OGM 视频</comment>
+ <comment xml:lang="zh_TW">OGM 視訊</comment>
+ <sub-class-of type="video/ogg"/>
+ <alias type="video/x-ogm"/>
+ <magic priority="80">
+ <match value="OggS" type="string" offset="0">
+ <match value="video" type="string" offset="29"/>
+ </match>
+ </magic>
+ <glob pattern="*.ogm"/>
+ </mime-type>
+
+ <mime-type type="application/x-ole-storage">
+ <comment>OLE2 compound document storage</comment>
+ <comment xml:lang="ar">تخزين مجمع مستند OLE2</comment>
+ <comment xml:lang="be@latin">Schovišča dla kampanentaŭ dakumentu OLE2</comment>
+ <comment xml:lang="bg">Съставен документ-хранилище — OLE2</comment>
+ <comment xml:lang="ca">emmagatzematge de documents composats OLE2</comment>
+ <comment xml:lang="cs">Úložiště složeného dokumentu OLE2</comment>
+ <comment xml:lang="da">OLE2-sammensat dokumentlager</comment>
+ <comment xml:lang="de">OLE2-Verbunddokumentenspeicher</comment>
+ <comment xml:lang="el">αρχείο συμπαγούς αποθήκευσης εγγράφων OLE2</comment>
+ <comment xml:lang="en_GB">OLE2 compound document storage</comment>
+ <comment xml:lang="eo">OLE2-deponejo de parentezaj dokumentoj</comment>
+ <comment xml:lang="es">almacenamiento de documentos compuestos OLE2</comment>
+ <comment xml:lang="eu">OLE2 konposatutako dokumentu-bilduma</comment>
+ <comment xml:lang="fi">OLE2-yhdisteasiakirjatallenne</comment>
+ <comment xml:lang="fo">OLE2 samansett skjalagoymsla</comment>
+ <comment xml:lang="fr">document de stockage composé OLE2</comment>
+ <comment xml:lang="ga">stóras cháipéisí comhshuite OLE2</comment>
+ <comment xml:lang="gl">almacenamento de documento composto OLE2</comment>
+ <comment xml:lang="he">אחסון מסמך משותף OLE2</comment>
+ <comment xml:lang="hu">OLE2 összetett dokumentumtároló</comment>
+ <comment xml:lang="id">penyimpan dokumen kompon OLE2</comment>
+ <comment xml:lang="it">Memorizzazione documento composto OLE2</comment>
+ <comment xml:lang="ja">OLE2 複合ドキュメントストレージ</comment>
+ <comment xml:lang="kk">OLE2 құрама құжаттар қоймасы</comment>
+ <comment xml:lang="ko">OLE2 복합 문서</comment>
+ <comment xml:lang="lt">OLE2 sudėtinių dokumentų laikmena</comment>
+ <comment xml:lang="lv">OLE2 savienoto dokumentu glabātuve</comment>
+ <comment xml:lang="ms">Storan dokumen halaman OLE2</comment>
+ <comment xml:lang="nb">OLE-lager for sammensatte dokumenter</comment>
+ <comment xml:lang="nl">OLE2-samengestelde documentopslag</comment>
+ <comment xml:lang="nn">OLE2 lager for samansett dokument</comment>
+ <comment xml:lang="pl">Magazyn dokumentu złożonego OLE2</comment>
+ <comment xml:lang="pt">armazenamento de documento composto OLE2</comment>
+ <comment xml:lang="pt_BR">Armazenamento de documento composto OLE2</comment>
+ <comment xml:lang="ro">Document de stocare compus OLE2</comment>
+ <comment xml:lang="ru">хранилище составных документов OLE2</comment>
+ <comment xml:lang="sk">Úložisko zloženého dokumentu OLE2</comment>
+ <comment xml:lang="sl">Združeni dokument OLE2</comment>
+ <comment xml:lang="sq">Arkiv dokumenti i përbërë OLE2</comment>
+ <comment xml:lang="sr">ОЛЕ2 сједињени документ</comment>
+ <comment xml:lang="sv">Sammansatt OLE2-dokumentlager</comment>
+ <comment xml:lang="uk">сховище складних документів OLE2</comment>
+ <comment xml:lang="vi">Kho lưu tài liệu ghép OLE2</comment>
+ <comment xml:lang="zh_CN">OLE2 组合文档存储</comment>
+ <comment xml:lang="zh_TW">OLE2 複合文件儲存</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="\320\317\021\340\241\261\032\341" type="string" offset="0"/>
+ <match value="0xe011cfd0" type="little32" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-msi">
+ <comment>Windows Installer package</comment>
+ <comment xml:lang="ar">حزمة مثبّت ويندوز</comment>
+ <comment xml:lang="be@latin">Pakunak Windows Installer</comment>
+ <comment xml:lang="bg">Пакет — инсталация за Windows</comment>
+ <comment xml:lang="ca">paquet de Windows Installer</comment>
+ <comment xml:lang="cs">Balíček Windows Installer</comment>
+ <comment xml:lang="da">Windows Installer-pakke</comment>
+ <comment xml:lang="de">Windows Installationspaket</comment>
+ <comment xml:lang="es">paquete de instalación de Windows</comment>
+ <comment xml:lang="eu">Windows-eko pakete instalatzailea</comment>
+ <comment xml:lang="fi">Windows-asennuspaketti</comment>
+ <comment xml:lang="fo">Windows innleggingarpakki</comment>
+ <comment xml:lang="fr">paquet d'installation Windows</comment>
+ <comment xml:lang="ga">pacáiste Windows Installer</comment>
+ <comment xml:lang="gl">paquete de instalación de Windows</comment>
+ <comment xml:lang="he">חבילה של Windows Installer</comment>
+ <comment xml:lang="hu">Windows Installer csomag</comment>
+ <comment xml:lang="id">Paket Windows Installer</comment>
+ <comment xml:lang="it">Pacchetto Windows Installer</comment>
+ <comment xml:lang="ja">Windodws インストーラパッケージ</comment>
+ <comment xml:lang="kk">Windows Installer дестесі</comment>
+ <comment xml:lang="ko">윈도우 설치 패키지</comment>
+ <comment xml:lang="lt">Windows Installer paketas</comment>
+ <comment xml:lang="lv">Windows Installer pakotne</comment>
+ <comment xml:lang="nl">Windows-installatiepakket</comment>
+ <comment xml:lang="nn">Windows Installer-pakke</comment>
+ <comment xml:lang="pl">Pakiet instalatora Windows</comment>
+ <comment xml:lang="pt_BR">Pacote do instalador do Windows</comment>
+ <comment xml:lang="ro">Pachet instalator Windows</comment>
+ <comment xml:lang="ru">пакет Windows Installer</comment>
+ <comment xml:lang="sk">Balík Windows Installer</comment>
+ <comment xml:lang="sl">Datoteka paketa Windows namestilnika</comment>
+ <comment xml:lang="sq">Paketë Windows Installer</comment>
+ <comment xml:lang="sv">Windows Installer-paket</comment>
+ <comment xml:lang="uk">пакунок Windows Installer</comment>
+ <comment xml:lang="vi">Gói cài đặt Windows</comment>
+ <comment xml:lang="zh_CN">Windows 程序安装包</comment>
+ <comment xml:lang="zh_TW">Windows Installer 套件</comment>
+ <sub-class-of type="application/x-ole-storage"/>
+ <glob pattern="*.msi"/>
+ </mime-type>
+ <mime-type type="application/x-oleo">
+ <comment>GNU Oleo spreadsheet</comment>
+ <comment xml:lang="ar">جدول جنو Oleo</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš GNU Oleo</comment>
+ <comment xml:lang="bg">Таблица — GNU Oleo</comment>
+ <comment xml:lang="ca">full de càlcul de GNU Oleo</comment>
+ <comment xml:lang="cs">Sešit GNU Oleo</comment>
+ <comment xml:lang="da">GNU Oleo-regneark</comment>
+ <comment xml:lang="de">GNU-Oleo-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο GNU Oleo</comment>
+ <comment xml:lang="en_GB">GNU Oleo spreadsheet</comment>
+ <comment xml:lang="eo">Kalkultabelo de GNU Oleo</comment>
+ <comment xml:lang="es">hoja de cálculo de GNU Oleo</comment>
+ <comment xml:lang="eu">GNU Oleo kalkulu-orria</comment>
+ <comment xml:lang="fi">GNU Oleo -taulukko</comment>
+ <comment xml:lang="fo">GNU Oleo rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul GNU Oleo</comment>
+ <comment xml:lang="ga">scarbhileog GNU Oleo</comment>
+ <comment xml:lang="gl">folla de cálculo de Oleo GNU</comment>
+ <comment xml:lang="he">גליון נתונים של GNU Oleo</comment>
+ <comment xml:lang="hu">GNU Oleo-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar GNU Oleo</comment>
+ <comment xml:lang="it">Foglio di calcolo GNU Oleo</comment>
+ <comment xml:lang="ja">GNU Oleo スプレッドシート</comment>
+ <comment xml:lang="kk">GNU Oleo электрондық кестесі</comment>
+ <comment xml:lang="ko">GNU Oleo 스프레드시트</comment>
+ <comment xml:lang="lt">GNU Oleo skaičialentė</comment>
+ <comment xml:lang="lv">GNU Oleo izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan GNU Oleo</comment>
+ <comment xml:lang="nb">GNU Oleo regneark</comment>
+ <comment xml:lang="nl">GNU Oleo-rekenblad</comment>
+ <comment xml:lang="nn">GNU Oleo-rekneark</comment>
+ <comment xml:lang="pl">Arkusz GNU Oleo</comment>
+ <comment xml:lang="pt">folha de cálculo GNU Oleo</comment>
+ <comment xml:lang="pt_BR">Planilha do GNU Oleo</comment>
+ <comment xml:lang="ro">Foaie de calcul GNU Oleo</comment>
+ <comment xml:lang="ru">электронная таблица GNU Oleo</comment>
+ <comment xml:lang="sk">Zošit GNU Oleo</comment>
+ <comment xml:lang="sl">Razpredelnica GNU Oleo</comment>
+ <comment xml:lang="sq">Fletë llogaritje GNU Oleo</comment>
+ <comment xml:lang="sr">ГНУ Oleo табеларни прорачун</comment>
+ <comment xml:lang="sv">GNU Oleo-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця GNU Oleo</comment>
+ <comment xml:lang="vi">Bảng tính Oleo của GNU</comment>
+ <comment xml:lang="zh_CN">GNU Oleo 工作簿</comment>
+ <comment xml:lang="zh_TW">GNU Oleo 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="Oleo" type="string" offset="31"/>
+ </magic>
+ <glob pattern="*.oleo"/>
+ </mime-type>
+ <mime-type type="application/x-pak">
+ <comment>PAK archive</comment>
+ <comment xml:lang="ar">أرشيف PAK</comment>
+ <comment xml:lang="be@latin">Archiŭ PAK</comment>
+ <comment xml:lang="bg">Архив — PAK</comment>
+ <comment xml:lang="ca">arxiu PAK</comment>
+ <comment xml:lang="cs">Archiv PAK</comment>
+ <comment xml:lang="da">PAK-arkiv</comment>
+ <comment xml:lang="de">PAK-Archiv</comment>
+ <comment xml:lang="eo">PAK-arkivo</comment>
+ <comment xml:lang="es">archivador PAK</comment>
+ <comment xml:lang="eu">PAK artxiboa</comment>
+ <comment xml:lang="fi">PAK-arkisto</comment>
+ <comment xml:lang="fo">PAK skjalasavn</comment>
+ <comment xml:lang="fr">archive PAK</comment>
+ <comment xml:lang="ga">cartlann PAK</comment>
+ <comment xml:lang="gl">arquivo PAK</comment>
+ <comment xml:lang="he">ארכיון PAK</comment>
+ <comment xml:lang="hu">PAK-archívum</comment>
+ <comment xml:lang="id">Arsip PAK</comment>
+ <comment xml:lang="it">Archivio PAK</comment>
+ <comment xml:lang="ja">PAK アーカイブ</comment>
+ <comment xml:lang="kk">PAK архиві</comment>
+ <comment xml:lang="ko">PAK 묶음 파일</comment>
+ <comment xml:lang="lt">PAK archyvas</comment>
+ <comment xml:lang="lv">PAK arhīvs</comment>
+ <comment xml:lang="nb">PAK-arkiv</comment>
+ <comment xml:lang="nl">PAK-archief</comment>
+ <comment xml:lang="nn">PAK-arkiv</comment>
+ <comment xml:lang="pl">Archiwum PAK</comment>
+ <comment xml:lang="pt_BR">Pacote PAK</comment>
+ <comment xml:lang="ro">Arhivă PAK</comment>
+ <comment xml:lang="ru">архив PAK</comment>
+ <comment xml:lang="sk">Archív PAK</comment>
+ <comment xml:lang="sl">Datoteka arhiva PAK</comment>
+ <comment xml:lang="sq">Arkiv PAK</comment>
+ <comment xml:lang="sv">PAK-arkiv</comment>
+ <comment xml:lang="uk">архів PAK</comment>
+ <comment xml:lang="vi">Kho nén PAK</comment>
+ <comment xml:lang="zh_CN">AR 归档文件</comment>
+ <comment xml:lang="zh_TW">PAK 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="80">
+ <match value="PACK" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.pak"/>
+ </mime-type>
+ <mime-type type="application/x-palm-database">
+ <comment>Palm OS database</comment>
+ <comment xml:lang="ar">قاعدة بيانات Palm OS</comment>
+ <comment xml:lang="az">Palm OS mə'lumat bazası</comment>
+ <comment xml:lang="be@latin">Baza źviestak Palm OS</comment>
+ <comment xml:lang="bg">База от данни — Palm OS</comment>
+ <comment xml:lang="ca">base de dades Palm OS</comment>
+ <comment xml:lang="cs">Databáze Palm OS</comment>
+ <comment xml:lang="cy">Cronfa Ddata Palm OS</comment>
+ <comment xml:lang="da">Palm OS-database</comment>
+ <comment xml:lang="de">Palm-OS-Datenbank</comment>
+ <comment xml:lang="el">βάση δεδομένων Palm OS</comment>
+ <comment xml:lang="en_GB">Palm OS database</comment>
+ <comment xml:lang="eo">datumbazo de Palm OS</comment>
+ <comment xml:lang="es">base de datos de Palm OS</comment>
+ <comment xml:lang="eu">Palm OS datu-basea</comment>
+ <comment xml:lang="fi">Palm OS -tietokanta</comment>
+ <comment xml:lang="fo">Palm OS dátustovnur</comment>
+ <comment xml:lang="fr">base de données Palm OS</comment>
+ <comment xml:lang="ga">bunachar sonraí Palm OS</comment>
+ <comment xml:lang="gl">base de datos de Palm OS</comment>
+ <comment xml:lang="he">מסד נתונים של Palm OS</comment>
+ <comment xml:lang="hu">Palm OS-adatbázis</comment>
+ <comment xml:lang="id">Basis data Palm OS</comment>
+ <comment xml:lang="it">Database Palm OS</comment>
+ <comment xml:lang="ja">Palm OS データベース</comment>
+ <comment xml:lang="kk">Palm OS дерекқоры</comment>
+ <comment xml:lang="ko">팜OS 데이터베이스</comment>
+ <comment xml:lang="lt">Palm OS duomenų bazė</comment>
+ <comment xml:lang="lv">Palm OS datubāze</comment>
+ <comment xml:lang="ms">Pangkalandata PalmOS</comment>
+ <comment xml:lang="nb">Palm OS-database</comment>
+ <comment xml:lang="nl">Palm OS-gegevensbank</comment>
+ <comment xml:lang="nn">Palm OS-database</comment>
+ <comment xml:lang="pl">Baza danych Palm OS</comment>
+ <comment xml:lang="pt">base de dados do Palm OS</comment>
+ <comment xml:lang="pt_BR">Banco de dados do Palm OS</comment>
+ <comment xml:lang="ro">Bază de date Palm OS</comment>
+ <comment xml:lang="ru">база данных Palm OS</comment>
+ <comment xml:lang="sk">Databáza Palm OS</comment>
+ <comment xml:lang="sl">Podatkovna zbirka Palm OS</comment>
+ <comment xml:lang="sq">Bankë me të dhëna Palm OS</comment>
+ <comment xml:lang="sr">Palm OS база података</comment>
+ <comment xml:lang="sv">Palm OS-databas</comment>
+ <comment xml:lang="uk">база даних Palm OS</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu PalmOS</comment>
+ <comment xml:lang="zh_CN">Palm OS 数据库</comment>
+ <comment xml:lang="zh_TW">Palm OS 資料庫</comment>
+ <glob pattern="*.pdb"/>
+ <glob pattern="*.prc"/>
+ <alias type="application/vnd.palm"/>
+ </mime-type>
+ <mime-type type="application/x-par2">
+ <comment>Parchive archive</comment>
+ <comment xml:lang="ar">أرشيف Parchive</comment>
+ <comment xml:lang="be@latin">Archiŭ Parchive</comment>
+ <comment xml:lang="bg">Архив — parchive</comment>
+ <comment xml:lang="ca">arxiu Parchive</comment>
+ <comment xml:lang="cs">Archiv Parchive</comment>
+ <comment xml:lang="da">Parchive-arkiv</comment>
+ <comment xml:lang="de">Parchive-Archiv</comment>
+ <comment xml:lang="es">archivador Parchive</comment>
+ <comment xml:lang="eu">Parchive artxiboa</comment>
+ <comment xml:lang="fi">Parchive-arkisto</comment>
+ <comment xml:lang="fo">Parchive skjalasavn</comment>
+ <comment xml:lang="fr">archive Parchive</comment>
+ <comment xml:lang="ga">cartlann Parchive</comment>
+ <comment xml:lang="gl">arquivo Parchive</comment>
+ <comment xml:lang="he">ארכיון של Parchive</comment>
+ <comment xml:lang="hu">Parchive archívum</comment>
+ <comment xml:lang="id">Arsip Parchive</comment>
+ <comment xml:lang="it">Archivio Parchive</comment>
+ <comment xml:lang="ja">Parchive アーカイブ</comment>
+ <comment xml:lang="kk">Parchive архиві</comment>
+ <comment xml:lang="ko">Parchive 묶음 파일</comment>
+ <comment xml:lang="lt">Parchive archyvas</comment>
+ <comment xml:lang="lv">Parchive arhīvs</comment>
+ <comment xml:lang="nb">Parchive-arkiv</comment>
+ <comment xml:lang="nl">Parchive-archief</comment>
+ <comment xml:lang="nn">Parchive-arkiv</comment>
+ <comment xml:lang="pl">Archiwum parchive</comment>
+ <comment xml:lang="pt_BR">Pacote Parchive</comment>
+ <comment xml:lang="ro">Arhivă Parchive</comment>
+ <comment xml:lang="ru">архив Parchive</comment>
+ <comment xml:lang="sk">Archív Parchive</comment>
+ <comment xml:lang="sl">Datoteka arhiva Parchive</comment>
+ <comment xml:lang="sq">Arkiv Parchive</comment>
+ <comment xml:lang="sv">Parchive-arkiv</comment>
+ <comment xml:lang="uk">архів Parchive</comment>
+ <comment xml:lang="vi">Kho nén Parchive</comment>
+ <comment xml:lang="zh_CN">Parchive 归档文件</comment>
+ <comment xml:lang="zh_TW">Parchive 封存檔</comment>
+ <acronym>Parchive</acronym>
+ <expanded-acronym>Parity Volume Set Archive</expanded-acronym>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="PAR2" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.PAR2"/>
+ <glob pattern="*.par2"/>
+ </mime-type>
+ <mime-type type="application/x-pef-executable">
+ <comment>PEF executable</comment>
+ <comment xml:lang="ar">PEF تنفيذي</comment>
+ <comment xml:lang="be@latin">Vykonvalny fajł PEF</comment>
+ <comment xml:lang="bg">Изпълним файл — PEF</comment>
+ <comment xml:lang="ca">executable PEF</comment>
+ <comment xml:lang="cs">Spustitelný soubor PEF</comment>
+ <comment xml:lang="da">PEF-kørbar</comment>
+ <comment xml:lang="de">PEF-Programm</comment>
+ <comment xml:lang="el">εκτελέσιμο PEF</comment>
+ <comment xml:lang="en_GB">PEF executable</comment>
+ <comment xml:lang="eo">PEF-plenumebla</comment>
+ <comment xml:lang="es">ejecutable PEF</comment>
+ <comment xml:lang="eu">PEF exekutagarria</comment>
+ <comment xml:lang="fi">PEF-ohjelma</comment>
+ <comment xml:lang="fo">PEF inningarfør</comment>
+ <comment xml:lang="fr">exécutable PEF</comment>
+ <comment xml:lang="ga">comhad inrite PEF</comment>
+ <comment xml:lang="gl">Executábel PEF</comment>
+ <comment xml:lang="he">קובץ הרצה PEF</comment>
+ <comment xml:lang="hu">PEF futtatható</comment>
+ <comment xml:lang="id">PEF dapat dieksekusi</comment>
+ <comment xml:lang="it">Eseguibile PEF</comment>
+ <comment xml:lang="ja">PEF 実行ファイル</comment>
+ <comment xml:lang="kk">PEF орындалатын файлы</comment>
+ <comment xml:lang="ko">PEF 실행파일</comment>
+ <comment xml:lang="lt">PEF vykdomasis failas</comment>
+ <comment xml:lang="lv">PEF izpildāmais</comment>
+ <comment xml:lang="ms">Bolehlaksana PEF</comment>
+ <comment xml:lang="nb">PEF-kjørbar</comment>
+ <comment xml:lang="nl">PEF-uitvoerbaar bestand</comment>
+ <comment xml:lang="nn">Køyrbar PEF-fil</comment>
+ <comment xml:lang="pl">Program PEF</comment>
+ <comment xml:lang="pt">executável PEF</comment>
+ <comment xml:lang="pt_BR">Executável PEF</comment>
+ <comment xml:lang="ro">Executabil PEF</comment>
+ <comment xml:lang="ru">исполняемый файл PEF</comment>
+ <comment xml:lang="sk">Spustiteľný súbor PEF</comment>
+ <comment xml:lang="sl">Izvedljiva datoteka PEF</comment>
+ <comment xml:lang="sq">E ekzekutueshme PEF</comment>
+ <comment xml:lang="sr">PEF извршна</comment>
+ <comment xml:lang="sv">Körbar PEF-fil</comment>
+ <comment xml:lang="uk">виконуваний файл PEF</comment>
+ <comment xml:lang="vi">Tập tin thực hiện được PEF</comment>
+ <comment xml:lang="zh_CN">PEF 可执行文件</comment>
+ <comment xml:lang="zh_TW">PEF 可執行檔</comment>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="50">
+ <match value="Joy!" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-perl">
+ <comment>Perl script</comment>
+ <comment xml:lang="ar">سكربت بيرل</comment>
+ <comment xml:lang="be@latin">Skrypt Perl</comment>
+ <comment xml:lang="bg">Скрипт — Perl</comment>
+ <comment xml:lang="ca">script Perl</comment>
+ <comment xml:lang="cs">Skript v Perlu</comment>
+ <comment xml:lang="cy">Sgript Perl</comment>
+ <comment xml:lang="da">Perlprogram</comment>
+ <comment xml:lang="de">Perl-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών Perl</comment>
+ <comment xml:lang="en_GB">Perl script</comment>
+ <comment xml:lang="eo">Perl-skripto</comment>
+ <comment xml:lang="es">script en Perl</comment>
+ <comment xml:lang="eu">Perl script-a</comment>
+ <comment xml:lang="fi">Perl-komentotiedosto</comment>
+ <comment xml:lang="fo">Perl boðrøð</comment>
+ <comment xml:lang="fr">script Perl</comment>
+ <comment xml:lang="ga">script Perl</comment>
+ <comment xml:lang="gl">Script de Perl</comment>
+ <comment xml:lang="he">תסריט מעטפת של Perl</comment>
+ <comment xml:lang="hu">Perl-parancsfájl</comment>
+ <comment xml:lang="id">Skrip Perl</comment>
+ <comment xml:lang="it">Script Perl</comment>
+ <comment xml:lang="ja">Perl スクリプト</comment>
+ <comment xml:lang="kk">Perl сценарийі</comment>
+ <comment xml:lang="ko">펄 스크립트</comment>
+ <comment xml:lang="lt">Perl scenarijus</comment>
+ <comment xml:lang="lv">Perl skripts</comment>
+ <comment xml:lang="ms">Skrip Perl</comment>
+ <comment xml:lang="nb">Perl skript</comment>
+ <comment xml:lang="nl">Perl-script</comment>
+ <comment xml:lang="nn">Perl-skript</comment>
+ <comment xml:lang="pl">Skrypt Perl</comment>
+ <comment xml:lang="pt">'script' Perl</comment>
+ <comment xml:lang="pt_BR">Script Perl</comment>
+ <comment xml:lang="ro">Script Perl</comment>
+ <comment xml:lang="ru">сценарий Perl</comment>
+ <comment xml:lang="sk">Skript jazyka Perl</comment>
+ <comment xml:lang="sl">Skriptna datoteka Perl</comment>
+ <comment xml:lang="sq">Script Perl</comment>
+ <comment xml:lang="sr">Перл скрипта</comment>
+ <comment xml:lang="sv">Perlskript</comment>
+ <comment xml:lang="uk">скрипт на Perl</comment>
+ <comment xml:lang="vi">Văn lệnh Perl</comment>
+ <comment xml:lang="zh_CN">Perl 脚本</comment>
+ <comment xml:lang="zh_TW">Perl 指令稿</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic priority="50">
+ <match value='eval \"exec /usr/local/bin/perl' type="string" offset="0"/>
+ <match value="/bin/perl" type="string" offset="1:16"/>
+ <match value="/bin/env perl" type="string" offset="1:16"/>
+ </magic>
+ <glob pattern="*.pl"/>
+ <glob pattern="*.pm"/>
+ <glob pattern="*.al"/>
+ <glob pattern="*.perl"/>
+ </mime-type>
+ <mime-type type="application/x-php">
+ <comment>PHP script</comment>
+ <comment xml:lang="ar">سكربت PHP</comment>
+ <comment xml:lang="az">PHP skripti</comment>
+ <comment xml:lang="be@latin">Skrypt PHP</comment>
+ <comment xml:lang="bg">Скрипт — PHP</comment>
+ <comment xml:lang="ca">script PHP</comment>
+ <comment xml:lang="cs">Skript PHP</comment>
+ <comment xml:lang="cy">Sgript PHP</comment>
+ <comment xml:lang="da">PHP-program</comment>
+ <comment xml:lang="de">PHP-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών PHP</comment>
+ <comment xml:lang="en_GB">PHP script</comment>
+ <comment xml:lang="eo">PHP-skripto</comment>
+ <comment xml:lang="es">script en PHP</comment>
+ <comment xml:lang="eu">PHP script-a</comment>
+ <comment xml:lang="fi">PHP-komentotiedosto</comment>
+ <comment xml:lang="fo">PHP boðrøð</comment>
+ <comment xml:lang="fr">script PHP</comment>
+ <comment xml:lang="ga">script PHP</comment>
+ <comment xml:lang="gl">Script de PHP</comment>
+ <comment xml:lang="he">תסריט מעטפת של PHP</comment>
+ <comment xml:lang="hu">PHP-parancsfájl</comment>
+ <comment xml:lang="id">Skrip PHP</comment>
+ <comment xml:lang="it">Script PHP</comment>
+ <comment xml:lang="ja">PHP スクリプト</comment>
+ <comment xml:lang="kk">PHP сценарийі</comment>
+ <comment xml:lang="ko">PHP 스크립트</comment>
+ <comment xml:lang="lt">PHP scenarijus</comment>
+ <comment xml:lang="lv">PHP skripts</comment>
+ <comment xml:lang="ms">Skrip PHP</comment>
+ <comment xml:lang="nb">PHP-skript</comment>
+ <comment xml:lang="nl">PHP-script</comment>
+ <comment xml:lang="nn">PHP-skript</comment>
+ <comment xml:lang="pl">Skrypt PHP</comment>
+ <comment xml:lang="pt">'script' PHP</comment>
+ <comment xml:lang="pt_BR">Script PHP</comment>
+ <comment xml:lang="ro">Script PHP</comment>
+ <comment xml:lang="ru">сценарий PHP</comment>
+ <comment xml:lang="sk">Skript PHP</comment>
+ <comment xml:lang="sl">Skriptna datoteka PHP</comment>
+ <comment xml:lang="sq">Script PHP</comment>
+ <comment xml:lang="sr">PHP скрипта</comment>
+ <comment xml:lang="sv">PHP-skript</comment>
+ <comment xml:lang="uk">скрипт PHP</comment>
+ <comment xml:lang="vi">Văn lệnh PHP</comment>
+ <comment xml:lang="zh_CN">PHP 脚本</comment>
+ <comment xml:lang="zh_TW">PHP 指令稿</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic priority="80">
+ <match value="&lt;?php" type="string" offset="0:64"/>
+ </magic>
+ <glob pattern="*.php"/>
+ <glob pattern="*.php3"/>
+ <glob pattern="*.php4"/>
+ <glob pattern="*.php5"/>
+ <glob pattern="*.phps"/>
+ </mime-type>
+ <mime-type type="application/x-pkcs7-certificates">
+ <comment>PKCS#7 certificate bundle</comment>
+ <comment xml:lang="ar">رزمة الشهادة PKCS#7</comment>
+ <comment xml:lang="bg">Сбор със сертификати — PKCS#7</comment>
+ <comment xml:lang="ca">conjunt de certificats PKCS#7</comment>
+ <comment xml:lang="cs">Svazek certifikátů PKCS#7</comment>
+ <comment xml:lang="da">PKCS#7-certifikatbundt</comment>
+ <comment xml:lang="de">PKCS#7-Zertifikatspaket</comment>
+ <comment xml:lang="es">lote de certificados PCKS#7</comment>
+ <comment xml:lang="eu">PKCS#7 zertifikazio sorta</comment>
+ <comment xml:lang="fi">PKCS#7-varmennenippu</comment>
+ <comment xml:lang="fo">PKCS#7 váttanar bundi</comment>
+ <comment xml:lang="fr">lot de certificats PKCS#7</comment>
+ <comment xml:lang="ga">cuach theastas PKCS#7</comment>
+ <comment xml:lang="gl">paquete de certificado PKCS#7</comment>
+ <comment xml:lang="he">בקשה מוסמכת PKCS#7</comment>
+ <comment xml:lang="hu">PKCS#7-tanúsítványcsomag</comment>
+ <comment xml:lang="id">Bundel sertifikat PKCS#7</comment>
+ <comment xml:lang="it">Bundle certificato PKCS#7</comment>
+ <comment xml:lang="ja">PKCS#7 証明書</comment>
+ <comment xml:lang="kk">PKCS#7 сертификаттар дестесі</comment>
+ <comment xml:lang="ko">PKCS#7 인증서 묶음</comment>
+ <comment xml:lang="lt">PKCS#7 liudijimų ryšulys</comment>
+ <comment xml:lang="lv">PKCS#7 sertifikātu saišķis</comment>
+ <comment xml:lang="nl">PKCS#7-certificaatbundel</comment>
+ <comment xml:lang="pl">Pakiet certyfikatu PKCS#7</comment>
+ <comment xml:lang="pt_BR">Pacote de certificados PKCS#7</comment>
+ <comment xml:lang="ro">Pachet certificat PKCS#7</comment>
+ <comment xml:lang="ru">пакет сертификатов PKCS#7</comment>
+ <comment xml:lang="sk">Zväzok certifikátov PKCS#7</comment>
+ <comment xml:lang="sl">Datoteka potrdila PKCS#7</comment>
+ <comment xml:lang="sv">PKCS#7-certifikatsamling</comment>
+ <comment xml:lang="uk">комплект сертифікатів PKCS#7</comment>
+ <comment xml:lang="vi">Bó chứng nhận PKCS#7</comment>
+ <comment xml:lang="zh_CN">PKCS#7 证书束</comment>
+ <comment xml:lang="zh_TW">PKCS#7 憑證綁包</comment>
+ <acronym>PKCS</acronym>
+ <expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
+ <glob pattern="*.p7b"/>
+ <glob pattern="*.spc"/>
+ </mime-type>
+ <mime-type type="application/x-pkcs12">
+ <comment>PKCS#12 certificate bundle</comment>
+ <comment xml:lang="ar">رزمة الشهادة PKCS#12</comment>
+ <comment xml:lang="be@latin">Viazka sertyfikataŭ PKCS#12</comment>
+ <comment xml:lang="bg">Сбор със сертификати — PKCS#12</comment>
+ <comment xml:lang="ca">conjunt de certificats PKCS#12</comment>
+ <comment xml:lang="cs">Svazek certifikátů PKCS#12</comment>
+ <comment xml:lang="da">PKCS#12-certifikatbundt</comment>
+ <comment xml:lang="de">PKCS#12-Zertifikatspaket</comment>
+ <comment xml:lang="el">πακέτο ψηφιακών πιστοποιητικών PKCS#12</comment>
+ <comment xml:lang="en_GB">PKCS#12 certificate bundle</comment>
+ <comment xml:lang="eo">ligaĵo de PKCS#12-certigiloj</comment>
+ <comment xml:lang="es">lote de certificados PCKS#12</comment>
+ <comment xml:lang="eu">PKCS#12 zertifikazio sorta</comment>
+ <comment xml:lang="fi">PKCS#12-varmennenippu</comment>
+ <comment xml:lang="fo">PKCS#12 váttanar bundi</comment>
+ <comment xml:lang="fr">lot de certificats PKCS#12</comment>
+ <comment xml:lang="ga">cuach theastas PKCS#12</comment>
+ <comment xml:lang="gl">paquete de certificado PKCS#12</comment>
+ <comment xml:lang="he">בקשה מוסמכת PKCS#12</comment>
+ <comment xml:lang="hu">PKCS#12-tanúsítványcsomag</comment>
+ <comment xml:lang="id">Bundel sertifikat PKCS#12</comment>
+ <comment xml:lang="it">Bundle certificato PKCS#12</comment>
+ <comment xml:lang="ja">PKCS#12 証明書</comment>
+ <comment xml:lang="kk">PKCS#12 сертификаттар дестесі</comment>
+ <comment xml:lang="ko">PKCS#12 인증서 묶음</comment>
+ <comment xml:lang="lt">PKCS#12 liudijimų ryšulys</comment>
+ <comment xml:lang="lv">PKCS#12 sertifikātu saišķis</comment>
+ <comment xml:lang="ms">Sijil PKCS#12</comment>
+ <comment xml:lang="nb">PKCS#12 sertifikathaug</comment>
+ <comment xml:lang="nl">PKCS#12-certificaatbundel</comment>
+ <comment xml:lang="nn">PKCS#12-sertifikatbunt</comment>
+ <comment xml:lang="pl">Pakiet certyfikatu PKCS#12</comment>
+ <comment xml:lang="pt">conjunto de certificados PKCS#12</comment>
+ <comment xml:lang="pt_BR">Pacote de certificados PKCS#12</comment>
+ <comment xml:lang="ro">Certificat împachetat PKCS#12</comment>
+ <comment xml:lang="ru">пакет сертификатов PKCS#12</comment>
+ <comment xml:lang="sk">Zväzok certifikátov PKCS#12</comment>
+ <comment xml:lang="sl">Datoteka potrdila PKCS#12</comment>
+ <comment xml:lang="sq">Bundle çertifikate PKCS#12</comment>
+ <comment xml:lang="sr">PKCS#12 пакет сертификата</comment>
+ <comment xml:lang="sv">PKCS#12-certifikatsamling</comment>
+ <comment xml:lang="uk">комплект сертифікатів PKCS#12</comment>
+ <comment xml:lang="vi">Bó chứng nhận PKCS#12</comment>
+ <comment xml:lang="zh_CN">PKCS#12 证书束</comment>
+ <comment xml:lang="zh_TW">PKCS#12 憑證檔</comment>
+ <acronym>PKCS</acronym>
+ <expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
+ <glob pattern="*.p12"/>
+ <glob pattern="*.pfx"/>
+ </mime-type>
+ <mime-type type="application/x-planperfect">
+ <comment>PlanPerfect spreadsheet</comment>
+ <comment xml:lang="ar">جدول PlanPerfect</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš PlanPerfect</comment>
+ <comment xml:lang="bg">Таблица — PlanPerfect</comment>
+ <comment xml:lang="ca">full de càlcul de PlanPerfect</comment>
+ <comment xml:lang="cs">Sešit PlanPerfect</comment>
+ <comment xml:lang="da">PlanPerfect-regneark</comment>
+ <comment xml:lang="de">PlanPerfect-Tabelle</comment>
+ <comment xml:lang="en_GB">PlanPerfect spreadsheet</comment>
+ <comment xml:lang="es">hoja de cálculo de PlanPerfect</comment>
+ <comment xml:lang="eu">PlanPerfect kalkulu-orria</comment>
+ <comment xml:lang="fi">PlanPerfect-taulukko</comment>
+ <comment xml:lang="fo">PlanPerfect rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul PlanPerfect</comment>
+ <comment xml:lang="ga">scarbhileog PlanPerfect</comment>
+ <comment xml:lang="gl">folla de cálculo de PlanPerfect</comment>
+ <comment xml:lang="he">גליון נתונים של PlanPerfect</comment>
+ <comment xml:lang="hu">PlanPerfect táblázat</comment>
+ <comment xml:lang="id">Lembar sebar PlanPerfect</comment>
+ <comment xml:lang="it">Foglio di calcolo PlanPerfect</comment>
+ <comment xml:lang="ja">PlanPerfect スプレッドシート</comment>
+ <comment xml:lang="kk">PlanPerfect электрондық кестесі</comment>
+ <comment xml:lang="ko">PlanPerfect 스프레드시트</comment>
+ <comment xml:lang="lt">PlanPerfect skaičialentė</comment>
+ <comment xml:lang="lv">PlanPerfect izklājlapa</comment>
+ <comment xml:lang="nb">PlanPerfect-regneark</comment>
+ <comment xml:lang="nl">PlanPerfect-rekenblad</comment>
+ <comment xml:lang="nn">PlanPerfect-rekneark</comment>
+ <comment xml:lang="pl">Arkusz PlanPerfect</comment>
+ <comment xml:lang="pt_BR">Planilha do PlanPerfect</comment>
+ <comment xml:lang="ro">Foaie de calcul PlanPerfect</comment>
+ <comment xml:lang="ru">электронная таблица PlanPerfect</comment>
+ <comment xml:lang="sk">Zošit PlanPerfect</comment>
+ <comment xml:lang="sl">Razpredelnica PlanPerfect</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh PlanPerfect</comment>
+ <comment xml:lang="sv">PlanPerfect-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця PlanPerfect</comment>
+ <comment xml:lang="vi">Bảng tính PlanPerfect</comment>
+ <comment xml:lang="zh_CN">PlanPerfect 工作簿</comment>
+ <comment xml:lang="zh_TW">PlanPerfect 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.pln"/>
+ </mime-type>
+ <mime-type type="application/x-pocket-word">
+ <comment>Pocket Word document</comment>
+ <comment xml:lang="ar">مستند Pocket Word</comment>
+ <comment xml:lang="bg">Документ — Pocket Word</comment>
+ <comment xml:lang="ca">document Pocket Word</comment>
+ <comment xml:lang="cs">Dokument Pocket Word</comment>
+ <comment xml:lang="da">Pocket Word-dokument</comment>
+ <comment xml:lang="de">Pocket-Word-Dokument</comment>
+ <comment xml:lang="es">documento de Pocket Word</comment>
+ <comment xml:lang="eu">Pocket Word dokumentua</comment>
+ <comment xml:lang="fi">Pocket Word -asiakirja</comment>
+ <comment xml:lang="fo">Pocket Word skjal</comment>
+ <comment xml:lang="fr">document Pocket Word</comment>
+ <comment xml:lang="ga">cáipéis Pocket Word</comment>
+ <comment xml:lang="gl">documento de Pocket Word</comment>
+ <comment xml:lang="he">מסמך של Pocket Word</comment>
+ <comment xml:lang="hu">Pocket Word dokumentum</comment>
+ <comment xml:lang="id">Dokumen Pocket Word</comment>
+ <comment xml:lang="it">Documento Pocket Word</comment>
+ <comment xml:lang="ja">Pocket Word ドキュメント</comment>
+ <comment xml:lang="kk">Pocket Word құжаты</comment>
+ <comment xml:lang="ko">Pocket Word 문서</comment>
+ <comment xml:lang="lt">Pocket Word dokumentas</comment>
+ <comment xml:lang="lv">Pocket Word dokuments</comment>
+ <comment xml:lang="nl">Pocket Word-document</comment>
+ <comment xml:lang="pl">Dokument Pocket Word</comment>
+ <comment xml:lang="pt_BR">Documento do Pocket Word</comment>
+ <comment xml:lang="ro">Document Pocket Word</comment>
+ <comment xml:lang="ru">документ Pocket Word</comment>
+ <comment xml:lang="sk">Dokument Pocket Word</comment>
+ <comment xml:lang="sl">Dokument Pocket Word</comment>
+ <comment xml:lang="sv">Pocket Word-dokument</comment>
+ <comment xml:lang="uk">документ Pocket Word</comment>
+ <comment xml:lang="vi">Tài liệu Pocket Word</comment>
+ <comment xml:lang="zh_CN">Pocket Word 文档</comment>
+ <comment xml:lang="zh_TW">Pocket Word 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="{\\pwi" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.psw"/>
+ </mime-type>
+ <mime-type type="application/x-profile">
+ <comment>profiler results</comment>
+ <comment xml:lang="ar">نتائج المحلل</comment>
+ <comment xml:lang="az">profiler nəticələri</comment>
+ <comment xml:lang="be@latin">vyniki profilera</comment>
+ <comment xml:lang="bg">Резултати от анализатора</comment>
+ <comment xml:lang="ca">resultats del perfilador</comment>
+ <comment xml:lang="cs">Výsledky profiler</comment>
+ <comment xml:lang="cy">canlyniadau proffeilio</comment>
+ <comment xml:lang="da">profileringsresultater</comment>
+ <comment xml:lang="de">Profiler-Ergebnisse</comment>
+ <comment xml:lang="el">αποτελέσματα μετρήσεων για την εκτέλεση προγράμματος</comment>
+ <comment xml:lang="en_GB">profiler results</comment>
+ <comment xml:lang="eo">resultoj de profililo</comment>
+ <comment xml:lang="es">resultados del perfilador</comment>
+ <comment xml:lang="eu">profiler-aren emaitzak</comment>
+ <comment xml:lang="fi">profilointitulokset</comment>
+ <comment xml:lang="fr">résultats de profileur</comment>
+ <comment xml:lang="ga">torthaí próifíleora</comment>
+ <comment xml:lang="gl">resultados do perfilador</comment>
+ <comment xml:lang="he">תוצאות מאבחן</comment>
+ <comment xml:lang="hu">profilírozó-eredmények</comment>
+ <comment xml:lang="id">hasil profiler</comment>
+ <comment xml:lang="it">Risultati profiler</comment>
+ <comment xml:lang="ja">プロファイラー結果</comment>
+ <comment xml:lang="kk">прифильдеу нәтижелері</comment>
+ <comment xml:lang="ko">프로파일러 결과</comment>
+ <comment xml:lang="lt">profiliklio rezultatai</comment>
+ <comment xml:lang="lv">profilētāja rezultāti</comment>
+ <comment xml:lang="ms">Hasil pemprofil</comment>
+ <comment xml:lang="nb">profileingsresultat</comment>
+ <comment xml:lang="nl">profiler-resultaten</comment>
+ <comment xml:lang="nn">profileringsresultat</comment>
+ <comment xml:lang="pl">Wyniki profilowania</comment>
+ <comment xml:lang="pt">resultados do 'profiler'</comment>
+ <comment xml:lang="pt_BR">resultados do profiler</comment>
+ <comment xml:lang="ro">rezultate profiler</comment>
+ <comment xml:lang="ru">результаты профилирования</comment>
+ <comment xml:lang="sk">Výsledky profilera</comment>
+ <comment xml:lang="sl">rezultati profilirnika</comment>
+ <comment xml:lang="sq">Rezultate të profiluesit</comment>
+ <comment xml:lang="sr">резултати профилатора</comment>
+ <comment xml:lang="sv">profilerarresultat</comment>
+ <comment xml:lang="uk">результати профілювання</comment>
+ <comment xml:lang="vi">kết quả nét hiện trạng</comment>
+ <comment xml:lang="zh_CN">profiler 结果</comment>
+ <comment xml:lang="zh_TW">硬體資訊產生器成果</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="gmon.out"/>
+ </mime-type>
+ <mime-type type="application/x-pw">
+ <comment>Pathetic Writer document</comment>
+ <comment xml:lang="ar">مستند Pathetic Writer</comment>
+ <comment xml:lang="be@latin">Dakument Pathetic Writer</comment>
+ <comment xml:lang="bg">Документ — Pathetic Writer</comment>
+ <comment xml:lang="ca">document de Pathetic Writer</comment>
+ <comment xml:lang="cs">Dokument Pathetic Writer</comment>
+ <comment xml:lang="da">Pathetic Writer-dokument</comment>
+ <comment xml:lang="de">Pathetic-Writer-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Pathetic Writer</comment>
+ <comment xml:lang="en_GB">Pathetic Writer document</comment>
+ <comment xml:lang="eo">dokumento de Pathetic Writer</comment>
+ <comment xml:lang="es">documento de Pathetic Writer</comment>
+ <comment xml:lang="eu">Pathetic Writer dokumentua</comment>
+ <comment xml:lang="fi">Pathetic Writer -asiakirja</comment>
+ <comment xml:lang="fo">Pathetic Writer skjal</comment>
+ <comment xml:lang="fr">document Pathetic Writer</comment>
+ <comment xml:lang="ga">cáipéis Pathetic Writer</comment>
+ <comment xml:lang="gl">documento de Pathetic Writer</comment>
+ <comment xml:lang="he">מסמך של Pathetic Writer</comment>
+ <comment xml:lang="hu">Pathetic Writer-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Pathetic Writer</comment>
+ <comment xml:lang="it">Documento Pathetic Writer</comment>
+ <comment xml:lang="ja">Pathetic Writer ドキュメント</comment>
+ <comment xml:lang="kk">Pathetic Writer құжаты</comment>
+ <comment xml:lang="ko">Pathetic Writer 문서</comment>
+ <comment xml:lang="lt">Pathetic Writer dokumentas</comment>
+ <comment xml:lang="lv">Pathetic Writer dokuments</comment>
+ <comment xml:lang="ms">Dokumen Pathetic Writer</comment>
+ <comment xml:lang="nb">Pathetic Writer-dokument</comment>
+ <comment xml:lang="nl">Pathetic Writer-document</comment>
+ <comment xml:lang="nn">Pathetic Writer-dokument</comment>
+ <comment xml:lang="pl">Dokument Pathetic Writer</comment>
+ <comment xml:lang="pt">documento do Pathetic Writer</comment>
+ <comment xml:lang="pt_BR">Documento do Pathetic Writer</comment>
+ <comment xml:lang="ro">Document Pathetic Writer</comment>
+ <comment xml:lang="ru">документ Pathetic Writer</comment>
+ <comment xml:lang="sk">Dokument Pathetic Writer</comment>
+ <comment xml:lang="sl">Dokument Pathetic Writer</comment>
+ <comment xml:lang="sq">Dokument Pathetic Writer</comment>
+ <comment xml:lang="sr">Документ Патетичног писца</comment>
+ <comment xml:lang="sv">Pathetic Writer-dokument</comment>
+ <comment xml:lang="uk">документ Pathetic Writer</comment>
+ <comment xml:lang="vi">Tài liệu Pathetic Writer</comment>
+ <comment xml:lang="zh_CN">Pathetic Writer 文档</comment>
+ <comment xml:lang="zh_TW">Pathetic Writer 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.pw"/>
+ </mime-type>
+ <mime-type type="application/x-python-bytecode">
+ <comment>Python bytecode</comment>
+ <comment xml:lang="ar">Python bytecode</comment>
+ <comment xml:lang="az">Python bayt kodu</comment>
+ <comment xml:lang="be@latin">Bajtavy kod Python</comment>
+ <comment xml:lang="bg">Байт код — Python</comment>
+ <comment xml:lang="ca">bytecode de Python</comment>
+ <comment xml:lang="cs">Bajtový kód Python</comment>
+ <comment xml:lang="cy">Côd beit Python</comment>
+ <comment xml:lang="da">Pythonbytekode</comment>
+ <comment xml:lang="de">Python-Bytecode</comment>
+ <comment xml:lang="el">συμβολοκώδικας Python</comment>
+ <comment xml:lang="en_GB">Python bytecode</comment>
+ <comment xml:lang="eo">Python-bajtkodo</comment>
+ <comment xml:lang="es">bytecode Python</comment>
+ <comment xml:lang="eu">Python byte-kodea</comment>
+ <comment xml:lang="fi">Python-tavukoodi</comment>
+ <comment xml:lang="fo">Python býtkota</comment>
+ <comment xml:lang="fr">bytecode Python</comment>
+ <comment xml:lang="ga">beartchód Python</comment>
+ <comment xml:lang="gl">bytecode de Python</comment>
+ <comment xml:lang="he">Bytecode של Python</comment>
+ <comment xml:lang="hu">Python-bájtkód</comment>
+ <comment xml:lang="id">Kode bita Python</comment>
+ <comment xml:lang="it">Bytecode Python</comment>
+ <comment xml:lang="ja">Python バイトコード</comment>
+ <comment xml:lang="kk">Python байткоды</comment>
+ <comment xml:lang="ko">파이썬 바이트코드</comment>
+ <comment xml:lang="lt">Python baitinis kodas</comment>
+ <comment xml:lang="lv">Python bitkods</comment>
+ <comment xml:lang="ms">Kodbait Python</comment>
+ <comment xml:lang="nb">Python-bytekode</comment>
+ <comment xml:lang="nl">Python-bytecode</comment>
+ <comment xml:lang="nn">Python-bytekode</comment>
+ <comment xml:lang="pl">Kod bajtowy Python</comment>
+ <comment xml:lang="pt">código binário Python</comment>
+ <comment xml:lang="pt_BR">Código compilado Python</comment>
+ <comment xml:lang="ro">Bytecode Python</comment>
+ <comment xml:lang="ru">байт-код Python</comment>
+ <comment xml:lang="sk">Bajtový kód Python</comment>
+ <comment xml:lang="sl">Datoteka bitne kode Python</comment>
+ <comment xml:lang="sq">Bytecode Python</comment>
+ <comment xml:lang="sr">Питонов бајт ко̂д</comment>
+ <comment xml:lang="sv">Python-bytekod</comment>
+ <comment xml:lang="uk">байт-код Python</comment>
+ <comment xml:lang="vi">Mã byte Python</comment>
+ <comment xml:lang="zh_CN">Python 字节码</comment>
+ <comment xml:lang="zh_TW">Python 位元碼</comment>
+ <magic priority="50">
+ <match value="0x994e0d0a" type="big32" offset="0"/>
+ </magic>
+ <glob pattern="*.pyc"/>
+ <glob pattern="*.pyo"/>
+ </mime-type>
+ <mime-type type="application/x-quattropro">
+ <comment>Quattro Pro spreadsheet</comment>
+ <comment xml:lang="ar">جدول Quattro Pro</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Quattro Pro</comment>
+ <comment xml:lang="bg">Таблица — Quattro Pro</comment>
+ <comment xml:lang="ca">full de càlcul de Quattro Pro</comment>
+ <comment xml:lang="cs">Sešit Quattro Pro</comment>
+ <comment xml:lang="da">Quattro Pro-regneark</comment>
+ <comment xml:lang="de">Quattro-Pro-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο Quattro Pro</comment>
+ <comment xml:lang="en_GB">Quattro Pro spreadsheet</comment>
+ <comment xml:lang="eo">sterntabelo de Quattro Pro</comment>
+ <comment xml:lang="es">hoja de cálculo Quattro Pro</comment>
+ <comment xml:lang="eu">Quattro Pro kalkulu-orria</comment>
+ <comment xml:lang="fi">Quattro Pro -taulukko</comment>
+ <comment xml:lang="fo">Quattro Pro rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Quattro Pro</comment>
+ <comment xml:lang="ga">scarbhileog Quattro Pro</comment>
+ <comment xml:lang="gl">folla de cálculo Quattro Pro</comment>
+ <comment xml:lang="he">גליון נתונים של Quattro Pro</comment>
+ <comment xml:lang="hu">Quattro Pro-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar Quattro Pro</comment>
+ <comment xml:lang="it">Foglio di calcolo Quattro Pro</comment>
+ <comment xml:lang="ja">Quattro Pro スプレッドシート</comment>
+ <comment xml:lang="kk">Quattro Pro электрондық кестесі</comment>
+ <comment xml:lang="ko">Quattro Pro 스프레드시트</comment>
+ <comment xml:lang="lt">Quattro Pro skaičialentė</comment>
+ <comment xml:lang="lv">Quattro Pro izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan Quatro Pro</comment>
+ <comment xml:lang="nb">Quattro Pro-regneark</comment>
+ <comment xml:lang="nl">Quattro Pro-rekenblad</comment>
+ <comment xml:lang="nn">Quattro Pro-rekneark</comment>
+ <comment xml:lang="pl">Arkusz Quattro Pro</comment>
+ <comment xml:lang="pt">folha de cálculo Quattro Pro</comment>
+ <comment xml:lang="pt_BR">Planilha do Quattro Pro</comment>
+ <comment xml:lang="ro">Foaie de calcul Quattro Pro</comment>
+ <comment xml:lang="ru">электронная таблица Quattro Pro</comment>
+ <comment xml:lang="sk">Zošit Quattro Pro</comment>
+ <comment xml:lang="sl">Razpredelnica Quattro Pro</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh Quattro Pro</comment>
+ <comment xml:lang="sr">Quattro Pro табеларни рачун</comment>
+ <comment xml:lang="sv">Quattro Pro-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Quattro Pro</comment>
+ <comment xml:lang="vi">Bảng tính Quattro Pro</comment>
+ <comment xml:lang="zh_CN">Quattro Pro 工作簿</comment>
+ <comment xml:lang="zh_TW">Quattro Pro 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.wb1"/>
+ <glob pattern="*.wb2"/>
+ <glob pattern="*.wb3"/>
+ </mime-type>
+ <mime-type type="application/x-quicktime-media-link">
+ <comment>QuickTime metalink playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل QuickTime metalink</comment>
+ <comment xml:lang="be@latin">śpis metaspasyłak na pieśni QuickTime</comment>
+ <comment xml:lang="bg">Списък за изпълнение — QuickTime</comment>
+ <comment xml:lang="ca">llista de reproducció de metaenllaços QuickTime</comment>
+ <comment xml:lang="cs">Seznam skladeb metalink QuickTime</comment>
+ <comment xml:lang="da">QuickTime metalink-afspilningsliste</comment>
+ <comment xml:lang="de">QuickTime-Metalink-Wiedergabeliste</comment>
+ <comment xml:lang="es">lista de reproducción de metaenlaces QuickTime</comment>
+ <comment xml:lang="eu">QuickTime meta-esteken erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">QuickTime metalink -soittolista</comment>
+ <comment xml:lang="fo">QuickTime metaleinkju avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture metalink QuickTime</comment>
+ <comment xml:lang="ga">seinmliosta meiteanasc QuickTime</comment>
+ <comment xml:lang="gl">lista de reprodución de metaligazóns QuickTime</comment>
+ <comment xml:lang="he">רשימת השמעה מקושרת של QuickTime</comment>
+ <comment xml:lang="hu">QuickTime metalink lejátszólista</comment>
+ <comment xml:lang="id">Senarai berkas taut meta QuickTime</comment>
+ <comment xml:lang="it">Scaletta metalink QuickTime</comment>
+ <comment xml:lang="ja">QuickTime メタリンク再生リスト</comment>
+ <comment xml:lang="kk">QuickTime метасілтемелер ойнау тізімі</comment>
+ <comment xml:lang="ko">퀵타임 metalink 재생 목록</comment>
+ <comment xml:lang="lt">QuickTime metanuorodos grojaraštis</comment>
+ <comment xml:lang="lv">QuickTime metasaites repertuārs</comment>
+ <comment xml:lang="nb">QuickTime metalink-spilleliste</comment>
+ <comment xml:lang="nl">QuickTime metalink-afspeellijst</comment>
+ <comment xml:lang="nn">QuickTime metalink-speleliste</comment>
+ <comment xml:lang="pl">Lista odtwarzania metaodnośników QuickTime</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução metalink do QuickTime</comment>
+ <comment xml:lang="ro">Listă cu metalegături QuickTime</comment>
+ <comment xml:lang="ru">список воспроизведения мета-ссылок QuickTime</comment>
+ <comment xml:lang="sk">Zoznam skladieb metalink QuickTime</comment>
+ <comment xml:lang="sl">Seznam predvajanja QuickTime</comment>
+ <comment xml:lang="sq">Listë titujsh metalink QuickTime</comment>
+ <comment xml:lang="sv">QuickTime-metalänkspellista</comment>
+ <comment xml:lang="uk">список відтворення QuickTime metalink</comment>
+ <comment xml:lang="vi">Danh mục nhạc siêu liên kết Quicktime</comment>
+ <comment xml:lang="zh_CN">QuickTime 元链接播放列表</comment>
+ <comment xml:lang="zh_TW">QuickTime metalink 播放清單</comment>
+ <generic-icon name="video-x-generic"/>
+ <sub-class-of type="video/quicktime"/>
+ <alias type="application/x-quicktimeplayer"/>
+ <magic priority="60">
+ <match value="&lt;?xml" type="string" offset="0">
+ <match value="&lt;?quicktime" type="string" offset="0:64"/>
+ </match>
+ <match value="RTSPtext" type="string" offset="0"/>
+ <match value="rtsptext" type="string" offset="0"/>
+ <match value="SMILtext" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.qtl"/>
+ </mime-type>
+ <mime-type type="application/x-qw">
+ <comment>Quicken document</comment>
+ <comment xml:lang="ar">مستند Quicken</comment>
+ <comment xml:lang="az">Quicken sənədi</comment>
+ <comment xml:lang="be@latin">Dakument Quicken</comment>
+ <comment xml:lang="bg">Документ — Quicken</comment>
+ <comment xml:lang="ca">document de Quicken</comment>
+ <comment xml:lang="cs">Dokument Quicken</comment>
+ <comment xml:lang="cy">Dogfen Quicken</comment>
+ <comment xml:lang="da">Quickendokument</comment>
+ <comment xml:lang="de">Quicken-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Quicken</comment>
+ <comment xml:lang="en_GB">Quicken document</comment>
+ <comment xml:lang="eo">Quicken-dokumento</comment>
+ <comment xml:lang="es">documento de Quicken</comment>
+ <comment xml:lang="eu">Quicken dokumentua</comment>
+ <comment xml:lang="fi">Quicken-asiakirja</comment>
+ <comment xml:lang="fo">Quicken skjal</comment>
+ <comment xml:lang="fr">document Quicken</comment>
+ <comment xml:lang="ga">cáipéis Quicken</comment>
+ <comment xml:lang="gl">documento de Quicken</comment>
+ <comment xml:lang="he">מסמך של Quicken</comment>
+ <comment xml:lang="hu">Quicken-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Quicken</comment>
+ <comment xml:lang="it">Documento Quicken</comment>
+ <comment xml:lang="ja">Quicken ドキュメント</comment>
+ <comment xml:lang="kk">Quicken құжаты</comment>
+ <comment xml:lang="ko">Quicken 문서</comment>
+ <comment xml:lang="lt">Quicken dokumentas</comment>
+ <comment xml:lang="lv">Quicken dokuments</comment>
+ <comment xml:lang="ms">Dokumen Quicken</comment>
+ <comment xml:lang="nb">Quicken-dokument</comment>
+ <comment xml:lang="nl">Quicken-document</comment>
+ <comment xml:lang="nn">Quicken-dokument</comment>
+ <comment xml:lang="pl">Dokument Quicken</comment>
+ <comment xml:lang="pt">documento Quicken</comment>
+ <comment xml:lang="pt_BR">Documento do Quicken</comment>
+ <comment xml:lang="ro">Document Quicken</comment>
+ <comment xml:lang="ru">документ Quicken</comment>
+ <comment xml:lang="sk">Dokument Quicken</comment>
+ <comment xml:lang="sl">Dokument Quicken</comment>
+ <comment xml:lang="sq">Dokument Quicken</comment>
+ <comment xml:lang="sr">Quicken документ</comment>
+ <comment xml:lang="sv">Quicken-dokument</comment>
+ <comment xml:lang="uk">документ Quicken</comment>
+ <comment xml:lang="vi">Tài liệu Quicken</comment>
+ <comment xml:lang="zh_CN">Quicken 文档</comment>
+ <comment xml:lang="zh_TW">Quicken 文件</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.qif"/>
+ </mime-type>
+ <mime-type type="application/x-rar">
+ <comment>RAR archive</comment>
+ <comment xml:lang="ar">أرشيف RAR</comment>
+ <comment xml:lang="be@latin">Archiŭ RAR</comment>
+ <comment xml:lang="bg">Архив — RAR</comment>
+ <comment xml:lang="ca">arxiu RAR</comment>
+ <comment xml:lang="cs">Archiv RAR</comment>
+ <comment xml:lang="cy">Archif RAR</comment>
+ <comment xml:lang="da">RAR-arkiv</comment>
+ <comment xml:lang="de">RAR-Archiv</comment>
+ <comment xml:lang="el">αρχείο RAR</comment>
+ <comment xml:lang="en_GB">RAR archive</comment>
+ <comment xml:lang="eo">RAR-arkivo</comment>
+ <comment xml:lang="es">archivador RAR</comment>
+ <comment xml:lang="eu">RAR artxiboa</comment>
+ <comment xml:lang="fi">RAR-arkisto</comment>
+ <comment xml:lang="fo">RAR skjalasavn</comment>
+ <comment xml:lang="fr">archive RAR</comment>
+ <comment xml:lang="ga">cartlann RAR</comment>
+ <comment xml:lang="gl">ficheiro RAR</comment>
+ <comment xml:lang="he">ארכיון RAR</comment>
+ <comment xml:lang="hu">RAR-archívum</comment>
+ <comment xml:lang="id">Arsip RAR</comment>
+ <comment xml:lang="it">Archivio RAR</comment>
+ <comment xml:lang="ja">RAR アーカイブ</comment>
+ <comment xml:lang="kk">RAR архиві</comment>
+ <comment xml:lang="ko">RAR 압축 파일</comment>
+ <comment xml:lang="lt">RAR archyvas</comment>
+ <comment xml:lang="lv">RAR arhīvs</comment>
+ <comment xml:lang="ms">Arkib RAR</comment>
+ <comment xml:lang="nb">RAR-arkiv</comment>
+ <comment xml:lang="nl">RAR-archief</comment>
+ <comment xml:lang="nn">RAR-arkiv</comment>
+ <comment xml:lang="pl">Archiwum RAR</comment>
+ <comment xml:lang="pt">arquivo RAR</comment>
+ <comment xml:lang="pt_BR">Pacote RAR</comment>
+ <comment xml:lang="ro">Arhivă RAR</comment>
+ <comment xml:lang="ru">архив RAR</comment>
+ <comment xml:lang="sk">Archív RAR</comment>
+ <comment xml:lang="sl">Datoteka arhiva RAR</comment>
+ <comment xml:lang="sq">Arkiv RAR</comment>
+ <comment xml:lang="sr">РАР архива</comment>
+ <comment xml:lang="sv">RAR-arkiv</comment>
+ <comment xml:lang="uk">архів RAR</comment>
+ <comment xml:lang="vi">Kho nén RAR</comment>
+ <comment xml:lang="zh_CN">RAR 归档文件</comment>
+ <comment xml:lang="zh_TW">RAR 封存檔</comment>
+ <alias type="application/x-rar-compressed"/>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="Rar!" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.rar"/>
+ </mime-type>
+ <mime-type type="application/x-dar">
+ <comment>DAR archive</comment>
+ <comment xml:lang="ar">أرشيف DAR</comment>
+ <comment xml:lang="be@latin">Archiŭ DAR</comment>
+ <comment xml:lang="bg">Архив — DAR</comment>
+ <comment xml:lang="ca">arxiu DAR</comment>
+ <comment xml:lang="cs">Archiv DAR</comment>
+ <comment xml:lang="da">DAR-arkiv</comment>
+ <comment xml:lang="de">DAR-Archiv</comment>
+ <comment xml:lang="eo">DAR-arkivo</comment>
+ <comment xml:lang="es">archivador DAR</comment>
+ <comment xml:lang="eu">DAR artxiboa</comment>
+ <comment xml:lang="fi">DAR-arkisto</comment>
+ <comment xml:lang="fo">DAR skjalasavn</comment>
+ <comment xml:lang="fr">archive DAR</comment>
+ <comment xml:lang="ga">cartlann DAR</comment>
+ <comment xml:lang="gl">arquivo DAR</comment>
+ <comment xml:lang="he">ארכיון DAR</comment>
+ <comment xml:lang="hu">DAR archívum</comment>
+ <comment xml:lang="id">Arsip DAR</comment>
+ <comment xml:lang="it">Archivio DAR</comment>
+ <comment xml:lang="ja">DAR アーカイブ</comment>
+ <comment xml:lang="kk">DAR архиві</comment>
+ <comment xml:lang="ko">DAR 묶음 파일</comment>
+ <comment xml:lang="lt">DAR archyvas</comment>
+ <comment xml:lang="lv">DAR arhīvs</comment>
+ <comment xml:lang="nb">DAR-arkiv</comment>
+ <comment xml:lang="nl">DAR-archief</comment>
+ <comment xml:lang="nn">DAR-arkiv</comment>
+ <comment xml:lang="pl">Archiwum DAR</comment>
+ <comment xml:lang="pt_BR">Pacote DAR</comment>
+ <comment xml:lang="ro">Arhivă DAR</comment>
+ <comment xml:lang="ru">архив DAR</comment>
+ <comment xml:lang="sk">Archív DAR</comment>
+ <comment xml:lang="sl">Datoteka arhiva DAR</comment>
+ <comment xml:lang="sq">Arkiv DAR</comment>
+ <comment xml:lang="sv">DAR-arkiv</comment>
+ <comment xml:lang="uk">архів DAR</comment>
+ <comment xml:lang="vi">Kho nén DAR</comment>
+ <comment xml:lang="zh_CN">DAR 归档文件</comment>
+ <comment xml:lang="zh_TW">DAR 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic>
+ <match value="123" type="big32" offset="0"/>
+ </magic>
+ <glob pattern="*.dar"/>
+ </mime-type>
+ <mime-type type="application/x-alz">
+ <comment>Alzip archive</comment>
+ <comment xml:lang="ar">أرشيف Alzip</comment>
+ <comment xml:lang="be@latin">Archiŭ Alzip</comment>
+ <comment xml:lang="bg">Архив — alzip</comment>
+ <comment xml:lang="ca">arxiu Alzip</comment>
+ <comment xml:lang="cs">Archiv Alzip</comment>
+ <comment xml:lang="da">Alziparkiv</comment>
+ <comment xml:lang="de">Alzip-Archiv</comment>
+ <comment xml:lang="eo">Alzip-arkivo</comment>
+ <comment xml:lang="es">archivador Alzip</comment>
+ <comment xml:lang="eu">Alzip artxiboa</comment>
+ <comment xml:lang="fi">Alzip-arkisto</comment>
+ <comment xml:lang="fo">Alsip skjalasavn</comment>
+ <comment xml:lang="fr">archive alzip</comment>
+ <comment xml:lang="ga">cartlann Alzip</comment>
+ <comment xml:lang="gl">arquivo Alzip</comment>
+ <comment xml:lang="he">ארכיון Alzip</comment>
+ <comment xml:lang="hu">Alzip archívum</comment>
+ <comment xml:lang="id">Arsip Alzip</comment>
+ <comment xml:lang="it">Archivio Alzip</comment>
+ <comment xml:lang="ja">Alzip アーカイブ</comment>
+ <comment xml:lang="kk">Alzip архиві</comment>
+ <comment xml:lang="ko">알집 압축 파일</comment>
+ <comment xml:lang="lt">Alzip archyvas</comment>
+ <comment xml:lang="lv">Alzip arhīvs</comment>
+ <comment xml:lang="nb">Alzip-arkiv</comment>
+ <comment xml:lang="nl">Alzip-archief</comment>
+ <comment xml:lang="nn">Alzip-arkiv</comment>
+ <comment xml:lang="pl">Archiwum alzip</comment>
+ <comment xml:lang="pt_BR">Pacote Alzip</comment>
+ <comment xml:lang="ro">Arhivă Alzip</comment>
+ <comment xml:lang="ru">архив ALZIP</comment>
+ <comment xml:lang="sk">Archív Alzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Alzip</comment>
+ <comment xml:lang="sq">Arkiv Alzip</comment>
+ <comment xml:lang="sv">Alzip-arkiv</comment>
+ <comment xml:lang="uk">архів Alzip</comment>
+ <comment xml:lang="vi">Kho nén Alzip</comment>
+ <comment xml:lang="zh_CN">Alzip 归档文件</comment>
+ <comment xml:lang="zh_TW">Alzip 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="ALZ" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.alz"/>
+ </mime-type>
+ <mime-type type="text/x-reject">
+ <comment>rejected patch</comment>
+ <comment xml:lang="ar">رقعة مرفوضة</comment>
+ <comment xml:lang="be@latin">niepryniaty patch</comment>
+ <comment xml:lang="bg">Отхвърлен файл с кръпка</comment>
+ <comment xml:lang="ca">pedaç rebutjat</comment>
+ <comment xml:lang="cs">Odmítnutá záplata</comment>
+ <comment xml:lang="da">afvist tekstlap</comment>
+ <comment xml:lang="de">Abgelehnter Patch</comment>
+ <comment xml:lang="el">μπάλωμα που απορρίφθηκε</comment>
+ <comment xml:lang="en_GB">rejected patch</comment>
+ <comment xml:lang="eo">reĵeta flikaĵo</comment>
+ <comment xml:lang="es">parche rechazado</comment>
+ <comment xml:lang="eu">baztertutako bide-izena</comment>
+ <comment xml:lang="fi">hylättyjen muutosten tiedosto</comment>
+ <comment xml:lang="fo">vrakað rætting</comment>
+ <comment xml:lang="fr">correctif rejeté</comment>
+ <comment xml:lang="ga">paiste diúltaithe</comment>
+ <comment xml:lang="gl">parche rexeitado</comment>
+ <comment xml:lang="he">תלאי שנדחה</comment>
+ <comment xml:lang="hu">visszautasított folt</comment>
+ <comment xml:lang="id">patch ditolak</comment>
+ <comment xml:lang="it">Patch rifiutata</comment>
+ <comment xml:lang="ja">拒否されたパッチ</comment>
+ <comment xml:lang="kk">алынбаған патч</comment>
+ <comment xml:lang="ko">거부된 패치 파일</comment>
+ <comment xml:lang="lt">atmestas lopas</comment>
+ <comment xml:lang="lv">noraidītais ceļš</comment>
+ <comment xml:lang="ms">Tampungan ditolak</comment>
+ <comment xml:lang="nb">avvist patchfil</comment>
+ <comment xml:lang="nl">verworpen patch</comment>
+ <comment xml:lang="nn">avvist programfiks</comment>
+ <comment xml:lang="pl">Odrzucona łata</comment>
+ <comment xml:lang="pt">ficheiro de patch rejeitado</comment>
+ <comment xml:lang="pt_BR">arquivo de patch rejeitado</comment>
+ <comment xml:lang="ro">petec respsins</comment>
+ <comment xml:lang="ru">отвергнутый патч</comment>
+ <comment xml:lang="sk">Odmietnutá záplata</comment>
+ <comment xml:lang="sl">zavrnjen popravek</comment>
+ <comment xml:lang="sq">Patch i kthyer mbrapsht</comment>
+ <comment xml:lang="sr">одбијена закрпа</comment>
+ <comment xml:lang="sv">avvisad programfix</comment>
+ <comment xml:lang="uk">відхилена латка</comment>
+ <comment xml:lang="vi">đắp vá bị từ chối</comment>
+ <comment xml:lang="zh_CN">拒绝的补丁</comment>
+ <comment xml:lang="zh_TW">回絕的修補</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <alias type="application/x-reject"/>
+ <glob pattern="*.rej"/>
+ </mime-type>
+ <mime-type type="application/x-rpm">
+ <comment>RPM package</comment>
+ <comment xml:lang="ar">حزمة RPM</comment>
+ <comment xml:lang="be@latin">Pakunak RPM</comment>
+ <comment xml:lang="bg">Пакет — RPM</comment>
+ <comment xml:lang="ca">paquet RPM</comment>
+ <comment xml:lang="cs">Balíček RPM</comment>
+ <comment xml:lang="da">RPM-pakke</comment>
+ <comment xml:lang="de">RPM-Paket</comment>
+ <comment xml:lang="el">πακέτο RPM</comment>
+ <comment xml:lang="en_GB">RPM package</comment>
+ <comment xml:lang="eo">RPM-pakaĵo</comment>
+ <comment xml:lang="es">paquete RPM</comment>
+ <comment xml:lang="eu">RPM paketea</comment>
+ <comment xml:lang="fi">RPM-paketti</comment>
+ <comment xml:lang="fo">RPM pakki</comment>
+ <comment xml:lang="fr">paquet RPM</comment>
+ <comment xml:lang="ga">pacáiste RPM</comment>
+ <comment xml:lang="gl">paquete RFM</comment>
+ <comment xml:lang="he">חבילת RPM</comment>
+ <comment xml:lang="hu">RPM-csomag</comment>
+ <comment xml:lang="id">Paket RPM</comment>
+ <comment xml:lang="it">Pacchetto RPM</comment>
+ <comment xml:lang="ja">RPM パッケージ</comment>
+ <comment xml:lang="kk">RPM дестесі</comment>
+ <comment xml:lang="ko">RPM 패키지</comment>
+ <comment xml:lang="lt">RPM paketas</comment>
+ <comment xml:lang="lv">RPM pakotne</comment>
+ <comment xml:lang="ms">Pakej RPM</comment>
+ <comment xml:lang="nb">RPM-pakke</comment>
+ <comment xml:lang="nl">RPM-pakket</comment>
+ <comment xml:lang="nn">RPM-pakke</comment>
+ <comment xml:lang="pl">Pakiet RPM</comment>
+ <comment xml:lang="pt">pacote RPM</comment>
+ <comment xml:lang="pt_BR">Pacote RPM</comment>
+ <comment xml:lang="ro">Pachet RPM</comment>
+ <comment xml:lang="ru">пакет RPM</comment>
+ <comment xml:lang="sk">Balík RPM</comment>
+ <comment xml:lang="sl">Datoteka paketa RPM</comment>
+ <comment xml:lang="sq">Paketë RPM</comment>
+ <comment xml:lang="sr">RPM пакет</comment>
+ <comment xml:lang="sv">RPM-paket</comment>
+ <comment xml:lang="uk">пакунок RPM</comment>
+ <comment xml:lang="vi">Gói RPM</comment>
+ <comment xml:lang="zh_CN">RPM 软件包</comment>
+ <comment xml:lang="zh_TW">RPM 套件</comment>
+ <generic-icon name="package-x-generic"/>
+ <alias type="application/x-redhat-package-manager"/>
+ <magic priority="50">
+ <match value="\xed\xab\xee\xdb" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.rpm"/>
+ </mime-type>
+ <mime-type type="application/x-ruby">
+ <comment>Ruby script</comment>
+ <comment xml:lang="ar">سكربت روبي</comment>
+ <comment xml:lang="be@latin">Skrypt Ruby</comment>
+ <comment xml:lang="bg">Скрипт — Ruby</comment>
+ <comment xml:lang="ca">script Ruby</comment>
+ <comment xml:lang="cs">Skript v Ruby</comment>
+ <comment xml:lang="da">Rubyprogram</comment>
+ <comment xml:lang="de">Ruby-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών Ruby</comment>
+ <comment xml:lang="en_GB">Ruby script</comment>
+ <comment xml:lang="eo">Ruby-skripto</comment>
+ <comment xml:lang="es">script en Ruby</comment>
+ <comment xml:lang="eu">Ruby script-a</comment>
+ <comment xml:lang="fi">Ruby-komentotiedosto</comment>
+ <comment xml:lang="fo">Ruby boðrøð</comment>
+ <comment xml:lang="fr">script Ruby</comment>
+ <comment xml:lang="ga">script Ruby</comment>
+ <comment xml:lang="gl">Script de Ruby</comment>
+ <comment xml:lang="he">תסריט Ruby</comment>
+ <comment xml:lang="hu">Ruby-parancsfájl</comment>
+ <comment xml:lang="id">Skrip Ruby</comment>
+ <comment xml:lang="it">Script Ruby</comment>
+ <comment xml:lang="ja">Ruby スクリプト</comment>
+ <comment xml:lang="kk">Ruby сценарийі</comment>
+ <comment xml:lang="ko">루비 스크립트</comment>
+ <comment xml:lang="lt">Ruby scenarijus</comment>
+ <comment xml:lang="lv">Ruby skripts</comment>
+ <comment xml:lang="ms">Skrip Ruby</comment>
+ <comment xml:lang="nb">Ruby-skript</comment>
+ <comment xml:lang="nl">Ruby-script</comment>
+ <comment xml:lang="nn">Ruby-skript</comment>
+ <comment xml:lang="pl">Skrypt Ruby</comment>
+ <comment xml:lang="pt">'script' Ruby</comment>
+ <comment xml:lang="pt_BR">Script Ruby</comment>
+ <comment xml:lang="ro">Script Ruby</comment>
+ <comment xml:lang="ru">сценарий Ruby</comment>
+ <comment xml:lang="sk">Skript Ruby</comment>
+ <comment xml:lang="sl">Skriptna datoteka Ruby</comment>
+ <comment xml:lang="sq">Script Ruby</comment>
+ <comment xml:lang="sr">Руби скрипта</comment>
+ <comment xml:lang="sv">Ruby-skript</comment>
+ <comment xml:lang="uk">скрипт Ruby</comment>
+ <comment xml:lang="vi">Văn lệnh Ruby</comment>
+ <comment xml:lang="zh_CN">Ruby 脚本</comment>
+ <comment xml:lang="zh_TW">Ruby 指令稿</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match value="/bin/env ruby" type="string" offset="1:16"/>
+ <match value="/bin/ruby" type="string" offset="1:16"/>
+ </magic>
+ <glob pattern="*.rb"/>
+ </mime-type>
+ <mime-type type="application/x-markaby">
+ <comment>Markaby script</comment>
+ <comment xml:lang="ar">سكربت Markaby</comment>
+ <comment xml:lang="be@latin">Skrypt Markaby</comment>
+ <comment xml:lang="bg">Скрипт — Markaby</comment>
+ <comment xml:lang="ca">script Markaby</comment>
+ <comment xml:lang="cs">Skript Markaby</comment>
+ <comment xml:lang="da">Markabyprogram</comment>
+ <comment xml:lang="de">Markaby-Skript</comment>
+ <comment xml:lang="eo">Markaby-skripto</comment>
+ <comment xml:lang="es">script en Markaby</comment>
+ <comment xml:lang="eu">Markaby script-a</comment>
+ <comment xml:lang="fi">Markaby-komentotiedosto</comment>
+ <comment xml:lang="fo">Markaby boðrøð</comment>
+ <comment xml:lang="fr">script Markaby</comment>
+ <comment xml:lang="ga">script Markaby</comment>
+ <comment xml:lang="gl">Script de Markaby</comment>
+ <comment xml:lang="he">תסריט Markby</comment>
+ <comment xml:lang="hu">Markaby parancsfájl</comment>
+ <comment xml:lang="id">Skrip Markaby</comment>
+ <comment xml:lang="it">Script Markaby</comment>
+ <comment xml:lang="ja">Markaby スクリプト</comment>
+ <comment xml:lang="kk">Markaby сценарийі</comment>
+ <comment xml:lang="ko">Markaby 스크립트</comment>
+ <comment xml:lang="lt">Markaby scenarijus</comment>
+ <comment xml:lang="lv">Markaby skripts</comment>
+ <comment xml:lang="nb">Markaby-skript</comment>
+ <comment xml:lang="nl">Markaby-script</comment>
+ <comment xml:lang="nn">Markaby-skript</comment>
+ <comment xml:lang="pl">Skrypt Markaby</comment>
+ <comment xml:lang="pt_BR">Script Markaby</comment>
+ <comment xml:lang="ro">Script Markaby</comment>
+ <comment xml:lang="ru">сценарий Markaby</comment>
+ <comment xml:lang="sk">Skript Markaby</comment>
+ <comment xml:lang="sl">Skriptna datoteka Markaby</comment>
+ <comment xml:lang="sq">Script Markaby</comment>
+ <comment xml:lang="sv">Markaby-skript</comment>
+ <comment xml:lang="uk">скрипт Markaby</comment>
+ <comment xml:lang="vi">Văn lệnh Markaby</comment>
+ <comment xml:lang="zh_CN">RMarkaby 脚本</comment>
+ <comment xml:lang="zh_TW">Markaby 指令稿</comment>
+ <sub-class-of type="application/x-ruby"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.mab"/>
+ </mime-type>
+ <mime-type type="application/x-sc">
+ <comment>SC/Xspread spreadsheet</comment>
+ <comment xml:lang="ar">جدول SC/Xspread</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš SC/Xspread</comment>
+ <comment xml:lang="bg">Таблица — SC/Xspread</comment>
+ <comment xml:lang="ca">full de càlcul de SC/Xspread</comment>
+ <comment xml:lang="cs">Sešit SC/Xspread</comment>
+ <comment xml:lang="da">SC/Xspread-regneark</comment>
+ <comment xml:lang="de">SX/Xspread-Tabelle</comment>
+ <comment xml:lang="en_GB">SC/Xspread spreadsheet</comment>
+ <comment xml:lang="eo">SC/Xspread-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo SC/Xspread</comment>
+ <comment xml:lang="eu">SC/Xspread kalkulu-orria</comment>
+ <comment xml:lang="fi">SC/Xspread-taulukko</comment>
+ <comment xml:lang="fo">SC/Xspread rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul SC/Xspread</comment>
+ <comment xml:lang="ga">scarbhileog SC/Xspread</comment>
+ <comment xml:lang="gl">folla de cálculo SC/Xspread</comment>
+ <comment xml:lang="he">גליון נתונית של SC/Xspread</comment>
+ <comment xml:lang="hu">SC/Xspread táblázat</comment>
+ <comment xml:lang="id">Lembar sebar SC/Xspread</comment>
+ <comment xml:lang="it">Foglio di calcolo SC/Xspread</comment>
+ <comment xml:lang="ja">SC/Xspread スプレッドシート</comment>
+ <comment xml:lang="kk">SC/Xspread электрондық кестесі</comment>
+ <comment xml:lang="ko">SC/Xspread 스프레드시트</comment>
+ <comment xml:lang="lt">SC/Xspread skaičialentė</comment>
+ <comment xml:lang="lv">SC/Xspread izklājlapa</comment>
+ <comment xml:lang="nb">SC/Xspread-regneark</comment>
+ <comment xml:lang="nl">SC/Xspread-rekenblad</comment>
+ <comment xml:lang="nn">SC/Xspread-rekneark</comment>
+ <comment xml:lang="pl">Arkusz SC/Xspread</comment>
+ <comment xml:lang="pt_BR">Planilha do SC/Xspread</comment>
+ <comment xml:lang="ro">Foaie de calcul SC/Xspread</comment>
+ <comment xml:lang="ru">электронная таблица SC/Xspread</comment>
+ <comment xml:lang="sk">Zošit SC/Xspread</comment>
+ <comment xml:lang="sl">Razpredelnica SC/Xspread</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh SC/Xspread</comment>
+ <comment xml:lang="sv">SC/Xspread-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця SC/Xspread</comment>
+ <comment xml:lang="vi">Bảng tính SC/Xspread</comment>
+ <comment xml:lang="zh_CN">SC/Xspread 工作簿</comment>
+ <comment xml:lang="zh_TW">SC/Xspread 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="50">
+ <match value="Spreadsheet" type="string" offset="38"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-shar">
+ <comment>shell archive</comment>
+ <comment xml:lang="ar">أرشيف شِل</comment>
+ <comment xml:lang="az">qabıq arxivi</comment>
+ <comment xml:lang="be@latin">archiŭ abałonki</comment>
+ <comment xml:lang="bg">Архив на обвивката</comment>
+ <comment xml:lang="ca">arxiu d'intèrpret d'ordres</comment>
+ <comment xml:lang="cs">Archiv shellu</comment>
+ <comment xml:lang="cy">archif plisgyn</comment>
+ <comment xml:lang="da">skalarkiv</comment>
+ <comment xml:lang="de">Shell-Archiv</comment>
+ <comment xml:lang="el">αρχείο φλοιού (SHAR)</comment>
+ <comment xml:lang="en_GB">shell archive</comment>
+ <comment xml:lang="eo">ŝel-arkivo</comment>
+ <comment xml:lang="es">archivador shell</comment>
+ <comment xml:lang="eu">shell artxiboa</comment>
+ <comment xml:lang="fi">komentotulkkiarkisto</comment>
+ <comment xml:lang="fo">skel savn</comment>
+ <comment xml:lang="fr">archive shell</comment>
+ <comment xml:lang="ga">cartlann bhlaoisce</comment>
+ <comment xml:lang="gl">ficheiro shell</comment>
+ <comment xml:lang="he">ארכיון מעטפת</comment>
+ <comment xml:lang="hu">héjarchívum</comment>
+ <comment xml:lang="id">arsip shell</comment>
+ <comment xml:lang="it">Archivio shell</comment>
+ <comment xml:lang="ja">シェルアーカイブ</comment>
+ <comment xml:lang="kk">қоршам архиві</comment>
+ <comment xml:lang="ko">쉘 묶음 파일</comment>
+ <comment xml:lang="lt">shell archyvas</comment>
+ <comment xml:lang="lv">čaulas arhīvs</comment>
+ <comment xml:lang="ms">Arkib shell</comment>
+ <comment xml:lang="nb">skallarkiv</comment>
+ <comment xml:lang="nl">shell-archief</comment>
+ <comment xml:lang="nn">skal-arkiv</comment>
+ <comment xml:lang="pl">Archiwum powłoki</comment>
+ <comment xml:lang="pt">arquivo de consola</comment>
+ <comment xml:lang="pt_BR">Pacote shell</comment>
+ <comment xml:lang="ro">arhivă shell</comment>
+ <comment xml:lang="ru">архив оболочки UNIX</comment>
+ <comment xml:lang="sk">Archív shellu</comment>
+ <comment xml:lang="sl">lupinski arhiv</comment>
+ <comment xml:lang="sq">Arkiv shell</comment>
+ <comment xml:lang="sr">Архива љуске (SHAR)</comment>
+ <comment xml:lang="sv">skalarkiv</comment>
+ <comment xml:lang="uk">архів оболонки</comment>
+ <comment xml:lang="vi">kho trình bao</comment>
+ <comment xml:lang="zh_CN">shell 归档文件</comment>
+ <comment xml:lang="zh_TW">shell 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.shar"/>
+ </mime-type>
+ <mime-type type="application/x-shared-library-la">
+ <comment>libtool shared library</comment>
+ <comment xml:lang="ar">مكتبة libtool المشتركة</comment>
+ <comment xml:lang="be@latin">supolnaja biblijateka libtool</comment>
+ <comment xml:lang="bg">Споделена библиотека — libtool</comment>
+ <comment xml:lang="ca">biblioteca compartida libtool</comment>
+ <comment xml:lang="cs">Sdílená knihovna libtool</comment>
+ <comment xml:lang="da">libtool delt bibliotek</comment>
+ <comment xml:lang="de">Gemeinsame libtool-Bibliothek</comment>
+ <comment xml:lang="es">biblioteca compartida de libtool</comment>
+ <comment xml:lang="eu">libtool partekatutako liburutegia</comment>
+ <comment xml:lang="fi">jaettu libtool-kirjasto</comment>
+ <comment xml:lang="fo">libtool felagssavn</comment>
+ <comment xml:lang="fr">bibliothèque partagée libtool</comment>
+ <comment xml:lang="ga">comhleabharlann libtool</comment>
+ <comment xml:lang="gl">biblioteca compartida de libtool</comment>
+ <comment xml:lang="he">ספריה משותפת של libtool</comment>
+ <comment xml:lang="hu">libtool osztott programkönyvtár</comment>
+ <comment xml:lang="id">pustaka bersama libtool</comment>
+ <comment xml:lang="it">Libreria condivisa libtool</comment>
+ <comment xml:lang="ja">libtool 共有ライブラリ</comment>
+ <comment xml:lang="kk">libtool ортақ жинағы</comment>
+ <comment xml:lang="ko">libtool 공유 라이브러리</comment>
+ <comment xml:lang="lt">libtool bendroji biblioteka</comment>
+ <comment xml:lang="lv">libtool koplietotā bibliotēka</comment>
+ <comment xml:lang="nb">libtool delt bibliotek</comment>
+ <comment xml:lang="nl">gedeelde libtool-bibliotheek</comment>
+ <comment xml:lang="nn">libtool delt bibliotek</comment>
+ <comment xml:lang="pl">Biblioteka współdzielona libtool</comment>
+ <comment xml:lang="pt_BR">biblioteca compartilhada libtool</comment>
+ <comment xml:lang="ro">bibliotecă partajată libtool</comment>
+ <comment xml:lang="ru">разделяемая библиотека libtool</comment>
+ <comment xml:lang="sk">Zdieľaná knižnica libtool</comment>
+ <comment xml:lang="sl">Souporabna knjižnica libtool</comment>
+ <comment xml:lang="sq">Librari e përbashkët libtool</comment>
+ <comment xml:lang="sv">delat libtool-bibliotek</comment>
+ <comment xml:lang="uk">спільна бібліотека libtool</comment>
+ <comment xml:lang="vi">thư viện dùng chung libtool</comment>
+ <comment xml:lang="zh_CN">libtool 共享库</comment>
+ <comment xml:lang="zh_TW">libtool 共享函式庫</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.la"/>
+ </mime-type>
+ <mime-type type="application/x-sharedlib">
+ <comment>shared library</comment>
+ <comment xml:lang="ar">مكتبة مشتركة</comment>
+ <comment xml:lang="az">bölüşülmüş kitabxana</comment>
+ <comment xml:lang="be@latin">supolnaja biblijateka</comment>
+ <comment xml:lang="bg">Споделена библиотека</comment>
+ <comment xml:lang="ca">biblioteca compartida</comment>
+ <comment xml:lang="cs">Sdílená knihovna</comment>
+ <comment xml:lang="cy">llyfrgell wedi ei rhannu</comment>
+ <comment xml:lang="da">delt bibliotek</comment>
+ <comment xml:lang="de">Gemeinsame Bibliothek</comment>
+ <comment xml:lang="el">αρχείο κοινόχρηστης βιβλιοθήκης</comment>
+ <comment xml:lang="en_GB">shared library</comment>
+ <comment xml:lang="eo">dinamike bindebla biblioteko</comment>
+ <comment xml:lang="es">biblioteca compartida</comment>
+ <comment xml:lang="eu">partekatutako liburutegia</comment>
+ <comment xml:lang="fi">jaettu kirjasto</comment>
+ <comment xml:lang="fo">felagssavn</comment>
+ <comment xml:lang="fr">bibliothèque partagée</comment>
+ <comment xml:lang="ga">comhleabharlann</comment>
+ <comment xml:lang="gl">biblioteca compartida</comment>
+ <comment xml:lang="he">ספרייה משותפת</comment>
+ <comment xml:lang="hu">osztott programkönyvtár</comment>
+ <comment xml:lang="id">pustaka bersama</comment>
+ <comment xml:lang="it">Libreria condivisa</comment>
+ <comment xml:lang="ja">共有ライブラリ</comment>
+ <comment xml:lang="kk">бөлісетін библиотека</comment>
+ <comment xml:lang="ko">공유 라이브러리</comment>
+ <comment xml:lang="lt">bendroji biblioteka</comment>
+ <comment xml:lang="lv">koplietotā bibliotēka</comment>
+ <comment xml:lang="ms">Pustaka terkongsi</comment>
+ <comment xml:lang="nb">delt bibliotek</comment>
+ <comment xml:lang="nl">gedeelde bibliotheek</comment>
+ <comment xml:lang="nn">delt bibliotek</comment>
+ <comment xml:lang="pl">Biblioteka współdzielona</comment>
+ <comment xml:lang="pt">biblioteca partilhada</comment>
+ <comment xml:lang="pt_BR">biblioteca compartilhada</comment>
+ <comment xml:lang="ro">bibliotecă partajată</comment>
+ <comment xml:lang="ru">разделяемая библиотека</comment>
+ <comment xml:lang="sk">Zdieľaná knižnica</comment>
+ <comment xml:lang="sl">souporabljena knjižnica</comment>
+ <comment xml:lang="sq">Librari e përbashkët</comment>
+ <comment xml:lang="sr">дељена библиотека</comment>
+ <comment xml:lang="sv">delat bibliotek</comment>
+ <comment xml:lang="uk">спільна бібліотека</comment>
+ <comment xml:lang="vi">thư viện dùng chung</comment>
+ <comment xml:lang="zh_CN">共享库</comment>
+ <comment xml:lang="zh_TW">共享函式庫</comment>
+ <magic priority="50">
+ <match value="\177ELF" type="string" offset="0">
+ <match value="1" type="byte" offset="5">
+ <match value="3" type="little16" offset="16"/>
+ </match>
+ </match>
+ <match value="\177ELF" type="string" offset="0">
+ <match value="2" type="byte" offset="5">
+ <match value="3" type="big16" offset="16"/>
+ </match>
+ </match>
+ <match value="0603" type="little16" offset="0">
+ <match value="020000" type="little16" offset="22" mask="030000"/>
+ </match>
+ <match value="\177ELF \003" type="string" offset="0" mask="0xffffffff000000000000000000000000ff"/>
+ </magic>
+ <glob pattern="*.so"/>
+ </mime-type>
+ <mime-type type="application/x-shellscript">
+ <comment>shell script</comment>
+ <comment xml:lang="ar">سكربت شِل</comment>
+ <comment xml:lang="az">qabıq skripti</comment>
+ <comment xml:lang="be@latin">skrypt abałonki</comment>
+ <comment xml:lang="bg">Скрипт на обвивката</comment>
+ <comment xml:lang="ca">script d'intèrpret d'ordres</comment>
+ <comment xml:lang="cs">Skript shellu</comment>
+ <comment xml:lang="cy">sgript plisgyn</comment>
+ <comment xml:lang="da">skalprogram</comment>
+ <comment xml:lang="de">Shell-Skript</comment>
+ <comment xml:lang="el">αρχείο εντολών φλοιού</comment>
+ <comment xml:lang="en_GB">shell script</comment>
+ <comment xml:lang="eo">ŝelskripto</comment>
+ <comment xml:lang="es">script en shell</comment>
+ <comment xml:lang="eu">shell script-a</comment>
+ <comment xml:lang="fi">komentotulkin komentotiedosto</comment>
+ <comment xml:lang="fo">skel boðrøð</comment>
+ <comment xml:lang="fr">script shell</comment>
+ <comment xml:lang="ga">script bhlaoisce</comment>
+ <comment xml:lang="gl">script de shell</comment>
+ <comment xml:lang="he">תסריט מעטפת</comment>
+ <comment xml:lang="hu">héj-parancsfájl</comment>
+ <comment xml:lang="id">skrip shell</comment>
+ <comment xml:lang="it">Script shell</comment>
+ <comment xml:lang="ja">シェルスクリプト</comment>
+ <comment xml:lang="kk">қоршам сценарийі</comment>
+ <comment xml:lang="ko">쉘 스크립트</comment>
+ <comment xml:lang="lt">shell scenarijus</comment>
+ <comment xml:lang="lv">čaulas skripts</comment>
+ <comment xml:lang="ms">Skrip shell</comment>
+ <comment xml:lang="nb">skallskript</comment>
+ <comment xml:lang="nl">shellscript</comment>
+ <comment xml:lang="nn">skalskript</comment>
+ <comment xml:lang="pl">Skrypt powłoki</comment>
+ <comment xml:lang="pt">'script' de consola</comment>
+ <comment xml:lang="pt_BR">script shell</comment>
+ <comment xml:lang="ro">script shell</comment>
+ <comment xml:lang="ru">сценарий оболочки UNIX</comment>
+ <comment xml:lang="sk">Skript shellu</comment>
+ <comment xml:lang="sl">lupinski skript</comment>
+ <comment xml:lang="sq">Script shell</comment>
+ <comment xml:lang="sr">скрипта љуске</comment>
+ <comment xml:lang="sv">skalskript</comment>
+ <comment xml:lang="uk">скрипт оболонки</comment>
+ <comment xml:lang="vi">văn lệnh trình bao</comment>
+ <comment xml:lang="zh_CN">shell 脚本</comment>
+ <comment xml:lang="zh_TW">shell 指令稿</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <alias type="text/x-sh"/>
+ <generic-icon name="text-x-script"/>
+ <magic priority="50">
+ <match value="# This is a shell archive" type="string" offset="10"/>
+ <match value="/bin/bash" type="string" offset="1:16"/>
+ <match value="/bin/nawk" type="string" offset="1:16"/>
+ <match value="/bin/zsh" type="string" offset="1:16"/>
+ <match value="/bin/sh" type="string" offset="1:16"/>
+ <match value="/bin/ksh" type="string" offset="1:16"/>
+ <match value="/bin/dash" type="string" offset="1:16"/>
+ <match value="#!/usr/bin/env sh" type="string" offset="0"/>
+ <match value="#!/usr/bin/env bash" type="string" offset="0"/>
+ <match value="#!/usr/bin/env zsh" type="string" offset="0"/>
+ <match value="#!/usr/bin/env ksh" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.sh"/>
+ </mime-type>
+ <mime-type type="application/x-shockwave-flash">
+ <comment>Shockwave Flash file</comment>
+ <comment xml:lang="ar">ملف Shockwave Flash</comment>
+ <comment xml:lang="be@latin">Fajł Shockwave Flash</comment>
+ <comment xml:lang="bg">Файл — Shockwave Flash</comment>
+ <comment xml:lang="ca">fitxer Shockwave Flash</comment>
+ <comment xml:lang="cs">Soubor Shockwave Flash</comment>
+ <comment xml:lang="da">Shockwave Flash-fil</comment>
+ <comment xml:lang="de">Shockwave-Flash-Datei</comment>
+ <comment xml:lang="el">αρχείο Shockwave Flash</comment>
+ <comment xml:lang="en_GB">Shockwave Flash file</comment>
+ <comment xml:lang="eo">dosiero de Shockwave Flash</comment>
+ <comment xml:lang="es">archivo Shockwave Flash</comment>
+ <comment xml:lang="eu">Shockwave Flash fitxategia</comment>
+ <comment xml:lang="fi">Shockwave Flash -tiedosto</comment>
+ <comment xml:lang="fo">Shockwave Flash fíla</comment>
+ <comment xml:lang="fr">fichier Shockwave Flash</comment>
+ <comment xml:lang="ga">comhad Shockwave Flash</comment>
+ <comment xml:lang="gl">ficheiro sockwave Flash</comment>
+ <comment xml:lang="he">קובץ של Shockwave Flash</comment>
+ <comment xml:lang="hu">Shockwave Flash-fájl</comment>
+ <comment xml:lang="id">Berkas Shockwave Flash</comment>
+ <comment xml:lang="it">File Shockwave Flash</comment>
+ <comment xml:lang="ja">Shockwave Flash ファイル</comment>
+ <comment xml:lang="kk">Shockwave Flash файлы</comment>
+ <comment xml:lang="ko">Shockwave 플래시 파일</comment>
+ <comment xml:lang="lt">Shockwave Flash failas</comment>
+ <comment xml:lang="lv">Shockwave Flash fails</comment>
+ <comment xml:lang="ms">Fail Shockwave Flash</comment>
+ <comment xml:lang="nb">Shockwave Flash-fil</comment>
+ <comment xml:lang="nl">Shockwave Flash-bestand</comment>
+ <comment xml:lang="nn">Shockwave Flash-fil</comment>
+ <comment xml:lang="pl">Plik Shockwave Flash</comment>
+ <comment xml:lang="pt">ficheiro Shockwave Flash</comment>
+ <comment xml:lang="pt_BR">Arquivo Shockwave Flash</comment>
+ <comment xml:lang="ro">Fișier Shockwave Flash</comment>
+ <comment xml:lang="ru">файл Shockwave Flash</comment>
+ <comment xml:lang="sk">Súbor Shockwave Flash</comment>
+ <comment xml:lang="sl">Datoteka Shockwave Flash</comment>
+ <comment xml:lang="sq">File Flash Shockwave</comment>
+ <comment xml:lang="sr">Шоквејв Флеш датотека</comment>
+ <comment xml:lang="sv">Shockwave Flash-fil</comment>
+ <comment xml:lang="uk">файл Shockwave Flash</comment>
+ <comment xml:lang="vi">Tập tin Flash Shockwave</comment>
+ <comment xml:lang="zh_CN">Shockwave Flash 文件</comment>
+ <comment xml:lang="zh_TW">Shockwave Flash 檔</comment>
+ <alias type="application/futuresplash"/>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+ <match value="FWS" type="string" offset="0"/>
+ <match value="CWS" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.swf"/>
+ <glob pattern="*.spl"/>
+ </mime-type>
+ <mime-type type="application/x-shorten">
+
+ <comment>Shorten audio</comment>
+ <comment xml:lang="ar">Shorten سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Shorten</comment>
+ <comment xml:lang="bg">Аудио — Shorten</comment>
+ <comment xml:lang="ca">àudio Shorten</comment>
+ <comment xml:lang="cs">Zvuk Shorten</comment>
+ <comment xml:lang="da">Shortenlyd</comment>
+ <comment xml:lang="de">Shorten-Audio</comment>
+ <comment xml:lang="en_GB">Shorten audio</comment>
+ <comment xml:lang="eo">Shorten-sondosiero</comment>
+ <comment xml:lang="es">sonido Shorten</comment>
+ <comment xml:lang="eu">Shorten audioa</comment>
+ <comment xml:lang="fi">Shorten-ääni</comment>
+ <comment xml:lang="fo">Shorten ljóður</comment>
+ <comment xml:lang="fr">audio Shorten</comment>
+ <comment xml:lang="ga">fuaim Shorten</comment>
+ <comment xml:lang="gl">son Shorten</comment>
+ <comment xml:lang="he">שמע של Shorten</comment>
+ <comment xml:lang="hu">Shorten hang</comment>
+ <comment xml:lang="id">Audio Shorten</comment>
+ <comment xml:lang="it">Audio Shorten</comment>
+ <comment xml:lang="ja">Shorten オーディオ</comment>
+ <comment xml:lang="kk">Shorten аудиосы</comment>
+ <comment xml:lang="ko">Shorten 오디오</comment>
+ <comment xml:lang="lt">Shorten garso įrašas</comment>
+ <comment xml:lang="lv">Shorten audio</comment>
+ <comment xml:lang="nb">Shorten lyd</comment>
+ <comment xml:lang="nl">Shorten-audio</comment>
+ <comment xml:lang="nn">Shorten-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Shorten</comment>
+ <comment xml:lang="pt_BR">Áudio Shorten</comment>
+ <comment xml:lang="ro">Audio Shorten</comment>
+ <comment xml:lang="ru">аудио Shorten</comment>
+ <comment xml:lang="sk">Zvuk Shorten</comment>
+ <comment xml:lang="sl">Zvočna datoteka Shorten</comment>
+ <comment xml:lang="sq">Audio Shorten</comment>
+ <comment xml:lang="sv">Shorten-ljud</comment>
+ <comment xml:lang="uk">звук Shorten</comment>
+ <comment xml:lang="vi">Âm thanh Shorten</comment>
+ <comment xml:lang="zh_CN">Shorten 音频</comment>
+ <comment xml:lang="zh_TW">Shorten 音訊</comment>
+ <generic-icon name="audio-x-generic"/>
+ <magic priority="50">
+ <match value="ajkg" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.shn"/>
+ </mime-type>
+ <mime-type type="application/x-siag">
+ <comment>Siag spreadsheet</comment>
+ <comment xml:lang="ar">جدول Siag</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Siag</comment>
+ <comment xml:lang="bg">Таблица — Siag</comment>
+ <comment xml:lang="ca">full de càlcul Siag</comment>
+ <comment xml:lang="cs">Sešit Siag</comment>
+ <comment xml:lang="da">Siagregneark</comment>
+ <comment xml:lang="de">Siag-Tabelle</comment>
+ <comment xml:lang="el">λογιστικό φύλλο Siag</comment>
+ <comment xml:lang="en_GB">Siag spreadsheet</comment>
+ <comment xml:lang="eo">Siag-kalkultabelo</comment>
+ <comment xml:lang="es">hoja de cálculo de Siag</comment>
+ <comment xml:lang="eu">Siag kalkulu-orria</comment>
+ <comment xml:lang="fi">Siag-taulukko</comment>
+ <comment xml:lang="fo">Siag rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Siag</comment>
+ <comment xml:lang="ga">scarbhileog Siag</comment>
+ <comment xml:lang="gl">folla de cálculo de Siag</comment>
+ <comment xml:lang="he">גליון נתונים של Siag</comment>
+ <comment xml:lang="hu">Siag-munkafüzet</comment>
+ <comment xml:lang="id">Lembar sebar Siag</comment>
+ <comment xml:lang="it">Foglio di calcolo Siag</comment>
+ <comment xml:lang="ja">Siag スプレッドシート</comment>
+ <comment xml:lang="kk">Siag электрондық кестесі</comment>
+ <comment xml:lang="ko">Siag 스프레드시트</comment>
+ <comment xml:lang="lt">Siag skaičialentė</comment>
+ <comment xml:lang="lv">Siag izklājlapa</comment>
+ <comment xml:lang="ms">Hamparan Siag</comment>
+ <comment xml:lang="nb">Siag-regneark</comment>
+ <comment xml:lang="nl">Siag-rekenblad</comment>
+ <comment xml:lang="nn">Siag-rekneark</comment>
+ <comment xml:lang="pl">Arkusz Siag</comment>
+ <comment xml:lang="pt">folha de cálculo Siag</comment>
+ <comment xml:lang="pt_BR">Planilha do Siag</comment>
+ <comment xml:lang="ro">Foaie de calcul Siag</comment>
+ <comment xml:lang="ru">электронная таблица Siag</comment>
+ <comment xml:lang="sk">Zošit Siag</comment>
+ <comment xml:lang="sl">Razpredelnica Siag</comment>
+ <comment xml:lang="sq">Fletë llogaritjesh Siag</comment>
+ <comment xml:lang="sr">Siag табеларни прорачун</comment>
+ <comment xml:lang="sv">Siag-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Siag</comment>
+ <comment xml:lang="vi">Bảng tính Slag</comment>
+ <comment xml:lang="zh_CN">Siag 工作簿</comment>
+ <comment xml:lang="zh_TW">Siag 試算表</comment>
+ <generic-icon name="x-office-spreadsheet"/>
+ <glob pattern="*.siag"/>
+ </mime-type>
+ <mime-type type="image/x-skencil">
+ <comment>Skencil document</comment>
+ <comment xml:lang="ar">مستند Skencil</comment>
+ <comment xml:lang="be@latin">Dakument Skencil</comment>
+ <comment xml:lang="bg">Документ — Skencil</comment>
+ <comment xml:lang="ca">document Skencil</comment>
+ <comment xml:lang="cs">Dokument Skencil</comment>
+ <comment xml:lang="da">Skencildokument</comment>
+ <comment xml:lang="de">Skencil-Dokument</comment>
+ <comment xml:lang="eo">Skencil-dokumento</comment>
+ <comment xml:lang="es">documento Skencil</comment>
+ <comment xml:lang="eu">Skencil dokumentua</comment>
+ <comment xml:lang="fi">Skencil-asiakirja</comment>
+ <comment xml:lang="fo">Skencil skjal</comment>
+ <comment xml:lang="fr">document Skencil</comment>
+ <comment xml:lang="ga">cáipéis Skencil</comment>
+ <comment xml:lang="gl">documento Skencil</comment>
+ <comment xml:lang="he">מסמך Skencil</comment>
+ <comment xml:lang="hu">Skencil-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Skencil</comment>
+ <comment xml:lang="it">Documento Skencil</comment>
+ <comment xml:lang="ja">Skencil ドキュメント</comment>
+ <comment xml:lang="kk">Skencil құжаты</comment>
+ <comment xml:lang="ko">Skencil 문서</comment>
+ <comment xml:lang="lt">Skencil dokumentas</comment>
+ <comment xml:lang="lv">Skencil dokuments</comment>
+ <comment xml:lang="nl">Skencil-document</comment>
+ <comment xml:lang="nn">Skencil-dokument</comment>
+ <comment xml:lang="pl">Dokument Skencil</comment>
+ <comment xml:lang="pt_BR">Documento do Skencil</comment>
+ <comment xml:lang="ro">Document Skencil</comment>
+ <comment xml:lang="ru">документ Skencil</comment>
+ <comment xml:lang="sk">Dokument Skencil</comment>
+ <comment xml:lang="sl">Dokument Skencil</comment>
+ <comment xml:lang="sq">Dokument Skencil</comment>
+ <comment xml:lang="sv">Skencil-dokument</comment>
+ <comment xml:lang="uk">документ Skencil</comment>
+ <comment xml:lang="vi">Tài liệu Skencil</comment>
+ <comment xml:lang="zh_CN">Skencil 文档</comment>
+ <comment xml:lang="zh_TW">Skencil 文件</comment>
+ <glob pattern="*.sk"/>
+ <glob pattern="*.sk1"/>
+ <magic priority="50">
+ <match value="##Sketch" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-slp">
+ <comment>Stampede package</comment>
+ <comment xml:lang="ar">حزمة Stampede</comment>
+ <comment xml:lang="az">Stampede paketi</comment>
+ <comment xml:lang="be@latin">Pakunak Stampede</comment>
+ <comment xml:lang="bg">Пакет — Stampede</comment>
+ <comment xml:lang="ca">paquet Stampede</comment>
+ <comment xml:lang="cs">Balíček Stampede</comment>
+ <comment xml:lang="cy">Pecyn Stampede</comment>
+ <comment xml:lang="da">Stampedepakke</comment>
+ <comment xml:lang="de">Stampede-Paket</comment>
+ <comment xml:lang="el">πακέτο Stampede</comment>
+ <comment xml:lang="en_GB">Stampede package</comment>
+ <comment xml:lang="eo">Stampede-pakaĵo</comment>
+ <comment xml:lang="es">paquete Stampede</comment>
+ <comment xml:lang="eu">Stampede paketea</comment>
+ <comment xml:lang="fi">Stampede-paketti</comment>
+ <comment xml:lang="fo">Stampede pakki</comment>
+ <comment xml:lang="fr">paquet Stampede</comment>
+ <comment xml:lang="ga">pacáiste Stampede</comment>
+ <comment xml:lang="gl">paquete Stampede</comment>
+ <comment xml:lang="he">חבילה של Stampede</comment>
+ <comment xml:lang="hu">Stampede-csomag</comment>
+ <comment xml:lang="id">Paket Stampede</comment>
+ <comment xml:lang="it">Pacchetto Stampede</comment>
+ <comment xml:lang="ja">Stampede パッケージ</comment>
+ <comment xml:lang="kk">Stampede дестесі</comment>
+ <comment xml:lang="ko">스탬피드 패키지</comment>
+ <comment xml:lang="lt">Stampede paketas</comment>
+ <comment xml:lang="lv">Stampede pakotne</comment>
+ <comment xml:lang="ms">Pakej Stampede</comment>
+ <comment xml:lang="nb">Stampede-pakke</comment>
+ <comment xml:lang="nl">Stampede-pakket</comment>
+ <comment xml:lang="nn">Stampede-pakke</comment>
+ <comment xml:lang="pl">Pakiet Stampede</comment>
+ <comment xml:lang="pt">pacote Stampede</comment>
+ <comment xml:lang="pt_BR">Pacote Stampede</comment>
+ <comment xml:lang="ro">Pachet Stampede</comment>
+ <comment xml:lang="ru">пакет Stampede</comment>
+ <comment xml:lang="sk">Balíček Stampede</comment>
+ <comment xml:lang="sl">Datoteka paketa Stampede</comment>
+ <comment xml:lang="sq">Paketë Stampede</comment>
+ <comment xml:lang="sr">Stampede пакет</comment>
+ <comment xml:lang="sv">Stampede-paket</comment>
+ <comment xml:lang="uk">пакунок Stampede</comment>
+ <comment xml:lang="vi">Gói Stampede</comment>
+ <comment xml:lang="zh_CN">Stampede 软件包</comment>
+ <comment xml:lang="zh_TW">Stampede 套件</comment>
+ <generic-icon name="package-x-generic"/>
+ </mime-type>
+ <mime-type type="application/x-sms-rom">
+ <comment>Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="ar">ROM الخاص بدولاب لعبة/نظام سيجا ماستر</comment>
+ <comment xml:lang="be@latin">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="bg">ROM — Sega Master System/Game Gear</comment>
+ <comment xml:lang="ca">ROM de Sega Master System/Game Gear</comment>
+ <comment xml:lang="cs">ROM pro Sega Master System/Game Gear</comment>
+ <comment xml:lang="da">Sega Master System/Game Gear-rom</comment>
+ <comment xml:lang="de">Sega-Master-System/Game-Gear-ROM</comment>
+ <comment xml:lang="es">ROM de Sega Master System/Game Gear</comment>
+ <comment xml:lang="eu">Sega Master System/Game Gear-eko ROMa</comment>
+ <comment xml:lang="fi">Sega Master System/Game Gear -ROM</comment>
+ <comment xml:lang="fo">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="fr">ROM Sega Master System/Game Gear</comment>
+ <comment xml:lang="ga">ROM Sega Master System/Game Gear</comment>
+ <comment xml:lang="gl">ROM de Sega Master System/Game Gear</comment>
+ <comment xml:lang="he">Sega Master System/Game Gear של ROM</comment>
+ <comment xml:lang="hu">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Sega Master System/Game Gear</comment>
+ <comment xml:lang="it">ROM Sega Master System/Game Gear</comment>
+ <comment xml:lang="ja">セガ マスターシステム/ゲームギア ROM</comment>
+ <comment xml:lang="kk">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="ko">Sega Master System/Game Gear 롬</comment>
+ <comment xml:lang="lt">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="lv">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="nb">Sega Master System/Game Gear-ROM</comment>
+ <comment xml:lang="nl">Sega Master System/Game Gear-ROM</comment>
+ <comment xml:lang="nn">Sega Master System/Game Gear-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli SMS/Game Gear</comment>
+ <comment xml:lang="pt_BR">ROM do Master System/Game Gear</comment>
+ <comment xml:lang="ro">ROM Sega Master System/Game Gear</comment>
+ <comment xml:lang="ru">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="sk">ROM pre Sega Master System/Game Gear</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Sega Master System/Game Gear</comment>
+ <comment xml:lang="sq">ROM Sega Master System/Game Gear</comment>
+ <comment xml:lang="sv">Sega Master System/Game Gear-rom</comment>
+ <comment xml:lang="uk">ППП Sega Master System/Game Gear</comment>
+ <comment xml:lang="vi">ROM Sega Master System/Game Gear</comment>
+ <comment xml:lang="zh_CN">Sega Master System/Game Gear ROM</comment>
+ <comment xml:lang="zh_TW">Sega Master System/Game Gear ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.sms"/>
+ <glob pattern="*.gg"/>
+ </mime-type>
+ <mime-type type="application/x-snes-rom">
+
+ <comment>Super NES ROM</comment>
+ <comment xml:lang="ar">Super NES ROM</comment>
+ <comment xml:lang="be@latin">Super Nintendo ROM</comment>
+ <comment xml:lang="bg">ROM — Super NES</comment>
+ <comment xml:lang="ca">ROM de Super NES</comment>
+ <comment xml:lang="cs">ROM pro Super Nintendo</comment>
+ <comment xml:lang="da">Super NES-rom</comment>
+ <comment xml:lang="de">Super-NES-ROM</comment>
+ <comment xml:lang="es">ROM de Super NES</comment>
+ <comment xml:lang="eu">Super Nintendo-ko ROMa</comment>
+ <comment xml:lang="fi">Super Nintendo -ROM</comment>
+ <comment xml:lang="fo">Super NES ROM</comment>
+ <comment xml:lang="fr">ROM Super Nintendo</comment>
+ <comment xml:lang="ga">ROM Super NES</comment>
+ <comment xml:lang="gl">ROM de Super NES</comment>
+ <comment xml:lang="he">ROM של Super NES</comment>
+ <comment xml:lang="hu">Super NES ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Super Nintendo</comment>
+ <comment xml:lang="it">ROM Super Nintendo</comment>
+ <comment xml:lang="ja">スーパーファミコン ROM</comment>
+ <comment xml:lang="kk">Super NES ROM</comment>
+ <comment xml:lang="ko">슈퍼 NES 롬</comment>
+ <comment xml:lang="lt">Super NES ROM</comment>
+ <comment xml:lang="lv">Super NES ROM</comment>
+ <comment xml:lang="nb">Super Nintendo ROM</comment>
+ <comment xml:lang="nl">Super Nintendo</comment>
+ <comment xml:lang="nn">Super NES-ROM</comment>
+ <comment xml:lang="pl">Plik ROM konsoli SNES</comment>
+ <comment xml:lang="pt_BR">ROM do Super Nintendo</comment>
+ <comment xml:lang="ro">ROM Super Nintendo</comment>
+ <comment xml:lang="ru">Super NES ROM</comment>
+ <comment xml:lang="sk">ROM pre Super Nintendo</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Super NES</comment>
+ <comment xml:lang="sq">ROM Super NES</comment>
+ <comment xml:lang="sv">Super NES-rom</comment>
+ <comment xml:lang="uk">ППП Super NES</comment>
+ <comment xml:lang="vi">ROM Super Nintendo</comment>
+ <comment xml:lang="zh_CN">Super NES ROM</comment>
+ <comment xml:lang="zh_TW">超級任天堂 ROM</comment>
+ <generic-icon name="application-x-executable"/>
+ <glob pattern="*.smc"/>
+ </mime-type>
+ <mime-type type="application/x-stuffit">
+ <comment>StuffIt archive</comment>
+ <comment xml:lang="ar">أرشيف StuffIt</comment>
+ <comment xml:lang="be@latin">Archiŭ StuffIt</comment>
+ <comment xml:lang="bg">Архив — StuffIt</comment>
+ <comment xml:lang="ca">arxiu StuffIt</comment>
+ <comment xml:lang="cs">Archiv StuffIt</comment>
+ <comment xml:lang="da">StuffIt-arkiv</comment>
+ <comment xml:lang="de">StuffIt-Archiv</comment>
+ <comment xml:lang="en_GB">StuffIt archive</comment>
+ <comment xml:lang="eo">StuffIt-arkivo</comment>
+ <comment xml:lang="es">archivador StuffIt</comment>
+ <comment xml:lang="eu">StuffIt artxiboa</comment>
+ <comment xml:lang="fi">StuffIt-arkisto</comment>
+ <comment xml:lang="fo">StuffIt skjalasavn</comment>
+ <comment xml:lang="fr">archive StuffIt</comment>
+ <comment xml:lang="ga">cartlann StuffIt</comment>
+ <comment xml:lang="gl">arquivo StuffIt</comment>
+ <comment xml:lang="he">ארכיון של Sאוככןא</comment>
+ <comment xml:lang="hu">StuffIt-archívum</comment>
+ <comment xml:lang="id">Arsip StuffIt</comment>
+ <comment xml:lang="it">Archivio StuffIt</comment>
+ <comment xml:lang="ja">StuffIt アーカイブ</comment>
+ <comment xml:lang="kk">StuffIt архиві</comment>
+ <comment xml:lang="ko">StuffIt 압축 파일</comment>
+ <comment xml:lang="lt">StuffIt archyvas</comment>
+ <comment xml:lang="lv">StuffIt arhīvs</comment>
+ <comment xml:lang="nb">StuffIt arkiv</comment>
+ <comment xml:lang="nl">StuffIt-archief</comment>
+ <comment xml:lang="nn">StuffIt-arkiv</comment>
+ <comment xml:lang="pl">Archiwum StuffIt</comment>
+ <comment xml:lang="pt_BR">Pacote StuffIt</comment>
+ <comment xml:lang="ro">Arhivă StuffIt</comment>
+ <comment xml:lang="ru">архив StuffIt</comment>
+ <comment xml:lang="sk">Archív StuffIt</comment>
+ <comment xml:lang="sl">Datoteka arhiva StuffIt</comment>
+ <comment xml:lang="sq">Arkiv StuffIt</comment>
+ <comment xml:lang="sr">StuffIt архива</comment>
+ <comment xml:lang="sv">StuffIt-arkiv </comment>
+ <comment xml:lang="uk">архів StuffIt</comment>
+ <comment xml:lang="vi">Kho nén Stuffit</comment>
+ <comment xml:lang="zh_CN">Macintosh StuffIt 归档文件</comment>
+ <comment xml:lang="zh_TW">StuffIt 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <alias type="application/stuffit"/>
+ <alias type="application/x-sit"/>
+ <magic priority="50">
+ <match value="StuffIt " type="string" offset="0"/>
+ <match value="SIT!" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.sit"/>
+ </mime-type>
+ <mime-type type="application/x-subrip">
+ <comment>SubRip subtitles</comment>
+ <comment xml:lang="ar">ترجمات SubRip</comment>
+ <comment xml:lang="be@latin">Subtytry SubRip</comment>
+ <comment xml:lang="bg">Субтитри — SubRip</comment>
+ <comment xml:lang="ca">subtítols SubRip</comment>
+ <comment xml:lang="cs">Titulky SubRip</comment>
+ <comment xml:lang="da">SubRip-undertekster</comment>
+ <comment xml:lang="de">SubRip-Untertitel</comment>
+ <comment xml:lang="eo">SubRip-subtekstoj</comment>
+ <comment xml:lang="es">subtítulos SubRip</comment>
+ <comment xml:lang="eu">SubRip azpitituluak</comment>
+ <comment xml:lang="fi">SubRip-tekstitykset</comment>
+ <comment xml:lang="fo">SubRip undirtekstir</comment>
+ <comment xml:lang="fr">sous-titres SubRip</comment>
+ <comment xml:lang="ga">fotheidil SubRip</comment>
+ <comment xml:lang="gl">subtítulos SubRip</comment>
+ <comment xml:lang="he">כתוביות של SubRip</comment>
+ <comment xml:lang="hu">SubRip feliratok</comment>
+ <comment xml:lang="id">Subjudul SubRip</comment>
+ <comment xml:lang="it">Sottotitoli SubRip</comment>
+ <comment xml:lang="ja">SubRip 字幕</comment>
+ <comment xml:lang="kk">SubRip субтитрлары</comment>
+ <comment xml:lang="ko">SubRip 자막 파일</comment>
+ <comment xml:lang="lt">SubRip subtitrai</comment>
+ <comment xml:lang="lv">SubRip subtitri</comment>
+ <comment xml:lang="nb">SubRip undertekst</comment>
+ <comment xml:lang="nl">SubRip-ondertitels</comment>
+ <comment xml:lang="nn">SubRip-teksting</comment>
+ <comment xml:lang="pl">Napisy SubRip</comment>
+ <comment xml:lang="pt_BR">Legendas SubRip</comment>
+ <comment xml:lang="ro">Subtitrare SubRip</comment>
+ <comment xml:lang="ru">субтитры SubRip</comment>
+ <comment xml:lang="sk">Titulky SubRip</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SubRip</comment>
+ <comment xml:lang="sq">Nëntituj SubRip</comment>
+ <comment xml:lang="sv">SubRip-undertexter</comment>
+ <comment xml:lang="uk">субтитри SubRip</comment>
+ <comment xml:lang="vi">Phụ đề SubRip</comment>
+ <comment xml:lang="zh_CN">SubRip 字幕</comment>
+ <comment xml:lang="zh_TW">SubRip 字幕</comment>
+ <alias type="application/x-srt"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="1" type="string" offset="0">
+ <match value=" --> " type="string" offset="0:256"/>
+ </match>
+ </magic>
+ <glob pattern="*.srt"/>
+ </mime-type>
+ <mime-type type="text/vtt">
+ <comment>WebVTT subtitles</comment>
+ <comment xml:lang="bg">Субтитри — WebVTT</comment>
+ <comment xml:lang="ca">subtítols WebVTT</comment>
+ <comment xml:lang="cs">Titulky WebVTT</comment>
+ <comment xml:lang="es">Subtítulos WebVTT</comment>
+ <comment xml:lang="fi">WebVTT-tekstitykset</comment>
+ <comment xml:lang="fr">sous-titres WebVTT</comment>
+ <comment xml:lang="gl">subtítulos WebVTT</comment>
+ <comment xml:lang="he">כתוביות WebVTT</comment>
+ <comment xml:lang="id">Subtitel WebVTT</comment>
+ <comment xml:lang="it">Sottotitoli WebVTT</comment>
+ <comment xml:lang="ja">WebVTT サブタイトル</comment>
+ <comment xml:lang="kk">WebVTT субтитрлары</comment>
+ <comment xml:lang="lv">WebVTT subtitri</comment>
+ <comment xml:lang="pl">Napisy WebVTT</comment>
+ <comment xml:lang="ru">субтитры WebVTT</comment>
+ <comment xml:lang="sl">Podnapisi WebVVT</comment>
+ <comment xml:lang="sv">WebVTT-undertexter</comment>
+ <comment xml:lang="uk">субтитри WebVTT</comment>
+ <acronym>VTT</acronym>
+ <expanded-acronym>Video Text Tracks</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="WEBVTT" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.vtt"/>
+ </mime-type>
+ <mime-type type="application/x-sami">
+ <comment>SAMI subtitles</comment>
+ <comment xml:lang="ar">ترجمات SAMI</comment>
+ <comment xml:lang="be@latin">Subtytry SAMI</comment>
+ <comment xml:lang="bg">Субтитри — SAMI</comment>
+ <comment xml:lang="ca">subtítols SAMI</comment>
+ <comment xml:lang="cs">Titulky SAMI</comment>
+ <comment xml:lang="da">SAMI-undertekster</comment>
+ <comment xml:lang="de">SAMI-Untertitel</comment>
+ <comment xml:lang="eo">SAMI-subtekstoj</comment>
+ <comment xml:lang="es">subtítulos SAMI</comment>
+ <comment xml:lang="eu">SAMI azpitituluak</comment>
+ <comment xml:lang="fi">SAMI-tekstitykset</comment>
+ <comment xml:lang="fo">SAMI undirtekstir</comment>
+ <comment xml:lang="fr">sous-titres SAMI</comment>
+ <comment xml:lang="ga">fotheidil SAMI</comment>
+ <comment xml:lang="gl">subtítulos SAMI</comment>
+ <comment xml:lang="he">כתוביות SAMI</comment>
+ <comment xml:lang="hu">SAMI feliratok</comment>
+ <comment xml:lang="id">Subjudul SAMI</comment>
+ <comment xml:lang="it">Sottotitoli SAMI</comment>
+ <comment xml:lang="ja">SAMI 字幕</comment>
+ <comment xml:lang="kk">SAMI субтитрлары</comment>
+ <comment xml:lang="ko">SAMI 자막 파일</comment>
+ <comment xml:lang="lt">SAMI subtitrai</comment>
+ <comment xml:lang="lv">SAMI subtitri</comment>
+ <comment xml:lang="nb">SAMI undertekst</comment>
+ <comment xml:lang="nl">SAMI-ondertitels</comment>
+ <comment xml:lang="nn">SAMI teksting</comment>
+ <comment xml:lang="pl">Napisy SAMI</comment>
+ <comment xml:lang="pt_BR">SAMI subtitles</comment>
+ <comment xml:lang="ro">Subtitrări SAMI</comment>
+ <comment xml:lang="ru">субтитры SAMI</comment>
+ <comment xml:lang="sk">Titulky SAMI</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SAMI</comment>
+ <comment xml:lang="sq">Nëntituj SAMI</comment>
+ <comment xml:lang="sv">SAMI-undertexter</comment>
+ <comment xml:lang="uk">субтитри SAMI</comment>
+ <comment xml:lang="vi">Phụ đề SAMI</comment>
+ <comment xml:lang="zh_CN">SAMI 字幕</comment>
+ <comment xml:lang="zh_TW">SAMI 字幕</comment>
+ <acronym>SAMI</acronym>
+ <expanded-acronym>Synchronized Accessible Media Interchange</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="&lt;SAMI&gt;" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.smi"/>
+ <glob pattern="*.sami"/>
+ </mime-type>
+ <mime-type type="text/x-microdvd">
+ <comment>MicroDVD subtitles</comment>
+ <comment xml:lang="ar">ترجمات MicroDVD</comment>
+ <comment xml:lang="be@latin">Subtytry MicroDVD</comment>
+ <comment xml:lang="bg">Субтитри — MicroDVD</comment>
+ <comment xml:lang="ca">subtítols MicroDVD</comment>
+ <comment xml:lang="cs">Titulky MicroDVD</comment>
+ <comment xml:lang="da">MicroDVD-undertekster</comment>
+ <comment xml:lang="de">MicroDVD-Untertitel</comment>
+ <comment xml:lang="eo">MicroDVD-subtekstoj</comment>
+ <comment xml:lang="es">subtítulos MicroDVD</comment>
+ <comment xml:lang="eu">MicroDVD azpitituluak</comment>
+ <comment xml:lang="fi">MicroDVD-tekstitykset</comment>
+ <comment xml:lang="fo">MicroDVD undirtekstir</comment>
+ <comment xml:lang="fr">sous-titres MicroDVD</comment>
+ <comment xml:lang="ga">fotheidil MicroDVD</comment>
+ <comment xml:lang="gl">subtítulos de MicroDVD</comment>
+ <comment xml:lang="he">כתוביות של MicroDVD</comment>
+ <comment xml:lang="hu">MicroDVD feliratok</comment>
+ <comment xml:lang="id">Subjudul MicroDVD</comment>
+ <comment xml:lang="it">Sottotitoli MicroDVD</comment>
+ <comment xml:lang="ja">MicroDVD 字幕</comment>
+ <comment xml:lang="kk">MicroDVD субтитрлары</comment>
+ <comment xml:lang="ko">MicroDVD 자막 파일</comment>
+ <comment xml:lang="lt">MicroDVD subtitrai</comment>
+ <comment xml:lang="lv">MicroDVD subtitri</comment>
+ <comment xml:lang="nb">MicroDVD undertekst</comment>
+ <comment xml:lang="nl">MicroDVD-ondertitels</comment>
+ <comment xml:lang="nn">MicroDVD-teksting</comment>
+ <comment xml:lang="pl">Napisy MicroDVD</comment>
+ <comment xml:lang="pt_BR">Legendas MicroDVD</comment>
+ <comment xml:lang="ro">Subtitrări MicroDVD</comment>
+ <comment xml:lang="ru">субтитры MicroDVD</comment>
+ <comment xml:lang="sk">Titulky MicroDVD</comment>
+ <comment xml:lang="sl">Datoteka podnapisov MicroDVD</comment>
+ <comment xml:lang="sq">Nëntituj MicroDVD</comment>
+ <comment xml:lang="sv">MicroDVD-undertexter</comment>
+ <comment xml:lang="uk">субтитри MicroDVD</comment>
+ <comment xml:lang="vi">Phụ đề MicroDVD</comment>
+ <comment xml:lang="zh_CN">MicroDVD 字幕</comment>
+ <comment xml:lang="zh_TW">MicroDVD 字幕</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="{1}" type="string" offset="0"/>
+ <match value="{0}" type="string" offset="0"/>
+ <match value="}{" type="string" offset="0:6"/>
+ </magic>
+ <glob pattern="*.sub"/>
+ </mime-type>
+ <mime-type type="text/x-mpsub">
+ <comment>MPSub subtitles</comment>
+ <comment xml:lang="ar">ترجمات MPSub</comment>
+ <comment xml:lang="be@latin">Subtytry MPSub</comment>
+ <comment xml:lang="bg">Субтитри — MPSub</comment>
+ <comment xml:lang="ca">subtítols MPSub</comment>
+ <comment xml:lang="cs">Titulky MPSub</comment>
+ <comment xml:lang="da">MPSub-undertekster</comment>
+ <comment xml:lang="de">MPSub-Untertitel</comment>
+ <comment xml:lang="eo">MPSub-subtekstoj</comment>
+ <comment xml:lang="es">subtítulos MPSub</comment>
+ <comment xml:lang="eu">MPSub azpitituluak</comment>
+ <comment xml:lang="fi">MPSub-tekstitykset</comment>
+ <comment xml:lang="fo">MPSub undirtekstir</comment>
+ <comment xml:lang="fr">sous-titres MPSub</comment>
+ <comment xml:lang="ga">fotheidil MPSub</comment>
+ <comment xml:lang="gl">subtítulos MPSub</comment>
+ <comment xml:lang="he">כתוביות MPSub</comment>
+ <comment xml:lang="hu">MPSub feliratok</comment>
+ <comment xml:lang="id">Subjudul MPSub</comment>
+ <comment xml:lang="it">Sottotitoli MPSub</comment>
+ <comment xml:lang="ja">MPSub サブタイトル</comment>
+ <comment xml:lang="kk">MPSub субтитрлары</comment>
+ <comment xml:lang="ko">MPSub 자막 파일</comment>
+ <comment xml:lang="lt">MPSub subtitrai</comment>
+ <comment xml:lang="lv">MPSub subtitri</comment>
+ <comment xml:lang="nb">MPSub undertekst</comment>
+ <comment xml:lang="nl">MPSub-ondertitels</comment>
+ <comment xml:lang="nn">MPSub-undertekstar</comment>
+ <comment xml:lang="pl">Napisy MPSub</comment>
+ <comment xml:lang="pt_BR">Legendas MPSub</comment>
+ <comment xml:lang="ro">Subtitrări MPSub</comment>
+ <comment xml:lang="ru">субтитры MPSub</comment>
+ <comment xml:lang="sk">Titulky MPSub</comment>
+ <comment xml:lang="sl">Datoteka podnapisov MPSub</comment>
+ <comment xml:lang="sq">Nëntituj MPSub</comment>
+ <comment xml:lang="sv">MPSub-undertexter</comment>
+ <comment xml:lang="uk">субтитри MPSub</comment>
+ <comment xml:lang="vi">Phụ đề MPSub</comment>
+ <comment xml:lang="zh_CN">MPSub 字幕</comment>
+ <comment xml:lang="zh_TW">MPSub 字幕</comment>
+ <acronym>MPSub</acronym>
+ <expanded-acronym>MPlayer Subtitle</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="FORMAT=" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.sub"/>
+ </mime-type>
+ <mime-type type="text/x-ssa">
+ <comment>SSA subtitles</comment>
+ <comment xml:lang="ar">ترجمات SSA</comment>
+ <comment xml:lang="be@latin">Subtytry SSA</comment>
+ <comment xml:lang="bg">Субтитри — SSA</comment>
+ <comment xml:lang="ca">subtítols SSA</comment>
+ <comment xml:lang="cs">Titulky SSA</comment>
+ <comment xml:lang="da">SSA-undertekster</comment>
+ <comment xml:lang="de">SSA-Untertitel</comment>
+ <comment xml:lang="eo">SSA-subtekstoj</comment>
+ <comment xml:lang="es">subtítulos SSA</comment>
+ <comment xml:lang="eu">SSA azpitituluak</comment>
+ <comment xml:lang="fi">SSA-tekstitykset</comment>
+ <comment xml:lang="fo">SSA undirtekstir</comment>
+ <comment xml:lang="fr">sous-titres SSA</comment>
+ <comment xml:lang="ga">fotheidil SSA</comment>
+ <comment xml:lang="gl">Subtitulos SSA</comment>
+ <comment xml:lang="he">כתובית SSA</comment>
+ <comment xml:lang="hu">SSA feliratok</comment>
+ <comment xml:lang="id">Subjudul SSA</comment>
+ <comment xml:lang="it">Sottotitoli SSA</comment>
+ <comment xml:lang="ja">SSA 字幕</comment>
+ <comment xml:lang="kk">SSA субтитрлары</comment>
+ <comment xml:lang="ko">SSA 자막 파일</comment>
+ <comment xml:lang="lt">SSA subtitrai</comment>
+ <comment xml:lang="lv">SSA subtitri</comment>
+ <comment xml:lang="nb">SSA undertekst</comment>
+ <comment xml:lang="nl">SSA-ondertitels</comment>
+ <comment xml:lang="nn">SSA-teksting</comment>
+ <comment xml:lang="pl">Napisy SSA</comment>
+ <comment xml:lang="pt_BR">Legenda SSA</comment>
+ <comment xml:lang="ro">Subtitrări SSA</comment>
+ <comment xml:lang="ru">субтитры SSA</comment>
+ <comment xml:lang="sk">Titulky SSA</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SSA</comment>
+ <comment xml:lang="sq">Nëntituj SSA</comment>
+ <comment xml:lang="sv">SSA-undertexter</comment>
+ <comment xml:lang="uk">субтитри SSA</comment>
+ <comment xml:lang="vi">Phụ đề SSA</comment>
+ <comment xml:lang="zh_CN">SSA 字幕</comment>
+ <comment xml:lang="zh_TW">SSA 字幕</comment>
+ <acronym>SSA</acronym>
+ <expanded-acronym>SubStation Alpha</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="[Script Info]" type="string" offset="0:256"/>
+ <match value="Dialogue: " type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.ssa"/>
+ <glob pattern="*.ass"/>
+ </mime-type>
+ <mime-type type="text/x-subviewer">
+ <comment>SubViewer subtitles</comment>
+ <comment xml:lang="ar">ترجمات SubViewer</comment>
+ <comment xml:lang="be@latin">Subtytry SubViewer</comment>
+ <comment xml:lang="bg">Субтитри — SubViewer</comment>
+ <comment xml:lang="ca">subtítols SubViewer</comment>
+ <comment xml:lang="cs">Titulky SubViewer</comment>
+ <comment xml:lang="da">SubViewer-undertekster</comment>
+ <comment xml:lang="de">SubViewer-Untertitel</comment>
+ <comment xml:lang="eo">SubViewer-subtekstoj</comment>
+ <comment xml:lang="es">subtítulos SubViewer</comment>
+ <comment xml:lang="eu">SubViewer azpitituluak</comment>
+ <comment xml:lang="fi">SubViewer-tekstitykset</comment>
+ <comment xml:lang="fo">SubViewer undirtekstir</comment>
+ <comment xml:lang="fr">sous-titres SubViewer</comment>
+ <comment xml:lang="ga">fotheidil SubViewer</comment>
+ <comment xml:lang="gl">subtítulos SubViewer</comment>
+ <comment xml:lang="he">כתוביות של SubViewe</comment>
+ <comment xml:lang="hu">SubViewer feliratok</comment>
+ <comment xml:lang="id">Subjudul SubViewer</comment>
+ <comment xml:lang="it">Sottotitoli SubViewer</comment>
+ <comment xml:lang="ja">SubViewer 字幕</comment>
+ <comment xml:lang="kk">SubViewer субтитрлары</comment>
+ <comment xml:lang="ko">SubViewer 자막 파일</comment>
+ <comment xml:lang="lt">SubViewer subtitrai</comment>
+ <comment xml:lang="lv">SubViewer subtitri</comment>
+ <comment xml:lang="nb">SubViewer undertekst</comment>
+ <comment xml:lang="nl">SubViewer-ondertitels</comment>
+ <comment xml:lang="nn">SubViewer-teksting</comment>
+ <comment xml:lang="pl">Napisy SubViewer</comment>
+ <comment xml:lang="pt_BR">Legendas SubViewer</comment>
+ <comment xml:lang="ro">Subtitrare SubViewer</comment>
+ <comment xml:lang="ru">субтитры SubViewer</comment>
+ <comment xml:lang="sk">Titulky SubViewer</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SubViewer</comment>
+ <comment xml:lang="sq">Nëntituj SubViewer</comment>
+ <comment xml:lang="sv">SubViewer-undertexter</comment>
+ <comment xml:lang="uk">субтитри SubViewer</comment>
+ <comment xml:lang="vi">Phụ đề SubViewer</comment>
+ <comment xml:lang="zh_CN">SubViewer 字幕</comment>
+ <comment xml:lang="zh_TW">SubViewer 字幕</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="[INFORMATION]" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.sub"/>
+ </mime-type>
+ <mime-type type="text/x-iMelody">
+ <comment>iMelody ringtone</comment>
+ <comment xml:lang="ar">نغمة iMelody</comment>
+ <comment xml:lang="be@latin">Rington iMelody</comment>
+ <comment xml:lang="bg">Аудио — iMelody</comment>
+ <comment xml:lang="ca">to de trucada iMelody</comment>
+ <comment xml:lang="cs">Vyzváněcí melodie iMelody</comment>
+ <comment xml:lang="da">iMelody-ringetone</comment>
+ <comment xml:lang="de">iMelody-Klingelton</comment>
+ <comment xml:lang="es">tono de llamada iMelody</comment>
+ <comment xml:lang="eu">iMelody doinua</comment>
+ <comment xml:lang="fi">iMelody-soittoääni</comment>
+ <comment xml:lang="fo">iMelody ringitóni</comment>
+ <comment xml:lang="fr">sonnerie iMelody</comment>
+ <comment xml:lang="ga">ton buailte iMelody</comment>
+ <comment xml:lang="gl">Melodía de iMelody</comment>
+ <comment xml:lang="he">רינגטון של iMelody</comment>
+ <comment xml:lang="hu">iMelody csengőhang</comment>
+ <comment xml:lang="id">nada dering iMelody</comment>
+ <comment xml:lang="it">Suoneria iMelody</comment>
+ <comment xml:lang="ja">iMelody リングトーン</comment>
+ <comment xml:lang="kk">iMelody әуені</comment>
+ <comment xml:lang="ko">iMelody 벨소리</comment>
+ <comment xml:lang="lt">iMelody skambučio melodija</comment>
+ <comment xml:lang="lv">iMelody melodija</comment>
+ <comment xml:lang="nb">iMelody ringetone</comment>
+ <comment xml:lang="nl">iMelody-beltoon</comment>
+ <comment xml:lang="nn">iMelody-ringetone</comment>
+ <comment xml:lang="pl">Dzwonek iMelody</comment>
+ <comment xml:lang="pt_BR">Toque de celular do iMelody</comment>
+ <comment xml:lang="ro">Sonerie iMelody</comment>
+ <comment xml:lang="ru">мелодия iMelody</comment>
+ <comment xml:lang="sk">Vyzváňacie melódie iMelody</comment>
+ <comment xml:lang="sl">Zvonjenje iMelody</comment>
+ <comment xml:lang="sq">Zile iMelody</comment>
+ <comment xml:lang="sv">iMelody-ringsignal</comment>
+ <comment xml:lang="uk">рінгтон iMelody</comment>
+ <comment xml:lang="vi">tiếng réo iMelody</comment>
+ <comment xml:lang="zh_CN">iMelody 铃声</comment>
+ <comment xml:lang="zh_TW">iMelody 鈴聲</comment>
+ <magic priority="50">
+ <match value="BEGIN:IMELODY" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.imy"/>
+ <glob pattern="*.ime"/>
+ <alias type="audio/x-iMelody"/>
+ <alias type="audio/iMelody"/>
+ </mime-type>
+ <mime-type type="application/x-smaf">
+ <comment>SMAF audio</comment>
+ <comment xml:lang="ar">SMAF سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo SMAF</comment>
+ <comment xml:lang="bg">Аудио — SMAF</comment>
+ <comment xml:lang="ca">àudio SMAF</comment>
+ <comment xml:lang="cs">Zvuk SMAF</comment>
+ <comment xml:lang="da">SMAF-lyd</comment>
+ <comment xml:lang="de">SMAF-Audio</comment>
+ <comment xml:lang="eo">SMAF-sondosiero</comment>
+ <comment xml:lang="es">sonido SMAF</comment>
+ <comment xml:lang="eu">SMAF audioa</comment>
+ <comment xml:lang="fi">SMAF-ääni</comment>
+ <comment xml:lang="fo">SMAF ljóður</comment>
+ <comment xml:lang="fr">audio SMAF</comment>
+ <comment xml:lang="ga">fuaim SMAF</comment>
+ <comment xml:lang="gl">son SMAF</comment>
+ <comment xml:lang="he">שמע SMAF</comment>
+ <comment xml:lang="hu">SMAF hang</comment>
+ <comment xml:lang="id">Audio SMAF</comment>
+ <comment xml:lang="it">Audio SMAF</comment>
+ <comment xml:lang="ja">SMAF オーディオ</comment>
+ <comment xml:lang="kk">SMAF аудиосы</comment>
+ <comment xml:lang="ko">SMAF 오디오</comment>
+ <comment xml:lang="lt">SMAF garso įrašas</comment>
+ <comment xml:lang="lv">SMAF audio</comment>
+ <comment xml:lang="nb">SMAF-lyd</comment>
+ <comment xml:lang="nl">SMAF-audio</comment>
+ <comment xml:lang="nn">SMAF-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy SMAF</comment>
+ <comment xml:lang="pt_BR">Áudio SMAF</comment>
+ <comment xml:lang="ro">Audio SMAF</comment>
+ <comment xml:lang="ru">аудио SMAF</comment>
+ <comment xml:lang="sk">Zvuk SMAF</comment>
+ <comment xml:lang="sl">Zvočna datoteka SMAF</comment>
+ <comment xml:lang="sq">Audio SMAF</comment>
+ <comment xml:lang="sv">SMAF-ljud</comment>
+ <comment xml:lang="uk">звук SMAF</comment>
+ <comment xml:lang="vi">Âm thanh SMAF</comment>
+ <comment xml:lang="zh_CN">SMAF 音频</comment>
+ <comment xml:lang="zh_TW">SMAF 音訊</comment>
+ <acronym>SMAF</acronym>
+ <expanded-acronym>Synthetic music Mobile Application Format</expanded-acronym>
+ <generic-icon name="audio-x-generic"/>
+ <magic priority="50">
+ <match value="MMMD" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mmf"/>
+ <glob pattern="*.smaf"/>
+ <alias type="application/vnd.smaf"/>
+ </mime-type>
+ <mime-type type="text/x-mrml">
+ <comment>MRML playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل MRML</comment>
+ <comment xml:lang="be@latin">Śpis piesień MRML</comment>
+ <comment xml:lang="bg">Списък за изпълнение — MRML</comment>
+ <comment xml:lang="ca">llista de reproducció MRML</comment>
+ <comment xml:lang="cs">Seznam skladeb MRML</comment>
+ <comment xml:lang="da">MRML-afspilningsliste</comment>
+ <comment xml:lang="de">MRML-Wiedergabeliste</comment>
+ <comment xml:lang="eo">MRML-ludlisto</comment>
+ <comment xml:lang="es">lista de reproducción MRML</comment>
+ <comment xml:lang="eu">MRML erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">MRML-soittolista</comment>
+ <comment xml:lang="fo">MRML avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture MRML</comment>
+ <comment xml:lang="ga">seinmliosta MRML</comment>
+ <comment xml:lang="gl">lista de reprodución MRML</comment>
+ <comment xml:lang="he">רשימת השמעה MRML</comment>
+ <comment xml:lang="hu">MRML-lejátszólista</comment>
+ <comment xml:lang="id">Senarai putar MRML</comment>
+ <comment xml:lang="it">Scaletta MRML</comment>
+ <comment xml:lang="ja">MPML 再生リスト</comment>
+ <comment xml:lang="kk">MRML ойнау тізімі</comment>
+ <comment xml:lang="ko">MRML 재생 목록</comment>
+ <comment xml:lang="lt">MRML grojaraštis</comment>
+ <comment xml:lang="lv">MRML repertuārs</comment>
+ <comment xml:lang="nb">MRML-spilleliste</comment>
+ <comment xml:lang="nl">MRML-afspeellijst</comment>
+ <comment xml:lang="nn">MRML-speleliste</comment>
+ <comment xml:lang="pl">Lista odtwarzania MRML</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do MRML</comment>
+ <comment xml:lang="ro">Listă redare MRML</comment>
+ <comment xml:lang="ru">список воспроизведения MRML</comment>
+ <comment xml:lang="sk">Zoznam skladieb MRML</comment>
+ <comment xml:lang="sl">Seznam predvajanja MRML</comment>
+ <comment xml:lang="sq">Listë titujsh MRML</comment>
+ <comment xml:lang="sv">MRML-spellista</comment>
+ <comment xml:lang="uk">список відтворення MRML</comment>
+ <comment xml:lang="vi">Danh mục nhạc MRML</comment>
+ <comment xml:lang="zh_CN">MRML 播放列表</comment>
+ <comment xml:lang="zh_TW">MRML 播放清單</comment>
+ <acronym>MRML</acronym>
+ <expanded-acronym>Multimedia Retrieval Markup Language</expanded-acronym>
+ <magic priority="50">
+ <match value="&lt;mrml " type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mrml"/>
+ <glob pattern="*.mrl"/>
+ </mime-type>
+ <mime-type type="audio/x-xmf">
+ <comment>XMF audio</comment>
+ <comment xml:lang="ar">XMF سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo XMF</comment>
+ <comment xml:lang="bg">Аудио — XMF</comment>
+ <comment xml:lang="ca">àudio XMF</comment>
+ <comment xml:lang="cs">Zvuk XMF</comment>
+ <comment xml:lang="da">XMF-lyd</comment>
+ <comment xml:lang="de">XMF-Audio</comment>
+ <comment xml:lang="eo">XMF-sondosiero</comment>
+ <comment xml:lang="es">sonido XMF</comment>
+ <comment xml:lang="eu">XMF audioa</comment>
+ <comment xml:lang="fi">XMF-ääni</comment>
+ <comment xml:lang="fo">XMF ljóður</comment>
+ <comment xml:lang="fr">audio XMF</comment>
+ <comment xml:lang="ga">fuaim XMF</comment>
+ <comment xml:lang="gl">son XMF</comment>
+ <comment xml:lang="he">שמע XMF</comment>
+ <comment xml:lang="hu">XMF hang</comment>
+ <comment xml:lang="id">Audio XMF</comment>
+ <comment xml:lang="it">Audio XMF</comment>
+ <comment xml:lang="ja">XMF オーディオ</comment>
+ <comment xml:lang="kk">XMF аудиосы</comment>
+ <comment xml:lang="ko">XMF 오디오</comment>
+ <comment xml:lang="lt">XMF garso įrašas</comment>
+ <comment xml:lang="lv">XMF audio</comment>
+ <comment xml:lang="nb">XMF-lyd</comment>
+ <comment xml:lang="nl">XMF-audio</comment>
+ <comment xml:lang="nn">XMF-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy XMF</comment>
+ <comment xml:lang="pt_BR">Áudio XMF</comment>
+ <comment xml:lang="ro">Audio XMF</comment>
+ <comment xml:lang="ru">аудио XMF</comment>
+ <comment xml:lang="sk">Zvuk XMF</comment>
+ <comment xml:lang="sl">Zvočna datoteka XMF</comment>
+ <comment xml:lang="sq">Audio XMF</comment>
+ <comment xml:lang="sv">XMF-ljud</comment>
+ <comment xml:lang="uk">звук XMF</comment>
+ <comment xml:lang="vi">Âm thanh XMF</comment>
+ <comment xml:lang="zh_CN">XMF 音频</comment>
+ <comment xml:lang="zh_TW">XMF 音訊</comment>
+ <acronym>XMF</acronym>
+ <expanded-acronym>eXtensible Music Format</expanded-acronym>
+ <magic priority="50">
+ <match value="XMF_" type="string" offset="0"/>
+ <match value="\130\115\106\137\062\056\060\060\000\000\000\002" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.xmf"/>
+ <alias type="audio/xmf"/>
+ <alias type="audio/mobile-xmf"/>
+ </mime-type>
+ <mime-type type="application/x-sv4cpio">
+ <comment>SV4 CPIO archive</comment>
+ <comment xml:lang="ar">أرشيف SV4 CPIO</comment>
+ <comment xml:lang="az">SV4 CPIO arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ SV4 CPIO</comment>
+ <comment xml:lang="bg">Архив — SV4 CPIO</comment>
+ <comment xml:lang="ca">arxiu CPIO SV4</comment>
+ <comment xml:lang="cs">Archiv SV4 CPIO</comment>
+ <comment xml:lang="cy">Archif CPIO SV4</comment>
+ <comment xml:lang="da">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="de">SV4-CPIO-Archiv</comment>
+ <comment xml:lang="el">αρχείο SV4 CPIO</comment>
+ <comment xml:lang="en_GB">SV4 CPIO archive</comment>
+ <comment xml:lang="eo">SV4-CPIO-arkivo</comment>
+ <comment xml:lang="es">archivador SV4 CPIO</comment>
+ <comment xml:lang="eu">SV4 CPIO artxiboa</comment>
+ <comment xml:lang="fi">SV4 CPIO -arkisto</comment>
+ <comment xml:lang="fo">SV4 CPIO skjalasavn</comment>
+ <comment xml:lang="fr">archive SV4 CPIO</comment>
+ <comment xml:lang="ga">cartlann SV4 CPIO</comment>
+ <comment xml:lang="gl">arquivo SV4 CPIO</comment>
+ <comment xml:lang="he">ארכיון של SV4 SPIO</comment>
+ <comment xml:lang="hu">SV4 CPIO-archívum</comment>
+ <comment xml:lang="id">Arsip SV4 CPIO</comment>
+ <comment xml:lang="it">Archivio SV4 CPIO</comment>
+ <comment xml:lang="ja">SV4 CPIO アーカイブ</comment>
+ <comment xml:lang="kk">SV4 CPIO архиві</comment>
+ <comment xml:lang="ko">SV4 CPIO 묶음 파일</comment>
+ <comment xml:lang="lt">SV4 CPIO archyvas</comment>
+ <comment xml:lang="lv">SV4 CPIO arhīvs</comment>
+ <comment xml:lang="ms">Arkib CPIO SV4</comment>
+ <comment xml:lang="nb">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="nl">SV4 CPIO-archief</comment>
+ <comment xml:lang="nn">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="pl">Archiwum SV4 CPIO</comment>
+ <comment xml:lang="pt">ficheiro SV4 CPIO</comment>
+ <comment xml:lang="pt_BR">Pacote SV4 CPIO</comment>
+ <comment xml:lang="ro">Arhivă SV4 CPIO</comment>
+ <comment xml:lang="ru">архив SV4 CPIO</comment>
+ <comment xml:lang="sk">Archív SV4 CPIO</comment>
+ <comment xml:lang="sl">Datoteka arhiva SV4 CPIO</comment>
+ <comment xml:lang="sq">Arkiv SV4 CPIO</comment>
+ <comment xml:lang="sr">SV4 CPIO архива</comment>
+ <comment xml:lang="sv">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="uk">архів SV4 CPIO</comment>
+ <comment xml:lang="vi">Kho nén CPIO SV4</comment>
+ <comment xml:lang="zh_CN">SV4 CPIO 归档文件</comment>
+ <comment xml:lang="zh_TW">SV4 CPIO 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.sv4cpio"/>
+ </mime-type>
+ <mime-type type="application/x-sv4crc">
+ <comment>SV4 CPIO archive (with CRC)</comment>
+ <comment xml:lang="ar">أرشيف SV4 CPIO (مع CRC)</comment>
+ <comment xml:lang="be@latin">Archiŭ SV4 CPIO (z CRC)</comment>
+ <comment xml:lang="bg">Архив — SV4 CPIO, проверка за грешки CRC</comment>
+ <comment xml:lang="ca">arxiu CPIO SV4 (amb CRC)</comment>
+ <comment xml:lang="cs">Archiv SV4 CPIO (s CRC)</comment>
+ <comment xml:lang="da">SV4 CPIO-arkiv (med CRC)</comment>
+ <comment xml:lang="de">SV4-CPIO-Archiv (mit CRC)</comment>
+ <comment xml:lang="el">αρχείο SV4 CPIO (με CRC)</comment>
+ <comment xml:lang="eo">SV4-CPIO-arkivo (kun CRC)</comment>
+ <comment xml:lang="es">archivador SV4 CPIO (con CRC)</comment>
+ <comment xml:lang="eu">SV4 CPIO artxiboa (CRC-rekin)</comment>
+ <comment xml:lang="fi">SV4 CPIO -arkisto (CRC:llä)</comment>
+ <comment xml:lang="fo">SV4 CPIO skjalasavn (við CRC)</comment>
+ <comment xml:lang="fr">archive SV4 CPIO (avec CRC)</comment>
+ <comment xml:lang="ga">cartlann SV4 CPIO (le CRC)</comment>
+ <comment xml:lang="gl">Arquivador SV4 CPIO (con CRC)</comment>
+ <comment xml:lang="he">ארכיון של SV4 SPIO (עם CRC)</comment>
+ <comment xml:lang="hu">SV4 CPIO-archívum (CRC-vel)</comment>
+ <comment xml:lang="id">Arsip SV4 CPIO (dengan CRC)</comment>
+ <comment xml:lang="it">Archivio SV4 CPIO (con CRC)</comment>
+ <comment xml:lang="ja">SV4 CPIO アーカイブ (CRC 有り)</comment>
+ <comment xml:lang="kk">SV4 CPIO архиві (CRC бар)</comment>
+ <comment xml:lang="ko">SV4 CPIO 묶음 파일 (CRC 포함)</comment>
+ <comment xml:lang="lt">SV4 CPII archyvas (su CRC)</comment>
+ <comment xml:lang="lv">SV4 CPIO arhīvs (ar CRC)</comment>
+ <comment xml:lang="ms">Arkib CPIO SV4 (dengan CRC)</comment>
+ <comment xml:lang="nb">SV4 CPIO-arkiv (med CRC)</comment>
+ <comment xml:lang="nl">SV4 CPIO-archief (met CRC)</comment>
+ <comment xml:lang="nn">SV4 CPIO arkiv (med CRC)</comment>
+ <comment xml:lang="pl">Archiwum SV4 CPIO (z sumą kontrolną)</comment>
+ <comment xml:lang="pt_BR">Pacote SV4 CPIO (com CRC)</comment>
+ <comment xml:lang="ro">Arhivă SV4 CPIO (cu CRC)</comment>
+ <comment xml:lang="ru">архив SV4 CPIP (с CRC)</comment>
+ <comment xml:lang="sk">Archív SV4 CPIO (s CRC)</comment>
+ <comment xml:lang="sl">Datoteka arhiva SV4 CPIO (z razpršilom CRC)</comment>
+ <comment xml:lang="sq">Arkiv SV4 CPIO (me CRC)</comment>
+ <comment xml:lang="sv">SV4 CPIO-arkiv (med CRC)</comment>
+ <comment xml:lang="uk">архів SV4 CPIO (з CRC)</comment>
+ <comment xml:lang="vi">Kho nén CPIO SV4 (với CRC)</comment>
+ <comment xml:lang="zh_CN">SV4 CPIP 归档文件(带有 CRC)</comment>
+ <comment xml:lang="zh_TW">SV4 CPIO 封存檔 (具有 CRC)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.sv4crc"/>
+ </mime-type>
+ <mime-type type="application/x-tar">
+ <comment>Tar archive</comment>
+ <comment xml:lang="ar">أرشيف Tar</comment>
+ <comment xml:lang="az">Tar arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ tar</comment>
+ <comment xml:lang="bg">Архив — tar</comment>
+ <comment xml:lang="ca">arxiu tar</comment>
+ <comment xml:lang="cs">Archiv tar</comment>
+ <comment xml:lang="cy">Archif tar</comment>
+ <comment xml:lang="da">Tar-arkiv</comment>
+ <comment xml:lang="de">Tar-Archiv</comment>
+ <comment xml:lang="es">archivador Tar</comment>
+ <comment xml:lang="eu">Tar artxiboa</comment>
+ <comment xml:lang="fi">Tar-arkisto</comment>
+ <comment xml:lang="fo">Tar skjalasavn</comment>
+ <comment xml:lang="fr">archive tar</comment>
+ <comment xml:lang="ga">cartlann Tar</comment>
+ <comment xml:lang="gl">arquivo Tar</comment>
+ <comment xml:lang="he">ארכיון Tar</comment>
+ <comment xml:lang="hu">Tar archívum</comment>
+ <comment xml:lang="id">Arsip Tar</comment>
+ <comment xml:lang="it">Archivio tar</comment>
+ <comment xml:lang="ja">Tar アーカイブ</comment>
+ <comment xml:lang="kk">Tar архиві</comment>
+ <comment xml:lang="ko">TAR 묶음 파일</comment>
+ <comment xml:lang="lt">Tar archyvas</comment>
+ <comment xml:lang="lv">Tar arhīvs</comment>
+ <comment xml:lang="ms">Arkib Tar</comment>
+ <comment xml:lang="nb">Tar-arkiv</comment>
+ <comment xml:lang="nl">Tar-archief</comment>
+ <comment xml:lang="nn">Tar-arkiv</comment>
+ <comment xml:lang="pl">Archiwum tar</comment>
+ <comment xml:lang="pt_BR">Pacote tar</comment>
+ <comment xml:lang="ro">Arhivă Tar</comment>
+ <comment xml:lang="ru">архив TAR</comment>
+ <comment xml:lang="sk">Archív tar</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar</comment>
+ <comment xml:lang="sq">Arkiv tar</comment>
+ <comment xml:lang="sr">Тар архива</comment>
+ <comment xml:lang="sv">Tar-arkiv</comment>
+ <comment xml:lang="uk">архів tar</comment>
+ <comment xml:lang="vi">Kho nén tar</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <alias type="application/x-gtar"/>
+ <magic priority="50">
+ <match value="ustar\0" type="string" offset="257"/>
+ <match value="ustar\040\040\0" type="string" offset="257"/>
+ </magic>
+ <glob pattern="*.tar"/>
+ <glob pattern="*.gtar"/>
+ <glob pattern="*.gem"/>
+ </mime-type>
+ <mime-type type="application/x-tarz">
+ <comment>Tar archive (compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط)</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (skampresavany)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný)</comment>
+ <comment xml:lang="da">Tar-arkiv (komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido)</comment>
+ <comment xml:lang="eu">Tar artxiboa (konprimitua)</comment>
+ <comment xml:lang="fi">Tar-arkisto (pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (stappað)</comment>
+ <comment xml:lang="fr">archive tar (compressée)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ)</comment>
+ <comment xml:lang="hu">Tar archívum (tömörített)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi)</comment>
+ <comment xml:lang="it">Archivio tar (compresso)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (compress 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (압축) </comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests)</comment>
+ <comment xml:lang="nb">Tar-arkiv (komprimert)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka)</comment>
+ <comment xml:lang="pl">Archiwum tar (skompresowane)</comment>
+ <comment xml:lang="pt_BR">Pacote tar (compactado)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen)</comment>
+ <comment xml:lang="sq">Arkiv tar (i kompresuar)</comment>
+ <comment xml:lang="sv">Tar-arkiv (komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений)</comment>
+ <comment xml:lang="vi">Kho nén tar (đã nén)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (UNIX 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.tar.Z"/>
+ </mime-type>
+ <mime-type type="application/x-tex-gf">
+ <comment>generic font file</comment>
+ <comment xml:lang="ar">ملف الخط العام</comment>
+ <comment xml:lang="be@latin">zvyčajny fajł šryftu</comment>
+ <comment xml:lang="bg">Шрифт</comment>
+ <comment xml:lang="ca">fitxer genèric de tipus de lletra</comment>
+ <comment xml:lang="cs">Obecný soubor písma</comment>
+ <comment xml:lang="da">general skrifttypefil</comment>
+ <comment xml:lang="de">Allgemeine Schriftdatei</comment>
+ <comment xml:lang="el">γενικό αρχείο γραμματοσειράς</comment>
+ <comment xml:lang="en_GB">generic font file</comment>
+ <comment xml:lang="eo">genera tipara dosiero</comment>
+ <comment xml:lang="es">tipografía genérico</comment>
+ <comment xml:lang="eu">letra-tipo orokorra</comment>
+ <comment xml:lang="fi">yleinen kirjasintiedosto</comment>
+ <comment xml:lang="fo">felagsstavasniðsfíla</comment>
+ <comment xml:lang="fr">fichier de polices générique</comment>
+ <comment xml:lang="ga">comhad cló ginearálta</comment>
+ <comment xml:lang="gl">ficheiro de tipo de fonte xenérica</comment>
+ <comment xml:lang="he">קובץ גופן גנרי</comment>
+ <comment xml:lang="hu">általános betűkészletfájl</comment>
+ <comment xml:lang="id">berkas fonta generik</comment>
+ <comment xml:lang="it">File tipo carattere generico</comment>
+ <comment xml:lang="ja">一般フォントファイル</comment>
+ <comment xml:lang="kk">қаріп файлы</comment>
+ <comment xml:lang="ko">일반 글꼴 파일</comment>
+ <comment xml:lang="lt">bendras šrifto failas</comment>
+ <comment xml:lang="lv">vispārējs fonta fails</comment>
+ <comment xml:lang="ms">Fail font generik</comment>
+ <comment xml:lang="nb">vanlig skriftfil</comment>
+ <comment xml:lang="nl">algemeen lettertypebestand</comment>
+ <comment xml:lang="nn">vanleg skrifttypefil</comment>
+ <comment xml:lang="pl">Zwykły plik czcionki</comment>
+ <comment xml:lang="pt">ficheiro genérico de tipo de letra</comment>
+ <comment xml:lang="pt_BR">arquivo de fonte genérico</comment>
+ <comment xml:lang="ro">fișier de font generic</comment>
+ <comment xml:lang="ru">файл шрифта</comment>
+ <comment xml:lang="sk">Obyčajný súbor písma</comment>
+ <comment xml:lang="sl">izvorna datoteka pisave</comment>
+ <comment xml:lang="sq">File lloj gërme i përgjithshëm</comment>
+ <comment xml:lang="sr">општа датотека фонта</comment>
+ <comment xml:lang="sv">allmän typsnittsfil</comment>
+ <comment xml:lang="uk">загальний файл шрифту</comment>
+ <comment xml:lang="vi">tập tin phông giống loài</comment>
+ <comment xml:lang="zh_CN">通用字体文件</comment>
+ <comment xml:lang="zh_TW">通用字型檔</comment>
+ <generic-icon name="font-x-generic"/>
+ <glob pattern="*.gf"/>
+ </mime-type>
+ <mime-type type="application/x-tex-pk">
+ <comment>packed font file</comment>
+ <comment xml:lang="ar">ملف الخط المرزم</comment>
+ <comment xml:lang="be@latin">zapakavany fajł šryftu</comment>
+ <comment xml:lang="bg">Шрифт — компресиран</comment>
+ <comment xml:lang="ca">fitxer empaquetat de tipus de lletra</comment>
+ <comment xml:lang="cs">Komprimovaný soubor písma</comment>
+ <comment xml:lang="da">pakket skrifttypefil</comment>
+ <comment xml:lang="de">Gepackte Schriftdatei</comment>
+ <comment xml:lang="el">αρχείο συμπιεσμένης γραμματοσειράς</comment>
+ <comment xml:lang="en_GB">packed font file</comment>
+ <comment xml:lang="eo">pakigita tipara dosiero</comment>
+ <comment xml:lang="es">archivo de tipografía empaquetada</comment>
+ <comment xml:lang="eu">Letra-tipo fitxategi paketatua</comment>
+ <comment xml:lang="fi">pakattu kirjasintiedosto</comment>
+ <comment xml:lang="fo">pakkað stavasniðsfíla</comment>
+ <comment xml:lang="fr">fichier de polices empaquetées</comment>
+ <comment xml:lang="ga">comhad cló pacáilte</comment>
+ <comment xml:lang="gl">ficheiro de fonte empaquetada</comment>
+ <comment xml:lang="he">קובץ גופן ארוז</comment>
+ <comment xml:lang="hu">packed font-fájl</comment>
+ <comment xml:lang="id">berkas fonta terkemas</comment>
+ <comment xml:lang="it">File tipo carattere condensato</comment>
+ <comment xml:lang="ja">パックされたフォントファイル</comment>
+ <comment xml:lang="kk">қаріп файлы (дестеленген)</comment>
+ <comment xml:lang="ko">글꼴 묶음 파일</comment>
+ <comment xml:lang="lt">supakuotas šrifto failas</comment>
+ <comment xml:lang="lv">sapakots fonta fails</comment>
+ <comment xml:lang="ms">Fail font dipek</comment>
+ <comment xml:lang="nb">pakket skriftfil</comment>
+ <comment xml:lang="nl">ingepakt lettertypebestand</comment>
+ <comment xml:lang="nn">pakka skrifttypefil</comment>
+ <comment xml:lang="pl">Plik ze spakowaną czcionką</comment>
+ <comment xml:lang="pt">ficheiro de fontes empacotadas</comment>
+ <comment xml:lang="pt_BR">arquivo de fonte empacotado</comment>
+ <comment xml:lang="ro">fișier font împachetat</comment>
+ <comment xml:lang="ru">сжатый файл шрифта</comment>
+ <comment xml:lang="sk">Komprimovaný súbor písma</comment>
+ <comment xml:lang="sl">pakirana datoteka pisave</comment>
+ <comment xml:lang="sq">File lloj gërmash i kondensuar</comment>
+ <comment xml:lang="sr">пакована датотека са фонтом</comment>
+ <comment xml:lang="sv">packad typsnittsfil</comment>
+ <comment xml:lang="uk">запакований файл шрифту</comment>
+ <comment xml:lang="vi">tập tin phông chữ đã đóng gói</comment>
+ <comment xml:lang="zh_CN">打包的字体文件</comment>
+ <comment xml:lang="zh_TW">包裝字型檔</comment>
+ <generic-icon name="font-x-generic"/>
+ <glob pattern="*.pk"/>
+ </mime-type>
+ <mime-type type="application/x-tgif">
+ <comment>TGIF document</comment>
+ <comment xml:lang="ar">مستند TGIF</comment>
+ <comment xml:lang="be@latin">Dakument TGIF</comment>
+ <comment xml:lang="bg">Документ — TGIF</comment>
+ <comment xml:lang="ca">document TGIF</comment>
+ <comment xml:lang="cs">Dokument TGIF</comment>
+ <comment xml:lang="da">TGIF-dokument</comment>
+ <comment xml:lang="de">TGIF-Dokument</comment>
+ <comment xml:lang="el">Σχέδιο TGIF</comment>
+ <comment xml:lang="en_GB">TGIF document</comment>
+ <comment xml:lang="eo">TGIF-dokumento</comment>
+ <comment xml:lang="es">documento TGIF</comment>
+ <comment xml:lang="eu">TGIF dokumentua</comment>
+ <comment xml:lang="fi">TGIF-asiakirja</comment>
+ <comment xml:lang="fo">TGIF skjal</comment>
+ <comment xml:lang="fr">document TGIF</comment>
+ <comment xml:lang="ga">cáipéis TGIF</comment>
+ <comment xml:lang="gl">documento TGIF</comment>
+ <comment xml:lang="he">מסמך TGIF</comment>
+ <comment xml:lang="hu">TGIF-dokumentum</comment>
+ <comment xml:lang="id">Dokumen TGIF</comment>
+ <comment xml:lang="it">Documento TGIF</comment>
+ <comment xml:lang="ja">TGIF ドキュメント</comment>
+ <comment xml:lang="kk">TGIF құжаты</comment>
+ <comment xml:lang="ko">TGIF 문서</comment>
+ <comment xml:lang="lt">TGIF dokumentas</comment>
+ <comment xml:lang="lv">TGIF dokuments</comment>
+ <comment xml:lang="ms">Dokumen TGIF</comment>
+ <comment xml:lang="nb">TGIF-dokument</comment>
+ <comment xml:lang="nl">TGIF-document</comment>
+ <comment xml:lang="nn">TGIF-dokument</comment>
+ <comment xml:lang="pl">Dokument TGIF</comment>
+ <comment xml:lang="pt">documento TGIF</comment>
+ <comment xml:lang="pt_BR">Documento TGIF</comment>
+ <comment xml:lang="ro">Document TGIF</comment>
+ <comment xml:lang="ru">документ TGIF</comment>
+ <comment xml:lang="sk">Dokument TGIF</comment>
+ <comment xml:lang="sl">Dokument TGIF</comment>
+ <comment xml:lang="sq">Dokument TGIF</comment>
+ <comment xml:lang="sr">TGIF документ</comment>
+ <comment xml:lang="sv">TGIF-dokument</comment>
+ <comment xml:lang="uk">документ TGIF</comment>
+ <comment xml:lang="vi">Tài liệu TGIF</comment>
+ <comment xml:lang="zh_CN">TGIF 文档</comment>
+ <comment xml:lang="zh_TW">TGIF 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="%TGIF" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.obj"/>
+ </mime-type>
+ <mime-type type="application/x-theme">
+ <comment>theme</comment>
+ <comment xml:lang="ar">سمة</comment>
+ <comment xml:lang="az">örtük</comment>
+ <comment xml:lang="be@latin">matyŭ</comment>
+ <comment xml:lang="bg">Тема</comment>
+ <comment xml:lang="ca">tema</comment>
+ <comment xml:lang="cs">Motiv</comment>
+ <comment xml:lang="cy">thema</comment>
+ <comment xml:lang="da">tema</comment>
+ <comment xml:lang="de">Thema</comment>
+ <comment xml:lang="el">Θέμα</comment>
+ <comment xml:lang="en_GB">theme</comment>
+ <comment xml:lang="eo">etoso</comment>
+ <comment xml:lang="es">tema</comment>
+ <comment xml:lang="eu">gaia</comment>
+ <comment xml:lang="fi">teema</comment>
+ <comment xml:lang="fo">tema</comment>
+ <comment xml:lang="fr">thème</comment>
+ <comment xml:lang="ga">téama</comment>
+ <comment xml:lang="gl">tema</comment>
+ <comment xml:lang="he">ערכת נושא</comment>
+ <comment xml:lang="hu">téma</comment>
+ <comment xml:lang="id">tema</comment>
+ <comment xml:lang="it">Tema</comment>
+ <comment xml:lang="ja">テーマ</comment>
+ <comment xml:lang="kk">тема</comment>
+ <comment xml:lang="ko">테마</comment>
+ <comment xml:lang="lt">tema</comment>
+ <comment xml:lang="lv">tēma</comment>
+ <comment xml:lang="ms">Tema</comment>
+ <comment xml:lang="nb">tema</comment>
+ <comment xml:lang="nl">thema</comment>
+ <comment xml:lang="nn">drakt</comment>
+ <comment xml:lang="pl">Motyw</comment>
+ <comment xml:lang="pt">tema</comment>
+ <comment xml:lang="pt_BR">tema</comment>
+ <comment xml:lang="ro">temă</comment>
+ <comment xml:lang="ru">тема</comment>
+ <comment xml:lang="sk">Motív</comment>
+ <comment xml:lang="sl">tema</comment>
+ <comment xml:lang="sq">Temë</comment>
+ <comment xml:lang="sr">тема</comment>
+ <comment xml:lang="sv">tema</comment>
+ <comment xml:lang="uk">тема</comment>
+ <comment xml:lang="vi">sắc thái</comment>
+ <comment xml:lang="zh_CN">主题</comment>
+ <comment xml:lang="zh_TW">佈景主題</comment>
+ <sub-class-of type="application/x-desktop"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.theme"/>
+ </mime-type>
+ <mime-type type="application/x-toutdoux">
+ <comment>ToutDoux document</comment>
+ <comment xml:lang="ar">مستند ToutDoux</comment>
+ <comment xml:lang="az">ToutDoux sənədi</comment>
+ <comment xml:lang="be@latin">Dakument ToutDoux</comment>
+ <comment xml:lang="bg">Документ — ToutDoux</comment>
+ <comment xml:lang="ca">document ToutDoux</comment>
+ <comment xml:lang="cs">Dokument ToutDoux</comment>
+ <comment xml:lang="cy">Dogfen ToutDoux</comment>
+ <comment xml:lang="da">ToutDoux-dokument</comment>
+ <comment xml:lang="de">ToutDoux-Dokument</comment>
+ <comment xml:lang="el">έγγραφο ToutDoux</comment>
+ <comment xml:lang="en_GB">ToutDoux document</comment>
+ <comment xml:lang="eo">ToutDoux-dokumento</comment>
+ <comment xml:lang="es">documento de ToutDoux</comment>
+ <comment xml:lang="eu">ToutDoux dokumentua</comment>
+ <comment xml:lang="fi">ToutDoux-asiakirja</comment>
+ <comment xml:lang="fo">ToutDoux skjal</comment>
+ <comment xml:lang="fr">document ToutDoux</comment>
+ <comment xml:lang="ga">cáipéis ToutDoux</comment>
+ <comment xml:lang="gl">documento de ToutDoux</comment>
+ <comment xml:lang="he">משמך של ToutDoux</comment>
+ <comment xml:lang="hu">ToutDoux-dokumentum</comment>
+ <comment xml:lang="id">Dokumen ToutDoux</comment>
+ <comment xml:lang="it">Documento ToutDoux</comment>
+ <comment xml:lang="ja">ToutDoux ドキュメント</comment>
+ <comment xml:lang="kk">ToutDoux құжаты</comment>
+ <comment xml:lang="ko">ToutDoux 문서</comment>
+ <comment xml:lang="lt">ToutDoux dokumentas</comment>
+ <comment xml:lang="lv">ToutDoux dokuments</comment>
+ <comment xml:lang="ms">Dokumen ToutDoux</comment>
+ <comment xml:lang="nb">ToutDoux-dokument</comment>
+ <comment xml:lang="nl">ToutDoux-document</comment>
+ <comment xml:lang="nn">ToutDoux-dokument</comment>
+ <comment xml:lang="pl">Dokument ToutDoux</comment>
+ <comment xml:lang="pt">documento ToutDoux</comment>
+ <comment xml:lang="pt_BR">Documento do ToutDoux</comment>
+ <comment xml:lang="ro">Document ToutDoux</comment>
+ <comment xml:lang="ru">документ ToutDoux</comment>
+ <comment xml:lang="sk">Dokument ToutDoux</comment>
+ <comment xml:lang="sl">Dokument ToutDoux</comment>
+ <comment xml:lang="sq">Dokument ToutDoux</comment>
+ <comment xml:lang="sr">ToutDoux документ</comment>
+ <comment xml:lang="sv">ToutDoux-dokument</comment>
+ <comment xml:lang="uk">документ ToutDoux</comment>
+ <comment xml:lang="vi">Tài liệu ToutDoux</comment>
+ <comment xml:lang="zh_CN">ToutDoux 文档</comment>
+ <comment xml:lang="zh_TW">ToutDoux 文件</comment>
+ <generic-icon name="x-office-document"/>
+ </mime-type>
+ <mime-type type="application/x-trash">
+ <comment>backup file</comment>
+ <comment xml:lang="ar">ملف النسخ الاحتياطي</comment>
+ <comment xml:lang="be@latin">zapasny fajł</comment>
+ <comment xml:lang="bg">Резервно копие</comment>
+ <comment xml:lang="ca">fitxer de còpia de seguretat</comment>
+ <comment xml:lang="cs">Záložní soubor</comment>
+ <comment xml:lang="da">sikkerhedskopi</comment>
+ <comment xml:lang="de">Sicherungsdatei</comment>
+ <comment xml:lang="el">αντίγραφο ασφαλείας</comment>
+ <comment xml:lang="en_GB">backup file</comment>
+ <comment xml:lang="eo">restaŭrkopio</comment>
+ <comment xml:lang="es">archivo de respaldo</comment>
+ <comment xml:lang="eu">babes-kopiako fitxategia</comment>
+ <comment xml:lang="fi">varmuuskopio</comment>
+ <comment xml:lang="fo">trygdarritsfíla</comment>
+ <comment xml:lang="fr">fichier de sauvegarde</comment>
+ <comment xml:lang="ga">comhad cúltaca</comment>
+ <comment xml:lang="gl">ficheiro de copia de seguridade</comment>
+ <comment xml:lang="he">קובץ גיבוי</comment>
+ <comment xml:lang="hu">biztonsági mentés</comment>
+ <comment xml:lang="id">berkas cadangan</comment>
+ <comment xml:lang="it">File di backup</comment>
+ <comment xml:lang="ja">バックアップファイル</comment>
+ <comment xml:lang="kk">резервті көшірмесі</comment>
+ <comment xml:lang="ko">백업 파일</comment>
+ <comment xml:lang="lt">atsarginis failas</comment>
+ <comment xml:lang="lv">rezerves fails</comment>
+ <comment xml:lang="ms">Fail backup</comment>
+ <comment xml:lang="nb">sikkerhetskopi</comment>
+ <comment xml:lang="nl">reservekopiebestand</comment>
+ <comment xml:lang="nn">tryggleikskopi</comment>
+ <comment xml:lang="pl">Plik zapasowy</comment>
+ <comment xml:lang="pt">cópia de segurança</comment>
+ <comment xml:lang="pt_BR">Arquivo de backup</comment>
+ <comment xml:lang="ro">fișier de backup</comment>
+ <comment xml:lang="ru">резервная копия</comment>
+ <comment xml:lang="sk">Záložný súbor</comment>
+ <comment xml:lang="sl">varnostna kopija datoteke</comment>
+ <comment xml:lang="sq">File backup</comment>
+ <comment xml:lang="sr">резервна копија</comment>
+ <comment xml:lang="sv">säkerhetskopia</comment>
+ <comment xml:lang="uk">резервна копія</comment>
+ <comment xml:lang="vi">tập tin sao lưu</comment>
+ <comment xml:lang="zh_CN">备份文件</comment>
+ <comment xml:lang="zh_TW">備份檔</comment>
+ <glob pattern="*~"/>
+ <glob pattern="*%"/>
+ <glob pattern="*.bak"/>
+ <glob pattern="*.old"/>
+ <glob pattern="*.sik"/>
+ </mime-type>
+ <mime-type type="text/troff">
+ <comment>Troff document</comment>
+ <comment xml:lang="ar">مستند Troff</comment>
+ <comment xml:lang="az">Troff sənədi</comment>
+ <comment xml:lang="be@latin">Dakument Troff</comment>
+ <comment xml:lang="bg">Документ — Troff</comment>
+ <comment xml:lang="ca">document Troff</comment>
+ <comment xml:lang="cs">Dokument troff</comment>
+ <comment xml:lang="cy">Dogfen troff</comment>
+ <comment xml:lang="da">Troffdokument</comment>
+ <comment xml:lang="de">Troff-Dokument</comment>
+ <comment xml:lang="el">έγγραφο troff</comment>
+ <comment xml:lang="en_GB">Troff document</comment>
+ <comment xml:lang="eo">Troff-dokumento</comment>
+ <comment xml:lang="es">documento troff</comment>
+ <comment xml:lang="eu">Troff dokumentua</comment>
+ <comment xml:lang="fi">Troff-asiakirja</comment>
+ <comment xml:lang="fo">Troff skjal</comment>
+ <comment xml:lang="fr">document Troff</comment>
+ <comment xml:lang="ga">cáipéis Troff</comment>
+ <comment xml:lang="gl">documento Troff</comment>
+ <comment xml:lang="he">מסמך Troff</comment>
+ <comment xml:lang="hu">Troff-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Troff</comment>
+ <comment xml:lang="it">Documento Troff</comment>
+ <comment xml:lang="ja">Troff 入力ドキュメント</comment>
+ <comment xml:lang="kk">Troff құжаты</comment>
+ <comment xml:lang="ko">Troff 문서</comment>
+ <comment xml:lang="lt">Troff dokumentas</comment>
+ <comment xml:lang="lv">Troff dokuments</comment>
+ <comment xml:lang="ms">Dokumen Troff</comment>
+ <comment xml:lang="nb">Troff-dokument</comment>
+ <comment xml:lang="nl">Troff-document</comment>
+ <comment xml:lang="nn">Troff-dokument</comment>
+ <comment xml:lang="pl">Dokument Troff</comment>
+ <comment xml:lang="pt">documento Troff</comment>
+ <comment xml:lang="pt_BR">Documento troff</comment>
+ <comment xml:lang="ro">Document Troff</comment>
+ <comment xml:lang="ru">документ Troff</comment>
+ <comment xml:lang="sk">Dokument troff</comment>
+ <comment xml:lang="sl">Dokument Troff</comment>
+ <comment xml:lang="sq">Dokument Troff</comment>
+ <comment xml:lang="sr">Troff документ</comment>
+ <comment xml:lang="sv">Troff-dokument</comment>
+ <comment xml:lang="uk">документ Troff</comment>
+ <comment xml:lang="vi">Tài liệu Troff</comment>
+ <comment xml:lang="zh_CN">Troff 文档</comment>
+ <comment xml:lang="zh_TW">Troff 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <alias type="application/x-troff"/>
+ <alias type="text/x-troff"/>
+ <magic priority="50">
+ <match value='.\\\"' type="string" offset="0"/>
+ <match value="'\\\&quot;" type="string" offset="0"/>
+ <match value="'.\\\&quot;" type="string" offset="0"/>
+ <match value='\\\"' type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.tr"/>
+ <glob pattern="*.roff"/>
+ <glob pattern="*.t"/>
+ </mime-type>
+ <mime-type type="application/x-troff-man">
+ <comment>Troff document (with manpage macros)</comment>
+ <comment xml:lang="ar">مستند Troff (مع اختصارات صفحة المساعدة)</comment>
+ <comment xml:lang="be@latin">Dakument Troff (z makrasam man-staronak)</comment>
+ <comment xml:lang="bg">Документ — Troff, с макроси за справочни страници</comment>
+ <comment xml:lang="ca">document Troff (amb macros de pàgines de manual)</comment>
+ <comment xml:lang="cs">Dokument troff (s makry pro manuálové stránky)</comment>
+ <comment xml:lang="da">Troffdokument (med manualsidemakroer)</comment>
+ <comment xml:lang="de">Troff-Dokument (mit man-Seitenmakros)</comment>
+ <comment xml:lang="el">έγγραφο troff (με μακροεντολές manpage)</comment>
+ <comment xml:lang="en_GB">Troff document (with manpage macros)</comment>
+ <comment xml:lang="eo">Troff-dokumento (kun manpaĝaj makrooj)</comment>
+ <comment xml:lang="es">documento troff (con macros de páginas de manual)</comment>
+ <comment xml:lang="eu">Troff dokumentua (manpage makroekin)</comment>
+ <comment xml:lang="fi">Troff-asiakirja (man-sivu-makroilla)</comment>
+ <comment xml:lang="fo">Troff skjal (við manpage fjølvi)</comment>
+ <comment xml:lang="fr">document Troff (avec macros manpage)</comment>
+ <comment xml:lang="ga">cáipéis Troff (le macraí manpage)</comment>
+ <comment xml:lang="gl">documento Troff (con macros de páxinas de manual)</comment>
+ <comment xml:lang="he">מסמך של Troff (עם מאקרו בmanpage)</comment>
+ <comment xml:lang="hu">Troff-dokumentum (manpage-makrókkal)</comment>
+ <comment xml:lang="id">Dokumen Troff (dengan makro halaman manual)</comment>
+ <comment xml:lang="it">Documento Troff (con macro per manpage)</comment>
+ <comment xml:lang="ja">Troff 入力ドキュメント (man ページマクロ有り)</comment>
+ <comment xml:lang="kk">Troff құжаты (әдістемелік парақтар макростарымен)</comment>
+ <comment xml:lang="ko">Troff 문서 (맨페이지 매크로 포함)</comment>
+ <comment xml:lang="lt">Troff dokumentas (su žin. puslapių makrokomandomis)</comment>
+ <comment xml:lang="lv">Troff dokuments (ar manpage makrosiem)</comment>
+ <comment xml:lang="ms">Dokumen Troff (dengan macros halaman man)</comment>
+ <comment xml:lang="nb">Troff-dokument (med manualsidemakroer)</comment>
+ <comment xml:lang="nl">Troff-document (met man-macro's)</comment>
+ <comment xml:lang="nn">Troff-dokument med manualside-makroar</comment>
+ <comment xml:lang="pl">Dokument Troff (z makrami stron pomocy)</comment>
+ <comment xml:lang="pt">documento Troff (com macros manpage)</comment>
+ <comment xml:lang="pt_BR">Documento troff (com macros de páginas de manual)</comment>
+ <comment xml:lang="ro">Document Troff (cu macro-uri manpage)</comment>
+ <comment xml:lang="ru">документ Troff (с макросами страниц руководства)</comment>
+ <comment xml:lang="sk">Dokument troff (s makrami pre manuálové stránky)</comment>
+ <comment xml:lang="sl">Dokument Troff (z makroji manpage)</comment>
+ <comment xml:lang="sq">Dokumet Troff (me makro për manpage)</comment>
+ <comment xml:lang="sr">Troff документ (са макроима за ман странице)</comment>
+ <comment xml:lang="sv">Troff-dokument (med manualsidemakron)</comment>
+ <comment xml:lang="uk">документ Troff (з макросами manpage)</comment>
+ <comment xml:lang="vi">Tài liệu Troff (có vĩ lệnh trang hướng dẫn)</comment>
+ <comment xml:lang="zh_CN">Troff 文档(带 Man 手册宏)</comment>
+ <comment xml:lang="zh_TW">Troff 文件 (含有手冊頁面巨集)</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.man"/>
+ </mime-type>
+ <mime-type type="application/x-troff-man-compressed">
+ <comment>manual page (compressed)</comment>
+ <comment xml:lang="ar">صفحة المساعدة (مضغوطة)</comment>
+ <comment xml:lang="az">man səhifəsi (sıxışdırılmış)</comment>
+ <comment xml:lang="be@latin">staronka dapamohi (skampresavanaja)</comment>
+ <comment xml:lang="bg">Страница от справочника, компресирана</comment>
+ <comment xml:lang="ca">pàgina de manual (comprimida)</comment>
+ <comment xml:lang="cs">Manuálová stránka (komprimovaná)</comment>
+ <comment xml:lang="cy">tudalen llawlyfr (wedi ei gywasgu)</comment>
+ <comment xml:lang="da">manualside (komprimeret)</comment>
+ <comment xml:lang="de">Handbuchseite (komprimiert)</comment>
+ <comment xml:lang="el">σελίδα οδηγιών (συμπιεσμένη)</comment>
+ <comment xml:lang="en_GB">manual page (compressed)</comment>
+ <comment xml:lang="eo">manpaĝo (kunpremita)</comment>
+ <comment xml:lang="es">página de manual (comprimida)</comment>
+ <comment xml:lang="eu">eskuliburu orria (konprimitua)</comment>
+ <comment xml:lang="fi">manuaalisivu (pakattu)</comment>
+ <comment xml:lang="fo">handbókasíða (stappað)</comment>
+ <comment xml:lang="fr">page de manuel (compressée)</comment>
+ <comment xml:lang="ga">leathanach lámhleabhair (comhbhrúite)</comment>
+ <comment xml:lang="gl">páxina de manual (comprimida)</comment>
+ <comment xml:lang="he">דף עזר (מכווץ)</comment>
+ <comment xml:lang="hu">kézikönyvoldal (tömörített)</comment>
+ <comment xml:lang="id">halaman manual (terkompresi)</comment>
+ <comment xml:lang="it">Pagina di manuale (compressa)</comment>
+ <comment xml:lang="ja">(圧縮) man ページ</comment>
+ <comment xml:lang="kk">әдістемелік парағы (сығылған)</comment>
+ <comment xml:lang="ko">설명서 페이지 (압축)</comment>
+ <comment xml:lang="lt">žinyno puslapis (suglaudintas)</comment>
+ <comment xml:lang="lv">rokasgrāmatas lapa (saspiesta)</comment>
+ <comment xml:lang="ms">Halaman manual (termampat)</comment>
+ <comment xml:lang="nb">manualside (komprimert)</comment>
+ <comment xml:lang="nl">handleidingspagina (ingepakt)</comment>
+ <comment xml:lang="nn">manualside (pakka)</comment>
+ <comment xml:lang="pl">Strona podręcznika (skompresowana)</comment>
+ <comment xml:lang="pt">página de manual (comprimida)</comment>
+ <comment xml:lang="pt_BR">página de manual (compactada)</comment>
+ <comment xml:lang="ro">pagină de manual (comprimată)</comment>
+ <comment xml:lang="ru">страница руководства (сжатая)</comment>
+ <comment xml:lang="sk">Manuálová stránka (komprimovaná)</comment>
+ <comment xml:lang="sl">stran priročnika (stisnjena)</comment>
+ <comment xml:lang="sq">Faqe manuali (e kompresuar)</comment>
+ <comment xml:lang="sr">страна упутства (компресована)</comment>
+ <comment xml:lang="sv">manualsida (komprimerad)</comment>
+ <comment xml:lang="uk">сторінка посібника (стиснена)</comment>
+ <comment xml:lang="vi">trang hướng dẫn (đã nén)</comment>
+ <comment xml:lang="zh_CN">手册页 (压缩)</comment>
+ <comment xml:lang="zh_TW">手冊頁面 (壓縮版)</comment>
+ <generic-icon name="text-x-generic"/>
+ </mime-type>
+ <mime-type type="application/x-tzo">
+ <comment>Tar archive (LZO-compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-LZO)</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (LZO-skampresavany)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с LZO</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit amb LZO)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný pomocí LZO)</comment>
+ <comment xml:lang="da">Tar-arkiv (LZO-komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (LZO-komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido con LZO)</comment>
+ <comment xml:lang="eu">Tar artxiboa (LZO-rekin konprimitua)</comment>
+ <comment xml:lang="fi">Tar-arkisto (LZO-pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (LZO-stappað)</comment>
+ <comment xml:lang="fr">archive tar (compression LZO)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZO)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con LZO)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע"י LZO)</comment>
+ <comment xml:lang="hu">Tar archívum (LZO-val tömörítve)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi LZO)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con LZO)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (LZO 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (LZO-мен сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (LZO 압축)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su LZO)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar LZO)</comment>
+ <comment xml:lang="nb">Tar-arkiv (LZO-komprimert)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt met LZO)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med LZO)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja LZO)</comment>
+ <comment xml:lang="pt_BR">Pacote tar (compactado com LZO)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată LZO)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый LZO)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný pomocou LZO)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z LZO)</comment>
+ <comment xml:lang="sq">Arkiv tar (i kompresuar me LZO)</comment>
+ <comment xml:lang="sv">Tar-arkiv (LZO-komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений LZO)</comment>
+ <comment xml:lang="vi">Kho nén tar (đã nén LZO)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(LZO 压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (LZO 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.tar.lzo"/>
+ <glob pattern="*.tzo"/>
+ </mime-type>
+ <mime-type type="application/x-xz">
+ <comment>XZ archive</comment>
+ <comment xml:lang="ar">أرشيف XZ</comment>
+ <comment xml:lang="bg">Архив — XZ</comment>
+ <comment xml:lang="ca">arxiu XZ</comment>
+ <comment xml:lang="cs">Archiv XZ</comment>
+ <comment xml:lang="da">XZ-arkiv</comment>
+ <comment xml:lang="de">XZ-Archiv</comment>
+ <comment xml:lang="eo">XZ-arkivo</comment>
+ <comment xml:lang="es">archivador XZ</comment>
+ <comment xml:lang="eu">XZ artxiboa</comment>
+ <comment xml:lang="fi">XZ-arkisto</comment>
+ <comment xml:lang="fo">XZ skjalasavn</comment>
+ <comment xml:lang="fr">archive XZ</comment>
+ <comment xml:lang="ga">cartlann XZ</comment>
+ <comment xml:lang="gl">ficheiro XZ</comment>
+ <comment xml:lang="he">ארכיון XZ</comment>
+ <comment xml:lang="hu">XZ-archívum</comment>
+ <comment xml:lang="id">Arsip XZ</comment>
+ <comment xml:lang="it">Archivio XZ</comment>
+ <comment xml:lang="ja">XZ アーカイブ</comment>
+ <comment xml:lang="kk">XZ архиві</comment>
+ <comment xml:lang="ko">XZ 압축 파일</comment>
+ <comment xml:lang="lt">XZ archyvas</comment>
+ <comment xml:lang="lv">XZ arhīvs</comment>
+ <comment xml:lang="pl">Archiwum XZ</comment>
+ <comment xml:lang="ro">Arhivă XZ</comment>
+ <comment xml:lang="ru">архив XZ</comment>
+ <comment xml:lang="sk">Archív XZ</comment>
+ <comment xml:lang="sl">Datoteka arhiva XZ</comment>
+ <comment xml:lang="sv">XZ-arkiv</comment>
+ <comment xml:lang="uk">архів XZ</comment>
+ <comment xml:lang="zh_CN">XZ 归档文件</comment>
+ <comment xml:lang="zh_TW">XZ 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="\xfd\x37\x7a\x58\x5a\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.xz"/>
+ </mime-type>
+ <mime-type type="application/x-xz-compressed-tar">
+ <comment>Tar archive (XZ-compressed)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-XZ)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с XZ</comment>
+ <comment xml:lang="ca">arxiu tar (comprimit amb XZ)</comment>
+ <comment xml:lang="cs">Archiv tar (komprimovaný pomocí XZ)</comment>
+ <comment xml:lang="da">Tar-arkiv (XZ-komprimeret)</comment>
+ <comment xml:lang="de">Tar-Archiv (XZ-komprimiert)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido con XZ)</comment>
+ <comment xml:lang="eu">Tar artxiboa (XZ-rekin konprimitua)</comment>
+ <comment xml:lang="fi">Tar-arkisto (XZ-pakattu)</comment>
+ <comment xml:lang="fo">Tar skjalasavn(XZ-stappað)</comment>
+ <comment xml:lang="fr">archive tar (compression XZ)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le XZ)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con XZ)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע"י XZ)</comment>
+ <comment xml:lang="hu">Tar archívum (XZ-vel tömörítve)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi XZ)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con XZ)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (XZ 圧縮)</comment>
+ <comment xml:lang="kk">Tar архиві (XZ-мен сығылған)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일 (XZ 압축)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su XZ)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar XZ)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja XZ)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată XZ)</comment>
+ <comment xml:lang="ru">архив TAR (сжатый XZ)</comment>
+ <comment xml:lang="sk">Archív tar (komprimovaný pomocou XZ)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z XZ)</comment>
+ <comment xml:lang="sv">Tar-arkiv (XZ-komprimerat)</comment>
+ <comment xml:lang="uk">архів tar (стиснений XZ)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(XZ 压缩)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (XZ 格式壓縮)</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.tar.xz"/>
+ <glob pattern="*.txz"/>
+ </mime-type>
+ <mime-type type="application/x-xzpdf">
+ <comment>PDF document (XZ-compressed)</comment>
+ <comment xml:lang="bg">Документ — PDF, компресиран с XZ</comment>
+ <comment xml:lang="ca">document PDF (comprimit amb XZ)</comment>
+ <comment xml:lang="cs">Dokument PDF (komprimovaný pomocí XZ)</comment>
+ <comment xml:lang="de">PDF-Dokument (XZ-komprimiert)</comment>
+ <comment xml:lang="es">Documento PDF (comprimido en XZ)</comment>
+ <comment xml:lang="fi">PDF-asiakirja (XZ-pakattu)</comment>
+ <comment xml:lang="fr">document PDF (compressé XZ)</comment>
+ <comment xml:lang="gl">documento PDF (comprimido en XZ)</comment>
+ <comment xml:lang="he">מסמך PDF (בדחיסת XZ)</comment>
+ <comment xml:lang="hu">PDF dokumentum (XZ-vel tömörített)</comment>
+ <comment xml:lang="id">Dokumen PDF (terkompresi XZ)</comment>
+ <comment xml:lang="it">Documento PDF (compresso con XZ)</comment>
+ <comment xml:lang="ja">PDF 文書(XZ 圧縮)</comment>
+ <comment xml:lang="kk">PDF құжаты (XZ-мен сығылған)</comment>
+ <comment xml:lang="ko">PDF 문서 (XZ 압축)</comment>
+ <comment xml:lang="lv">PDF dokuments (saspiests ar XZ)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja XZ)</comment>
+ <comment xml:lang="ru">документ PDF (сжатый XZ)</comment>
+ <comment xml:lang="sl">Dokument PDF (XZ-stisnjen)</comment>
+ <comment xml:lang="sv">PDF-dokument (XZ-komprimerad)</comment>
+ <comment xml:lang="uk">документ PDF (стиснений xz)</comment>
+ <comment xml:lang="zh_CN">PDF 文档(XZ)</comment>
+ <comment xml:lang="zh_TW">PDF 文件 (XZ 格式壓縮)</comment>
+ <sub-class-of type="application/x-xz"/>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.pdf.xz"/>
+ </mime-type>
+ <mime-type type="application/x-ustar">
+ <comment>Ustar archive</comment>
+ <comment xml:lang="ar">أرشيف Ustar</comment>
+ <comment xml:lang="be@latin">Archiŭ ustar</comment>
+ <comment xml:lang="bg">Архив — ustar</comment>
+ <comment xml:lang="ca">arxiu ustar</comment>
+ <comment xml:lang="cs">Archiv ustar</comment>
+ <comment xml:lang="da">Ustararkiv</comment>
+ <comment xml:lang="de">Ustar-Archiv</comment>
+ <comment xml:lang="eo">Ustar-arkivo</comment>
+ <comment xml:lang="es">archivador Ustar</comment>
+ <comment xml:lang="eu">Ustar artxiboa</comment>
+ <comment xml:lang="fi">Ustar-arkisto</comment>
+ <comment xml:lang="fo">Ustar skjalasavn</comment>
+ <comment xml:lang="fr">archive Ustar</comment>
+ <comment xml:lang="ga">cartlann Ustar</comment>
+ <comment xml:lang="gl">arquivo Ustar</comment>
+ <comment xml:lang="he">ארכיון Ustar</comment>
+ <comment xml:lang="hu">Ustar archívum</comment>
+ <comment xml:lang="id">Arsip Ustar</comment>
+ <comment xml:lang="it">Archivio ustar</comment>
+ <comment xml:lang="ja">Ustar アーカイブ</comment>
+ <comment xml:lang="kk">Ustar архиві</comment>
+ <comment xml:lang="ko">Ustar 묶음 파일</comment>
+ <comment xml:lang="lt">Ustar archyvas</comment>
+ <comment xml:lang="lv">Ustar arhīvs</comment>
+ <comment xml:lang="nb">Ustar-arkiv</comment>
+ <comment xml:lang="nl">Ustar-archief</comment>
+ <comment xml:lang="nn">Ustar-arkiv</comment>
+ <comment xml:lang="pl">Archiwum ustar</comment>
+ <comment xml:lang="pt_BR">Pacote Ustar</comment>
+ <comment xml:lang="ro">Arhivă Ustar</comment>
+ <comment xml:lang="ru">архив Ustar</comment>
+ <comment xml:lang="sk">Archív ustar</comment>
+ <comment xml:lang="sl">Datoteka arhiva Ustar</comment>
+ <comment xml:lang="sq">Arkiv Ustar</comment>
+ <comment xml:lang="sv">Ustar-arkiv</comment>
+ <comment xml:lang="uk">архів ustar</comment>
+ <comment xml:lang="vi">Kho nén ustar</comment>
+ <comment xml:lang="zh_CN">Ustar 归档文件</comment>
+ <comment xml:lang="zh_TW">Ustar 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.ustar"/>
+ </mime-type>
+ <mime-type type="application/x-wais-source">
+ <comment>WAIS source code</comment>
+ <comment xml:lang="ar">شفرة مصدر WAIS</comment>
+ <comment xml:lang="az">WAIS mənbə faylı</comment>
+ <comment xml:lang="be@latin">Kryničny kod WAIS</comment>
+ <comment xml:lang="bg">Изходен код — WAIS</comment>
+ <comment xml:lang="ca">codi font en WAIS</comment>
+ <comment xml:lang="cs">Zdrojový kód WAIS</comment>
+ <comment xml:lang="cy">Ffynhonnell Rhaglen WAIS</comment>
+ <comment xml:lang="da">WAIS-kildekode</comment>
+ <comment xml:lang="de">WAIS-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας WAIS</comment>
+ <comment xml:lang="en_GB">WAIS source code</comment>
+ <comment xml:lang="eo">WAIS-fontkodo</comment>
+ <comment xml:lang="es">código fuente WAIS</comment>
+ <comment xml:lang="eu">WAIS iturburu-kodea</comment>
+ <comment xml:lang="fi">WAIS-lähdekoodi</comment>
+ <comment xml:lang="fo">WAIS keldukota</comment>
+ <comment xml:lang="fr">code source WAIS</comment>
+ <comment xml:lang="ga">cód foinseach WAIS</comment>
+ <comment xml:lang="gl">código fonte WAIS</comment>
+ <comment xml:lang="he">קוד מקור של WAIS</comment>
+ <comment xml:lang="hu">WAIS-forráskód</comment>
+ <comment xml:lang="id">Kode program WAIS</comment>
+ <comment xml:lang="it">Codice sorgente WAIS</comment>
+ <comment xml:lang="ja">WAIS ソースコード</comment>
+ <comment xml:lang="kk">WAIS бастапқы коды</comment>
+ <comment xml:lang="ko">WAIS 소스 코드</comment>
+ <comment xml:lang="lt">WAIS pradinis kodas</comment>
+ <comment xml:lang="lv">WAIS pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber WAIS</comment>
+ <comment xml:lang="nb">WAIS-kildekode</comment>
+ <comment xml:lang="nl">WAIS-broncode</comment>
+ <comment xml:lang="nn">WAIS-kjeldekode</comment>
+ <comment xml:lang="pl">Plik źródłowy WAIS</comment>
+ <comment xml:lang="pt">código fonte WAIS</comment>
+ <comment xml:lang="pt_BR">Código fonte WAIS</comment>
+ <comment xml:lang="ro">Cod sursă WAIS</comment>
+ <comment xml:lang="ru">исходный код WAIS</comment>
+ <comment xml:lang="sk">Zdrojový kód WAIS</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode WAIS</comment>
+ <comment xml:lang="sq">Kod burues WAIS</comment>
+ <comment xml:lang="sr">WAIS изворни ко̂д</comment>
+ <comment xml:lang="sv">WAIS-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою WAIS</comment>
+ <comment xml:lang="vi">Mã nguồn WAIS</comment>
+ <comment xml:lang="zh_CN">WAIS 源代码</comment>
+ <comment xml:lang="zh_TW">WAIS 源代碼</comment>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.src"/>
+ </mime-type>
+ <mime-type type="application/x-wpg">
+ <comment>WordPerfect/Drawperfect image</comment>
+ <comment xml:lang="ar">صورة WordPerfect/Drawperfect</comment>
+ <comment xml:lang="be@latin">Vyjava WordPerfect/Drawperfect</comment>
+ <comment xml:lang="bg">Изображение — WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ca">imatge de WordPerfect/Drawperfect</comment>
+ <comment xml:lang="cs">Obrázek WordPerfect/Drawperfect</comment>
+ <comment xml:lang="da">WordPerfect/Drawperfect-billede</comment>
+ <comment xml:lang="de">WordPerfect/DrawPerfect-Bild</comment>
+ <comment xml:lang="el">εικόνα WordPerfect/Drawperfect</comment>
+ <comment xml:lang="en_GB">WordPerfect/Drawperfect image</comment>
+ <comment xml:lang="eo">WordPerfect/Drawperfect-bildo</comment>
+ <comment xml:lang="es">imagen de WordPerfect/Drawperfect</comment>
+ <comment xml:lang="eu">WordPerfect/Drawperfect irudia</comment>
+ <comment xml:lang="fi">WordPerfect/Drawperfect-kuva</comment>
+ <comment xml:lang="fo">WordPerfect/Drawperfect mynd</comment>
+ <comment xml:lang="fr">image WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="ga">íomhá WordPerfect/Drawperfect</comment>
+ <comment xml:lang="gl">imaxe de WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="he">תמונה של WordPerfect/Drawperfect</comment>
+ <comment xml:lang="hu">WordPerfect/Drawperfect-kép</comment>
+ <comment xml:lang="id">Gambar WordPerfect/Drawperfect</comment>
+ <comment xml:lang="it">Immagine WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ja">WordPerfect/Drawperfect 画像</comment>
+ <comment xml:lang="kk">WordPerfect/Drawperfect суреті</comment>
+ <comment xml:lang="ko">워드퍼펙트/드로우퍼펙트 그림</comment>
+ <comment xml:lang="lt">WordPerfect/Drawperfect paveikslėlis</comment>
+ <comment xml:lang="lv">WordPerfect/Drawperfect attēls</comment>
+ <comment xml:lang="ms">Imej WordPerfect/Drawperfect</comment>
+ <comment xml:lang="nb">WordPerfect-/Drawperfect-bilde</comment>
+ <comment xml:lang="nl">WordPerfect/Drawperfect-afbeelding</comment>
+ <comment xml:lang="nn">WordPerfect/DrawPerfect-bilete</comment>
+ <comment xml:lang="pl">Obraz WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="pt">imagem do WordPerfect/Drawperfect</comment>
+ <comment xml:lang="pt_BR">Imagem do WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ro">Imagine WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ru">изображение WordPerfect/Drawperfect</comment>
+ <comment xml:lang="sk">Obrázok WordPerfect/Drawperfect</comment>
+ <comment xml:lang="sl">Slikovna datoteka Drawperfect</comment>
+ <comment xml:lang="sq">Figurë WordPerfect/Drawperfect</comment>
+ <comment xml:lang="sr">WordPerfect/Drawperfect слика</comment>
+ <comment xml:lang="sv">WordPerfect/Drawperfect-bild</comment>
+ <comment xml:lang="uk">зображення WordPerfect/Drawperfect</comment>
+ <comment xml:lang="vi">Ảnh WordPerfect/Drawperfect</comment>
+ <comment xml:lang="zh_CN">WordPerfect/Drawperfect 图像</comment>
+ <comment xml:lang="zh_TW">WordPerfect/Drawperfect 影像</comment>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.wpg"/>
+ </mime-type>
+ <mime-type type="application/x-x509-ca-cert">
+ <comment>DER/PEM/Netscape-encoded X.509 certificate</comment>
+ <comment xml:lang="ar">شهادة DER/PEM/Netscape-encoded X.509</comment>
+ <comment xml:lang="be@latin">Sertyfikat X.509, zakadavany ŭ DER/PEM/Netscape</comment>
+ <comment xml:lang="bg">Сертификат — DER/PEM/Netscape X.509</comment>
+ <comment xml:lang="ca">certificat X.509 codificat com DER/PEM/Netscape</comment>
+ <comment xml:lang="cs">Certifikát X.509 kódovaný jako DER/PEM/Netscape</comment>
+ <comment xml:lang="da">DER-/PEM-/Netscapekodet X.509-certifikat</comment>
+ <comment xml:lang="de">DER/PEM/Netscape-kodiertes X.509-Zertifikat</comment>
+ <comment xml:lang="el">ψηφιακό πιστοποιητικό X.509 κωδικοποιημένο κατά DER/PEM/Netscape</comment>
+ <comment xml:lang="en_GB">DER/PEM/Netscape-encoded X.509 certificate</comment>
+ <comment xml:lang="eo">DER/PEM/Netscape-kodigita X.509-certigilo</comment>
+ <comment xml:lang="es">certificado X.509 codificado con DER/PEM/Netscape</comment>
+ <comment xml:lang="eu">X.509rekin kodetutako DER, PEM edo Netscape zertifikatua</comment>
+ <comment xml:lang="fi">DER/PEM/Netscape-koodattu X.509-varmenne</comment>
+ <comment xml:lang="fo">DER/PEM/Netscape-encoded X.509 váttan</comment>
+ <comment xml:lang="fr">certificat X.509 codé DER/PEM/Netscape</comment>
+ <comment xml:lang="ga">teastas X.509 ionchódaithe le DER/PEM/Netscape</comment>
+ <comment xml:lang="gl">certificado X.509 codificado con DER/PEM/Netscape</comment>
+ <comment xml:lang="he">אישור מסוג X.509 של DER/PEM/Netscape-encoded</comment>
+ <comment xml:lang="hu">DER/PEM/Netscape formátumú X.509-tanúsítvány</comment>
+ <comment xml:lang="id">Sertifikat DER/PEM/Netscape-tersandi X.509</comment>
+ <comment xml:lang="it">Certificato DER/PEM/Netscape-encoded X.509</comment>
+ <comment xml:lang="ja">DER/PEM/Netscape エンコード X.509 証明書</comment>
+ <comment xml:lang="kk">X.509 сертификаты (DER/PEM/Netscape кодталған)</comment>
+ <comment xml:lang="ko">DER/PEM/X.509로 인코드된 넷스케이프 인증서</comment>
+ <comment xml:lang="lt">DER/PEM/Netscape-encoded X.509 liudijimas</comment>
+ <comment xml:lang="lv">DER/PEM/Netscape-encoded X.509 sertifikāts</comment>
+ <comment xml:lang="ms">Sijil X.509 dienkod /DER/PEM/Netscape</comment>
+ <comment xml:lang="nb">DER/PEM/Netscape-kodet X.509-sertifikat</comment>
+ <comment xml:lang="nl">DER/PEM/Netscape-gecodeerd X.509-certificaat</comment>
+ <comment xml:lang="nn">DER/PEM/Netscape-koda X.509-sertifikat</comment>
+ <comment xml:lang="pl">Zakodowany w DER/PEM/Netscape certyfikat X.509</comment>
+ <comment xml:lang="pt">certificado X.509 codificado com DER/PEM/Netscape</comment>
+ <comment xml:lang="pt_BR">Certificado X.509 codificado com DER/PEM/Netscape</comment>
+ <comment xml:lang="ro">Certificat DER/PEM/Netscape-codat X.509</comment>
+ <comment xml:lang="ru">сертификат X.509 (DER/PEM/Netscape-закодированный)</comment>
+ <comment xml:lang="sk">Certifikát X.509 kódovaný ako DER/PEM/Netscape</comment>
+ <comment xml:lang="sl">Datoteka potrdila DER/PEM/Netscape X.509</comment>
+ <comment xml:lang="sq">Çertifikatë DER/PEM/Netscape-encoded X.509</comment>
+ <comment xml:lang="sr">DER, PEM или Нетскејп кодирани сертификат X.509</comment>
+ <comment xml:lang="sv">DER/PEM/Netscape-kodat X.509-certifikat</comment>
+ <comment xml:lang="uk">сертифікат X.509 у форматі DER/PEM/Netscape</comment>
+ <comment xml:lang="vi">Chứng nhận X.509 mã hoá bằng Netscape/PEM/DER</comment>
+ <comment xml:lang="zh_CN">DER/PEM/Netscape-encoded X.509 证书</comment>
+ <comment xml:lang="zh_TW">DER/PEM/Netscape 編碼的 X.509 憑證</comment>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.der"/>
+ <glob pattern="*.crt"/>
+ <glob pattern="*.cert"/>
+ <glob pattern="*.pem"/>
+ </mime-type>
+ <mime-type type="application/x-zerosize">
+ <comment>empty document</comment>
+ <comment xml:lang="ar">مستند فارغ</comment>
+ <comment xml:lang="be@latin">pusty dakument</comment>
+ <comment xml:lang="bg">Празен документ</comment>
+ <comment xml:lang="ca">document buit</comment>
+ <comment xml:lang="cs">Prázdný dokument</comment>
+ <comment xml:lang="da">tomt dokument</comment>
+ <comment xml:lang="de">Leeres Dokument</comment>
+ <comment xml:lang="el">κενό έγγραφο</comment>
+ <comment xml:lang="en_GB">empty document</comment>
+ <comment xml:lang="eo">malplena dokumento</comment>
+ <comment xml:lang="es">documento vacío</comment>
+ <comment xml:lang="eu">dokumentu hutsa</comment>
+ <comment xml:lang="fi">tyhjä asiakirja</comment>
+ <comment xml:lang="fo">tómt skjal</comment>
+ <comment xml:lang="fr">document vide</comment>
+ <comment xml:lang="ga">cáipéis fholamh</comment>
+ <comment xml:lang="gl">documeto baleiro</comment>
+ <comment xml:lang="he">מסמך ריק</comment>
+ <comment xml:lang="hu">üres dokumentum</comment>
+ <comment xml:lang="id">dokumen kosong</comment>
+ <comment xml:lang="it">Documento vuoto</comment>
+ <comment xml:lang="ja">空のドキュメント</comment>
+ <comment xml:lang="kk">бос құжат</comment>
+ <comment xml:lang="ko">빈 문서</comment>
+ <comment xml:lang="lt">tuščias dokumentas</comment>
+ <comment xml:lang="lv">tukšs dokuments</comment>
+ <comment xml:lang="ms">Dokumen kosong</comment>
+ <comment xml:lang="nb">tomt dokument</comment>
+ <comment xml:lang="nl">leeg document</comment>
+ <comment xml:lang="nn">tomt dokument</comment>
+ <comment xml:lang="pl">Pusty dokument</comment>
+ <comment xml:lang="pt">documento vazio</comment>
+ <comment xml:lang="pt_BR">documento vazio</comment>
+ <comment xml:lang="ro">document gol</comment>
+ <comment xml:lang="ru">пустой документ</comment>
+ <comment xml:lang="sk">Prázdny dokument</comment>
+ <comment xml:lang="sl">prazen dokument</comment>
+ <comment xml:lang="sq">Dokument bosh</comment>
+ <comment xml:lang="sr">празан документ</comment>
+ <comment xml:lang="sv">tomt dokument</comment>
+ <comment xml:lang="uk">порожній документ</comment>
+ <comment xml:lang="vi">tài liệu rỗng</comment>
+ <comment xml:lang="zh_CN">空文档</comment>
+ <comment xml:lang="zh_TW">空白文件</comment>
+ </mime-type>
+ <mime-type type="application/x-zoo">
+ <comment>Zoo archive</comment>
+ <comment xml:lang="ar">أرشيف Zoo</comment>
+ <comment xml:lang="az">Zoo arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ zoo</comment>
+ <comment xml:lang="bg">Архив — zoo</comment>
+ <comment xml:lang="ca">arxiu zoo</comment>
+ <comment xml:lang="cs">Archiv zoo</comment>
+ <comment xml:lang="cy">Archif zoo</comment>
+ <comment xml:lang="da">Zooarkiv</comment>
+ <comment xml:lang="de">Zoo-Archiv</comment>
+ <comment xml:lang="eo">Zoo-arkivo</comment>
+ <comment xml:lang="es">archivador Zoo</comment>
+ <comment xml:lang="eu">Zoo artxiboa</comment>
+ <comment xml:lang="fi">Zoo-arkisto</comment>
+ <comment xml:lang="fo">Zoo skjalasavn</comment>
+ <comment xml:lang="fr">archive zoo</comment>
+ <comment xml:lang="ga">cartlann Zoo</comment>
+ <comment xml:lang="gl">ficheiro Zoo</comment>
+ <comment xml:lang="he">ארכיון Zoo</comment>
+ <comment xml:lang="hu">Zoo archívum</comment>
+ <comment xml:lang="id">Arsip Zoo</comment>
+ <comment xml:lang="it">Archivio zoo</comment>
+ <comment xml:lang="ja">Zoo アーカイブ</comment>
+ <comment xml:lang="kk">Zoo архиві</comment>
+ <comment xml:lang="ko">ZOO 압축 파일</comment>
+ <comment xml:lang="lt">Zoo archyvas</comment>
+ <comment xml:lang="lv">Zoo arhīvs</comment>
+ <comment xml:lang="nb">Zoo-arkiv</comment>
+ <comment xml:lang="nl">Zoo-archief</comment>
+ <comment xml:lang="nn">Zoo-arkiv</comment>
+ <comment xml:lang="pl">Archiwum zoo</comment>
+ <comment xml:lang="pt_BR">Pacote Zoo</comment>
+ <comment xml:lang="ro">Arhivă Zoo</comment>
+ <comment xml:lang="ru">архив ZOO</comment>
+ <comment xml:lang="sk">Archív zoo</comment>
+ <comment xml:lang="sl">Datoteka arhiva ZOO</comment>
+ <comment xml:lang="sq">Arkiv zoo</comment>
+ <comment xml:lang="sv">Zoo-arkiv</comment>
+ <comment xml:lang="uk">архів zoo</comment>
+ <comment xml:lang="vi">Kho nén zoo</comment>
+ <comment xml:lang="zh_CN">Zoo 归档文件</comment>
+ <comment xml:lang="zh_TW">Zoo 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="0xfdc4a7dc" type="little32" offset="20"/>
+ </magic>
+ <glob pattern="*.zoo"/>
+ </mime-type>
+ <mime-type type="application/xhtml+xml">
+ <comment>XHTML page</comment>
+ <comment xml:lang="ar">صفحة XHTML</comment>
+ <comment xml:lang="be@latin">Staronka XHTML</comment>
+ <comment xml:lang="bg">Страница — XHTML</comment>
+ <comment xml:lang="ca">pàgina XHTML</comment>
+ <comment xml:lang="cs">Stránka XHTML</comment>
+ <comment xml:lang="da">XHTML-side</comment>
+ <comment xml:lang="de">XHTML-Seite</comment>
+ <comment xml:lang="el">σελίδα XHTML</comment>
+ <comment xml:lang="en_GB">XHTML page</comment>
+ <comment xml:lang="eo">XHTML-paĝo</comment>
+ <comment xml:lang="es">página XHTML</comment>
+ <comment xml:lang="eu">XHTML orria</comment>
+ <comment xml:lang="fi">XHTML-sivu</comment>
+ <comment xml:lang="fo">XHTML síða</comment>
+ <comment xml:lang="fr">page XHTML</comment>
+ <comment xml:lang="ga">leathanach XHTML</comment>
+ <comment xml:lang="gl">Páxina XHTML</comment>
+ <comment xml:lang="he">דף XHTML</comment>
+ <comment xml:lang="hu">XHTML-oldal</comment>
+ <comment xml:lang="id">Halaman XHTML</comment>
+ <comment xml:lang="it">Pagina XHTML</comment>
+ <comment xml:lang="ja">XHTML ページ</comment>
+ <comment xml:lang="kk">XHTML парағы</comment>
+ <comment xml:lang="ko">XHTML 페이지</comment>
+ <comment xml:lang="lt">XHTML puslapis</comment>
+ <comment xml:lang="lv">XHTML lapa</comment>
+ <comment xml:lang="ms">Laman XHTML</comment>
+ <comment xml:lang="nb">XHTML-side</comment>
+ <comment xml:lang="nl">XHTML-pagina</comment>
+ <comment xml:lang="nn">XHTML-side</comment>
+ <comment xml:lang="pl">Strona XHTML</comment>
+ <comment xml:lang="pt">página XHTML</comment>
+ <comment xml:lang="pt_BR">Página XHTML</comment>
+ <comment xml:lang="ro">Pagină XHTML</comment>
+ <comment xml:lang="ru">страница XHTML</comment>
+ <comment xml:lang="sk">Stránka XHTML</comment>
+ <comment xml:lang="sl">Datoteka spletne strani XHTML</comment>
+ <comment xml:lang="sq">Faqe XHTML</comment>
+ <comment xml:lang="sr">XHTML страна</comment>
+ <comment xml:lang="sv">XHTML-sida</comment>
+ <comment xml:lang="uk">сторінка XHTML</comment>
+ <comment xml:lang="vi">Trang XHTML</comment>
+ <comment xml:lang="zh_CN">XHTML 页面</comment>
+ <comment xml:lang="zh_TW">XHTML 網頁</comment>
+ <acronym>XHTML</acronym>
+ <expanded-acronym>Extensible HyperText Markup Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-html"/>
+ <glob pattern="*.xhtml"/>
+ <root-XML namespaceURI='http://www.w3.org/1999/xhtml' localName='html'/>
+ </mime-type>
+ <mime-type type="application/zip">
+ <comment>Zip archive</comment>
+ <comment xml:lang="ar">أرشيف Zip</comment>
+ <comment xml:lang="az">Zip arxivi</comment>
+ <comment xml:lang="be@latin">Archiŭ zip</comment>
+ <comment xml:lang="bg">Архив — zip</comment>
+ <comment xml:lang="ca">arxiu zip</comment>
+ <comment xml:lang="cs">Archiv ZIP</comment>
+ <comment xml:lang="cy">Archif ZIP</comment>
+ <comment xml:lang="da">Ziparkiv</comment>
+ <comment xml:lang="de">Zip-Archiv</comment>
+ <comment xml:lang="eo">Zip-arkivo</comment>
+ <comment xml:lang="es">archivador Zip</comment>
+ <comment xml:lang="eu">Zip artxiboa</comment>
+ <comment xml:lang="fi">Zip-arkisto</comment>
+ <comment xml:lang="fo">Zip skjalasavn</comment>
+ <comment xml:lang="fr">archive zip</comment>
+ <comment xml:lang="ga">cartlann Zip</comment>
+ <comment xml:lang="gl">ficheiro Zip</comment>
+ <comment xml:lang="he">ארכיון Zip</comment>
+ <comment xml:lang="hu">Zip archívum</comment>
+ <comment xml:lang="id">Arsip Zip</comment>
+ <comment xml:lang="it">Archivio zip</comment>
+ <comment xml:lang="ja">Zip アーカイブ</comment>
+ <comment xml:lang="kk">Zip архиві</comment>
+ <comment xml:lang="ko">ZIP 압축 파일</comment>
+ <comment xml:lang="lt">Zip archyvas</comment>
+ <comment xml:lang="lv">Zip arhīvs</comment>
+ <comment xml:lang="nb">Zip-arkiv</comment>
+ <comment xml:lang="nl">Zip-archief</comment>
+ <comment xml:lang="nn">Zip-arkiv</comment>
+ <comment xml:lang="pl">Archiwum ZIP</comment>
+ <comment xml:lang="pt_BR">Pacote Zip</comment>
+ <comment xml:lang="ro">Arhivă zip</comment>
+ <comment xml:lang="ru">архив ZIP</comment>
+ <comment xml:lang="sk">Archív ZIP</comment>
+ <comment xml:lang="sl">Datoteka arhiva ZIP</comment>
+ <comment xml:lang="sq">Arkiv zip</comment>
+ <comment xml:lang="sv">Zip-arkiv</comment>
+ <comment xml:lang="uk">архів zip</comment>
+ <comment xml:lang="vi">Kho nén zip</comment>
+ <comment xml:lang="zh_CN">Zip 归档文件</comment>
+ <comment xml:lang="zh_TW">Zip 封存檔</comment>
+ <alias type="application/x-zip-compressed"/>
+ <alias type="application/x-zip"/>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="40">
+ <match value="PK\003\004" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.zip"/>
+ </mime-type>
+ <mime-type type="application/x-ms-wim">
+ <comment>Windows Imaging Format Disk Image</comment>
+ <comment xml:lang="bg">Диск — Windows Imaging</comment>
+ <comment xml:lang="ca">imatge de disc «Windows Imaging Format»</comment>
+ <comment xml:lang="cs">Windows Imaging Format Disk Image</comment>
+ <comment xml:lang="da">Windows Imaging Format-diskaftryk</comment>
+ <comment xml:lang="de">Windows-Imaging-Format-Datenträgerabbild</comment>
+ <comment xml:lang="es">imagen de disco de Windows Imaging Format</comment>
+ <comment xml:lang="fr">image disque Windows Imaging Format</comment>
+ <comment xml:lang="gl">imaxe de disco de Windows Imaging Format</comment>
+ <comment xml:lang="he">מבנה תמונת כונן של Windows Imaging</comment>
+ <comment xml:lang="hu">Windows Imaging Format lemezkép</comment>
+ <comment xml:lang="id">Image Disk Windows Imaging Format</comment>
+ <comment xml:lang="it">Immagine disco formato Windows Imaging</comment>
+ <comment xml:lang="ja">Windows イメージング形式 ディスクイメージ</comment>
+ <comment xml:lang="kk">Windows Imaging Format Disk бейнесі</comment>
+ <comment xml:lang="ko">윈도우 이미지 포맷 디스크 이미지</comment>
+ <comment xml:lang="lv">Windows Imaging Format diska attēls</comment>
+ <comment xml:lang="pl">Obraz dysku Windows Imaging Format</comment>
+ <comment xml:lang="ro">Imagine de disc „Windows Imaging Format”</comment>
+ <comment xml:lang="ru">образ диска Windows</comment>
+ <comment xml:lang="sl">Odtis slike Windows Imaging</comment>
+ <comment xml:lang="sv">Windows Imaging Format Disk-avbild</comment>
+ <comment xml:lang="uk">формат образів дисків Windows Imaging</comment>
+ <comment xml:lang="zh_CN">Windows Imaging 格式磁盘镜像</comment>
+ <comment xml:lang="zh_TW">Windows Imaging Format Disk 映像</comment>
+ <magic>
+ <match value="MSWIM\000\000\000" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.wim"/>
+ <glob pattern="*.swm"/>
+ </mime-type>
+ <mime-type type="audio/ac3">
+ <comment>Dolby Digital audio</comment>
+ <comment xml:lang="ar">Dolby Digital سمعي</comment>
+ <comment xml:lang="az">Dolby Digital audio</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Dolby Digital</comment>
+ <comment xml:lang="bg">Аудио — Dolby Digital</comment>
+ <comment xml:lang="ca">àudio Dolby Digital</comment>
+ <comment xml:lang="cs">Zvuk Dolby Digital</comment>
+ <comment xml:lang="cy">Sain Dolby Digital</comment>
+ <comment xml:lang="da">Dolby Ditital-lyd</comment>
+ <comment xml:lang="de">Dolby-Digital-Audio</comment>
+ <comment xml:lang="el">ψηφιακός Ήχος Dolby</comment>
+ <comment xml:lang="en_GB">Dolby Digital audio</comment>
+ <comment xml:lang="eo">Sondosiero en Dolby Digital</comment>
+ <comment xml:lang="es">sonido Dolby Digital</comment>
+ <comment xml:lang="eu">Dolby audio digitala</comment>
+ <comment xml:lang="fi">Dolby Digital -ääni</comment>
+ <comment xml:lang="fo">Dolby Digital ljóður</comment>
+ <comment xml:lang="fr">audio Dolby Digital</comment>
+ <comment xml:lang="ga">fuaim Dolby Digital</comment>
+ <comment xml:lang="gl">son Dolby Digital</comment>
+ <comment xml:lang="he">שמע Dolby Digital</comment>
+ <comment xml:lang="hu">Dolby Digital hang</comment>
+ <comment xml:lang="id">Audio Dolby Digital</comment>
+ <comment xml:lang="it">Audio Dolby Digital</comment>
+ <comment xml:lang="ja">ドルビーデジタルオーディオ</comment>
+ <comment xml:lang="kk">Dolby Digital аудиосы</comment>
+ <comment xml:lang="ko">돌비 디지털 오디오</comment>
+ <comment xml:lang="lt">Dolby Digital garso įrašas</comment>
+ <comment xml:lang="lv">Dolby Digital audio</comment>
+ <comment xml:lang="ms">Audio Digital Dolby</comment>
+ <comment xml:lang="nb">Dolby digital lyd</comment>
+ <comment xml:lang="nl">Dolby Digital-audio</comment>
+ <comment xml:lang="nn">Dolby Digital lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Dolby Digital</comment>
+ <comment xml:lang="pt">áudio Dolby Digital</comment>
+ <comment xml:lang="pt_BR">Áudio Dolby Digital</comment>
+ <comment xml:lang="ro">Audio Dolby Digital</comment>
+ <comment xml:lang="ru">аудио Dolby Digital</comment>
+ <comment xml:lang="sk">Zvuk Dolby Digital</comment>
+ <comment xml:lang="sl">Zvočna datoteka Dolby Digital</comment>
+ <comment xml:lang="sq">Audio Dolby Digital</comment>
+ <comment xml:lang="sr">Дигитални Dolby звучни запис</comment>
+ <comment xml:lang="sv">Dolby Digital-ljud</comment>
+ <comment xml:lang="uk">звук Dolby Digital</comment>
+ <comment xml:lang="vi">Âm thanh Dolby Digital</comment>
+ <comment xml:lang="zh_CN">杜比数字音频</comment>
+ <comment xml:lang="zh_TW">杜比數位音訊</comment>
+ <magic priority="50">
+ <match value="0x0b77" type="big16" offset="0"/>
+ </magic>
+ <glob pattern="*.ac3"/>
+ </mime-type>
+ <mime-type type="audio/AMR">
+ <comment>AMR audio</comment>
+ <comment xml:lang="ar">AMR سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AMR</comment>
+ <comment xml:lang="bg">Аудио — AMR</comment>
+ <comment xml:lang="ca">àudio AMR</comment>
+ <comment xml:lang="cs">Zvuk AMR</comment>
+ <comment xml:lang="da">AMR-lyd</comment>
+ <comment xml:lang="de">AMR-Audio</comment>
+ <comment xml:lang="eo">AMR-sondosiero</comment>
+ <comment xml:lang="es">sonido AMR</comment>
+ <comment xml:lang="eu">AMR audioa</comment>
+ <comment xml:lang="fi">AMR-ääni</comment>
+ <comment xml:lang="fo">AMR ljóður</comment>
+ <comment xml:lang="fr">audio AMR</comment>
+ <comment xml:lang="ga">fuaim AMR</comment>
+ <comment xml:lang="gl">son AMR</comment>
+ <comment xml:lang="he">שמע AMR</comment>
+ <comment xml:lang="hu">AMR hang</comment>
+ <comment xml:lang="id">Audio AMR</comment>
+ <comment xml:lang="it">Audio AMR</comment>
+ <comment xml:lang="ja">AMR オーディオ</comment>
+ <comment xml:lang="kk">AMR аудиосы</comment>
+ <comment xml:lang="ko">AMR 오디오</comment>
+ <comment xml:lang="lt">AMR garso įrašas</comment>
+ <comment xml:lang="lv">AMR audio</comment>
+ <comment xml:lang="nb">AMR-lyd</comment>
+ <comment xml:lang="nl">AMR-audio</comment>
+ <comment xml:lang="nn">AMR-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AMR</comment>
+ <comment xml:lang="pt_BR">Áudio AMR</comment>
+ <comment xml:lang="ro">Audio AMR</comment>
+ <comment xml:lang="ru">аудио AMR</comment>
+ <comment xml:lang="sk">Zvuk AMR</comment>
+ <comment xml:lang="sl">Zvočna datoteka AMR</comment>
+ <comment xml:lang="sq">Audio AMR</comment>
+ <comment xml:lang="sv">AMR-ljud</comment>
+ <comment xml:lang="uk">звук AMR</comment>
+ <comment xml:lang="vi">Âm thanh AMR</comment>
+ <comment xml:lang="zh_CN">AMR 音频</comment>
+ <comment xml:lang="zh_TW">AMR 音訊</comment>
+ <acronym>AMR</acronym>
+ <expanded-acronym>Adaptive Multi-Rate</expanded-acronym>
+ <magic priority="50">
+ <match value="#!AMR\n" type="string" offset="0"/>
+ <match value="#!AMR_MC1.0\n" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.amr"/>
+ </mime-type>
+ <mime-type type="audio/AMR-WB">
+ <comment>AMR-WB audio</comment>
+ <comment xml:lang="ar">AMR-WB سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AMR-WB</comment>
+ <comment xml:lang="bg">Аудио — AMR-WB</comment>
+ <comment xml:lang="ca">àudio AMR-WB</comment>
+ <comment xml:lang="cs">Zvuk AMR-WB</comment>
+ <comment xml:lang="da">AMR-WB-lyd</comment>
+ <comment xml:lang="de">AMR-WB-Audio</comment>
+ <comment xml:lang="eo">AMR-WB-sondosiero</comment>
+ <comment xml:lang="es">sonido AMR-WB</comment>
+ <comment xml:lang="eu">AMR-WB audioa</comment>
+ <comment xml:lang="fi">AMR-WB-ääni</comment>
+ <comment xml:lang="fo">AMR-WB ljóður</comment>
+ <comment xml:lang="fr">audio AMR-WB</comment>
+ <comment xml:lang="ga">fuaim AMR-WB</comment>
+ <comment xml:lang="gl">son AMR-WB</comment>
+ <comment xml:lang="he">שמע AMR-WN</comment>
+ <comment xml:lang="hu">AMR-WB hang</comment>
+ <comment xml:lang="id">Audio AMR-WB</comment>
+ <comment xml:lang="it">Audio AMR-WB</comment>
+ <comment xml:lang="ja">AMR-WB オーディオ</comment>
+ <comment xml:lang="kk">AMR-WB аудиосы</comment>
+ <comment xml:lang="ko">AMR-WB 오디오</comment>
+ <comment xml:lang="lt">AMR-WB garso įrašas</comment>
+ <comment xml:lang="lv">AMR-WB audio</comment>
+ <comment xml:lang="nb">AMR-WB-lyd</comment>
+ <comment xml:lang="nl">AMR-WB-audio</comment>
+ <comment xml:lang="nn">AMR-WB-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AMR-WB</comment>
+ <comment xml:lang="pt_BR">Áudio AMR-WB</comment>
+ <comment xml:lang="ro">Audio AMR-WB</comment>
+ <comment xml:lang="ru">аудио AMR-WB</comment>
+ <comment xml:lang="sk">Zvuk AMR-WB</comment>
+ <comment xml:lang="sl">Zvočna datoteka AMR-WB</comment>
+ <comment xml:lang="sq">Audio AMR-WB</comment>
+ <comment xml:lang="sv">AMR-WB-ljud</comment>
+ <comment xml:lang="uk">звук AMR-WB</comment>
+ <comment xml:lang="vi">Âm thanh AMR-WB</comment>
+ <comment xml:lang="zh_CN">AMR-WB 音频</comment>
+ <comment xml:lang="zh_TW">AMR-WB 音訊</comment>
+ <acronym>AMR-WB</acronym>
+ <expanded-acronym>Adaptive Multi-Rate Wideband</expanded-acronym>
+ <magic priority="50">
+ <match value="#!AMR-WB\n" type="string" offset="0"/>
+ <match value="#!AMR-WB_MC1.0\n" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.awb"/>
+ </mime-type>
+ <mime-type type="audio/basic">
+ <comment>ULAW (Sun) audio</comment>
+ <comment xml:lang="ar">ULAW (صن) سمعي</comment>
+ <comment xml:lang="az">ULAW (Sun) audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo ULAW (Sun)</comment>
+ <comment xml:lang="bg">Аудио — ULAW, Sun</comment>
+ <comment xml:lang="ca">àudio ULAW (Sun)</comment>
+ <comment xml:lang="cs">Zvuk ULAW (Sun)</comment>
+ <comment xml:lang="cy">Sain ULAW (Sun)</comment>
+ <comment xml:lang="da">ULAW-lyd (Sun)</comment>
+ <comment xml:lang="de">ULAW-Audio (Sun)</comment>
+ <comment xml:lang="el">ήχος ULAW (Sun)</comment>
+ <comment xml:lang="en_GB">ULAW (Sun) audio</comment>
+ <comment xml:lang="eo">ULAW-sondosiero (Sun)</comment>
+ <comment xml:lang="es">sonido ULAW (Sun)</comment>
+ <comment xml:lang="eu">ULAW (sun) audioa</comment>
+ <comment xml:lang="fi">ULAW (Sun) -ääni</comment>
+ <comment xml:lang="fo">ULAW (Sun) ljóður</comment>
+ <comment xml:lang="fr">audio ULAW (Sun)</comment>
+ <comment xml:lang="ga">fuaim ULAW (Sun)</comment>
+ <comment xml:lang="gl">son ULAW (Sun)</comment>
+ <comment xml:lang="he">שמע ULAW (של Sun)</comment>
+ <comment xml:lang="hu">ULAW (Sun) hang</comment>
+ <comment xml:lang="id">Audio ULAW (Sun)</comment>
+ <comment xml:lang="it">Audio ULAW (Sun)</comment>
+ <comment xml:lang="ja">ULAW (Sun) オーディオ</comment>
+ <comment xml:lang="kk">ULAW (Sun) аудиосы</comment>
+ <comment xml:lang="ko">ULAW (Sun) 오디오</comment>
+ <comment xml:lang="lt">ULAW (Sun) garso įrašas</comment>
+ <comment xml:lang="lv">ULAW (Sun) audio</comment>
+ <comment xml:lang="ms">Audio ULAW (Sun)</comment>
+ <comment xml:lang="nb">ULAW-lyd (Sun)</comment>
+ <comment xml:lang="nl">(Sun) ULAW-audio</comment>
+ <comment xml:lang="nn">ULAW (Sun)-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy ULAW (Sun)</comment>
+ <comment xml:lang="pt">áudio ULAW (Sun)</comment>
+ <comment xml:lang="pt_BR">Áudio ULAW (Sun)</comment>
+ <comment xml:lang="ro">Fișier audio ULAW (Sun)</comment>
+ <comment xml:lang="ru">аудио ULAW (Sun)</comment>
+ <comment xml:lang="sk">Zvuk ULAW (Sun)</comment>
+ <comment xml:lang="sl">Zvočna datoteka ULAW (Sun)</comment>
+ <comment xml:lang="sq">Audio ULAW (Sun)</comment>
+ <comment xml:lang="sr">ULAW (Sun) звучни запис</comment>
+ <comment xml:lang="sv">ULAW-ljud (Sun)</comment>
+ <comment xml:lang="uk">звук ULAW (Sun)</comment>
+ <comment xml:lang="vi">Âm thanh ULAW (Sun)</comment>
+ <comment xml:lang="zh_CN">ULAW (Sun) 音频</comment>
+ <comment xml:lang="zh_TW">ULAW (Sun) 音訊</comment>
+ <magic priority="40">
+ <match value=".snd" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.au"/>
+ <glob pattern="*.snd"/>
+ </mime-type>
+ <mime-type type="audio/prs.sid">
+ <comment>Commodore 64 audio</comment>
+ <comment xml:lang="ar">Commodore 64 سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Commodore 64</comment>
+ <comment xml:lang="bg">Аудио — Commodore 64</comment>
+ <comment xml:lang="ca">àudio Commodore 64</comment>
+ <comment xml:lang="cs">Zvuk Commodore 64</comment>
+ <comment xml:lang="da">Commodore 64-lyd</comment>
+ <comment xml:lang="de">Commodore-64-Audio</comment>
+ <comment xml:lang="el">ήχος Commodore 64</comment>
+ <comment xml:lang="en_GB">Commodore 64 audio</comment>
+ <comment xml:lang="eo">Sondosiero de Commodore 64</comment>
+ <comment xml:lang="es">sonido de Commodore 64</comment>
+ <comment xml:lang="eu">Commodore 64 Audioa</comment>
+ <comment xml:lang="fi">Commodore 64 -ääni</comment>
+ <comment xml:lang="fo">Commodore 64 ljóð</comment>
+ <comment xml:lang="fr">audio Commodore 64</comment>
+ <comment xml:lang="ga">fuaim Commodore 64</comment>
+ <comment xml:lang="gl">son de Commodore 64</comment>
+ <comment xml:lang="he">שמע של Commodore 64</comment>
+ <comment xml:lang="hu">Commodore 64 hang</comment>
+ <comment xml:lang="id">Audio Commodore 64</comment>
+ <comment xml:lang="it">Audio Commodore 64</comment>
+ <comment xml:lang="ja">Commodore 64 オーディオ</comment>
+ <comment xml:lang="kk">Commodore 64 аудиосы</comment>
+ <comment xml:lang="ko">Commodore 64 오디오</comment>
+ <comment xml:lang="lt">Commodore 64 garso įrašas</comment>
+ <comment xml:lang="lv">Commodore 64 audio</comment>
+ <comment xml:lang="ms">Audio Commodore 64</comment>
+ <comment xml:lang="nb">Commodore 64-lyd</comment>
+ <comment xml:lang="nl">Commodore 64-audio</comment>
+ <comment xml:lang="nn">Commodore 64-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Commodore 64</comment>
+ <comment xml:lang="pt">áudio Commodore 64</comment>
+ <comment xml:lang="pt_BR">Áudio Commodore 64</comment>
+ <comment xml:lang="ro">Audio Commodore 64</comment>
+ <comment xml:lang="ru">аудио Commodore 64</comment>
+ <comment xml:lang="sk">Zvuk Commodore 64</comment>
+ <comment xml:lang="sl">Zvočna datoteka Commodore 64</comment>
+ <comment xml:lang="sq">Audio Commodore 64</comment>
+ <comment xml:lang="sr">Комодор 64 звучни запис</comment>
+ <comment xml:lang="sv">Commodore 64-ljud</comment>
+ <comment xml:lang="uk">звук Commodore 64</comment>
+ <comment xml:lang="vi">Âm thanh Commodore 64</comment>
+ <comment xml:lang="zh_CN">Commodore 64 音频</comment>
+ <comment xml:lang="zh_TW">Commodore 64 音訊</comment>
+ <magic priority="50">
+ <match value="PSID" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.sid"/>
+ <glob pattern="*.psid"/>
+ </mime-type>
+ <mime-type type="audio/x-adpcm">
+ <comment>PCM audio</comment>
+ <comment xml:lang="ar">سمعي PCM</comment>
+ <comment xml:lang="az">PCM audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo PCM</comment>
+ <comment xml:lang="bg">Аудио — PCM</comment>
+ <comment xml:lang="ca">àudio PCM</comment>
+ <comment xml:lang="cs">Zvuk PCM</comment>
+ <comment xml:lang="cy">Sain PCM</comment>
+ <comment xml:lang="da">PCM-lyd</comment>
+ <comment xml:lang="de">PCM-Audio</comment>
+ <comment xml:lang="el">ήχος PCM</comment>
+ <comment xml:lang="en_GB">PCM audio</comment>
+ <comment xml:lang="eo">PCM-sondosiero</comment>
+ <comment xml:lang="es">sonido PCM</comment>
+ <comment xml:lang="eu">PCM audioa</comment>
+ <comment xml:lang="fi">PCM-ääni</comment>
+ <comment xml:lang="fo">PCM ljóður</comment>
+ <comment xml:lang="fr">audio PCM</comment>
+ <comment xml:lang="ga">fuaim PCM</comment>
+ <comment xml:lang="gl">son PCM</comment>
+ <comment xml:lang="he">שמע PCM</comment>
+ <comment xml:lang="hu">PCM hang</comment>
+ <comment xml:lang="id">Audio PCM</comment>
+ <comment xml:lang="it">Audio PCM</comment>
+ <comment xml:lang="ja">PCM オーディオ</comment>
+ <comment xml:lang="kk">PCM аудиосы</comment>
+ <comment xml:lang="ko">PCM 오디오</comment>
+ <comment xml:lang="lt">PCM garso įrašas</comment>
+ <comment xml:lang="lv">PCM audio</comment>
+ <comment xml:lang="ms">Audio PCM</comment>
+ <comment xml:lang="nb">PCM-lyd</comment>
+ <comment xml:lang="nl">PCM-audio</comment>
+ <comment xml:lang="nn">PCM-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy PCM</comment>
+ <comment xml:lang="pt">áudio PCM</comment>
+ <comment xml:lang="pt_BR">Áudio PCM</comment>
+ <comment xml:lang="ro">Audio PCM</comment>
+ <comment xml:lang="ru">аудио PCM</comment>
+ <comment xml:lang="sk">Zvuk PCM</comment>
+ <comment xml:lang="sl">Zvočna datoteka PCM</comment>
+ <comment xml:lang="sq">Audio PCM</comment>
+ <comment xml:lang="sr">PCM звучни запис</comment>
+ <comment xml:lang="sv">PCM-ljud</comment>
+ <comment xml:lang="uk">звук PCM</comment>
+ <comment xml:lang="vi">Âm thanh PCM</comment>
+ <comment xml:lang="zh_CN">PCM 音频</comment>
+ <comment xml:lang="zh_TW">PCM 音訊</comment>
+ <magic priority="50">
+ <match value=".snd" type="string" offset="0">
+ <match value="23" type="big32" offset="12"/>
+ </match>
+ <match value="0x0064732E" type="little32" offset="0">
+ <match value="1" type="little32" offset="12"/>
+ <match value="2" type="little32" offset="12"/>
+ <match value="3" type="little32" offset="12"/>
+ <match value="4" type="little32" offset="12"/>
+ <match value="5" type="little32" offset="12"/>
+ <match value="6" type="little32" offset="12"/>
+ <match value="7" type="little32" offset="12"/>
+ <match value="23" type="little32" offset="12"/>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="audio/x-aifc">
+ <comment>AIFC audio</comment>
+ <comment xml:lang="ar">AIFC سمعي</comment>
+ <comment xml:lang="az">AIFC audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AIFC</comment>
+ <comment xml:lang="bg">Аудио — AIFC</comment>
+ <comment xml:lang="ca">àudio AIFC</comment>
+ <comment xml:lang="cs">Zvuk AIFC</comment>
+ <comment xml:lang="cy">Sain AIFC</comment>
+ <comment xml:lang="da">AIFC-lyd</comment>
+ <comment xml:lang="de">AIFC-Audio</comment>
+ <comment xml:lang="el">ήχος AIFC</comment>
+ <comment xml:lang="en_GB">AIFC audio</comment>
+ <comment xml:lang="eo">AIFC-sondosiero</comment>
+ <comment xml:lang="es">sonido AIFC</comment>
+ <comment xml:lang="eu">AIFC audioa</comment>
+ <comment xml:lang="fi">AIFC-ääni</comment>
+ <comment xml:lang="fo">AIFC ljóður</comment>
+ <comment xml:lang="fr">audio AIFC</comment>
+ <comment xml:lang="ga">fuaim AIFC</comment>
+ <comment xml:lang="gl">son AIFC</comment>
+ <comment xml:lang="he">שמע AIFC</comment>
+ <comment xml:lang="hu">AIFC hang</comment>
+ <comment xml:lang="id">Audio AIFC</comment>
+ <comment xml:lang="it">Audio AIFC</comment>
+ <comment xml:lang="ja">AIFC オーディオ</comment>
+ <comment xml:lang="kk">AIFC аудиосы</comment>
+ <comment xml:lang="ko">AIFC 오디오</comment>
+ <comment xml:lang="lt">AIFC garso įrašas</comment>
+ <comment xml:lang="lv">AIFC audio</comment>
+ <comment xml:lang="ms">Audio AIFC</comment>
+ <comment xml:lang="nb">AIFC-lyd</comment>
+ <comment xml:lang="nl">AIFC-audio</comment>
+ <comment xml:lang="nn">AIFC-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AIFC</comment>
+ <comment xml:lang="pt">áudio AIFC</comment>
+ <comment xml:lang="pt_BR">Áudio AIFC</comment>
+ <comment xml:lang="ro">Fișier audio AIFC</comment>
+ <comment xml:lang="ru">аудио AIFC</comment>
+ <comment xml:lang="sk">Zvuk AIFC</comment>
+ <comment xml:lang="sl">Zvočna datoteka AIFC</comment>
+ <comment xml:lang="sq">Audio AIFC</comment>
+ <comment xml:lang="sr">AIFC звучни запис</comment>
+ <comment xml:lang="sv">AIFC-ljud</comment>
+ <comment xml:lang="uk">звук AIFC</comment>
+ <comment xml:lang="vi">Âm thanh AIFC</comment>
+ <comment xml:lang="zh_CN">AIFC 音频</comment>
+ <comment xml:lang="zh_TW">AIFC 音訊</comment>
+ <magic priority="50">
+ <match value="AIFC" type="string" offset="8"/>
+ </magic>
+ </mime-type>
+ <mime-type type="audio/x-aiff">
+ <comment>AIFF/Amiga/Mac audio</comment>
+ <comment xml:lang="ar">AIFF/Amiga/Mac سمعي</comment>
+ <comment xml:lang="az">AIFF/Amiga/Mac audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AIFF/Amiga/Mac</comment>
+ <comment xml:lang="bg">Аудио — AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ca">àudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="cs">Zvuk AIFF/Amiga/Mac</comment>
+ <comment xml:lang="cy">Sain AIFF/Amiga/Mac</comment>
+ <comment xml:lang="da">AIFF-/Amiga-/Maclyd</comment>
+ <comment xml:lang="de">AIFF/Amiga/Mac-Audio</comment>
+ <comment xml:lang="el">ήχος AIFF/Amiga/Mac</comment>
+ <comment xml:lang="en_GB">AIFF/Amiga/Mac audio</comment>
+ <comment xml:lang="eo">AIFF/Amiga/Mac-sondosiero</comment>
+ <comment xml:lang="es">sonido AIFF/Amiga/Mac</comment>
+ <comment xml:lang="eu">AIFF/Amiga/Mac audioa</comment>
+ <comment xml:lang="fi">AIFF/Amiga/Mac-ääni</comment>
+ <comment xml:lang="fo">AIFF/Amiga/Mac ljóður</comment>
+ <comment xml:lang="fr">audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ga">fuaim AIFF/Amiga/Mac</comment>
+ <comment xml:lang="gl">son AIFF/Amiga/Mac</comment>
+ <comment xml:lang="he">שמע AIFF/Amiga/Mac</comment>
+ <comment xml:lang="hu">AIFF/Amiga/Mac hang</comment>
+ <comment xml:lang="id">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="it">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ja">AIFF/Amiga/Mac オーディオ</comment>
+ <comment xml:lang="kk">AIFF/Amiga/Mac аудиосы</comment>
+ <comment xml:lang="ko">AIFF/Amiga/Mac 오디오</comment>
+ <comment xml:lang="lt">AIFF/Amiga/Mac garso įrašas</comment>
+ <comment xml:lang="lv">AIFF/Amiga/Mac audio</comment>
+ <comment xml:lang="ms">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="nb">AIFF/Amiga/Mac-lyd</comment>
+ <comment xml:lang="nl">AIFF/Amiga/Mac-audio</comment>
+ <comment xml:lang="nn">AIFF/Amiga/Mac-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AIFF/Amiga/Mac</comment>
+ <comment xml:lang="pt">áudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="pt_BR">Áudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ro">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ru">аудио AIFF/Amiga/Mac</comment>
+ <comment xml:lang="sk">Zvuk AIFF/Amiga/Mac</comment>
+ <comment xml:lang="sl">Zvočna datoteka AIFF/Amiga/Mac</comment>
+ <comment xml:lang="sq">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="sr">AIFF/Амига/Мекинтош звучни запис</comment>
+ <comment xml:lang="sv">AIFF/Amiga/Mac-ljud</comment>
+ <comment xml:lang="uk">звук AIFF/Amiga/Mac</comment>
+ <comment xml:lang="vi">Âm thanh AIFF/Amiga/Mac</comment>
+ <comment xml:lang="zh_CN">AIFF/Amiga/Mac 音频</comment>
+ <comment xml:lang="zh_TW">AIFF/Amiga/Mac 音訊</comment>
+ <magic priority="50">
+ <match value="AIFF" type="string" offset="8"/>
+ <match value="AIFC" type="string" offset="8"/>
+ <match value="8SVX" type="string" offset="8"/>
+ </magic>
+ <glob pattern="*.aiff"/>
+ <glob pattern="*.aif"/>
+ <glob pattern="*.aifc"/>
+ </mime-type>
+ <mime-type type="audio/x-aiffc">
+ <comment>AIFF audio</comment>
+ <comment xml:lang="ar">AIFF سمعي</comment>
+ <comment xml:lang="az">AIFF audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AIFF</comment>
+ <comment xml:lang="bg">Аудио — AIFF</comment>
+ <comment xml:lang="ca">àudio AIFF</comment>
+ <comment xml:lang="cs">Zvuk AIFF</comment>
+ <comment xml:lang="cy">Sain AIFF</comment>
+ <comment xml:lang="da">AIFF-lyd</comment>
+ <comment xml:lang="de">AIFF-Audio</comment>
+ <comment xml:lang="el">Ήχος AIFF</comment>
+ <comment xml:lang="en_GB">AIFF audio</comment>
+ <comment xml:lang="eo">AIFF-sondosiero</comment>
+ <comment xml:lang="es">sonido AIFF</comment>
+ <comment xml:lang="eu">AIFF audioa</comment>
+ <comment xml:lang="fi">AIFF-ääni</comment>
+ <comment xml:lang="fo">AIFF ljóður</comment>
+ <comment xml:lang="fr">audio AIFF</comment>
+ <comment xml:lang="ga">fuaim AIFF</comment>
+ <comment xml:lang="gl">son AIFF</comment>
+ <comment xml:lang="he">שמע AIFF</comment>
+ <comment xml:lang="hu">AIFF hang</comment>
+ <comment xml:lang="id">Audio AIFF</comment>
+ <comment xml:lang="it">Audio AIFF</comment>
+ <comment xml:lang="ja">AIFF オーディオ</comment>
+ <comment xml:lang="kk">AIFF аудиосы</comment>
+ <comment xml:lang="ko">AIFF 오디오</comment>
+ <comment xml:lang="lt">AIFF garso įrašas</comment>
+ <comment xml:lang="lv">AIFF audio</comment>
+ <comment xml:lang="ms">Audio AIFF</comment>
+ <comment xml:lang="nb">AIFF-lyd</comment>
+ <comment xml:lang="nl">AIFF-audio</comment>
+ <comment xml:lang="nn">AIFF-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AIFF</comment>
+ <comment xml:lang="pt">áudio AIFF</comment>
+ <comment xml:lang="pt_BR">Áudio AIFF</comment>
+ <comment xml:lang="ro">Audio AIFF</comment>
+ <comment xml:lang="ru">аудио AIFF</comment>
+ <comment xml:lang="sk">Zvuk AIFF</comment>
+ <comment xml:lang="sl">Zvočna datoteka AIFF</comment>
+ <comment xml:lang="sq">Audio AIFF</comment>
+ <comment xml:lang="sr">AIFF звучни запис</comment>
+ <comment xml:lang="sv">AIFF-ljud</comment>
+ <comment xml:lang="uk">звук AIFF</comment>
+ <comment xml:lang="vi">Âm thanh AIFF</comment>
+ <comment xml:lang="zh_CN">AIFF 音频</comment>
+ <comment xml:lang="zh_TW">AIFF 音訊</comment>
+ </mime-type>
+ <mime-type type="audio/x-ape">
+ <comment>Monkey's audio</comment>
+ <comment xml:lang="ar">Monkey سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Monkey's</comment>
+ <comment xml:lang="bg">Аудио — Monkey</comment>
+ <comment xml:lang="ca">àudio Monkey</comment>
+ <comment xml:lang="cs">Zvuk Monkey's</comment>
+ <comment xml:lang="da">Monkeys lyd</comment>
+ <comment xml:lang="de">Monkey's-Audio</comment>
+ <comment xml:lang="es">sonido Monkey</comment>
+ <comment xml:lang="eu">Monkey audioa</comment>
+ <comment xml:lang="fi">Monkey's Audio -ääni</comment>
+ <comment xml:lang="fo">Monkey's ljóður</comment>
+ <comment xml:lang="fr">audio Monkey</comment>
+ <comment xml:lang="ga">fuaim Monkey's</comment>
+ <comment xml:lang="gl">son de Monkey</comment>
+ <comment xml:lang="he">שמע של Monkey's</comment>
+ <comment xml:lang="hu">Monkey hang</comment>
+ <comment xml:lang="id">Audio Monkey</comment>
+ <comment xml:lang="it">Audio Monkey's</comment>
+ <comment xml:lang="ja">Monkey's オーディオ</comment>
+ <comment xml:lang="kk">Monkey аудиосы</comment>
+ <comment xml:lang="ko">Monkey's 오디오</comment>
+ <comment xml:lang="lt">Monkey garso įrašas</comment>
+ <comment xml:lang="lv">Monkey's audio</comment>
+ <comment xml:lang="nb">Monkey's-lyd</comment>
+ <comment xml:lang="nl">Monkey's-audio</comment>
+ <comment xml:lang="nn">Monkey's Audio-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Monkey's Audio</comment>
+ <comment xml:lang="pt_BR">Áudio Monkey's</comment>
+ <comment xml:lang="ro">Audio Monkey's</comment>
+ <comment xml:lang="ru">аудио Monkey's</comment>
+ <comment xml:lang="sk">Zvuk Monkey's</comment>
+ <comment xml:lang="sl">Zvočna datoteka Monkey</comment>
+ <comment xml:lang="sq">Audio Monkey's</comment>
+ <comment xml:lang="sv">Monkey's audio</comment>
+ <comment xml:lang="uk">звук Monkey's</comment>
+ <comment xml:lang="vi">Âm thanh cua Monkey</comment>
+ <comment xml:lang="zh_CN">Monkey's audio 音频</comment>
+ <comment xml:lang="zh_TW">Monkey's 音訊</comment>
+ <magic priority="50">
+ <match value="MAC " type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ape"/>
+ </mime-type>
+ <mime-type type="audio/x-it">
+ <comment>Impulse Tracker audio</comment>
+ <comment xml:lang="ar">Impulse Tracker سمعي</comment>
+ <comment xml:lang="az">Impulse Tracker audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Impulse Tracker</comment>
+ <comment xml:lang="bg">Аудио — Impulse Tracker</comment>
+ <comment xml:lang="ca">àudio d'Impulse Tracker</comment>
+ <comment xml:lang="cs">Zvuk Impulse Tracker</comment>
+ <comment xml:lang="cy">Sain Impulse Tracker</comment>
+ <comment xml:lang="da">Impulse Tracker-lyd</comment>
+ <comment xml:lang="de">Impulse-Tracker-Audio</comment>
+ <comment xml:lang="el">ήχος Impulse Tracker</comment>
+ <comment xml:lang="en_GB">Impulse Tracker audio</comment>
+ <comment xml:lang="eo">Sondosiero de Impulse Tracker</comment>
+ <comment xml:lang="es">sonido Impulse Tracker</comment>
+ <comment xml:lang="eu">Impulse Tracker audioa</comment>
+ <comment xml:lang="fi">Impulse Tracker -ääni</comment>
+ <comment xml:lang="fo">Impulse Tracker ljóður</comment>
+ <comment xml:lang="fr">audio Impulse Tracker</comment>
+ <comment xml:lang="ga">fuaim Impulse Tracker</comment>
+ <comment xml:lang="gl">son de Impulse Tracker</comment>
+ <comment xml:lang="he">שמע של Impulse Tracker</comment>
+ <comment xml:lang="hu">Impulse Tracker hang</comment>
+ <comment xml:lang="id">Audio Impulse Tracker</comment>
+ <comment xml:lang="it">Audio Impulse Tracker</comment>
+ <comment xml:lang="ja">Impulse Tracker オーディオ</comment>
+ <comment xml:lang="kk">Impulse Tracker аудиосы</comment>
+ <comment xml:lang="ko">Impulse Tracker 오디오</comment>
+ <comment xml:lang="lt">Impulse Tracker garso įrašas</comment>
+ <comment xml:lang="lv">Impulse Tracker audio</comment>
+ <comment xml:lang="ms">Audio Impulse Tracker</comment>
+ <comment xml:lang="nb">Impulse Tracker-lyd</comment>
+ <comment xml:lang="nl">Impulse Tracker-audio</comment>
+ <comment xml:lang="nn">Impulse Tracker lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Impulse Tracker</comment>
+ <comment xml:lang="pt">áudio Impulse Tracker</comment>
+ <comment xml:lang="pt_BR">Áudio Impulse Tracker</comment>
+ <comment xml:lang="ro">Audio Impulse Tracker</comment>
+ <comment xml:lang="ru">аудио Impulse Tracker</comment>
+ <comment xml:lang="sk">Zvuk Impulse Tracker</comment>
+ <comment xml:lang="sl">Zvočna datoteka Impulse Tracker</comment>
+ <comment xml:lang="sq">Audio Impulse Tracker</comment>
+ <comment xml:lang="sr">Impulse Tracker звучни запис</comment>
+ <comment xml:lang="sv">Impulse Tracker-ljud</comment>
+ <comment xml:lang="uk">звук Impulse Tracker</comment>
+ <comment xml:lang="vi">Âm thanh Impulse Tracker</comment>
+ <comment xml:lang="zh_CN">Impulse Tracker 音频</comment>
+ <comment xml:lang="zh_TW">Impulse Tracker 音訊</comment>
+ <magic priority="50">
+ <match value="IMPM" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.it"/>
+ </mime-type>
+ <mime-type type="audio/flac">
+ <comment>FLAC audio</comment>
+ <comment xml:lang="ar">FLAC سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo FLAC</comment>
+ <comment xml:lang="bg">Аудио — FLAC</comment>
+ <comment xml:lang="ca">àudio FLAC</comment>
+ <comment xml:lang="cs">Zvuk FLAC</comment>
+ <comment xml:lang="da">FLAC-lyd</comment>
+ <comment xml:lang="de">FLAC-Audio</comment>
+ <comment xml:lang="el">Ήχος FLAC</comment>
+ <comment xml:lang="en_GB">FLAC audio</comment>
+ <comment xml:lang="eo">FLAC-sondosiero</comment>
+ <comment xml:lang="es">sonido FLAC</comment>
+ <comment xml:lang="eu">FLAC audioa</comment>
+ <comment xml:lang="fi">FLAC-ääni</comment>
+ <comment xml:lang="fo">FLAC ljóður</comment>
+ <comment xml:lang="fr">audio FLAC</comment>
+ <comment xml:lang="ga">fuaim FLAC</comment>
+ <comment xml:lang="gl">son FLAC</comment>
+ <comment xml:lang="he">קובץ שמע מסוג FLAC</comment>
+ <comment xml:lang="hu">FLAC hang</comment>
+ <comment xml:lang="id">Audio FLAC</comment>
+ <comment xml:lang="it">Audio FLAC</comment>
+ <comment xml:lang="ja">FLAC オーディオ</comment>
+ <comment xml:lang="kk">FLAC аудиосы</comment>
+ <comment xml:lang="ko">FLAC 오디오</comment>
+ <comment xml:lang="lt">FLAC garso įrašas</comment>
+ <comment xml:lang="lv">FLAC audio</comment>
+ <comment xml:lang="ms">Audio FLAC</comment>
+ <comment xml:lang="nb">FLAC-lyd</comment>
+ <comment xml:lang="nl">FLAC-audio</comment>
+ <comment xml:lang="nn">FLAC-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy FLAC</comment>
+ <comment xml:lang="pt">áudio FLAC</comment>
+ <comment xml:lang="pt_BR">Áudio FLAC</comment>
+ <comment xml:lang="ro">Audio FLAC</comment>
+ <comment xml:lang="ru">аудио FLAC</comment>
+ <comment xml:lang="sk">Zvuk FLAC</comment>
+ <comment xml:lang="sl">Zvočna datoteka Flac</comment>
+ <comment xml:lang="sq">Audio FLAC</comment>
+ <comment xml:lang="sr">FLAC звучни запис</comment>
+ <comment xml:lang="sv">FLAC-ljud</comment>
+ <comment xml:lang="uk">звук FLAC</comment>
+ <comment xml:lang="vi">Âm thanh FLAC</comment>
+ <comment xml:lang="zh_CN">FLAC 音频</comment>
+ <comment xml:lang="zh_TW">FLAC 音訊</comment>
+ <magic priority="50">
+ <match value="fLaC" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.flac"/>
+ <alias type="audio/x-flac"/>
+ </mime-type>
+ <mime-type type="audio/x-wavpack">
+ <comment>WavPack audio</comment>
+ <comment xml:lang="ar">WavPack سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo WavPack</comment>
+ <comment xml:lang="bg">Аудио — WavPack</comment>
+ <comment xml:lang="ca">àudio WavPack</comment>
+ <comment xml:lang="cs">Zvuk WavPack</comment>
+ <comment xml:lang="da">WavPack-lyd</comment>
+ <comment xml:lang="de">WavPack-Audio</comment>
+ <comment xml:lang="eo">WavPack-sondosiero</comment>
+ <comment xml:lang="es">sonido WavPack</comment>
+ <comment xml:lang="eu">WavPack audioa</comment>
+ <comment xml:lang="fi">WavPack-ääni</comment>
+ <comment xml:lang="fo">WavPack ljóður</comment>
+ <comment xml:lang="fr">audio WavPack</comment>
+ <comment xml:lang="ga">fuaim WavPack</comment>
+ <comment xml:lang="gl">son WavPack</comment>
+ <comment xml:lang="he">שמע WavPack</comment>
+ <comment xml:lang="hu">WavPack hang</comment>
+ <comment xml:lang="id">Audio WavPack</comment>
+ <comment xml:lang="it">Audio WavPack</comment>
+ <comment xml:lang="ja">WavPack オーディオ</comment>
+ <comment xml:lang="kk">WavPack аудиосы</comment>
+ <comment xml:lang="ko">WavPack 오디오</comment>
+ <comment xml:lang="lt">WavPack garso įrašas</comment>
+ <comment xml:lang="lv">WavPack audio</comment>
+ <comment xml:lang="nb">WavPack-lyd</comment>
+ <comment xml:lang="nl">WavPack-audio</comment>
+ <comment xml:lang="nn">WavPack-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy WavPack</comment>
+ <comment xml:lang="pt_BR">Áudio WavPack</comment>
+ <comment xml:lang="ro">Audio WavPack</comment>
+ <comment xml:lang="ru">аудио WavPack</comment>
+ <comment xml:lang="sk">Zvuk WavPack</comment>
+ <comment xml:lang="sl">Zvočna datoteka WavPack</comment>
+ <comment xml:lang="sq">Audio WavPack</comment>
+ <comment xml:lang="sv">WavPack-ljud</comment>
+ <comment xml:lang="uk">звук WavPack</comment>
+ <comment xml:lang="vi">Âm thanh WavPack</comment>
+ <comment xml:lang="zh_CN">WavPack 音频</comment>
+ <comment xml:lang="zh_TW">WavPack 音訊</comment>
+ <magic priority="50">
+ <match value="wvpk" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.wv"/>
+ <glob pattern="*.wvp"/>
+ </mime-type>
+ <mime-type type="audio/x-wavpack-correction">
+ <comment>WavPack audio correction file</comment>
+ <comment xml:lang="ar">ملف تصحيح WavPack السمعي</comment>
+ <comment xml:lang="be@latin">Fajł aŭdyjokarekcyi WavPack</comment>
+ <comment xml:lang="bg">Файл за корекции на аудио — WavPack</comment>
+ <comment xml:lang="ca">fitxer de correcció d'àudio WavPack</comment>
+ <comment xml:lang="cs">Opravný zvukový soubor WavPack</comment>
+ <comment xml:lang="da">WavPack-lydkorrektionsfil</comment>
+ <comment xml:lang="de">WavPack-Audiokorrekturdatei</comment>
+ <comment xml:lang="es">archivo de corrección de sonido WavPack</comment>
+ <comment xml:lang="eu">WavPack audio-zuzenketaren fitxategia</comment>
+ <comment xml:lang="fi">WavPack-äänikorjaustiedosto</comment>
+ <comment xml:lang="fo">WavPack ljóðrættingarfíla</comment>
+ <comment xml:lang="fr">fichier de correction audio WavPack</comment>
+ <comment xml:lang="ga">comhad cheartú fhuaim WavPack</comment>
+ <comment xml:lang="gl">ficheiro de corrección de son WavPack</comment>
+ <comment xml:lang="he">קובץ תיקון שמע של WavPack</comment>
+ <comment xml:lang="hu">WavPack hangjavítási fájl</comment>
+ <comment xml:lang="id">Berkas koreksi audio WavPack</comment>
+ <comment xml:lang="it">File correzione audio WavPack</comment>
+ <comment xml:lang="ja">WavPack オーディオコレクションファイル</comment>
+ <comment xml:lang="kk">WavPack аудио түзету файлы</comment>
+ <comment xml:lang="ko">WavPack 오디오 교정 파일</comment>
+ <comment xml:lang="lt">WavPack garso korekcijos failas</comment>
+ <comment xml:lang="lv">WavPack audio korekciju fails</comment>
+ <comment xml:lang="nb">WavPack lydkorrigeringsfil</comment>
+ <comment xml:lang="nl">WavPack-audio-correctiebestand</comment>
+ <comment xml:lang="nn">WawPack lydopprettingsfil</comment>
+ <comment xml:lang="pl">Plik korekcji dźwięku WavPack</comment>
+ <comment xml:lang="pt_BR">Arquivo de correção de áudio WavPack</comment>
+ <comment xml:lang="ro">Fișier audio de corecție WavPack</comment>
+ <comment xml:lang="ru">файл коррекции аудио WavPack</comment>
+ <comment xml:lang="sk">Opravný zvukový súbor WavPack</comment>
+ <comment xml:lang="sl">popravljalna zvočna datoteka WavPack</comment>
+ <comment xml:lang="sq">File korrigjgimi audio WavPack</comment>
+ <comment xml:lang="sv">WavPack-ljudkorrigeringsfil</comment>
+ <comment xml:lang="uk">файл корекції звуку WavPack</comment>
+ <comment xml:lang="vi">Tập tin sửa chữa âm thanh WavPack</comment>
+ <comment xml:lang="zh_CN">WavPack 音频校正文档</comment>
+ <comment xml:lang="zh_TW">WavPack 音訊校正檔</comment>
+ <magic priority="50">
+ <match value="wvpk" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.wvc"/>
+ </mime-type>
+ <mime-type type="audio/midi">
+ <comment>MIDI audio</comment>
+ <comment xml:lang="ar">MIDI سمعي</comment>
+ <comment xml:lang="az">MIDI audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MIDI</comment>
+ <comment xml:lang="bg">Аудио — MIDI</comment>
+ <comment xml:lang="ca">àudio MIDI</comment>
+ <comment xml:lang="cs">Zvuk MIDI</comment>
+ <comment xml:lang="cy">Sain MIDI</comment>
+ <comment xml:lang="da">MIDI-lyd</comment>
+ <comment xml:lang="de">MIDI-Audio</comment>
+ <comment xml:lang="el">ήχος MIDI</comment>
+ <comment xml:lang="en_GB">MIDI audio</comment>
+ <comment xml:lang="eo">MIDI-sondosiero</comment>
+ <comment xml:lang="es">sonido MIDI</comment>
+ <comment xml:lang="eu">MIDI audioa</comment>
+ <comment xml:lang="fi">MIDI-ääni</comment>
+ <comment xml:lang="fo">MIDI ljóður</comment>
+ <comment xml:lang="fr">audio MIDI</comment>
+ <comment xml:lang="ga">fuaim MIDI</comment>
+ <comment xml:lang="gl">son MIDI</comment>
+ <comment xml:lang="he">שמע MIDI</comment>
+ <comment xml:lang="hu">MIDI hang</comment>
+ <comment xml:lang="id">Audio MIDI</comment>
+ <comment xml:lang="it">Audio MIDI</comment>
+ <comment xml:lang="ja">MIDI オーディオ</comment>
+ <comment xml:lang="kk">MIDI аудиосы</comment>
+ <comment xml:lang="ko">미디 오디오</comment>
+ <comment xml:lang="lt">MIDI garso įrašas</comment>
+ <comment xml:lang="lv">MIDI audio</comment>
+ <comment xml:lang="ms">Audio MIDI</comment>
+ <comment xml:lang="nb">MIDI-lyd</comment>
+ <comment xml:lang="nl">MIDI-audio</comment>
+ <comment xml:lang="nn">MIDI-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MIDI</comment>
+ <comment xml:lang="pt">áudio MIDI</comment>
+ <comment xml:lang="pt_BR">Áudio MIDI</comment>
+ <comment xml:lang="ro">Audio MIDI</comment>
+ <comment xml:lang="ru">аудио MIDI</comment>
+ <comment xml:lang="sk">Zvuk MIDI</comment>
+ <comment xml:lang="sl">Zvočna datoteka MIDI</comment>
+ <comment xml:lang="sq">Audio MIDI</comment>
+ <comment xml:lang="sr">MIDI звучни запис</comment>
+ <comment xml:lang="sv">MIDI-ljud</comment>
+ <comment xml:lang="uk">звук MIDI</comment>
+ <comment xml:lang="vi">Âm thanh MIDI</comment>
+ <comment xml:lang="zh_CN">MIDI 音频</comment>
+ <comment xml:lang="zh_TW">MIDI 音訊</comment>
+ <alias type="audio/x-midi"/>
+ <magic priority="50">
+ <match value="MThd" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mid"/>
+ <glob pattern="*.midi"/>
+ <glob pattern="*.kar"/>
+ </mime-type>
+ <mime-type type="audio/x-mo3">
+ <comment>compressed Tracker audio</comment>
+ <comment xml:lang="ar">Tracker سمعي مضغوط</comment>
+ <comment xml:lang="be@latin">aŭdyjo skampresavanaha Trackera</comment>
+ <comment xml:lang="bg">Аудио — Tracker, компресирано</comment>
+ <comment xml:lang="ca">àudio Tracker comprimit</comment>
+ <comment xml:lang="cs">Komprimovaný zvuk Tracker</comment>
+ <comment xml:lang="da">Trackerkomprimeret lyd</comment>
+ <comment xml:lang="de">Komprimiertes Tracker-Audio</comment>
+ <comment xml:lang="es">tracker de sonido comprimido</comment>
+ <comment xml:lang="eu">konprimitutako Tracker audioa</comment>
+ <comment xml:lang="fi">pakattu Tracker-ääni</comment>
+ <comment xml:lang="fo">stappað Tracker ljóður</comment>
+ <comment xml:lang="fr">audio Tracker compressé</comment>
+ <comment xml:lang="ga">fuaim chomhbhrúite Tracker</comment>
+ <comment xml:lang="gl">son comprimido de Tracker</comment>
+ <comment xml:lang="he">שמע גשש מכווץ</comment>
+ <comment xml:lang="hu">tömörített Tracker hang</comment>
+ <comment xml:lang="id">audio Tracker terkompresi</comment>
+ <comment xml:lang="it">Audio compresso Tracker</comment>
+ <comment xml:lang="ja">圧縮 Tracker オーディオ</comment>
+ <comment xml:lang="kk">сығылған Tracker аудиосы</comment>
+ <comment xml:lang="ko">압축한 Tracker 오디오</comment>
+ <comment xml:lang="lt">suglaudintas Tracker garso įrašas</comment>
+ <comment xml:lang="lv">saspiests Tracker audio</comment>
+ <comment xml:lang="nl">ingepakte Tracker-audio</comment>
+ <comment xml:lang="nn">komprimert Tracker-lyd</comment>
+ <comment xml:lang="pl">Skompresowany plik dźwiękowy Tracker</comment>
+ <comment xml:lang="pt_BR">áudio Tracker compactado</comment>
+ <comment xml:lang="ro">Tracker audio comprimat</comment>
+ <comment xml:lang="ru">аудио Tracker (сжатое)</comment>
+ <comment xml:lang="sk">Komprimovaný zvuk Tracker</comment>
+ <comment xml:lang="sl">Skrčena zvočna datoteka Tracker</comment>
+ <comment xml:lang="sq">Audio Tracker e kompresuar</comment>
+ <comment xml:lang="sv">komprimerat Tracker-ljud</comment>
+ <comment xml:lang="uk">стиснутий звук Tracker</comment>
+ <comment xml:lang="vi">âm thanh Tracker đã nén</comment>
+ <comment xml:lang="zh_CN">压缩的 Tracker 音频</comment>
+ <comment xml:lang="zh_TW">壓縮版 Tracker 音訊</comment>
+ <magic priority="50">
+ <match value="MO3" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mo3"/>
+ </mime-type>
+ <mime-type type="audio/mp4">
+ <comment>MPEG-4 audio</comment>
+ <comment xml:lang="ar">MPEG-4 سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MPEG-4</comment>
+ <comment xml:lang="bg">Аудио — MPEG-4</comment>
+ <comment xml:lang="ca">àudio MPEG-4</comment>
+ <comment xml:lang="cs">Zvuk MPEG-4</comment>
+ <comment xml:lang="da">MPEG4-lyd</comment>
+ <comment xml:lang="de">MPEG-4-Audio</comment>
+ <comment xml:lang="en_GB">MPEG-4 audio</comment>
+ <comment xml:lang="eo">MPEG4-sondosiero</comment>
+ <comment xml:lang="es">sonido MPEG-4</comment>
+ <comment xml:lang="eu">MPEG-4 audioa</comment>
+ <comment xml:lang="fi">MPEG-4-ääni</comment>
+ <comment xml:lang="fo">MPEG-4 ljóður</comment>
+ <comment xml:lang="fr">audio MPEG-4</comment>
+ <comment xml:lang="ga">fuaim MPEG-4</comment>
+ <comment xml:lang="gl">son MPEG-4</comment>
+ <comment xml:lang="he">שמע MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 hang</comment>
+ <comment xml:lang="id">Audio MPEG-4</comment>
+ <comment xml:lang="it">Audio MPEG-4</comment>
+ <comment xml:lang="ja">MPEG-4 オーディオ</comment>
+ <comment xml:lang="kk">MPEG-4 аудиосы</comment>
+ <comment xml:lang="ko">MPEG-4 오디오</comment>
+ <comment xml:lang="lt">MPEG-4 garso įrašas</comment>
+ <comment xml:lang="lv">MPEG-4 audio</comment>
+ <comment xml:lang="nb">MPEG-4-lyd</comment>
+ <comment xml:lang="nl">MPEG4-audio</comment>
+ <comment xml:lang="nn">MPEG-4-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MPEG-4</comment>
+ <comment xml:lang="pt_BR">Áudio MPEG-4</comment>
+ <comment xml:lang="ro">Audio MPEG-4</comment>
+ <comment xml:lang="ru">аудио MPEG-4</comment>
+ <comment xml:lang="sk">Zvuk MPEG-4</comment>
+ <comment xml:lang="sl">Zvočna datoteka MPEG-4</comment>
+ <comment xml:lang="sq">Audio MPEG-4</comment>
+ <comment xml:lang="sv">MPEG-4-ljud</comment>
+ <comment xml:lang="uk">звук MPEG-4</comment>
+ <comment xml:lang="vi">Âm thanh MPEG-4</comment>
+ <comment xml:lang="zh_CN">MPEG-4 音频</comment>
+ <comment xml:lang="zh_TW">MPEG-4 音訊</comment>
+ <alias type="audio/x-m4a"/>
+ <magic priority="50">
+ <match value="ftypM4A" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.m4a"/>
+ <glob pattern="*.aac"/>
+ <glob pattern="*.f4a"/>
+ </mime-type>
+ <mime-type type="video/mp4">
+ <comment>MPEG-4 video</comment>
+ <comment xml:lang="ar">MPEG-4 مرئي</comment>
+ <comment xml:lang="be@latin">Videa MPEG-4</comment>
+ <comment xml:lang="bg">Видео — MPEG-4</comment>
+ <comment xml:lang="ca">vídeo MPEG-4</comment>
+ <comment xml:lang="cs">Video MPEG-4</comment>
+ <comment xml:lang="da">MPEG4-video</comment>
+ <comment xml:lang="de">MPEG-4-Video</comment>
+ <comment xml:lang="en_GB">MPEG-4 video</comment>
+ <comment xml:lang="eo">MPEG-4-video</comment>
+ <comment xml:lang="es">vídeo MPEG-4</comment>
+ <comment xml:lang="eu">MPEG-4 bideoa</comment>
+ <comment xml:lang="fi">MPEG-4-video</comment>
+ <comment xml:lang="fo">MPEG-4 video</comment>
+ <comment xml:lang="fr">vidéo MPEG-4</comment>
+ <comment xml:lang="ga">físeán MPEG-4</comment>
+ <comment xml:lang="gl">vídeo MPEG-4</comment>
+ <comment xml:lang="he">וידאו MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 videó</comment>
+ <comment xml:lang="id">Video MPEG-4</comment>
+ <comment xml:lang="it">Video MPEG-4</comment>
+ <comment xml:lang="ja">MPEG-4 動画</comment>
+ <comment xml:lang="kk">MPEG-4 видеосы</comment>
+ <comment xml:lang="ko">MPEG-4 비디오</comment>
+ <comment xml:lang="lt">MPEG-4 vaizdo įrašas</comment>
+ <comment xml:lang="lv">MPEG-4 video</comment>
+ <comment xml:lang="nb">MPEG-4-film</comment>
+ <comment xml:lang="nl">MPEG4-video</comment>
+ <comment xml:lang="nn">MPEG-4-video</comment>
+ <comment xml:lang="pl">Plik wideo MPEG-4</comment>
+ <comment xml:lang="pt_BR">Vídeo MPEG-4</comment>
+ <comment xml:lang="ro">Video MPEG-4</comment>
+ <comment xml:lang="ru">видео MPEG-4</comment>
+ <comment xml:lang="sk">Video MPEG-4</comment>
+ <comment xml:lang="sl">Video datoteka MPEG-4</comment>
+ <comment xml:lang="sq">Video MPEG-4</comment>
+ <comment xml:lang="sv">MPEG-4-video</comment>
+ <comment xml:lang="uk">відеокліп MPEG-4</comment>
+ <comment xml:lang="vi">Ảnh động MPEG-4</comment>
+ <comment xml:lang="zh_CN">MPEG-4 视频</comment>
+ <comment xml:lang="zh_TW">MPEG-4 視訊</comment>
+ <alias type="video/mp4v-es"/>
+ <magic priority="50">
+ <match value="ftypisom" type="string" offset="4"/>
+ <match value="ftypmp42" type="string" offset="4"/>
+ <match value="ftypMSNV" type="string" offset="4"/>
+ <match value="ftypM4V " type="string" offset="4"/>
+ <match value="ftypf4v " type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.mp4"/>
+ <glob pattern="*.m4v"/>
+ <glob pattern="*.f4v"/>
+ <alias type="video/x-m4v"/>
+ </mime-type>
+ <mime-type type="audio/x-m4b">
+ <comment>MPEG-4 audio book</comment>
+ <comment xml:lang="ar">كتاب MPEG-4 السمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjokniha MPEG-4</comment>
+ <comment xml:lang="bg">Аудио книга — MPEG-4</comment>
+ <comment xml:lang="ca">llibre d'àudio MPEG-4</comment>
+ <comment xml:lang="cs">Zvuková kniha MPEG-4</comment>
+ <comment xml:lang="da">MPEG4-lydbog</comment>
+ <comment xml:lang="de">MPEG-4-Hörbuch</comment>
+ <comment xml:lang="eo">MPEG-4-sonlibro</comment>
+ <comment xml:lang="es">audiolibro en MPEG-4</comment>
+ <comment xml:lang="eu">MPEG-4 audio-liburua</comment>
+ <comment xml:lang="fi">MPEG-4-äänikirja</comment>
+ <comment xml:lang="fo">MPEG-4 ljóðbók</comment>
+ <comment xml:lang="fr">livre audio MPEG-4</comment>
+ <comment xml:lang="ga">leabhar fhuaim MPEG-4</comment>
+ <comment xml:lang="gl">sonlibro de MPEG-4</comment>
+ <comment xml:lang="he">ספר דיגיטלי MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 hangoskönyv</comment>
+ <comment xml:lang="id">Buku audio MPEG-4</comment>
+ <comment xml:lang="it">Audiolibro MPEG-4</comment>
+ <comment xml:lang="ja">MPEG-4 オーディオブック</comment>
+ <comment xml:lang="kk">MPEG-4 аудио кітабы</comment>
+ <comment xml:lang="ko">MPEG-4 오디오북</comment>
+ <comment xml:lang="lt">MPEG-4 garso knyga</comment>
+ <comment xml:lang="lv">MPEG-4 audio grāmata</comment>
+ <comment xml:lang="nb">MPEG-4-lydbok</comment>
+ <comment xml:lang="nl">MPEG4-audioboek</comment>
+ <comment xml:lang="nn">MPEG-4-lydbok</comment>
+ <comment xml:lang="pl">Książka dźwiękowa MPEG-4</comment>
+ <comment xml:lang="pt_BR">Livro de Áudio MPEG-4</comment>
+ <comment xml:lang="ro">Carte audio MPEG-4</comment>
+ <comment xml:lang="ru">аудиокнига MPEG-4</comment>
+ <comment xml:lang="sk">Zvuková kniha MPEG-4</comment>
+ <comment xml:lang="sl">Zvočna knjiga MPEG-4</comment>
+ <comment xml:lang="sq">Audiolibër MPEG-4</comment>
+ <comment xml:lang="sv">MPEG-4-ljudbok</comment>
+ <comment xml:lang="uk">аудіокнига MPEG-4</comment>
+ <comment xml:lang="vi">Sách âm thanh MPEG-4</comment>
+ <comment xml:lang="zh_CN">MPEG-4 有声书</comment>
+ <comment xml:lang="zh_TW">MPEG-4 音訊書</comment>
+ <sub-class-of type="audio/mp4"/>
+ <magic priority="50">
+ <match value="ftypM4B" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.m4b"/>
+ <glob pattern="*.f4b"/>
+ </mime-type>
+ <mime-type type="video/3gpp">
+ <comment>3GPP multimedia file</comment>
+ <comment xml:lang="ar">ملف وسائط متعددة 3GPP</comment>
+ <comment xml:lang="be@latin">Multymedyjny fajł 3GPP</comment>
+ <comment xml:lang="bg">Мултимедия — 3GPP</comment>
+ <comment xml:lang="ca">fitxer multimèdia 3GPP</comment>
+ <comment xml:lang="cs">Soubor multimédií 3GPP</comment>
+ <comment xml:lang="da">3GPP multimedie-fil</comment>
+ <comment xml:lang="de">3GPP-Multimediadatei</comment>
+ <comment xml:lang="es">archivo multimedia 3GPP</comment>
+ <comment xml:lang="eu">3GPP multimediako fitxategia</comment>
+ <comment xml:lang="fi">3GPP-multimediatiedosto</comment>
+ <comment xml:lang="fo">3GGP margmiðlafíla</comment>
+ <comment xml:lang="fr">fichier multimédia 3GPP</comment>
+ <comment xml:lang="ga">comhad ilmheán 3GPP</comment>
+ <comment xml:lang="gl">ficheiro multimedia 3GPP</comment>
+ <comment xml:lang="he">קובץ מולטימדיה מסוג 3GPP</comment>
+ <comment xml:lang="hu">3GPP multimédiafájl</comment>
+ <comment xml:lang="id">Berkas multimedia 3GPP</comment>
+ <comment xml:lang="it">File multimediale 3GPP</comment>
+ <comment xml:lang="ja">3GPP マルチメディアファイル</comment>
+ <comment xml:lang="kk">3GPP мультимедиялық файлы</comment>
+ <comment xml:lang="ko">3GPP 멀티미디어 파일</comment>
+ <comment xml:lang="lt">3GPP multimedijos failas</comment>
+ <comment xml:lang="lv">3GPP multimediju fails</comment>
+ <comment xml:lang="nb">3GPP-multimediafil</comment>
+ <comment xml:lang="nl">3GPP-multimediabestand</comment>
+ <comment xml:lang="nn">3GPP-multimediafil</comment>
+ <comment xml:lang="pl">Plik multimedialny 3GPP</comment>
+ <comment xml:lang="pt_BR">Arquivo multimídia 3GPP</comment>
+ <comment xml:lang="ro">Fișier multimedia 3GPP</comment>
+ <comment xml:lang="ru">мультимедийный файл 3GPP</comment>
+ <comment xml:lang="sk">Súbor multimédií 3GPP</comment>
+ <comment xml:lang="sl">Večpredstavnostna datoteka 3GPP</comment>
+ <comment xml:lang="sq">File multimedial 3GPP</comment>
+ <comment xml:lang="sv">3GPP-multimediafil</comment>
+ <comment xml:lang="uk">файл мультимедійних даних 3GPP</comment>
+ <comment xml:lang="vi">Tập tin đa phương tiện 3GPP</comment>
+ <comment xml:lang="zh_CN">3GPP 多媒体文件</comment>
+ <comment xml:lang="zh_TW">3GPP 多媒體檔案</comment>
+ <acronym>3GPP</acronym>
+ <expanded-acronym>3rd Generation Partnership Project</expanded-acronym>
+ <sub-class-of type="video/mp4"/>
+ <magic priority="50">
+ <match value="ftyp3ge" type="string" offset="4"/>
+ <match value="ftyp3gg" type="string" offset="4"/>
+ <match value="ftyp3gp" type="string" offset="4"/>
+ <match value="ftyp3gs" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.3gp"/>
+ <glob pattern="*.3gpp"/>
+ <glob pattern="*.3ga"/>
+ <alias type="video/3gp"/>
+ <alias type="audio/3gpp"/>
+ <alias type="video/3gpp-encrypted"/>
+ <alias type="audio/3gpp-encrypted"/>
+ <alias type="audio/amr"/>
+ <alias type="audio/amr-encrypted"/>
+ <alias type="audio/amr-wb"/>
+ <alias type="audio/amr-wb-encrypted"/>
+ <alias type="audio/x-rn-3gpp-amr"/>
+ <alias type="audio/x-rn-3gpp-amr-encrypted"/>
+ <alias type="audio/x-rn-3gpp-amr-wb"/>
+ <alias type="audio/x-rn-3gpp-amr-wb-encrypted"/>
+ </mime-type>
+ <mime-type type="video/3gpp2">
+ <comment>3GPP2 multimedia file</comment>
+ <comment xml:lang="bg">Мултимедия — 3GPP2</comment>
+ <comment xml:lang="ca">fitxer multimèdia 3GPP2</comment>
+ <comment xml:lang="cs">Soubor multimédií 3GPP2</comment>
+ <comment xml:lang="da">3GPP2 multimedie-fil</comment>
+ <comment xml:lang="de">3GPP2-Multimediadatei</comment>
+ <comment xml:lang="es">archivo multimedia 3GPP2</comment>
+ <comment xml:lang="fi">3GPP2-multimediatiedosto</comment>
+ <comment xml:lang="fo">3GGP2 margmiðlafíla</comment>
+ <comment xml:lang="fr">fichier multimédia 3GPP2</comment>
+ <comment xml:lang="ga">comhad ilmheán 3GPP2</comment>
+ <comment xml:lang="gl">ficheiro multimedia 3GPP2</comment>
+ <comment xml:lang="he">קובץ מולטימדיה 3GPP2</comment>
+ <comment xml:lang="hu">3GPP2 multimédiafájl</comment>
+ <comment xml:lang="id">Berkas multimedia 3GPP2</comment>
+ <comment xml:lang="it">File multimediale 3GPP2</comment>
+ <comment xml:lang="ja">3GPP2 マルチメディアファイル</comment>
+ <comment xml:lang="kk">3GPP2 мультимедиялық файлы</comment>
+ <comment xml:lang="ko">3GPP2 멀티미디어 파일</comment>
+ <comment xml:lang="lv">3GPP2 multimediju fails</comment>
+ <comment xml:lang="pl">Plik multimedialny 3GPP2</comment>
+ <comment xml:lang="ro">Fișier multimedia 3GPP2</comment>
+ <comment xml:lang="ru">мультимедийный файл 3GPP2</comment>
+ <comment xml:lang="sk">Súbor multimédií 3GPP2</comment>
+ <comment xml:lang="sl">Večpredstavnostna datoteka 3GPP2</comment>
+ <comment xml:lang="sv">3GPP2-multimediafil</comment>
+ <comment xml:lang="uk">файл мультимедійних даних 3GPP2</comment>
+ <comment xml:lang="zh_CN">3GPP2 多媒体文件</comment>
+ <comment xml:lang="zh_TW">3GPP2 多媒體檔案</comment>
+ <acronym>3GPP2</acronym>
+ <expanded-acronym>3rd Generation Partnership Project 2</expanded-acronym>
+ <sub-class-of type="video/mp4"/>
+ <magic priority="50">
+ <match value="ftyp3g2" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.3g2"/>
+ <glob pattern="*.3gp2"/>
+ <glob pattern="*.3gpp2"/>
+ <alias type="audio/3gpp2"/>
+ </mime-type>
+ <mime-type type="audio/x-mod">
+ <comment>Amiga SoundTracker audio</comment>
+ <comment xml:lang="ar">مقتفي صوت Amiga السمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Amiga SoundTracker</comment>
+ <comment xml:lang="bg">Аудио — Amiga SoundTracker</comment>
+ <comment xml:lang="ca">àudio Amiga SoundTracker</comment>
+ <comment xml:lang="cs">Zvuk Amiga SoundTracker</comment>
+ <comment xml:lang="da">Amiga SoundTracker-lyd</comment>
+ <comment xml:lang="de">Amiga-SoundTracker-Audio</comment>
+ <comment xml:lang="el">ήχος Amiga SoundTracker</comment>
+ <comment xml:lang="en_GB">Amiga SoundTracker audio</comment>
+ <comment xml:lang="eo">Sondosiero de Amiga SoundTracker</comment>
+ <comment xml:lang="es">sonido de Amiga SoundTracker</comment>
+ <comment xml:lang="eu">Amiga soundtracker audioa</comment>
+ <comment xml:lang="fi">Amiga SoundTracker -ääni</comment>
+ <comment xml:lang="fo">Amiga SoundTracker ljóður</comment>
+ <comment xml:lang="fr">audio SoundTracker Amiga</comment>
+ <comment xml:lang="ga">fuaim Amiga SoundTracker</comment>
+ <comment xml:lang="gl">son de Amiga SoundTracker</comment>
+ <comment xml:lang="he">קובץ שמע של Amiga SoundTracker</comment>
+ <comment xml:lang="hu">Amiga SoundTracker hang</comment>
+ <comment xml:lang="id">Audio Amida SoundTracker</comment>
+ <comment xml:lang="it">Audio Amiga SoundTracker</comment>
+ <comment xml:lang="ja">Amiga SoundTracker オーディオ</comment>
+ <comment xml:lang="kk">Amiga SoundTracker аудиосы</comment>
+ <comment xml:lang="ko">Amiga SoundTracker 오디오</comment>
+ <comment xml:lang="lt">Amiga SoundTracker garso įrašas</comment>
+ <comment xml:lang="lv">Amiga SoundTracker audio</comment>
+ <comment xml:lang="ms">Audio Amiga Soundtracker</comment>
+ <comment xml:lang="nb">Amiga SoundTracker-lyd</comment>
+ <comment xml:lang="nl">Amiga SoundTracker-audio</comment>
+ <comment xml:lang="nn">Amiga soundtracker-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Amiga SoundTracker</comment>
+ <comment xml:lang="pt">áudio SoundTracker do Amiga</comment>
+ <comment xml:lang="pt_BR">Áudio Amiga SoundTracker</comment>
+ <comment xml:lang="ro">Audio Amiga SoundTracker</comment>
+ <comment xml:lang="ru">аудио Amiga SoundTracker</comment>
+ <comment xml:lang="sk">Zvuk Amiga SoundTracker</comment>
+ <comment xml:lang="sl">Zvočna datoteka Amiga SoundTracker</comment>
+ <comment xml:lang="sq">Audio Amiga SoundTracker</comment>
+ <comment xml:lang="sr">Амига soundtracker звук</comment>
+ <comment xml:lang="sv">Amiga SoundTracker-ljud</comment>
+ <comment xml:lang="uk">звук Amiga SoundTracker</comment>
+ <comment xml:lang="vi">Âm thanh Amiga SoundTracker</comment>
+ <comment xml:lang="zh_CN">Amiga SoundTracker 音频</comment>
+ <comment xml:lang="zh_TW">Amiga SoundTracker 音訊</comment>
+ <glob pattern="*.mod"/>
+ <glob pattern="*.ult"/>
+ <glob pattern="*.uni"/>
+ <glob pattern="*.m15"/>
+ <glob pattern="*.mtm"/>
+ <glob pattern="*.669"/>
+ <glob pattern="*.med"/>
+ </mime-type>
+ <mime-type type="audio/mp2">
+ <comment>MP2 audio</comment>
+ <comment xml:lang="ar">MP2 سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MP2</comment>
+ <comment xml:lang="bg">Аудио — MP2</comment>
+ <comment xml:lang="ca">àudio MP2</comment>
+ <comment xml:lang="cs">Zvuk MP2</comment>
+ <comment xml:lang="da">MP2-lyd</comment>
+ <comment xml:lang="de">MP2-Audio</comment>
+ <comment xml:lang="eo">MP2-sondosiero</comment>
+ <comment xml:lang="es">sonido MP2</comment>
+ <comment xml:lang="eu">MP2 audioa</comment>
+ <comment xml:lang="fi">MP2-ääni</comment>
+ <comment xml:lang="fo">MP2 ljóður</comment>
+ <comment xml:lang="fr">audio MP2</comment>
+ <comment xml:lang="ga">fuaim MP2</comment>
+ <comment xml:lang="gl">son MP2</comment>
+ <comment xml:lang="he">שמע MP2</comment>
+ <comment xml:lang="hu">MP2 hang</comment>
+ <comment xml:lang="id">Audio MP2</comment>
+ <comment xml:lang="it">Audio MP2</comment>
+ <comment xml:lang="ja">MP2 オーディオ</comment>
+ <comment xml:lang="kk">MP2 аудиосы</comment>
+ <comment xml:lang="ko">MP2 오디오</comment>
+ <comment xml:lang="lt">MP2 garso įrašas</comment>
+ <comment xml:lang="lv">MP2 audio</comment>
+ <comment xml:lang="nb">MP2-lyd</comment>
+ <comment xml:lang="nl">MP2-audio</comment>
+ <comment xml:lang="nn">MP2-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MP2</comment>
+ <comment xml:lang="pt_BR">Áudio MP2</comment>
+ <comment xml:lang="ro">Audio MP2</comment>
+ <comment xml:lang="ru">аудио MP2</comment>
+ <comment xml:lang="sk">Zvuk MP2</comment>
+ <comment xml:lang="sl">Zvočna datoteka MP2</comment>
+ <comment xml:lang="sq">Audio MP2</comment>
+ <comment xml:lang="sv">MP2-ljud</comment>
+ <comment xml:lang="uk">звук MP2</comment>
+ <comment xml:lang="vi">Âm thanh MP2</comment>
+ <comment xml:lang="zh_CN">MP2 音频</comment>
+ <comment xml:lang="zh_TW">MP2 音訊</comment>
+ <alias type="audio/x-mp2"/>
+ <glob pattern="*.mp2"/>
+ </mime-type>
+ <mime-type type="audio/mpeg">
+ <comment>MP3 audio</comment>
+ <comment xml:lang="ar">MP3 سمعي</comment>
+ <comment xml:lang="az">MP3 audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MP3</comment>
+ <comment xml:lang="bg">Аудио — MP3</comment>
+ <comment xml:lang="ca">àudio MP3</comment>
+ <comment xml:lang="cs">Zvuk MP3</comment>
+ <comment xml:lang="cy">Sain MP3</comment>
+ <comment xml:lang="da">MP3-lyd</comment>
+ <comment xml:lang="de">MP3-Audio</comment>
+ <comment xml:lang="el">ήχος MP3</comment>
+ <comment xml:lang="en_GB">MP3 audio</comment>
+ <comment xml:lang="eo">MP3-sondosiero</comment>
+ <comment xml:lang="es">sonido MP3</comment>
+ <comment xml:lang="eu">MP3 audioa</comment>
+ <comment xml:lang="fi">MP3-ääni</comment>
+ <comment xml:lang="fo">MP3 ljóður</comment>
+ <comment xml:lang="fr">audio MP3</comment>
+ <comment xml:lang="ga">fuaim MP3</comment>
+ <comment xml:lang="gl">son MP3</comment>
+ <comment xml:lang="he">שמע MP3</comment>
+ <comment xml:lang="hu">MP3 hang</comment>
+ <comment xml:lang="id">Audio MP3</comment>
+ <comment xml:lang="it">Audio MP3</comment>
+ <comment xml:lang="ja">MP3 オーディオ</comment>
+ <comment xml:lang="kk">MP3 аудиосы</comment>
+ <comment xml:lang="ko">MP3 오디오</comment>
+ <comment xml:lang="lt">MP3 garso įrašas</comment>
+ <comment xml:lang="lv">MP3 audio</comment>
+ <comment xml:lang="ms">Audio MP3</comment>
+ <comment xml:lang="nb">MP3-lyd</comment>
+ <comment xml:lang="nl">MP3-audio</comment>
+ <comment xml:lang="nn">MP3-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MP3</comment>
+ <comment xml:lang="pt">áudio MP3</comment>
+ <comment xml:lang="pt_BR">Áudio MP3</comment>
+ <comment xml:lang="ro">Audio MP3</comment>
+ <comment xml:lang="ru">аудио MP3</comment>
+ <comment xml:lang="sk">Zvuk MP3</comment>
+ <comment xml:lang="sl">Zvočna datoteka MP3</comment>
+ <comment xml:lang="sq">Audio MP3</comment>
+ <comment xml:lang="sr">MP3 звучни запис</comment>
+ <comment xml:lang="sv">MP3-ljud</comment>
+ <comment xml:lang="uk">звук MP3</comment>
+ <comment xml:lang="vi">Âm thanh MP3</comment>
+ <comment xml:lang="zh_CN">MP3 音频</comment>
+ <comment xml:lang="zh_TW">MP3 音訊</comment>
+ <alias type="audio/x-mp3"/>
+ <alias type="audio/x-mpeg"/>
+ <alias type="audio/mp3"/>
+ <magic priority="50">
+ <match value="0xfffb" type="big16" offset="0"/>
+ <match value="ID3" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mp3"/>
+ <glob pattern="*.mpga"/>
+ </mime-type>
+ <mime-type type="audio/x-mpegurl">
+ <comment>MP3 audio (streamed)</comment>
+ <comment xml:lang="ar">MP3 سمعي (تدفق)</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MP3 (płyń)</comment>
+ <comment xml:lang="bg">Аудио — MP3, поточно</comment>
+ <comment xml:lang="ca">àudio MP3 (flux)</comment>
+ <comment xml:lang="cs">Zvuk MP3 (proud)</comment>
+ <comment xml:lang="da">MP3-lyd (strøm)</comment>
+ <comment xml:lang="de">MP3-Audio (Stream)</comment>
+ <comment xml:lang="el">ήχος MP3 (εκπεμπόμενος)</comment>
+ <comment xml:lang="en_GB">MP3 audio (streamed)</comment>
+ <comment xml:lang="eo">MP3-sondosiero (fluigate)</comment>
+ <comment xml:lang="es">sonido MP3 (en flujo)</comment>
+ <comment xml:lang="eu">MP3 audioa (korrontea)</comment>
+ <comment xml:lang="fi">MP3-ääni (virtaus)</comment>
+ <comment xml:lang="fo">MP3 ljóður (streymað)</comment>
+ <comment xml:lang="fr">audio MP3 (flux)</comment>
+ <comment xml:lang="ga">fuaim MP3 (sruthaithe)</comment>
+ <comment xml:lang="gl">son MP3 (en stream)</comment>
+ <comment xml:lang="he">שמע MP3 (מוזרם)</comment>
+ <comment xml:lang="hu">MP3 hang (sugárzott)</comment>
+ <comment xml:lang="id">Audio MP3 (stream)</comment>
+ <comment xml:lang="it">Audio MP3 (in streaming)</comment>
+ <comment xml:lang="ja">MP3 オーディオ (ストリーム)</comment>
+ <comment xml:lang="kk">MP3 аудиосы (ағымдық)</comment>
+ <comment xml:lang="ko">MP3 오디오 (스트림)</comment>
+ <comment xml:lang="lt">MP3 garso įrašas (transliuojamas)</comment>
+ <comment xml:lang="lv">MP3 audio (straumēts)</comment>
+ <comment xml:lang="ms">Audio MP3 (aliran)</comment>
+ <comment xml:lang="nb">MP3-lyd (streaming)</comment>
+ <comment xml:lang="nl">MP3-audio (gestreamd)</comment>
+ <comment xml:lang="nn">Strauma MP3-lyd</comment>
+ <comment xml:lang="pl">Dźwięk MP3 (strumień)</comment>
+ <comment xml:lang="pt">áudio MP3 (em fluxo)</comment>
+ <comment xml:lang="pt_BR">Áudio MP3 (em fluxo)</comment>
+ <comment xml:lang="ro">Audio MP3 (flux)</comment>
+ <comment xml:lang="ru">аудио MP3 (потоковое)</comment>
+ <comment xml:lang="sk">Zvuk MP3 (streamovaný)</comment>
+ <comment xml:lang="sl">Zvočna datoteka MP3 (pretočna)</comment>
+ <comment xml:lang="sq">Audio MP3 (streamed)</comment>
+ <comment xml:lang="sr">MP3 звучни запис (непрекидан)</comment>
+ <comment xml:lang="sv">MP3-ljud (flöde)</comment>
+ <comment xml:lang="uk">звук MP3 (потоковий)</comment>
+ <comment xml:lang="vi">Âm thanh MP3 (chạy luồng)</comment>
+ <comment xml:lang="zh_CN">MP3 流音频</comment>
+ <comment xml:lang="zh_TW">MP3 音訊 (串流)</comment>
+ <sub-class-of type="text/plain"/>
+ <alias type="audio/mpegurl"/>
+ <alias type="application/m3u"/>
+ <alias type="audio/x-mp3-playlist"/>
+ <alias type="audio/m3u"/>
+ <alias type="audio/x-m3u"/>
+ <glob pattern="*.m3u"/>
+ <glob pattern="*.m3u8"/>
+ <glob pattern="*.vlc"/>
+ <magic priority="50">
+ <match value="#EXTM3U" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/vnd.apple.mpegurl">
+ <comment>HTTP Live Streaming playlist</comment>
+ <comment xml:lang="ar">قائمة بث HTTP حية</comment>
+ <comment xml:lang="bg">Списък за изпълнение — поток по HTTP</comment>
+ <comment xml:lang="ca">llista de reproducció en temps real HTTP</comment>
+ <comment xml:lang="cs">Seznam skladeb HTTP Live Streaming</comment>
+ <comment xml:lang="da">Afspilningsliste til HTTP-livestrøm</comment>
+ <comment xml:lang="de">HTTP Live-Streaming-Wiedergabeliste</comment>
+ <comment xml:lang="es">lista de reproducción de flujo en directo HTTP</comment>
+ <comment xml:lang="eu">HTTP zuzeneko korrontearen erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fo">HTTP beinleiðis streymaður avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture de flux HTTP Live</comment>
+ <comment xml:lang="ga">seinmliosta sruthaithe bheo HTTP</comment>
+ <comment xml:lang="gl">lista de reprodución de fluxo HTTP</comment>
+ <comment xml:lang="he">רשימת השמעה הזרימה של HTTP</comment>
+ <comment xml:lang="hu">HTTP élő lejátszólista</comment>
+ <comment xml:lang="id">Daftar putar HTTP Live Streaming</comment>
+ <comment xml:lang="it">Scaletta Live Steaming HTTP</comment>
+ <comment xml:lang="ja">HTTP ライブストリーミング再生リスト</comment>
+ <comment xml:lang="kk">HTTP тірі ағым ойнау тізімі</comment>
+ <comment xml:lang="ko">HTTP 라이브 스트리밍 재생 목록</comment>
+ <comment xml:lang="lt">HTTP tiesioginio transliavimo grojaraštis</comment>
+ <comment xml:lang="lv">HTTP dzīvās straumēšanas repertuārs</comment>
+ <comment xml:lang="pl">Lista odtwarzania strumieniowego na żywo HTTP</comment>
+ <comment xml:lang="ro">Listă de redare difuzată ca flux HTTP</comment>
+ <comment xml:lang="ru">список воспроизведения HTTP-потока</comment>
+ <comment xml:lang="sl">Seznam predvajanja živega pretoka HTTP</comment>
+ <comment xml:lang="sv">HTTP Live Streaming-spellista</comment>
+ <comment xml:lang="uk">список відтворення HTTP Live Streaming</comment>
+ <comment xml:lang="zh_CN">HTTP 直播流播放列表</comment>
+ <comment xml:lang="zh_TW">HTTP 即時串流播放清單</comment>
+ <glob pattern="*.m3u"/>
+ <glob pattern="*.m3u8"/>
+ <magic priority="70">
+ <match value="#EXTM3U" type="string" offset="0">
+ <match value="#EXT-X-TARGETDURATION" type="string" offset="0:128"/>
+ <match value="#EXT-X-STREAM-INF" type="string" offset="0:128"/>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="audio/x-ms-asx">
+ <comment>Microsoft ASX playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل مايكروسوفت ASX</comment>
+ <comment xml:lang="be@latin">Śpis Microsoft ASX</comment>
+ <comment xml:lang="bg">Списък за изпълнение — Microsoft ASX</comment>
+ <comment xml:lang="ca">llista de reproducció ASX de Microsoft</comment>
+ <comment xml:lang="cs">Seznam skladeb Microsoft ASX</comment>
+ <comment xml:lang="da">Microsoft ASX-afspilningsliste</comment>
+ <comment xml:lang="de">Microsoft-ASX-Wiedergabeliste</comment>
+ <comment xml:lang="es">lista de reproducción ASX de Microsoft</comment>
+ <comment xml:lang="eu">Microsoft ASX erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">Microsoft ASX -soittolista</comment>
+ <comment xml:lang="fo">Microsoft ASX avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture Microsoft ASX</comment>
+ <comment xml:lang="ga">seinmliosta Microsoft ASX</comment>
+ <comment xml:lang="gl">lista de reprodución Microsoft ASX</comment>
+ <comment xml:lang="he">רשימת השמעה ASX (מיקרוסופט)</comment>
+ <comment xml:lang="hu">Microsoft ASX lejátszólista</comment>
+ <comment xml:lang="id">Senarai putar Microsoft ASX</comment>
+ <comment xml:lang="it">Scaletta Microsoft ASX</comment>
+ <comment xml:lang="ja">Microsoft ASX 再生リスト</comment>
+ <comment xml:lang="kk">Microsoft ASX ойнау тізімі</comment>
+ <comment xml:lang="ko">마이크로소프트 ASX 재생 목록</comment>
+ <comment xml:lang="lt">Microsoft ASX grojaraštis</comment>
+ <comment xml:lang="lv">Microsoft ASX repertuārs</comment>
+ <comment xml:lang="nb">Microsoft ASX-spilleliste</comment>
+ <comment xml:lang="nl">Microsoft ASX-afspeellijst</comment>
+ <comment xml:lang="nn">Microsoft ASX-speleliste</comment>
+ <comment xml:lang="pl">Lista odtwarzania Microsoft ASX</comment>
+ <comment xml:lang="pt_BR">Lista de execução do Microsoft ASX</comment>
+ <comment xml:lang="ro">Listă redare Microsoft ASX</comment>
+ <comment xml:lang="ru">список воспроизведения Microsoft ASX</comment>
+ <comment xml:lang="sk">Zoznam skladieb Microsoft ASX</comment>
+ <comment xml:lang="sl">Seznam predvajanja Microsoft ASX</comment>
+ <comment xml:lang="sq">Listë titujsh Microsoft ASF</comment>
+ <comment xml:lang="sv">Microsoft ASX-spellista</comment>
+ <comment xml:lang="uk">список відтворення ASX Microsoft</comment>
+ <comment xml:lang="vi">Danh mục nhạc Microsoft ASX</comment>
+ <comment xml:lang="zh_CN">Microsoft ASX 播放列表</comment>
+ <comment xml:lang="zh_TW">微軟 ASX 播放清單</comment>
+ <alias type="video/x-ms-wvx"/>
+ <alias type="video/x-ms-wax"/>
+ <alias type="video/x-ms-wmx"/>
+ <alias type="application/x-ms-asx"/>
+ <glob pattern="*.asx"/>
+ <glob pattern="*.wax"/>
+ <glob pattern="*.wvx"/>
+ <glob pattern="*.wmx"/>
+ <magic priority="51">
+ <match value="ASF " type="string" offset="0"/>
+ <match value="&lt;ASX" type="string" offset="0:64"/>
+ <match value="&lt;asx" type="string" offset="0:64"/>
+ <match value="&lt;Asx" type="string" offset="0:64"/>
+ </magic>
+ </mime-type>
+ <mime-type type="audio/x-psf">
+ <comment>PSF audio</comment>
+ <comment xml:lang="ar">PSF سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo PSF</comment>
+ <comment xml:lang="bg">Аудио — PSF</comment>
+ <comment xml:lang="ca">àudio PSF</comment>
+ <comment xml:lang="cs">Zvuk PSF</comment>
+ <comment xml:lang="da">PSF-lyd</comment>
+ <comment xml:lang="de">PSF-Audio</comment>
+ <comment xml:lang="eo">PSF-sondosiero</comment>
+ <comment xml:lang="es">sonido PSF</comment>
+ <comment xml:lang="eu">PSF audioa</comment>
+ <comment xml:lang="fi">PSF-ääni</comment>
+ <comment xml:lang="fo">PSF ljóður</comment>
+ <comment xml:lang="fr">audio PSF</comment>
+ <comment xml:lang="ga">fuaim PSF</comment>
+ <comment xml:lang="gl">son PSF</comment>
+ <comment xml:lang="he">שמע PSF</comment>
+ <comment xml:lang="hu">PSF hang</comment>
+ <comment xml:lang="id">Audio PSF</comment>
+ <comment xml:lang="it">Audio PSF</comment>
+ <comment xml:lang="ja">PSF オーディオ</comment>
+ <comment xml:lang="kk">PSF аудиосы</comment>
+ <comment xml:lang="ko">PSF 오디오</comment>
+ <comment xml:lang="lt">PSF garso įrašas</comment>
+ <comment xml:lang="lv">PSF audio</comment>
+ <comment xml:lang="nb">PSF-lyd</comment>
+ <comment xml:lang="nl">PSF-audio</comment>
+ <comment xml:lang="nn">PSF-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy PSF</comment>
+ <comment xml:lang="pt_BR">Áudio PSF</comment>
+ <comment xml:lang="ro">Audio PSF</comment>
+ <comment xml:lang="ru">аудио PSF</comment>
+ <comment xml:lang="sk">Zvuk PSF</comment>
+ <comment xml:lang="sl">Zvočna datoteka PSF</comment>
+ <comment xml:lang="sq">Audio PSF</comment>
+ <comment xml:lang="sv">PSF-ljud</comment>
+ <comment xml:lang="uk">звук PSF</comment>
+ <comment xml:lang="vi">Âm thanh PSF</comment>
+ <comment xml:lang="zh_CN">PSF 音频</comment>
+ <comment xml:lang="zh_TW">PSF 音訊</comment>
+ <acronym>PSF</acronym>
+ <expanded-acronym>Portable Sound Format</expanded-acronym>
+ <magic priority="50">
+ <match value="PSF" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.psf"/>
+ </mime-type>
+ <mime-type type="audio/x-minipsf">
+ <comment>MiniPSF audio</comment>
+ <comment xml:lang="ar">MiniPSF سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MiniPSF</comment>
+ <comment xml:lang="bg">Аудио — MiniPSF</comment>
+ <comment xml:lang="ca">àudio MiniPSF</comment>
+ <comment xml:lang="cs">Zvuk MiniPSF</comment>
+ <comment xml:lang="da">MiniPSF-lyd</comment>
+ <comment xml:lang="de">MiniPSF-Audio</comment>
+ <comment xml:lang="eo">MiniPSF-sondosiero</comment>
+ <comment xml:lang="es">sonido MiniPSF</comment>
+ <comment xml:lang="eu">MiniPSF audioa</comment>
+ <comment xml:lang="fi">MiniPSF-ääni</comment>
+ <comment xml:lang="fo">MiniPSF ljóður</comment>
+ <comment xml:lang="fr">audio MiniPSF</comment>
+ <comment xml:lang="ga">fuaim MiniPSF</comment>
+ <comment xml:lang="gl">son MiniPSF</comment>
+ <comment xml:lang="he">שמע של MiniPSP</comment>
+ <comment xml:lang="hu">MiniPSF hang</comment>
+ <comment xml:lang="id">Audio MiniPSF</comment>
+ <comment xml:lang="it">Audio MiniPSF</comment>
+ <comment xml:lang="ja">MiniPSF オーディオ</comment>
+ <comment xml:lang="kk">MiniPSF аудиосы</comment>
+ <comment xml:lang="ko">MiniPSF 오디오</comment>
+ <comment xml:lang="lt">MiniPSF garso įrašas</comment>
+ <comment xml:lang="lv">MiniPSF audio</comment>
+ <comment xml:lang="nb">MiniPSF-lyd</comment>
+ <comment xml:lang="nl">MiniPSF-audio</comment>
+ <comment xml:lang="nn">MiniPSF-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MiniPSF</comment>
+ <comment xml:lang="pt_BR">Áudio MiniPSF</comment>
+ <comment xml:lang="ro">Audio MiniPSF</comment>
+ <comment xml:lang="ru">аудио MiniPSF</comment>
+ <comment xml:lang="sk">Zvuk MiniPSF</comment>
+ <comment xml:lang="sl">Zvočna datoteka MiniPSF</comment>
+ <comment xml:lang="sq">Audio MiniPSF</comment>
+ <comment xml:lang="sv">MiniPSF-ljud</comment>
+ <comment xml:lang="uk">звук MiniPSF</comment>
+ <comment xml:lang="vi">Âm thanh MiniPSF</comment>
+ <comment xml:lang="zh_CN">MiniPSF 音频</comment>
+ <comment xml:lang="zh_TW">MiniPSF 音訊</comment>
+ <acronym>MiniPSF</acronym>
+ <expanded-acronym>Miniature Portable Sound Format</expanded-acronym>
+ <sub-class-of type="audio/x-psf"/>
+ <glob pattern="*.minipsf"/>
+ </mime-type>
+ <mime-type type="audio/x-psflib">
+ <comment>PSFlib audio library</comment>
+ <comment xml:lang="ar">مكتبة PSFlib السمعية</comment>
+ <comment xml:lang="be@latin">Aŭdyjobiblijateka PSFlib</comment>
+ <comment xml:lang="bg">Аудио библиотека — PSFlib</comment>
+ <comment xml:lang="ca">biblioteca d'àudio PSFlib</comment>
+ <comment xml:lang="cs">Zvuková knihovna PSFlib</comment>
+ <comment xml:lang="da">PSFlib-lydbibliotek</comment>
+ <comment xml:lang="de">PSFlib-Audiobibliothek</comment>
+ <comment xml:lang="es">biblioteca de sonido PSFlib</comment>
+ <comment xml:lang="eu">PSFlib audioaren liburutegia</comment>
+ <comment xml:lang="fi">PSFlib-äänikirjasto</comment>
+ <comment xml:lang="fo">PSFlib ljóðsavn</comment>
+ <comment xml:lang="fr">bibliothèque audio PSFlib</comment>
+ <comment xml:lang="ga">leabharlann fhuaim PSFlib</comment>
+ <comment xml:lang="gl">Biblioteca de son PSFlib</comment>
+ <comment xml:lang="he">ספריית שמע PSFlib</comment>
+ <comment xml:lang="hu">PSFlib hanggyűjtemény</comment>
+ <comment xml:lang="id">Pustaka audio PSFlib</comment>
+ <comment xml:lang="it">Libreria audio PSFlib</comment>
+ <comment xml:lang="ja">PSFlib オーディオライブラリ</comment>
+ <comment xml:lang="kk">PSFlib аудио жинағы</comment>
+ <comment xml:lang="ko">PSFlib 오디오 라이브러리</comment>
+ <comment xml:lang="lt">PSFlib garso biblioteka</comment>
+ <comment xml:lang="lv">PSFlib fonotēka</comment>
+ <comment xml:lang="nb">PSFlib-lydbibliotek</comment>
+ <comment xml:lang="nl">PSFlib-audiobibliotheek</comment>
+ <comment xml:lang="nn">PSFlib lydbibliotek</comment>
+ <comment xml:lang="pl">Biblioteka dźwiękowa PSFlib</comment>
+ <comment xml:lang="pt_BR">Biblioteca de áudio PSFlib</comment>
+ <comment xml:lang="ro">Bibliotecă audio PSFlib</comment>
+ <comment xml:lang="ru">фонотека PSFlib</comment>
+ <comment xml:lang="sk">Zvuková knižnica PSFlib</comment>
+ <comment xml:lang="sl">Zvočna knjižnica PSFlib</comment>
+ <comment xml:lang="sq">Librari audio PSFlib</comment>
+ <comment xml:lang="sv">PSFlib-ljudbibliotek</comment>
+ <comment xml:lang="uk">аудіобібліотека PSFlib</comment>
+ <comment xml:lang="vi">Thư viện âm thanh PSFlib</comment>
+ <comment xml:lang="zh_CN">PSFlib 音频库文件</comment>
+ <comment xml:lang="zh_TW">PSFlib 音訊庫</comment>
+ <acronym>PSFlib</acronym>
+ <expanded-acronym>Portable Sound Format Library</expanded-acronym>
+ <sub-class-of type="audio/x-psf"/>
+ <glob pattern="*.psflib"/>
+ </mime-type>
+ <mime-type type="audio/x-ms-wma">
+ <comment>Windows Media audio</comment>
+ <comment xml:lang="ar">Windows Media سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Windows Media</comment>
+ <comment xml:lang="bg">Аудио — Windows Media</comment>
+ <comment xml:lang="ca">àudio Windows Media</comment>
+ <comment xml:lang="cs">Zvuk Windows Media</comment>
+ <comment xml:lang="da">Windows Media-lyd</comment>
+ <comment xml:lang="de">Windows-Media-Audio</comment>
+ <comment xml:lang="es">sonido de Windows Media</comment>
+ <comment xml:lang="eu">Windows Media audioa</comment>
+ <comment xml:lang="fi">Windows Media -ääni</comment>
+ <comment xml:lang="fo">Windows Media ljóður</comment>
+ <comment xml:lang="fr">audio Windows Media</comment>
+ <comment xml:lang="ga">fuaim Windows Media</comment>
+ <comment xml:lang="gl">son de Windows Media</comment>
+ <comment xml:lang="he">שמע של Windows Media</comment>
+ <comment xml:lang="hu">Windows Media hang</comment>
+ <comment xml:lang="id">Audio Windows Media</comment>
+ <comment xml:lang="it">Audio Windows Media</comment>
+ <comment xml:lang="ja">Windows Media オーディオ</comment>
+ <comment xml:lang="kk">Windows Media аудиосы</comment>
+ <comment xml:lang="ko">윈도우 미디어 오디오</comment>
+ <comment xml:lang="lt">Windows Media garso įrašas</comment>
+ <comment xml:lang="lv">Windows Media audio</comment>
+ <comment xml:lang="nb">Windows Media lyd</comment>
+ <comment xml:lang="nl">Windows Media-audio</comment>
+ <comment xml:lang="nn">Windows Media-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Windows Media</comment>
+ <comment xml:lang="pt_BR">Áudio do Windows Media</comment>
+ <comment xml:lang="ro">Audio Windows Media</comment>
+ <comment xml:lang="ru">аудио Windows Media</comment>
+ <comment xml:lang="sk">Zvuk Windows Media</comment>
+ <comment xml:lang="sl">Zvočna datoteka Windows Media</comment>
+ <comment xml:lang="sq">Audio Windows Media</comment>
+ <comment xml:lang="sv">Windows Media-ljud</comment>
+ <comment xml:lang="uk">звук Windows Media</comment>
+ <comment xml:lang="vi">Âm thanh Windows Media</comment>
+ <comment xml:lang="zh_CN">Windows Media 音频</comment>
+ <comment xml:lang="zh_TW">Windows Media 音訊</comment>
+ <sub-class-of type="video/x-ms-asf"/>
+ <glob pattern="*.wma"/>
+ <alias type="audio/wma"/>
+ </mime-type>
+ <mime-type type="audio/x-musepack">
+ <comment>Musepack audio</comment>
+ <comment xml:lang="ar">Musepack سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Musepack</comment>
+ <comment xml:lang="bg">Аудио — Musepack</comment>
+ <comment xml:lang="ca">àudio Musepack</comment>
+ <comment xml:lang="cs">Zvuk Musepack</comment>
+ <comment xml:lang="da">Musepacklyd</comment>
+ <comment xml:lang="de">Musepack-Audio</comment>
+ <comment xml:lang="es">sonido Musepack</comment>
+ <comment xml:lang="eu">Musepack audioa</comment>
+ <comment xml:lang="fi">Musepack-ääni</comment>
+ <comment xml:lang="fo">Musepack ljóður</comment>
+ <comment xml:lang="fr">audio Musepack</comment>
+ <comment xml:lang="ga">fuaim Musepack</comment>
+ <comment xml:lang="gl">son de Musepack</comment>
+ <comment xml:lang="he">שמע של Musepack</comment>
+ <comment xml:lang="hu">Musepack hang</comment>
+ <comment xml:lang="id">Audio Musepack</comment>
+ <comment xml:lang="it">Audio Musepack</comment>
+ <comment xml:lang="ja">Musepack オーディオ</comment>
+ <comment xml:lang="kk">Musepack аудиосы</comment>
+ <comment xml:lang="ko">Musepack 오디오</comment>
+ <comment xml:lang="lt">Musepack garso įrašas</comment>
+ <comment xml:lang="lv">Musepack audio</comment>
+ <comment xml:lang="nb">Musepack-lyd</comment>
+ <comment xml:lang="nl">Musepack-audio</comment>
+ <comment xml:lang="nn">Musepack-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Musepack</comment>
+ <comment xml:lang="pt_BR">Áudio Musepack</comment>
+ <comment xml:lang="ro">Audio Musepack</comment>
+ <comment xml:lang="ru">аудио Musepack</comment>
+ <comment xml:lang="sk">Zvuk Musepack</comment>
+ <comment xml:lang="sl">Zvočna datoteka Musepack</comment>
+ <comment xml:lang="sq">Audio Musepack</comment>
+ <comment xml:lang="sv">Musepack-ljud</comment>
+ <comment xml:lang="uk">звук Musepack</comment>
+ <comment xml:lang="vi">Âm thanh Musepack</comment>
+ <comment xml:lang="zh_CN">Musepack 音频</comment>
+ <comment xml:lang="zh_TW">Musepack 音訊</comment>
+ <magic priority="50">
+ <match value="MP+" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mpc"/>
+ <glob pattern="*.mpp"/>
+ <glob pattern="*.mp+"/>
+ </mime-type>
+ <mime-type type="audio/vnd.rn-realaudio">
+ <comment>RealAudio document</comment>
+ <comment xml:lang="ar">مستند RealAudio</comment>
+ <comment xml:lang="be@latin">Dakument RealAudio</comment>
+ <comment xml:lang="bg">Документ — RealAudio</comment>
+ <comment xml:lang="ca">document RealAudio</comment>
+ <comment xml:lang="cs">Dokument RealAudio</comment>
+ <comment xml:lang="da">RealAudio-dokument</comment>
+ <comment xml:lang="de">RealAudio-Dokument</comment>
+ <comment xml:lang="en_GB">RealAudio document</comment>
+ <comment xml:lang="eo">RealAudio-dokumento</comment>
+ <comment xml:lang="es">documento RealAudio</comment>
+ <comment xml:lang="eu">RealAudio dokumentua</comment>
+ <comment xml:lang="fi">RealAudio-asiakirja</comment>
+ <comment xml:lang="fo">RealAudio skjal</comment>
+ <comment xml:lang="fr">document RealAudio</comment>
+ <comment xml:lang="ga">cáipéis RealAudio</comment>
+ <comment xml:lang="gl">documento Realson</comment>
+ <comment xml:lang="he">מסמך של RealAudio</comment>
+ <comment xml:lang="hu">RealAudio dokumentum</comment>
+ <comment xml:lang="id">Dokumen RealAudio</comment>
+ <comment xml:lang="it">Documento RealAudio</comment>
+ <comment xml:lang="ja">RealAudio ドキュメント</comment>
+ <comment xml:lang="kk">RealAudio құжаты</comment>
+ <comment xml:lang="ko">RealAudio 문서</comment>
+ <comment xml:lang="lt">RealAudio dokumentas</comment>
+ <comment xml:lang="lv">RealAudio dokuments</comment>
+ <comment xml:lang="nb">RealAudio-dokument</comment>
+ <comment xml:lang="nl">RealAudio-document</comment>
+ <comment xml:lang="nn">RealAudio-dokument</comment>
+ <comment xml:lang="pl">Dokument RealAudio</comment>
+ <comment xml:lang="pt_BR">Documento RealAudio</comment>
+ <comment xml:lang="ro">Document RealAudio</comment>
+ <comment xml:lang="ru">документ RealAudio</comment>
+ <comment xml:lang="sk">Dokument RealAudio</comment>
+ <comment xml:lang="sl">Dokument RealAudio</comment>
+ <comment xml:lang="sq">Dokument RealAudio</comment>
+ <comment xml:lang="sv">RealAudio-dokument</comment>
+ <comment xml:lang="uk">документ RealAudio</comment>
+ <comment xml:lang="vi">Tài liệu âm thanh RealAudio</comment>
+ <comment xml:lang="zh_CN">RealAudio 文档</comment>
+ <comment xml:lang="zh_TW">RealAudio 文件</comment>
+ <glob pattern="*.ra"/>
+ <glob pattern="*.rax"/>
+ <alias type="audio/x-pn-realaudio"/>
+ <alias type="audio/vnd.m-realaudio"/>
+ </mime-type>
+ <mime-type type="application/ram">
+ <comment>RealMedia Metafile</comment>
+ <comment xml:lang="ar">ملف تعريف RealMedia</comment>
+ <comment xml:lang="be@latin">Metafajł RealMedia</comment>
+ <comment xml:lang="bg">Метафайл — RealMedia</comment>
+ <comment xml:lang="ca">metafitxer RealMedia</comment>
+ <comment xml:lang="cs">RealMedia Metafile</comment>
+ <comment xml:lang="da">RealMedia-metafil</comment>
+ <comment xml:lang="de">RealMedia-Metadatei</comment>
+ <comment xml:lang="es">metarchivo RealMedia</comment>
+ <comment xml:lang="eu">RealMedia metafitxategia</comment>
+ <comment xml:lang="fi">RealMedia-metatiedosto</comment>
+ <comment xml:lang="fo">RealMedia metafíla</comment>
+ <comment xml:lang="fr">métafichier RealMedia</comment>
+ <comment xml:lang="ga">meiteachomhad RealMedia</comment>
+ <comment xml:lang="gl">Metaficheiro RealMedia</comment>
+ <comment xml:lang="he">קובץ מטא של RealMedia</comment>
+ <comment xml:lang="hu">RealMedia metafájl</comment>
+ <comment xml:lang="id">RealMedia Metafile</comment>
+ <comment xml:lang="it">Metafile RealMedia</comment>
+ <comment xml:lang="ja">RealMedia メタファイル</comment>
+ <comment xml:lang="kk">RealMedia метафайлы</comment>
+ <comment xml:lang="ko">RealMedia 메타파일</comment>
+ <comment xml:lang="lt">RealMedia metafailas</comment>
+ <comment xml:lang="lv">RealMedia metafails</comment>
+ <comment xml:lang="nb">RealMedia-metafil</comment>
+ <comment xml:lang="nl">RealMedia-metabestand</comment>
+ <comment xml:lang="nn">RealMedia-metafil</comment>
+ <comment xml:lang="pl">Metaplik RealMedia</comment>
+ <comment xml:lang="pt_BR">Meta arquivo do RealMedia</comment>
+ <comment xml:lang="ro">Metafișier RealMedia</comment>
+ <comment xml:lang="ru">мета-файл RealMedia</comment>
+ <comment xml:lang="sk">RealMedia Metafile</comment>
+ <comment xml:lang="sl">Metadatoteka RealMedia</comment>
+ <comment xml:lang="sq">Metafile RealMedia</comment>
+ <comment xml:lang="sv">RealMedia-metafil</comment>
+ <comment xml:lang="uk">метафайл RealMedia</comment>
+ <comment xml:lang="vi">Siêu tập tin RealMedia</comment>
+ <comment xml:lang="zh_CN">RealMedia 元文件</comment>
+ <comment xml:lang="zh_TW">RealMedia 中介檔</comment>
+ <glob pattern="*.ram"/>
+ </mime-type>
+ <mime-type type="video/vnd.rn-realvideo">
+ <comment>RealVideo document</comment>
+ <comment xml:lang="ar">مستند RealVideo</comment>
+ <comment xml:lang="be@latin">Dakument RealVideo</comment>
+ <comment xml:lang="bg">Документ — RealVideo</comment>
+ <comment xml:lang="ca">document RealVideo</comment>
+ <comment xml:lang="cs">Dokument RealVideo</comment>
+ <comment xml:lang="da">RealAudio-dokument</comment>
+ <comment xml:lang="de">RealVideo-Dokument</comment>
+ <comment xml:lang="en_GB">RealVideo document</comment>
+ <comment xml:lang="eo">RealVideo-dokumento</comment>
+ <comment xml:lang="es">documento RealVideo</comment>
+ <comment xml:lang="eu">RealVideo dokumentua</comment>
+ <comment xml:lang="fi">RealVideo-asiakirja</comment>
+ <comment xml:lang="fo">RealVideo skjal</comment>
+ <comment xml:lang="fr">document RealVideo</comment>
+ <comment xml:lang="ga">cáipéis RealVideo</comment>
+ <comment xml:lang="gl">documento RealVideo</comment>
+ <comment xml:lang="he">מסמך של RealVideo</comment>
+ <comment xml:lang="hu">RealVideo dokumentum</comment>
+ <comment xml:lang="id">Dokumen RealVideo</comment>
+ <comment xml:lang="it">Documento RealVideo</comment>
+ <comment xml:lang="ja">RealVideo ドキュメント</comment>
+ <comment xml:lang="kk">RealVideo құжаты</comment>
+ <comment xml:lang="ko">RealVideo 문서</comment>
+ <comment xml:lang="lt">RealVideo dokumentas</comment>
+ <comment xml:lang="lv">RealVideo dokuments</comment>
+ <comment xml:lang="nb">RealAudio-dokument</comment>
+ <comment xml:lang="nl">RealVideo-document</comment>
+ <comment xml:lang="nn">RealVideo-dokument</comment>
+ <comment xml:lang="pl">Dokument RealVideo</comment>
+ <comment xml:lang="pt_BR">Documento RealVideo</comment>
+ <comment xml:lang="ro">Document RealVideo</comment>
+ <comment xml:lang="ru">документ RealVideo</comment>
+ <comment xml:lang="sk">Dokument RealVideo</comment>
+ <comment xml:lang="sl">Video datoteka RealVideo</comment>
+ <comment xml:lang="sq">Dokument RealVideo</comment>
+ <comment xml:lang="sv">RealVideo-dokument</comment>
+ <comment xml:lang="uk">документ RealVideo</comment>
+ <comment xml:lang="vi">Tài liệu ảnh động RealVideo</comment>
+ <comment xml:lang="zh_CN">RealAudio 文档</comment>
+ <comment xml:lang="zh_TW">RealVideo 文件</comment>
+ <glob pattern="*.rv"/>
+ <glob pattern="*.rvx"/>
+ <alias type="video/x-real-video"/>
+ </mime-type>
+ <mime-type type="application/vnd.rn-realmedia">
+ <comment>RealMedia document</comment>
+ <comment xml:lang="ar">مستند RealMedia</comment>
+ <comment xml:lang="be@latin">Dakument RealMedia</comment>
+ <comment xml:lang="bg">Документ — RealMedia</comment>
+ <comment xml:lang="ca">document RealMedia</comment>
+ <comment xml:lang="cs">Dokument RealMedia</comment>
+ <comment xml:lang="da">RealMedia-dokument</comment>
+ <comment xml:lang="de">RealMedia-Dokument</comment>
+ <comment xml:lang="en_GB">RealMedia document</comment>
+ <comment xml:lang="eo">RealMedia-dokumento</comment>
+ <comment xml:lang="es">documento RealMedia</comment>
+ <comment xml:lang="eu">RealMedia dokumentua</comment>
+ <comment xml:lang="fi">RealMedia-asiakirja</comment>
+ <comment xml:lang="fo">RealMedia skjal</comment>
+ <comment xml:lang="fr">document RealMedia</comment>
+ <comment xml:lang="ga">cáipéis RealMedia</comment>
+ <comment xml:lang="gl">documento RealMedia</comment>
+ <comment xml:lang="he">מסמך של RealMedia</comment>
+ <comment xml:lang="hu">RealMedia dokumentum</comment>
+ <comment xml:lang="id">Dokumen RealMedia</comment>
+ <comment xml:lang="it">Documento RealMedia</comment>
+ <comment xml:lang="ja">RealMedia ドキュメント</comment>
+ <comment xml:lang="kk">RealMedia құжаты</comment>
+ <comment xml:lang="ko">RealMedia 문서</comment>
+ <comment xml:lang="lt">RealMedia dokumentas</comment>
+ <comment xml:lang="lv">RealMedia dokuments</comment>
+ <comment xml:lang="nb">RealMedia-dokument</comment>
+ <comment xml:lang="nl">RealMedia-document</comment>
+ <comment xml:lang="nn">RealMedia-dokument</comment>
+ <comment xml:lang="pl">Dokument RealMedia</comment>
+ <comment xml:lang="pt_BR">Documento RealMedia</comment>
+ <comment xml:lang="ro">Document RealMedia</comment>
+ <comment xml:lang="ru">документ RealMedia</comment>
+ <comment xml:lang="sk">Dokument RealMedia</comment>
+ <comment xml:lang="sl">Dokument RealMedia</comment>
+ <comment xml:lang="sq">Dokument RealMedia</comment>
+ <comment xml:lang="sv">RealMedia-dokument</comment>
+ <comment xml:lang="uk">документ RealMedia</comment>
+ <comment xml:lang="vi">Tài liệu RealMedia</comment>
+ <comment xml:lang="zh_CN">RealMedia 文档</comment>
+ <comment xml:lang="zh_TW">RealMedia 文件</comment>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+ <match value=".RMF" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.rm"/>
+ <glob pattern="*.rmj"/>
+ <glob pattern="*.rmm"/>
+ <glob pattern="*.rms"/>
+ <glob pattern="*.rmx"/>
+ <glob pattern="*.rmvb"/>
+ </mime-type>
+ <mime-type type="image/vnd.rn-realpix">
+ <comment>RealPix document</comment>
+ <comment xml:lang="ar">مستند RealPix</comment>
+ <comment xml:lang="be@latin">Dakument RealPix</comment>
+ <comment xml:lang="bg">Документ — RealPix</comment>
+ <comment xml:lang="ca">document RealPix</comment>
+ <comment xml:lang="cs">Dokument RealPix</comment>
+ <comment xml:lang="da">RealPix-dokument</comment>
+ <comment xml:lang="de">RealPix-Dokument</comment>
+ <comment xml:lang="en_GB">RealPix document</comment>
+ <comment xml:lang="eo">RealPix-dokumento</comment>
+ <comment xml:lang="es">documento RealPix</comment>
+ <comment xml:lang="eu">RealPix dokumentua</comment>
+ <comment xml:lang="fi">RealPix-asiakirja</comment>
+ <comment xml:lang="fo">RealPix skjal</comment>
+ <comment xml:lang="fr">document RealPix</comment>
+ <comment xml:lang="ga">cáipéis RealPix</comment>
+ <comment xml:lang="gl">documento RealPix</comment>
+ <comment xml:lang="he">מסמך של RealPix</comment>
+ <comment xml:lang="hu">RealPix dokumentum</comment>
+ <comment xml:lang="id">Dokumen RealPix</comment>
+ <comment xml:lang="it">Documento RealPix</comment>
+ <comment xml:lang="ja">RealPix ドキュメント</comment>
+ <comment xml:lang="kk">RealPix құжаты</comment>
+ <comment xml:lang="ko">RealPix 문서</comment>
+ <comment xml:lang="lt">RealPix dokumentas</comment>
+ <comment xml:lang="lv">RealPix dokuments</comment>
+ <comment xml:lang="nb">RealPix-dokument</comment>
+ <comment xml:lang="nl">RealPix-document</comment>
+ <comment xml:lang="nn">RealPix-dokument</comment>
+ <comment xml:lang="pl">Dokument RealPix</comment>
+ <comment xml:lang="pt_BR">Documento RealPix</comment>
+ <comment xml:lang="ro">Document RealPix</comment>
+ <comment xml:lang="ru">документ RealPix</comment>
+ <comment xml:lang="sk">Dokument RealPix</comment>
+ <comment xml:lang="sl">Dokument RealPix</comment>
+ <comment xml:lang="sq">Dokument RealPix</comment>
+ <comment xml:lang="sv">RealPix-dokument</comment>
+ <comment xml:lang="uk">документ RealPix</comment>
+ <comment xml:lang="vi">Tài liệu ảnh RealPix</comment>
+ <comment xml:lang="zh_CN">RealPix 文档</comment>
+ <comment xml:lang="zh_TW">RealPix 文件</comment>
+ <glob pattern="*.rp"/>
+ </mime-type>
+ <mime-type type="text/vnd.rn-realtext">
+ <comment>RealText document</comment>
+ <comment xml:lang="ar">مستند RealText</comment>
+ <comment xml:lang="be@latin">Dakument RealText</comment>
+ <comment xml:lang="bg">Документ — RealText</comment>
+ <comment xml:lang="ca">document RealText</comment>
+ <comment xml:lang="cs">Dokument RealText</comment>
+ <comment xml:lang="da">RealText-dokument</comment>
+ <comment xml:lang="de">RealText-Dokument</comment>
+ <comment xml:lang="en_GB">RealText document</comment>
+ <comment xml:lang="eo">RealText-dokumento</comment>
+ <comment xml:lang="es">documento RealText</comment>
+ <comment xml:lang="eu">RealText dokumentua</comment>
+ <comment xml:lang="fi">RealText-asiakirja</comment>
+ <comment xml:lang="fo">RealText skjal</comment>
+ <comment xml:lang="fr">document RealText</comment>
+ <comment xml:lang="ga">cáipéis RealText</comment>
+ <comment xml:lang="gl">documento RealText</comment>
+ <comment xml:lang="he">מסמך של RealText</comment>
+ <comment xml:lang="hu">RealText dokumentum</comment>
+ <comment xml:lang="id">Dokumen RealText</comment>
+ <comment xml:lang="it">Documento RealText</comment>
+ <comment xml:lang="ja">RealText ドキュメント</comment>
+ <comment xml:lang="kk">RealText құжаты</comment>
+ <comment xml:lang="ko">RealText 문서</comment>
+ <comment xml:lang="lt">RealText dokumentas</comment>
+ <comment xml:lang="lv">RealText dokuments</comment>
+ <comment xml:lang="nb">RealText-dokument</comment>
+ <comment xml:lang="nl">RealText-document</comment>
+ <comment xml:lang="nn">RealText-dokument</comment>
+ <comment xml:lang="pl">Dokument RealText</comment>
+ <comment xml:lang="pt_BR">Documento RealText</comment>
+ <comment xml:lang="ro">Document RealText</comment>
+ <comment xml:lang="ru">документ RealText</comment>
+ <comment xml:lang="sk">Dokument RealText</comment>
+ <comment xml:lang="sl">Dokument RealText</comment>
+ <comment xml:lang="sq">Dokument RealText</comment>
+ <comment xml:lang="sv">RealText-dokument</comment>
+ <comment xml:lang="uk">документ RealText</comment>
+ <comment xml:lang="vi">Tài liệu văn bản RealText</comment>
+ <comment xml:lang="zh_CN">RealText 文档</comment>
+ <comment xml:lang="zh_TW">RealText 文件</comment>
+ <glob pattern="*.rt"/>
+ </mime-type>
+ <mime-type type="audio/x-riff">
+ <comment>RIFF audio</comment>
+ <comment xml:lang="ar">RIFF سمعي</comment>
+ <comment xml:lang="az">RIFF audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo RIFF</comment>
+ <comment xml:lang="bg">Аудио — RIFF</comment>
+ <comment xml:lang="ca">àudio RIFF</comment>
+ <comment xml:lang="cs">Zvuk RIFF</comment>
+ <comment xml:lang="cy">Sain RIFF</comment>
+ <comment xml:lang="da">RIFF-lyd</comment>
+ <comment xml:lang="de">RIFF-Audio</comment>
+ <comment xml:lang="el">ήχος RIFF</comment>
+ <comment xml:lang="en_GB">RIFF audio</comment>
+ <comment xml:lang="eo">RIFF-sondosiero</comment>
+ <comment xml:lang="es">sonido RIFF</comment>
+ <comment xml:lang="eu">RIFF audioa</comment>
+ <comment xml:lang="fi">RIFF-ääni</comment>
+ <comment xml:lang="fo">RIFF ljóð</comment>
+ <comment xml:lang="fr">audio RIFF</comment>
+ <comment xml:lang="ga">fuaim RIFF</comment>
+ <comment xml:lang="gl">son RIFF</comment>
+ <comment xml:lang="he">שמע RIFF</comment>
+ <comment xml:lang="hu">RIFF-kép</comment>
+ <comment xml:lang="id">Audio RIFF</comment>
+ <comment xml:lang="it">Audio RIFF</comment>
+ <comment xml:lang="ja">RIFF オーディオ</comment>
+ <comment xml:lang="kk">RIFF аудиосы</comment>
+ <comment xml:lang="ko">RIFF 오디오</comment>
+ <comment xml:lang="lt">RIFF garso įrašas</comment>
+ <comment xml:lang="lv">RIFF audio</comment>
+ <comment xml:lang="ms">Audio RIFF</comment>
+ <comment xml:lang="nb">RIFF-lyd</comment>
+ <comment xml:lang="nl">RIFF-audio</comment>
+ <comment xml:lang="nn">RIFF-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy RIFF</comment>
+ <comment xml:lang="pt">áudio RIFF</comment>
+ <comment xml:lang="pt_BR">Áudio RIFF</comment>
+ <comment xml:lang="ro">Audio RIFF</comment>
+ <comment xml:lang="ru">аудио RIFF</comment>
+ <comment xml:lang="sk">Zvuk RIFF</comment>
+ <comment xml:lang="sl">Zvočna datoteka RIFF</comment>
+ <comment xml:lang="sq">Audio RIFF</comment>
+ <comment xml:lang="sr">RIFF звучни запис</comment>
+ <comment xml:lang="sv">RIFF-ljud</comment>
+ <comment xml:lang="uk">звук RIFF</comment>
+ <comment xml:lang="vi">Âm thanh RIFF</comment>
+ <comment xml:lang="zh_CN">RIFF 音频</comment>
+ <comment xml:lang="zh_TW">RIFF 音訊</comment>
+
+ <magic priority="45">
+ <match value="RIFF" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="audio/x-s3m">
+ <comment>Scream Tracker 3 audio</comment>
+ <comment xml:lang="ar">Scream Tracker 3 سمعي</comment>
+ <comment xml:lang="az">Scream Tracker 3 audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Scream Tracker 3</comment>
+ <comment xml:lang="bg">Аудио — Scream Tracker 3</comment>
+ <comment xml:lang="ca">àudio de Scream Tracker 3</comment>
+ <comment xml:lang="cs">Skladba Scream Tracker 3</comment>
+ <comment xml:lang="cy">Sain Scream Tracker 3</comment>
+ <comment xml:lang="da">Scream Tracker 3-lyd</comment>
+ <comment xml:lang="de">Scream-Tracker-3-Audio</comment>
+ <comment xml:lang="el">ήχος Scream Tracker 3</comment>
+ <comment xml:lang="en_GB">Scream Tracker 3 audio</comment>
+ <comment xml:lang="eo">Sondosiero de Scream Tracker 3</comment>
+ <comment xml:lang="es">sonido Scream Tracker 3</comment>
+ <comment xml:lang="eu">Scream Tracker 3 audioa</comment>
+ <comment xml:lang="fi">Scream Tracker 3 -ääni</comment>
+ <comment xml:lang="fo">Scream Tracker 3 ljóður</comment>
+ <comment xml:lang="fr">audio Scream Tracker 3</comment>
+ <comment xml:lang="ga">fuaim Scream Tracker 3</comment>
+ <comment xml:lang="gl">son Scream Tracker 3</comment>
+ <comment xml:lang="he">שמע של Scream Tracker 3</comment>
+ <comment xml:lang="hu">Scream Tracker 3 hang</comment>
+ <comment xml:lang="id">Audio Scream Tracker 3</comment>
+ <comment xml:lang="it">Audio Scream Tracker 3</comment>
+ <comment xml:lang="ja">Scream Tracker 3 オーディオ</comment>
+ <comment xml:lang="kk">Scream Tracker 3 аудиосы</comment>
+ <comment xml:lang="ko">Scream Tracker 3 오디오</comment>
+ <comment xml:lang="lt">Scream Tracker 3 garso įrašas</comment>
+ <comment xml:lang="lv">Scream Tracker 3 audio</comment>
+ <comment xml:lang="ms">Audio Scream Tracker 3</comment>
+ <comment xml:lang="nb">Scream Tracker 3-lyd</comment>
+ <comment xml:lang="nl">Scream Tracker 3-audio</comment>
+ <comment xml:lang="nn">Sream Tracker 3 lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Scream Tracker 3</comment>
+ <comment xml:lang="pt">áudio Scream Tracker 3</comment>
+ <comment xml:lang="pt_BR">Áudio Scream Tracker 3</comment>
+ <comment xml:lang="ro">Audio Scream Tracker 3</comment>
+ <comment xml:lang="ru">аудио Scream Tracker 3</comment>
+ <comment xml:lang="sk">Skladba Scream Tracker 3</comment>
+ <comment xml:lang="sl">Zvočna datoteka Scream Tracker 3</comment>
+ <comment xml:lang="sq">Audio Scream Tracker 3</comment>
+ <comment xml:lang="sr">Scream Tracker 3 звучни запис</comment>
+ <comment xml:lang="sv">Scream Tracker 3-ljud</comment>
+ <comment xml:lang="uk">звук Scream Tracker 3</comment>
+ <comment xml:lang="vi">Âm thanh Scream Tracker 3</comment>
+ <comment xml:lang="zh_CN">Scheme Tracker 3 音频</comment>
+ <comment xml:lang="zh_TW">Scream Tracker 3 音訊</comment>
+ <magic priority="50">
+ <match value="SCRM" type="string" offset="44"/>
+ </magic>
+ <glob pattern="*.s3m"/>
+ </mime-type>
+ <mime-type type="audio/x-scpls">
+ <comment>MP3 ShoutCast playlist</comment>
+ <comment xml:lang="ar">قائمة تشغيل MP3 ShoutCast</comment>
+ <comment xml:lang="be@latin">Śpis piesień dla tranślacyi MP3</comment>
+ <comment xml:lang="bg">Списък за изпълнение — MP3 ShoutCast</comment>
+ <comment xml:lang="ca">llista de reproducció MP3 ShoutCast</comment>
+ <comment xml:lang="cs">Seznam skladeb MP3 ShoutCast</comment>
+ <comment xml:lang="da">MP3 ShoutCast-afspilningsliste</comment>
+ <comment xml:lang="de">MP3-ShoutCast-Wiedergabeliste</comment>
+ <comment xml:lang="el">Λίστα αναπαραγωγής MP3 ShoutCast</comment>
+ <comment xml:lang="en_GB">MP3 ShoutCast playlist</comment>
+ <comment xml:lang="eo">MP3-ludlisto de ShoutCast</comment>
+ <comment xml:lang="es">lista de reproducción MP3 ShoutCast</comment>
+ <comment xml:lang="eu">MP3 ShoutCast erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">MP3 ShoutCast -soittolista</comment>
+ <comment xml:lang="fo">MP3 ShoutCast avspælingarlisti</comment>
+ <comment xml:lang="fr">liste de lecture MP3 ShoutCast</comment>
+ <comment xml:lang="ga">seinmliosta MP3 ShoutCast</comment>
+ <comment xml:lang="gl">lista de reprodución MP3 de ShoutCast</comment>
+ <comment xml:lang="he">רשימת השמעה MP3 של ShoutCast</comment>
+ <comment xml:lang="hu">MP3 ShoutCast-lejátszólista</comment>
+ <comment xml:lang="id">Senarai putar MP3 ShoutCast</comment>
+ <comment xml:lang="it">Scaletta MP3 ShoutCast</comment>
+ <comment xml:lang="ja">MP3 ShoutCast 再生リスト</comment>
+ <comment xml:lang="kk">MP3 ShoutCast ойнау тізімі</comment>
+ <comment xml:lang="ko">MP3 ShoutCast 재생 목록</comment>
+ <comment xml:lang="lt">MP3 ShoutCast grojaraštis</comment>
+ <comment xml:lang="lv">MP3 ShoutCast repertuārs</comment>
+ <comment xml:lang="ms">Senaraimain ShoutCast MP3</comment>
+ <comment xml:lang="nb">MP3 ShoutCast-spilleliste</comment>
+ <comment xml:lang="nl">MP3 ShoutCast-afspeellijst</comment>
+ <comment xml:lang="nn">MP3 ShoutCast-speleliste</comment>
+ <comment xml:lang="pl">Lista odtwarzania MP3 ShoutCast</comment>
+ <comment xml:lang="pt">lista de reprodução MP3 ShoutCast</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução MP3 ShoutCast</comment>
+ <comment xml:lang="ro">Listă MP3 ShoutCast</comment>
+ <comment xml:lang="ru">список воспроизведения MP3 ShoutCast</comment>
+ <comment xml:lang="sk">Zoznam skladieb MP3 ShoutCast</comment>
+ <comment xml:lang="sl">Seznam predvajanja MP3 ShoutCast</comment>
+ <comment xml:lang="sq">Listë titujsh MP3 ShoutCast</comment>
+ <comment xml:lang="sr">MP3 ShoutCast списак песама</comment>
+ <comment xml:lang="sv">MP3 ShoutCast-spellista</comment>
+ <comment xml:lang="uk">список програвання MP3 ShoutCast</comment>
+ <comment xml:lang="vi">Danh mục nhạc MP3 ShoutCast</comment>
+ <comment xml:lang="zh_CN">MP3 ShoutCast 播放列表</comment>
+ <comment xml:lang="zh_TW">MP3 ShoutCast 播放清單</comment>
+ <alias type="application/pls"/>
+ <magic priority="50">
+ <match value="[playlist]" type="string" offset="0"/>
+ <match value="[Playlist]" type="string" offset="0"/>
+ <match value="[PLAYLIST]" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.pls"/>
+ </mime-type>
+ <mime-type type="audio/x-stm">
+ <comment>Scream Tracker audio</comment>
+ <comment xml:lang="ar">Scream Tracker سمعي</comment>
+ <comment xml:lang="az">Scream Tracker audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Scream Tracker</comment>
+ <comment xml:lang="bg">Аудио — Scream Tracker</comment>
+ <comment xml:lang="ca">àudio de Scream Tracker</comment>
+ <comment xml:lang="cs">Skladba Scream Tracker</comment>
+ <comment xml:lang="cy">Sain Scream Tracker</comment>
+ <comment xml:lang="da">Scream Tracker-lyd</comment>
+ <comment xml:lang="de">Scream-Tracker-Audio</comment>
+ <comment xml:lang="el">ήχος Scream Tracker</comment>
+ <comment xml:lang="en_GB">Scream Tracker audio</comment>
+ <comment xml:lang="eo">Sondosiero de Scream Tracker</comment>
+ <comment xml:lang="es">sonido Scream Tracker</comment>
+ <comment xml:lang="eu">Scream Tracker audioa</comment>
+ <comment xml:lang="fi">Scream Tracker -ääni</comment>
+ <comment xml:lang="fo">Scream Tracker ljóður</comment>
+ <comment xml:lang="fr">audio Scream Tracker</comment>
+ <comment xml:lang="ga">fuaim Scream Tracker</comment>
+ <comment xml:lang="gl">son Scream Tracker</comment>
+ <comment xml:lang="he">שמע של Scream Tracker</comment>
+ <comment xml:lang="hu">Scream Tracker hang</comment>
+ <comment xml:lang="id">Audio Scream Tracker</comment>
+ <comment xml:lang="it">Audio Scream Tracker</comment>
+ <comment xml:lang="ja">Scream Tracker オーディオ</comment>
+ <comment xml:lang="kk">Scream Tracker аудиосы</comment>
+ <comment xml:lang="ko">Scream Tracker 오디오</comment>
+ <comment xml:lang="lt">Scream Tracker garso įrašas</comment>
+ <comment xml:lang="lv">Scream Tracker audio</comment>
+ <comment xml:lang="ms">Audio Scream Tracker</comment>
+ <comment xml:lang="nb">Scream Tracker-lyd</comment>
+ <comment xml:lang="nl">Scream Tracker-audio</comment>
+ <comment xml:lang="nn">Scream Tracker lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Scream Tracker</comment>
+ <comment xml:lang="pt">áudio Scream Tracker</comment>
+ <comment xml:lang="pt_BR">Áudio Scream Tracker</comment>
+ <comment xml:lang="ro">Audio Scream Tracker</comment>
+ <comment xml:lang="ru">аудио Scream Tracker</comment>
+ <comment xml:lang="sk">Skladba Scream Tracker</comment>
+ <comment xml:lang="sl">Zvočna datoteka Scream Tracker</comment>
+ <comment xml:lang="sq">Audio Scream Tracker</comment>
+ <comment xml:lang="sr">Scream Tracker звучни запис</comment>
+ <comment xml:lang="sv">Scream Tracker-ljud</comment>
+ <comment xml:lang="uk">звук Scream Tracker</comment>
+ <comment xml:lang="vi">Âm thanh Scream Tracker</comment>
+ <comment xml:lang="zh_CN">Scream Tracker 音频</comment>
+ <comment xml:lang="zh_TW">Scream Tracker 音訊</comment>
+ <magic>
+ <match value="!Scream!\x1A" type="string" offset="20"/>
+ <match value="!SCREAM!\x1A" type="string" offset="20"/>
+ <match value="BMOD2STM\x1A" type="string" offset="20"/>
+ </magic>
+ <glob pattern="*.stm"/>
+ </mime-type>
+ <mime-type type="audio/x-voc">
+ <comment>VOC audio</comment>
+ <comment xml:lang="ar">VOC سمعي</comment>
+ <comment xml:lang="az">VOC audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo VOC</comment>
+ <comment xml:lang="bg">Аудио — VOC</comment>
+ <comment xml:lang="ca">àudio VOC</comment>
+ <comment xml:lang="cs">Zvuk VOC</comment>
+ <comment xml:lang="cy">Sain VOC</comment>
+ <comment xml:lang="da">VOC-lyd</comment>
+ <comment xml:lang="de">VOC-Audio</comment>
+ <comment xml:lang="el">ήχος VOC</comment>
+ <comment xml:lang="en_GB">VOC audio</comment>
+ <comment xml:lang="eo">VOC-sondosiero</comment>
+ <comment xml:lang="es">sonido VOC</comment>
+ <comment xml:lang="eu">VOC audioa</comment>
+ <comment xml:lang="fi">VOC-ääni</comment>
+ <comment xml:lang="fo">VOC ljóður</comment>
+ <comment xml:lang="fr">audio VOC</comment>
+ <comment xml:lang="ga">fuaim VOC</comment>
+ <comment xml:lang="gl">son VOC</comment>
+ <comment xml:lang="he">שמע VOC</comment>
+ <comment xml:lang="hu">VOC hang</comment>
+ <comment xml:lang="id">Audio VOC</comment>
+ <comment xml:lang="it">Audio VOC</comment>
+ <comment xml:lang="ja">VOC オーディオ</comment>
+ <comment xml:lang="kk">VOC аудиосы</comment>
+ <comment xml:lang="ko">VOC 오디오</comment>
+ <comment xml:lang="lt">VOC garso įrašas</comment>
+ <comment xml:lang="lv">VOC audio</comment>
+ <comment xml:lang="ms">Audio VOC</comment>
+ <comment xml:lang="nb">VOC-lyd</comment>
+ <comment xml:lang="nl">VOC-audio</comment>
+ <comment xml:lang="nn">VOC-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy VOC</comment>
+ <comment xml:lang="pt">áudio VOC</comment>
+ <comment xml:lang="pt_BR">Áudio VOC</comment>
+ <comment xml:lang="ro">Audio VOC</comment>
+ <comment xml:lang="ru">аудио VOC</comment>
+ <comment xml:lang="sk">Zvuk VOC</comment>
+ <comment xml:lang="sl">Zvočna datoteka VOC</comment>
+ <comment xml:lang="sq">Audio VOC</comment>
+ <comment xml:lang="sr">VOC звучни запис</comment>
+ <comment xml:lang="sv">VOC-ljud</comment>
+ <comment xml:lang="uk">звук VOC</comment>
+ <comment xml:lang="vi">Âm thanh VOC</comment>
+ <comment xml:lang="zh_CN">VOC 音频</comment>
+ <comment xml:lang="zh_TW">VOC 音訊</comment>
+ <glob pattern="*.voc"/>
+ </mime-type>
+ <mime-type type="audio/x-wav">
+ <comment>WAV audio</comment>
+ <comment xml:lang="ar">WAV سمعي</comment>
+ <comment xml:lang="az">WAV audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo WAV</comment>
+ <comment xml:lang="bg">Аудио — WAV</comment>
+ <comment xml:lang="ca">àudio WAV</comment>
+ <comment xml:lang="cs">Zvuk WAV</comment>
+ <comment xml:lang="cy">Sain WAV</comment>
+ <comment xml:lang="da">WAV-lyd</comment>
+ <comment xml:lang="de">WAV-Audio</comment>
+ <comment xml:lang="el">ήχος WAV</comment>
+ <comment xml:lang="en_GB">WAV audio</comment>
+ <comment xml:lang="eo">WAV-sonkodo</comment>
+ <comment xml:lang="es">sonido WAV</comment>
+ <comment xml:lang="eu">WAV audioa</comment>
+ <comment xml:lang="fi">WAV-ääni</comment>
+ <comment xml:lang="fo">WAV ljóður</comment>
+ <comment xml:lang="fr">audio WAV</comment>
+ <comment xml:lang="ga">fuaim WAV</comment>
+ <comment xml:lang="gl">son WAV</comment>
+ <comment xml:lang="he">שמע WAV</comment>
+ <comment xml:lang="hu">WAV hang</comment>
+ <comment xml:lang="id">Audio WAV</comment>
+ <comment xml:lang="it">Audio WAV</comment>
+ <comment xml:lang="ja">WAV オーディオ</comment>
+ <comment xml:lang="kk">WAV аудиосы</comment>
+ <comment xml:lang="ko">WAV 오디오</comment>
+ <comment xml:lang="lt">WAV garso įrašas</comment>
+ <comment xml:lang="lv">WAV audio</comment>
+ <comment xml:lang="ms">Audio VOC</comment>
+ <comment xml:lang="nb">WAV-lyd</comment>
+ <comment xml:lang="nl">WAV-audio</comment>
+ <comment xml:lang="nn">WAV-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy WAV</comment>
+ <comment xml:lang="pt">áudio WAV</comment>
+ <comment xml:lang="pt_BR">Áudio WAV</comment>
+ <comment xml:lang="ro">Audio WAV</comment>
+ <comment xml:lang="ru">аудио WAV</comment>
+ <comment xml:lang="sk">Zvuk WAV</comment>
+ <comment xml:lang="sl">Zvočna datoteka WAV</comment>
+ <comment xml:lang="sq">Audio WAV</comment>
+ <comment xml:lang="sr">WAV звучни запис</comment>
+ <comment xml:lang="sv">WAV-ljud</comment>
+ <comment xml:lang="uk">звук WAV</comment>
+ <comment xml:lang="vi">Âm thanh WAV</comment>
+ <comment xml:lang="zh_CN">WAV 音频</comment>
+ <comment xml:lang="zh_TW">WAV 音訊</comment>
+ <alias type="audio/wav"/>
+ <alias type="audio/vnd.wave"/>
+ <magic priority="50">
+ <match value="WAVE" type="string" offset="8"/>
+ <match value="WAV " type="string" offset="8"/>
+ </magic>
+ <glob pattern="*.wav"/>
+ </mime-type>
+ <mime-type type="audio/x-xi">
+ <comment>Scream Tracker instrument</comment>
+ <comment xml:lang="ar">آلة Scream Tracker</comment>
+ <comment xml:lang="az">Scream Tracker instrumenti</comment>
+ <comment xml:lang="be@latin">Instrument Scream Tracker</comment>
+ <comment xml:lang="bg">Инструмент — Scream Tracker</comment>
+ <comment xml:lang="ca">instrument de Scream Tracker</comment>
+ <comment xml:lang="cs">Nástroj pro Scream Tracker</comment>
+ <comment xml:lang="cy">Offeryn Scream Tracker</comment>
+ <comment xml:lang="da">Scream Tracker-instrument</comment>
+ <comment xml:lang="de">Scream-Tracker-Instrument</comment>
+ <comment xml:lang="el">μουσικό όργανο Scream Tracker</comment>
+ <comment xml:lang="en_GB">Scream Tracker instrument</comment>
+ <comment xml:lang="eo">instrumento de Scream Tracker</comment>
+ <comment xml:lang="es">instrumento Scream Tracker</comment>
+ <comment xml:lang="eu">Scream Tracker instrumentua</comment>
+ <comment xml:lang="fi">Scream Tracker -soitin</comment>
+ <comment xml:lang="fo">Scream Tracker ljóðføri</comment>
+ <comment xml:lang="fr">instrument Scream Tracker</comment>
+ <comment xml:lang="ga">ionstraim Scream Tracker</comment>
+ <comment xml:lang="gl">Instrumento Scream Tracker</comment>
+ <comment xml:lang="he">כלי של Scream Tracker</comment>
+ <comment xml:lang="hu">Scream Tracker hangszer</comment>
+ <comment xml:lang="id">Instrumen Scream Tracker</comment>
+ <comment xml:lang="it">Strumento Scream Tracker</comment>
+ <comment xml:lang="ja">Scream Tracker インストゥルメント</comment>
+ <comment xml:lang="kk">Scream Tracker сайманы</comment>
+ <comment xml:lang="ko">Scream Tracker 악기</comment>
+ <comment xml:lang="lt">Scream Tracker instrumentas</comment>
+ <comment xml:lang="lv">Scream Tracker instrumenti</comment>
+ <comment xml:lang="ms">Instrumen Scream Tracker</comment>
+ <comment xml:lang="nb">Scream Tracker-instrument</comment>
+ <comment xml:lang="nl">Scream Tracker-instrument</comment>
+ <comment xml:lang="nn">Scream Tracker instrument</comment>
+ <comment xml:lang="pl">Instrument Scream Tracker</comment>
+ <comment xml:lang="pt">instrumento Scream Tracker</comment>
+ <comment xml:lang="pt_BR">Instrumento Scream Tracker</comment>
+ <comment xml:lang="ro">Instrument Scream Tracker</comment>
+ <comment xml:lang="ru">инструмент Scream Tracker</comment>
+ <comment xml:lang="sk">Nástroj pre Scream Tracker</comment>
+ <comment xml:lang="sl">Datoteka zvoka glasbila Scream Tracker</comment>
+ <comment xml:lang="sq">Instrument Scream Tracker</comment>
+ <comment xml:lang="sr">Scream Tracker инструмент</comment>
+ <comment xml:lang="sv">Scream Tracker-instrument</comment>
+ <comment xml:lang="uk">інструмент Scream Tracker</comment>
+ <comment xml:lang="vi">Nhạc khí Scream Tracker</comment>
+ <comment xml:lang="zh_CN">Scream Tracker 乐器</comment>
+ <comment xml:lang="zh_TW">Scream Tracker 樂器檔</comment>
+ <magic priority="50">
+ <match value="Extended Intrument:" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.xi"/>
+ </mime-type>
+ <mime-type type="audio/x-xm">
+ <comment>FastTracker II audio</comment>
+ <comment xml:lang="ar">FastTracker II سمعي</comment>
+ <comment xml:lang="az">FastTracker II audio faylı</comment>
+ <comment xml:lang="be@latin">Aŭdyjo FastTracker II</comment>
+ <comment xml:lang="bg">Аудио — FastTracker II</comment>
+ <comment xml:lang="ca">àudio de FastTracker II</comment>
+ <comment xml:lang="cs">Zvuk FastTracker II</comment>
+ <comment xml:lang="cy">Sain FastTracker II</comment>
+ <comment xml:lang="da">FastTracker II-lyd</comment>
+ <comment xml:lang="de">FastTracker-II-Audio</comment>
+ <comment xml:lang="el">ήχος FastTracker II</comment>
+ <comment xml:lang="en_GB">FastTracker II audio</comment>
+ <comment xml:lang="eo">Sondosiero de FastTracker II</comment>
+ <comment xml:lang="es">sonido FastTracker II</comment>
+ <comment xml:lang="eu">FastTracker II.ren audioa</comment>
+ <comment xml:lang="fi">FastTracker II -ääni</comment>
+ <comment xml:lang="fo">FastTracker II ljóður</comment>
+ <comment xml:lang="fr">audio FastTracker II</comment>
+ <comment xml:lang="ga">fuaim FastTracker II</comment>
+ <comment xml:lang="gl">son de FastTracker II</comment>
+ <comment xml:lang="he">שמע FastTracker II</comment>
+ <comment xml:lang="hu">FastTracker II hang</comment>
+ <comment xml:lang="id">Audio FastTracker II</comment>
+ <comment xml:lang="it">Audio FastTracker II</comment>
+ <comment xml:lang="ja">FastTracker II オーディオ</comment>
+ <comment xml:lang="kk">FastTracker II аудиосы</comment>
+ <comment xml:lang="ko">FastTracker II 오디오</comment>
+ <comment xml:lang="lt">FastTracker II garso įrašas</comment>
+ <comment xml:lang="lv">FastTracker II audio</comment>
+ <comment xml:lang="ms">Audio FastTracker II</comment>
+ <comment xml:lang="nb">FastTracker II-lyd</comment>
+ <comment xml:lang="nl">FastTracker II-audio</comment>
+ <comment xml:lang="nn">FastTracker II lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy FastTracker II</comment>
+ <comment xml:lang="pt">áudio FastTracker II</comment>
+ <comment xml:lang="pt_BR">Áudio FastTracker II</comment>
+ <comment xml:lang="ro">Audio FastTracker II</comment>
+ <comment xml:lang="ru">аудио FastTracker II</comment>
+ <comment xml:lang="sk">Zvuk FastTracker II</comment>
+ <comment xml:lang="sl">Zvočna datoteka FastTracker II</comment>
+ <comment xml:lang="sq">Audio FastTracker II</comment>
+ <comment xml:lang="sr">FastTracker II аудио запис</comment>
+ <comment xml:lang="sv">FastTracker II-ljud</comment>
+ <comment xml:lang="uk">звук FastTracker II</comment>
+ <comment xml:lang="vi">Âm thanh FastTracker II</comment>
+ <comment xml:lang="zh_CN">FastTracker II 音频</comment>
+ <comment xml:lang="zh_TW">FastTracker II 音訊</comment>
+ <magic priority="50">
+ <match value="Extended Module:" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.xm"/>
+ </mime-type>
+ <mime-type type="audio/x-tta">
+ <comment>TrueAudio audio</comment>
+ <comment xml:lang="ar">TrueAudio سمعي</comment>
+ <comment xml:lang="be@latin">Aŭdyjo TrueAudio</comment>
+ <comment xml:lang="bg">Аудио — TrueAudio</comment>
+ <comment xml:lang="ca">àudio TrueAudio</comment>
+ <comment xml:lang="cs">Zvuk TrueAudio</comment>
+ <comment xml:lang="da">TrueAudio-lyd</comment>
+ <comment xml:lang="de">TrueAudio-Audio</comment>
+ <comment xml:lang="eo">TrueAudio-sondosiero</comment>
+ <comment xml:lang="es">sonido TrueAudio</comment>
+ <comment xml:lang="eu">TrueAudio audioa</comment>
+ <comment xml:lang="fi">TrueAudio-ääni</comment>
+ <comment xml:lang="fo">TrueAudio ljóður</comment>
+ <comment xml:lang="fr">audio TrueAudio</comment>
+ <comment xml:lang="ga">fuaim TrueAudio</comment>
+ <comment xml:lang="gl">son Trueson</comment>
+ <comment xml:lang="he">שמע TrueAudio</comment>
+ <comment xml:lang="hu">TrueAudio hang</comment>
+ <comment xml:lang="id">Audio TrueAudio</comment>
+ <comment xml:lang="it">Audio TrueAudio</comment>
+ <comment xml:lang="ja">TrueAudio オーディオ</comment>
+ <comment xml:lang="kk">TrueAudio аудиосы</comment>
+ <comment xml:lang="ko">TrueAudio 오디오</comment>
+ <comment xml:lang="lt">TrueAudio garso įrašas</comment>
+ <comment xml:lang="lv">TrueAudio audio</comment>
+ <comment xml:lang="nb">TrueAudio-lyd</comment>
+ <comment xml:lang="nl">TrueAudio-audio</comment>
+ <comment xml:lang="nn">TrueAudio-lyd</comment>
+ <comment xml:lang="pl">Plik dźwiękowy TrueAudio</comment>
+ <comment xml:lang="pt_BR">Áudio TrueAudio</comment>
+ <comment xml:lang="ro">Audio TrueAudio</comment>
+ <comment xml:lang="ru">аудио TrueAudio</comment>
+ <comment xml:lang="sk">Zvuk TrueAudio</comment>
+ <comment xml:lang="sl">Zvočna datoteka TrueAudio</comment>
+ <comment xml:lang="sq">Audio TrueAudio</comment>
+ <comment xml:lang="sv">TrueAudio-ljud</comment>
+ <comment xml:lang="uk">звук TrueAudio</comment>
+ <comment xml:lang="vi">Âm thanh TrueAudio</comment>
+ <comment xml:lang="zh_CN">TrueAudio 音频</comment>
+ <comment xml:lang="zh_TW">TrueAudio 音訊</comment>
+ <alias type="audio/tta"/>
+ <magic priority="50">
+ <match value="TTA1" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.tta"/>
+ </mime-type>
+ <mime-type type="image/bmp">
+ <comment>Windows BMP image</comment>
+ <comment xml:lang="ar">صورة Windows BMP</comment>
+ <comment xml:lang="az">Windows BMP rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava Windows BMP</comment>
+ <comment xml:lang="bg">Изображение — Windows BMP</comment>
+ <comment xml:lang="ca">imatge BMP de Windows</comment>
+ <comment xml:lang="cs">Obrázek Windows BMP</comment>
+ <comment xml:lang="cy">Delwedd BMP Windows</comment>
+ <comment xml:lang="da">Windows BMP-billede</comment>
+ <comment xml:lang="de">Windows-BMP-Bild</comment>
+ <comment xml:lang="el">εικόνα Microsoft Windows BMP</comment>
+ <comment xml:lang="en_GB">Windows BMP image</comment>
+ <comment xml:lang="eo">BMP-bildo de Vindozo</comment>
+ <comment xml:lang="es">imagen BMP de Windows</comment>
+ <comment xml:lang="eu">Windows BMP irudia</comment>
+ <comment xml:lang="fi">Windows BMP -kuva</comment>
+ <comment xml:lang="fo">Windows BMP mynd</comment>
+ <comment xml:lang="fr">image Windows BMP</comment>
+ <comment xml:lang="ga">íomhá BMP Windows</comment>
+ <comment xml:lang="gl">imaxe BMP de Windows</comment>
+ <comment xml:lang="he">תמונת BMP של Windows</comment>
+ <comment xml:lang="hu">Windows BMP-kép</comment>
+ <comment xml:lang="id">Citra Windows BMP</comment>
+ <comment xml:lang="it">Immagine Windows BMP</comment>
+ <comment xml:lang="ja">Windows BMP 画像</comment>
+ <comment xml:lang="kk">Windows BMP суреті</comment>
+ <comment xml:lang="ko">윈도우 BMP 그림</comment>
+ <comment xml:lang="lt">Windows BMP paveikslėlis</comment>
+ <comment xml:lang="lv">Windows BMP attēls</comment>
+ <comment xml:lang="ms">Imej BMP Windows</comment>
+ <comment xml:lang="nb">Windows BMP-bilde</comment>
+ <comment xml:lang="nl">Windows BMP-afbeelding</comment>
+ <comment xml:lang="nn">Windows BMP-bilete</comment>
+ <comment xml:lang="pl">Obraz BMP Windows</comment>
+ <comment xml:lang="pt">imagem BMP Windows</comment>
+ <comment xml:lang="pt_BR">Imagem BMP do Windows</comment>
+ <comment xml:lang="ro">Imagine Windows BMP</comment>
+ <comment xml:lang="ru">изображение Windows BMP</comment>
+ <comment xml:lang="sk">Obrázok Windows BMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka Windows BMP</comment>
+ <comment xml:lang="sq">Figurë Windows BMP</comment>
+ <comment xml:lang="sr">Windows BMP слика</comment>
+ <comment xml:lang="sv">Windows BMP-bild</comment>
+ <comment xml:lang="uk">зображення Windows BMP</comment>
+ <comment xml:lang="vi">Ảnh BMP Windows</comment>
+ <comment xml:lang="zh_CN">Windows BMP 图像</comment>
+ <comment xml:lang="zh_TW">Windows BMP 影像</comment>
+ <magic priority="50">
+ <match value="BMxxxx\000\000" type="string" offset="0" mask="0xffff00000000ffff"/>
+ <match value="BM" type="string" offset="0">
+ <match value="12" type="byte" offset="14"/>
+ <match value="64" type="byte" offset="14"/>
+ <match value="40" type="byte" offset="14"/>
+ </match>
+ </magic>
+ <glob pattern="*.bmp"/>
+ <alias type="image/x-bmp"/>
+ <alias type="image/x-MS-bmp"/>
+ </mime-type>
+ <mime-type type="image/vnd.wap.wbmp">
+ <comment>WBMP image</comment>
+ <comment xml:lang="ar">صورة WBMP</comment>
+ <comment xml:lang="be@latin">Vyjava WBMP</comment>
+ <comment xml:lang="bg">Изображение — WBMP</comment>
+ <comment xml:lang="ca">imatge WBMP</comment>
+ <comment xml:lang="cs">Obrázek WBMP</comment>
+ <comment xml:lang="da">WBMP-billede</comment>
+ <comment xml:lang="de">WBMP-Bild</comment>
+ <comment xml:lang="eo">WBMP-bildo</comment>
+ <comment xml:lang="es">imagen WBMP</comment>
+ <comment xml:lang="eu">WBMP irudia</comment>
+ <comment xml:lang="fi">WBMP-kuva</comment>
+ <comment xml:lang="fo">WBMP mynd</comment>
+ <comment xml:lang="fr">image WBMP</comment>
+ <comment xml:lang="ga">íomhá WBMP</comment>
+ <comment xml:lang="gl">imaxe WBMP</comment>
+ <comment xml:lang="he">תמונת WBMP</comment>
+ <comment xml:lang="hu">WBMP kép</comment>
+ <comment xml:lang="id">Citra WBMP</comment>
+ <comment xml:lang="it">Immagine WBMP</comment>
+ <comment xml:lang="ja">WBMP 画像</comment>
+ <comment xml:lang="kk">WBMP суреті</comment>
+ <comment xml:lang="ko">WBMP 그림</comment>
+ <comment xml:lang="lt">WBMP paveikslėlis</comment>
+ <comment xml:lang="lv">WBMP attēls</comment>
+ <comment xml:lang="nb">WBMP-bilde</comment>
+ <comment xml:lang="nl">WBMP-afbeelding</comment>
+ <comment xml:lang="nn">WBMP-bilete</comment>
+ <comment xml:lang="pl">Obraz WBMP</comment>
+ <comment xml:lang="pt_BR">Imagem WBMP</comment>
+ <comment xml:lang="ro">Imagine WBMP</comment>
+ <comment xml:lang="ru">изображение WBMP</comment>
+ <comment xml:lang="sk">Obrázok WBMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka WBMP</comment>
+ <comment xml:lang="sq">Figurë WBMP</comment>
+ <comment xml:lang="sv">WBMP-bild</comment>
+ <comment xml:lang="uk">зображення WBMP</comment>
+ <comment xml:lang="vi">Ảnh WBMP</comment>
+ <comment xml:lang="zh_CN">WBMP 图像</comment>
+ <comment xml:lang="zh_TW">WBMP 影像</comment>
+ <acronym>WBMP</acronym>
+ <expanded-acronym>WAP bitmap</expanded-acronym>
+ <glob pattern="*.wbmp"/>
+ </mime-type>
+ <mime-type type="image/cgm">
+ <comment>Computer Graphics Metafile</comment>
+ <comment xml:lang="ar">ملف تعريف رسوميات الحاسوب</comment>
+ <comment xml:lang="az">Kompüter Qrafikası Meta Faylı</comment>
+ <comment xml:lang="be@latin">Metafajł Computer Graphics</comment>
+ <comment xml:lang="bg">Метафайл — Computer Graphics</comment>
+ <comment xml:lang="ca">metafitxer de Computer Graphics</comment>
+ <comment xml:lang="cs">Computer Graphics Metafile</comment>
+ <comment xml:lang="cy">Delwedd ffurf CGM</comment>
+ <comment xml:lang="da">Computer Graphics-metafil</comment>
+ <comment xml:lang="de">CGM-Datei</comment>
+ <comment xml:lang="el">αρχείο Computer Graphics Metafile</comment>
+ <comment xml:lang="en_GB">Computer Graphics Metafile</comment>
+ <comment xml:lang="es">metaarchivo de Computer Graphics</comment>
+ <comment xml:lang="eu">Ordenagailuko grafikoen meta-fitxategia</comment>
+ <comment xml:lang="fi">Computer Graphics -metatiedosto</comment>
+ <comment xml:lang="fo">Teldugrafikk metafíla</comment>
+ <comment xml:lang="fr">métafichier Computer Graphics</comment>
+ <comment xml:lang="ga">meiteachomhad Grafaicí Ríomhaire</comment>
+ <comment xml:lang="gl">metaficheiro de Computer Graphics</comment>
+ <comment xml:lang="he">קובץ-מטה מסוג Computer Graphics</comment>
+ <comment xml:lang="hu">Computer Graphics-metafájl</comment>
+ <comment xml:lang="id">Computer Graphics Metafile</comment>
+ <comment xml:lang="it">Computer Graphics Metafile</comment>
+ <comment xml:lang="ja">コンピューターグラフィックメタファイル</comment>
+ <comment xml:lang="kk">компьютерлік графика метафайлы</comment>
+ <comment xml:lang="ko">컴퓨터 그래픽스 메타파일</comment>
+ <comment xml:lang="lt">Computer Graphics metafailas</comment>
+ <comment xml:lang="lv">Datorgrafikas metafails</comment>
+ <comment xml:lang="ms">Failmeta Grafik Komputer</comment>
+ <comment xml:lang="nb">Computer Graphics Metafile</comment>
+ <comment xml:lang="nl">Computer Graphics-metabestand</comment>
+ <comment xml:lang="nn">Computer Graphics Metafile</comment>
+ <comment xml:lang="pl">Metaplik grafiki komputerowej (CGM)</comment>
+ <comment xml:lang="pt">Computer Graphics Metafile</comment>
+ <comment xml:lang="pt_BR">Meta-arquivo do Computer Graphics</comment>
+ <comment xml:lang="ro">Metafișier Computer Graphics</comment>
+ <comment xml:lang="ru">метафайл компьютерной графики</comment>
+ <comment xml:lang="sk">Computer Graphics Metafile</comment>
+ <comment xml:lang="sl">Metadatoteka računalniške grafike (CGM)</comment>
+ <comment xml:lang="sq">Metafile Computer Graphics</comment>
+ <comment xml:lang="sr">Метадатотека са рачунарском графиком (CGM)</comment>
+ <comment xml:lang="sv">Computer Graphics Metafil</comment>
+ <comment xml:lang="uk">метафайл комп'ютерної графіки</comment>
+ <comment xml:lang="vi">Siêu tập tin đồ họa máy tính (CMF)</comment>
+ <comment xml:lang="zh_CN">CGM 计算机图像元文件</comment>
+ <comment xml:lang="zh_TW">CGM 影像</comment>
+ <glob pattern="*.cgm"/>
+ </mime-type>
+ <mime-type type="image/fax-g3">
+ <comment>CCITT G3 fax</comment>
+ <comment xml:lang="ar">فاكس CCITT G3</comment>
+ <comment xml:lang="be@latin">Faks CCITT G3</comment>
+ <comment xml:lang="bg">Факс — CCITT G3</comment>
+ <comment xml:lang="ca">fax CCITT G3</comment>
+ <comment xml:lang="cs">Fax CCITT G3</comment>
+ <comment xml:lang="da">CCITT G3-fax</comment>
+ <comment xml:lang="de">CCITT-G3-Fax</comment>
+ <comment xml:lang="el">φαξ σε μορφή CCITT G3</comment>
+ <comment xml:lang="en_GB">CCITT G3 fax</comment>
+ <comment xml:lang="eo">G3-fakso de CCITT</comment>
+ <comment xml:lang="es">fax de CCITT G3</comment>
+ <comment xml:lang="eu">CCITT G3 faxa</comment>
+ <comment xml:lang="fi">CCITT G3 -faksi</comment>
+ <comment xml:lang="fo">CCITT G3 telefaks</comment>
+ <comment xml:lang="fr">télécopie G3 CCITT</comment>
+ <comment xml:lang="ga">facs CCITT G3</comment>
+ <comment xml:lang="gl">fax de CCITT G3</comment>
+ <comment xml:lang="he">פקס של CCITT G3</comment>
+ <comment xml:lang="hu">CCITT G3-fax</comment>
+ <comment xml:lang="id">Faks CCITT G3</comment>
+ <comment xml:lang="it">Fax CCITT G3</comment>
+ <comment xml:lang="ja">CCITT G3 FAX</comment>
+ <comment xml:lang="kk">CCITT G3 факсі</comment>
+ <comment xml:lang="ko">CCITT G3 팩스</comment>
+ <comment xml:lang="lt">CCITT G3 faksas</comment>
+ <comment xml:lang="lv">CCITT G3 fakss</comment>
+ <comment xml:lang="ms">Faks g3 CCITT</comment>
+ <comment xml:lang="nb">CCITT G3-faks</comment>
+ <comment xml:lang="nl">CCITT G3-fax</comment>
+ <comment xml:lang="nn">CCITT G3-fax</comment>
+ <comment xml:lang="pl">Faks CCITT G3</comment>
+ <comment xml:lang="pt">fax CCITT G3</comment>
+ <comment xml:lang="pt_BR">Fax do CCITT G3</comment>
+ <comment xml:lang="ro">Fax CCITT G3</comment>
+ <comment xml:lang="ru">факс CCITT G3</comment>
+ <comment xml:lang="sk">Fax CCITT G3</comment>
+ <comment xml:lang="sl">Datoteka faksimila CCITT G3</comment>
+ <comment xml:lang="sq">Fax CCITT G3</comment>
+ <comment xml:lang="sr">CCITT g3 факс</comment>
+ <comment xml:lang="sv">CCITT G3-fax</comment>
+ <comment xml:lang="uk">факс CCITT G3</comment>
+ <comment xml:lang="vi">Điện thư G3 CCITT</comment>
+ <comment xml:lang="zh_CN">CCITT G3 传真</comment>
+ <comment xml:lang="zh_TW">CCITT G3 傳真檔</comment>
+ <glob pattern="*.g3"/>
+ </mime-type>
+ <mime-type type="image/g3fax">
+ <comment>G3 fax image</comment>
+ <comment xml:lang="ar">صورة فاكس G3</comment>
+ <comment xml:lang="az">G3 faks rəsmi</comment>
+ <comment xml:lang="be@latin">Faksavaja vyjava G3</comment>
+ <comment xml:lang="bg">Изображение — факс G3</comment>
+ <comment xml:lang="ca">imatge de fax G3</comment>
+ <comment xml:lang="cs">Obrázek fax G3</comment>
+ <comment xml:lang="cy">Delwedd Ffacs G3</comment>
+ <comment xml:lang="da">G3-faxbillede</comment>
+ <comment xml:lang="de">G3-Faxbild</comment>
+ <comment xml:lang="el">εικόνα φαξ G3</comment>
+ <comment xml:lang="en_GB">G3 fax image</comment>
+ <comment xml:lang="eo">G3-faksbildo</comment>
+ <comment xml:lang="es">imagen de fax G3</comment>
+ <comment xml:lang="eu">G3 fax-irudia</comment>
+ <comment xml:lang="fi">G3-faksikuva</comment>
+ <comment xml:lang="fo">G3 fax mynd</comment>
+ <comment xml:lang="fr">image de télécopie G3</comment>
+ <comment xml:lang="ga">íomhá fhacs G3</comment>
+ <comment xml:lang="gl">imaxe de fax G3</comment>
+ <comment xml:lang="he">תמונת פקס של G3</comment>
+ <comment xml:lang="hu">G3-faxkép</comment>
+ <comment xml:lang="id">Citra faks G3</comment>
+ <comment xml:lang="it">Immagine fax G3</comment>
+ <comment xml:lang="ja">G3 FAX 画像</comment>
+ <comment xml:lang="kk">G3 факс суреті</comment>
+ <comment xml:lang="ko">G3 팩스 그림</comment>
+ <comment xml:lang="lt">G3 fax paveikslėlis</comment>
+ <comment xml:lang="lv">G3 faksa attēls</comment>
+ <comment xml:lang="ms">Imej fax G3</comment>
+ <comment xml:lang="nb">G3-faksbilde</comment>
+ <comment xml:lang="nl">G3 faxafbeelding</comment>
+ <comment xml:lang="nn">G3 faksbilete</comment>
+ <comment xml:lang="pl">Obraz faksowy G3</comment>
+ <comment xml:lang="pt">imagem de fax G3</comment>
+ <comment xml:lang="pt_BR">Imagem de fax G3</comment>
+ <comment xml:lang="ro">Imagine fax G3</comment>
+ <comment xml:lang="ru">факсовое изображение G3</comment>
+ <comment xml:lang="sk">Obrázok fax G3</comment>
+ <comment xml:lang="sl">Slikovna datoteka G3 fax</comment>
+ <comment xml:lang="sq">Figurë Fax G3</comment>
+ <comment xml:lang="sr">G3 факс слика</comment>
+ <comment xml:lang="sv">G3-faxbild</comment>
+ <comment xml:lang="uk">факс G3</comment>
+ <comment xml:lang="vi">Ảnh điện thư G3</comment>
+ <comment xml:lang="zh_CN">G3 传真文档</comment>
+ <comment xml:lang="zh_TW">G3 傳真圖</comment>
+ </mime-type>
+ <mime-type type="image/gif">
+ <comment>GIF image</comment>
+ <comment xml:lang="ar">صورة GIF</comment>
+ <comment xml:lang="az">GIF rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava GIF</comment>
+ <comment xml:lang="bg">Изображение — GIF</comment>
+ <comment xml:lang="ca">imatge GIF</comment>
+ <comment xml:lang="cs">Obrázek GIF</comment>
+ <comment xml:lang="cy">Delwedd GIF</comment>
+ <comment xml:lang="da">GIF-billede</comment>
+ <comment xml:lang="de">GIF-Bild</comment>
+ <comment xml:lang="el">εικόνα GIF</comment>
+ <comment xml:lang="en_GB">GIF image</comment>
+ <comment xml:lang="eo">GIF-bildo</comment>
+ <comment xml:lang="es">imagen GIF</comment>
+ <comment xml:lang="eu">GIF irudia</comment>
+ <comment xml:lang="fi">GIF-kuva</comment>
+ <comment xml:lang="fo">GIF mynd</comment>
+ <comment xml:lang="fr">image GIF</comment>
+ <comment xml:lang="ga">íomhá GIF</comment>
+ <comment xml:lang="gl">imaxe GIF</comment>
+ <comment xml:lang="he">תמונת GIF</comment>
+ <comment xml:lang="hu">GIF-kép</comment>
+ <comment xml:lang="id">Citra GIF</comment>
+ <comment xml:lang="it">Immagine GIF</comment>
+ <comment xml:lang="ja">GIF 画像</comment>
+ <comment xml:lang="kk">GIF суреті</comment>
+ <comment xml:lang="ko">GIF 그림</comment>
+ <comment xml:lang="lt">GIF paveikslėlis</comment>
+ <comment xml:lang="lv">GIF attēls</comment>
+ <comment xml:lang="ms">Imej GIF</comment>
+ <comment xml:lang="nb">GIF-bilde</comment>
+ <comment xml:lang="nl">GIF-afbeelding</comment>
+ <comment xml:lang="nn">GIF-bilete</comment>
+ <comment xml:lang="pl">Obraz GIF</comment>
+ <comment xml:lang="pt">imagem GIF</comment>
+ <comment xml:lang="pt_BR">Imagem GIF</comment>
+ <comment xml:lang="ro">Imagine GIF</comment>
+ <comment xml:lang="ru">изображение GIF</comment>
+ <comment xml:lang="sk">Obrázok GIF</comment>
+ <comment xml:lang="sl">Slikovna datoteka GIF</comment>
+ <comment xml:lang="sq">Figurë GIF</comment>
+ <comment xml:lang="sr">GIF слика</comment>
+ <comment xml:lang="sv">GIF-bild</comment>
+ <comment xml:lang="uk">зображення GIF</comment>
+ <comment xml:lang="vi">Ảnh GIF</comment>
+ <comment xml:lang="zh_CN">GIF 图像</comment>
+ <comment xml:lang="zh_TW">GIF 影像</comment>
+ <magic priority="50">
+ <match value="GIF8" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.gif"/>
+ </mime-type>
+ <mime-type type="image/ief">
+ <comment>IEF image</comment>
+ <comment xml:lang="ar">صورة IEF</comment>
+ <comment xml:lang="az">IEF rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava IEF</comment>
+ <comment xml:lang="bg">Изображение — IEF</comment>
+ <comment xml:lang="ca">imatge IEF</comment>
+ <comment xml:lang="cs">Obrázek IEF</comment>
+ <comment xml:lang="cy">Delwedd IEF</comment>
+ <comment xml:lang="da">IEF-billede</comment>
+ <comment xml:lang="de">IEF-Bild</comment>
+ <comment xml:lang="el">εικόνα IEF</comment>
+ <comment xml:lang="en_GB">IEF image</comment>
+ <comment xml:lang="eo">IEF-bildo</comment>
+ <comment xml:lang="es">imagen IEF</comment>
+ <comment xml:lang="eu">IEF irudia</comment>
+ <comment xml:lang="fi">IEF-kuva</comment>
+ <comment xml:lang="fo">IEF mynd</comment>
+ <comment xml:lang="fr">image IEF</comment>
+ <comment xml:lang="ga">íomhá IEF</comment>
+ <comment xml:lang="gl">imaxe IEF</comment>
+ <comment xml:lang="he">תמונת IEF</comment>
+ <comment xml:lang="hu">IEF-kép</comment>
+ <comment xml:lang="id">Citra IEF</comment>
+ <comment xml:lang="it">Immagine IEF</comment>
+ <comment xml:lang="ja">IEF 画像</comment>
+ <comment xml:lang="kk">IEF суреті</comment>
+ <comment xml:lang="ko">IEF 그림</comment>
+ <comment xml:lang="lt">IEF paveikslėlis</comment>
+ <comment xml:lang="lv">IEF attēls</comment>
+ <comment xml:lang="ms">Imej IEF</comment>
+ <comment xml:lang="nb">IEF-bilde</comment>
+ <comment xml:lang="nl">IEF-afbeelding</comment>
+ <comment xml:lang="nn">IEF-bilete</comment>
+ <comment xml:lang="pl">Obraz IEF</comment>
+ <comment xml:lang="pt">imagem IEF</comment>
+ <comment xml:lang="pt_BR">Imagem IEF</comment>
+ <comment xml:lang="ro">Imagine IEF</comment>
+ <comment xml:lang="ru">изображение IEF</comment>
+ <comment xml:lang="sk">Obrázok IEF</comment>
+ <comment xml:lang="sl">Slikovna datoteka IEF</comment>
+ <comment xml:lang="sq">Figurë IEF</comment>
+ <comment xml:lang="sr">IEF слика</comment>
+ <comment xml:lang="sv">IEF-bild</comment>
+ <comment xml:lang="uk">зображення IEF</comment>
+ <comment xml:lang="vi">Ảnh IEF</comment>
+ <comment xml:lang="zh_CN">IEF 图像</comment>
+ <comment xml:lang="zh_TW">IEF 影像</comment>
+ <glob pattern="*.ief"/>
+ </mime-type>
+ <mime-type type="image/jpeg">
+ <comment>JPEG image</comment>
+ <comment xml:lang="ar">صورة JPEG</comment>
+ <comment xml:lang="az">JPEG rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava JPEG</comment>
+ <comment xml:lang="bg">Изображение — JPEG</comment>
+ <comment xml:lang="ca">imatge JPEG</comment>
+ <comment xml:lang="cs">Obrázek JPEG</comment>
+ <comment xml:lang="cy">Delwedd JPEG</comment>
+ <comment xml:lang="da">JPEG-billede</comment>
+ <comment xml:lang="de">JPEG-Bild</comment>
+ <comment xml:lang="el">εικόνα JPEG</comment>
+ <comment xml:lang="en_GB">JPEG image</comment>
+ <comment xml:lang="eo">JPEG-bildo</comment>
+ <comment xml:lang="es">imagen JPEG</comment>
+ <comment xml:lang="eu">JPEG irudia</comment>
+ <comment xml:lang="fi">JPEG-kuva</comment>
+ <comment xml:lang="fo">JPEG mynd</comment>
+ <comment xml:lang="fr">image JPEG</comment>
+ <comment xml:lang="ga">íomhá JPEG</comment>
+ <comment xml:lang="gl">imaxe JPEG</comment>
+ <comment xml:lang="he">תמונת JPEG</comment>
+ <comment xml:lang="hu">JPEG-kép</comment>
+ <comment xml:lang="id">Citra JPEG</comment>
+ <comment xml:lang="it">Immagine JPEG</comment>
+ <comment xml:lang="ja">JPEG 画像 </comment>
+ <comment xml:lang="kk">JPEG суреті</comment>
+ <comment xml:lang="ko">JPEG 그림</comment>
+ <comment xml:lang="lt">JPEG paveikslėlis</comment>
+ <comment xml:lang="lv">JPEG attēls</comment>
+ <comment xml:lang="ms">Imej JPEG</comment>
+ <comment xml:lang="nb">JPEG-bilde</comment>
+ <comment xml:lang="nl">JPEG-afbeelding</comment>
+ <comment xml:lang="nn">JPEG-bilete</comment>
+ <comment xml:lang="pl">Obraz JPEG</comment>
+ <comment xml:lang="pt">imagem JPEG</comment>
+ <comment xml:lang="pt_BR">Imagem JPEG</comment>
+ <comment xml:lang="ro">Imagine JPEG</comment>
+ <comment xml:lang="ru">изображение JPEG</comment>
+ <comment xml:lang="sk">Obrázok JPEG</comment>
+ <comment xml:lang="sl">Slikovna datoteka JPEG</comment>
+ <comment xml:lang="sq">Figurë JPEG</comment>
+ <comment xml:lang="sr">JPEG слика</comment>
+ <comment xml:lang="sv">JPEG-bild</comment>
+ <comment xml:lang="uk">зображення JPEG</comment>
+ <comment xml:lang="vi">Ảnh JPEG</comment>
+ <comment xml:lang="zh_CN">JPEG 图像</comment>
+ <comment xml:lang="zh_TW">JPEG 影像</comment>
+ <magic priority="50">
+ <match value="\377\330\377" type="string" offset="0"/>
+ <match value="0xffd8" type="big16" offset="0"/>
+ </magic>
+ <glob pattern="*.jpeg"/>
+ <glob pattern="*.jpg"/>
+ <glob pattern="*.jpe"/>
+ <alias type="image/pjpeg"/>
+ </mime-type>
+ <mime-type type="image/jp2">
+ <comment>JPEG-2000 image</comment>
+ <comment xml:lang="ar">صورة JPEG-2000</comment>
+ <comment xml:lang="be@latin">Vyjava JPEG-2000</comment>
+ <comment xml:lang="bg">Изображение — JPEG-2000</comment>
+ <comment xml:lang="ca">imatge JPEG-2000</comment>
+ <comment xml:lang="cs">Obrázek JPEG-2000</comment>
+ <comment xml:lang="da">JPEG2000-billede</comment>
+ <comment xml:lang="de">JPEG-2000-Bild</comment>
+ <comment xml:lang="el">εικόνα JPEG-2000</comment>
+ <comment xml:lang="en_GB">JPEG-2000 image</comment>
+ <comment xml:lang="eo">JPEG-2000-bildo</comment>
+ <comment xml:lang="es">imagen JPEG-2000</comment>
+ <comment xml:lang="eu">JPEG-2000 irudia</comment>
+ <comment xml:lang="fi">JPEG-2000-kuva</comment>
+ <comment xml:lang="fo">JPEG-2000 mynd</comment>
+ <comment xml:lang="fr">image JPEG-2000</comment>
+ <comment xml:lang="ga">íomhá JPEG-2000</comment>
+ <comment xml:lang="gl">imaxe JPEG-2000</comment>
+ <comment xml:lang="he">תמונת JPEG-2000</comment>
+ <comment xml:lang="hu">JPEG-2000 kép</comment>
+ <comment xml:lang="id">Citra JPEG-2000</comment>
+ <comment xml:lang="it">Immagine JPEG-2000</comment>
+ <comment xml:lang="ja">JPEG-2000 画像</comment>
+ <comment xml:lang="kk">JPEG-2000 суреті</comment>
+ <comment xml:lang="ko">JPEG-2000 그림</comment>
+ <comment xml:lang="lt">JPEG-2000 paveikslėlis</comment>
+ <comment xml:lang="lv">JPEG-2000 attēls</comment>
+ <comment xml:lang="ms">Imej JPEG-2000</comment>
+ <comment xml:lang="nb">JPEG-2000-bilde</comment>
+ <comment xml:lang="nl">JPEG-2000-afbeelding</comment>
+ <comment xml:lang="nn">JPEG-2000-bilete</comment>
+ <comment xml:lang="pl">Obraz JPEG-2000</comment>
+ <comment xml:lang="pt">imagem JPEG-2000</comment>
+ <comment xml:lang="pt_BR">Imagem JPEG-2000</comment>
+ <comment xml:lang="ro">Imagine JPEG-2000</comment>
+ <comment xml:lang="ru">изображение JPEG-2000</comment>
+ <comment xml:lang="sk">Obrázok JPEG-2000</comment>
+ <comment xml:lang="sl">Slikovna datoteka JPEG-2000</comment>
+ <comment xml:lang="sq">Figurë JPEG-2000</comment>
+ <comment xml:lang="sr">JPEG-2000 слика</comment>
+ <comment xml:lang="sv">JPEG-2000-bild</comment>
+ <comment xml:lang="uk">зображення JPEG-2000</comment>
+ <comment xml:lang="vi">Ảnh JPEG-2000</comment>
+ <comment xml:lang="zh_CN">JPEG-2000 图像</comment>
+ <comment xml:lang="zh_TW">JPEG-2000 影像</comment>
+ <alias type="image/jpeg2000"/>
+ <alias type="image/jpx"/>
+ <magic priority="50">
+ <match value="jP" type="string" offset="4"/>
+ <match value="\xFF\x4F\xFF\x51\x00" type="string" offset="0"/>
+ <match value="0x0c6a5020" type="big32" offset="3"/>
+ </magic>
+ <glob pattern="*.jp2"/>
+ <glob pattern="*.jpc"/>
+ <glob pattern="*.jpx"/>
+ <glob pattern="*.j2k"/>
+ <glob pattern="*.jpf"/>
+ </mime-type>
+ <mime-type type="image/openraster">
+ <comment>OpenRaster archiving image</comment>
+ <comment xml:lang="ar">صورة أرشيف OpenRaster</comment>
+ <comment xml:lang="bg">Изображение — OpenRaster</comment>
+ <comment xml:lang="ca">imatge d'arxivat OpenRaster</comment>
+ <comment xml:lang="cs">Archivační obraz OpenRaster</comment>
+ <comment xml:lang="da">OpenRaster-arkivaftryk</comment>
+ <comment xml:lang="de">OpenRaster-Archivierungsbild</comment>
+ <comment xml:lang="es">imagen de archivado de OpenRaster</comment>
+ <comment xml:lang="eu">OpenRaster artxiboaren irudia</comment>
+ <comment xml:lang="fo">OpenRaster goymslumynd</comment>
+ <comment xml:lang="fr">image d'archive OpenRaster</comment>
+ <comment xml:lang="ga">íomhá chartlannaithe OpenRaster</comment>
+ <comment xml:lang="gl">imaxe arquivada de OpenRaster</comment>
+ <comment xml:lang="he">תמונת ארכיון של OpenRaster</comment>
+ <comment xml:lang="hu">OpenRaster archiválási kép</comment>
+ <comment xml:lang="id">Gambar pengarsipan OpenRaster</comment>
+ <comment xml:lang="it">Immagine archiviazione OpenRaster</comment>
+ <comment xml:lang="ja">OpenRaster アーカイブイメージ</comment>
+ <comment xml:lang="kk">OpenRaster архивтеу суреті</comment>
+ <comment xml:lang="ko">OpenRaster 압축 이미지</comment>
+ <comment xml:lang="lt">OpenRaster archyvavimo paveikslėlis</comment>
+ <comment xml:lang="lv">OpenRaster arhivēšanas attēls</comment>
+ <comment xml:lang="pl">Archiwalny obraz OpenRaster</comment>
+ <comment xml:lang="ro">Arhivă imagine OpenRaster</comment>
+ <comment xml:lang="ru">архивное изображение OpenRaster</comment>
+ <comment xml:lang="sl">Odtis arhiva OpenRaster</comment>
+ <comment xml:lang="sv">OpenRaster-arkivbild</comment>
+ <comment xml:lang="uk">архівоване зображення OpenRaster</comment>
+ <comment xml:lang="zh_CN">OpenRaster 归档映像</comment>
+ <comment xml:lang="zh_TW">OpenRaster 封存影像</comment>
+ <magic priority="50">
+ <match value="PK\003\004" type="string" offset="0">
+ <match value="mimetype" type="string" offset="30">
+ <match value="image/openraster" type="string" offset="38"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.ora"/>
+ </mime-type>
+ <mime-type type="image/x-dds">
+ <comment>DirectDraw surface</comment>
+ <comment xml:lang="ar">مساحة DirectDraw</comment>
+ <comment xml:lang="be@latin">Pavierchnia DirectDraw</comment>
+ <comment xml:lang="bg">Изображение — повърхност на DirectDraw</comment>
+ <comment xml:lang="ca">superfície DirectDraw</comment>
+ <comment xml:lang="cs">Plocha DirectDraw</comment>
+ <comment xml:lang="da">DirectDraw-overflade</comment>
+ <comment xml:lang="de">DirectDraw-Oberfläche</comment>
+ <comment xml:lang="es">superficie DirectDraw</comment>
+ <comment xml:lang="eu">DirectDraw gainazala</comment>
+ <comment xml:lang="fi">DirectDraw-piirtoalue</comment>
+ <comment xml:lang="fo">DirectDraw yvirflata</comment>
+ <comment xml:lang="fr">surface DirectDraw</comment>
+ <comment xml:lang="ga">dromchla DirectDraw</comment>
+ <comment xml:lang="gl">superficie de DirectDraw</comment>
+ <comment xml:lang="he">משטח של DirectDraw</comment>
+ <comment xml:lang="hu">DirectDraw felület</comment>
+ <comment xml:lang="id">Permukaan DirectDraw</comment>
+ <comment xml:lang="it">Superficie DirectDraw</comment>
+ <comment xml:lang="ja">DirectDraw サーフェイス</comment>
+ <comment xml:lang="kk">DirectDraw жазықтығы</comment>
+ <comment xml:lang="ko">DirectDraw 서피스</comment>
+ <comment xml:lang="lt">DirectDraw paviršius</comment>
+ <comment xml:lang="lv">DirectDraw virsma</comment>
+ <comment xml:lang="nb">DirectDraw-overflate</comment>
+ <comment xml:lang="nl">DirectDraw-oppervlak</comment>
+ <comment xml:lang="nn">DirectDraw-overflate</comment>
+ <comment xml:lang="pl">Powierzchnia DirectDraw</comment>
+ <comment xml:lang="pt_BR">Superfície do DirectDraw</comment>
+ <comment xml:lang="ro">Suprafață DirectDraw</comment>
+ <comment xml:lang="ru">плоскость DirectDraw</comment>
+ <comment xml:lang="sk">Plocha DirectDraw</comment>
+ <comment xml:lang="sl">Datoteka predmeta DirectDraw</comment>
+ <comment xml:lang="sq">Superfaqe DirectDraw</comment>
+ <comment xml:lang="sv">DirectDraw-yta</comment>
+ <comment xml:lang="uk">поверхня DirectDraw</comment>
+ <comment xml:lang="vi">Mặt DirectDraw</comment>
+ <comment xml:lang="zh_CN">DirectDraw 表面</comment>
+ <comment xml:lang="zh_TW">DirectDraw 表面</comment>
+ <magic priority="50">
+ <match value="DDS" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.dds"/>
+ </mime-type>
+ <mime-type type="image/x-xcursor">
+ <comment>X11 cursor</comment>
+ <comment xml:lang="ar">مؤشر X11</comment>
+ <comment xml:lang="be@latin">Kursor X11</comment>
+ <comment xml:lang="bg">Курсор — X11</comment>
+ <comment xml:lang="ca">cursor X11</comment>
+ <comment xml:lang="cs">Kurzor X11</comment>
+ <comment xml:lang="da">X11-markør</comment>
+ <comment xml:lang="de">X11-Zeiger</comment>
+ <comment xml:lang="es">cursor X11</comment>
+ <comment xml:lang="eu">X11 kurtsorea</comment>
+ <comment xml:lang="fi">X11-osoitin</comment>
+ <comment xml:lang="fo">X11 vísi</comment>
+ <comment xml:lang="fr">curseur X11</comment>
+ <comment xml:lang="ga">cúrsóir X11</comment>
+ <comment xml:lang="gl">Cursor X11</comment>
+ <comment xml:lang="he">סמן של X11</comment>
+ <comment xml:lang="hu">X11 kurzor</comment>
+ <comment xml:lang="id">Kursor X11</comment>
+ <comment xml:lang="it">Cursore X11</comment>
+ <comment xml:lang="ja">X11 カーソル</comment>
+ <comment xml:lang="kk">X11 курсоры</comment>
+ <comment xml:lang="ko">X11 커서</comment>
+ <comment xml:lang="lt">X11 žymiklis</comment>
+ <comment xml:lang="lv">X11 kursors</comment>
+ <comment xml:lang="nb">X11-markør</comment>
+ <comment xml:lang="nl">X11-muisaanwijzer</comment>
+ <comment xml:lang="nn">X11-peikar</comment>
+ <comment xml:lang="pl">Kursor X11</comment>
+ <comment xml:lang="pt_BR">Cursor do X11</comment>
+ <comment xml:lang="ro">Cursor X11</comment>
+ <comment xml:lang="ru">курсор X11</comment>
+ <comment xml:lang="sk">Kurzor X11</comment>
+ <comment xml:lang="sl">Datoteka kazalke X11</comment>
+ <comment xml:lang="sq">Kursor X11</comment>
+ <comment xml:lang="sv">X11-muspekare</comment>
+ <comment xml:lang="uk">курсор X11</comment>
+ <comment xml:lang="vi">Con chạy X11</comment>
+ <comment xml:lang="zh_CN">X11 指针</comment>
+ <comment xml:lang="zh_TW">X11 滑鼠游標</comment>
+ <magic priority="50">
+ <match value="Xcur" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-exr">
+ <comment>EXR image</comment>
+ <comment xml:lang="ar">صورة EXR</comment>
+ <comment xml:lang="be@latin">Vyjava EXR</comment>
+ <comment xml:lang="bg">Изображение — EXR</comment>
+ <comment xml:lang="ca">imatge EXR</comment>
+ <comment xml:lang="cs">Obrázek EXR</comment>
+ <comment xml:lang="da">EXR-billede</comment>
+ <comment xml:lang="de">EXR-Bild</comment>
+ <comment xml:lang="eo">EXR-bildo</comment>
+ <comment xml:lang="es">imagen EXR</comment>
+ <comment xml:lang="eu">EXR irudia</comment>
+ <comment xml:lang="fi">EXR-kuva</comment>
+ <comment xml:lang="fo">EXR mynd</comment>
+ <comment xml:lang="fr">image EXR</comment>
+ <comment xml:lang="ga">íomhá EXR</comment>
+ <comment xml:lang="gl">imaxe EXR</comment>
+ <comment xml:lang="he">תמונת EXR</comment>
+ <comment xml:lang="hu">EXR kép</comment>
+ <comment xml:lang="id">Citra EXR</comment>
+ <comment xml:lang="it">Immagine EXR</comment>
+ <comment xml:lang="ja">EXR 画像</comment>
+ <comment xml:lang="kk">EXR суреті</comment>
+ <comment xml:lang="ko">EXR 그림</comment>
+ <comment xml:lang="lt">EXR paveikslėlis</comment>
+ <comment xml:lang="lv">EXR attēls</comment>
+ <comment xml:lang="nb">EXR-bilde</comment>
+ <comment xml:lang="nl">EXR-afbeelding</comment>
+ <comment xml:lang="nn">EXR-bilete</comment>
+ <comment xml:lang="pl">Obraz EXR</comment>
+ <comment xml:lang="pt_BR">Imagem EXR</comment>
+ <comment xml:lang="ro">Imagine EXR</comment>
+ <comment xml:lang="ru">изображение EXR</comment>
+ <comment xml:lang="sk">Obrázok EXR</comment>
+ <comment xml:lang="sl">Slikovna datoteka EXR</comment>
+ <comment xml:lang="sq">Figurë EXR</comment>
+ <comment xml:lang="sv">EXR-bild</comment>
+ <comment xml:lang="uk">зображення EXR</comment>
+ <comment xml:lang="vi">Ảnh EXR</comment>
+ <comment xml:lang="zh_CN">EXR 图像</comment>
+ <comment xml:lang="zh_TW">EXR 影像</comment>
+ <magic priority="50">
+ <match value="20000630" type="little32" offset="0"/>
+ </magic>
+ <glob pattern="*.exr"/>
+ </mime-type>
+ <mime-type type="image/x-pict">
+ <comment>Macintosh Quickdraw/PICT drawing</comment>
+ <comment xml:lang="ar">رسمة ماكنتوش Quickdraw/PICT</comment>
+ <comment xml:lang="be@latin">Rysunak Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="bg">Чертеж — Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ca">dibuix Quickdraw/PICT de Macintosh</comment>
+ <comment xml:lang="cs">Kresba Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="da">Macintosh Quickdraw/PICT-tegning</comment>
+ <comment xml:lang="de">Macintosh-Quickdraw/PICT-Zeichnung</comment>
+ <comment xml:lang="el">σχέδιο Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="en_GB">Macintosh Quickdraw/PICT drawing</comment>
+ <comment xml:lang="eo">Quickdraw/PICT-grafikaĵo de Macintosh</comment>
+ <comment xml:lang="es">dibujo de Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="eu">Macintosh Quickdraw/PICT marrazkia</comment>
+ <comment xml:lang="fi">Macintosh Quickdraw/PICT -piirros</comment>
+ <comment xml:lang="fo">Macintosh Quickdraw/PICT tekning</comment>
+ <comment xml:lang="fr">dessin Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ga">líníocht Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="gl">debuxo de Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="he">ציור של Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="hu">Macintosh Quickdraw/PICT-rajz</comment>
+ <comment xml:lang="id">Gambar Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="it">Disegno Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ja">Macintosh Quickdraw/PICT ドロー</comment>
+ <comment xml:lang="kk">Macintosh Quickdraw/PICT суреті</comment>
+ <comment xml:lang="ko">맥킨토시 Quickdraw/PICT 그림</comment>
+ <comment xml:lang="lt">Macintosh Quickdraw/PICT piešinys</comment>
+ <comment xml:lang="lv">Macintosh Quickdraw/PICT zīmējums</comment>
+ <comment xml:lang="ms">Lukisan Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="nb">Macintosh Quickdraw/PICT-tegning</comment>
+ <comment xml:lang="nl">Macintosh Quickdraw/PICT-tekening</comment>
+ <comment xml:lang="nn">Macintosh Quickdraw/PICT-teikning</comment>
+ <comment xml:lang="pl">Rysunek Quickdraw/PICT Macintosh</comment>
+ <comment xml:lang="pt">desenho Quickdraw/PICT de Macintosh</comment>
+ <comment xml:lang="pt_BR">Desenho do Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ro">Desen Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ru">рисунок Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="sk">Kresba Macintosh QuickDraw/PICT</comment>
+ <comment xml:lang="sl">Datoteka risbe Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="sq">Vizatim Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="sr">Мекинтош Quickdraw/PICT цртеж</comment>
+ <comment xml:lang="sv">Macintosh Quickdraw/PICT-teckning</comment>
+ <comment xml:lang="uk">малюнок Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="vi">Bản vẽ Quickdraw/PICT của Macintosh</comment>
+ <comment xml:lang="zh_CN">Macintosh Quickdraw/PICT 绘图</comment>
+ <comment xml:lang="zh_TW">Macintosh Quickdraw/PICT 繪圖</comment>
+ <glob pattern="*.pict"/>
+ <glob pattern="*.pict1"/>
+ <glob pattern="*.pict2"/>
+ </mime-type>
+ <mime-type type="application/x-ufraw">
+ <comment>UFRaw ID image</comment>
+ <comment xml:lang="ar">صورة UFRaw ID</comment>
+ <comment xml:lang="be@latin">Vyjava UFRaw ID</comment>
+ <comment xml:lang="bg">Изображение — UFRaw ID</comment>
+ <comment xml:lang="ca">imatge ID UFRaw</comment>
+ <comment xml:lang="cs">Obrázek ID UFRaw</comment>
+ <comment xml:lang="da">UFRaw ID-billede</comment>
+ <comment xml:lang="de">UFRaw-Bildbeschreibungsdatei</comment>
+ <comment xml:lang="es">imagen de identificación UFRaw</comment>
+ <comment xml:lang="eu">UFRaw ID irudia</comment>
+ <comment xml:lang="fi">UFRaw ID -kuva</comment>
+ <comment xml:lang="fo">UFRaw ID mynd</comment>
+ <comment xml:lang="fr">image ID UFRaw</comment>
+ <comment xml:lang="ga">íomhá aitheantais UFRaw</comment>
+ <comment xml:lang="gl">imaxe de identificación UFRaw</comment>
+ <comment xml:lang="he">תמונה של UFRaw ID</comment>
+ <comment xml:lang="hu">UFRaw azonosítófájl</comment>
+ <comment xml:lang="id">Citra UFRaw ID</comment>
+ <comment xml:lang="it">Immagine UFRaw ID</comment>
+ <comment xml:lang="ja">UFRaw ID イメージ</comment>
+ <comment xml:lang="kk">UFRaw ID суреті</comment>
+ <comment xml:lang="ko">UFRaw ID 그림</comment>
+ <comment xml:lang="lt">UFRaw ID paveikslėlis</comment>
+ <comment xml:lang="lv">UFRaw ID attēls</comment>
+ <comment xml:lang="nb">UFRaw ID-bilde</comment>
+ <comment xml:lang="nl">UFRaw ID-afbeelding</comment>
+ <comment xml:lang="nn">UFRaw ID-bilete</comment>
+ <comment xml:lang="pl">Obraz UFRaw ID</comment>
+ <comment xml:lang="pt_BR">Imagem ID do UFRaw</comment>
+ <comment xml:lang="ro">ID imagine UFRaw</comment>
+ <comment xml:lang="ru">изображение UFRaw ID</comment>
+ <comment xml:lang="sk">Obrázok ID UFRaw</comment>
+ <comment xml:lang="sl">Slikovna datoteka UFRaw ID</comment>
+ <comment xml:lang="sq">Figurë UFRaw ID</comment>
+ <comment xml:lang="sv">UFRaw ID-bild</comment>
+ <comment xml:lang="uk">зображення UFRaw ID</comment>
+ <comment xml:lang="vi">Ảnh ID UFRaw</comment>
+ <comment xml:lang="zh_CN">UFRaw ID 图像</comment>
+ <comment xml:lang="zh_TW">UFRaw ID 影像</comment>
+ <acronym>UFRaw</acronym>
+ <expanded-acronym>Unidentified Flying Raw</expanded-acronym>
+ <sub-class-of type="text/xml"/>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.ufraw"/>
+ </mime-type>
+ <mime-type type="image/x-dcraw">
+ <comment>digital raw image</comment>
+ <comment xml:lang="ar">صورة رقمية خامة</comment>
+ <comment xml:lang="be@latin">suvoraja ličbavaja vyjava</comment>
+ <comment xml:lang="bg">Изображение — digital raw</comment>
+ <comment xml:lang="ca">imatge digital en cru</comment>
+ <comment xml:lang="cs">Digitální surový obrázek</comment>
+ <comment xml:lang="da">digitalt råbillede</comment>
+ <comment xml:lang="de">Digitales Rohbild</comment>
+ <comment xml:lang="es">imagen digital en bruto</comment>
+ <comment xml:lang="eu">irudi gordin digitala</comment>
+ <comment xml:lang="fi">digitaalinen raakakuva</comment>
+ <comment xml:lang="fo">talgild rámynd</comment>
+ <comment xml:lang="fr">image brute numérique</comment>
+ <comment xml:lang="ga">amhíomhá digiteach</comment>
+ <comment xml:lang="gl">imaxe en bruto dixital</comment>
+ <comment xml:lang="he">תמונה דיגטלית גולמית</comment>
+ <comment xml:lang="hu">digitális nyers kép</comment>
+ <comment xml:lang="id">citra mentah digital</comment>
+ <comment xml:lang="it">Immagine raw digitale</comment>
+ <comment xml:lang="ja">デジタル raw 画像</comment>
+ <comment xml:lang="kk">өңделмеген сандық суреттер</comment>
+ <comment xml:lang="ko">디지털 원본 이미지</comment>
+ <comment xml:lang="lt">skaitmeninis neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">digitāls jēlattēls</comment>
+ <comment xml:lang="nb">digitalt raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt digitaal beeld</comment>
+ <comment xml:lang="nn">digitalt råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz cyfrowy</comment>
+ <comment xml:lang="pt_BR">Imagem digital bruta</comment>
+ <comment xml:lang="ro">imagine digitală brută</comment>
+ <comment xml:lang="ru">необработанные цифровые изображения</comment>
+ <comment xml:lang="sk">Digitálny surový obrázok</comment>
+ <comment xml:lang="sl">surova digitalna slika</comment>
+ <comment xml:lang="sq">Figurë raw dixhitale</comment>
+ <comment xml:lang="sv">digital råbild</comment>
+ <comment xml:lang="uk">зображення цифрового негатива</comment>
+ <comment xml:lang="vi">ảnh thô số</comment>
+ <comment xml:lang="zh_CN">数字化原始图像</comment>
+ <comment xml:lang="zh_TW">數位原生影像</comment>
+ </mime-type>
+ <mime-type type="image/x-adobe-dng">
+ <comment>Adobe DNG negative</comment>
+ <comment xml:lang="ar">Adobe DNG negative</comment>
+ <comment xml:lang="be@latin">Adobe DNG Negative</comment>
+ <comment xml:lang="bg">Изображение — Adobe DNG negative</comment>
+ <comment xml:lang="ca">negatiu DNG d'Adobe</comment>
+ <comment xml:lang="cs">Adobe Digital Negative (DNG)</comment>
+ <comment xml:lang="da">Adobe DNG-negativ</comment>
+ <comment xml:lang="de">Adobe Digitales Negativ</comment>
+ <comment xml:lang="es">negativo digital de Adobe (ADN)</comment>
+ <comment xml:lang="eu">Adobe DNG negatiboa</comment>
+ <comment xml:lang="fi">Adobe-DNG-negatiivi</comment>
+ <comment xml:lang="fo">Adobe DNG negativ</comment>
+ <comment xml:lang="fr">négatif DNG Adobe</comment>
+ <comment xml:lang="ga">claonchló DNG Adobe</comment>
+ <comment xml:lang="gl">negativo DNG de Adobe</comment>
+ <comment xml:lang="he">תשליל Adobe DNG</comment>
+ <comment xml:lang="hu">Adobe DNG negatív</comment>
+ <comment xml:lang="id">Negatif Adobe DNG</comment>
+ <comment xml:lang="it">Negativo Adobe DNG</comment>
+ <comment xml:lang="ja">Adobe DNG ネガ</comment>
+ <comment xml:lang="kk">Adobe DNG негативі</comment>
+ <comment xml:lang="ko">어도비 DNG 네가티브</comment>
+ <comment xml:lang="lt">Adobe DNG negatyvas</comment>
+ <comment xml:lang="lv">Adobe DNG negatīvs</comment>
+ <comment xml:lang="nb">Adobe DNG-negativ</comment>
+ <comment xml:lang="nl">Adobe DNG-negatief</comment>
+ <comment xml:lang="nn">Adobe DNG-negativ</comment>
+ <comment xml:lang="pl">Negatyw DNG Adobe</comment>
+ <comment xml:lang="pt_BR">Negativo DNG da Adobe</comment>
+ <comment xml:lang="ro">Negativ Adobe DNG</comment>
+ <comment xml:lang="ru">негатив Adobe DNG</comment>
+ <comment xml:lang="sk">Adobe Digital Negative (DNG)</comment>
+ <comment xml:lang="sl">Datoteka negativa Adobe DNG</comment>
+ <comment xml:lang="sq">Negativ Adobe DNG</comment>
+ <comment xml:lang="sv">Adobe DNG-negativ</comment>
+ <comment xml:lang="uk">цифровий негатив DNG Adobe</comment>
+ <comment xml:lang="vi">Âm bản Adobe DNG</comment>
+ <comment xml:lang="zh_CN">Adobe DNG 负片</comment>
+ <comment xml:lang="zh_TW">Adobe DNG 負片</comment>
+ <acronym>DNG</acronym>
+ <expanded-acronym>Digital Negative</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.dng"/>
+ </mime-type>
+
+
+ <mime-type type="image/x-canon-crw">
+ <comment>Canon CRW raw image</comment>
+ <comment xml:lang="ar">صورة Canon CRW خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Canon CRW</comment>
+ <comment xml:lang="bg">Изображение — Canon CRW raw</comment>
+ <comment xml:lang="ca">imatge en cru de Canon CRW</comment>
+ <comment xml:lang="cs">Surový obrázek Canon CRW</comment>
+ <comment xml:lang="da">Canon CRW-råbillede</comment>
+ <comment xml:lang="de">Canon-CRW-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto CRW de Canon</comment>
+ <comment xml:lang="eu">Canon CRW irudi gordina</comment>
+ <comment xml:lang="fi">Canon-CRW-raakakuva</comment>
+ <comment xml:lang="fo">Canon CRW rámynd</comment>
+ <comment xml:lang="fr">image brute CRW Canon</comment>
+ <comment xml:lang="ga">amhíomhá Canon CRW</comment>
+ <comment xml:lang="gl">imaxe en bruto de Canon CRW</comment>
+ <comment xml:lang="he">תמונה גולמית של Canon CRW</comment>
+ <comment xml:lang="hu">Canon CRW nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Canon CRW</comment>
+ <comment xml:lang="it">Immagine raw Canon CRW</comment>
+ <comment xml:lang="ja">Canon CRW raw 画像</comment>
+ <comment xml:lang="kk">Canon CRW өңделмеген суреті</comment>
+ <comment xml:lang="ko">캐논 CRW 원본 이미지</comment>
+ <comment xml:lang="lt">Canon CRW neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Canon CRW jēlattēls</comment>
+ <comment xml:lang="nb">Canon CRW raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Canon CRW-beeld</comment>
+ <comment xml:lang="nn">Canon CRW råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz CRW Canon</comment>
+ <comment xml:lang="pt_BR">Imagem bruta CRW da Canon</comment>
+ <comment xml:lang="ro">Imagine brută Canon CRW</comment>
+ <comment xml:lang="ru">необработанное изображение Canon CRW</comment>
+ <comment xml:lang="sk">Surový obrázok Canon CRW</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Canon CRW</comment>
+ <comment xml:lang="sq">Figurë raw Canon CRW</comment>
+ <comment xml:lang="sv">Canon CRW-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив CRW Canon</comment>
+ <comment xml:lang="vi">Ảnh thô Canon CRW</comment>
+ <comment xml:lang="zh_CN">Canon CRW 原始图像</comment>
+ <comment xml:lang="zh_TW">Canon CRW 原生影像</comment>
+ <acronym>CRW</acronym>
+ <expanded-acronym>Canon RaW</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+ <match value="II\x1a\x00\x00\x00HEAPCCDR" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.crw"/>
+ </mime-type>
+
+ <mime-type type="image/x-canon-cr2">
+ <comment>Canon CR2 raw image</comment>
+ <comment xml:lang="ar">صورة Canon CR2 خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Canon CR2</comment>
+ <comment xml:lang="bg">Изображение — Canon CR2 raw</comment>
+ <comment xml:lang="ca">imatge en cru de Canon CR2</comment>
+ <comment xml:lang="cs">Surový obrázek Canon CR2</comment>
+ <comment xml:lang="da">Canon CR2-råbillede</comment>
+ <comment xml:lang="de">Canon-CR2-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto CR2 de Canon</comment>
+ <comment xml:lang="eu">Canon CR2 irudi gordina</comment>
+ <comment xml:lang="fi">Canon-CR2-raakakuva</comment>
+ <comment xml:lang="fo">Canon CR2 rámynd</comment>
+ <comment xml:lang="fr">image brute CR2 Canon</comment>
+ <comment xml:lang="ga">amhíomhá Canon CR2</comment>
+ <comment xml:lang="gl">imaxe en bruto de Canon CR2</comment>
+ <comment xml:lang="he">תמונה גולמית של Canon CR2</comment>
+ <comment xml:lang="hu">Canon CR2 nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Canon CR2</comment>
+ <comment xml:lang="it">Immagine raw Canon CR2</comment>
+ <comment xml:lang="ja">Canon CR2 raw 画像</comment>
+ <comment xml:lang="kk">Canon CR2 өңделмеген суреті</comment>
+ <comment xml:lang="ko">캐논 CR2 원본 이미지</comment>
+ <comment xml:lang="lt">Canon CR2 neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Canon CR2 jēlattēls</comment>
+ <comment xml:lang="nb">Canon CR2 raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Canon CR2-beeld</comment>
+ <comment xml:lang="nn">Canon CR2 råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz CR2 Canon</comment>
+ <comment xml:lang="pt_BR">Imagem bruta CR2 da Canon</comment>
+ <comment xml:lang="ro">Imagine brută Canon CR2</comment>
+ <comment xml:lang="ru">необработанное изображение Canon CR2</comment>
+ <comment xml:lang="sk">Surový obrázok Canon CR2</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Canon CR2</comment>
+ <comment xml:lang="sq">Figurë raw Canon CR2</comment>
+ <comment xml:lang="sv">Canon CR2-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив CR2 Canon</comment>
+ <comment xml:lang="vi">Ảnh thô Canon CR2</comment>
+ <comment xml:lang="zh_CN">Canon CR2 原始图像</comment>
+ <comment xml:lang="zh_TW">Canon CR2 原生影像</comment>
+ <acronym>CR2</acronym>
+ <expanded-acronym>Canon Raw 2</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.cr2"/>
+ </mime-type>
+ <mime-type type="image/x-fuji-raf">
+ <comment>Fuji RAF raw image</comment>
+ <comment xml:lang="ar">صورة Fuji RAF خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Fuji RAF</comment>
+ <comment xml:lang="bg">Изображение — Fuji RAF raw</comment>
+ <comment xml:lang="ca">imatge en cru de Fuji RAF</comment>
+ <comment xml:lang="cs">Surový obrázek Fuji RAF</comment>
+ <comment xml:lang="da">Fuji RAF-råbillede</comment>
+ <comment xml:lang="de">Fuji-RAF-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto RAF de Fuji</comment>
+ <comment xml:lang="eu">Fuji RAF irudi gordina</comment>
+ <comment xml:lang="fi">Fuji-RAF-raakakuva</comment>
+ <comment xml:lang="fo">Fuji RAF raw mynd</comment>
+ <comment xml:lang="fr">image brute RAF Fuji</comment>
+ <comment xml:lang="ga">amhíomhá Fuji RAF</comment>
+ <comment xml:lang="gl">imaxe en bruto de Fuji RAF</comment>
+ <comment xml:lang="he">תמונה גולמית של Fuji RAF</comment>
+ <comment xml:lang="hu">Fuji RAF nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Fuji RAF</comment>
+ <comment xml:lang="it">Immagine raw Fuji RAF</comment>
+ <comment xml:lang="ja">Fuji RAF raw 画像</comment>
+ <comment xml:lang="kk">Fuji RAF өңделмеген суреті</comment>
+ <comment xml:lang="ko">후지 RAF 원본 이미지</comment>
+ <comment xml:lang="lt">Fuji RAF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Fuji RAF jēlattēls</comment>
+ <comment xml:lang="nb">Fuji RAF raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Fuji RAF-beeld</comment>
+ <comment xml:lang="nn">Fuji RAF rått bilete</comment>
+ <comment xml:lang="pl">Surowy obraz RAF Fuji</comment>
+ <comment xml:lang="pt_BR">Imagem bruta RAF da Fuji</comment>
+ <comment xml:lang="ro">Imagine brută Fuji RAF</comment>
+ <comment xml:lang="ru">необработанное изображение Fuji RAF</comment>
+ <comment xml:lang="sk">Surový obrázok Fuji RAF</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Fuji RAF</comment>
+ <comment xml:lang="sq">Figurë raw Fuji RAF</comment>
+ <comment xml:lang="sv">Fuji RAF-råbild</comment>
+ <comment xml:lang="uk">Цифровий негатив RAF Fuji</comment>
+ <comment xml:lang="vi">Ảnh thô Fuji RAF</comment>
+ <comment xml:lang="zh_CN">富士RAF 原始图像</comment>
+ <comment xml:lang="zh_TW">Fuji RAF 原生影像</comment>
+ <acronym>RAF</acronym>
+ <expanded-acronym>RAw Format</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+ <match value="FUJIFILMCCD-RAW " type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.raf"/>
+ </mime-type>
+ <mime-type type="image/x-kodak-dcr">
+ <comment>Kodak DCR raw image</comment>
+ <comment xml:lang="ar">صورة Kodak DCR خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Kodak DCR</comment>
+ <comment xml:lang="bg">Изображение — Kodak DCR raw</comment>
+ <comment xml:lang="ca">imatge en cru de Kodak DCR</comment>
+ <comment xml:lang="cs">Surový obrázek Kodak DCR</comment>
+ <comment xml:lang="da">Kodak DCR-råbillede</comment>
+ <comment xml:lang="de">Kodak-DCR-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto DCR de Kodak</comment>
+ <comment xml:lang="eu">Kodak DCR irudi gordina</comment>
+ <comment xml:lang="fi">Kodak-DCR-raakakuva</comment>
+ <comment xml:lang="fo">Kodak DCR rámynd</comment>
+ <comment xml:lang="fr">image brute DCR Kodak</comment>
+ <comment xml:lang="ga">amhíomhá Kodak DCR</comment>
+ <comment xml:lang="gl">imaxe en bruto de Kodad DCR</comment>
+ <comment xml:lang="he">תמונה גולמית של Kodak DCR</comment>
+ <comment xml:lang="hu">Kodak DCR nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Kodak DCR</comment>
+ <comment xml:lang="it">Immagine raw Kodak DCR</comment>
+ <comment xml:lang="ja">Kodak DCR raw 画像</comment>
+ <comment xml:lang="kk">Kodak DCR өңделмеген суреті</comment>
+ <comment xml:lang="ko">코닥 DCR 원본 이미지</comment>
+ <comment xml:lang="lt">Kodak DCR neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Kodak DCR jēlattēls</comment>
+ <comment xml:lang="nb">Kodak DCR raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Kodak DCR-beeld</comment>
+ <comment xml:lang="nn">Kodak DCR råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz DCR Kodak</comment>
+ <comment xml:lang="pt_BR">Imagem bruta DCR da Kodak</comment>
+ <comment xml:lang="ro">Imagine brută Kodak DCR</comment>
+ <comment xml:lang="ru">необработанное изображение Kodak DCR</comment>
+ <comment xml:lang="sk">Surový obrázok Kodak DCR</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Kodak DCR</comment>
+ <comment xml:lang="sq">Figurë raw Kodak DCR</comment>
+ <comment xml:lang="sv">Kodak DCR-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив DCR Kodak</comment>
+ <comment xml:lang="vi">Ảnh thô Kodak DCR</comment>
+ <comment xml:lang="zh_CN">Kodak DCR 原始图像</comment>
+ <comment xml:lang="zh_TW">Kodak DCR 原生影像</comment>
+ <acronym>DCR</acronym>
+ <expanded-acronym>Digital Camera Raw</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.dcr"/>
+ </mime-type>
+ <mime-type type="image/x-kodak-k25">
+ <comment>Kodak K25 raw image</comment>
+ <comment xml:lang="ar">صورة Kodak K25 خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Kodak K25</comment>
+ <comment xml:lang="bg">Изображение — Kodak K25 raw</comment>
+ <comment xml:lang="ca">imatge en cru de Kodak K25</comment>
+ <comment xml:lang="cs">Surový obrázek Kodak K25</comment>
+ <comment xml:lang="da">Kodak K25-råbillede</comment>
+ <comment xml:lang="de">Kodak-K25-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto K25 de Kodak</comment>
+ <comment xml:lang="eu">Kodak K25 raw image</comment>
+ <comment xml:lang="fi">Kodak-K25-raakakuva</comment>
+ <comment xml:lang="fo">Kodak K25 rámynd</comment>
+ <comment xml:lang="fr">image brute K25 Kodak</comment>
+ <comment xml:lang="ga">amhíomhá Kodak K25</comment>
+ <comment xml:lang="gl">imaxe en bruto de Kodad K25</comment>
+ <comment xml:lang="he">תמונה גולמית של Kodak K25</comment>
+ <comment xml:lang="hu">Kodak K25 nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Kodak K25</comment>
+ <comment xml:lang="it">Immagine raw Kodak K25</comment>
+ <comment xml:lang="ja">Kodak K25 raw 画像</comment>
+ <comment xml:lang="kk">Kodak K25 өңделмеген суреті</comment>
+ <comment xml:lang="ko">코닥 K25 원본 이미지</comment>
+ <comment xml:lang="lt">Kodak K25 neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Kodak K25 jēlattēls</comment>
+ <comment xml:lang="nb">Kodak K25 raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Kodak K25-beeld</comment>
+ <comment xml:lang="nn">Kodak K25 råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz K25 Kodak</comment>
+ <comment xml:lang="pt_BR">Imagem bruta K25 da Kodak</comment>
+ <comment xml:lang="ro">Imagine brută Kodak K25</comment>
+ <comment xml:lang="ru">необработанное изображение Kodak K25</comment>
+ <comment xml:lang="sk">Surový obrázok Kodak K25</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Kodak K25</comment>
+ <comment xml:lang="sq">Figurë raw Kodak K25</comment>
+ <comment xml:lang="sv">Kodak K25-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив K25 Kodak</comment>
+ <comment xml:lang="vi">Ảnh thô Kodak K25</comment>
+ <comment xml:lang="zh_CN">Kodak K25 原始图像</comment>
+ <comment xml:lang="zh_TW">Kodak K25 原生影像</comment>
+ <acronym>K25</acronym>
+ <expanded-acronym>Kodak DC25</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.k25"/>
+ </mime-type>
+ <mime-type type="image/x-kodak-kdc">
+ <comment>Kodak KDC raw image</comment>
+ <comment xml:lang="ar">صورة Kodak KDC خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Kodak KDC</comment>
+ <comment xml:lang="bg">Изображение — Kodak KDC raw</comment>
+ <comment xml:lang="ca">imatge en cru de Kodak KDC</comment>
+ <comment xml:lang="cs">Surový obrázek Kodak KDC</comment>
+ <comment xml:lang="da">Kodak KDC-råbillede</comment>
+ <comment xml:lang="de">Kodak-KDC-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto KDC de Kodak</comment>
+ <comment xml:lang="eu">Kodak KDC irudi gordina</comment>
+ <comment xml:lang="fi">Kodak-KDC-raakakuva</comment>
+ <comment xml:lang="fo">Kodak KDC rámynd</comment>
+ <comment xml:lang="fr">image brute KDC Kodak</comment>
+ <comment xml:lang="ga">amhíomhá Kodak KDC</comment>
+ <comment xml:lang="gl">imaxe en bruto de Kodad KDC</comment>
+ <comment xml:lang="he">תמונה גולמית של Kodak KDC</comment>
+ <comment xml:lang="hu">Kodak KDC nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Kodak KDC</comment>
+ <comment xml:lang="it">Immagine raw Kodak KDC</comment>
+ <comment xml:lang="ja">Kodak KDC raw 画像</comment>
+ <comment xml:lang="kk">Kodak KDC өңделмеген суреті</comment>
+ <comment xml:lang="ko">코닥 KDC 원본 이미지</comment>
+ <comment xml:lang="lt">Kodak KDC neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Kodak KDC jēlattēls</comment>
+ <comment xml:lang="nb">Kodak KDC raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Kodak KDC-beeld</comment>
+ <comment xml:lang="nn">Kodak KDC råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz KDC Kodak</comment>
+ <comment xml:lang="pt_BR">Imagem bruta KDC da Kodak</comment>
+ <comment xml:lang="ro">Imagine brută Kodak KDC</comment>
+ <comment xml:lang="ru">необработанное изображение Kodak KDC</comment>
+ <comment xml:lang="sk">Surový obrázok Kodak KDC</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Kodak KDC</comment>
+ <comment xml:lang="sq">Figurë raw Kodak KDC</comment>
+ <comment xml:lang="sv">Kodak KDC-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив KDC Kodak</comment>
+ <comment xml:lang="vi">Ảnh thô Kodak KDC</comment>
+ <comment xml:lang="zh_CN">Kodak KDC 原始图像</comment>
+ <comment xml:lang="zh_TW">Kodak KDC 原生影像</comment>
+ <acronym>KDC</acronym>
+ <expanded-acronym>Kodak Digital Camera</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <magic priority="80">
+ <match value="EASTMAN KODAK COMPANY" type="string" offset="242"/>
+ </magic>
+ <glob pattern="*.kdc"/>
+ </mime-type>
+ <mime-type type="image/x-minolta-mrw">
+ <comment>Minolta MRW raw image</comment>
+ <comment xml:lang="ar">صورة Minolta MRW خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Minolta MRW</comment>
+ <comment xml:lang="bg">Изображение — Minolta MRW raw</comment>
+ <comment xml:lang="ca">imatge en cru de Minolta MRW</comment>
+ <comment xml:lang="cs">Surový obrázek Minolta MRW</comment>
+ <comment xml:lang="da">Minolta MRW-råbillede</comment>
+ <comment xml:lang="de">Minolta-MRW-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto MRW de Minolta</comment>
+ <comment xml:lang="eu">Minolta MRW irudi gordina</comment>
+ <comment xml:lang="fi">Minolta-MRW-raakakuva</comment>
+ <comment xml:lang="fo">Minolta MRW rámynd</comment>
+ <comment xml:lang="fr">image brute MRW Minolta</comment>
+ <comment xml:lang="ga">amhíomhá Minolta MRW</comment>
+ <comment xml:lang="gl">imaxe RAW de Minolta MRW</comment>
+ <comment xml:lang="he">תמונה גולמית של Minolta MRW</comment>
+ <comment xml:lang="hu">Minolta MRW nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Minolta MRW</comment>
+ <comment xml:lang="it">Immagine raw Minolta MRW</comment>
+ <comment xml:lang="ja">Minolta MRW raw 画像</comment>
+ <comment xml:lang="kk">Minolta MRW өңделмеген суреті</comment>
+ <comment xml:lang="ko">미놀타 MRW 원본 이미지</comment>
+ <comment xml:lang="lt">Minolta MRW neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Minolta MRW jēlattēls</comment>
+ <comment xml:lang="nb">Minolta MRW raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Minolta MRW-beeld</comment>
+ <comment xml:lang="nn">Minolta MRW råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz MRW Minolta</comment>
+ <comment xml:lang="pt_BR">Imagem bruta MRW do Minolta</comment>
+ <comment xml:lang="ro">Imagine brută Minolta MRW</comment>
+ <comment xml:lang="ru">необработанное изображение Minolta MRW</comment>
+ <comment xml:lang="sk">Surový obrázok Minolta MRW</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Minolta MRW</comment>
+ <comment xml:lang="sq">Figurë raw Minolta MRW</comment>
+ <comment xml:lang="sv">Minolta MRW-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив MRW Minolta</comment>
+ <comment xml:lang="vi">Ảnh thô Minolta MRW</comment>
+ <comment xml:lang="zh_CN">Minolta MRW 原始图像</comment>
+ <comment xml:lang="zh_TW">Minolta MRW 原生影像</comment>
+ <acronym>MRW</acronym>
+ <expanded-acronym>Minolta RaW</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+ <match value="\x00MRM" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mrw"/>
+ </mime-type>
+ <mime-type type="image/x-nikon-nef">
+ <comment>Nikon NEF raw image</comment>
+ <comment xml:lang="ar">صورة Nikon NEF خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Nikon NEF</comment>
+ <comment xml:lang="bg">Изображение — Nikon NEF raw</comment>
+ <comment xml:lang="ca">imatge en cru de Nikon NEF</comment>
+ <comment xml:lang="cs">Surový obrázek Nikon NEF</comment>
+ <comment xml:lang="da">Nikon NEF-råbillede</comment>
+ <comment xml:lang="de">Nikon-NEF-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto NEF de Nikon</comment>
+ <comment xml:lang="eu">Nikon NEF irudi gordina</comment>
+ <comment xml:lang="fi">Nikon-NEF-raakakuva</comment>
+ <comment xml:lang="fo">Nikon NEF rámynd</comment>
+ <comment xml:lang="fr">image brute NEF Nikon</comment>
+ <comment xml:lang="ga">amhíomhá Nikon NEF</comment>
+ <comment xml:lang="gl">imaxe RAW NEF Nikon</comment>
+ <comment xml:lang="he">תמונה גולמית של Nikon NEF</comment>
+ <comment xml:lang="hu">Nikon NEF nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Nikon NEF</comment>
+ <comment xml:lang="it">Immagine raw Nikon NEF</comment>
+ <comment xml:lang="ja">Nikon NEF raw イメージ</comment>
+ <comment xml:lang="kk">Nikon NEF өңделмеген суреті</comment>
+ <comment xml:lang="ko">니콘 NEF 원본 이미지</comment>
+ <comment xml:lang="lt">Nikon NEF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Nikon NEF jēlattēls</comment>
+ <comment xml:lang="nb">Nikon NEF raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Nikon NEF-beeld</comment>
+ <comment xml:lang="nn">Nikon NEF råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz NEF Nikon</comment>
+ <comment xml:lang="pt_BR">Imagem bruta NEF da Nikon</comment>
+ <comment xml:lang="ro">Imagine brută Nikon NEF</comment>
+ <comment xml:lang="ru">необработанное изображение Nikon NEF</comment>
+ <comment xml:lang="sk">Surový obrázok Nikon NEF</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Nikon NEF</comment>
+ <comment xml:lang="sq">Figurë raw Nikon NEF</comment>
+ <comment xml:lang="sv">Nikon NEF-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив NEF Nikon</comment>
+ <comment xml:lang="vi">Ảnh thô Nikon NEF</comment>
+ <comment xml:lang="zh_CN">Nikon NEF 原始图像</comment>
+ <comment xml:lang="zh_TW">Nikon NEF 原生影像</comment>
+ <acronym>NEF</acronym>
+ <expanded-acronym>Nikon Electronic Format</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.nef"/>
+ </mime-type>
+ <mime-type type="image/x-olympus-orf">
+ <comment>Olympus ORF raw image</comment>
+ <comment xml:lang="ar">صورة Olympus ORF خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Olympus ORF</comment>
+ <comment xml:lang="bg">Изображение — Olympus ORF raw</comment>
+ <comment xml:lang="ca">imatge en cru d'Olympus ORF</comment>
+ <comment xml:lang="cs">Surový obrázek Olympus ORF</comment>
+ <comment xml:lang="da">Olympus ORF-råbillede</comment>
+ <comment xml:lang="de">Olympus-ORF-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto ORF de Olympus</comment>
+ <comment xml:lang="eu">Olympus ORF irudi gordina</comment>
+ <comment xml:lang="fi">Olympus-ORF-raakakuva</comment>
+ <comment xml:lang="fo">Olympus ORF rámynd</comment>
+ <comment xml:lang="fr">image brute ORF Olympus</comment>
+ <comment xml:lang="ga">amhíomhá Olympus ORF</comment>
+ <comment xml:lang="gl">imaxe en bruto de Olympus ORF</comment>
+ <comment xml:lang="he">תמונה גולמית של Olympus ORF</comment>
+ <comment xml:lang="hu">Olympus ORF nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Olympus ORF</comment>
+ <comment xml:lang="it">Immagine raw Olympus ORF</comment>
+ <comment xml:lang="ja">Olympus ORF raw 画像</comment>
+ <comment xml:lang="kk">Olympus ORF өңделмеген суреті</comment>
+ <comment xml:lang="ko">올림푸스 ORF 원본 이미지</comment>
+ <comment xml:lang="lt">Olympus ORF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Olympus ORF jēlattēls</comment>
+ <comment xml:lang="nb">Olympus ORF raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Olympus ORF-beeld</comment>
+ <comment xml:lang="nn">Olympus ORF råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz Olympus ORF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta ORF da Olympus</comment>
+ <comment xml:lang="ro">Imagine brută Olympus ORF</comment>
+ <comment xml:lang="ru">необработанное изображение Olympus ORF</comment>
+ <comment xml:lang="sk">Surový obrázok Olympus ORF</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Olympus ORF</comment>
+ <comment xml:lang="sq">Figurë raw Olympus ORF</comment>
+ <comment xml:lang="sv">Olympus ORF-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив ORF Olympus</comment>
+ <comment xml:lang="vi">Ảnh thô Olympus ORF</comment>
+ <comment xml:lang="zh_CN">Olympus ORF 原始图像</comment>
+ <comment xml:lang="zh_TW">Olympus ORF 原生影像</comment>
+ <acronym>ORF</acronym>
+ <expanded-acronym>Olympus Raw Format</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+
+
+
+
+
+ <match value="IIRO\x08\x00\x00\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.orf"/>
+ </mime-type>
+ <mime-type type="image/x-panasonic-raw">
+ <comment>Panasonic raw image</comment>
+ <comment xml:lang="ar">صورة Panasonic خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Panasonic</comment>
+ <comment xml:lang="bg">Изображение — Panasonic raw</comment>
+ <comment xml:lang="ca">imatge en cru de Panasonic</comment>
+ <comment xml:lang="cs">Surový obrázek Panasonic</comment>
+ <comment xml:lang="da">Panasonicråbillede (raw)</comment>
+ <comment xml:lang="de">Panasonic-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto de Panasonic</comment>
+ <comment xml:lang="eu">Panasonic irudi gordina</comment>
+ <comment xml:lang="fi">Panasonic-raakakuva</comment>
+ <comment xml:lang="fo">Panasonic rámynd</comment>
+ <comment xml:lang="fr">image brute Panasonic</comment>
+ <comment xml:lang="ga">amhíomhá Panasonic</comment>
+ <comment xml:lang="gl">imaxe en bruto de Panasonic</comment>
+ <comment xml:lang="he">תמונה גולמית של Panasonic</comment>
+ <comment xml:lang="hu">Panasonic nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Panasonic</comment>
+ <comment xml:lang="it">Immagine raw Panasonic</comment>
+ <comment xml:lang="ja">Panasonic raw 画像</comment>
+ <comment xml:lang="kk">Panasonic өңделмеген суреті</comment>
+ <comment xml:lang="ko">파나소닉 원본 이미지</comment>
+ <comment xml:lang="lt">Panasonic neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Panasonic jēlattēls</comment>
+ <comment xml:lang="nb">Panasonic raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Panasonic-beeld</comment>
+ <comment xml:lang="nn">Panasonic råbilete</comment>
+ <comment xml:lang="pl">Obraz raw Panasonic</comment>
+ <comment xml:lang="pt_BR">Imagem bruta da Panasonic</comment>
+ <comment xml:lang="ro">Imagine brută Panasonic</comment>
+ <comment xml:lang="ru">необработанное изображение Panasonic</comment>
+ <comment xml:lang="sk">Surový obrázok Panasonic</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Panasonic</comment>
+ <comment xml:lang="sq">Figurë raw Panasonic</comment>
+ <comment xml:lang="sv">Panasonic-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив Panasonic</comment>
+ <comment xml:lang="vi">Ảnh thô Panasonic</comment>
+ <comment xml:lang="zh_CN">Panasonic 原始图像</comment>
+ <comment xml:lang="zh_TW">Panasonic 原生影像</comment>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+
+ <match value="IIU\x00\x08\x00\x00\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.raw"/>
+ </mime-type>
+ <mime-type type="image/x-panasonic-raw2">
+ <comment>Panasonic raw2 image</comment>
+ <comment xml:lang="bg">Изображение — Panasonic raw2</comment>
+ <comment xml:lang="ca">imatge «RAW2» de Panasonic</comment>
+ <comment xml:lang="cs">Surový obrázek Panasonic raw2</comment>
+ <comment xml:lang="da">Panasonic-rå2-billede (raw)</comment>
+ <comment xml:lang="de">Panasonic raw2-Bild</comment>
+ <comment xml:lang="es">imagen en bruto raw2 de Panasonic</comment>
+ <comment xml:lang="fi">Panasonic raw2 -kuva</comment>
+ <comment xml:lang="fr">image raw2 Panasonic</comment>
+ <comment xml:lang="gl">imaxe en bruto raw2 de Panasonic</comment>
+ <comment xml:lang="he">תמונת raw2 של Panasonic</comment>
+ <comment xml:lang="hu">Panasonic raw2 kép</comment>
+ <comment xml:lang="id">Image Panasonic raw2</comment>
+ <comment xml:lang="it">Immagine raw2 Panasonic</comment>
+ <comment xml:lang="ja">Panasonic raw2 画像</comment>
+ <comment xml:lang="kk">Panasonic raw2 суреті</comment>
+ <comment xml:lang="ko">파나소닉 원본 이미지 2</comment>
+ <comment xml:lang="lv">Panasonic raw2 jēlattēls</comment>
+ <comment xml:lang="pl">Obraz raw2 Panasonic</comment>
+ <comment xml:lang="ru">необработанное изображение Panasonic RAW 2</comment>
+ <comment xml:lang="sk">Surový obrázok Panasonic raw2</comment>
+ <comment xml:lang="sl">Slikovna datoteka Panasonic raw2</comment>
+ <comment xml:lang="sv">Panasonic raw2-bild</comment>
+ <comment xml:lang="uk">зображення формату raw2 Panasonic</comment>
+ <comment xml:lang="zh_CN">Panasonic raw2 图像</comment>
+ <comment xml:lang="zh_TW">Panasonic raw2 影像</comment>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+
+ <match value="IIU\x00\x18\x00\x00\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.rw2"/>
+ </mime-type>
+ <mime-type type="image/x-pentax-pef">
+ <comment>Pentax PEF raw image</comment>
+ <comment xml:lang="ar">صورة Pentax PEF خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Pentax PEF</comment>
+ <comment xml:lang="bg">Изображение — Pentax PEF raw</comment>
+ <comment xml:lang="ca">imatge en cru de Pentax PEF</comment>
+ <comment xml:lang="cs">Surový obrázek Pentax PEF</comment>
+ <comment xml:lang="da">Pentax PEF-råbillede</comment>
+ <comment xml:lang="de">Pentax-PEF-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto PEF de Pentax</comment>
+ <comment xml:lang="eu">Pentax PEF irudi gordina</comment>
+ <comment xml:lang="fi">Pentax-PEF-raakakuva</comment>
+ <comment xml:lang="fo">Pentax PEF rámynd</comment>
+ <comment xml:lang="fr">image brute PEF Pentax</comment>
+ <comment xml:lang="ga">amhíomhá Pentax PEF</comment>
+ <comment xml:lang="gl">imaxe en bruto PEF de Pentax</comment>
+ <comment xml:lang="he">תמונה גולמית של Pentax PEF</comment>
+ <comment xml:lang="hu">Pentax PEF nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Pentax PEF</comment>
+ <comment xml:lang="it">Immagine raw Pentax PEF</comment>
+ <comment xml:lang="ja">Pentax PEF raw 画像</comment>
+ <comment xml:lang="kk">Pentax PEF өңделмеген суреті</comment>
+ <comment xml:lang="ko">펜탁스 PEF 원본 이미지</comment>
+ <comment xml:lang="lt">Pentax PEF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Pentax PEF jēlattēls</comment>
+ <comment xml:lang="nb">Pentax PEF raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Pentax PEF-beeld</comment>
+ <comment xml:lang="nn">Pentax PEF råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz Pentax PEF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta PEF da Pentax</comment>
+ <comment xml:lang="ro">Imagine brută Pentax PEF</comment>
+ <comment xml:lang="ru">необработанное изображение Pentax PEF</comment>
+ <comment xml:lang="sk">Surový obrázok Pentax PEF</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Pentax PEF</comment>
+ <comment xml:lang="sq">Figurë raw Pentax PEF</comment>
+ <comment xml:lang="sv">Pentax PEF-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив PEF Pentax</comment>
+ <comment xml:lang="vi">Ảnh thô Pentax PEF</comment>
+ <comment xml:lang="zh_CN">Pentax PEF 原始图像</comment>
+ <comment xml:lang="zh_TW">Pentax PEF 原生影像</comment>
+ <acronym>PEF</acronym>
+ <expanded-acronym>Pentax Electronic Format</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.pef"/>
+ </mime-type>
+ <mime-type type="image/x-sigma-x3f">
+ <comment>Sigma X3F raw image</comment>
+ <comment xml:lang="ar">صورة Sigma X3F خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sigma X3F</comment>
+ <comment xml:lang="bg">Изображение — Sigma X3F raw</comment>
+ <comment xml:lang="ca">imatge en cru de Sigma X3F</comment>
+ <comment xml:lang="cs">Surový obrázek Sigma X3F</comment>
+ <comment xml:lang="da">Sigma X3F-råbillede</comment>
+ <comment xml:lang="de">Sigma-X3F-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto X3F de Sigma</comment>
+ <comment xml:lang="eu">Sigma X3F irudi gordina</comment>
+ <comment xml:lang="fi">Sigma-X3F-raakakuva</comment>
+ <comment xml:lang="fo">Sigma X3F rámynd</comment>
+ <comment xml:lang="fr">image brute X3F Sigma</comment>
+ <comment xml:lang="ga">amhíomhá Sigma X3F</comment>
+ <comment xml:lang="gl">imaxe en bruto X3F de Sigma</comment>
+ <comment xml:lang="he">תמונה גולמית של Sigma X3F</comment>
+ <comment xml:lang="hu">Sigma XF3 nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Sigma X3F</comment>
+ <comment xml:lang="it">Immagine raw Sigma X3F</comment>
+ <comment xml:lang="ja">Sigma X3F raw 画像</comment>
+ <comment xml:lang="kk">Sigma X3F өңделмеген суреті</comment>
+ <comment xml:lang="ko">시그마 X3F 원본 이미지</comment>
+ <comment xml:lang="lt">Sigma X3F neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Sigma X3F jēlattēls</comment>
+ <comment xml:lang="nb">Sigma X3F raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Sigma X3F-beeld</comment>
+ <comment xml:lang="nn">Sigma X3F råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz X3F Sigma</comment>
+ <comment xml:lang="pt_BR">Imagem bruta X3F da Sigma</comment>
+ <comment xml:lang="ro">Imagine brută Sigma X3F</comment>
+ <comment xml:lang="ru">необработанное изображение Sigma X3F</comment>
+ <comment xml:lang="sk">Surový obrázok Sigma X3F</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sigma X3F</comment>
+ <comment xml:lang="sq">Fifurë raw Sigma X3F</comment>
+ <comment xml:lang="sv">Sigma X3F-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив X3F Sigma</comment>
+ <comment xml:lang="vi">Ảnh thô Sigma X3F</comment>
+ <comment xml:lang="zh_CN">Sigma X3F 原始图像</comment>
+ <comment xml:lang="zh_TW">Sigma X3F 原生影像</comment>
+ <acronym>X3F</acronym>
+ <expanded-acronym>X3 Foveon</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <magic priority="50">
+
+ <match value="FOVb" type="string" offset="0">
+
+ <match value="0x00FF00FF" type="little32" offset="4" mask="0xFF00FF00"/>
+ </match>
+ </magic>
+ <glob pattern="*.x3f"/>
+ </mime-type>
+ <mime-type type="image/x-sony-srf">
+ <comment>Sony SRF raw image</comment>
+ <comment xml:lang="ar">صورة Sony SRF خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sony SRF</comment>
+ <comment xml:lang="bg">Изображение — Sony SRF raw</comment>
+ <comment xml:lang="ca">imatge en cru de Sony SRF</comment>
+ <comment xml:lang="cs">Surový obrázek Sony SRF</comment>
+ <comment xml:lang="da">Sony SRF-råbillede</comment>
+ <comment xml:lang="de">Sony-SRF-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto SRF de Sony</comment>
+ <comment xml:lang="eu">Sony SRF irudi gordina</comment>
+ <comment xml:lang="fi">Sony-SRF-raakakuva</comment>
+ <comment xml:lang="fo">Sony SRF rámynd</comment>
+ <comment xml:lang="fr">image brute SRF Sony</comment>
+ <comment xml:lang="ga">amhíomhá Sony SRF</comment>
+ <comment xml:lang="gl">imaxe en bruto SRF de sony</comment>
+ <comment xml:lang="he">תמונה גולמית של Sony SRF</comment>
+ <comment xml:lang="hu">Sony SRF nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Sony SRF</comment>
+ <comment xml:lang="it">Immagine raw Sony SRF</comment>
+ <comment xml:lang="ja">Sony SRF raw 画像</comment>
+ <comment xml:lang="kk">Sony SRF өңделмеген суреті</comment>
+ <comment xml:lang="ko">소니 SRF 원본 이미지</comment>
+ <comment xml:lang="lt">Sony SRF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Sony SRF jēlattēls</comment>
+ <comment xml:lang="nb">Sony SRF raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Sony SRF-beeld</comment>
+ <comment xml:lang="nn">Sony SRF råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz SRF Sony</comment>
+ <comment xml:lang="pt_BR">Imagem bruta SRF da Sony</comment>
+ <comment xml:lang="ro">Imagine brută Sony SRF</comment>
+ <comment xml:lang="ru">необработанное изображение Sony SRF</comment>
+ <comment xml:lang="sk">Surový obrázok Sony SRF</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sony SRF</comment>
+ <comment xml:lang="sq">Figurë raw Sony SRF</comment>
+ <comment xml:lang="sv">Sony SRF-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив SRF Sony</comment>
+ <comment xml:lang="vi">Ảnh thô Sony SRF</comment>
+ <comment xml:lang="zh_CN">Sony SRF 原始映像</comment>
+ <comment xml:lang="zh_TW">Sony SRF 原生影像</comment>
+ <acronym>SRF</acronym>
+ <expanded-acronym>Sony Raw Format</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.srf"/>
+ </mime-type>
+ <mime-type type="image/x-sony-sr2">
+ <comment>Sony SR2 raw image</comment>
+ <comment xml:lang="ar">صورة Sony SR2 خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sony SR2</comment>
+ <comment xml:lang="bg">Изображение — Sony SR2 raw</comment>
+ <comment xml:lang="ca">imatge en cru de Sony SR2</comment>
+ <comment xml:lang="cs">Surový obrázek Sony SR2</comment>
+ <comment xml:lang="da">Sony SR2-råbillede</comment>
+ <comment xml:lang="de">Sony-SR2-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto SR2 de Sony</comment>
+ <comment xml:lang="eu">Sony SR2 irudi gordina</comment>
+ <comment xml:lang="fi">Sony-SR2-raakakuva</comment>
+ <comment xml:lang="fo">Sony SR2 rámynd</comment>
+ <comment xml:lang="fr">image brute SR2 Sony</comment>
+ <comment xml:lang="ga">amhíomhá Sony SR2</comment>
+ <comment xml:lang="gl">imaxe en bruto SR2 de sony</comment>
+ <comment xml:lang="he">תמונה גולמית של Sony SR2</comment>
+ <comment xml:lang="hu">Sony SR2 nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Sony SR2</comment>
+ <comment xml:lang="it">Immagine raw Sony SR2</comment>
+ <comment xml:lang="ja">Sony SR2 raw 画像</comment>
+ <comment xml:lang="kk">Sony SR2 өңделмеген суреті</comment>
+ <comment xml:lang="ko">소니 SR2 원본 이미지</comment>
+ <comment xml:lang="lt">Sony SR2 neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Sony SR2 jēlattēls</comment>
+ <comment xml:lang="nb">Sony SR2 raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Sony SR2-beeld</comment>
+ <comment xml:lang="nn">Sony SR2 råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz SR2 Sony</comment>
+ <comment xml:lang="pt_BR">Imagem bruta SR2 da Sony</comment>
+ <comment xml:lang="ro">Imagine brută Sony SR2</comment>
+ <comment xml:lang="ru">необработанное изображение Sony SR2</comment>
+ <comment xml:lang="sk">Surový obrázok Sony SR2</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sony SR2</comment>
+ <comment xml:lang="sq">Figurë raw Sony SR2</comment>
+ <comment xml:lang="sv">Sony SR2-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив SR2 Sony</comment>
+ <comment xml:lang="vi">Ảnh thô Sony SR2</comment>
+ <comment xml:lang="zh_CN">Sony SR2 原始映像</comment>
+ <comment xml:lang="zh_TW">Sony SR2 原生影像</comment>
+ <acronym>SR2</acronym>
+ <expanded-acronym>Sony Raw format 2</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.sr2"/>
+ </mime-type>
+ <mime-type type="image/x-sony-arw">
+ <comment>Sony ARW raw image</comment>
+ <comment xml:lang="ar">صورة Sony ARW خامة</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sony ARW</comment>
+ <comment xml:lang="bg">Изображение — Sony ARW raw</comment>
+ <comment xml:lang="ca">imatge en cru de Sony ARW</comment>
+ <comment xml:lang="cs">Surový obrázek Sony ARW</comment>
+ <comment xml:lang="da">Sony ARW-råbillede</comment>
+ <comment xml:lang="de">Sony-ARW-Rohbild</comment>
+ <comment xml:lang="es">imagen en bruto ARW de Sony</comment>
+ <comment xml:lang="eu">Sony ARW irudi gordina</comment>
+ <comment xml:lang="fi">Sony-ARW-raakakuva</comment>
+ <comment xml:lang="fo">Sony ARW rámynd</comment>
+ <comment xml:lang="fr">image brute ARW Sony</comment>
+ <comment xml:lang="ga">amhíomhá Sony ARW</comment>
+ <comment xml:lang="gl">imaxe en bruto ARW de sony</comment>
+ <comment xml:lang="he">תמונה גולמית של Sony ARW</comment>
+ <comment xml:lang="hu">Sony ARW nyers kép</comment>
+ <comment xml:lang="id">Citra mentah Sony ARW</comment>
+ <comment xml:lang="it">Immagine raw Sony ARW</comment>
+ <comment xml:lang="ja">Sony ARW raw 画像</comment>
+ <comment xml:lang="kk">Sony ARW өңделмеген суреті</comment>
+ <comment xml:lang="ko">소니 ARW 원본 이미지</comment>
+ <comment xml:lang="lt">Sony ARW neapdorotas paveikslėlis</comment>
+ <comment xml:lang="lv">Sony ARW jēlattēls</comment>
+ <comment xml:lang="nb">Sony ARW raw-bilde</comment>
+ <comment xml:lang="nl">onbewerkt Sony ARW-beeld</comment>
+ <comment xml:lang="nn">Sony ARW råbilete</comment>
+ <comment xml:lang="pl">Surowy obraz ARW Sony</comment>
+ <comment xml:lang="pt_BR">Imagem bruta ARW da Sony</comment>
+ <comment xml:lang="ro">Imagine brută Sony ARW</comment>
+ <comment xml:lang="ru">необработанное изображение Sony ARW</comment>
+ <comment xml:lang="sk">Surový obrázok Sony ARW</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sony ARW</comment>
+ <comment xml:lang="sq">Figurë raw Sony ARW</comment>
+ <comment xml:lang="sv">Sony ARW-råbild</comment>
+ <comment xml:lang="uk">цифровий негатив ARW Sony</comment>
+ <comment xml:lang="vi">Ảnh thô Sony ARW</comment>
+ <comment xml:lang="zh_CN">Sony ARW 原始映像</comment>
+ <comment xml:lang="zh_TW">Sony ARW 原生影像</comment>
+ <acronym>ARW</acronym>
+ <expanded-acronym>Alpha Raw format</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.arw"/>
+ </mime-type>
+ <mime-type type="image/png">
+ <comment>PNG image</comment>
+ <comment xml:lang="ar">صورة PNG</comment>
+ <comment xml:lang="az">PNG rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava PNG</comment>
+ <comment xml:lang="bg">Изображение — PNG</comment>
+ <comment xml:lang="ca">imatge PNG</comment>
+ <comment xml:lang="cs">Obrázek PNG</comment>
+ <comment xml:lang="cy">Delwedd PNG</comment>
+ <comment xml:lang="da">PNG-billede</comment>
+ <comment xml:lang="de">PNG-Bild</comment>
+ <comment xml:lang="el">εικόνα PNG</comment>
+ <comment xml:lang="en_GB">PNG image</comment>
+ <comment xml:lang="eo">PNG-bildo</comment>
+ <comment xml:lang="es">imagen PNG</comment>
+ <comment xml:lang="eu">PNG irudia</comment>
+ <comment xml:lang="fi">PNG-kuva</comment>
+ <comment xml:lang="fo">PNG mynd</comment>
+ <comment xml:lang="fr">image PNG</comment>
+ <comment xml:lang="ga">íomhá PNG</comment>
+ <comment xml:lang="gl">imaxe PNG</comment>
+ <comment xml:lang="he">תמונת PNG</comment>
+ <comment xml:lang="hu">PNG-kép</comment>
+ <comment xml:lang="id">Citra PNG</comment>
+ <comment xml:lang="it">Immagine PNG</comment>
+ <comment xml:lang="ja">PNG 画像</comment>
+ <comment xml:lang="kk">PNG суреті</comment>
+ <comment xml:lang="ko">PNG 그림</comment>
+ <comment xml:lang="lt">PNG paveikslėlis</comment>
+ <comment xml:lang="lv">PNG attēls</comment>
+ <comment xml:lang="ms">Imej PNG</comment>
+ <comment xml:lang="nb">PNG-bilde</comment>
+ <comment xml:lang="nl">PNG-afbeelding</comment>
+ <comment xml:lang="nn">PNG-bilete</comment>
+ <comment xml:lang="pl">Obraz PNG</comment>
+ <comment xml:lang="pt">imagem PNG</comment>
+ <comment xml:lang="pt_BR">Imagem PNG</comment>
+ <comment xml:lang="ro">Imagine PNG</comment>
+ <comment xml:lang="ru">изображение PNG</comment>
+ <comment xml:lang="sk">Obrázok PNG</comment>
+ <comment xml:lang="sl">Slikovna datoteka PNG</comment>
+ <comment xml:lang="sq">Figurë PNG</comment>
+ <comment xml:lang="sr">PNG слика</comment>
+ <comment xml:lang="sv">PNG-bild</comment>
+ <comment xml:lang="uk">зображення PNG</comment>
+ <comment xml:lang="vi">Ảnh PNG</comment>
+ <comment xml:lang="zh_CN">PNG 图像</comment>
+ <comment xml:lang="zh_TW">PNG 影像</comment>
+ <magic priority="50">
+ <match value="\x89PNG" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.png"/>
+ </mime-type>
+ <mime-type type="image/rle">
+ <comment>Run Length Encoded bitmap image</comment>
+ <comment xml:lang="ar">تشغيل صورة نقطية طولية الترميز</comment>
+ <comment xml:lang="be@latin">Bitmapnaja vyjava, zakadavanaja ŭ Run Length</comment>
+ <comment xml:lang="bg">Изображение — RLE Bitmap</comment>
+ <comment xml:lang="ca">imatge de mapa de bits «Run Lenght Encoded»</comment>
+ <comment xml:lang="cs">Obrázek bitové mapy Run Length Encoded</comment>
+ <comment xml:lang="da">Run Length Encoded-bitmapbillede</comment>
+ <comment xml:lang="de">Lauflängenkodiertes Bitmap-Bild</comment>
+ <comment xml:lang="es">mapa de bits con codificación del tamaño durante la ejecución</comment>
+ <comment xml:lang="eu">'Run Lenght Encoded' bitmap irudia</comment>
+ <comment xml:lang="fi">RLE-koodattu bittikartta</comment>
+ <comment xml:lang="fr">image matricielle Run Length Encoded</comment>
+ <comment xml:lang="ga">íomhá mhapa giotáin Run Length Encoded</comment>
+ <comment xml:lang="gl">mapa de bits con codificación do tamaño durante a execución</comment>
+ <comment xml:lang="he">מקודד מפת סיביות של Run Length</comment>
+ <comment xml:lang="hu">Run Length Encoded bitkép</comment>
+ <comment xml:lang="id">Citra peta bit Run Length Encoded</comment>
+ <comment xml:lang="it">Immagine bitmap RLE (Run Length Encoded)</comment>
+ <comment xml:lang="ja">ランレングス符号化ビットマップ画像</comment>
+ <comment xml:lang="kk">RLE сығылған растрлік суреті</comment>
+ <comment xml:lang="ko">실행 길이 인코딩된 비트맵 그림</comment>
+ <comment xml:lang="lt">Run Length Encoded rastrinis paveikslėlis</comment>
+ <comment xml:lang="lv">Secīgo atkārtojumu kodēts bitkartes attēls</comment>
+ <comment xml:lang="nb">Run Length Encoded bitmap bilde</comment>
+ <comment xml:lang="nl">RLE-gecodeerde bitmap-afbeelding</comment>
+ <comment xml:lang="nn">Run Length Encoded punktgrafikk</comment>
+ <comment xml:lang="pl">Obraz bitmapy RLE</comment>
+ <comment xml:lang="pt_BR">Classe de comprimento imagem bitmap codificada</comment>
+ <comment xml:lang="ro">Imagine bitmap codată RLE</comment>
+ <comment xml:lang="ru">растровое изображение (сжатое RLE)</comment>
+ <comment xml:lang="sk">Bitmapový obrázok Run Length Encoded</comment>
+ <comment xml:lang="sl">Zaporedno kodirana bitna slika (RLE)</comment>
+ <comment xml:lang="sq">Figurë bitmap RLE (Run Length Encoded)</comment>
+ <comment xml:lang="sv">Körlängdskodad bitmappbild</comment>
+ <comment xml:lang="uk">растрове зображення RLE</comment>
+ <comment xml:lang="vi">Ảnh mảng mã hóa chiều dài chạy (RLE)</comment>
+ <comment xml:lang="zh_CN">游程编码位图</comment>
+ <comment xml:lang="zh_TW">Run Length Encoded 點陣影像</comment>
+ <glob pattern="*.rle"/>
+ </mime-type>
+ <mime-type type="image/svg+xml">
+ <comment>SVG image</comment>
+ <comment xml:lang="ar">صورة SVG</comment>
+ <comment xml:lang="be@latin">Vyjava SVG</comment>
+ <comment xml:lang="bg">Изображение — SVG</comment>
+ <comment xml:lang="ca">imatge SVG</comment>
+ <comment xml:lang="cs">Obrázek SVG</comment>
+ <comment xml:lang="da">SVG-billede</comment>
+ <comment xml:lang="de">SVG-Bild</comment>
+ <comment xml:lang="en_GB">SVG image</comment>
+ <comment xml:lang="eo">SVG-bildo</comment>
+ <comment xml:lang="es">imagen SVG</comment>
+ <comment xml:lang="eu">SVG irudia</comment>
+ <comment xml:lang="fi">SVG-kuva</comment>
+ <comment xml:lang="fo">SVG mynd</comment>
+ <comment xml:lang="fr">image SVG</comment>
+ <comment xml:lang="ga">íomhá SVG</comment>
+ <comment xml:lang="gl">imaxe SVG</comment>
+ <comment xml:lang="he">תמונת SVG</comment>
+ <comment xml:lang="hu">SVG kép</comment>
+ <comment xml:lang="id">Citra SVG</comment>
+ <comment xml:lang="it">Immagine SVG</comment>
+ <comment xml:lang="ja">SVG 画像</comment>
+ <comment xml:lang="kk">SVG суреті</comment>
+ <comment xml:lang="ko">SVG 그림</comment>
+ <comment xml:lang="lt">SVG paveikslėlis</comment>
+ <comment xml:lang="lv">SVG attēls</comment>
+ <comment xml:lang="nb">SVG-bilde</comment>
+ <comment xml:lang="nl">SVG-afbeelding</comment>
+ <comment xml:lang="nn">SVG-bilete</comment>
+ <comment xml:lang="pl">Obraz SVG</comment>
+ <comment xml:lang="pt_BR">Imagem SVG</comment>
+ <comment xml:lang="ro">Imagine SVG</comment>
+ <comment xml:lang="ru">изображение SVG</comment>
+ <comment xml:lang="sk">Obrázok SVG</comment>
+ <comment xml:lang="sl">Slikovna vektorska datoteka SVG</comment>
+ <comment xml:lang="sq">Figurë SVG</comment>
+ <comment xml:lang="sv">SVG-bild</comment>
+ <comment xml:lang="uk">зображення SVG</comment>
+ <comment xml:lang="vi">Ảnh SVG</comment>
+ <comment xml:lang="zh_CN">SVG 图像</comment>
+ <comment xml:lang="zh_TW">SVG 影像</comment>
+ <acronym>SVG</acronym>
+ <expanded-acronym>Scalable Vector Graphics</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <magic priority="80">
+ <match value="&lt;!DOCTYPE svg" type="string" offset="0:256"/>
+ <match value="&lt;svg" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.svg"/>
+ <root-XML namespaceURI="http://www.w3.org/2000/svg" localName="svg"/>
+ </mime-type>
+ <mime-type type="image/svg+xml-compressed">
+ <comment>compressed SVG image</comment>
+ <comment xml:lang="ar">صورة SVG مضغوطة</comment>
+ <comment xml:lang="be@latin">skampresavanaja vyjava SVG</comment>
+ <comment xml:lang="bg">Изображение — SVG, компресирано</comment>
+ <comment xml:lang="ca">imatge SVG comprimida</comment>
+ <comment xml:lang="cs">Komprimovaný obrázek SVG</comment>
+ <comment xml:lang="da">SVG-komprimeret billede</comment>
+ <comment xml:lang="de">Komprimiertes SVG-Bild</comment>
+ <comment xml:lang="es">imagen SVG comprimida</comment>
+ <comment xml:lang="eu">konprimitutako SVG irudia</comment>
+ <comment xml:lang="fi">pakattu SVG-kuva</comment>
+ <comment xml:lang="fo">stappað SVG mynd</comment>
+ <comment xml:lang="fr">image SVG compressée</comment>
+ <comment xml:lang="ga">íomhá SVG comhbhrúite</comment>
+ <comment xml:lang="gl">imaxe SVG comprimida</comment>
+ <comment xml:lang="he">תמונת SVG מכוצת</comment>
+ <comment xml:lang="hu">tömörített SVG kép</comment>
+ <comment xml:lang="id">Citra SVG terkompresi</comment>
+ <comment xml:lang="it">Immagine SVG compressa</comment>
+ <comment xml:lang="ja">圧縮 SVG 画像</comment>
+ <comment xml:lang="kk">сығылған SVG суреті</comment>
+ <comment xml:lang="ko">압축한 SVG 그림</comment>
+ <comment xml:lang="lt">suglaudintas SVG paveikslėlis</comment>
+ <comment xml:lang="lv">saspiests SVG attēls</comment>
+ <comment xml:lang="nb">komprimert SVG-bilde</comment>
+ <comment xml:lang="nl">ingepakte SVG-afbeelding</comment>
+ <comment xml:lang="nn">komprimert SVG-bilete</comment>
+ <comment xml:lang="pl">Skompresowany obraz SVG</comment>
+ <comment xml:lang="pt_BR">Imagem compactada SVG</comment>
+ <comment xml:lang="ro">imagine comprimată SVG</comment>
+ <comment xml:lang="ru">сжатое изображение SVG</comment>
+ <comment xml:lang="sk">Komprimovaný obrázok SVG</comment>
+ <comment xml:lang="sl">Slikovna datoteka SVG (stisnjena)</comment>
+ <comment xml:lang="sq">Figurë SVG e kompresuar</comment>
+ <comment xml:lang="sv">komprimerad SVG-bild</comment>
+ <comment xml:lang="uk">стиснене зображення SVG</comment>
+ <comment xml:lang="vi">ảnh SVG đã nén</comment>
+ <comment xml:lang="zh_CN">压缩的 SVG 图像</comment>
+ <comment xml:lang="zh_TW">壓縮版 SVG 影像</comment>
+ <acronym>SVG</acronym>
+ <expanded-acronym>Scalable Vector Graphics</expanded-acronym>
+ <sub-class-of type="application/x-gzip"/>
+ <glob pattern="*.svgz"/>
+ </mime-type>
+ <mime-type type="image/tiff">
+ <comment>TIFF image</comment>
+ <comment xml:lang="ar">صورة TIFF</comment>
+ <comment xml:lang="be@latin">Vyjava TIFF</comment>
+ <comment xml:lang="bg">Изображение — TIFF</comment>
+ <comment xml:lang="ca">imatge TIFF</comment>
+ <comment xml:lang="cs">Obrázek TIFF</comment>
+ <comment xml:lang="da">TIFF-billede</comment>
+ <comment xml:lang="de">TIFF-Bild</comment>
+ <comment xml:lang="el">εικόνα TIFF</comment>
+ <comment xml:lang="en_GB">TIFF image</comment>
+ <comment xml:lang="eo">TIFF-bildo</comment>
+ <comment xml:lang="es">imagen TIFF</comment>
+ <comment xml:lang="eu">TIFF irudia</comment>
+ <comment xml:lang="fi">TIFF-kuva</comment>
+ <comment xml:lang="fo">TIFF mynd</comment>
+ <comment xml:lang="fr">image TIFF</comment>
+ <comment xml:lang="ga">íomhá TIFF</comment>
+ <comment xml:lang="gl">imaxe TIFF</comment>
+ <comment xml:lang="he">תמונת TIFF</comment>
+ <comment xml:lang="hu">TIFF-kép</comment>
+ <comment xml:lang="id">Citra TIFF</comment>
+ <comment xml:lang="it">Immagine TIFF</comment>
+ <comment xml:lang="ja">TIFF 画像</comment>
+ <comment xml:lang="kk">TIFF суреті</comment>
+ <comment xml:lang="ko">TIFF 그림</comment>
+ <comment xml:lang="lt">TIFF paveikslėlis</comment>
+ <comment xml:lang="lv">TIFF attēls</comment>
+ <comment xml:lang="ms">Imej TIFF</comment>
+ <comment xml:lang="nb">TIFF-bilde</comment>
+ <comment xml:lang="nl">TIFF-afbeelding</comment>
+ <comment xml:lang="nn">TIFF-bilete</comment>
+ <comment xml:lang="pl">Obraz TIFF</comment>
+ <comment xml:lang="pt">imagem TIFF</comment>
+ <comment xml:lang="pt_BR">Imagem TIFF</comment>
+ <comment xml:lang="ro">Imagine TIFF</comment>
+ <comment xml:lang="ru">изображение TIFF</comment>
+ <comment xml:lang="sk">Obrázok TIFF</comment>
+ <comment xml:lang="sl">Slikovna datoteka TIFF</comment>
+ <comment xml:lang="sq">Figurë TIFF</comment>
+ <comment xml:lang="sr">TIFF слика</comment>
+ <comment xml:lang="sv">TIFF-bild</comment>
+ <comment xml:lang="uk">зображення TIFF</comment>
+ <comment xml:lang="vi">Ảnh TIFF</comment>
+ <comment xml:lang="zh_CN">TIFF 图像</comment>
+ <comment xml:lang="zh_TW">TIFF 影像</comment>
+ <acronym>TIFF</acronym>
+ <expanded-acronym>Tagged Image File Format</expanded-acronym>
+ <magic priority="50">
+ <match value="MM\x00\x2a" type="string" offset="0"/>
+ <match value="II\x2a\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.tif"/>
+ <glob pattern="*.tiff"/>
+ </mime-type>
+ <mime-type type="image/vnd.dwg">
+ <comment>AutoCAD image</comment>
+ <comment xml:lang="ar">صورة AutoCAD</comment>
+ <comment xml:lang="az">AutoCAD rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava AutoCAD</comment>
+ <comment xml:lang="bg">Изображение — AutoCAD</comment>
+ <comment xml:lang="ca">imatge d'AutoCAD</comment>
+ <comment xml:lang="cs">Obrázek AutoCAD</comment>
+ <comment xml:lang="cy">Delwedd AutoCAD</comment>
+ <comment xml:lang="da">AutoCAD-billede</comment>
+ <comment xml:lang="de">AutoCAD-Bild</comment>
+ <comment xml:lang="el">εικόνα AutoCAD</comment>
+ <comment xml:lang="en_GB">AutoCAD image</comment>
+ <comment xml:lang="eo">AutoCAD-bildo</comment>
+ <comment xml:lang="es">imagen de AutoCAD</comment>
+ <comment xml:lang="eu">AutoCAD-eko irudia</comment>
+ <comment xml:lang="fi">AutoCAD-kuva</comment>
+ <comment xml:lang="fo">AutoCAD mynd</comment>
+ <comment xml:lang="fr">image AutoCAD</comment>
+ <comment xml:lang="ga">íomhá AutoCAD</comment>
+ <comment xml:lang="gl">imaxe de AutoCAD</comment>
+ <comment xml:lang="he">תמונה של AutoCAD</comment>
+ <comment xml:lang="hu">AutoCAD-kép</comment>
+ <comment xml:lang="id">Citra AutoCAD</comment>
+ <comment xml:lang="it">Immagine AutoCAD</comment>
+ <comment xml:lang="ja">AutoCAD 画像</comment>
+ <comment xml:lang="kk">AutoCAD суреті</comment>
+ <comment xml:lang="ko">AutoCAD 그림</comment>
+ <comment xml:lang="lt">AutoCAD paveikslėlis</comment>
+ <comment xml:lang="lv">AutoCAD attēls</comment>
+ <comment xml:lang="ms">Imej AutoCAD</comment>
+ <comment xml:lang="nb">AutoCAD-bilde</comment>
+ <comment xml:lang="nl">AutoCAD-afbeelding</comment>
+ <comment xml:lang="nn">AutoCAD-bilete</comment>
+ <comment xml:lang="pl">Obraz AutoCAD</comment>
+ <comment xml:lang="pt">imagem AutoCAD</comment>
+ <comment xml:lang="pt_BR">Imagem do AutoCAD</comment>
+ <comment xml:lang="ro">Imagine AutoCAD</comment>
+ <comment xml:lang="ru">изображение AutoCAD</comment>
+ <comment xml:lang="sk">Obrázok AutoCAD</comment>
+ <comment xml:lang="sl">Slikovna datoteka AutoCAD</comment>
+ <comment xml:lang="sq">Figurë AutoCAD</comment>
+ <comment xml:lang="sr">AutoCAD слика</comment>
+ <comment xml:lang="sv">AutoCAD-bild</comment>
+ <comment xml:lang="uk">зображення AutoCAD</comment>
+ <comment xml:lang="vi">Ảnh AutoCAD</comment>
+ <comment xml:lang="zh_CN">AutoCAD 图像</comment>
+ <comment xml:lang="zh_TW">AutoCAD 影像</comment>
+ <glob pattern="*.dwg"/>
+ </mime-type>
+ <mime-type type="image/vnd.dxf">
+ <comment>DXF vector image</comment>
+ <comment xml:lang="ar">صورة DXF نقطية</comment>
+ <comment xml:lang="be@latin">Vektarnaja vyjava DXF</comment>
+ <comment xml:lang="bg">Изображение — DXF</comment>
+ <comment xml:lang="ca">imatge vectorial DXF</comment>
+ <comment xml:lang="cs">Vektorový obrázek DXF</comment>
+ <comment xml:lang="da">DXF-vektorbillede</comment>
+ <comment xml:lang="de">DXF-Vektorbild</comment>
+ <comment xml:lang="el">ανυσματική εικόνα DXF</comment>
+ <comment xml:lang="en_GB">DXF vector image</comment>
+ <comment xml:lang="eo">vektora DXF-bildo</comment>
+ <comment xml:lang="es">imagen vectorial DXF</comment>
+ <comment xml:lang="eu">DXF bektore-grafikoa</comment>
+ <comment xml:lang="fi">DXF-vektorikuva</comment>
+ <comment xml:lang="fo">DXF vektormynd</comment>
+ <comment xml:lang="fr">image vectorielle DXF</comment>
+ <comment xml:lang="ga">íomhá veicteoir DXF</comment>
+ <comment xml:lang="gl">imaxe de vector DXF</comment>
+ <comment xml:lang="he">תמונת DXF וקטורית</comment>
+ <comment xml:lang="hu">DXF-vektorkép</comment>
+ <comment xml:lang="id">Citra vektor DXF</comment>
+ <comment xml:lang="it">Immagine vettoriale DXF</comment>
+ <comment xml:lang="ja">DXF ベクター画像</comment>
+ <comment xml:lang="kk">DXF векторлық суреті</comment>
+ <comment xml:lang="ko">DXF 벡터 그림</comment>
+ <comment xml:lang="lt">DXF vektorinis paveikslėlis</comment>
+ <comment xml:lang="lv">DXF vektora attēls</comment>
+ <comment xml:lang="ms">Imej vektor DXF</comment>
+ <comment xml:lang="nb">DXF-vektorgrafikk</comment>
+ <comment xml:lang="nl">DXF-vectorafbeelding</comment>
+ <comment xml:lang="nn">DXF-vektorgrafikk</comment>
+ <comment xml:lang="pl">Obraz wektorowy DXF</comment>
+ <comment xml:lang="pt">imagem de vectores DXF</comment>
+ <comment xml:lang="pt_BR">Imagem vetorial DXF</comment>
+ <comment xml:lang="ro">Imagine vectorială DXF</comment>
+ <comment xml:lang="ru">векторное изображение DXF</comment>
+ <comment xml:lang="sk">Vektorový obrázok DXF</comment>
+ <comment xml:lang="sl">Slikovna vektorska datoteka DXF</comment>
+ <comment xml:lang="sq">Figurë vektoriale DFX</comment>
+ <comment xml:lang="sr">DXF векторска графика</comment>
+ <comment xml:lang="sv">DXF-vektorbild</comment>
+ <comment xml:lang="uk">векторне зображення DXF</comment>
+ <comment xml:lang="vi">Ảnh véc-tơ DXF</comment>
+ <comment xml:lang="zh_CN">DXF 矢量图像</comment>
+ <comment xml:lang="zh_TW">DXF 向量圖</comment>
+ <glob pattern="*.dxf"/>
+ <magic priority="50">
+ <match value="\nHEADER\n" type="string" offset="0:64"/>
+ <match value="\x0d\nHEADER\x0d\n" type="string" offset="0:64"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/vnd.ms-modi">
+ <comment>Microsoft Document Imaging format</comment>
+ <comment xml:lang="ar">صيغة مستند تصوير مايكروسوفت</comment>
+ <comment xml:lang="bg">Изображение — Microsoft Document Imaging</comment>
+ <comment xml:lang="ca">format Microsoft Document Imaging</comment>
+ <comment xml:lang="cs">Formát Microsoft Document Imaging</comment>
+ <comment xml:lang="da">Microsofts dokumentbilledformat</comment>
+ <comment xml:lang="de">Microsoft-Document-Imaging-Bildformat</comment>
+ <comment xml:lang="es">formato de imagen de Microsoft Document</comment>
+ <comment xml:lang="eu">Microsoft Document Imaging formatua</comment>
+ <comment xml:lang="fi">Microsoft Document Imaging -muoto</comment>
+ <comment xml:lang="fo">Microsoft Document Imaging snið</comment>
+ <comment xml:lang="fr">format Document Imaging Microsoft</comment>
+ <comment xml:lang="ga">formáid Microsoft Document Imaging</comment>
+ <comment xml:lang="gl">formato de Microsoft Document Imaging</comment>
+ <comment xml:lang="he">פורמט של Microsoft Document Imaging</comment>
+ <comment xml:lang="hu">Microsoft Document Imaging formátum</comment>
+ <comment xml:lang="id">Format Microsoft Document Imaging</comment>
+ <comment xml:lang="it">Formato MDI (Microsoft Document Imaging)</comment>
+ <comment xml:lang="ja">Microsoft ドキュメントイメージフォーマット</comment>
+ <comment xml:lang="kk">Microsoft Document Imaging пішімі</comment>
+ <comment xml:lang="ko">마이크로소프트 문서 이미지 형식</comment>
+ <comment xml:lang="lt">Microsoft Document Imaging formatas</comment>
+ <comment xml:lang="lv">Microsoft dokumentu attēlošanas formāts</comment>
+ <comment xml:lang="nl">Microsoft Document Imaging</comment>
+ <comment xml:lang="pl">Format Microsoft Document Imaging</comment>
+ <comment xml:lang="pt_BR">Formato do Microsoft Document Imaging</comment>
+ <comment xml:lang="ro">Format Microsoft Document Imaging</comment>
+ <comment xml:lang="ru">формат Microsoft Document Imaging</comment>
+ <comment xml:lang="sk">Formát Microsoft Document Imaging</comment>
+ <comment xml:lang="sl">Zapis Microsoft Document Imaging</comment>
+ <comment xml:lang="sv">Microsoft Document Imaging-format</comment>
+ <comment xml:lang="uk">формат Microsoft Document Imaging</comment>
+ <comment xml:lang="vi">Định dạng tạo ảnh tài liệu Microsoft</comment>
+ <comment xml:lang="zh_CN">Microsoft Document Imaging 扫描图像</comment>
+ <comment xml:lang="zh_TW">微軟文件影像格式</comment>
+ <acronym>MDI</acronym>
+ <expanded-acronym>Microsoft Document Imaging</expanded-acronym>
+ <glob pattern="*.mdi"/>
+ <magic priority="50">
+ <match value="\x45\x50\x2A\x00" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-3ds">
+ <comment>3D Studio image</comment>
+ <comment xml:lang="ar">صورة استديو ثلاثية الأبعاد</comment>
+ <comment xml:lang="az">3D Studio rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava 3D Studio</comment>
+ <comment xml:lang="bg">Изображение — 3D Studio</comment>
+ <comment xml:lang="ca">imatge de 3D Studio</comment>
+ <comment xml:lang="cs">Obrázek 3D Studio</comment>
+ <comment xml:lang="cy">Delwedd "3D Studio"</comment>
+ <comment xml:lang="da">3D Studio-billede</comment>
+ <comment xml:lang="de">3D-Studio-Bild</comment>
+ <comment xml:lang="el">εικόνα 3D Studio</comment>
+ <comment xml:lang="en_GB">3D Studio image</comment>
+ <comment xml:lang="eo">bildo de 3D Studio</comment>
+ <comment xml:lang="es">imagen de 3D Studio</comment>
+ <comment xml:lang="eu">3D Studio-ko irudia</comment>
+ <comment xml:lang="fi">3D Studio -kuva</comment>
+ <comment xml:lang="fo">3D Studio mynd</comment>
+ <comment xml:lang="fr">image 3D Studio</comment>
+ <comment xml:lang="ga">íomhá 3D Studio</comment>
+ <comment xml:lang="gl">imaxe de 3D Studio</comment>
+ <comment xml:lang="he">תמונת 3D Studio</comment>
+ <comment xml:lang="hu">3D Studio-kép</comment>
+ <comment xml:lang="id">Citra 3D Studio</comment>
+ <comment xml:lang="it">Immagine 3D Studio</comment>
+ <comment xml:lang="ja">3D Studio 画像</comment>
+ <comment xml:lang="kk">3D Studio суреті</comment>
+ <comment xml:lang="ko">3D Studio 그림</comment>
+ <comment xml:lang="lt">3D Studio paveikslėlis</comment>
+ <comment xml:lang="lv">3D Studio attēls</comment>
+ <comment xml:lang="ms">Imej 3D Studio</comment>
+ <comment xml:lang="nb">3D Studio-bilde</comment>
+ <comment xml:lang="nl">3D-Studio-afbeelding</comment>
+ <comment xml:lang="nn">3D Studio-bilete</comment>
+ <comment xml:lang="pl">Obraz 3D Studio</comment>
+ <comment xml:lang="pt">imagem 3D Studio</comment>
+ <comment xml:lang="pt_BR">Imagem do 3D Studio</comment>
+ <comment xml:lang="ro">Imagine 3D Studio</comment>
+ <comment xml:lang="ru">сцена 3D Studio</comment>
+ <comment xml:lang="sk">Obrázok 3D Studio</comment>
+ <comment xml:lang="sl">Slikovna datoteka 3D Studio</comment>
+ <comment xml:lang="sq">Figurë 3D Studio</comment>
+ <comment xml:lang="sr">3D Studio слика</comment>
+ <comment xml:lang="sv">3D Studio-bild</comment>
+ <comment xml:lang="uk">зображення 3D Studio</comment>
+ <comment xml:lang="vi">Ảnh xuởng vẽ 3D</comment>
+ <comment xml:lang="zh_CN">3D Studio 图像</comment>
+ <comment xml:lang="zh_TW">3D Studio 影像</comment>
+ <glob pattern="*.3ds"/>
+ </mime-type>
+ <mime-type type="image/x-applix-graphics">
+ <comment>Applix Graphics image</comment>
+ <comment xml:lang="ar">صورة رسوميات Applix</comment>
+ <comment xml:lang="be@latin">Vyjava Applix Graphics</comment>
+ <comment xml:lang="bg">Изображение — Applix Graphics</comment>
+ <comment xml:lang="ca">imatge d'Applix Graphics</comment>
+ <comment xml:lang="cs">Obrázek Applix Graphics</comment>
+ <comment xml:lang="da">Applix Graphics-billede</comment>
+ <comment xml:lang="de">Applix-Graphics-Bild</comment>
+ <comment xml:lang="el">εικόνα Applix Graphics</comment>
+ <comment xml:lang="en_GB">Applix Graphics image</comment>
+ <comment xml:lang="eo">bildo de Applix Graphics</comment>
+ <comment xml:lang="es">imagen de Applix Graphics</comment>
+ <comment xml:lang="eu">Applix Graphics irudia</comment>
+ <comment xml:lang="fi">Applix Graphics -kuva</comment>
+ <comment xml:lang="fo">Applix Graphics mynd</comment>
+ <comment xml:lang="fr">image Applix Graphics</comment>
+ <comment xml:lang="ga">íomhá Applix Graphics</comment>
+ <comment xml:lang="gl">imaxe de Applix Graphics</comment>
+ <comment xml:lang="he">תמונה של Applix Graphics</comment>
+ <comment xml:lang="hu">Applix Graphics-kép</comment>
+ <comment xml:lang="id">Citra Applix Graphics</comment>
+ <comment xml:lang="it">Immagine Applix Graphics</comment>
+ <comment xml:lang="ja">Applix Graphics 画像</comment>
+ <comment xml:lang="kk">Applix Graphics суреті</comment>
+ <comment xml:lang="ko">Applix Graphics 그림</comment>
+ <comment xml:lang="lt">Applix Graphics paveikslėlis</comment>
+ <comment xml:lang="lv">Applix Graphics attēls</comment>
+ <comment xml:lang="ms">Imej Applix Graphics</comment>
+ <comment xml:lang="nb">Applix Graphics-dokument</comment>
+ <comment xml:lang="nl">Applix Graphics-afbeelding</comment>
+ <comment xml:lang="nn">Applix Graphics-dokument</comment>
+ <comment xml:lang="pl">Obraz Applix Graphics</comment>
+ <comment xml:lang="pt">imagem Applix Graphics</comment>
+ <comment xml:lang="pt_BR">Imagem do Applix Graphics</comment>
+ <comment xml:lang="ro">Imagine Applix Graphics</comment>
+ <comment xml:lang="ru">изображение Applix Graphics</comment>
+ <comment xml:lang="sk">Obrázok Applix Graphics</comment>
+ <comment xml:lang="sl">Slikovna datoteka Applix Graphics</comment>
+ <comment xml:lang="sq">Figurë Applix Graphics</comment>
+ <comment xml:lang="sr">Applix графички документ</comment>
+ <comment xml:lang="sv">Applix Graphics-bild</comment>
+ <comment xml:lang="uk">зображення Applix Graphics</comment>
+ <comment xml:lang="vi">Ảnh Applix Graphics</comment>
+ <comment xml:lang="zh_CN">Applix Graphics 图像</comment>
+ <comment xml:lang="zh_TW">Applix Graphics 影像</comment>
+ <magic priority="50">
+ <match value="*BEGIN" type="string" offset="0">
+ <match value="GRAPHICS" type="string" offset="7"/>
+ </match>
+ </magic>
+ <glob pattern="*.ag"/>
+ </mime-type>
+ <mime-type type="image/x-bzeps">
+ <comment>EPS image (bzip-compressed)</comment>
+ <comment xml:lang="ar">صورة EPS (مضغوط-bzip)</comment>
+ <comment xml:lang="be@latin">Vyjava EPS (bzip-skampresavanaja)</comment>
+ <comment xml:lang="bg">Изображение — EPS, компресирано с bzip</comment>
+ <comment xml:lang="ca">imatge EPS (comprimida amb bzip)</comment>
+ <comment xml:lang="cs">Obrázek EPS (komprimovaný pomocí bzip)</comment>
+ <comment xml:lang="da">EPS-billede (bzip-komprimeret)</comment>
+ <comment xml:lang="de">EPS-Bild (bzip-komprimiert)</comment>
+ <comment xml:lang="es">imagen EPS (comprimida con bzip)</comment>
+ <comment xml:lang="eu">EPS irudia (bzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">EPS-kuva (bzip-pakattu)</comment>
+ <comment xml:lang="fo">EPS mynd (bzip-stappað)</comment>
+ <comment xml:lang="fr">image EPS (compressée bzip)</comment>
+ <comment xml:lang="ga">íomhá EPS (comhbhrúite le bzip)</comment>
+ <comment xml:lang="gl">imaxe EPS (comprimida con bzip)</comment>
+ <comment xml:lang="he">תמונת EPS (מכווץ בbzip)</comment>
+ <comment xml:lang="hu">EPS kép (bzip-tömörítésű)</comment>
+ <comment xml:lang="id">Citra EPS (terkompresi bzip)</comment>
+ <comment xml:lang="it">Immagine EPS (compressa con bzip)</comment>
+ <comment xml:lang="ja">EPS 画像 (bzip 圧縮)</comment>
+ <comment xml:lang="kk">EPS суреті (bzip-пен сығылған)</comment>
+ <comment xml:lang="ko">EPS 그림 (BZIP 압축)</comment>
+ <comment xml:lang="lt">EPS paveikslėlis (suglaudintas su bzip)</comment>
+ <comment xml:lang="lv">EPS attēls (saspiests ar bzip)</comment>
+ <comment xml:lang="nb">EPS-bilde (bzip-komprimert)</comment>
+ <comment xml:lang="nl">EPS-afbeelding (ingepakt met bzip)</comment>
+ <comment xml:lang="nn">EPS-bilete (pakka med bzip)</comment>
+ <comment xml:lang="pl">Obraz EPS (kompresja bzip)</comment>
+ <comment xml:lang="pt_BR">Imagem EPS (compactada com bzip)</comment>
+ <comment xml:lang="ro">Imagine EPS (compresie bzip)</comment>
+ <comment xml:lang="ru">изображение EPS (сжатое bzip)</comment>
+ <comment xml:lang="sk">Obrázok EPS (komprimovaný pomocou bzip)</comment>
+ <comment xml:lang="sl">Slikovna datoteka EPS (stisnjena z bzip)</comment>
+ <comment xml:lang="sq">Figurë EPS (e kompresuar me bzip)</comment>
+ <comment xml:lang="sv">EPS-bild (bzip-komprimerad)</comment>
+ <comment xml:lang="uk">зображення EPS (стиснене bzip)</comment>
+ <comment xml:lang="vi">Ảnh EPS (đã nén bzip)</comment>
+ <comment xml:lang="zh_CN">EPS 图像(bzip 压缩)</comment>
+ <comment xml:lang="zh_TW">EPS 影像 (bzip 格式壓縮)</comment>
+ <glob pattern="*.eps.bz2"/>
+ <glob pattern="*.epsi.bz2"/>
+ <glob pattern="*.epsf.bz2"/>
+ </mime-type>
+ <mime-type type="image/x-cmu-raster">
+ <comment>CMU raster image</comment>
+ <comment xml:lang="ar">صورة CMU نقطية</comment>
+ <comment xml:lang="az">CMU raster rəsmi</comment>
+ <comment xml:lang="be@latin">Rastravaja vyjava CMU</comment>
+ <comment xml:lang="bg">Изображение — CMU raster</comment>
+ <comment xml:lang="ca">imatge ràster CMU</comment>
+ <comment xml:lang="cs">Rastrový obrázek CMU</comment>
+ <comment xml:lang="cy">Delwedd raster CMU</comment>
+ <comment xml:lang="da">CMU-rasterbillede</comment>
+ <comment xml:lang="de">CMU-Rasterbild</comment>
+ <comment xml:lang="el">εικόνα ράστερ CMU</comment>
+ <comment xml:lang="en_GB">CMU raster image</comment>
+ <comment xml:lang="eo">rastruma bildo de CMU</comment>
+ <comment xml:lang="es">imagen ráster CMU</comment>
+ <comment xml:lang="eu">CMU bilbe-irudia</comment>
+ <comment xml:lang="fi">CMU-rasterikuva</comment>
+ <comment xml:lang="fo">CMU raster mynd</comment>
+ <comment xml:lang="fr">image raster CMU</comment>
+ <comment xml:lang="ga">íomhá rastar CMU</comment>
+ <comment xml:lang="gl">imaxe raster CMU</comment>
+ <comment xml:lang="he">תמונת סריקה CMU</comment>
+ <comment xml:lang="hu">CMU-raszterkép</comment>
+ <comment xml:lang="id">Citra raster CMU</comment>
+ <comment xml:lang="it">Immagine raster CMU</comment>
+ <comment xml:lang="ja">CMU ラスター画像</comment>
+ <comment xml:lang="kk">CMU растрлық суреті</comment>
+ <comment xml:lang="ko">CMU 래스터 그림</comment>
+ <comment xml:lang="lt">CMU rastrinis paveikslėlis</comment>
+ <comment xml:lang="lv">CMU rastra attēls</comment>
+ <comment xml:lang="ms">Imej raster CMU</comment>
+ <comment xml:lang="nb">CMU-rasterbilde</comment>
+ <comment xml:lang="nl">CMU-rasterafbeelding</comment>
+ <comment xml:lang="nn">CMU rasterbilete</comment>
+ <comment xml:lang="pl">Obraz rastrowy CMU</comment>
+ <comment xml:lang="pt">imagem rasterizada CMU</comment>
+ <comment xml:lang="pt_BR">Imagem raster CMU</comment>
+ <comment xml:lang="ro">Imagine raster CMU</comment>
+ <comment xml:lang="ru">растровое изображение CMU</comment>
+ <comment xml:lang="sk">Rastrový obrázok CMU</comment>
+ <comment xml:lang="sl">Slikovna rastrska datoteka CMU</comment>
+ <comment xml:lang="sq">Figurë raster CMU</comment>
+ <comment xml:lang="sr">CMU растерска слика</comment>
+ <comment xml:lang="sv">CMU-rasterbild</comment>
+ <comment xml:lang="uk">растрове зображення CMU</comment>
+ <comment xml:lang="vi">Ảnh mành CMU</comment>
+ <comment xml:lang="zh_CN">CMU 矢量图像</comment>
+ <comment xml:lang="zh_TW">CMU raster 影像</comment>
+ <glob pattern="*.ras"/>
+ </mime-type>
+ <mime-type type="image/x-compressed-xcf">
+ <comment>compressed GIMP image</comment>
+ <comment xml:lang="ar">صورة GIMP مضغوطة</comment>
+ <comment xml:lang="be@latin">skampresavanaja vyjava GIMP</comment>
+ <comment xml:lang="bg">Изображение — GIMP, компресирано</comment>
+ <comment xml:lang="ca">imatge GIMP comprimida</comment>
+ <comment xml:lang="cs">Komprimovaný obrázek GIMP</comment>
+ <comment xml:lang="da">komprimeret GIMP-billede</comment>
+ <comment xml:lang="de">Komprimiertes GIMP-Bild</comment>
+ <comment xml:lang="es">imagen GIMP comprimida</comment>
+ <comment xml:lang="eu">konprimitutako GIMP irudia</comment>
+ <comment xml:lang="fi">pakattu GIMP-kuva</comment>
+ <comment xml:lang="fo">stappað GIMP mynd</comment>
+ <comment xml:lang="fr">image GIMP compressée</comment>
+ <comment xml:lang="ga">íomhá GIMP comhbhrúite</comment>
+ <comment xml:lang="gl">imaxe de GIMP comprimida</comment>
+ <comment xml:lang="he">תמונת GIMP מכווצת</comment>
+ <comment xml:lang="hu">tömörített GIMP kép</comment>
+ <comment xml:lang="id">Citra GIMP terkompresi</comment>
+ <comment xml:lang="it">Immagine GIMP compressa</comment>
+ <comment xml:lang="ja">圧縮 GIMP 画像</comment>
+ <comment xml:lang="kk">сығылған GIMP суреті</comment>
+ <comment xml:lang="ko">압축한 GIMP 그림</comment>
+ <comment xml:lang="lt">suglaudintas GIMP paveikslėlis</comment>
+ <comment xml:lang="lv">saspiests GIMP attēls</comment>
+ <comment xml:lang="nb">komprimert GIMP-bilde</comment>
+ <comment xml:lang="nl">ingepakte GIMP-afbeelding</comment>
+ <comment xml:lang="nn">komprimert GIMP-bilete</comment>
+ <comment xml:lang="pl">Skompresowany obraz GIMP</comment>
+ <comment xml:lang="pt_BR">Imagem compactada do GIMP</comment>
+ <comment xml:lang="ro">imagine comprimată GIMP</comment>
+ <comment xml:lang="ru">сжатое изображение GIMP</comment>
+ <comment xml:lang="sk">Komprimovaný obrázok GIMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka GIMP (stisnjena)</comment>
+ <comment xml:lang="sq">Figurë GIMP e kompresuar</comment>
+ <comment xml:lang="sv">komprimerad GIMP-bild</comment>
+ <comment xml:lang="uk">стиснене зображення GIMP</comment>
+ <comment xml:lang="vi">ảnh GIMP đã nén</comment>
+ <comment xml:lang="zh_CN">压缩的 GIMP 图像</comment>
+ <comment xml:lang="zh_TW">壓縮版 GIMP 影像</comment>
+ <glob pattern="*.xcf.gz"/>
+ <glob pattern="*.xcf.bz2"/>
+ </mime-type>
+ <mime-type type="application/dicom">
+ <comment>DICOM image</comment>
+ <comment xml:lang="ar">صورة DICOM</comment>
+ <comment xml:lang="be@latin">Vyjava DICOM</comment>
+ <comment xml:lang="bg">Изображение — DICOM</comment>
+ <comment xml:lang="ca">imatge DICOM</comment>
+ <comment xml:lang="cs">Obrázek DICOM</comment>
+ <comment xml:lang="da">DICOM-billede</comment>
+ <comment xml:lang="de">DICOM-Bild</comment>
+ <comment xml:lang="en_GB">DICOM image</comment>
+ <comment xml:lang="eo">DICOM-bildo</comment>
+ <comment xml:lang="es">imagen DICOM</comment>
+ <comment xml:lang="eu">DICOM irudia</comment>
+ <comment xml:lang="fi">DICOM-kuva</comment>
+ <comment xml:lang="fo">DICOM mynd</comment>
+ <comment xml:lang="fr">image DICOM</comment>
+ <comment xml:lang="ga">íomhá DICOM</comment>
+ <comment xml:lang="gl">imaxe DICOM</comment>
+ <comment xml:lang="he">תמונת DICOM</comment>
+ <comment xml:lang="hu">DICOM kép</comment>
+ <comment xml:lang="id">Citra DICOM</comment>
+ <comment xml:lang="it">Immagine DICOM</comment>
+ <comment xml:lang="ja">DICOM 画像</comment>
+ <comment xml:lang="kk">DICOM суреті</comment>
+ <comment xml:lang="ko">DICOM 그림</comment>
+ <comment xml:lang="lt">DICOM paveikslėlis</comment>
+ <comment xml:lang="lv">DICOM attēls</comment>
+ <comment xml:lang="nb">DICOM-bilde</comment>
+ <comment xml:lang="nl">DICOM-afbeelding</comment>
+ <comment xml:lang="nn">DICOM-bilete</comment>
+ <comment xml:lang="pl">Obraz DICOM</comment>
+ <comment xml:lang="pt_BR">Imagem DICOM</comment>
+ <comment xml:lang="ro">Imagine DICOM</comment>
+ <comment xml:lang="ru">изображение DICOM</comment>
+ <comment xml:lang="sk">Obrázok DICOM</comment>
+ <comment xml:lang="sl">Slikovna datoteka DICOM</comment>
+ <comment xml:lang="sq">Figurë DICOM</comment>
+ <comment xml:lang="sv">DICOM-bild</comment>
+ <comment xml:lang="uk">зображення DICOM</comment>
+ <comment xml:lang="vi">Ảnh DICOM</comment>
+ <comment xml:lang="zh_CN">DICOM 图像</comment>
+ <comment xml:lang="zh_TW">DICOM 影像</comment>
+ <acronym>DICOM</acronym>
+ <expanded-acronym>Digital Imaging and Communications in Medicine</expanded-acronym>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="*.dcm"/>
+ <magic priority="50">
+ <match value="DICM" type="string" offset="128"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/docbook+xml">
+ <comment>DocBook document</comment>
+ <comment xml:lang="ar">مستند DocBook</comment>
+ <comment xml:lang="be@latin">Dakument DocBook</comment>
+ <comment xml:lang="bg">Документ — DocBook</comment>
+ <comment xml:lang="ca">document DocBook</comment>
+ <comment xml:lang="cs">Dokument DocBook</comment>
+ <comment xml:lang="da">DocBook-dokument</comment>
+ <comment xml:lang="de">DocBook-Dokument</comment>
+ <comment xml:lang="en_GB">DocBook document</comment>
+ <comment xml:lang="eo">DocBook-dokumento</comment>
+ <comment xml:lang="es">documento DocBook</comment>
+ <comment xml:lang="eu">DocBook dokumentua</comment>
+ <comment xml:lang="fi">DocBook-asiakirja</comment>
+ <comment xml:lang="fo">DocBook skjal</comment>
+ <comment xml:lang="fr">document DocBook</comment>
+ <comment xml:lang="ga">cáipéis DocBook</comment>
+ <comment xml:lang="gl">documento de DocBook</comment>
+ <comment xml:lang="he">מסמך DocBook</comment>
+ <comment xml:lang="hu">DocBook dokumentum</comment>
+ <comment xml:lang="id">Dokumen DocBook</comment>
+ <comment xml:lang="it">Documento DocBook</comment>
+ <comment xml:lang="ja">DocBook ドキュメント</comment>
+ <comment xml:lang="kk">DocBook құжаты</comment>
+ <comment xml:lang="ko">DocBook 문서</comment>
+ <comment xml:lang="lt">DocBook dokumentas</comment>
+ <comment xml:lang="lv">DocBook dokuments</comment>
+ <comment xml:lang="nb">DocBook-dokument</comment>
+ <comment xml:lang="nl">DocBook-document</comment>
+ <comment xml:lang="nn">DocBook-dokument</comment>
+ <comment xml:lang="pl">Dokument DocBook</comment>
+ <comment xml:lang="pt_BR">Documento DocBook</comment>
+ <comment xml:lang="ro">Document DocBook</comment>
+ <comment xml:lang="ru">документ DocBook</comment>
+ <comment xml:lang="sk">Dokument DocBook</comment>
+ <comment xml:lang="sl">Dokument DocBook</comment>
+ <comment xml:lang="sq">Dokument DocBook</comment>
+ <comment xml:lang="sv">DocBook-dokument</comment>
+ <comment xml:lang="uk">документ DocBook</comment>
+ <comment xml:lang="vi">Tài liệu DocBook</comment>
+ <comment xml:lang="zh_CN">DocBook 文档</comment>
+ <comment xml:lang="zh_TW">DocBook 文件</comment>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="90">
+ <match value="&lt;?xml" type="string" offset="0">
+ <match value="-//OASIS//DTD DocBook XML" type="string" offset="0:100"/>
+ <match value="-//KDE//DTD DocBook XML" type="string" offset="0:100"/>
+ </match>
+ </magic>
+ <glob pattern="*.docbook"/>
+ </mime-type>
+ <mime-type type="image/x-dib">
+ <comment>DIB image</comment>
+ <comment xml:lang="ar">صورة DIB</comment>
+ <comment xml:lang="be@latin">Vyjava DIB</comment>
+ <comment xml:lang="bg">Изображение — DIB</comment>
+ <comment xml:lang="ca">imatge DIB</comment>
+ <comment xml:lang="cs">Obrázek DIB</comment>
+ <comment xml:lang="da">DIB-billede</comment>
+ <comment xml:lang="de">DIB-Bild</comment>
+ <comment xml:lang="en_GB">DIB image</comment>
+ <comment xml:lang="eo">DIB-bildo</comment>
+ <comment xml:lang="es">imagen DIB</comment>
+ <comment xml:lang="eu">DIB irudia</comment>
+ <comment xml:lang="fi">DIB-kuva</comment>
+ <comment xml:lang="fo">DIB mynd</comment>
+ <comment xml:lang="fr">image DIB</comment>
+ <comment xml:lang="ga">íomhá DIB</comment>
+ <comment xml:lang="gl">imaxe DIB</comment>
+ <comment xml:lang="he">תמונת DIB</comment>
+ <comment xml:lang="hu">DIB kép</comment>
+ <comment xml:lang="id">Citra DIB</comment>
+ <comment xml:lang="it">Immagine DIB</comment>
+ <comment xml:lang="ja">DIB 画像</comment>
+ <comment xml:lang="kk">DIB суреті</comment>
+ <comment xml:lang="ko">DIB 그림</comment>
+ <comment xml:lang="lt">DIB paveikslėlis</comment>
+ <comment xml:lang="lv">DIB attēls</comment>
+ <comment xml:lang="nb">DIB-bilde</comment>
+ <comment xml:lang="nl">DIB-afbeelding</comment>
+ <comment xml:lang="nn">DIB-bilete</comment>
+ <comment xml:lang="pl">Obraz DIB</comment>
+ <comment xml:lang="pt_BR">Imagem DIB</comment>
+ <comment xml:lang="ro">Imagine DIB</comment>
+ <comment xml:lang="ru">изображение DIB</comment>
+ <comment xml:lang="sk">Obrázok DIB</comment>
+ <comment xml:lang="sl">Slikovna datoteka DIB</comment>
+ <comment xml:lang="sq">Figurë DIB</comment>
+ <comment xml:lang="sv">DIB-bild</comment>
+ <comment xml:lang="uk">зображення DIB</comment>
+ <comment xml:lang="vi">Ảnh DIB</comment>
+ <comment xml:lang="zh_CN">DIB 图像</comment>
+ <comment xml:lang="zh_TW">DIB 影像</comment>
+ <acronym>DIB</acronym>
+ <expanded-acronym>Device Independant Bitmap</expanded-acronym>
+ <magic priority="50">
+ <match value="\x28\00\00\00" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/vnd.djvu">
+ <comment>DjVu image</comment>
+ <comment xml:lang="ar">صورة DjVu</comment>
+ <comment xml:lang="be@latin">Vyjava DjVu</comment>
+ <comment xml:lang="bg">Изображение — DjVu</comment>
+ <comment xml:lang="ca">imatge DjVu</comment>
+ <comment xml:lang="cs">Obrázek DjVu</comment>
+ <comment xml:lang="da">DjVu-billede</comment>
+ <comment xml:lang="de">DjVu-Bild</comment>
+ <comment xml:lang="el">εικόνα DjVu</comment>
+ <comment xml:lang="en_GB">DjVu image</comment>
+ <comment xml:lang="eo">DjVu-bildo</comment>
+ <comment xml:lang="es">imagen DjVu</comment>
+ <comment xml:lang="eu">DjVU-ko irudia</comment>
+ <comment xml:lang="fi">DjVu-kuva</comment>
+ <comment xml:lang="fo">DjVu mynd</comment>
+ <comment xml:lang="fr">image DjVu</comment>
+ <comment xml:lang="ga">íomhá DjVu</comment>
+ <comment xml:lang="gl">imaxe de DjVu</comment>
+ <comment xml:lang="he">תמונת DjVu</comment>
+ <comment xml:lang="hu">DjVu-kép</comment>
+ <comment xml:lang="id">Citra DjVu</comment>
+ <comment xml:lang="it">Immagine DjVu</comment>
+ <comment xml:lang="ja">DjVu 画像</comment>
+ <comment xml:lang="kk">DjVu суреті</comment>
+ <comment xml:lang="ko">DjVu 그림</comment>
+ <comment xml:lang="lt">DjVu paveikslėlis</comment>
+ <comment xml:lang="lv">DjVu attēls</comment>
+ <comment xml:lang="ms">Imej DjVu</comment>
+ <comment xml:lang="nb">DjVu-bilde</comment>
+ <comment xml:lang="nl">DjVu-afbeelding</comment>
+ <comment xml:lang="nn">DjVu-bilete</comment>
+ <comment xml:lang="pl">Obraz DjVu</comment>
+ <comment xml:lang="pt">imagem DjVu</comment>
+ <comment xml:lang="pt_BR">Imagem DjVu</comment>
+ <comment xml:lang="ro">Imagine DjVu</comment>
+ <comment xml:lang="ru">изображение DjVu</comment>
+ <comment xml:lang="sk">Obrázok DjVu</comment>
+ <comment xml:lang="sl">Slikovna datoteka DjVu</comment>
+ <comment xml:lang="sq">Figurë DjVu</comment>
+ <comment xml:lang="sr">DjVu слика</comment>
+ <comment xml:lang="sv">DjVu-bild</comment>
+ <comment xml:lang="uk">зображення DjVu</comment>
+ <comment xml:lang="vi">Ảnh DjVu</comment>
+ <comment xml:lang="zh_CN">DjVu 图像</comment>
+ <comment xml:lang="zh_TW">DjVu 影像</comment>
+ <alias type="image/x-djvu"/>
+ <alias type="image/x.djvu"/>
+ <magic priority="50">
+ <match value="AT&amp;TFORM" type="string" offset="0">
+ <match value="DJVM" type="string" offset="12"/>
+ <match value="DJVU" type="string" offset="12"/>
+ </match>
+ <match value="FORM" type="string" offset="0">
+ <match value="DJVM" type="string" offset="8"/>
+ <match value="DJVU" type="string" offset="8"/>
+ </match>
+ </magic>
+ <glob pattern="*.djvu"/>
+ <glob pattern="*.djv"/>
+ </mime-type>
+ <mime-type type="image/dpx">
+ <comment>DPX image</comment>
+ <comment xml:lang="ar">صورة DPX</comment>
+ <comment xml:lang="be@latin">Vyjava DPX</comment>
+ <comment xml:lang="bg">Изображение — DPX</comment>
+ <comment xml:lang="ca">imatge DPX</comment>
+ <comment xml:lang="cs">Obrázek DPX</comment>
+ <comment xml:lang="da">DPX-billede</comment>
+ <comment xml:lang="de">DPX-Bild</comment>
+ <comment xml:lang="en_GB">DPX image</comment>
+ <comment xml:lang="eo">DPX-bildo</comment>
+ <comment xml:lang="es">imagen DPX</comment>
+ <comment xml:lang="eu">DPX irudia</comment>
+ <comment xml:lang="fi">DPX-kuva</comment>
+ <comment xml:lang="fo">DPX mynd</comment>
+ <comment xml:lang="fr">image DPX</comment>
+ <comment xml:lang="ga">íomhá DPX</comment>
+ <comment xml:lang="gl">imaxe DPX</comment>
+ <comment xml:lang="he">תמונת DPX</comment>
+ <comment xml:lang="hu">DPX kép</comment>
+ <comment xml:lang="id">Citra DPX</comment>
+ <comment xml:lang="it">Immagine DPX</comment>
+ <comment xml:lang="ja">DPX 画像</comment>
+ <comment xml:lang="kk">DPX суреті</comment>
+ <comment xml:lang="ko">DPX 그림</comment>
+ <comment xml:lang="lt">DPX paveikslėlis</comment>
+ <comment xml:lang="lv">DPX attēls</comment>
+ <comment xml:lang="nb">DPX-bilde</comment>
+ <comment xml:lang="nl">DPX-afbeelding</comment>
+ <comment xml:lang="nn">DPX-bilete</comment>
+ <comment xml:lang="pl">Obraz DPX</comment>
+ <comment xml:lang="pt_BR">Imagem DPX</comment>
+ <comment xml:lang="ro">Imagine DPX</comment>
+ <comment xml:lang="ru">изображение DPX</comment>
+ <comment xml:lang="sk">Obrázok DPX</comment>
+ <comment xml:lang="sl">Slikovna datoteka DPX</comment>
+ <comment xml:lang="sq">Figurë DPX</comment>
+ <comment xml:lang="sv">DPX-bild</comment>
+ <comment xml:lang="uk">зображення DPX</comment>
+ <comment xml:lang="vi">Ảnh DPX</comment>
+ <comment xml:lang="zh_CN">DPX 图像</comment>
+ <comment xml:lang="zh_TW">DPX 影像</comment>
+ <acronym>DPX</acronym>
+ <expanded-acronym>Digital Moving Picture Exchange</expanded-acronym>
+ <magic priority="50">
+ <match value="0x53445058" type="big32" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-eps">
+ <comment>EPS image</comment>
+ <comment xml:lang="ar">صورة EPS</comment>
+ <comment xml:lang="be@latin">Vyjava EPS</comment>
+ <comment xml:lang="bg">Изображение — EPS</comment>
+ <comment xml:lang="ca">imatge EPS</comment>
+ <comment xml:lang="cs">Obrázek EPS</comment>
+ <comment xml:lang="da">EPS-billede</comment>
+ <comment xml:lang="de">EPS-Bild</comment>
+ <comment xml:lang="en_GB">EPS image</comment>
+ <comment xml:lang="eo">EPS-bildo</comment>
+ <comment xml:lang="es">imagen EPS</comment>
+ <comment xml:lang="eu">EPS irudia</comment>
+ <comment xml:lang="fi">EPS-kuva</comment>
+ <comment xml:lang="fo">EPS mynd</comment>
+ <comment xml:lang="fr">image EPS</comment>
+ <comment xml:lang="ga">íomhá EPS</comment>
+ <comment xml:lang="gl">imaxe EPS</comment>
+ <comment xml:lang="he">תמונת EPS</comment>
+ <comment xml:lang="hu">EPS kép</comment>
+ <comment xml:lang="id">Citra EPS</comment>
+ <comment xml:lang="it">Immagine EPS</comment>
+ <comment xml:lang="ja">EPS 画像</comment>
+ <comment xml:lang="kk">EPS суреті</comment>
+ <comment xml:lang="ko">EPS 그림</comment>
+ <comment xml:lang="lt">EPS paveikslėlis</comment>
+ <comment xml:lang="lv">EPS attēls</comment>
+ <comment xml:lang="nb">EPS-bilde</comment>
+ <comment xml:lang="nl">EPS-afbeelding</comment>
+ <comment xml:lang="nn">EPS-bilete</comment>
+ <comment xml:lang="pl">Obraz EPS</comment>
+ <comment xml:lang="pt_BR">Imagem EPS</comment>
+ <comment xml:lang="ro">Imagine EPS</comment>
+ <comment xml:lang="ru">изображение EPS</comment>
+ <comment xml:lang="sk">Obrázok EPS</comment>
+ <comment xml:lang="sl">Slikovna datoteka EPS</comment>
+ <comment xml:lang="sq">Figurë EPS</comment>
+ <comment xml:lang="sv">EPS-bild</comment>
+ <comment xml:lang="uk">зображення EPS</comment>
+ <comment xml:lang="vi">Ảnh EPS</comment>
+ <comment xml:lang="zh_CN">EPS 图像</comment>
+ <comment xml:lang="zh_TW">EPS 影像</comment>
+ <acronym>EPS</acronym>
+ <expanded-acronym>Encapsulated PostScript</expanded-acronym>
+ <sub-class-of type="application/postscript"/>
+ <magic priority="90">
+ <match value="%!" type="string" offset="0">
+ <match value="EPS" type="string" offset="15"/>
+ </match>
+ <match value="\004%!" type="string" offset="0">
+ <match value="EPS" type="string" offset="16"/>
+ </match>
+ </magic>
+ <glob pattern="*.eps"/>
+ <glob pattern="*.epsi"/>
+ <glob pattern="*.epsf"/>
+ </mime-type>
+ <mime-type type="image/fits">
+ <comment>FITS document</comment>
+ <comment xml:lang="ar">مستند FITS</comment>
+ <comment xml:lang="be@latin">Dakument FITS</comment>
+ <comment xml:lang="bg">Документ — FITS</comment>
+ <comment xml:lang="ca">document FITS</comment>
+ <comment xml:lang="cs">Dokument FITS</comment>
+ <comment xml:lang="da">FITS-dokument</comment>
+ <comment xml:lang="de">FITS-Dokument</comment>
+ <comment xml:lang="en_GB">FITS document</comment>
+ <comment xml:lang="eo">FITS-dokumento</comment>
+ <comment xml:lang="es">documento FITS</comment>
+ <comment xml:lang="eu">FITS dokumentua</comment>
+ <comment xml:lang="fi">FITS-asiakirja</comment>
+ <comment xml:lang="fo">FITS skjal</comment>
+ <comment xml:lang="fr">document FITS</comment>
+ <comment xml:lang="ga">cáipéis FITS</comment>
+ <comment xml:lang="gl">documento FICT</comment>
+ <comment xml:lang="he">מסמך FITS</comment>
+ <comment xml:lang="hu">FITS dokumentum</comment>
+ <comment xml:lang="id">Dokumen FITS</comment>
+ <comment xml:lang="it">Documento FITS</comment>
+ <comment xml:lang="ja">FITS ドキュメント</comment>
+ <comment xml:lang="kk">FITS құжаты</comment>
+ <comment xml:lang="ko">FITS 문서</comment>
+ <comment xml:lang="lt">FITS dokumentas</comment>
+ <comment xml:lang="lv">FITS dokuments</comment>
+ <comment xml:lang="nb">FITS-dokument</comment>
+ <comment xml:lang="nl">FITS-document</comment>
+ <comment xml:lang="nn">FITS-dokument</comment>
+ <comment xml:lang="pl">Dokument FITS</comment>
+ <comment xml:lang="pt_BR">Documento FITS</comment>
+ <comment xml:lang="ro">Document FITS</comment>
+ <comment xml:lang="ru">документ FITS</comment>
+ <comment xml:lang="sk">Dokument FITS</comment>
+ <comment xml:lang="sl">Dokument FITS</comment>
+ <comment xml:lang="sq">Dokument FITS</comment>
+ <comment xml:lang="sv">FITS-dokument</comment>
+ <comment xml:lang="uk">документ FITS</comment>
+ <comment xml:lang="vi">Tài liệu FITS</comment>
+ <comment xml:lang="zh_CN">FITS 文档</comment>
+ <comment xml:lang="zh_TW">FITS 文件</comment>
+ <acronym>FITS</acronym>
+ <expanded-acronym>Flexible Image Transport System</expanded-acronym>
+ <magic priority="50">
+ <match value="SIMPLE =" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.fits"/>
+ <alias type="image/x-fits"/>
+ </mime-type>
+ <mime-type type="image/x-fpx">
+ <comment>FPX image</comment>
+ <comment xml:lang="ar">صورة FPX</comment>
+ <comment xml:lang="be@latin">Vyjava FPX</comment>
+ <comment xml:lang="bg">Изображение — FPX</comment>
+ <comment xml:lang="ca">imatge FPX</comment>
+ <comment xml:lang="cs">Obrázek FPX</comment>
+ <comment xml:lang="da">FPX-billede</comment>
+ <comment xml:lang="de">FPX-Bild</comment>
+ <comment xml:lang="en_GB">FPX image</comment>
+ <comment xml:lang="eo">FPX-bildo</comment>
+ <comment xml:lang="es">imagen FPX</comment>
+ <comment xml:lang="eu">FPX irudia</comment>
+ <comment xml:lang="fi">FPX-kuva</comment>
+ <comment xml:lang="fo">FPX mynd</comment>
+ <comment xml:lang="fr">image FPX</comment>
+ <comment xml:lang="ga">íomhá FPX</comment>
+ <comment xml:lang="gl">imaxe FPX</comment>
+ <comment xml:lang="he">תמונת FPX</comment>
+ <comment xml:lang="hu">FPX kép</comment>
+ <comment xml:lang="id">Citra FPX</comment>
+ <comment xml:lang="it">Immagine FPX</comment>
+ <comment xml:lang="ja">FPX 画像</comment>
+ <comment xml:lang="kk">FPX суреті</comment>
+ <comment xml:lang="ko">FPX 그림</comment>
+ <comment xml:lang="lt">FPX paveikslėlis</comment>
+ <comment xml:lang="lv">FPX attēls</comment>
+ <comment xml:lang="nb">FPX-bilde</comment>
+ <comment xml:lang="nl">FPX-afbeelding</comment>
+ <comment xml:lang="nn">FPX-bilete</comment>
+ <comment xml:lang="pl">Obraz FPX</comment>
+ <comment xml:lang="pt_BR">Imagem FPX</comment>
+ <comment xml:lang="ro">Imagine FPX</comment>
+ <comment xml:lang="ru">изображение FPX</comment>
+ <comment xml:lang="sk">Obrázok FPX</comment>
+ <comment xml:lang="sl">Slikovna datoteka FPX</comment>
+ <comment xml:lang="sq">Figurë FPX</comment>
+ <comment xml:lang="sv">FPX-bild</comment>
+ <comment xml:lang="uk">зображення FPX</comment>
+ <comment xml:lang="vi">Ảnh FPX</comment>
+ <comment xml:lang="zh_CN">FPX 图像</comment>
+ <comment xml:lang="zh_TW">FPX 影像</comment>
+ <acronym>FPX</acronym>
+ <expanded-acronym>FlashPiX</expanded-acronym>
+ <magic priority="50">
+ <match value="0x46506978" type="big32" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-gzeps">
+ <comment>EPS image (gzip-compressed)</comment>
+ <comment xml:lang="ar">صورة EPS (مضغوط-gzip)</comment>
+ <comment xml:lang="be@latin">Vyjava EPS (gzip-skampresavanaja)</comment>
+ <comment xml:lang="bg">Изображение — EPS, компресирано с gzip</comment>
+ <comment xml:lang="ca">imatge EPS (comprimida amb gzip)</comment>
+ <comment xml:lang="cs">Obrázek EPS (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="da">EPS-billede (gzip-komprimeret)</comment>
+ <comment xml:lang="de">EPS-Bild (gzip-komprimiert)</comment>
+ <comment xml:lang="es">imagen EPS (comprimida con gzip)</comment>
+ <comment xml:lang="eu">EPS irudia (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="fi">EPS-kuva (gzip-pakattu)</comment>
+ <comment xml:lang="fo">EPS mynd (gzip-stappað)</comment>
+ <comment xml:lang="fr">image EPS (compressée gzip)</comment>
+ <comment xml:lang="ga">íomhá EPS (comhbhrúite le gzip)</comment>
+ <comment xml:lang="gl">imaxe EPS (comprimida con gzip)</comment>
+ <comment xml:lang="he">תמונת EPS (מכווץ בgzip)</comment>
+ <comment xml:lang="hu">EPS kép (gzip-tömörítésű)</comment>
+ <comment xml:lang="id">Citra EPS (terkompresi gzip)</comment>
+ <comment xml:lang="it">Immagine EPS (compressa con gzip)</comment>
+ <comment xml:lang="ja">EPS 画像 (gzip 圧縮)</comment>
+ <comment xml:lang="kk">EPS суреті (gzip-пен сығылған)</comment>
+ <comment xml:lang="ko">EPS 그림 (GZIP 압축)</comment>
+ <comment xml:lang="lt">EPS paveikslėlis (suglaudintas su gzip)</comment>
+ <comment xml:lang="lv">EPS attēls (saspiests ar gzip)</comment>
+ <comment xml:lang="nb">EPS-bilde (gzip-komprimert)</comment>
+ <comment xml:lang="nl">EPS-afbeelding (ingepakt met gzip)</comment>
+ <comment xml:lang="nn">EPS-bilete (pakka med gzip)</comment>
+ <comment xml:lang="pl">Obraz EPS (kompresja gzip)</comment>
+ <comment xml:lang="pt_BR">Imagem EPS (compactada com gzip)</comment>
+ <comment xml:lang="ro">Imagine EPS (compresie gzip)</comment>
+ <comment xml:lang="ru">изображение EPS (сжатое gzip)</comment>
+ <comment xml:lang="sk">Obrázok EPS (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="sl">Slikovna datoteka EPS (stisnjena z gzip)</comment>
+ <comment xml:lang="sq">Figurë EPS (e kompresuar me gzip)</comment>
+ <comment xml:lang="sv">EPS-bild (gzip-komprimerad)</comment>
+ <comment xml:lang="uk">зображення EPS (стиснене gzip)</comment>
+ <comment xml:lang="vi">Ảnh EPS (đã nén gzip)</comment>
+ <comment xml:lang="zh_CN">EPS 图像(gzip 压缩)</comment>
+ <comment xml:lang="zh_TW">EPS 影像 (gzip 格式壓縮)</comment>
+ <glob pattern="*.eps.gz"/>
+ <glob pattern="*.epsi.gz"/>
+ <glob pattern="*.epsf.gz"/>
+ </mime-type>
+ <mime-type type="image/vnd.microsoft.icon">
+ <comment>Microsoft icon</comment>
+ <comment xml:lang="ar">أيقونة مايكروسوفت</comment>
+ <comment xml:lang="bg">Икона — Microsoft</comment>
+ <comment xml:lang="ca">icona de Microsoft</comment>
+ <comment xml:lang="cs">Ikona Microsoft</comment>
+ <comment xml:lang="da">Microsoftikon</comment>
+ <comment xml:lang="de">Microsoft-Symbol</comment>
+ <comment xml:lang="eo">Microsoft-piktogramo</comment>
+ <comment xml:lang="es">icono de Microsoft</comment>
+ <comment xml:lang="eu">Microsoft ikonoa</comment>
+ <comment xml:lang="fi">Microsoft-kuvake</comment>
+ <comment xml:lang="fo">Microsoft ímynd</comment>
+ <comment xml:lang="fr">icône Microsoft</comment>
+ <comment xml:lang="ga">deilbhín Microsoft</comment>
+ <comment xml:lang="gl">Icona de microsoft</comment>
+ <comment xml:lang="he">אייקון של Microsofr</comment>
+ <comment xml:lang="hu">Microsoft ikon</comment>
+ <comment xml:lang="id">Ikon Microsoft</comment>
+ <comment xml:lang="it">Icona Microsoft</comment>
+ <comment xml:lang="ja">Microsoft アイコン</comment>
+ <comment xml:lang="kk">Microsoft таңбашасы</comment>
+ <comment xml:lang="ko">마이크로소프트 아이콘</comment>
+ <comment xml:lang="lt">Microsoft piktograma</comment>
+ <comment xml:lang="lv">Microsoft ikona</comment>
+ <comment xml:lang="nl">Microsoft pictogram</comment>
+ <comment xml:lang="pl">Ikona Microsoft</comment>
+ <comment xml:lang="pt_BR">Ícone da Microsoft</comment>
+ <comment xml:lang="ro">Iconiță Microsoft</comment>
+ <comment xml:lang="ru">значок Microsoft</comment>
+ <comment xml:lang="sk">Ikona Microsoft</comment>
+ <comment xml:lang="sl">Datoteka ikone Microsoft Windows</comment>
+ <comment xml:lang="sv">Microsoft-ikon</comment>
+ <comment xml:lang="uk">піктограма Microsoft</comment>
+ <comment xml:lang="vi">Biểu tượng Microsoft</comment>
+ <comment xml:lang="zh_CN">Microsoft 图标</comment>
+ <comment xml:lang="zh_TW">微軟圖示</comment>
+ <magic priority="50">
+ <match value="\0\0\1\0" type="string" offset="0">
+ <match value="\0" type="string" offset="5"/>
+ </match>
+ </magic>
+ <glob pattern="*.ico"/>
+ <alias type="application/ico"/>
+ <alias type="image/ico"/>
+ <alias type="image/icon"/>
+ <alias type="image/x-ico"/>
+ <alias type="image/x-icon"/>
+ <alias type="text/ico"/>
+ </mime-type>
+ <mime-type type="image/x-icns">
+ <comment>MacOS X icon</comment>
+ <comment xml:lang="ar">أيقونة MacOS X</comment>
+ <comment xml:lang="be@latin">Ikona MacOS X</comment>
+ <comment xml:lang="bg">Икона — MacOS X</comment>
+ <comment xml:lang="ca">icona MacOS X</comment>
+ <comment xml:lang="cs">Ikona MacOS X</comment>
+ <comment xml:lang="da">MacOS X-ikon</comment>
+ <comment xml:lang="de">MacOS-X-Symbol</comment>
+ <comment xml:lang="eo">MacOS-X-piktogramo</comment>
+ <comment xml:lang="es">icono de MacOS X</comment>
+ <comment xml:lang="eu">MacOS X ikonoa</comment>
+ <comment xml:lang="fi">MacOS X -kuvake</comment>
+ <comment xml:lang="fo">MacOS X ímynd</comment>
+ <comment xml:lang="fr">icône MacOS X</comment>
+ <comment xml:lang="ga">deilbhín MacOS X</comment>
+ <comment xml:lang="gl">Icona de MacOS X</comment>
+ <comment xml:lang="he">אייקון של MacOS X</comment>
+ <comment xml:lang="hu">MacOS X ikon</comment>
+ <comment xml:lang="id">Ikon MacOS X</comment>
+ <comment xml:lang="it">Icona MacOS X</comment>
+ <comment xml:lang="ja">MacOS X アイコン</comment>
+ <comment xml:lang="kk">MacOS X таңбашасы</comment>
+ <comment xml:lang="ko">MacOS X 아이콘</comment>
+ <comment xml:lang="lt">MacOS X piktograma</comment>
+ <comment xml:lang="lv">MacOS X ikona</comment>
+ <comment xml:lang="nb">MacOS X-ikon</comment>
+ <comment xml:lang="nl">MacOS-X-pictogram</comment>
+ <comment xml:lang="nn">MacOS X-ikon</comment>
+ <comment xml:lang="pl">Ikona Mac OS X</comment>
+ <comment xml:lang="pt_BR">Ícone do MacOS X</comment>
+ <comment xml:lang="ro">Iconiță MacOS X</comment>
+ <comment xml:lang="ru">значок MacOS X</comment>
+ <comment xml:lang="sk">Ikona MacOS X</comment>
+ <comment xml:lang="sl">Datoteka ikone MacOS X</comment>
+ <comment xml:lang="sq">Ikonë MacOS X</comment>
+ <comment xml:lang="sv">MacOS X-ikon</comment>
+ <comment xml:lang="uk">піктограма MacOS X</comment>
+ <comment xml:lang="vi">Biểu tượng MacOS X</comment>
+ <comment xml:lang="zh_CN">MacOS X 图标</comment>
+ <comment xml:lang="zh_TW">MacOS X 圖示</comment>
+ <glob pattern="*.icns"/>
+ <magic priority="50">
+ <match value="icns" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-iff">
+ <comment>IFF image</comment>
+ <comment xml:lang="ar">صورة IFF</comment>
+ <comment xml:lang="az">IFF rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava IFF</comment>
+ <comment xml:lang="bg">Изображение — IFF</comment>
+ <comment xml:lang="ca">imatge IFF</comment>
+ <comment xml:lang="cs">Obrázek IFF</comment>
+ <comment xml:lang="cy">Delwedd IFF</comment>
+ <comment xml:lang="da">IFF-billede</comment>
+ <comment xml:lang="de">IFF-Bild</comment>
+ <comment xml:lang="el">εικόνα IFF</comment>
+ <comment xml:lang="en_GB">IFF image</comment>
+ <comment xml:lang="eo">IFF-bildo</comment>
+ <comment xml:lang="es">imagen IFF</comment>
+ <comment xml:lang="eu">IFF irudia</comment>
+ <comment xml:lang="fi">IFF-kuva</comment>
+ <comment xml:lang="fo">IFF mynd</comment>
+ <comment xml:lang="fr">image IFF</comment>
+ <comment xml:lang="ga">íomhá IFF</comment>
+ <comment xml:lang="gl">imaxe IFF</comment>
+ <comment xml:lang="he">תמונת IFF</comment>
+ <comment xml:lang="hu">IFF-kép</comment>
+ <comment xml:lang="id">Citra IFF</comment>
+ <comment xml:lang="it">Immagine IFF</comment>
+ <comment xml:lang="ja">IFF 画像</comment>
+ <comment xml:lang="kk">IFF суреті</comment>
+ <comment xml:lang="ko">IFF 그림</comment>
+ <comment xml:lang="lt">IFF paveikslėlis</comment>
+ <comment xml:lang="lv">IFF attēls</comment>
+ <comment xml:lang="ms">Imej IFF</comment>
+ <comment xml:lang="nb">IFF-bilde</comment>
+ <comment xml:lang="nl">IFF-afbeelding</comment>
+ <comment xml:lang="nn">IFF-bilete</comment>
+ <comment xml:lang="pl">Obraz IFF</comment>
+ <comment xml:lang="pt">imagem IFF</comment>
+ <comment xml:lang="pt_BR">Imagem IFF</comment>
+ <comment xml:lang="ro">Imagine IFF</comment>
+ <comment xml:lang="ru">изображение IFF</comment>
+ <comment xml:lang="sk">Obrázok IFF</comment>
+ <comment xml:lang="sl">Slikovna datoteka IFF</comment>
+ <comment xml:lang="sq">Figurë IFF</comment>
+ <comment xml:lang="sr">IFF слика</comment>
+ <comment xml:lang="sv">IFF-bild</comment>
+ <comment xml:lang="uk">зображення IFF</comment>
+ <comment xml:lang="vi">Ảnh IFF</comment>
+ <comment xml:lang="zh_CN">IFF 图像</comment>
+ <comment xml:lang="zh_TW">IFF 影像</comment>
+ <glob pattern="*.iff"/>
+ </mime-type>
+ <mime-type type="image/x-ilbm">
+ <comment>ILBM image</comment>
+ <comment xml:lang="ar">صورة ILBM</comment>
+ <comment xml:lang="az">ILBM rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava ILBM</comment>
+ <comment xml:lang="bg">Изображение — ILBM</comment>
+ <comment xml:lang="ca">imatge ILBM</comment>
+ <comment xml:lang="cs">Obrázek ILMB</comment>
+ <comment xml:lang="cy">Delwedd ILBM</comment>
+ <comment xml:lang="da">ILBM-billede</comment>
+ <comment xml:lang="de">ILBM-Bild</comment>
+ <comment xml:lang="el">εικόνα ILBM</comment>
+ <comment xml:lang="en_GB">ILBM image</comment>
+ <comment xml:lang="eo">ILBM-bildo</comment>
+ <comment xml:lang="es">imagen ILBM</comment>
+ <comment xml:lang="eu">ILBM irudia</comment>
+ <comment xml:lang="fi">ILBM-kuva</comment>
+ <comment xml:lang="fo">ILBM mynd</comment>
+ <comment xml:lang="fr">image ILBM</comment>
+ <comment xml:lang="ga">íomhá ILBM</comment>
+ <comment xml:lang="gl">imaxe ILBM</comment>
+ <comment xml:lang="he">תמונת ILBM</comment>
+ <comment xml:lang="hu">ILBM-kép</comment>
+ <comment xml:lang="id">Citra ILBM</comment>
+ <comment xml:lang="it">Immagine ILBM</comment>
+ <comment xml:lang="ja">ILBM 画像</comment>
+ <comment xml:lang="kk">ILBM суреті</comment>
+ <comment xml:lang="ko">ILBM 그림</comment>
+ <comment xml:lang="lt">ILBM paveikslėlis</comment>
+ <comment xml:lang="lv">ILBM attēls</comment>
+ <comment xml:lang="ms">Imej ILBM</comment>
+ <comment xml:lang="nb">ILBM-bilde</comment>
+ <comment xml:lang="nl">ILBM-afbeelding</comment>
+ <comment xml:lang="nn">ILMB-bilete</comment>
+ <comment xml:lang="pl">Obraz ILBM</comment>
+ <comment xml:lang="pt">imagem ILBM</comment>
+ <comment xml:lang="pt_BR">Imagem ILBM</comment>
+ <comment xml:lang="ro">Imagine ILBM</comment>
+ <comment xml:lang="ru">изображение ILBM</comment>
+ <comment xml:lang="sk">Obrázok ILMB</comment>
+ <comment xml:lang="sl">Slikovna datoteka ILBM</comment>
+ <comment xml:lang="sq">Figurë ILBM</comment>
+ <comment xml:lang="sr">ILBM слика</comment>
+ <comment xml:lang="sv">ILBM-bild</comment>
+ <comment xml:lang="uk">зображення ILBM</comment>
+ <comment xml:lang="vi">Ảnh ILBM</comment>
+ <comment xml:lang="zh_CN">ILBM 图像</comment>
+ <comment xml:lang="zh_TW">ILBM 影像</comment>
+ <acronym>ILBM image</acronym>
+ <expanded-acronym>InterLeaved BitMap</expanded-acronym>
+ <glob pattern="*.ilbm"/>
+ </mime-type>
+ <mime-type type="image/x-jng">
+ <comment>JNG image</comment>
+ <comment xml:lang="ar">صورة JNG</comment>
+ <comment xml:lang="az">JNG rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava JNG</comment>
+ <comment xml:lang="bg">Изображение — JNG</comment>
+ <comment xml:lang="ca">imatge JNG</comment>
+ <comment xml:lang="cs">Obrázek JNG</comment>
+ <comment xml:lang="cy">Delwedd JNG</comment>
+ <comment xml:lang="da">JNG-billede</comment>
+ <comment xml:lang="de">JNG-Bild</comment>
+ <comment xml:lang="el">εικόνα JNG</comment>
+ <comment xml:lang="en_GB">JNG image</comment>
+ <comment xml:lang="eo">JNG-bildo</comment>
+ <comment xml:lang="es">imagen JNG</comment>
+ <comment xml:lang="eu">JNG irudia</comment>
+ <comment xml:lang="fi">JNG-kuva</comment>
+ <comment xml:lang="fo">JNG mynd</comment>
+ <comment xml:lang="fr">image JNG</comment>
+ <comment xml:lang="ga">íomhá JNG</comment>
+ <comment xml:lang="gl">imaxe JNG</comment>
+ <comment xml:lang="he">תמונת JNG</comment>
+ <comment xml:lang="hu">JNG-kép</comment>
+ <comment xml:lang="id">Citra JNG</comment>
+ <comment xml:lang="it">Immagine JNG</comment>
+ <comment xml:lang="ja">JNG 画像</comment>
+ <comment xml:lang="kk">JNG суреті</comment>
+ <comment xml:lang="ko">JNG 그림</comment>
+ <comment xml:lang="lt">JNG paveikslėlis</comment>
+ <comment xml:lang="lv">JNG attēls</comment>
+ <comment xml:lang="ms">Imej PNG</comment>
+ <comment xml:lang="nb">JNG-bilde</comment>
+ <comment xml:lang="nl">JNG-afbeelding</comment>
+ <comment xml:lang="nn">JNG-bilete</comment>
+ <comment xml:lang="pl">Obraz JNG</comment>
+ <comment xml:lang="pt">imagem JNG</comment>
+ <comment xml:lang="pt_BR">Imagem JNG</comment>
+ <comment xml:lang="ro">Imagine JNG</comment>
+ <comment xml:lang="ru">изображение JNG</comment>
+ <comment xml:lang="sk">Obrázok JNG</comment>
+ <comment xml:lang="sl">Slikovna datoteka JNG</comment>
+ <comment xml:lang="sq">Figurë JNG</comment>
+ <comment xml:lang="sr">JNG слика</comment>
+ <comment xml:lang="sv">JNG-bild</comment>
+ <comment xml:lang="uk">зображення JNG</comment>
+ <comment xml:lang="vi">Ảnh JNG</comment>
+ <comment xml:lang="zh_CN">JNG 图像</comment>
+ <comment xml:lang="zh_TW">JNG 影像</comment>
+ <acronym>JNG</acronym>
+ <expanded-acronym>JPEG Network Graphics</expanded-acronym>
+ <glob pattern="*.jng"/>
+ </mime-type>
+ <mime-type type="image/x-lwo">
+ <comment>LightWave object</comment>
+ <comment xml:lang="ar">كائن LightWave</comment>
+ <comment xml:lang="az">LightWave cismi</comment>
+ <comment xml:lang="be@latin">Abjekt LightWave</comment>
+ <comment xml:lang="bg">Обект — LightWave</comment>
+ <comment xml:lang="ca">objecte de LightWave</comment>
+ <comment xml:lang="cs">Objekt LightWave</comment>
+ <comment xml:lang="cy">Gwrthrych LightWave</comment>
+ <comment xml:lang="da">LightWave-objekt</comment>
+ <comment xml:lang="de">LightWave-Objekt</comment>
+ <comment xml:lang="el">αντικείμενο LightWave</comment>
+ <comment xml:lang="en_GB">LightWave object</comment>
+ <comment xml:lang="eo">LightWave-objekto</comment>
+ <comment xml:lang="es">objeto LightWave</comment>
+ <comment xml:lang="eu">LightWave objektua</comment>
+ <comment xml:lang="fi">LightWave-esine</comment>
+ <comment xml:lang="fo">LightWave lutur</comment>
+ <comment xml:lang="fr">objet LightWave</comment>
+ <comment xml:lang="ga">réad LightWave</comment>
+ <comment xml:lang="gl">obxecto de LightWave</comment>
+ <comment xml:lang="he">עצם LightWave</comment>
+ <comment xml:lang="hu">LightWave-objektum</comment>
+ <comment xml:lang="id">Proyek LightWave</comment>
+ <comment xml:lang="it">Oggetto LightWave</comment>
+ <comment xml:lang="ja">LightWave オブジェクト</comment>
+ <comment xml:lang="kk">LightWave объекті</comment>
+ <comment xml:lang="ko">LightWave 개체</comment>
+ <comment xml:lang="lt">LightWave objektas</comment>
+ <comment xml:lang="lv">LightWave objekts</comment>
+ <comment xml:lang="ms">Objek LightWave</comment>
+ <comment xml:lang="nb">LightWave-objekt</comment>
+ <comment xml:lang="nl">LightWave-object</comment>
+ <comment xml:lang="nn">LightWave-objekt</comment>
+ <comment xml:lang="pl">Obiekt LightWave</comment>
+ <comment xml:lang="pt">Objecto LightWave</comment>
+ <comment xml:lang="pt_BR">Objeto LightWave</comment>
+ <comment xml:lang="ro">Obiect LightWave</comment>
+ <comment xml:lang="ru">объект LightWave</comment>
+ <comment xml:lang="sk">Objekt LightWave</comment>
+ <comment xml:lang="sl">Datoteka predmeta LightWave</comment>
+ <comment xml:lang="sq">Objekt LightWave</comment>
+ <comment xml:lang="sr">LightWave објекат</comment>
+ <comment xml:lang="sv">LightWave-objekt</comment>
+ <comment xml:lang="uk">об'єкт LightWave</comment>
+ <comment xml:lang="vi">Đối tượng LightWave</comment>
+ <comment xml:lang="zh_CN">LightWave 对象</comment>
+ <comment xml:lang="zh_TW">LightWave 物件</comment>
+ <glob pattern="*.lwo"/>
+ <glob pattern="*.lwob"/>
+ </mime-type>
+ <mime-type type="image/x-lws">
+ <comment>LightWave scene</comment>
+ <comment xml:lang="ar">مشهد LightWave</comment>
+ <comment xml:lang="az">LightWave səhnəsi</comment>
+ <comment xml:lang="be@latin">Scena LightWave</comment>
+ <comment xml:lang="bg">Сцена — LightWave</comment>
+ <comment xml:lang="ca">escena de LightWave</comment>
+ <comment xml:lang="cs">Scéna LightWave</comment>
+ <comment xml:lang="cy">Golygfa LightWave</comment>
+ <comment xml:lang="da">LightWave-scene</comment>
+ <comment xml:lang="de">LightWave-Szene</comment>
+ <comment xml:lang="el">σκηνή LightWave</comment>
+ <comment xml:lang="en_GB">LightWave scene</comment>
+ <comment xml:lang="eo">LightWave-sceno</comment>
+ <comment xml:lang="es">escena LightWave</comment>
+ <comment xml:lang="eu">LightWave eszena</comment>
+ <comment xml:lang="fi">LightWave-maisema</comment>
+ <comment xml:lang="fo">LightWave leikmynd</comment>
+ <comment xml:lang="fr">scène LightWave</comment>
+ <comment xml:lang="ga">radharc LightWave</comment>
+ <comment xml:lang="gl">escena de LightWave</comment>
+ <comment xml:lang="he">סצנה של LightWave</comment>
+ <comment xml:lang="hu">LightWave-jelenet</comment>
+ <comment xml:lang="id">Scene LightWave</comment>
+ <comment xml:lang="it">Scena LightWave</comment>
+ <comment xml:lang="ja">LightWave シーン</comment>
+ <comment xml:lang="kk">LightWave сахнасы</comment>
+ <comment xml:lang="ko">LightWave 장면</comment>
+ <comment xml:lang="lt">LightWave scena</comment>
+ <comment xml:lang="lv">LightWave aina</comment>
+ <comment xml:lang="ms">Babak LightWave</comment>
+ <comment xml:lang="nb">LightWave-scene</comment>
+ <comment xml:lang="nl">LightWave-scène</comment>
+ <comment xml:lang="nn">LightWave-scene</comment>
+ <comment xml:lang="pl">Scena Lightwave</comment>
+ <comment xml:lang="pt">cenário LightWave</comment>
+ <comment xml:lang="pt_BR">Cena LightWave</comment>
+ <comment xml:lang="ro">Scenă LightWave</comment>
+ <comment xml:lang="ru">сцена LightWave</comment>
+ <comment xml:lang="sk">Scéna LightWave</comment>
+ <comment xml:lang="sl">Datoteka scene LightWave</comment>
+ <comment xml:lang="sq">Skenë LightWave</comment>
+ <comment xml:lang="sr">LightWave сцена</comment>
+ <comment xml:lang="sv">LightWave-scen</comment>
+ <comment xml:lang="uk">сцена LightWave</comment>
+ <comment xml:lang="vi">Cảnh LightWave</comment>
+ <comment xml:lang="zh_CN">LightWave 场景</comment>
+ <comment xml:lang="zh_TW">LightWave 場景</comment>
+ <glob pattern="*.lws"/>
+ </mime-type>
+ <mime-type type="image/x-macpaint">
+ <comment>MacPaint Bitmap image</comment>
+ <comment xml:lang="ar">صورة MacPaint Bitmap</comment>
+ <comment xml:lang="be@latin">Bitmapnaja vyjava MacPaint</comment>
+ <comment xml:lang="bg">Изображение — MacPaint Bitmap</comment>
+ <comment xml:lang="ca">imatge de mapa de bits MacPaint</comment>
+ <comment xml:lang="cs">Obrázek MacPaint Bitmap</comment>
+ <comment xml:lang="da">MacPaint BitMap-billede</comment>
+ <comment xml:lang="de">MacPaint-Bitmap-Datei</comment>
+ <comment xml:lang="es">imagen en mapa de bits de MacPaint</comment>
+ <comment xml:lang="eu">MacPaint Bitmap irudia</comment>
+ <comment xml:lang="fi">MacPaint-bittikartta</comment>
+ <comment xml:lang="fo">MacPaint Bitmap mynd</comment>
+ <comment xml:lang="fr">image matricielle MacPaint</comment>
+ <comment xml:lang="ga">íomhá MacPaint Bitmap</comment>
+ <comment xml:lang="gl">imaxe de mapa de bits MacPaint</comment>
+ <comment xml:lang="he">תמונת מפת-סיביות של MacPaint</comment>
+ <comment xml:lang="hu">MacPaint bitkép</comment>
+ <comment xml:lang="id">Citra MacPaint Bitmap</comment>
+ <comment xml:lang="it">Immagine Bitmap MacPaint</comment>
+ <comment xml:lang="ja">MacPaint ビットマップ画像</comment>
+ <comment xml:lang="kk">MacPaint растрлық суреті</comment>
+ <comment xml:lang="ko">맥페인트 비트맵 그림</comment>
+ <comment xml:lang="lt">MacPaint rastrinis paveikslėlis</comment>
+ <comment xml:lang="lv">MacPaint bitkartes attēls</comment>
+ <comment xml:lang="nb">MacPaint Bitmap-bilde</comment>
+ <comment xml:lang="nl">MacPaint-bitmap-afbeelding</comment>
+ <comment xml:lang="nn">MacPaint punktbilete</comment>
+ <comment xml:lang="pl">Obraz bitmapowy MacPaint</comment>
+ <comment xml:lang="pt_BR">Imagem de bitmap do MacPaint</comment>
+ <comment xml:lang="ro">Imagine MacPaint Bitmap</comment>
+ <comment xml:lang="ru">растровое изображение MacPaint</comment>
+ <comment xml:lang="sk">Obrázok MacPaint Bitmap</comment>
+ <comment xml:lang="sl">Slikovna bitna datoteka MacPaint</comment>
+ <comment xml:lang="sq">Figurë BitMap MacPaint</comment>
+ <comment xml:lang="sv">MacPaint Bitmap-bild</comment>
+ <comment xml:lang="uk">растрове зображення MacPaint</comment>
+ <comment xml:lang="vi">Ảnh mảng MacPaint</comment>
+ <comment xml:lang="zh_CN">MacPaint 位图</comment>
+ <comment xml:lang="zh_TW">MacPaint 點陣影像</comment>
+ <glob pattern="*.pntg"/>
+ </mime-type>
+ <mime-type type="image/x-msod">
+ <comment>Office drawing</comment>
+ <comment xml:lang="ar">تصميم أوفيس</comment>
+ <comment xml:lang="be@latin">Ofisny rysunak</comment>
+ <comment xml:lang="bg">Чертеж — Office</comment>
+ <comment xml:lang="ca">dibuix d'Office</comment>
+ <comment xml:lang="cs">Kresba Office</comment>
+ <comment xml:lang="da">Officetegning</comment>
+ <comment xml:lang="de">Office-Zeichnung</comment>
+ <comment xml:lang="en_GB">Office drawing</comment>
+ <comment xml:lang="es">dibujo de Office</comment>
+ <comment xml:lang="eu">Office marrazkia</comment>
+ <comment xml:lang="fi">Office-piirros</comment>
+ <comment xml:lang="fo">Office tekning</comment>
+ <comment xml:lang="fr">dessin Office</comment>
+ <comment xml:lang="ga">líníocht Office</comment>
+ <comment xml:lang="gl">debuxo de Office</comment>
+ <comment xml:lang="he">ציור של Office</comment>
+ <comment xml:lang="hu">Office rajz</comment>
+ <comment xml:lang="id">Gambar Office</comment>
+ <comment xml:lang="it">Disegno Office</comment>
+ <comment xml:lang="ja">Office ドロー</comment>
+ <comment xml:lang="kk">Office суреті</comment>
+ <comment xml:lang="ko">오피스 드로잉</comment>
+ <comment xml:lang="lt">Office piešinys</comment>
+ <comment xml:lang="lv">Office zīmējums</comment>
+ <comment xml:lang="nb">Office-tegning</comment>
+ <comment xml:lang="nl">Office-tekening</comment>
+ <comment xml:lang="nn">Office-teikning</comment>
+ <comment xml:lang="pl">Rysunek Office</comment>
+ <comment xml:lang="pt_BR">Desenho do Office</comment>
+ <comment xml:lang="ro">Desen Office</comment>
+ <comment xml:lang="ru">изображение Office</comment>
+ <comment xml:lang="sk">Kresba Office</comment>
+ <comment xml:lang="sl">Datoteka risbe Office</comment>
+ <comment xml:lang="sq">Vizatim Office</comment>
+ <comment xml:lang="sv">Office-teckning</comment>
+ <comment xml:lang="uk">малюнок Office</comment>
+ <comment xml:lang="vi">Bản vẽ Office</comment>
+ <comment xml:lang="zh_CN">Microsoft Office 绘图</comment>
+ <comment xml:lang="zh_TW">Office 繪圖</comment>
+ <glob pattern="*.msod"/>
+ </mime-type>
+ <mime-type type="image/x-niff">
+ <comment>NIFF image</comment>
+ <comment xml:lang="ar">صورة NIFF</comment>
+ <comment xml:lang="be@latin">Vyjava NIFF</comment>
+ <comment xml:lang="bg">Изображение — NIFF</comment>
+ <comment xml:lang="ca">imatge NIFF</comment>
+ <comment xml:lang="cs">Obrázek NIFF</comment>
+ <comment xml:lang="da">NIFF-billede</comment>
+ <comment xml:lang="de">NIFF-Bild</comment>
+ <comment xml:lang="eo">NIFF-bildo</comment>
+ <comment xml:lang="es">imagen NIFF</comment>
+ <comment xml:lang="eu">NIFF irudia</comment>
+ <comment xml:lang="fi">NIFF-kuva</comment>
+ <comment xml:lang="fo">NIFF mynd</comment>
+ <comment xml:lang="fr">image NIFF</comment>
+ <comment xml:lang="ga">íomhá NIFF</comment>
+ <comment xml:lang="gl">imaxe NIFF</comment>
+ <comment xml:lang="he">תמונת NIFF</comment>
+ <comment xml:lang="hu">NIFF kép</comment>
+ <comment xml:lang="id">Citra NIFF</comment>
+ <comment xml:lang="it">Immagine NIFF</comment>
+ <comment xml:lang="ja">NIFF 画像</comment>
+ <comment xml:lang="kk">NIFF суреті</comment>
+ <comment xml:lang="ko">NIFF 그림</comment>
+ <comment xml:lang="lt">NIFF paveikslėlis</comment>
+ <comment xml:lang="lv">NIFF attēls</comment>
+ <comment xml:lang="nb">NIFF-bilde</comment>
+ <comment xml:lang="nl">NIFF-afbeelding</comment>
+ <comment xml:lang="nn">NIFF-bilete</comment>
+ <comment xml:lang="pl">Obraz NIFF</comment>
+ <comment xml:lang="pt_BR">Imagem NIFF</comment>
+ <comment xml:lang="ro">Imagine NIF</comment>
+ <comment xml:lang="ru">изображение NIFF</comment>
+ <comment xml:lang="sk">Obrázok NIFF</comment>
+ <comment xml:lang="sl">Slikovna datoteka NIFF</comment>
+ <comment xml:lang="sq">Figurë NIFF</comment>
+ <comment xml:lang="sv">NIFF-bild</comment>
+ <comment xml:lang="uk">зображення NIFF</comment>
+ <comment xml:lang="vi">Ảnh NIFF</comment>
+ <comment xml:lang="zh_CN">NIFF 图像</comment>
+ <comment xml:lang="zh_TW">NIFF 影像</comment>
+ <magic priority="80">
+ <match value="IIN1" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-pcx">
+ <comment>PCX image</comment>
+ <comment xml:lang="ar">صورة PCX</comment>
+ <comment xml:lang="be@latin">Vyjava PCX</comment>
+ <comment xml:lang="bg">Изображение — PCX</comment>
+ <comment xml:lang="ca">imatge PCX</comment>
+ <comment xml:lang="cs">Obrázek PCX</comment>
+ <comment xml:lang="da">PCX-billede</comment>
+ <comment xml:lang="de">PCX-Bild</comment>
+ <comment xml:lang="en_GB">PCX image</comment>
+ <comment xml:lang="eo">PCX-bildo</comment>
+ <comment xml:lang="es">imagen PCX</comment>
+ <comment xml:lang="eu">PCX irudia</comment>
+ <comment xml:lang="fi">PCX-kuva</comment>
+ <comment xml:lang="fo">PCX mynd</comment>
+ <comment xml:lang="fr">image PCX</comment>
+ <comment xml:lang="ga">íomhá PCX</comment>
+ <comment xml:lang="gl">imaxe PCX</comment>
+ <comment xml:lang="he">תמונת PCX</comment>
+ <comment xml:lang="hu">PCX kép</comment>
+ <comment xml:lang="id">Citra PCX</comment>
+ <comment xml:lang="it">Immagine PCX</comment>
+ <comment xml:lang="ja">PCX 画像</comment>
+ <comment xml:lang="kk">PCX суреті</comment>
+ <comment xml:lang="ko">PCX 그림</comment>
+ <comment xml:lang="lt">PCX paveikslėlis</comment>
+ <comment xml:lang="lv">PCX attēls</comment>
+ <comment xml:lang="nb">PCX-bilde</comment>
+ <comment xml:lang="nl">PCX-afbeelding</comment>
+ <comment xml:lang="nn">PCX-bilete</comment>
+ <comment xml:lang="pl">Obraz PCX</comment>
+ <comment xml:lang="pt_BR">Imagem PCX</comment>
+ <comment xml:lang="ro">Imagine PCX</comment>
+ <comment xml:lang="ru">изображение PCX</comment>
+ <comment xml:lang="sk">Obrázok PCX</comment>
+ <comment xml:lang="sl">Slikovna datoteka PCX</comment>
+ <comment xml:lang="sq">Figurë PCX</comment>
+ <comment xml:lang="sv">PCX-bild</comment>
+ <comment xml:lang="uk">зображення PCX</comment>
+ <comment xml:lang="vi">Ảnh PCX</comment>
+ <comment xml:lang="zh_CN">PCX 图像</comment>
+ <comment xml:lang="zh_TW">PCX 影像</comment>
+ <acronym>PCX</acronym>
+ <expanded-acronym>PiCture eXchange</expanded-acronym>
+ <magic priority="50">
+ <match value="10" type="byte" offset="0">
+ <match value="0" type="byte" offset="1"/>
+ <match value="2" type="byte" offset="1"/>
+ <match value="3" type="byte" offset="1"/>
+ <match value="5" type="byte" offset="1"/>
+ </match>
+ </magic>
+ <glob pattern="*.pcx"/>
+ </mime-type>
+ <mime-type type="image/x-photo-cd">
+ <comment>PCD image</comment>
+ <comment xml:lang="ar">صورة PCD</comment>
+ <comment xml:lang="be@latin">Vyjava PCD</comment>
+ <comment xml:lang="bg">Изображение — PCD</comment>
+ <comment xml:lang="ca">imatge PCD</comment>
+ <comment xml:lang="cs">Obrázek PCD</comment>
+ <comment xml:lang="da">PCD-billede</comment>
+ <comment xml:lang="de">PCD-Bild</comment>
+ <comment xml:lang="en_GB">PCD image</comment>
+ <comment xml:lang="eo">PCD-bildo</comment>
+ <comment xml:lang="es">imagen PCD</comment>
+ <comment xml:lang="eu">PCD irudia</comment>
+ <comment xml:lang="fi">PCD-kuva</comment>
+ <comment xml:lang="fo">PCD mynd</comment>
+ <comment xml:lang="fr">image PCD</comment>
+ <comment xml:lang="ga">íomhá PCD</comment>
+ <comment xml:lang="gl">imaxe PCD</comment>
+ <comment xml:lang="he">תמונת PCD</comment>
+ <comment xml:lang="hu">PCD kép</comment>
+ <comment xml:lang="id">Citra PCD</comment>
+ <comment xml:lang="it">Immagine PCD</comment>
+ <comment xml:lang="ja">PCD 画像</comment>
+ <comment xml:lang="kk">PCD суреті</comment>
+ <comment xml:lang="ko">PCD 그림</comment>
+ <comment xml:lang="lt">PCD paveikslėlis</comment>
+ <comment xml:lang="lv">PCD attēls</comment>
+ <comment xml:lang="nb">PCD-bilde</comment>
+ <comment xml:lang="nl">PCD-afbeelding</comment>
+ <comment xml:lang="nn">PCD-bilete</comment>
+ <comment xml:lang="pl">Obraz PCD</comment>
+ <comment xml:lang="pt_BR">Imagem PCD</comment>
+ <comment xml:lang="ro">Imagine PCD</comment>
+ <comment xml:lang="ru">изображение PCD</comment>
+ <comment xml:lang="sk">Obrázok PCD</comment>
+ <comment xml:lang="sl">Slikovna datoteka PCD</comment>
+ <comment xml:lang="sq">Figurë PCD</comment>
+ <comment xml:lang="sv">PCD-bild</comment>
+ <comment xml:lang="uk">зображення PCD</comment>
+ <comment xml:lang="vi">Ảnh PCD</comment>
+ <comment xml:lang="zh_CN">PCD 图像</comment>
+ <comment xml:lang="zh_TW">PCD 影像</comment>
+ <acronym>PCD</acronym>
+ <expanded-acronym>PhotoCD</expanded-acronym>
+ <glob pattern="*.pcd"/>
+ </mime-type>
+ <mime-type type="image/x-portable-anymap">
+ <comment>PNM image</comment>
+ <comment xml:lang="ar">صورة PNM</comment>
+ <comment xml:lang="az">PNM rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava PNM</comment>
+ <comment xml:lang="bg">Изображение — PNM</comment>
+ <comment xml:lang="ca">imatge PNM</comment>
+ <comment xml:lang="cs">Obrázek PNM</comment>
+ <comment xml:lang="cy">Delwedd PNM</comment>
+ <comment xml:lang="da">PNM-billede</comment>
+ <comment xml:lang="de">PNM-Bild</comment>
+ <comment xml:lang="el">εικόνα PNM</comment>
+ <comment xml:lang="en_GB">PNM image</comment>
+ <comment xml:lang="eo">PNM-bildo</comment>
+ <comment xml:lang="es">imagen PNM</comment>
+ <comment xml:lang="eu">PNM irudia</comment>
+ <comment xml:lang="fi">PNM-kuva</comment>
+ <comment xml:lang="fo">PNM mynd</comment>
+ <comment xml:lang="fr">image PNM</comment>
+ <comment xml:lang="ga">íomhá PNM</comment>
+ <comment xml:lang="gl">imaxe PNM</comment>
+ <comment xml:lang="he">תמונת PNM</comment>
+ <comment xml:lang="hu">PNM-kép</comment>
+ <comment xml:lang="id">Citra PNM</comment>
+ <comment xml:lang="it">Immagine PNM</comment>
+ <comment xml:lang="ja">PNM 画像</comment>
+ <comment xml:lang="kk">PNM суреті</comment>
+ <comment xml:lang="ko">PNM 그림</comment>
+ <comment xml:lang="lt">PNM paveikslėlis</comment>
+ <comment xml:lang="lv">PNM attēls</comment>
+ <comment xml:lang="ms">Imej PNM</comment>
+ <comment xml:lang="nb">PNM-bilde</comment>
+ <comment xml:lang="nl">PNM-afbeelding</comment>
+ <comment xml:lang="nn">PNM-bilete</comment>
+ <comment xml:lang="pl">Obraz PNM</comment>
+ <comment xml:lang="pt">imagem PNM</comment>
+ <comment xml:lang="pt_BR">Imagem PNM</comment>
+ <comment xml:lang="ro">Imagine PNM</comment>
+ <comment xml:lang="ru">изображение PNM</comment>
+ <comment xml:lang="sk">Obrázok PNM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PNM</comment>
+ <comment xml:lang="sq">Figurë PNM</comment>
+ <comment xml:lang="sr">PNM слика</comment>
+ <comment xml:lang="sv">PNM-bild</comment>
+ <comment xml:lang="uk">зображення PNM</comment>
+ <comment xml:lang="vi">Ảnh PNM</comment>
+ <comment xml:lang="zh_CN">PNM 图像</comment>
+ <comment xml:lang="zh_TW">PNM 影像</comment>
+ <glob pattern="*.pnm"/>
+ </mime-type>
+ <mime-type type="image/x-portable-bitmap">
+ <comment>PBM image</comment>
+ <comment xml:lang="ar">صورة PBM</comment>
+ <comment xml:lang="be@latin">Vyjava PBM</comment>
+ <comment xml:lang="bg">Изображение — PBM</comment>
+ <comment xml:lang="ca">imatge PBM</comment>
+ <comment xml:lang="cs">Obrázek PBM</comment>
+ <comment xml:lang="cy">Delwedd PBM</comment>
+ <comment xml:lang="da">PBM-billede</comment>
+ <comment xml:lang="de">PBM-Bild</comment>
+ <comment xml:lang="en_GB">PBM image</comment>
+ <comment xml:lang="eo">PBM-bildo</comment>
+ <comment xml:lang="es">imagen PBM</comment>
+ <comment xml:lang="eu">PBM irudia</comment>
+ <comment xml:lang="fi">PBM-kuva</comment>
+ <comment xml:lang="fo">PBM mynd</comment>
+ <comment xml:lang="fr">image PBM</comment>
+ <comment xml:lang="ga">íomhá PBM</comment>
+ <comment xml:lang="gl">imaxe PBM</comment>
+ <comment xml:lang="he">תמונת PBM</comment>
+ <comment xml:lang="hu">PBM kép</comment>
+ <comment xml:lang="id">Citra PBM</comment>
+ <comment xml:lang="it">Immagine PBM</comment>
+ <comment xml:lang="ja">PBM 画像</comment>
+ <comment xml:lang="kk">PBM суреті</comment>
+ <comment xml:lang="ko">PBM 그림</comment>
+ <comment xml:lang="lt">PBM paveikslėlis</comment>
+ <comment xml:lang="lv">PBM attēls</comment>
+ <comment xml:lang="nb">PBM-bilde</comment>
+ <comment xml:lang="nl">PBM-afbeelding</comment>
+ <comment xml:lang="nn">PBM-bilete</comment>
+ <comment xml:lang="pl">Obraz PBM</comment>
+ <comment xml:lang="pt_BR">Imagem PBM</comment>
+ <comment xml:lang="ro">Imagine PBM</comment>
+ <comment xml:lang="ru">изображение PBM</comment>
+ <comment xml:lang="sk">Obrázok PBM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PBM</comment>
+ <comment xml:lang="sq">Figurë PBM</comment>
+ <comment xml:lang="sr">PBM слика</comment>
+ <comment xml:lang="sv">PBM-bild</comment>
+ <comment xml:lang="uk">зображення PBM</comment>
+ <comment xml:lang="vi">Ảnh PBM</comment>
+ <comment xml:lang="zh_CN">PBM 图像</comment>
+ <comment xml:lang="zh_TW">PBM 影像</comment>
+ <acronym>PBM</acronym>
+ <expanded-acronym>Portable BitMap</expanded-acronym>
+ <sub-class-of type="image/x-portable-anymap"/>
+ <magic priority="50">
+ <match value="P1" type="string" offset="0">
+ <match value="0x0a" type="byte" offset="2"/>
+ <match value="0x20" type="byte" offset="2"/>
+ <match value="0x09" type="byte" offset="2"/>
+ <match value="0x0d" type="byte" offset="2"/>
+ </match>
+ <match value="P4" type="string" offset="0">
+ <match value="0x0a" type="byte" offset="2"/>
+ <match value="0x20" type="byte" offset="2"/>
+ <match value="0x09" type="byte" offset="2"/>
+ <match value="0x0d" type="byte" offset="2"/>
+ </match>
+ </magic>
+ <glob pattern="*.pbm"/>
+ </mime-type>
+ <mime-type type="image/x-portable-graymap">
+ <comment>PGM image</comment>
+ <comment xml:lang="ar">صورة PGM</comment>
+ <comment xml:lang="be@latin">Vyjava PGM</comment>
+ <comment xml:lang="bg">Изображение — PGM</comment>
+ <comment xml:lang="ca">imatge PGM</comment>
+ <comment xml:lang="cs">Obrázek PGM</comment>
+ <comment xml:lang="cy">Delwedd PGM</comment>
+ <comment xml:lang="da">PGM-billede</comment>
+ <comment xml:lang="de">PGM-Bild</comment>
+ <comment xml:lang="en_GB">PGM image</comment>
+ <comment xml:lang="eo">PGM-bildo</comment>
+ <comment xml:lang="es">imagen PGM</comment>
+ <comment xml:lang="eu">PGM irudia</comment>
+ <comment xml:lang="fi">PGM-kuva</comment>
+ <comment xml:lang="fo">PGM mynd</comment>
+ <comment xml:lang="fr">image PGM</comment>
+ <comment xml:lang="ga">íomhá PGM</comment>
+ <comment xml:lang="gl">imaxe PGM</comment>
+ <comment xml:lang="he">תמונת PGM</comment>
+ <comment xml:lang="hu">PGM kép</comment>
+ <comment xml:lang="id">Citra PGM</comment>
+ <comment xml:lang="it">Immagine PGM</comment>
+ <comment xml:lang="ja">PGM 画像</comment>
+ <comment xml:lang="kk">PGM суреті</comment>
+ <comment xml:lang="ko">PGM 그림</comment>
+ <comment xml:lang="lt">PGM paveikslėlis</comment>
+ <comment xml:lang="lv">PGM attēls</comment>
+ <comment xml:lang="nb">PGM-bilde</comment>
+ <comment xml:lang="nl">PGM-afbeelding</comment>
+ <comment xml:lang="nn">PGM-bilete</comment>
+ <comment xml:lang="pl">Obraz PGM</comment>
+ <comment xml:lang="pt_BR">Imagem PGM</comment>
+ <comment xml:lang="ro">Imagine PGM</comment>
+ <comment xml:lang="ru">изображение PGM</comment>
+ <comment xml:lang="sk">Obrázok PGM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PGM</comment>
+ <comment xml:lang="sq">Figurë PGM</comment>
+ <comment xml:lang="sv">PGM-bild</comment>
+ <comment xml:lang="uk">зображення PGM</comment>
+ <comment xml:lang="vi">Ảnh PGM</comment>
+ <comment xml:lang="zh_CN">PGM 图像</comment>
+ <comment xml:lang="zh_TW">PGM 影像</comment>
+ <acronym>PGM</acronym>
+ <expanded-acronym>Portable GrayMap</expanded-acronym>
+ <sub-class-of type="image/x-portable-anymap"/>
+ <magic priority="50">
+ <match value="P2" type="string" offset="0">
+ <match value="0x0a" type="byte" offset="2"/>
+ <match value="0x20" type="byte" offset="2"/>
+ <match value="0x09" type="byte" offset="2"/>
+ <match value="0x0d" type="byte" offset="2"/>
+ </match>
+ <match value="P5" type="string" offset="0">
+ <match value="0x0a" type="byte" offset="2"/>
+ <match value="0x20" type="byte" offset="2"/>
+ <match value="0x09" type="byte" offset="2"/>
+ <match value="0x0d" type="byte" offset="2"/>
+ </match>
+ </magic>
+ <glob pattern="*.pgm"/>
+ </mime-type>
+ <mime-type type="image/x-portable-pixmap">
+ <comment>PPM image</comment>
+ <comment xml:lang="ar">صورة PPM</comment>
+ <comment xml:lang="be@latin">Vyjava PPM</comment>
+ <comment xml:lang="bg">Изображение — PPM</comment>
+ <comment xml:lang="ca">imatge PPM</comment>
+ <comment xml:lang="cs">Obrázek PPM</comment>
+ <comment xml:lang="cy">Delwedd PPM</comment>
+ <comment xml:lang="da">PPM-billede</comment>
+ <comment xml:lang="de">PPM-Bild</comment>
+ <comment xml:lang="en_GB">PPM image</comment>
+ <comment xml:lang="eo">PPM-bildo</comment>
+ <comment xml:lang="es">imagen PPM</comment>
+ <comment xml:lang="eu">PPM irudia</comment>
+ <comment xml:lang="fi">PPM-kuva</comment>
+ <comment xml:lang="fo">PPM mynd</comment>
+ <comment xml:lang="fr">image PPM</comment>
+ <comment xml:lang="ga">íomhá PPM</comment>
+ <comment xml:lang="gl">imaxe PPM</comment>
+ <comment xml:lang="he">תמונת PPM</comment>
+ <comment xml:lang="hu">PPM kép</comment>
+ <comment xml:lang="id">Citra PPM</comment>
+ <comment xml:lang="it">Immagine PPM</comment>
+ <comment xml:lang="ja">PPM 画像</comment>
+ <comment xml:lang="kk">PPM суреті</comment>
+ <comment xml:lang="ko">PPM 그림</comment>
+ <comment xml:lang="lt">PPM paveikslėlis</comment>
+ <comment xml:lang="lv">PPM attēls</comment>
+ <comment xml:lang="nb">PPM-bilde</comment>
+ <comment xml:lang="nl">PPM-afbeelding</comment>
+ <comment xml:lang="nn">PPM-bilete</comment>
+ <comment xml:lang="pl">Obraz PPM</comment>
+ <comment xml:lang="pt_BR">Imagem PPM</comment>
+ <comment xml:lang="ro">Imagine PPM</comment>
+ <comment xml:lang="ru">изображение PPM</comment>
+ <comment xml:lang="sk">Obrázok PPM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PPM</comment>
+ <comment xml:lang="sq">Figurë PPM</comment>
+ <comment xml:lang="sr">PPM слика</comment>
+ <comment xml:lang="sv">PPM-bild</comment>
+ <comment xml:lang="uk">зображення PPM</comment>
+ <comment xml:lang="vi">Ảnh PPM</comment>
+ <comment xml:lang="zh_CN">PPM 图像</comment>
+ <comment xml:lang="zh_TW">PPM 影像</comment>
+ <acronym>PPM</acronym>
+ <expanded-acronym>Portable PixMap</expanded-acronym>
+ <sub-class-of type="image/x-portable-anymap"/>
+ <magic priority="50">
+ <match value="P3" type="string" offset="0">
+ <match value="0x0a" type="byte" offset="2"/>
+ <match value="0x20" type="byte" offset="2"/>
+ <match value="0x09" type="byte" offset="2"/>
+ <match value="0x0d" type="byte" offset="2"/>
+ </match>
+ <match value="P6" type="string" offset="0">
+ <match value="0x0a" type="byte" offset="2"/>
+ <match value="0x20" type="byte" offset="2"/>
+ <match value="0x09" type="byte" offset="2"/>
+ <match value="0x0d" type="byte" offset="2"/>
+ </match>
+ </magic>
+ <glob pattern="*.ppm"/>
+ </mime-type>
+ <mime-type type="image/vnd.adobe.photoshop">
+ <comment>Photoshop image</comment>
+ <comment xml:lang="ar">صورة فوتوشوب</comment>
+ <comment xml:lang="bg">Изображение — Photoshop</comment>
+ <comment xml:lang="ca">imatge de Photoshop</comment>
+ <comment xml:lang="cs">Obrázek Photoshop</comment>
+ <comment xml:lang="da">Photoshop-billede</comment>
+ <comment xml:lang="de">Photoshop-Bild</comment>
+ <comment xml:lang="el">εικόνα Photoshop</comment>
+ <comment xml:lang="eo">Photoshop-bildo</comment>
+ <comment xml:lang="es">imagen de Photoshop</comment>
+ <comment xml:lang="eu">Photoshop irudia</comment>
+ <comment xml:lang="fi">Photoshop-kuva</comment>
+ <comment xml:lang="fo">Photoshop mynd</comment>
+ <comment xml:lang="fr">image Photoshop</comment>
+ <comment xml:lang="ga">íomhá Photoshop</comment>
+ <comment xml:lang="gl">imaxe de Photoshop</comment>
+ <comment xml:lang="he">תמונת Photoshop</comment>
+ <comment xml:lang="hu">Photoshop-kép</comment>
+ <comment xml:lang="id">Citra Photoshop</comment>
+ <comment xml:lang="it">Immagine Photoshop</comment>
+ <comment xml:lang="ja">Photoshop 画像</comment>
+ <comment xml:lang="kk">изображение Photoshop</comment>
+ <comment xml:lang="ko">포토샵 이미지</comment>
+ <comment xml:lang="lt">Photoshop paveikslėlis</comment>
+ <comment xml:lang="lv">Photoshop attēls</comment>
+ <comment xml:lang="ms">Imej Photoshop</comment>
+ <comment xml:lang="nl">Photoshop-afbeelding</comment>
+ <comment xml:lang="pl">Obraz Photoshop</comment>
+ <comment xml:lang="pt">imagem do Photoshop</comment>
+ <comment xml:lang="pt_BR">Imagem do Photoshop</comment>
+ <comment xml:lang="ro">Imagine Photoshop</comment>
+ <comment xml:lang="ru">изображение Photoshop</comment>
+ <comment xml:lang="sk">Obrázok Photoshop</comment>
+ <comment xml:lang="sl">Slikovna datoteka Photoshop</comment>
+ <comment xml:lang="sr">Фотошоп слика</comment>
+ <comment xml:lang="sv">Photoshop-bild</comment>
+ <comment xml:lang="uk">зображення Photoshop</comment>
+ <comment xml:lang="vi">Ảnh Photoshop</comment>
+ <comment xml:lang="zh_CN">Photoshop 图像</comment>
+ <comment xml:lang="zh_TW">Photoshop 影像</comment>
+ <magic priority="50">
+ <match value="8BPS \000\000\000\000" type="string" offset="0" mask="0xffffffff0000ffffffff"/>
+ </magic>
+ <glob pattern="*.psd"/>
+ <alias type="image/x-psd"/>
+ </mime-type>
+ <mime-type type="image/x-rgb">
+ <comment>RGB image</comment>
+ <comment xml:lang="ar">صورة RGB</comment>
+ <comment xml:lang="az">RGB rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava RGB</comment>
+ <comment xml:lang="bg">Изображение — RGB</comment>
+ <comment xml:lang="ca">imatge RGB</comment>
+ <comment xml:lang="cs">Obrázek RGB</comment>
+ <comment xml:lang="cy">Delwedd RGB</comment>
+ <comment xml:lang="da">RGB-billede</comment>
+ <comment xml:lang="de">RGB-Bild</comment>
+ <comment xml:lang="el">εικόνα RGB</comment>
+ <comment xml:lang="en_GB">RGB image</comment>
+ <comment xml:lang="eo">RGB-bildo</comment>
+ <comment xml:lang="es">imagen RGB</comment>
+ <comment xml:lang="eu">RGB irudia</comment>
+ <comment xml:lang="fi">RGB-kuva</comment>
+ <comment xml:lang="fo">RGB mynd</comment>
+ <comment xml:lang="fr">image RGB</comment>
+ <comment xml:lang="ga">íomhá RGB</comment>
+ <comment xml:lang="gl">imaxe RGB</comment>
+ <comment xml:lang="he">תמונת RGB</comment>
+ <comment xml:lang="hu">RGB-kép</comment>
+ <comment xml:lang="id">Citra RGB</comment>
+ <comment xml:lang="it">Immagine RGB</comment>
+ <comment xml:lang="ja">RGB 画像</comment>
+ <comment xml:lang="kk">RGB суреті</comment>
+ <comment xml:lang="ko">RGB 그림</comment>
+ <comment xml:lang="lt">RGB paveikslėlis</comment>
+ <comment xml:lang="lv">RGB attēls</comment>
+ <comment xml:lang="ms">Imej RGB</comment>
+ <comment xml:lang="nb">RGB-bilde</comment>
+ <comment xml:lang="nl">RGB-afbeelding</comment>
+ <comment xml:lang="nn">RGB-bilete</comment>
+ <comment xml:lang="pl">Obraz RGB</comment>
+ <comment xml:lang="pt">imagem RGB</comment>
+ <comment xml:lang="pt_BR">Imagem RGB</comment>
+ <comment xml:lang="ro">Imagine RGB</comment>
+ <comment xml:lang="ru">изображение RGB</comment>
+ <comment xml:lang="sk">Obrázok RGB</comment>
+ <comment xml:lang="sl">Slikovna datoteka RGB</comment>
+ <comment xml:lang="sq">Figurë RGB</comment>
+ <comment xml:lang="sr">RGB слика</comment>
+ <comment xml:lang="sv">RGB-bild</comment>
+ <comment xml:lang="uk">зображення RGB</comment>
+ <comment xml:lang="vi">Ảnh kiểu RGB</comment>
+ <comment xml:lang="zh_CN">RGB 图像</comment>
+ <comment xml:lang="zh_TW">RGB 影像</comment>
+ <glob pattern="*.rgb"/>
+ </mime-type>
+ <mime-type type="image/x-sgi">
+ <comment>SGI image</comment>
+ <comment xml:lang="ar">صورة SGI</comment>
+ <comment xml:lang="be@latin">Vyjava SGI</comment>
+ <comment xml:lang="bg">Изображение — SGI</comment>
+ <comment xml:lang="ca">imatge SGI</comment>
+ <comment xml:lang="cs">Obrázek SGI</comment>
+ <comment xml:lang="da">SGI-billede</comment>
+ <comment xml:lang="de">SGI-Bild</comment>
+ <comment xml:lang="en_GB">SGI image</comment>
+ <comment xml:lang="eo">SGI-bildo</comment>
+ <comment xml:lang="es">imagen SGI</comment>
+ <comment xml:lang="eu">SGI irudia</comment>
+ <comment xml:lang="fi">SGI-kuva</comment>
+ <comment xml:lang="fo">SGI mynd</comment>
+ <comment xml:lang="fr">image SGI</comment>
+ <comment xml:lang="ga">íomhá SGI</comment>
+ <comment xml:lang="gl">imaxe SGI</comment>
+ <comment xml:lang="he">תמונת SGI</comment>
+ <comment xml:lang="hu">SGI kép</comment>
+ <comment xml:lang="id">Citra SGI</comment>
+ <comment xml:lang="it">Immagine SGI</comment>
+ <comment xml:lang="ja">SGI 画像</comment>
+ <comment xml:lang="kk">SGI суреті</comment>
+ <comment xml:lang="ko">SGI 그림</comment>
+ <comment xml:lang="lt">SGI paveikslėlis</comment>
+ <comment xml:lang="lv">SGI attēls</comment>
+ <comment xml:lang="nb">SGI-bilde</comment>
+ <comment xml:lang="nl">SGI-afbeelding</comment>
+ <comment xml:lang="nn">SGI-bilete</comment>
+ <comment xml:lang="pl">Obraz SGI</comment>
+ <comment xml:lang="pt_BR">Imagem SGI</comment>
+ <comment xml:lang="ro">Imagine SGI</comment>
+ <comment xml:lang="ru">изображение SGI</comment>
+ <comment xml:lang="sk">Obrázok SGI</comment>
+ <comment xml:lang="sl">Slikovna datoteka SGI</comment>
+ <comment xml:lang="sq">Figurë SGI</comment>
+ <comment xml:lang="sv">SGI-bild</comment>
+ <comment xml:lang="uk">зображення SGI</comment>
+ <comment xml:lang="vi">Ảnh SGI</comment>
+ <comment xml:lang="zh_CN">SGI 图像</comment>
+ <comment xml:lang="zh_TW">SGI 影像</comment>
+ <glob pattern="*.sgi"/>
+ </mime-type>
+ <mime-type type="image/x-sun-raster">
+ <comment>Sun raster image</comment>
+ <comment xml:lang="ar">صورة Sun raster</comment>
+ <comment xml:lang="be@latin">Rastravaja vyjava Sun</comment>
+ <comment xml:lang="bg">Изображение — Sun raster</comment>
+ <comment xml:lang="ca">imatge ràster Sun</comment>
+ <comment xml:lang="cs">Rastrový obrázek Sun</comment>
+ <comment xml:lang="da">Sun rasterbillede</comment>
+ <comment xml:lang="de">Sun-Rasterbild</comment>
+ <comment xml:lang="es">imagen ráster de Sun</comment>
+ <comment xml:lang="eu">Sun raster irudia</comment>
+ <comment xml:lang="fi">Sun-rasterikuva</comment>
+ <comment xml:lang="fo">Sun raster mynd</comment>
+ <comment xml:lang="fr">image raster Sun</comment>
+ <comment xml:lang="ga">íomhá rastar Sun</comment>
+ <comment xml:lang="gl">imaxe ráster de Sun</comment>
+ <comment xml:lang="he">תמונה סרוקה של Sun</comment>
+ <comment xml:lang="hu">SUN raszterkép</comment>
+ <comment xml:lang="id">Citra raster Sun</comment>
+ <comment xml:lang="it">Immagine raster Sun</comment>
+ <comment xml:lang="ja">Sun ラスタ画像</comment>
+ <comment xml:lang="kk">Sun растрлық суреті</comment>
+ <comment xml:lang="ko">Sun 래스터 그림</comment>
+ <comment xml:lang="lt">Sun rastrinis paveikslėlis</comment>
+ <comment xml:lang="lv">Sun rastra attēls</comment>
+ <comment xml:lang="nb">Sun rasterbilde</comment>
+ <comment xml:lang="nl">Sun-rasterafbeelding</comment>
+ <comment xml:lang="nn">Sun rasterbilete</comment>
+ <comment xml:lang="pl">Obraz rastrowy Sun</comment>
+ <comment xml:lang="pt_BR">Imagem raster da Sun</comment>
+ <comment xml:lang="ro">Imagine rasterizată Sun</comment>
+ <comment xml:lang="ru">растровое изображение Sun</comment>
+ <comment xml:lang="sk">Rastrový obrázok Sun</comment>
+ <comment xml:lang="sl">Slikovna rastrska datoteka Sun</comment>
+ <comment xml:lang="sq">Figurë raster Sun</comment>
+ <comment xml:lang="sv">Sun-rasterbild</comment>
+ <comment xml:lang="uk">растрове зображення Sun</comment>
+ <comment xml:lang="vi">Ảnh mành Sun</comment>
+ <comment xml:lang="zh_CN">Sun 光栅图像</comment>
+ <comment xml:lang="zh_TW">Sun raster 影像</comment>
+ <magic priority="50">
+ <match value="0x59a66a95" type="big32" offset="0"/>
+ </magic>
+ <glob pattern="*.sun"/>
+ </mime-type>
+ <mime-type type="image/x-tga">
+ <comment>TGA image</comment>
+ <comment xml:lang="ar">صورة TGA</comment>
+ <comment xml:lang="be@latin">Vyjava TGA</comment>
+ <comment xml:lang="bg">Изображение — TGA</comment>
+ <comment xml:lang="ca">imatge TGA</comment>
+ <comment xml:lang="cs">Obrázek TGA</comment>
+ <comment xml:lang="da">TGA-billede</comment>
+ <comment xml:lang="de">TGA-Bild</comment>
+ <comment xml:lang="en_GB">TGA image</comment>
+ <comment xml:lang="eo">TGA-bildo</comment>
+ <comment xml:lang="es">imagen TGA</comment>
+ <comment xml:lang="eu">TGA irudia</comment>
+ <comment xml:lang="fi">TGA-kuva</comment>
+ <comment xml:lang="fo">TGA mynd</comment>
+ <comment xml:lang="fr">image TGA</comment>
+ <comment xml:lang="ga">íomhá TGA</comment>
+ <comment xml:lang="gl">imaxe TGA</comment>
+ <comment xml:lang="he">תמונת TGA</comment>
+ <comment xml:lang="hu">TGA kép</comment>
+ <comment xml:lang="id">Citra TGA</comment>
+ <comment xml:lang="it">Immagine TGA</comment>
+ <comment xml:lang="ja">TGA 画像</comment>
+ <comment xml:lang="kk">TGA суреті</comment>
+ <comment xml:lang="ko">TGA 그림</comment>
+ <comment xml:lang="lt">TGA paveikslėlis</comment>
+ <comment xml:lang="lv">TGA attēls</comment>
+ <comment xml:lang="nb">TGA-bilde</comment>
+ <comment xml:lang="nl">TGA-afbeelding</comment>
+ <comment xml:lang="nn">TGA-bilete</comment>
+ <comment xml:lang="pl">Obraz TGA</comment>
+ <comment xml:lang="pt_BR">Imagem TGA</comment>
+ <comment xml:lang="ro">Imagine TGA</comment>
+ <comment xml:lang="ru">изображение TGA</comment>
+ <comment xml:lang="sk">Obrázok TGA</comment>
+ <comment xml:lang="sl">Slikovna datoteka TGA</comment>
+ <comment xml:lang="sq">Figurë TGA</comment>
+ <comment xml:lang="sv">TGA-bild</comment>
+ <comment xml:lang="uk">зображення TGA</comment>
+ <comment xml:lang="vi">Ảnh TGA</comment>
+ <comment xml:lang="zh_CN">TGA 图像</comment>
+ <comment xml:lang="zh_TW">TGA 影像</comment>
+ <acronym>TGA</acronym>
+ <expanded-acronym>Truevision Graphics Adapter</expanded-acronym>
+ <magic priority="10">
+ <match value="\1\1" type="string" offset="1"/>
+ <match value="\1\9" type="string" offset="1"/>
+ <match value="\0\3" type="string" offset="1"/>
+ <match value="\0\xa" type="string" offset="1"/>
+ <match value="\0\xb" type="string" offset="1"/>
+ <match value="\0\2" type="string" offset="1"/>
+ </magic>
+ <glob pattern="*.icb"/>
+ <glob pattern="*.tga"/>
+ <glob pattern="*.tpic"/>
+ <glob pattern="*.vda"/>
+ <glob pattern="*.vst"/>
+ <alias type="image/x-icb"/>
+ </mime-type>
+ <mime-type type="image/x-win-bitmap">
+ <comment>Windows cursor</comment>
+ <comment xml:lang="ar">مؤشر ويندوز</comment>
+ <comment xml:lang="be@latin">Kursor Windows</comment>
+ <comment xml:lang="bg">Курсор — Windows</comment>
+ <comment xml:lang="ca">cursor de Windows</comment>
+ <comment xml:lang="cs">Kurzor Windows</comment>
+ <comment xml:lang="da">Windowsmarkør</comment>
+ <comment xml:lang="de">Windows-Cursor</comment>
+ <comment xml:lang="el">δείκτης παραθυρικού περιβάλλοντος</comment>
+ <comment xml:lang="en_GB">Windows cursor</comment>
+ <comment xml:lang="eo">Windows-kursoro</comment>
+ <comment xml:lang="es">cursor de Windows</comment>
+ <comment xml:lang="eu">Windows kurtsorea</comment>
+ <comment xml:lang="fi">Windows-osoitin</comment>
+ <comment xml:lang="fo">Windows vísi</comment>
+ <comment xml:lang="fr">curseur Windows</comment>
+ <comment xml:lang="ga">cúrsóir Windows</comment>
+ <comment xml:lang="gl">Cursor de Windows</comment>
+ <comment xml:lang="he">סמן של Windows</comment>
+ <comment xml:lang="hu">Windows-kurzor</comment>
+ <comment xml:lang="id">Kursor Windows</comment>
+ <comment xml:lang="it">Cursore Windows</comment>
+ <comment xml:lang="ja">Windows カーソル</comment>
+ <comment xml:lang="kk">Windows курсоры</comment>
+ <comment xml:lang="ko">윈도우 커서</comment>
+ <comment xml:lang="lt">Windows žymiklis</comment>
+ <comment xml:lang="lv">Windows kursors</comment>
+ <comment xml:lang="ms">Kursor Windows</comment>
+ <comment xml:lang="nb">Windows-markør</comment>
+ <comment xml:lang="nl">Windows-muisaanwijzer</comment>
+ <comment xml:lang="nn">Windows-peikar</comment>
+ <comment xml:lang="pl">Kursor Windows</comment>
+ <comment xml:lang="pt">cursor Windows</comment>
+ <comment xml:lang="pt_BR">Cursor do Windows</comment>
+ <comment xml:lang="ro">Cursor Windows</comment>
+ <comment xml:lang="ru">курсор Windows</comment>
+ <comment xml:lang="sk">Kurzor Windows</comment>
+ <comment xml:lang="sl">Datoteka kazalke Windows</comment>
+ <comment xml:lang="sq">Kursor Windows</comment>
+ <comment xml:lang="sr">Виндуз курзор</comment>
+ <comment xml:lang="sv">Windows-muspekare</comment>
+ <comment xml:lang="uk">курсор Windows</comment>
+ <comment xml:lang="vi">Con chạy Windows</comment>
+ <comment xml:lang="zh_CN">Windows 光标</comment>
+ <comment xml:lang="zh_TW">Windows 滑鼠指標</comment>
+ <magic priority="50">
+ <match value="\0\0\2\0" type="string" offset="0">
+ <match value="\0" type="string" offset="5"/>
+ </match>
+ </magic>
+ <glob pattern="*.cur"/>
+ </mime-type>
+ <mime-type type="application/x-navi-animation">
+ <comment>Windows animated cursor</comment>
+ <comment xml:lang="ar">مؤشر ويندوز المتحرك</comment>
+ <comment xml:lang="be@latin">Animavany kursor Windows</comment>
+ <comment xml:lang="bg">Курсор — Windows, анимиран</comment>
+ <comment xml:lang="ca">cursor animat de Windows</comment>
+ <comment xml:lang="cs">Animovaný kurzor Windows</comment>
+ <comment xml:lang="da">Windowsanimeret markør</comment>
+ <comment xml:lang="de">Animierter Windows-Cursor</comment>
+ <comment xml:lang="es">cursor animado de Windows</comment>
+ <comment xml:lang="eu">Windows-eko kurtsore animatua</comment>
+ <comment xml:lang="fi">animoitu Windows-osoitin</comment>
+ <comment xml:lang="fo">Windows livindaigjørdur vísi</comment>
+ <comment xml:lang="fr">curseur animé Windows</comment>
+ <comment xml:lang="ga">cúrsóir beo Windows</comment>
+ <comment xml:lang="gl">Cursor animado de Windows</comment>
+ <comment xml:lang="he">סמן מונפש של Windows</comment>
+ <comment xml:lang="hu">Windows animált kurzor</comment>
+ <comment xml:lang="id">Kursor animasi Windows</comment>
+ <comment xml:lang="it">Cursore animato Windows</comment>
+ <comment xml:lang="ja">Windows アニメーションカーソル</comment>
+ <comment xml:lang="kk">Windows анимациясы бар курсор</comment>
+ <comment xml:lang="ko">윈도우 움직이는 커서</comment>
+ <comment xml:lang="lt">Animuotas Windows žymiklis</comment>
+ <comment xml:lang="lv">Windows animēts kursors</comment>
+ <comment xml:lang="nl">geanimeerde Windows-muisaanwijzer</comment>
+ <comment xml:lang="nn">Windows animert peikar</comment>
+ <comment xml:lang="pl">Animowany kursor Windows</comment>
+ <comment xml:lang="pt_BR">Cursor animado do Windows</comment>
+ <comment xml:lang="ro">Cursor animat Windows</comment>
+ <comment xml:lang="ru">анимированный курсор Windows</comment>
+ <comment xml:lang="sk">Animovaný kurzor Windows</comment>
+ <comment xml:lang="sl">Datoteka animirane kazalke Windows</comment>
+ <comment xml:lang="sq">Kursor i animuar Windows</comment>
+ <comment xml:lang="sv">Animerad Windows-muspekare</comment>
+ <comment xml:lang="uk">анімований курсор Windows</comment>
+ <comment xml:lang="vi">Con chạy hoạt họa Windows</comment>
+ <comment xml:lang="zh_CN">Windows 动画光标</comment>
+ <comment xml:lang="zh_TW">Windows 滑鼠動畫游標</comment>
+ <magic priority="50">
+ <match value="RIFF" type="string" offset="0">
+ <match value="ACON" type="string" offset="8"/>
+ </match>
+ </magic>
+ <glob pattern="*.ani"/>
+ </mime-type>
+ <mime-type type="image/x-emf">
+ <comment>EMF image</comment>
+ <comment xml:lang="ar">صورة EMF</comment>
+ <comment xml:lang="be@latin">Vyjava EMF</comment>
+ <comment xml:lang="bg">Изображение — EMF</comment>
+ <comment xml:lang="ca">imatge EMF</comment>
+ <comment xml:lang="cs">Obrázek EMF</comment>
+ <comment xml:lang="da">EMF-billede</comment>
+ <comment xml:lang="de">EMF-Bild</comment>
+ <comment xml:lang="eo">EMF-bildo</comment>
+ <comment xml:lang="es">imagen EMF</comment>
+ <comment xml:lang="eu">EMF irudia</comment>
+ <comment xml:lang="fi">EMF-kuva</comment>
+ <comment xml:lang="fo">EMF mynd</comment>
+ <comment xml:lang="fr">image EMF</comment>
+ <comment xml:lang="ga">íomhá EMF</comment>
+ <comment xml:lang="gl">imaxe EMF</comment>
+ <comment xml:lang="he">תמונת EMF</comment>
+ <comment xml:lang="hu">EMF kép</comment>
+ <comment xml:lang="id">Citra EMF</comment>
+ <comment xml:lang="it">Immagine EMF</comment>
+ <comment xml:lang="ja">EMF 画像</comment>
+ <comment xml:lang="kk">EMF суреті</comment>
+ <comment xml:lang="ko">EMF 그림</comment>
+ <comment xml:lang="lt">EMF paveikslėlis</comment>
+ <comment xml:lang="lv">EMF attēls</comment>
+ <comment xml:lang="nb">EMF-bilde</comment>
+ <comment xml:lang="nl">EMF-afbeelding</comment>
+ <comment xml:lang="nn">EMF-bilete</comment>
+ <comment xml:lang="pl">Obraz EMF</comment>
+ <comment xml:lang="pt_BR">Imagem EMF</comment>
+ <comment xml:lang="ro">Imagine EMF</comment>
+ <comment xml:lang="ru">изображение EMF</comment>
+ <comment xml:lang="sk">Obrázok EMF</comment>
+ <comment xml:lang="sl">Slikovna datoteka EMF</comment>
+ <comment xml:lang="sq">Figurë EMF</comment>
+ <comment xml:lang="sv">EMF-bild</comment>
+ <comment xml:lang="uk">зображення EMF</comment>
+ <comment xml:lang="vi">Ảnh EMF</comment>
+ <comment xml:lang="zh_CN">EMF 图像</comment>
+ <comment xml:lang="zh_TW">EMF 影像</comment>
+ <acronym>EMF</acronym>
+ <expanded-acronym>Enhanced MetaFile</expanded-acronym>
+ <glob pattern="*.emf"/>
+ <magic priority="50">
+ <match value="0x00000001" type="little32" offset="0">
+ <match value="0x464D4520" type="little32" offset="40">
+ <match value="0x00010000" type="little32" offset="44">
+ <match value="0x0000" type="little16" offset="58"/>
+ </match>
+ </match>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-wmf">
+ <comment>WMF image</comment>
+ <comment xml:lang="ar">صورة WMF</comment>
+ <comment xml:lang="be@latin">Vyjava WMF</comment>
+ <comment xml:lang="bg">Изображение — WMF</comment>
+ <comment xml:lang="ca">imatge WMF</comment>
+ <comment xml:lang="cs">Obrázek WMF</comment>
+ <comment xml:lang="da">WMF-billede</comment>
+ <comment xml:lang="de">WMF-Bild</comment>
+ <comment xml:lang="eo">WMF-bildo</comment>
+ <comment xml:lang="es">imagen WMF</comment>
+ <comment xml:lang="eu">WMF irudia</comment>
+ <comment xml:lang="fi">WMF-kuva</comment>
+ <comment xml:lang="fo">WMF mynd</comment>
+ <comment xml:lang="fr">image WMF</comment>
+ <comment xml:lang="ga">íomhá WMF</comment>
+ <comment xml:lang="gl">imaxe WMF</comment>
+ <comment xml:lang="he">תמונת WMF</comment>
+ <comment xml:lang="hu">WMF kép</comment>
+ <comment xml:lang="id">Citra WMF</comment>
+ <comment xml:lang="it">Immagine WMF</comment>
+ <comment xml:lang="ja">WMF 画像</comment>
+ <comment xml:lang="kk">WMF суреті</comment>
+ <comment xml:lang="ko">WMF 그림</comment>
+ <comment xml:lang="lt">WMF paveikslėlis</comment>
+ <comment xml:lang="lv">WMF attēls</comment>
+ <comment xml:lang="nb">WMF-bilde</comment>
+ <comment xml:lang="nl">WMF-afbeelding</comment>
+ <comment xml:lang="nn">WMF-bilete</comment>
+ <comment xml:lang="pl">Obraz WMF</comment>
+ <comment xml:lang="pt_BR">Imagem WMF</comment>
+ <comment xml:lang="ro">Imagine WMF</comment>
+ <comment xml:lang="ru">изображение WMF</comment>
+ <comment xml:lang="sk">Obrázok WMF</comment>
+ <comment xml:lang="sl">Slikovna datoteka WMF</comment>
+ <comment xml:lang="sq">Figurë WMF</comment>
+ <comment xml:lang="sv">WMF-bild</comment>
+ <comment xml:lang="uk">зображення WMF</comment>
+ <comment xml:lang="vi">Ảnh WMF</comment>
+ <comment xml:lang="zh_CN">WMF 图像</comment>
+ <comment xml:lang="zh_TW">WMF 影像</comment>
+ <acronym>WMF</acronym>
+ <expanded-acronym>Windows Metafile</expanded-acronym>
+ <magic priority="50">
+
+ <match value="0x9AC6CDD7" type="little32" offset="0">
+
+ <match value="0x0001" type="little16" offset="22">
+ <match value="0x0009" type="little16" offset="24"/>
+ </match>
+ </match>
+
+ <match value="0x0001" type="little16" offset="0">
+ <match value="0x0009" type="little16" offset="2"/>
+ </match>
+ </magic>
+ <glob pattern="*.wmf"/>
+ </mime-type>
+ <mime-type type="image/x-xbitmap">
+ <comment>XBM image</comment>
+ <comment xml:lang="ar">صورة XBM</comment>
+ <comment xml:lang="be@latin">Vyjava XBM</comment>
+ <comment xml:lang="bg">Изображение — XBM</comment>
+ <comment xml:lang="ca">imatge XBM</comment>
+ <comment xml:lang="cs">Obrázek XBM</comment>
+ <comment xml:lang="da">XBM-billede</comment>
+ <comment xml:lang="de">XBM-Bild</comment>
+ <comment xml:lang="en_GB">XBM image</comment>
+ <comment xml:lang="eo">XBM-bildo</comment>
+ <comment xml:lang="es">imagen XBM</comment>
+ <comment xml:lang="eu">XBM irudia</comment>
+ <comment xml:lang="fi">XBM-kuva</comment>
+ <comment xml:lang="fo">XBM mynd</comment>
+ <comment xml:lang="fr">image XBM</comment>
+ <comment xml:lang="ga">íomhá XBM</comment>
+ <comment xml:lang="gl">imaxe XBM</comment>
+ <comment xml:lang="he">תמונת XBM</comment>
+ <comment xml:lang="hu">XBM-kép</comment>
+ <comment xml:lang="id">Citra XBM</comment>
+ <comment xml:lang="it">Immagine XBM</comment>
+ <comment xml:lang="ja">XBM 画像</comment>
+ <comment xml:lang="kk">XBM суреті</comment>
+ <comment xml:lang="ko">XBM 그림</comment>
+ <comment xml:lang="lt">XBM paveikslėlis</comment>
+ <comment xml:lang="lv">XBM attēls</comment>
+ <comment xml:lang="nb">XBM-bilde</comment>
+ <comment xml:lang="nl">XBM-afbeelding</comment>
+ <comment xml:lang="nn">XBM-bilete</comment>
+ <comment xml:lang="pl">Obraz XBM</comment>
+ <comment xml:lang="pt_BR">Imagem XBM</comment>
+ <comment xml:lang="ro">Imagine XBM</comment>
+ <comment xml:lang="ru">изображение XBM</comment>
+ <comment xml:lang="sk">Obrázok XBM</comment>
+ <comment xml:lang="sl">Slikovna datoteka XBM</comment>
+ <comment xml:lang="sq">Figurë XBM</comment>
+ <comment xml:lang="sv">XBM-bild</comment>
+ <comment xml:lang="uk">зображення XBM</comment>
+ <comment xml:lang="vi">Ảnh XBM</comment>
+ <comment xml:lang="zh_CN">XBM 图像</comment>
+ <comment xml:lang="zh_TW">XBM 影像</comment>
+ <acronym>XBM</acronym>
+ <expanded-acronym>X BitMap</expanded-acronym>
+ <glob pattern="*.xbm"/>
+ </mime-type>
+ <mime-type type="image/x-xcf">
+ <comment>GIMP image</comment>
+ <comment xml:lang="ar">صورة GIMP</comment>
+ <comment xml:lang="be@latin">Vyjava GIMP</comment>
+ <comment xml:lang="bg">Изображение — GIMP</comment>
+ <comment xml:lang="ca">imatge del GIMP</comment>
+ <comment xml:lang="cs">Obrázek GIMP</comment>
+ <comment xml:lang="da">GIMP-billede</comment>
+ <comment xml:lang="de">GIMP-Bild</comment>
+ <comment xml:lang="el">εικόνα GIMP</comment>
+ <comment xml:lang="en_GB">GIMP image</comment>
+ <comment xml:lang="eo">GIMP-bildo</comment>
+ <comment xml:lang="es">imagen del GIMP</comment>
+ <comment xml:lang="eu">GIMP irudia</comment>
+ <comment xml:lang="fi">GIMP-kuva</comment>
+ <comment xml:lang="fo">GIMP mynd</comment>
+ <comment xml:lang="fr">image GIMP</comment>
+ <comment xml:lang="ga">íomhá GIMP</comment>
+ <comment xml:lang="gl">imaxe de GIMP</comment>
+ <comment xml:lang="he">תמונת GIMP</comment>
+ <comment xml:lang="hu">GIMP-kép</comment>
+ <comment xml:lang="id">Citra GIMP</comment>
+ <comment xml:lang="it">Immagine GIMP</comment>
+ <comment xml:lang="ja">GIMP 画像</comment>
+ <comment xml:lang="kk">GIMP суреті</comment>
+ <comment xml:lang="ko">GIMP 그림</comment>
+ <comment xml:lang="lt">GIMP paveikslėlis</comment>
+ <comment xml:lang="lv">GIMP attēls</comment>
+ <comment xml:lang="ms">Imej GIMP</comment>
+ <comment xml:lang="nb">GIMP-bilde</comment>
+ <comment xml:lang="nl">GIMP-afbeelding</comment>
+ <comment xml:lang="nn">GIMP-bilete</comment>
+ <comment xml:lang="pl">Obraz GIMP</comment>
+ <comment xml:lang="pt">imagem do GIMP</comment>
+ <comment xml:lang="pt_BR">Imagem do GIMP</comment>
+ <comment xml:lang="ro">Imagine GIMP</comment>
+ <comment xml:lang="ru">изображение GIMP</comment>
+ <comment xml:lang="sk">Obrázok GIMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka GIMP</comment>
+ <comment xml:lang="sq">Figurë GIMP</comment>
+ <comment xml:lang="sr">Гимп слика</comment>
+ <comment xml:lang="sv">GIMP-bild</comment>
+ <comment xml:lang="uk">зображення GIMP</comment>
+ <comment xml:lang="vi">Ảnh GIMP</comment>
+ <comment xml:lang="zh_CN">GIMP 图像</comment>
+ <comment xml:lang="zh_TW">GIMP 影像</comment>
+ <glob pattern="*.xcf"/>
+ <magic priority="50">
+ <match value="gimp xcf file" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-xfig">
+ <comment>XFig image</comment>
+ <comment xml:lang="ar">صورة XFig</comment>
+ <comment xml:lang="be@latin">Vyjava XFig</comment>
+ <comment xml:lang="bg">Изображение — XFig</comment>
+ <comment xml:lang="ca">imatge de XFig</comment>
+ <comment xml:lang="cs">Obrázek XFig</comment>
+ <comment xml:lang="da">XFig-billede</comment>
+ <comment xml:lang="de">XFig-Bild</comment>
+ <comment xml:lang="el">εικόνα XFig</comment>
+ <comment xml:lang="en_GB">XFig image</comment>
+ <comment xml:lang="eo">XFig-bildo</comment>
+ <comment xml:lang="es">imagen de XFig</comment>
+ <comment xml:lang="eu">XFig irudia</comment>
+ <comment xml:lang="fi">XFig-kuva</comment>
+ <comment xml:lang="fo">XFig mynd</comment>
+ <comment xml:lang="fr">image XFig</comment>
+ <comment xml:lang="ga">íomhá XFig</comment>
+ <comment xml:lang="gl">imaxe de XFig</comment>
+ <comment xml:lang="he">תמונת XFig</comment>
+ <comment xml:lang="hu">XFig-kép</comment>
+ <comment xml:lang="id">Citra XFig</comment>
+ <comment xml:lang="it">Immagine XFig</comment>
+ <comment xml:lang="ja">XFig 画像</comment>
+ <comment xml:lang="kk">XFig суреті</comment>
+ <comment xml:lang="ko">XFig 그림</comment>
+ <comment xml:lang="lt">XFig paveikslėlis</comment>
+ <comment xml:lang="lv">XFig attēls</comment>
+ <comment xml:lang="ms">Imej XFig</comment>
+ <comment xml:lang="nb">XFig-bilde</comment>
+ <comment xml:lang="nl">XFig-afbeelding</comment>
+ <comment xml:lang="nn">XFig-bilete</comment>
+ <comment xml:lang="pl">Obraz XFig</comment>
+ <comment xml:lang="pt">imagem XFig</comment>
+ <comment xml:lang="pt_BR">Imagem do XFig</comment>
+ <comment xml:lang="ro">Imagine XFig</comment>
+ <comment xml:lang="ru">изображение XFig</comment>
+ <comment xml:lang="sk">Obrázok XFig</comment>
+ <comment xml:lang="sl">Slikovna datoteka XFig</comment>
+ <comment xml:lang="sq">Figurë XFig</comment>
+ <comment xml:lang="sr">XFig слика</comment>
+ <comment xml:lang="sv">XFig-bild</comment>
+ <comment xml:lang="uk">зображення XFig</comment>
+ <comment xml:lang="vi">Ảnh XFig</comment>
+ <comment xml:lang="zh_CN">XFig 图像</comment>
+ <comment xml:lang="zh_TW">XFig 影像</comment>
+ <glob pattern="*.fig"/>
+ <magic priority="50">
+ <match value="#FIG" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="image/x-xpixmap">
+ <comment>XPM image</comment>
+ <comment xml:lang="ar">صورة XPM</comment>
+ <comment xml:lang="be@latin">Vyjava XPM</comment>
+ <comment xml:lang="bg">Изображение — XPM</comment>
+ <comment xml:lang="ca">imatge XPM</comment>
+ <comment xml:lang="cs">Obrázek XPM</comment>
+ <comment xml:lang="cy">Delwedd XPM</comment>
+ <comment xml:lang="da">XPM-billede</comment>
+ <comment xml:lang="de">XPM-Bild</comment>
+ <comment xml:lang="en_GB">XPM image</comment>
+ <comment xml:lang="eo">XPM-bildo</comment>
+ <comment xml:lang="es">imagen XPM</comment>
+ <comment xml:lang="eu">XPM irudia</comment>
+ <comment xml:lang="fi">XPM-kuva</comment>
+ <comment xml:lang="fo">XPM mynd</comment>
+ <comment xml:lang="fr">image XPM</comment>
+ <comment xml:lang="ga">íomhá XPM</comment>
+ <comment xml:lang="gl">imaxe XPM</comment>
+ <comment xml:lang="he">תמונת XPM</comment>
+ <comment xml:lang="hu">XPM kép</comment>
+ <comment xml:lang="id">Citra XPM</comment>
+ <comment xml:lang="it">Immagine XPM</comment>
+ <comment xml:lang="ja">XPM 画像</comment>
+ <comment xml:lang="kk">XPM суреті</comment>
+ <comment xml:lang="ko">XPM 그림</comment>
+ <comment xml:lang="lt">XPM paveikslėlis</comment>
+ <comment xml:lang="lv">XPM attēls</comment>
+ <comment xml:lang="nb">XPM-bilde</comment>
+ <comment xml:lang="nl">XPM-afbeelding</comment>
+ <comment xml:lang="nn">XPM-bilete</comment>
+ <comment xml:lang="pl">Obraz XPM</comment>
+ <comment xml:lang="pt_BR">Iimagem XPM</comment>
+ <comment xml:lang="ro">Imagine XPM</comment>
+ <comment xml:lang="ru">изображение XPM</comment>
+ <comment xml:lang="sk">Obrázok XPM</comment>
+ <comment xml:lang="sl">Slikovna datoteka XPM</comment>
+ <comment xml:lang="sq">Figurë XPM</comment>
+ <comment xml:lang="sv">XPM-bild</comment>
+ <comment xml:lang="uk">зображення XPM</comment>
+ <comment xml:lang="vi">Ảnh XPM</comment>
+ <comment xml:lang="zh_CN">XPM 图像</comment>
+ <comment xml:lang="zh_TW">XPM 影像</comment>
+ <acronym>XPM</acronym>
+ <expanded-acronym>X PixMap</expanded-acronym>
+ <magic priority="50">
+ <match value="/* XPM" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.xpm"/>
+ </mime-type>
+ <mime-type type="image/x-xwindowdump">
+ <comment>X window image</comment>
+ <comment xml:lang="ar">صورة X window</comment>
+ <comment xml:lang="az">X window rəsmi</comment>
+ <comment xml:lang="be@latin">Vyjava vakna X</comment>
+ <comment xml:lang="bg">Изображение — X Window</comment>
+ <comment xml:lang="ca">imatge de X window</comment>
+ <comment xml:lang="cs">Obrázek X window</comment>
+ <comment xml:lang="cy">Delwedd ffenest X</comment>
+ <comment xml:lang="da">X-billede</comment>
+ <comment xml:lang="de">X-Window-Bild</comment>
+ <comment xml:lang="el">εικόνα περιβάλλοντος X</comment>
+ <comment xml:lang="en_GB">X window image</comment>
+ <comment xml:lang="eo">bildo de X window</comment>
+ <comment xml:lang="es">imagen de X window</comment>
+ <comment xml:lang="eu">X window irudia</comment>
+ <comment xml:lang="fi">X-ikkunakuva</comment>
+ <comment xml:lang="fo">X vindeyga mynd</comment>
+ <comment xml:lang="fr">image X window</comment>
+ <comment xml:lang="ga">íomhá fhuinneog X</comment>
+ <comment xml:lang="gl">imaxe de X Window</comment>
+ <comment xml:lang="he">תמונת חלון של X</comment>
+ <comment xml:lang="hu">X window-kép</comment>
+ <comment xml:lang="id">Citra X window</comment>
+ <comment xml:lang="it">Immagine X window</comment>
+ <comment xml:lang="ja">X window 画像</comment>
+ <comment xml:lang="kk">X window суреті</comment>
+ <comment xml:lang="ko">X 윈도우 그림</comment>
+ <comment xml:lang="lt">X window paveikslėlis</comment>
+ <comment xml:lang="lv">X window attēls</comment>
+ <comment xml:lang="ms">Imej tetingkap X</comment>
+ <comment xml:lang="nb">X-Windows skjermbilde</comment>
+ <comment xml:lang="nl">X-window-afbeelding</comment>
+ <comment xml:lang="nn">X window bilete</comment>
+ <comment xml:lang="pl">Obraz X Window</comment>
+ <comment xml:lang="pt">imagem de janela X</comment>
+ <comment xml:lang="pt_BR">Imagem de janela do X</comment>
+ <comment xml:lang="ro">Imagine X window</comment>
+ <comment xml:lang="ru">изображение X window</comment>
+ <comment xml:lang="sk">Obrázok X window</comment>
+ <comment xml:lang="sl">slika X oken</comment>
+ <comment xml:lang="sq">Figurë X window</comment>
+ <comment xml:lang="sr">X прозор слика</comment>
+ <comment xml:lang="sv">X-fönsterbild</comment>
+ <comment xml:lang="uk">зображення X window</comment>
+ <comment xml:lang="vi">Ảnh cửa sổ X</comment>
+ <comment xml:lang="zh_CN">X window 图像</comment>
+ <comment xml:lang="zh_TW">X window 影像</comment>
+ <glob pattern="*.xwd"/>
+ </mime-type>
+ <mime-type type="inode/blockdevice">
+ <comment>block device</comment>
+ <comment xml:lang="ar">جهاز كتلي</comment>
+ <comment xml:lang="be@latin">blokavaja pryłada</comment>
+ <comment xml:lang="bg">Блоково устройство</comment>
+ <comment xml:lang="ca">dispositiu de blocs</comment>
+ <comment xml:lang="cs">Blokové zařízení</comment>
+ <comment xml:lang="da">blokenhed</comment>
+ <comment xml:lang="de">Blockorientiertes Gerät</comment>
+ <comment xml:lang="el">συσκευή block</comment>
+ <comment xml:lang="en_GB">block device</comment>
+ <comment xml:lang="eo">bloka disponaĵo</comment>
+ <comment xml:lang="es">dispositivo de bloques</comment>
+ <comment xml:lang="eu">bloke-gailua</comment>
+ <comment xml:lang="fi">laitetiedosto</comment>
+ <comment xml:lang="fo">blokka tóleind</comment>
+ <comment xml:lang="fr">périphérique de blocs</comment>
+ <comment xml:lang="ga">gléas bloc</comment>
+ <comment xml:lang="gl">dispositivo de bloque</comment>
+ <comment xml:lang="he">התקן בלוק</comment>
+ <comment xml:lang="hu">blokkos eszköz</comment>
+ <comment xml:lang="id">blok divais</comment>
+ <comment xml:lang="it">Device a blocchi</comment>
+ <comment xml:lang="ja">ブロックデバイス</comment>
+ <comment xml:lang="kk">блоктық құрылғысы</comment>
+ <comment xml:lang="ko">블럭 장치</comment>
+ <comment xml:lang="lt">blokinis įrenginys</comment>
+ <comment xml:lang="lv">bloka ierīce</comment>
+ <comment xml:lang="ms">Peranti blok</comment>
+ <comment xml:lang="nb">blokkenhet</comment>
+ <comment xml:lang="nl">blok-apparaat</comment>
+ <comment xml:lang="nn">blokk-eining</comment>
+ <comment xml:lang="pl">Urządzenie blokowe</comment>
+ <comment xml:lang="pt">dispositivo de bloco</comment>
+ <comment xml:lang="pt_BR">Dispositivo de bloco</comment>
+ <comment xml:lang="ro">dispozitiv bloc</comment>
+ <comment xml:lang="ru">блочное устройство</comment>
+ <comment xml:lang="sk">Blokové zariadenie</comment>
+ <comment xml:lang="sl">bločna naprava</comment>
+ <comment xml:lang="sq">device me blloqe</comment>
+ <comment xml:lang="sr">блок уређај</comment>
+ <comment xml:lang="sv">blockenhet</comment>
+ <comment xml:lang="uk">блоковий пристрій</comment>
+ <comment xml:lang="vi">thiết bị khối</comment>
+ <comment xml:lang="zh_CN">块设备</comment>
+ <comment xml:lang="zh_TW">區塊裝置</comment>
+ </mime-type>
+ <mime-type type="inode/chardevice">
+ <comment>character device</comment>
+ <comment xml:lang="ar">جهاز حرفي</comment>
+ <comment xml:lang="be@latin">znakavaja pryłada</comment>
+ <comment xml:lang="bg">Символно устройство</comment>
+ <comment xml:lang="ca">dispositiu de caràcters</comment>
+ <comment xml:lang="cs">Znakové zařízení</comment>
+ <comment xml:lang="da">tegnenhed</comment>
+ <comment xml:lang="de">Zeichenorientiertes Gerät</comment>
+ <comment xml:lang="el">συσκευή χαρακτήρων</comment>
+ <comment xml:lang="en_GB">character device</comment>
+ <comment xml:lang="eo">signa disponaĵo</comment>
+ <comment xml:lang="es">dispositivo de caracteres</comment>
+ <comment xml:lang="eu">karaktereen gailua</comment>
+ <comment xml:lang="fi">merkkilaite</comment>
+ <comment xml:lang="fo">stavatóleind</comment>
+ <comment xml:lang="fr">périphérique de caractères</comment>
+ <comment xml:lang="ga">gléas carachtar</comment>
+ <comment xml:lang="gl">dispositivo de caracter</comment>
+ <comment xml:lang="he">התקן תכונה</comment>
+ <comment xml:lang="hu">karakteres eszköz</comment>
+ <comment xml:lang="id">karakter divais</comment>
+ <comment xml:lang="it">Device a caratteri</comment>
+ <comment xml:lang="ja">キャラクタデバイス</comment>
+ <comment xml:lang="kk">символдық құрылғысы</comment>
+ <comment xml:lang="ko">문자 장치</comment>
+ <comment xml:lang="lt">simbolinis įrenginys</comment>
+ <comment xml:lang="lv">rakstzīmju ierīce</comment>
+ <comment xml:lang="ms">Peranti aksara</comment>
+ <comment xml:lang="nb">tegnenhet</comment>
+ <comment xml:lang="nl">byte-apparaat</comment>
+ <comment xml:lang="nn">teikneining</comment>
+ <comment xml:lang="pl">Urządzenie znakowe</comment>
+ <comment xml:lang="pt">dispositivo de caracteres</comment>
+ <comment xml:lang="pt_BR">dispositivo de caractere</comment>
+ <comment xml:lang="ro">dispozitiv caracter</comment>
+ <comment xml:lang="ru">символьное устройство</comment>
+ <comment xml:lang="sk">Znakové zariadenie</comment>
+ <comment xml:lang="sl">znakovna naprava</comment>
+ <comment xml:lang="sq">device me karaktere</comment>
+ <comment xml:lang="sr">знаковни уређај</comment>
+ <comment xml:lang="sv">teckenenhet</comment>
+ <comment xml:lang="uk">символьний пристрій</comment>
+ <comment xml:lang="vi">thiết bị ký tự</comment>
+ <comment xml:lang="zh_CN">字符设备</comment>
+ <comment xml:lang="zh_TW">字元裝置</comment>
+ </mime-type>
+ <mime-type type="inode/directory">
+ <comment>folder</comment>
+ <comment xml:lang="ar">مجلّد</comment>
+ <comment xml:lang="be@latin">kataloh</comment>
+ <comment xml:lang="bg">Папка</comment>
+ <comment xml:lang="ca">carpeta</comment>
+ <comment xml:lang="cs">Složka</comment>
+ <comment xml:lang="da">mappe</comment>
+ <comment xml:lang="de">Ordner</comment>
+ <comment xml:lang="el">φάκελος</comment>
+ <comment xml:lang="en_GB">folder</comment>
+ <comment xml:lang="eo">dosierujo</comment>
+ <comment xml:lang="es">carpeta</comment>
+ <comment xml:lang="eu">karpeta</comment>
+ <comment xml:lang="fi">kansio</comment>
+ <comment xml:lang="fo">mappa</comment>
+ <comment xml:lang="fr">dossier</comment>
+ <comment xml:lang="ga">fillteán</comment>
+ <comment xml:lang="gl">cartafol</comment>
+ <comment xml:lang="he">תיקייה</comment>
+ <comment xml:lang="hu">mappa</comment>
+ <comment xml:lang="id">folder</comment>
+ <comment xml:lang="it">Cartella</comment>
+ <comment xml:lang="ja">フォルダー</comment>
+ <comment xml:lang="kk">бума</comment>
+ <comment xml:lang="ko">폴더</comment>
+ <comment xml:lang="lt">aplankas</comment>
+ <comment xml:lang="lv">mape</comment>
+ <comment xml:lang="ms">Folder</comment>
+ <comment xml:lang="nb">mappe</comment>
+ <comment xml:lang="nl">map</comment>
+ <comment xml:lang="nn">mappe</comment>
+ <comment xml:lang="pl">Katalog</comment>
+ <comment xml:lang="pt">pasta</comment>
+ <comment xml:lang="pt_BR">pasta</comment>
+ <comment xml:lang="ro">dosar</comment>
+ <comment xml:lang="ru">папка</comment>
+ <comment xml:lang="sk">Priečinok</comment>
+ <comment xml:lang="sl">mapa</comment>
+ <comment xml:lang="sq">Kartelë</comment>
+ <comment xml:lang="sr">директоријум</comment>
+ <comment xml:lang="sv">mapp</comment>
+ <comment xml:lang="uk">тека</comment>
+ <comment xml:lang="vi">thư mục</comment>
+ <comment xml:lang="zh_CN">文件夹</comment>
+ <comment xml:lang="zh_TW">資料夾</comment>
+ <alias type="x-directory/normal"/>
+ </mime-type>
+ <mime-type type="inode/fifo">
+ <comment>pipe</comment>
+ <comment xml:lang="ar">إنبوب</comment>
+ <comment xml:lang="be@latin">kanvejer</comment>
+ <comment xml:lang="bg">Конвейер</comment>
+ <comment xml:lang="ca">conducte</comment>
+ <comment xml:lang="cs">Roura</comment>
+ <comment xml:lang="da">datakanal</comment>
+ <comment xml:lang="de">Pipe</comment>
+ <comment xml:lang="el">σωλήνωση</comment>
+ <comment xml:lang="en_GB">pipe</comment>
+ <comment xml:lang="eo">dukto</comment>
+ <comment xml:lang="es">tubería</comment>
+ <comment xml:lang="eu">kanalizazioa</comment>
+ <comment xml:lang="fi">putki</comment>
+ <comment xml:lang="fo">rør</comment>
+ <comment xml:lang="fr">tube</comment>
+ <comment xml:lang="ga">píopa</comment>
+ <comment xml:lang="gl">tubería</comment>
+ <comment xml:lang="he">צינור</comment>
+ <comment xml:lang="hu">adatcsatorna</comment>
+ <comment xml:lang="id">pipa</comment>
+ <comment xml:lang="it">Pipe</comment>
+ <comment xml:lang="ja">パイプ</comment>
+ <comment xml:lang="kk">арна</comment>
+ <comment xml:lang="ko">파이프</comment>
+ <comment xml:lang="lt">konvejeris</comment>
+ <comment xml:lang="lv">programmkanāls</comment>
+ <comment xml:lang="ms">Paip</comment>
+ <comment xml:lang="nb">rør</comment>
+ <comment xml:lang="nl">pijp</comment>
+ <comment xml:lang="nn">røyr</comment>
+ <comment xml:lang="pl">Potok</comment>
+ <comment xml:lang="pt">canal</comment>
+ <comment xml:lang="pt_BR">pipe</comment>
+ <comment xml:lang="ro">canal pipe</comment>
+ <comment xml:lang="ru">канал</comment>
+ <comment xml:lang="sk">Rúra</comment>
+ <comment xml:lang="sl">cev</comment>
+ <comment xml:lang="sq">Pipe</comment>
+ <comment xml:lang="sr">цев</comment>
+ <comment xml:lang="sv">rör</comment>
+ <comment xml:lang="uk">канал</comment>
+ <comment xml:lang="vi">ống dẫn</comment>
+ <comment xml:lang="zh_CN">管道</comment>
+ <comment xml:lang="zh_TW">管線</comment>
+ </mime-type>
+ <mime-type type="inode/mount-point">
+ <comment>mount point</comment>
+ <comment xml:lang="ar">نقطة الوصْل</comment>
+ <comment xml:lang="be@latin">punkt mantavańnia</comment>
+ <comment xml:lang="bg">Точка на монтиране</comment>
+ <comment xml:lang="ca">punt de muntatge</comment>
+ <comment xml:lang="cs">Místo připojení</comment>
+ <comment xml:lang="da">monteringspunkt</comment>
+ <comment xml:lang="de">Einhängepunkt</comment>
+ <comment xml:lang="el">σημείο προσάρτησης</comment>
+ <comment xml:lang="en_GB">mount point</comment>
+ <comment xml:lang="eo">surmetingo</comment>
+ <comment xml:lang="es">punto de montaje</comment>
+ <comment xml:lang="eu">muntatze-puntua</comment>
+ <comment xml:lang="fi">liitospiste</comment>
+ <comment xml:lang="fo">ísetingarpunkt</comment>
+ <comment xml:lang="fr">point d'accès</comment>
+ <comment xml:lang="ga">pointe feistithe</comment>
+ <comment xml:lang="gl">punto de montaxe</comment>
+ <comment xml:lang="he">נקודת עיגון</comment>
+ <comment xml:lang="hu">csatolási pont</comment>
+ <comment xml:lang="id">titik mount</comment>
+ <comment xml:lang="it">Punto di mount</comment>
+ <comment xml:lang="ja">マウントポイント</comment>
+ <comment xml:lang="kk">тіркеу нүктесі</comment>
+ <comment xml:lang="ko">마운트 위치</comment>
+ <comment xml:lang="lt">prijungimo taškas</comment>
+ <comment xml:lang="lv">montēšanas punkts</comment>
+ <comment xml:lang="ms">Titik lekapan</comment>
+ <comment xml:lang="nb">monteringspunkt</comment>
+ <comment xml:lang="nl">aankoppelingspunt</comment>
+ <comment xml:lang="nn">monteringspunkt</comment>
+ <comment xml:lang="pl">Punkt montowania</comment>
+ <comment xml:lang="pt">ponto de montagem</comment>
+ <comment xml:lang="pt_BR">ponto de montagem</comment>
+ <comment xml:lang="ro">loc montare</comment>
+ <comment xml:lang="ru">точка монтирования</comment>
+ <comment xml:lang="sk">Miesto pripojenia</comment>
+ <comment xml:lang="sl">priklopna točka</comment>
+ <comment xml:lang="sq">Pikë montimi</comment>
+ <comment xml:lang="sr">тачка прикључења</comment>
+ <comment xml:lang="sv">monteringspunkt</comment>
+ <comment xml:lang="uk">точка монтування</comment>
+ <comment xml:lang="vi">điểm lắp</comment>
+ <comment xml:lang="zh_CN">挂载点</comment>
+ <comment xml:lang="zh_TW">掛載點</comment>
+ <sub-class-of type="inode/directory"/>
+ </mime-type>
+ <mime-type type="inode/socket">
+ <comment>socket</comment>
+ <comment xml:lang="ar">مقبس</comment>
+ <comment xml:lang="be@latin">sokiet</comment>
+ <comment xml:lang="bg">Гнездо</comment>
+ <comment xml:lang="ca">sòcol</comment>
+ <comment xml:lang="cs">Socket</comment>
+ <comment xml:lang="da">sokkel</comment>
+ <comment xml:lang="de">Socket</comment>
+ <comment xml:lang="el">υποδοχή</comment>
+ <comment xml:lang="en_GB">socket</comment>
+ <comment xml:lang="eo">kontaktoskatolo</comment>
+ <comment xml:lang="es">socket</comment>
+ <comment xml:lang="eu">socketa</comment>
+ <comment xml:lang="fi">pistoke</comment>
+ <comment xml:lang="fo">sokkul</comment>
+ <comment xml:lang="fr">connecteur réseau</comment>
+ <comment xml:lang="ga">soicéad</comment>
+ <comment xml:lang="gl">socket</comment>
+ <comment xml:lang="he">נקודת חיבור</comment>
+ <comment xml:lang="hu">illesztőpont</comment>
+ <comment xml:lang="id">soket</comment>
+ <comment xml:lang="it">Socket</comment>
+ <comment xml:lang="ja">ソケット</comment>
+ <comment xml:lang="kk">сокет</comment>
+ <comment xml:lang="ko">소켓</comment>
+ <comment xml:lang="lt">lizdas</comment>
+ <comment xml:lang="lv">sokets</comment>
+ <comment xml:lang="ms">Soket</comment>
+ <comment xml:lang="nb">plugg</comment>
+ <comment xml:lang="nl">socket</comment>
+ <comment xml:lang="nn">sokkel</comment>
+ <comment xml:lang="pl">Gniazdo</comment>
+ <comment xml:lang="pt">'socket'</comment>
+ <comment xml:lang="pt_BR">socket</comment>
+ <comment xml:lang="ro">socket</comment>
+ <comment xml:lang="ru">сокет</comment>
+ <comment xml:lang="sk">Soket</comment>
+ <comment xml:lang="sl">vtič</comment>
+ <comment xml:lang="sq">Socket</comment>
+ <comment xml:lang="sr">сокет</comment>
+ <comment xml:lang="sv">uttag</comment>
+ <comment xml:lang="uk">сокет</comment>
+ <comment xml:lang="vi">ổ cắm</comment>
+ <comment xml:lang="zh_CN">套接字</comment>
+ <comment xml:lang="zh_TW">socket</comment>
+ </mime-type>
+ <mime-type type="inode/symlink">
+ <comment>symbolic link</comment>
+ <comment xml:lang="ar">وصلة رمزية</comment>
+ <comment xml:lang="az">simvolik körpü</comment>
+ <comment xml:lang="be@latin">symbalnaja spasyłka</comment>
+ <comment xml:lang="bg">Символна връзка</comment>
+ <comment xml:lang="ca">enllaç simbòlic</comment>
+ <comment xml:lang="cs">Symbolický odkaz</comment>
+ <comment xml:lang="cy">cyswllt symbolaidd</comment>
+ <comment xml:lang="da">symbolsk henvisning</comment>
+ <comment xml:lang="de">Symbolische Verknüpfung</comment>
+ <comment xml:lang="el">συμβολικός σύνδεσμος</comment>
+ <comment xml:lang="en_GB">symbolic link</comment>
+ <comment xml:lang="eo">simbola ligilo</comment>
+ <comment xml:lang="es">enlace simbólico</comment>
+ <comment xml:lang="eu">esteka sinbolikoa</comment>
+ <comment xml:lang="fi">symbolinen linkki</comment>
+ <comment xml:lang="fo">tykislig leinkja</comment>
+ <comment xml:lang="fr">lien symbolique</comment>
+ <comment xml:lang="ga">nasc siombalach</comment>
+ <comment xml:lang="gl">ligazón simbólica</comment>
+ <comment xml:lang="he">קישור סימבולי</comment>
+ <comment xml:lang="hu">szimbolikus link</comment>
+ <comment xml:lang="id">taut simbolik</comment>
+ <comment xml:lang="it">Collegamento simbolico</comment>
+ <comment xml:lang="ja">シンボリックリンク</comment>
+ <comment xml:lang="kk">символдық сілтеме</comment>
+ <comment xml:lang="ko">심볼릭 링크</comment>
+ <comment xml:lang="lt">simbolinė nuoroda</comment>
+ <comment xml:lang="lv">simboliskā saite</comment>
+ <comment xml:lang="ms">Pautan simbolik</comment>
+ <comment xml:lang="nb">symbolsk lenke</comment>
+ <comment xml:lang="nl">symbolische koppeling</comment>
+ <comment xml:lang="nn">symbolsk lenkje</comment>
+ <comment xml:lang="pl">Dowiązanie symboliczne</comment>
+ <comment xml:lang="pt">ligação simbólica</comment>
+ <comment xml:lang="pt_BR">ligação simbólica</comment>
+ <comment xml:lang="ro">legătură simbolică</comment>
+ <comment xml:lang="ru">символьная ссылка</comment>
+ <comment xml:lang="sk">Symbolický odkaz</comment>
+ <comment xml:lang="sl">simbolna povezava</comment>
+ <comment xml:lang="sq">Lidhje simbolike</comment>
+ <comment xml:lang="sr">симболичка веза</comment>
+ <comment xml:lang="sv">symbolisk länk</comment>
+ <comment xml:lang="uk">символічне посилання</comment>
+ <comment xml:lang="vi">liên kết tượng trưng</comment>
+ <comment xml:lang="zh_CN">符号链接</comment>
+ <comment xml:lang="zh_TW">符號鏈結</comment>
+ </mime-type>
+ <mime-type type="message/delivery-status">
+ <comment>mail delivery report</comment>
+ <comment xml:lang="ar">تقرير تسليم البريد</comment>
+ <comment xml:lang="az">poçt yollama raportu</comment>
+ <comment xml:lang="be@latin">rapart ab dastaŭcy pošty</comment>
+ <comment xml:lang="bg">Отчет за пристигналата поща</comment>
+ <comment xml:lang="ca">informe de lliurament de correu</comment>
+ <comment xml:lang="cs">Zpráva o doručení pošty</comment>
+ <comment xml:lang="cy">Adroddiad trosgludo post</comment>
+ <comment xml:lang="da">postleveringsrapport</comment>
+ <comment xml:lang="de">E-Mail-Zustellungsbericht</comment>
+ <comment xml:lang="el">αναφορά παράδοσης μηνύματος</comment>
+ <comment xml:lang="en_GB">mail delivery report</comment>
+ <comment xml:lang="eo">raporto pri transdono de retpoŝto</comment>
+ <comment xml:lang="es">informe de entrega de correo</comment>
+ <comment xml:lang="eu">posta banaketako txostena</comment>
+ <comment xml:lang="fi">viestin jakeluilmoitus</comment>
+ <comment xml:lang="fo">post útberingarfrásøgn</comment>
+ <comment xml:lang="fr">rapport de livraison de courriels</comment>
+ <comment xml:lang="ga">tuairisc sheachadadh poist</comment>
+ <comment xml:lang="gl">informe de entrega de correo</comment>
+ <comment xml:lang="he">דוח העברת דואר</comment>
+ <comment xml:lang="hu">jelentés levélkézbesítésről</comment>
+ <comment xml:lang="id">laporan pengantaran surat</comment>
+ <comment xml:lang="it">Rapporto di consegna posta</comment>
+ <comment xml:lang="ja">メール配送ポート</comment>
+ <comment xml:lang="kk">пошта жеткізілгені туралы отчет</comment>
+ <comment xml:lang="ko">메일 배달 보고서</comment>
+ <comment xml:lang="lt">pašto pristatymo ataskaita</comment>
+ <comment xml:lang="lv">pasta piegādes atskaite</comment>
+ <comment xml:lang="ms">Laporan penghantaran mel</comment>
+ <comment xml:lang="nb">e-postleveranserapport</comment>
+ <comment xml:lang="nl">e-mail-bezorgingsbericht</comment>
+ <comment xml:lang="nn">e-post-leveringsrapport</comment>
+ <comment xml:lang="pl">Raport z dostarczenia poczty</comment>
+ <comment xml:lang="pt">relatório de entrega de e-mail</comment>
+ <comment xml:lang="pt_BR">relatório de entrega de correspondência</comment>
+ <comment xml:lang="ro">raport de trimitere email</comment>
+ <comment xml:lang="ru">отчёт о доставке сообщения</comment>
+ <comment xml:lang="sk">Správa o doručení pošty</comment>
+ <comment xml:lang="sl">poročilo dostave pošte</comment>
+ <comment xml:lang="sq">Raport mbi dorëzimin e mesazhit</comment>
+ <comment xml:lang="sr">извештај доставе поруке</comment>
+ <comment xml:lang="sv">e-postleveransrapport</comment>
+ <comment xml:lang="uk">звіт про доставку пошти</comment>
+ <comment xml:lang="vi">thông báo phát thư</comment>
+ <comment xml:lang="zh_CN">邮件投递报告</comment>
+ <comment xml:lang="zh_TW">郵件寄送回報</comment>
+ <generic-icon name="text-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="message/disposition-notification">
+ <comment>mail disposition report</comment>
+ <comment xml:lang="ar">تقرير ترتيب البريد</comment>
+ <comment xml:lang="az">poçt qayıtma raportu</comment>
+ <comment xml:lang="be@latin">rapart ab raźmiaščeńni pošty</comment>
+ <comment xml:lang="bg">Отчет за състоянието на пощата</comment>
+ <comment xml:lang="ca">informe de disposició de correu</comment>
+ <comment xml:lang="cs">Zpráva o předání pošty</comment>
+ <comment xml:lang="cy">adroddiad ffurf post</comment>
+ <comment xml:lang="da">postdisponeringsrapport</comment>
+ <comment xml:lang="de">E-Mail-Übertragungsbericht</comment>
+ <comment xml:lang="el">αναφορά διάθεσης μηνύματος</comment>
+ <comment xml:lang="en_GB">mail disposition report</comment>
+ <comment xml:lang="eo">raporto pri dispono de retpoŝto</comment>
+ <comment xml:lang="es">informe de disposición de correo</comment>
+ <comment xml:lang="eu">posta joerako txostena</comment>
+ <comment xml:lang="fi">viestin kuittausilmoitus</comment>
+ <comment xml:lang="fo">post avhendingarfrásøgn</comment>
+ <comment xml:lang="fr">rapport de disposition de courriels</comment>
+ <comment xml:lang="ga">tuairisc chóiriú poist</comment>
+ <comment xml:lang="gl">informe de disposición de correo</comment>
+ <comment xml:lang="he">דוח אספקת דואר</comment>
+ <comment xml:lang="hu">jelentés levélkidobásról</comment>
+ <comment xml:lang="id">laporan disposisi surat</comment>
+ <comment xml:lang="it">Rapporto di disposizione posta</comment>
+ <comment xml:lang="ja">メール停止レポート</comment>
+ <comment xml:lang="kk">пошта жылжытылғаны туралы отчет</comment>
+ <comment xml:lang="ko">메일 처리 보고서</comment>
+ <comment xml:lang="lt">pašto charakteristikos ataskaita</comment>
+ <comment xml:lang="lv">pasta izvietojuma atskaite</comment>
+ <comment xml:lang="ms">Laporan pelupusan mel</comment>
+ <comment xml:lang="nb">e-postdispositionsrapport</comment>
+ <comment xml:lang="nl">e-mail-plaatsingsbericht</comment>
+ <comment xml:lang="nn">e-post-disposisjonsrapport</comment>
+ <comment xml:lang="pl">Raport z wysyłania poczty</comment>
+ <comment xml:lang="pt">relatório de disposição de e-mail</comment>
+ <comment xml:lang="pt_BR">relatório de disposição de correspondência</comment>
+ <comment xml:lang="ro">confirmare primire email</comment>
+ <comment xml:lang="ru">отчёт о перемещении почты</comment>
+ <comment xml:lang="sk">Správa o odovzdaní pošty</comment>
+ <comment xml:lang="sl">poročilo razporeditve pošte</comment>
+ <comment xml:lang="sq">Raport mbi njoftimin e mesazhit</comment>
+ <comment xml:lang="sr">извештај слања поруке</comment>
+ <comment xml:lang="sv">e-postdispositionsrapport</comment>
+ <comment xml:lang="uk">звіт про розташування пошти</comment>
+ <comment xml:lang="vi">thông báo chuyển nhượng thư</comment>
+ <comment xml:lang="zh_CN">邮件接收报告</comment>
+ <comment xml:lang="zh_TW">郵件處置回報</comment>
+ <generic-icon name="text-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="message/external-body">
+ <comment>reference to remote file</comment>
+ <comment xml:lang="ar">مرجع إلى ملف بعيد</comment>
+ <comment xml:lang="az">uzaq fayla göstəriş</comment>
+ <comment xml:lang="be@latin">spasyłka da addalenaha fajłu</comment>
+ <comment xml:lang="bg">Препратка към отдалечен файл</comment>
+ <comment xml:lang="ca">referència a fitxer remot</comment>
+ <comment xml:lang="cs">Odkaz na vzdálený soubor</comment>
+ <comment xml:lang="cy">cyfeiriad at ffeil bell</comment>
+ <comment xml:lang="da">reference til fjern fil</comment>
+ <comment xml:lang="de">Verweis auf entfernte Datei</comment>
+ <comment xml:lang="el">αναφορά σε απόμακρο αρχείο</comment>
+ <comment xml:lang="en_GB">reference to remote file</comment>
+ <comment xml:lang="eo">referenco al fora dosiero</comment>
+ <comment xml:lang="es">referencia a un archivo remoto</comment>
+ <comment xml:lang="eu">erreferentzia urruneko fitxategiari</comment>
+ <comment xml:lang="fi">viittaus etätiedostoon</comment>
+ <comment xml:lang="fo">tilvísing til fjarfílu</comment>
+ <comment xml:lang="fr">référence au fichier distant</comment>
+ <comment xml:lang="ga">tagairt do chomhad cianda</comment>
+ <comment xml:lang="gl">referencia a un ficheiro remoto</comment>
+ <comment xml:lang="he">התיחסות לקובץ מרוחק</comment>
+ <comment xml:lang="hu">hivatkozás távoli fájlra</comment>
+ <comment xml:lang="id">referensi ke berkas jarak jauh</comment>
+ <comment xml:lang="it">Riferimento a file remoto</comment>
+ <comment xml:lang="ja">リモートファイルへの参照</comment>
+ <comment xml:lang="kk">қашықтағы файлға сілтеме</comment>
+ <comment xml:lang="ko">원격 파일 참조</comment>
+ <comment xml:lang="lt">nuoroda į nutolusį failą</comment>
+ <comment xml:lang="lv">norāde uz attālinātu failu</comment>
+ <comment xml:lang="ms">Rujukan ke fail jauh</comment>
+ <comment xml:lang="nb">referanse til ekstern fil</comment>
+ <comment xml:lang="nl">verwijzing naar bestand op afstand</comment>
+ <comment xml:lang="nn">referanse til fil over nettverk</comment>
+ <comment xml:lang="pl">Odwołanie do pliku zdalnego</comment>
+ <comment xml:lang="pt">referência a um ficheiro remoto</comment>
+ <comment xml:lang="pt_BR">referência a um arquivo remoto</comment>
+ <comment xml:lang="ro">referință fișier la distanță</comment>
+ <comment xml:lang="ru">ссылка на удалённый файл</comment>
+ <comment xml:lang="sk">Odkaz na vzdialený súbor</comment>
+ <comment xml:lang="sl">sklic do oddaljene datoteke</comment>
+ <comment xml:lang="sq">Referim për tek file në distancë</comment>
+ <comment xml:lang="sr">референца на удаљену датотеку</comment>
+ <comment xml:lang="sv">referens till fjärrfil</comment>
+ <comment xml:lang="uk">посилання на віддалений файл</comment>
+ <comment xml:lang="vi">tham chiếu đến tập tin ở xa</comment>
+ <comment xml:lang="zh_CN">到远程文件的引用</comment>
+ <comment xml:lang="zh_TW">遠端檔案的參照</comment>
+ <generic-icon name="text-x-generic"/>
+ </mime-type>
+ <mime-type type="message/news">
+ <comment>Usenet news message</comment>
+ <comment xml:lang="ar">رسالة أخبار Usenet</comment>
+ <comment xml:lang="az">Usenet xəbərlər ismarışı</comment>
+ <comment xml:lang="be@latin">Navina Usenet</comment>
+ <comment xml:lang="bg">Съобщение — Usenet</comment>
+ <comment xml:lang="ca">missatge de notícies Usenet</comment>
+ <comment xml:lang="cs">Příspěvek do diskusních skupin Usenet</comment>
+ <comment xml:lang="cy">Neges newyddion Usenet</comment>
+ <comment xml:lang="da">Usenetnyhedsmeddelelse</comment>
+ <comment xml:lang="de">Usenet-News-Nachricht</comment>
+ <comment xml:lang="el">μήνυμα ομάδων συζητήσεων Usenet</comment>
+ <comment xml:lang="en_GB">Usenet news message</comment>
+ <comment xml:lang="eo">novaĵmesaĝo de Usenet</comment>
+ <comment xml:lang="es">mensaje de noticias de Usenet</comment>
+ <comment xml:lang="eu">Usenet berrien mezua</comment>
+ <comment xml:lang="fi">nyyssiviesti</comment>
+ <comment xml:lang="fo">Usenet news boð</comment>
+ <comment xml:lang="fr">message de groupe d'échange Usenet</comment>
+ <comment xml:lang="ga">teachtaireacht nuacht Usenet</comment>
+ <comment xml:lang="gl">mensaxes de noticias de Usenet</comment>
+ <comment xml:lang="he">הודעת חדשות של Usenet</comment>
+ <comment xml:lang="hu">USENET-hírcsoportüzenet</comment>
+ <comment xml:lang="id">Pesan berita Usenet</comment>
+ <comment xml:lang="it">Messaggio news Usenet</comment>
+ <comment xml:lang="ja">Usenet news メッセージ</comment>
+ <comment xml:lang="kk">Usenet жаңалық мәлімдемесі</comment>
+ <comment xml:lang="ko">유즈넷 뉴스 메시지</comment>
+ <comment xml:lang="lt">Usenet naujienų žinutė</comment>
+ <comment xml:lang="lv">Usenet jaunumu ziņojums</comment>
+ <comment xml:lang="ms">Mesej berita USENET</comment>
+ <comment xml:lang="nb">Usenet nyhetsmelding</comment>
+ <comment xml:lang="nl">Usenet-nieuwsbericht</comment>
+ <comment xml:lang="nn">USENET diskusjonsmelding</comment>
+ <comment xml:lang="pl">Wiadomość grupy dyskusyjnej</comment>
+ <comment xml:lang="pt">mensagem de notícias Usenet</comment>
+ <comment xml:lang="pt_BR">Mensagem de notícias da Usenet</comment>
+ <comment xml:lang="ro">Mesaj Usenet de știri </comment>
+ <comment xml:lang="ru">новостное сообщение Usenet</comment>
+ <comment xml:lang="sk">Príspevok do diskusných skupín Usenet</comment>
+ <comment xml:lang="sl">novičarsko sporočilo Usenet</comment>
+ <comment xml:lang="sq">Mesazh lajmesh Usenet</comment>
+ <comment xml:lang="sr">Порука са дискусионе групе</comment>
+ <comment xml:lang="sv">Usenet-diskussionsgruppsmeddelande</comment>
+ <comment xml:lang="uk">повідомлення новин Usenet</comment>
+ <comment xml:lang="vi">Thông điệp tin tức USENET</comment>
+ <comment xml:lang="zh_CN">Usenet 新闻信</comment>
+ <comment xml:lang="zh_TW">Usenet 新聞訊息</comment>
+ <generic-icon name="text-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="Article" type="string" offset="0"/>
+ <match value="Path:" type="string" offset="0"/>
+ <match value="Xref:" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="message/partial">
+ <comment>partial email message</comment>
+ <comment xml:lang="ar">رسالة البريد الإلكتروني الجزئية</comment>
+ <comment xml:lang="az">qismi poçt ismarışı</comment>
+ <comment xml:lang="be@latin">niapoŭny list email</comment>
+ <comment xml:lang="bg">Част от електронно писмо</comment>
+ <comment xml:lang="ca">missatge de correu electrònic parcial</comment>
+ <comment xml:lang="cs">Částečná e-mailová zpráva</comment>
+ <comment xml:lang="cy">darn o neges e-bost</comment>
+ <comment xml:lang="da">delvis postmeddelelse</comment>
+ <comment xml:lang="de">E-Mail-Nachrichtenfragment</comment>
+ <comment xml:lang="el">τμηματικό ηλ. μήνυμα</comment>
+ <comment xml:lang="en_GB">partial email message</comment>
+ <comment xml:lang="eo">parta retpoŝta mesaĝo</comment>
+ <comment xml:lang="es">mensaje de correo electrónico parcial</comment>
+ <comment xml:lang="eu">posta mezu partziala</comment>
+ <comment xml:lang="fi">osittainen sähköpostiviesti</comment>
+ <comment xml:lang="fr">message partiel de courriel</comment>
+ <comment xml:lang="ga">teachtaireacht ríomhphoist neamhiomlán</comment>
+ <comment xml:lang="gl">mensaxe de correo electrónico parcial</comment>
+ <comment xml:lang="he">מסר דוא"ל חלקי</comment>
+ <comment xml:lang="hu">részleges elektronikus levél</comment>
+ <comment xml:lang="id">pesan email sebagian</comment>
+ <comment xml:lang="it">Messaggio email parziale</comment>
+ <comment xml:lang="ja">部分メールメッセージ</comment>
+ <comment xml:lang="kk">электронды поштаның үзінді мәлімдемесі</comment>
+ <comment xml:lang="ko">부분적인 전자메일 메시지</comment>
+ <comment xml:lang="lt">nepilnas el. laiškas</comment>
+ <comment xml:lang="lv">daļēja e-pasta vēstule</comment>
+ <comment xml:lang="ms">Bahagian mesej emel</comment>
+ <comment xml:lang="nb">del av e-postmelding</comment>
+ <comment xml:lang="nl">gedeeltelijk e-mailbericht</comment>
+ <comment xml:lang="nn">del av e-post-melding</comment>
+ <comment xml:lang="pl">Częściowa wiadomość e-mail</comment>
+ <comment xml:lang="pt">mensagem parcial de e-mail</comment>
+ <comment xml:lang="pt_BR">mensagem de e-mail parcial</comment>
+ <comment xml:lang="ro">mesaj de email parțial</comment>
+ <comment xml:lang="ru">фрагмент сообщения электронной почты</comment>
+ <comment xml:lang="sk">Čiastočná e-mailová správa</comment>
+ <comment xml:lang="sl">delno elektronsko sporočilo</comment>
+ <comment xml:lang="sq">Mesazh poste i pjesëshëm</comment>
+ <comment xml:lang="sr">делимична е-порука</comment>
+ <comment xml:lang="sv">del av e-postmeddelande</comment>
+ <comment xml:lang="uk">часткове поштове повідомлення</comment>
+ <comment xml:lang="vi">thư điện tử riêng phần</comment>
+ <comment xml:lang="zh_CN">部分电子邮件</comment>
+ <comment xml:lang="zh_TW">部份電子郵件訊息</comment>
+ <generic-icon name="text-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="message/rfc822">
+ <comment>email message</comment>
+ <comment xml:lang="ar">رسالة البريد الإلكتروني</comment>
+ <comment xml:lang="be@latin">list email</comment>
+ <comment xml:lang="bg">Съобщение по електронната поща</comment>
+ <comment xml:lang="ca">missatge de correu electrònic</comment>
+ <comment xml:lang="cs">E-mailová zpráva</comment>
+ <comment xml:lang="da">postmeddelelse</comment>
+ <comment xml:lang="de">E-Mail-Nachricht</comment>
+ <comment xml:lang="el">ηλ. μήνυμα</comment>
+ <comment xml:lang="en_GB">email message</comment>
+ <comment xml:lang="eo">retpoŝta mesaĝo</comment>
+ <comment xml:lang="es">mensaje de correo electrónico</comment>
+ <comment xml:lang="eu">helbide elektronikoen mezua</comment>
+ <comment xml:lang="fi">sähköpostiviesti</comment>
+ <comment xml:lang="fo">t-post boð</comment>
+ <comment xml:lang="fr">message de courriel</comment>
+ <comment xml:lang="ga">teachtaireacht ríomhphoist</comment>
+ <comment xml:lang="gl">mensaxe de correo electrónico</comment>
+ <comment xml:lang="he">הודעת דואר אלקטרוני</comment>
+ <comment xml:lang="hu">elektronikus levél</comment>
+ <comment xml:lang="id">pesan email</comment>
+ <comment xml:lang="it">Messaggio email</comment>
+ <comment xml:lang="ja">メール本文</comment>
+ <comment xml:lang="kk">пошталық мәлімдеме</comment>
+ <comment xml:lang="ko">전자우편 본문</comment>
+ <comment xml:lang="lt">el. laiškas</comment>
+ <comment xml:lang="lv">e-pasta vēstule</comment>
+ <comment xml:lang="ms">Mesej emel</comment>
+ <comment xml:lang="nb">e-postmelding</comment>
+ <comment xml:lang="nl">e-mailbericht</comment>
+ <comment xml:lang="nn">e-postmelding</comment>
+ <comment xml:lang="pl">Wiadomość e-mail</comment>
+ <comment xml:lang="pt">mensagem de e-mail</comment>
+ <comment xml:lang="pt_BR">mensagem de correio eletrônico</comment>
+ <comment xml:lang="ro">mesaj email</comment>
+ <comment xml:lang="ru">почтовое сообщение</comment>
+ <comment xml:lang="sk">E-mailová správa</comment>
+ <comment xml:lang="sl">sporočilo elektronske pošte</comment>
+ <comment xml:lang="sq">Mesazh poste</comment>
+ <comment xml:lang="sr">е-порука</comment>
+ <comment xml:lang="sv">e-postmeddelande</comment>
+ <comment xml:lang="uk">повідомлення email</comment>
+ <comment xml:lang="vi">thư điện tử</comment>
+ <comment xml:lang="zh_CN">电子邮件</comment>
+ <comment xml:lang="zh_TW">電子郵件內容</comment>
+ <generic-icon name="text-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="#! rnews" type="string" offset="0"/>
+ <match value="Forward to" type="string" offset="0"/>
+ <match value="From:" type="string" offset="0"/>
+ <match value="N#! rnews" type="string" offset="0"/>
+ <match value="Pipe to" type="string" offset="0"/>
+ <match value="Received:" type="string" offset="0"/>
+ <match value="Relay-Version:" type="string" offset="0"/>
+ <match value="Return-Path:" type="string" offset="0"/>
+ <match value="Return-path:" type="string" offset="0"/>
+ <match value="Subject: " type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.eml"/>
+ </mime-type>
+ <mime-type type="message/x-gnu-rmail">
+ <comment>GNU mail message</comment>
+ <comment xml:lang="ar">رسالة بريد جنو</comment>
+ <comment xml:lang="az">GNU poçt ismarışı</comment>
+ <comment xml:lang="be@latin">List GNU</comment>
+ <comment xml:lang="bg">Съобщение — GNU mail</comment>
+ <comment xml:lang="ca">missatge de GNU mail</comment>
+ <comment xml:lang="cs">Zpráva GNU mail</comment>
+ <comment xml:lang="cy">Neges E-Bost GNU</comment>
+ <comment xml:lang="da">GNU-postmeddelelse</comment>
+ <comment xml:lang="de">GNU-Mail-Nachricht</comment>
+ <comment xml:lang="el">μήνυμα αλληλογραφίας GNU</comment>
+ <comment xml:lang="en_GB">GNU mail message</comment>
+ <comment xml:lang="eo">mesaĝo de GNU mail</comment>
+ <comment xml:lang="es">mensaje de GNU mail</comment>
+ <comment xml:lang="eu">GNU posta mezua</comment>
+ <comment xml:lang="fi">GNU-postiviesti</comment>
+ <comment xml:lang="fo">GNU mail boð</comment>
+ <comment xml:lang="fr">message de courriel GNU</comment>
+ <comment xml:lang="ga">teachtaireacht phost GNU</comment>
+ <comment xml:lang="gl">mensaxe de correo electrónico de GNU</comment>
+ <comment xml:lang="he">הודעת דואר של GNU</comment>
+ <comment xml:lang="hu">GNU elektronikus levél</comment>
+ <comment xml:lang="id">Pesan surat GNU</comment>
+ <comment xml:lang="it">Messaggio GNU mail</comment>
+ <comment xml:lang="ja">GNU メールメッセージ</comment>
+ <comment xml:lang="kk">GNU пошта хабарламасы</comment>
+ <comment xml:lang="ko">GNU 메일 메시지</comment>
+ <comment xml:lang="lt">GNU pašto žinutė</comment>
+ <comment xml:lang="lv">GNU pasta vēstule</comment>
+ <comment xml:lang="ms">Mesej emel GNU</comment>
+ <comment xml:lang="nb">GNU e-postmelding</comment>
+ <comment xml:lang="nl">GNU-mailbericht</comment>
+ <comment xml:lang="nn">GNU e-postmelding</comment>
+ <comment xml:lang="pl">Wiadomość pocztowa GNU</comment>
+ <comment xml:lang="pt">mensagem de e-mail GNU</comment>
+ <comment xml:lang="pt_BR">Mensagem de correio GNU</comment>
+ <comment xml:lang="ro">Mesaj GNU mail</comment>
+ <comment xml:lang="ru">почтовое сообщение GNU</comment>
+ <comment xml:lang="sk">Správa GNU mail</comment>
+ <comment xml:lang="sl">Sporočilo pošte GNU</comment>
+ <comment xml:lang="sq">Mesazh GNU mail</comment>
+ <comment xml:lang="sr">ГНУ е-писмо</comment>
+ <comment xml:lang="sv">GNU-epostmeddelande</comment>
+ <comment xml:lang="uk">поштове повідомлення GNU</comment>
+ <comment xml:lang="vi">Thư điện tử của GNU</comment>
+ <comment xml:lang="zh_CN">GNU mail 信件</comment>
+ <comment xml:lang="zh_TW">GNU 郵件訊息</comment>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="RMAIL"/>
+ </mime-type>
+ <mime-type type="model/vrml">
+ <comment>VRML document</comment>
+ <comment xml:lang="ar">مستند VRML</comment>
+ <comment xml:lang="az">VRML sənədi</comment>
+ <comment xml:lang="be@latin">Dakument VRML</comment>
+ <comment xml:lang="bg">Документ — VRML</comment>
+ <comment xml:lang="ca">document VRML</comment>
+ <comment xml:lang="cs">Dokument VRML</comment>
+ <comment xml:lang="cy">Dogfen VRML</comment>
+ <comment xml:lang="da">VRML-dokument</comment>
+ <comment xml:lang="de">VRML-Dokument</comment>
+ <comment xml:lang="el">έγγραφο VRML</comment>
+ <comment xml:lang="en_GB">VRML document</comment>
+ <comment xml:lang="eo">VRML-dokumento</comment>
+ <comment xml:lang="es">documento VRML</comment>
+ <comment xml:lang="eu">VRML dokumentua</comment>
+ <comment xml:lang="fi">VRML-asiakirja</comment>
+ <comment xml:lang="fo">VRML skjal</comment>
+ <comment xml:lang="fr">document VRML</comment>
+ <comment xml:lang="ga">cáipéis VRML</comment>
+ <comment xml:lang="gl">documento VRML</comment>
+ <comment xml:lang="he">מסמך VRML</comment>
+ <comment xml:lang="hu">VRML-dokumentum</comment>
+ <comment xml:lang="id">Dokumen VRML</comment>
+ <comment xml:lang="it">Documento VRML</comment>
+ <comment xml:lang="ja">VRML ドキュメント</comment>
+ <comment xml:lang="kk">VRML құжаты</comment>
+ <comment xml:lang="ko">VRML 문서</comment>
+ <comment xml:lang="lt">VRML dokumentas</comment>
+ <comment xml:lang="lv">VRML dokuments</comment>
+ <comment xml:lang="ms">Dokumen VRML</comment>
+ <comment xml:lang="nb">VRML-dokument</comment>
+ <comment xml:lang="nl">VRML-document</comment>
+ <comment xml:lang="nn">VRML-dokument</comment>
+ <comment xml:lang="pl">Dokument VRML</comment>
+ <comment xml:lang="pt">documento VRML</comment>
+ <comment xml:lang="pt_BR">Documento VRML</comment>
+ <comment xml:lang="ro">Document VRML</comment>
+ <comment xml:lang="ru">документ VRML</comment>
+ <comment xml:lang="sk">Dokument VRML</comment>
+ <comment xml:lang="sl">Dokument VRML</comment>
+ <comment xml:lang="sq">Dokument VRML</comment>
+ <comment xml:lang="sr">VRML документ</comment>
+ <comment xml:lang="sv">VRML-dokument</comment>
+ <comment xml:lang="uk">документ VRML</comment>
+ <comment xml:lang="vi">Tài liệu VRML</comment>
+ <comment xml:lang="zh_CN">VRML 文档</comment>
+ <comment xml:lang="zh_TW">VRML 文件</comment>
+ <acronym>VRML</acronym>
+ <expanded-acronym>Virtual Reality Modeling Language</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.vrm"/>
+ <glob pattern="*.vrml"/>
+ <glob pattern="*.wrl"/>
+ </mime-type>
+ <mime-type type="multipart/alternative">
+ <comment>message in several formats</comment>
+ <comment xml:lang="ar">رسالة في عدة صيغ</comment>
+ <comment xml:lang="az">verici formatlarında ismarış</comment>
+ <comment xml:lang="be@latin">paviedamleńnie ŭ niekalkich farmatach</comment>
+ <comment xml:lang="bg">Съобщение в няколко формата</comment>
+ <comment xml:lang="ca">missatge en varis formats</comment>
+ <comment xml:lang="cs">Zpráva v několika formátech</comment>
+ <comment xml:lang="cy">neges mewn sawl fformat</comment>
+ <comment xml:lang="da">meddelelse i flere formater</comment>
+ <comment xml:lang="de">Nachricht in mehreren Formaten</comment>
+ <comment xml:lang="el">μήνυμα σε διάφορες μορφές</comment>
+ <comment xml:lang="en_GB">message in several formats</comment>
+ <comment xml:lang="eo">mesaĝo en pluraj formatoj</comment>
+ <comment xml:lang="es">mensaje en varios formatos</comment>
+ <comment xml:lang="eu">hainbat formatuko mezua</comment>
+ <comment xml:lang="fi">viesti useissa muodoissa</comment>
+ <comment xml:lang="fo">boð í fleiri sniðum</comment>
+ <comment xml:lang="fr">message en formats divers</comment>
+ <comment xml:lang="ga">teachtaireacht i roinnt fhormáidí</comment>
+ <comment xml:lang="gl">mensaxe en varios formatos</comment>
+ <comment xml:lang="he">הודעה במספר פורמטים</comment>
+ <comment xml:lang="hu">többféle formátumú üzenet</comment>
+ <comment xml:lang="id">pesan dalam beberapa format</comment>
+ <comment xml:lang="it">Messaggio in diversi formati</comment>
+ <comment xml:lang="ja">いくつかの形式でのメッセージ</comment>
+ <comment xml:lang="kk">бірнеше пішімдегі мәлімдеме</comment>
+ <comment xml:lang="ko">여러가지 형식의 메시지</comment>
+ <comment xml:lang="lt">laiškas keletu formatų</comment>
+ <comment xml:lang="lv">ziņojums dažādos formātos</comment>
+ <comment xml:lang="ms">Mesej dalam beberapa format</comment>
+ <comment xml:lang="nb">melding i flere formater</comment>
+ <comment xml:lang="nl">bericht in meerdere opmaken</comment>
+ <comment xml:lang="nn">melding i fleire format</comment>
+ <comment xml:lang="pl">Wiadomość w wielu formatach</comment>
+ <comment xml:lang="pt">mensagem em vários formatos</comment>
+ <comment xml:lang="pt_BR">mensagem em vários formatos</comment>
+ <comment xml:lang="ro">mesaj în diferite formate</comment>
+ <comment xml:lang="ru">сообщение в нескольких форматах</comment>
+ <comment xml:lang="sk">Správa v niekoľkých formátoch</comment>
+ <comment xml:lang="sl">sporočilo v več zapisih</comment>
+ <comment xml:lang="sq">Mesazh në formate të ndryshëm</comment>
+ <comment xml:lang="sr">поруке у више записа</comment>
+ <comment xml:lang="sv">meddelande i flera format</comment>
+ <comment xml:lang="uk">повідомлення у кількох форматах</comment>
+ <comment xml:lang="vi">thông điệp có vài định dạng</comment>
+ <comment xml:lang="zh_CN">各种格式的消息</comment>
+ <comment xml:lang="zh_TW">多種格式的訊息</comment>
+ </mime-type>
+ <mime-type type="multipart/appledouble">
+ <comment>Macintosh AppleDouble-encoded file</comment>
+ <comment xml:lang="ar">ملف Macintosh AppleDouble مشفر</comment>
+ <comment xml:lang="az">Macintosh AppleDouble-kodlanmış fayl</comment>
+ <comment xml:lang="be@latin">Fajł Macintosh, AppleDouble-zakadavany</comment>
+ <comment xml:lang="bg">Файл — кодиран с Macintosh AppleDouble</comment>
+ <comment xml:lang="ca">fitxer codificat AppleDouble de Macintosh</comment>
+ <comment xml:lang="cs">Soubor kódovaný pomocí Macintosh AppleDouble</comment>
+ <comment xml:lang="cy">Ffeil AppleDouble-amgodedig Macintosh</comment>
+ <comment xml:lang="da">Macintosh AppleDouble-kodet fil</comment>
+ <comment xml:lang="de">Macintosh-Datei (AppleDouble-kodiert)</comment>
+ <comment xml:lang="el">αρχείο Macintosh κωδικοποίησης AppleDouble</comment>
+ <comment xml:lang="en_GB">Macintosh AppleDouble-encoded file</comment>
+ <comment xml:lang="eo">dosiero kodigita laŭ Macintosh AppleDouble</comment>
+ <comment xml:lang="es">archivo Macintosh codificado con AppleDouble</comment>
+ <comment xml:lang="eu">Macintosh AppleDouble-rekin kodetutako fitxategia</comment>
+ <comment xml:lang="fi">Macintosh AppleDouble -koodattu tiedosto</comment>
+ <comment xml:lang="fo">Macintosh AppleDouble-bronglað fíla</comment>
+ <comment xml:lang="fr">fichier codé Macintosh AppleDouble</comment>
+ <comment xml:lang="ga">comhad ionchódaithe le Macintosh AppleDouble</comment>
+ <comment xml:lang="gl">ficheiro de Macintosh codificado con AppleDouble</comment>
+ <comment xml:lang="he">קובץ מסוג Macintosh AppleDouble-encoded</comment>
+ <comment xml:lang="hu">Macintosh AppleDouble kódolású fájl</comment>
+ <comment xml:lang="id">Berkas tersandi Macintosh AppleDouble</comment>
+ <comment xml:lang="it">File Macintosh codificato AppleDouble</comment>
+ <comment xml:lang="ja">Macintosh AppleDouble エンコードファイル</comment>
+ <comment xml:lang="kk">Macintosh AppleDouble кодталған файлы</comment>
+ <comment xml:lang="ko">맥킨토시 AppleDouble-encoded 파일</comment>
+ <comment xml:lang="lt">Macintosh AppleDouble-encoded failas</comment>
+ <comment xml:lang="lv">Macintosh AppleDouble-kodēts fails</comment>
+ <comment xml:lang="ms">Fail terenkod-AppleDouble Macintosh</comment>
+ <comment xml:lang="nb">dokument kodet med Macintosh AppleDouble</comment>
+ <comment xml:lang="nl">Macintosh AppleDouble-gecodeerd bestand</comment>
+ <comment xml:lang="nn">Macintosh AppleDouble-koda fil</comment>
+ <comment xml:lang="pl">Zakodowany w AppleDouble plik Macintosh</comment>
+ <comment xml:lang="pt">ficheiro codificado em AppleDouble de Macintosh</comment>
+ <comment xml:lang="pt_BR">Arquivo Macintosh codificado com AppleDouble</comment>
+ <comment xml:lang="ro">Fișier codat Macintosh AppleDouble</comment>
+ <comment xml:lang="ru">файл (закодированный Macintosh AppleDouble)</comment>
+ <comment xml:lang="sk">Súbor kódovaný pomocou Macintosh AppleDouble</comment>
+ <comment xml:lang="sl">Kodirana datoteka Macintosh (AppleDouble)</comment>
+ <comment xml:lang="sq">File Macintosh i kodifikuar AppleDouble</comment>
+ <comment xml:lang="sr">Мекинтош AppleDouble-encoded датотека</comment>
+ <comment xml:lang="sv">Macintosh AppleDouble-kodad fil</comment>
+ <comment xml:lang="uk">файл закодований Macintosh AppleDouble</comment>
+ <comment xml:lang="vi">Tập tin đã mã hoá Apple-Double của Macintosh</comment>
+ <comment xml:lang="zh_CN">Macintosh AppleDouble 编码的文件</comment>
+ <comment xml:lang="zh_TW">Macintosh AppleDouble 編碼檔</comment>
+ </mime-type>
+ <mime-type type="multipart/digest">
+ <comment>message digest</comment>
+ <comment xml:lang="ar">خلاصة الرسالة</comment>
+ <comment xml:lang="az">ismarış daycesti</comment>
+ <comment xml:lang="be@latin">digest paviedamleńniaŭ</comment>
+ <comment xml:lang="bg">Извадка от съобщение</comment>
+ <comment xml:lang="ca">recopilació de missatges</comment>
+ <comment xml:lang="cs">Přehled zpráv</comment>
+ <comment xml:lang="cy">crynodeb negeseuon</comment>
+ <comment xml:lang="da">meddelelsessammendrag</comment>
+ <comment xml:lang="de">Nachrichtensammlung</comment>
+ <comment xml:lang="el">περίληψη μηνύματος</comment>
+ <comment xml:lang="en_GB">message digest</comment>
+ <comment xml:lang="eo">mesaĝaro</comment>
+ <comment xml:lang="es">recopilación de mensajes</comment>
+ <comment xml:lang="eu">mezu laburra</comment>
+ <comment xml:lang="fi">viestikokoelma</comment>
+ <comment xml:lang="fo">boð samandráttur</comment>
+ <comment xml:lang="fr">condensé de message</comment>
+ <comment xml:lang="ga">achoimre theachtaireachtaí</comment>
+ <comment xml:lang="gl">recompilación de mensaxe</comment>
+ <comment xml:lang="he">תקציר ההודעה</comment>
+ <comment xml:lang="hu">ömlesztett üzenet</comment>
+ <comment xml:lang="id">pesan digest</comment>
+ <comment xml:lang="it">Digest di messaggi</comment>
+ <comment xml:lang="ja">メッセージダイジェスト</comment>
+ <comment xml:lang="kk">мәлімдеме профилі</comment>
+ <comment xml:lang="ko">메시지 묶음</comment>
+ <comment xml:lang="lt">laiškų santrauka</comment>
+ <comment xml:lang="lv">ziņojumu apkopojums</comment>
+ <comment xml:lang="ms">Jilid mesej</comment>
+ <comment xml:lang="nb">medldingssamling</comment>
+ <comment xml:lang="nl">berichtenbundel</comment>
+ <comment xml:lang="nn">meldingsamandrag</comment>
+ <comment xml:lang="pl">Wiadomość przetwarzania</comment>
+ <comment xml:lang="pt">'digest' de mensagens</comment>
+ <comment xml:lang="pt_BR">resumo de mensagem</comment>
+ <comment xml:lang="ro">colecție mesaje email</comment>
+ <comment xml:lang="ru">профиль сообщения</comment>
+ <comment xml:lang="sk">Prehľad správ</comment>
+ <comment xml:lang="sl">povzetek sporočila</comment>
+ <comment xml:lang="sq">Shpërndarje mesazhesh</comment>
+ <comment xml:lang="sr">гомила порука</comment>
+ <comment xml:lang="sv">meddelandesamling</comment>
+ <comment xml:lang="uk">збірка повідомлень</comment>
+ <comment xml:lang="vi">bản tóm tắt thông điệp</comment>
+ <comment xml:lang="zh_CN">消息摘要</comment>
+ <comment xml:lang="zh_TW">訊息摘要</comment>
+ </mime-type>
+ <mime-type type="multipart/encrypted">
+ <comment>encrypted message</comment>
+ <comment xml:lang="ar">رسالة مشفرة</comment>
+ <comment xml:lang="az">şifrələnmiş ismarış</comment>
+ <comment xml:lang="be@latin">zašyfravanaje paviedamleńnie</comment>
+ <comment xml:lang="bg">Шифрирано съобщение</comment>
+ <comment xml:lang="ca">missatge xifrat</comment>
+ <comment xml:lang="cs">Zašifrovaná zpráva</comment>
+ <comment xml:lang="cy">Neges wedi ei hamgryptio</comment>
+ <comment xml:lang="da">krypteret meddelelse</comment>
+ <comment xml:lang="de">Verschlüsselte Nachricht</comment>
+ <comment xml:lang="el">κρυπτογραφημένο μήνυμα</comment>
+ <comment xml:lang="en_GB">encrypted message</comment>
+ <comment xml:lang="eo">ĉifrita mesaĝo</comment>
+ <comment xml:lang="es">mensaje cifrado</comment>
+ <comment xml:lang="eu">mezu enkriptatua</comment>
+ <comment xml:lang="fi">salattu viesti</comment>
+ <comment xml:lang="fo">bronglað boð</comment>
+ <comment xml:lang="fr">message chiffré</comment>
+ <comment xml:lang="ga">teachtaireacht chriptithe</comment>
+ <comment xml:lang="gl">mensaxe cifrado</comment>
+ <comment xml:lang="he">הודעה מוצפנת</comment>
+ <comment xml:lang="hu">titkosított üzenet</comment>
+ <comment xml:lang="id">pesan terenkripsi</comment>
+ <comment xml:lang="it">Messaggio cifrato</comment>
+ <comment xml:lang="ja">暗号化メッセージ</comment>
+ <comment xml:lang="kk">шифрленген мәлімдеме</comment>
+ <comment xml:lang="ko">암호화된 메시지</comment>
+ <comment xml:lang="lt">užšifruotas laiškas</comment>
+ <comment xml:lang="lv">šifrēta vēstule</comment>
+ <comment xml:lang="ms">Mesej terenkripsi</comment>
+ <comment xml:lang="nb">kryptert melding</comment>
+ <comment xml:lang="nl">versleuteld bericht</comment>
+ <comment xml:lang="nn">kryptert melding</comment>
+ <comment xml:lang="pl">Wiadomość zaszyfrowana</comment>
+ <comment xml:lang="pt">mensagem cifrada</comment>
+ <comment xml:lang="pt_BR">mensagem criptografada</comment>
+ <comment xml:lang="ro">mesaj criptat</comment>
+ <comment xml:lang="ru">зашифрованное сообщение</comment>
+ <comment xml:lang="sk">Zašifrovaná správa</comment>
+ <comment xml:lang="sl">šifrirano sporočilo</comment>
+ <comment xml:lang="sq">Mesazh i kriptuar</comment>
+ <comment xml:lang="sr">шифрована порука</comment>
+ <comment xml:lang="sv">krypterat meddelande</comment>
+ <comment xml:lang="uk">шифроване повідомлення</comment>
+ <comment xml:lang="vi">thông điệp đã mật mã</comment>
+ <comment xml:lang="zh_CN">加密信件</comment>
+ <comment xml:lang="zh_TW">加密訊息</comment>
+ </mime-type>
+ <mime-type type="multipart/mixed">
+ <comment>compound documents</comment>
+ <comment xml:lang="ar">مستندات مركبة</comment>
+ <comment xml:lang="be@latin">składanyja dakumenty</comment>
+ <comment xml:lang="bg">Съставни документи</comment>
+ <comment xml:lang="ca">documents composats</comment>
+ <comment xml:lang="cs">Složené dokumenty</comment>
+ <comment xml:lang="da">sammensatte dokumenter</comment>
+ <comment xml:lang="de">Verbunddokumente</comment>
+ <comment xml:lang="el">σύνθετα έγγραφα</comment>
+ <comment xml:lang="en_GB">compound documents</comment>
+ <comment xml:lang="eo">parentezaj dokumentoj</comment>
+ <comment xml:lang="es">documentos compuestos</comment>
+ <comment xml:lang="eu">konposatutako dokumentuak</comment>
+ <comment xml:lang="fi">yhdisteasiakirjat</comment>
+ <comment xml:lang="fo">samansett skjøl</comment>
+ <comment xml:lang="fr">documents composés</comment>
+ <comment xml:lang="ga">cáipéisí comhshuite</comment>
+ <comment xml:lang="gl">documentos compostos</comment>
+ <comment xml:lang="he">מסמכים מורכבים</comment>
+ <comment xml:lang="hu">összetett dokumentumok</comment>
+ <comment xml:lang="id">dokumen kompon</comment>
+ <comment xml:lang="it">Documenti composti</comment>
+ <comment xml:lang="ja">複合ドキュメント</comment>
+ <comment xml:lang="kk">құрама құжаттары</comment>
+ <comment xml:lang="ko">복합 문서</comment>
+ <comment xml:lang="lt">sudurtiniai dokumentai</comment>
+ <comment xml:lang="lv">salikti dokumenti</comment>
+ <comment xml:lang="ms">Dokumen halaman</comment>
+ <comment xml:lang="nb">sammensatte dokumenter</comment>
+ <comment xml:lang="nl">samengestelde documenten</comment>
+ <comment xml:lang="nn">samansette dokument</comment>
+ <comment xml:lang="pl">Dokumenty złożone</comment>
+ <comment xml:lang="pt">documentos compostos</comment>
+ <comment xml:lang="pt_BR">documentos compostos</comment>
+ <comment xml:lang="ro">documente compuse</comment>
+ <comment xml:lang="ru">составные документы</comment>
+ <comment xml:lang="sk">Zložené dokumenty</comment>
+ <comment xml:lang="sl">združeni dokumenti</comment>
+ <comment xml:lang="sq">dokumente të përbërë</comment>
+ <comment xml:lang="sr">сједињени документи</comment>
+ <comment xml:lang="sv">sammansatta dokument</comment>
+ <comment xml:lang="uk">складні документи</comment>
+ <comment xml:lang="vi">tài liệu ghép</comment>
+ <comment xml:lang="zh_CN">组合文档</comment>
+ <comment xml:lang="zh_TW">複合文件</comment>
+ </mime-type>
+ <mime-type type="multipart/related">
+ <comment>compound document</comment>
+ <comment xml:lang="ar">مستند مركب</comment>
+ <comment xml:lang="az">birləşik sənəd</comment>
+ <comment xml:lang="be@latin">składany dakument</comment>
+ <comment xml:lang="bg">Съставен документ</comment>
+ <comment xml:lang="ca">document composat</comment>
+ <comment xml:lang="cs">Složený dokument</comment>
+ <comment xml:lang="cy">dogfen gyfansawdd</comment>
+ <comment xml:lang="da">sammensat dokument</comment>
+ <comment xml:lang="de">Verbunddokument</comment>
+ <comment xml:lang="el">σύνθετο έγγραφο</comment>
+ <comment xml:lang="en_GB">compound document</comment>
+ <comment xml:lang="eo">parenteza dokumento</comment>
+ <comment xml:lang="es">documento compuesto</comment>
+ <comment xml:lang="eu">konposatutako dokumentua</comment>
+ <comment xml:lang="fi">yhdisteasiakirja</comment>
+ <comment xml:lang="fo">samansett skjal</comment>
+ <comment xml:lang="fr">document composé</comment>
+ <comment xml:lang="ga">cáipéis comhshuite</comment>
+ <comment xml:lang="gl">documento composto</comment>
+ <comment xml:lang="he">מסמך מורכב</comment>
+ <comment xml:lang="hu">összetett dokumentum</comment>
+ <comment xml:lang="id">dokumen kompon</comment>
+ <comment xml:lang="it">Documento composto</comment>
+ <comment xml:lang="ja">複合ドキュメント</comment>
+ <comment xml:lang="kk">құрама құжаты</comment>
+ <comment xml:lang="ko">복합 문서</comment>
+ <comment xml:lang="lt">sudurtinis dokumentas</comment>
+ <comment xml:lang="lv">salikts dokuments</comment>
+ <comment xml:lang="ms">Dokumen halaman</comment>
+ <comment xml:lang="nb">sammensatt dokument</comment>
+ <comment xml:lang="nl">samengesteld document</comment>
+ <comment xml:lang="nn">samansett dokument</comment>
+ <comment xml:lang="pl">Dokument złożony</comment>
+ <comment xml:lang="pt">documento composto</comment>
+ <comment xml:lang="pt_BR">documento composto</comment>
+ <comment xml:lang="ro">document compus</comment>
+ <comment xml:lang="ru">составной документ</comment>
+ <comment xml:lang="sk">Zložený dokument</comment>
+ <comment xml:lang="sl">združeni dokument</comment>
+ <comment xml:lang="sq">dokumet i përbërë</comment>
+ <comment xml:lang="sr">сједињени документ</comment>
+ <comment xml:lang="sv">sammansatt dokument</comment>
+ <comment xml:lang="uk">складний документ</comment>
+ <comment xml:lang="vi">tài liệu ghép</comment>
+ <comment xml:lang="zh_CN">组合文档</comment>
+ <comment xml:lang="zh_TW">複合文件</comment>
+ </mime-type>
+ <mime-type type="multipart/report">
+ <comment>mail system report</comment>
+ <comment xml:lang="ar">تقرير نظام البريد</comment>
+ <comment xml:lang="az">poçt sistemi raportu</comment>
+ <comment xml:lang="be@latin">rapart paštovaj systemy</comment>
+ <comment xml:lang="bg">Отчет за пощенската система</comment>
+ <comment xml:lang="ca">informe de sistema de correu</comment>
+ <comment xml:lang="cs">Zpráva poštovního systému</comment>
+ <comment xml:lang="cy">adroddiad system bost</comment>
+ <comment xml:lang="da">postsystemrapport</comment>
+ <comment xml:lang="de">E-Mail-Systembericht</comment>
+ <comment xml:lang="el">αναφορά συστήματος ηλ. ταχυδρομείου</comment>
+ <comment xml:lang="en_GB">mail system report</comment>
+ <comment xml:lang="eo">raporto de retpoŝta sistemo</comment>
+ <comment xml:lang="es">informe del sistema de correo</comment>
+ <comment xml:lang="eu">posta sistemako txostena</comment>
+ <comment xml:lang="fi">viestijärjestelmän ilmoitus</comment>
+ <comment xml:lang="fo">postkervisfrásøgn</comment>
+ <comment xml:lang="fr">rapport système de courriels</comment>
+ <comment xml:lang="ga">tuairisc chóras poist</comment>
+ <comment xml:lang="gl">informe do sistema de correo</comment>
+ <comment xml:lang="he">דו"ח של מערכת הדואר</comment>
+ <comment xml:lang="hu">levelezőrendszer jelentése</comment>
+ <comment xml:lang="id">laporan sistem surat</comment>
+ <comment xml:lang="it">Rapporto di sistema posta</comment>
+ <comment xml:lang="ja">メールシステムレポート</comment>
+ <comment xml:lang="kk">пошта жүйесінің мәлімдемесі</comment>
+ <comment xml:lang="ko">메일 시스템 보고서</comment>
+ <comment xml:lang="lt">pašto sistemos ataskaita</comment>
+ <comment xml:lang="lv">pasta sistēmas atskaite</comment>
+ <comment xml:lang="ms">Laporan sistem mel</comment>
+ <comment xml:lang="nb">e-postsystemrapport</comment>
+ <comment xml:lang="nl">e-mail-systeembericht</comment>
+ <comment xml:lang="nn">e-post-systemrapport</comment>
+ <comment xml:lang="pl">Raport systemu pocztowego</comment>
+ <comment xml:lang="pt">relatório de sistema de e-mail</comment>
+ <comment xml:lang="pt_BR">relatório do sistema de correspondência</comment>
+ <comment xml:lang="ro">raport sistem email</comment>
+ <comment xml:lang="ru">отчёт почтовой системы</comment>
+ <comment xml:lang="sk">Správa poštového systému</comment>
+ <comment xml:lang="sl">poročilo poštnega sistema</comment>
+ <comment xml:lang="sq">Raport i sistemit të postës</comment>
+ <comment xml:lang="sr">извештај поштанског система</comment>
+ <comment xml:lang="sv">e-postsystemrapport</comment>
+ <comment xml:lang="uk">звіт поштової системи</comment>
+ <comment xml:lang="vi">thông báo hệ thống thư</comment>
+ <comment xml:lang="zh_CN">邮件系统报告</comment>
+ <comment xml:lang="zh_TW">郵件系統回報</comment>
+ </mime-type>
+ <mime-type type="multipart/signed">
+ <comment>signed message</comment>
+ <comment xml:lang="ar">رسالة موقّعة</comment>
+ <comment xml:lang="az">imzalanmış ismarış</comment>
+ <comment xml:lang="be@latin">padpisanaje paviedamleńnie</comment>
+ <comment xml:lang="bg">Подписано съобщение</comment>
+ <comment xml:lang="ca">missatge signat</comment>
+ <comment xml:lang="cs">Podepsaná zpráva</comment>
+ <comment xml:lang="cy">neges lofnodwyd</comment>
+ <comment xml:lang="da">signeret meddelelse</comment>
+ <comment xml:lang="de">Signierte Nachricht</comment>
+ <comment xml:lang="el">υπογεγραμμένο μήνυμα</comment>
+ <comment xml:lang="en_GB">signed message</comment>
+ <comment xml:lang="eo">pruvita mesaĝo</comment>
+ <comment xml:lang="es">mensaje firmado</comment>
+ <comment xml:lang="eu">sinatutako mezua</comment>
+ <comment xml:lang="fi">allekirjoitettu viesti</comment>
+ <comment xml:lang="fo">undirskrivað boð</comment>
+ <comment xml:lang="fr">message signé</comment>
+ <comment xml:lang="ga">teachtaireacht sínithe</comment>
+ <comment xml:lang="gl">mensaxe firmado</comment>
+ <comment xml:lang="he">הודעה חתומה</comment>
+ <comment xml:lang="hu">aláírt üzenet</comment>
+ <comment xml:lang="id">pesan ditandatangani</comment>
+ <comment xml:lang="it">Messaggio firmato</comment>
+ <comment xml:lang="ja">署名付きメッセージ</comment>
+ <comment xml:lang="kk">қолтаңбасы бар мәлімдеме</comment>
+ <comment xml:lang="ko">서명된 메시지</comment>
+ <comment xml:lang="lt">pasirašytas laiškas</comment>
+ <comment xml:lang="lv">parakstīta ziņa</comment>
+ <comment xml:lang="ms">Mesej ditandatangani</comment>
+ <comment xml:lang="nb">signert melding</comment>
+ <comment xml:lang="nl">ondertekend bericht</comment>
+ <comment xml:lang="nn">signert melding</comment>
+ <comment xml:lang="pl">Podpisana wiadomość</comment>
+ <comment xml:lang="pt">mensagem assinada</comment>
+ <comment xml:lang="pt_BR">mensagem assinada</comment>
+ <comment xml:lang="ro">mesaj semnat</comment>
+ <comment xml:lang="ru">подписанное сообщение</comment>
+ <comment xml:lang="sk">Podpísaná správa</comment>
+ <comment xml:lang="sl">podpisano sporočilo</comment>
+ <comment xml:lang="sq">Mesazh i firmosur</comment>
+ <comment xml:lang="sr">потписана порука</comment>
+ <comment xml:lang="sv">signerat meddelande</comment>
+ <comment xml:lang="uk">підписане повідомлення</comment>
+ <comment xml:lang="vi">thông điệp đã ký</comment>
+ <comment xml:lang="zh_CN">签名信件</comment>
+ <comment xml:lang="zh_TW">簽署的訊息</comment>
+ </mime-type>
+ <mime-type type="multipart/x-mixed-replace">
+ <comment>stream of data (server push)</comment>
+ <comment xml:lang="ar">دفق بيانات (دفع خادم)</comment>
+ <comment xml:lang="be@latin">płyń źviestak (ad servera)</comment>
+ <comment xml:lang="bg">Поток от данни, от страна на сървър</comment>
+ <comment xml:lang="ca">flux de dades (enviat pel servidor)</comment>
+ <comment xml:lang="cs">Proud dat (posílaný serverem)</comment>
+ <comment xml:lang="da">datastrøm (serverskubbet)</comment>
+ <comment xml:lang="de">Datenstrom (Server-Push)</comment>
+ <comment xml:lang="el">χείμαρρος δεδομένων (στελλόμενα από τον εξυπηρετητή)</comment>
+ <comment xml:lang="en_GB">stream of data (server push)</comment>
+ <comment xml:lang="eo">datumstrio (puŝata per servilo)</comment>
+ <comment xml:lang="es">flujo de datos (por iniciativa del servidor)</comment>
+ <comment xml:lang="eu">datu-korrontea (zerbitzari igortzailea)</comment>
+ <comment xml:lang="fi">tietovirta (palvelin työntää)</comment>
+ <comment xml:lang="fo">streymur av dáta (ambætara skump)</comment>
+ <comment xml:lang="fr">flux de données (émis par le serveur)</comment>
+ <comment xml:lang="ga">sruth sonraí (brú freastalaí)</comment>
+ <comment xml:lang="gl">fluxo de datos (por iniciativa do servidor)</comment>
+ <comment xml:lang="he">מידע בזרימה (דחיפה ע"י השרת)</comment>
+ <comment xml:lang="hu">sugárzott adatfolyam (kiszolgálóról)</comment>
+ <comment xml:lang="id">arus data (dorongan server)</comment>
+ <comment xml:lang="it">Flusso di dati (server push)</comment>
+ <comment xml:lang="ja">データストリーム (サーバープッシュ型)</comment>
+ <comment xml:lang="kk">мәліметтер ағымы (server push)</comment>
+ <comment xml:lang="ko">스트림 데이터 (서버 푸시)</comment>
+ <comment xml:lang="lt">duomenų srautas (iš serverio)</comment>
+ <comment xml:lang="lv">datu straume (servera grūsta)</comment>
+ <comment xml:lang="ms">Aliran dara (paksaan pelayan)</comment>
+ <comment xml:lang="nb">datastrøm (server push)</comment>
+ <comment xml:lang="nl">gegevensstroom (server duwt)</comment>
+ <comment xml:lang="nn">datastraum (dytta av tenaren)</comment>
+ <comment xml:lang="pl">Strumień danych (wymuszenie serwera)</comment>
+ <comment xml:lang="pt">fluxo de dados (empurrados pelo servidor)</comment>
+ <comment xml:lang="pt_BR">fluxo de dados (por iniciativa do servidor)</comment>
+ <comment xml:lang="ro">flux de date (de la server)</comment>
+ <comment xml:lang="ru">поток данных (server push)</comment>
+ <comment xml:lang="sk">Prúd dát (posielaný serverom)</comment>
+ <comment xml:lang="sl">pretok podatkov (strežniški)</comment>
+ <comment xml:lang="sq">Fluks me të dhëna (server push)</comment>
+ <comment xml:lang="sr">проток података (гурање са сервера)</comment>
+ <comment xml:lang="sv">dataflöde (serverutsändning)</comment>
+ <comment xml:lang="uk">потік даних (від сервера)</comment>
+ <comment xml:lang="vi">luồng dữ liệu (trình phục vụ đẩy)</comment>
+ <comment xml:lang="zh_CN">数据流(服务器推送)</comment>
+ <comment xml:lang="zh_TW">資料串流 (server push)</comment>
+ </mime-type>
+ <mime-type type="text/calendar">
+ <comment>VCS/ICS calendar</comment>
+ <comment xml:lang="ar">سجل VCS/ICS</comment>
+ <comment xml:lang="be@latin">Kalandar VCS/ICS</comment>
+ <comment xml:lang="bg">Календар — VCS/ICS</comment>
+ <comment xml:lang="ca">calendari VCS/ICS</comment>
+ <comment xml:lang="cs">Kalendář VCS/ICS</comment>
+ <comment xml:lang="da">VCS/ICS-kalender</comment>
+ <comment xml:lang="de">VCS/ICS-Kalender</comment>
+ <comment xml:lang="en_GB">VCS/ICS calendar</comment>
+ <comment xml:lang="eo">VCS/ICS-kalendaro</comment>
+ <comment xml:lang="es">calendario VCS/ICS</comment>
+ <comment xml:lang="eu">VCS/ICS egutegia</comment>
+ <comment xml:lang="fi">VCS/ICS-kalenteri</comment>
+ <comment xml:lang="fo">VCS/ICS kalendari</comment>
+ <comment xml:lang="fr">calendrier VCS/ICS</comment>
+ <comment xml:lang="ga">féilire VCS/ICS</comment>
+ <comment xml:lang="gl">Calendario VCS/ICS</comment>
+ <comment xml:lang="he">לוח שנה VCS/ICS</comment>
+ <comment xml:lang="hu">VCS/ICS naptár</comment>
+ <comment xml:lang="id">Kalender VCS/ICS</comment>
+ <comment xml:lang="it">Calendario VCS/ICS</comment>
+ <comment xml:lang="ja">VCS/ICS カレンダー</comment>
+ <comment xml:lang="kk">VCS/ICS күнтізбесі</comment>
+ <comment xml:lang="ko">VCS/ICS 달력</comment>
+ <comment xml:lang="lt">VCS/ICS kalendorius</comment>
+ <comment xml:lang="lv">VCS/ICS kalendārs</comment>
+ <comment xml:lang="nb">VCS/ICS-kalender</comment>
+ <comment xml:lang="nl">VCS/ICS-kalender</comment>
+ <comment xml:lang="nn">VCS/ICS-kalender</comment>
+ <comment xml:lang="pl">Kalendarz VCS/ICS</comment>
+ <comment xml:lang="pt_BR">Calendário VCS/ICS</comment>
+ <comment xml:lang="ro">Calendar VCS/ICS</comment>
+ <comment xml:lang="ru">календарь VCS/ICS</comment>
+ <comment xml:lang="sk">Kalendár VCS/ICS</comment>
+ <comment xml:lang="sl">Datoteka koledarja VCS/ICS</comment>
+ <comment xml:lang="sq">Kalendar VCS/ICS</comment>
+ <comment xml:lang="sv">VCS/ICS-kalender</comment>
+ <comment xml:lang="uk">календар VCS/ICS</comment>
+ <comment xml:lang="vi">Lịch VCS/ICS</comment>
+ <comment xml:lang="zh_CN">VCS/ICS 日历</comment>
+ <comment xml:lang="zh_TW">VCS/ICS 行事曆</comment>
+ <acronym>VCS/ICS</acronym>
+ <expanded-acronym>vCalendar/iCalendar</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <alias type="text/x-vcalendar"/>
+ <magic priority="50">
+ <match value="BEGIN:VCALENDAR" type="string" offset="0"/>
+ <match value="begin:vcalendar" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.vcs"/>
+ <glob pattern="*.ics"/>
+ </mime-type>
+ <mime-type type="text/css">
+ <comment>CSS stylesheet</comment>
+ <comment xml:lang="ar">نمط CSS</comment>
+ <comment xml:lang="be@latin">Arkuš stylaŭ CSS</comment>
+ <comment xml:lang="bg">Стилове — CSS</comment>
+ <comment xml:lang="ca">llista d'estil CSS</comment>
+ <comment xml:lang="cs">Styl CSS</comment>
+ <comment xml:lang="da">CSS-stilark</comment>
+ <comment xml:lang="de">CSS-Stilvorlage</comment>
+ <comment xml:lang="en_GB">CSS stylesheet</comment>
+ <comment xml:lang="eo">CSS-stilfolio</comment>
+ <comment xml:lang="es">hoja de estilo CSS</comment>
+ <comment xml:lang="eu">CSS estilo-orria</comment>
+ <comment xml:lang="fi">CSS-tyylitiedosto</comment>
+ <comment xml:lang="fo">CSS sniðark</comment>
+ <comment xml:lang="fr">feuille de style CSS</comment>
+ <comment xml:lang="ga">stílbhileog CSS</comment>
+ <comment xml:lang="gl">folla de estilos CSS</comment>
+ <comment xml:lang="he">גליון עיצוב CSS</comment>
+ <comment xml:lang="hu">CSS stíluslap</comment>
+ <comment xml:lang="id">Lembar gaya CSS</comment>
+ <comment xml:lang="it">Foglio di stile CSS</comment>
+ <comment xml:lang="ja">CSS スタイルシート</comment>
+ <comment xml:lang="kk">CSS стильдер кестесі</comment>
+ <comment xml:lang="ko">CSS 스타일시트</comment>
+ <comment xml:lang="lt">CSS stiliaus aprašas</comment>
+ <comment xml:lang="lv">CSS stilu saraksts</comment>
+ <comment xml:lang="nb">CSS-stilark</comment>
+ <comment xml:lang="nl">CSS-stijlblad</comment>
+ <comment xml:lang="nn">CSS-stilark</comment>
+ <comment xml:lang="pl">Arkusz stylów CSS</comment>
+ <comment xml:lang="pt_BR">Folha de estilos CSS</comment>
+ <comment xml:lang="ro">Pagină de stil CSS</comment>
+ <comment xml:lang="ru">таблица стилей CSS</comment>
+ <comment xml:lang="sk">Štýly CSS</comment>
+ <comment xml:lang="sl">Slogovna predloga CSS</comment>
+ <comment xml:lang="sq">Fletë stili CSS</comment>
+ <comment xml:lang="sv">CSS-stilmall</comment>
+ <comment xml:lang="uk">таблиця стилів CSS</comment>
+ <comment xml:lang="vi">Tờ kiểu dáng CSS</comment>
+ <comment xml:lang="zh_CN">CSS 样式表</comment>
+ <comment xml:lang="zh_TW">CSS 樣式表</comment>
+ <acronym>CSS</acronym>
+ <expanded-acronym>Cascading Style Sheets</expanded-acronym>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.css"/>
+ <glob pattern="*.CSSL"/>
+ </mime-type>
+ <mime-type type="text/vcard">
+ <comment>electronic business card</comment>
+ <comment xml:lang="ar">بطاقة أعمال إلكترونية</comment>
+ <comment xml:lang="be@latin">elektronnaja biznes-kartka</comment>
+ <comment xml:lang="bg">Електронна визитна картичка</comment>
+ <comment xml:lang="ca">targeta de visita electrònica</comment>
+ <comment xml:lang="cs">Elektronická navštívenka</comment>
+ <comment xml:lang="da">elektronisk visitkort</comment>
+ <comment xml:lang="de">Elektronische Visitenkarte</comment>
+ <comment xml:lang="eo">elektronika vizitkarto</comment>
+ <comment xml:lang="es">tarjeta de visita electrónica</comment>
+ <comment xml:lang="eu">enpresako txartel elektronikoa</comment>
+ <comment xml:lang="fi">sähköinen käyntikortti</comment>
+ <comment xml:lang="fo">elektroniskt handilskort</comment>
+ <comment xml:lang="fr">carte de visite électronique</comment>
+ <comment xml:lang="ga">cárta gnó leictreonach</comment>
+ <comment xml:lang="gl">tarxeta de negocio electrónica</comment>
+ <comment xml:lang="he">כרטיס ביקור אלקטרוני</comment>
+ <comment xml:lang="hu">elektronikus névjegykártya</comment>
+ <comment xml:lang="id">kartu bisnis elektronik</comment>
+ <comment xml:lang="it">Biglietto da visita elettronico</comment>
+ <comment xml:lang="ja">電子名刺</comment>
+ <comment xml:lang="kk">электронда визит карточкасы</comment>
+ <comment xml:lang="ko">전자 명함</comment>
+ <comment xml:lang="lt">elektroninė vizitinė kortelė</comment>
+ <comment xml:lang="lv">elektroniskā biznesa kartiņa</comment>
+ <comment xml:lang="nl">elektronisch visitekaartje</comment>
+ <comment xml:lang="nn">elektronisk visittkort</comment>
+ <comment xml:lang="pl">Wizytówka elektroniczna</comment>
+ <comment xml:lang="pt">cartão de visita electrónico</comment>
+ <comment xml:lang="pt_BR">cartão de visitas eletrônico</comment>
+ <comment xml:lang="ro">carte de vizită electronică</comment>
+ <comment xml:lang="ru">электронная визитная карточка</comment>
+ <comment xml:lang="sk">Elektronická vizitka</comment>
+ <comment xml:lang="sl">elektronska poslovna vizitka</comment>
+ <comment xml:lang="sq">Skedë elektronike biznesi</comment>
+ <comment xml:lang="sv">elektroniskt visitkort</comment>
+ <comment xml:lang="uk">електронна бізнес-картка</comment>
+ <comment xml:lang="vi">danh thiếp điện tử</comment>
+ <comment xml:lang="zh_CN">电子商务卡</comment>
+ <comment xml:lang="zh_TW">電子商務名片</comment>
+ <alias type="text/directory"/>
+ <alias type="text/x-vcard"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="BEGIN:VCARD" type="string" offset="0"/>
+ <match value="begin:vcard" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.vcard"/>
+ <glob pattern="*.vcf"/>
+ <glob pattern="*.vct"/>
+ <glob pattern="*.gcrd"/>
+ </mime-type>
+ <mime-type type="text/x-txt2tags">
+ <comment>txt2tags document</comment>
+ <comment xml:lang="ar">مستند txt2tags</comment>
+ <comment xml:lang="be@latin">dakument txt2tags</comment>
+ <comment xml:lang="bg">Документ — txt2tags</comment>
+ <comment xml:lang="ca">document txt2tags</comment>
+ <comment xml:lang="cs">Dokument txt2tags</comment>
+ <comment xml:lang="da">txt2tags-dokument</comment>
+ <comment xml:lang="de">txt2tags-Dokument</comment>
+ <comment xml:lang="eo">txt2tags-dokumento</comment>
+ <comment xml:lang="es">documento txt2tags</comment>
+ <comment xml:lang="eu">txt2tags dokumentua</comment>
+ <comment xml:lang="fi">txt2tags-asiakirja</comment>
+ <comment xml:lang="fo">txt2tags skjal</comment>
+ <comment xml:lang="fr">document txt2tags</comment>
+ <comment xml:lang="ga">cáipéis txt2tags</comment>
+ <comment xml:lang="gl">documento txt2tags</comment>
+ <comment xml:lang="he">מסמך txt2tags</comment>
+ <comment xml:lang="hu">txt2tags dokumentum</comment>
+ <comment xml:lang="id">dokumen txt2tags</comment>
+ <comment xml:lang="it">Documento txt2tags</comment>
+ <comment xml:lang="ja">txt2tags ドキュメント</comment>
+ <comment xml:lang="kk">txt2tags құжаты</comment>
+ <comment xml:lang="ko">txt2tags 문서</comment>
+ <comment xml:lang="lt">txt2tags dokumentas</comment>
+ <comment xml:lang="lv">txt2tags dokuments</comment>
+ <comment xml:lang="nb">txt2tags-dokument</comment>
+ <comment xml:lang="nl">txt2tags-document</comment>
+ <comment xml:lang="nn">txt2tags-dokument</comment>
+ <comment xml:lang="pl">Dokument txt2tags</comment>
+ <comment xml:lang="pt_BR">Documento txt2tags</comment>
+ <comment xml:lang="ro">document txt2tags</comment>
+ <comment xml:lang="ru">документ txt2tags</comment>
+ <comment xml:lang="sk">Dokument txt2tags</comment>
+ <comment xml:lang="sl">Dokument txt2tags</comment>
+ <comment xml:lang="sq">Dokument txt2tags</comment>
+ <comment xml:lang="sv">txt2tags-dokument</comment>
+ <comment xml:lang="uk">документ txt2tags</comment>
+ <comment xml:lang="vi">tài liệu txt2tags</comment>
+ <comment xml:lang="zh_CN">txt2tags 文档</comment>
+ <comment xml:lang="zh_TW">txt2tags 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="60">
+ <match value="%!postproc" type="string" offset="0"/>
+ <match value="%!encoding" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.t2t"/>
+ </mime-type>
+ <mime-type type="text/x-verilog">
+ <comment>Verilog source code</comment>
+ <comment xml:lang="bg">Изходен код — Verilog</comment>
+ <comment xml:lang="ca">codi font en Verilog</comment>
+ <comment xml:lang="cs">Zdrojový kód Verilog</comment>
+ <comment xml:lang="da">Verilog-kildekode</comment>
+ <comment xml:lang="de">Verilog-Quellcode</comment>
+ <comment xml:lang="eo">Verilog-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Verilog</comment>
+ <comment xml:lang="fi">Verilog-lähdekoodi</comment>
+ <comment xml:lang="fr">code source Verilog</comment>
+ <comment xml:lang="gl">código fonte en Verilog</comment>
+ <comment xml:lang="he">קוד מקור של </comment>
+ <comment xml:lang="hu">Verilog-forráskód</comment>
+ <comment xml:lang="id">Kode sumber Verilog</comment>
+ <comment xml:lang="it">Codice sorgente Verilog</comment>
+ <comment xml:lang="ja">Verilog ソースコード</comment>
+ <comment xml:lang="kk">Verilog бастапқы коды</comment>
+ <comment xml:lang="ko">Verilog 소스 코드</comment>
+ <comment xml:lang="lv">Verilog pirmkods</comment>
+ <comment xml:lang="pl">Kod źródłowy Verilog</comment>
+ <comment xml:lang="pt_BR">Código fonte Verilog</comment>
+ <comment xml:lang="ru">исходный код Verilog</comment>
+ <comment xml:lang="sk">Zdrojový kód Verilog</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Verilog</comment>
+ <comment xml:lang="sv">Verilog-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Verilog</comment>
+ <comment xml:lang="zh_CN">Verilog 源代码</comment>
+ <comment xml:lang="zh_TW">Verilog 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.v"/>
+ </mime-type>
+ <mime-type type="text/x-svhdr">
+ <comment>SystemVerilog header</comment>
+ <comment xml:lang="bg">Заглавен файл — SystemVerilog</comment>
+ <comment xml:lang="ca">capçalera de SystemVerilog</comment>
+ <comment xml:lang="cs">Záhlaví SystemVerilog</comment>
+ <comment xml:lang="da">SystemVerilog-teksthoved</comment>
+ <comment xml:lang="de">SystemVerilog-Header</comment>
+ <comment xml:lang="es">cabeceras de SystemVerilog</comment>
+ <comment xml:lang="fi">SystemVerilog-otsake</comment>
+ <comment xml:lang="fr">en-tête </comment>
+ <comment xml:lang="gl">Cabeceiras de SystemVerilog</comment>
+ <comment xml:lang="he">כותרת SystemVerilog</comment>
+ <comment xml:lang="hu">SystemVerilog fejléc</comment>
+ <comment xml:lang="id">Header SystemVerilog</comment>
+ <comment xml:lang="it">Header SystemVerilog</comment>
+ <comment xml:lang="ja">SystemVerilog ヘッダー</comment>
+ <comment xml:lang="kk">SystemVerilog тақырыптамасы</comment>
+ <comment xml:lang="ko">SystemVerilog 헤더</comment>
+ <comment xml:lang="lv">SystemVerilog galvene</comment>
+ <comment xml:lang="pl">Nagłówek SystemVerilog</comment>
+ <comment xml:lang="ru">заголовочный файл SystemVerilog</comment>
+ <comment xml:lang="sk">Hlavičky SystemVerilog</comment>
+ <comment xml:lang="sl">Datoteka glave SystemVerilog</comment>
+ <comment xml:lang="sv">SystemVerilog-headerfil</comment>
+ <comment xml:lang="uk">заголовки SystemVerilog</comment>
+ <comment xml:lang="zh_CN">SystemVerilog 头</comment>
+ <comment xml:lang="zh_TW">SystemVerilog 標頭</comment>
+ <sub-class-of type="text/x-verilog"/>
+ <glob pattern="*.svh"/>
+ </mime-type>
+ <mime-type type="text/x-svsrc">
+ <comment>SystemVerilog source code</comment>
+ <comment xml:lang="bg">Изходен код — SystemVerilog</comment>
+ <comment xml:lang="ca">codi font en SystemVerilog</comment>
+ <comment xml:lang="cs">Zdrojový kód SystemVerilog</comment>
+ <comment xml:lang="da">SystemVerilog-kildekode</comment>
+ <comment xml:lang="de">SystemVerilog-Quellcode</comment>
+ <comment xml:lang="es">código fuente en SystemVerilog</comment>
+ <comment xml:lang="fi">SystemVerilog-lähdekoodi</comment>
+ <comment xml:lang="fr">code source </comment>
+ <comment xml:lang="gl">código fonte en SystemVerilog</comment>
+ <comment xml:lang="he">קוד מקור של SystemVerilog</comment>
+ <comment xml:lang="hu">SystemVerilog-forráskód</comment>
+ <comment xml:lang="id">Kode sumber SystemVerilog</comment>
+ <comment xml:lang="it">Codice sorgente </comment>
+ <comment xml:lang="ja">SystemVerilog ソースコード</comment>
+ <comment xml:lang="kk">SystemVerilog бастапқы коды</comment>
+ <comment xml:lang="ko">SystemVerilog 소스 코드</comment>
+ <comment xml:lang="lv">SystemVerilog pirmkods</comment>
+ <comment xml:lang="pl">Kod źródłowy SystemVerilog</comment>
+ <comment xml:lang="ru">исходный код SystemVerilog</comment>
+ <comment xml:lang="sk">Zdrojový kód SystemVerilog</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode SystemVerilog</comment>
+ <comment xml:lang="sv">SystemVerilog-källkod</comment>
+ <comment xml:lang="uk">вихідний файл мовою SystemVerilog</comment>
+ <comment xml:lang="zh_CN">SystemVerilog 源代码</comment>
+ <comment xml:lang="zh_TW">SystemVerilog 源代碼</comment>
+ <sub-class-of type="text/x-verilog"/>
+ <glob pattern="*.sv"/>
+ </mime-type>
+ <mime-type type="text/x-vhdl">
+ <comment>VHDL source code</comment>
+ <comment xml:lang="bg">Изходен код — VHDL</comment>
+ <comment xml:lang="ca">codi font en VHDL</comment>
+ <comment xml:lang="cs">Zdrojový kód VHDL</comment>
+ <comment xml:lang="da">VHDL-kildekode</comment>
+ <comment xml:lang="de">VHDL-Quellcode</comment>
+ <comment xml:lang="eo">VHDL-fontkodo</comment>
+ <comment xml:lang="es">código fuente en VHDL</comment>
+ <comment xml:lang="fi">VHDL-lähdekoodi</comment>
+ <comment xml:lang="fr">code source VHDL</comment>
+ <comment xml:lang="gl">código fonte en VHDL</comment>
+ <comment xml:lang="he">קוד מקור של VHDL</comment>
+ <comment xml:lang="hu">VHDL-forráskód</comment>
+ <comment xml:lang="id">Kode sumber VHDL</comment>
+ <comment xml:lang="it">Codice sorgente VHDL</comment>
+ <comment xml:lang="ja">VHDL ソースコード</comment>
+ <comment xml:lang="kk">VHDL бастапқы коды</comment>
+ <comment xml:lang="ko">VHDL 소스 코드</comment>
+ <comment xml:lang="lv">VHDL pirmkods</comment>
+ <comment xml:lang="pl">Kod źródłowy VHDL</comment>
+ <comment xml:lang="ru">исходный код VHDL</comment>
+ <comment xml:lang="sk">Zdrojový kód VHDL</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode VHDL</comment>
+ <comment xml:lang="sv">VHDL-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою VHDL</comment>
+ <comment xml:lang="zh_CN">VHDL 源代码</comment>
+ <comment xml:lang="zh_TW">VHDL 源代碼</comment>
+ <acronym>VHDL</acronym>
+ <expanded-acronym>Very-High-Speed Integrated Circuit Hardware Description Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.vhd"/>
+ <glob pattern="*.vhdl"/>
+ </mime-type>
+ <mime-type type="text/enriched">
+ <comment>enriched text document</comment>
+ <comment xml:lang="ar">مستند نصي مغنى</comment>
+ <comment xml:lang="az">zəngin mətn sənədi</comment>
+ <comment xml:lang="be@latin">azdobleny tekstavy dakument</comment>
+ <comment xml:lang="bg">Документ с обогатен текст</comment>
+ <comment xml:lang="ca">document de text enriquit</comment>
+ <comment xml:lang="cs">Rozšířený textový dokument</comment>
+ <comment xml:lang="cy">Dogfen testun wedi ei gyfoethogi</comment>
+ <comment xml:lang="da">beriget tekstdokument</comment>
+ <comment xml:lang="de">Angereichertes Textdokument</comment>
+ <comment xml:lang="el">εγγραφο εμπλουτισμένου κειμένου</comment>
+ <comment xml:lang="en_GB">enriched text document</comment>
+ <comment xml:lang="eo">riĉigita teksta dokumento</comment>
+ <comment xml:lang="es">documento de texto enriquecido</comment>
+ <comment xml:lang="eu">aberastutako testu dokumentua</comment>
+ <comment xml:lang="fi">rikastettu tekstiasiakirja</comment>
+ <comment xml:lang="fo">ríkað tekstskjal</comment>
+ <comment xml:lang="fr">document texte enrichi</comment>
+ <comment xml:lang="ga">cáipéis téacs saibhrithe</comment>
+ <comment xml:lang="gl">documento de texto enriquecido</comment>
+ <comment xml:lang="he">מסמך טקסט מועשר</comment>
+ <comment xml:lang="hu">enriched text dokumentum</comment>
+ <comment xml:lang="id">dokumen teks diperkaya</comment>
+ <comment xml:lang="it">Documento testo arricchito</comment>
+ <comment xml:lang="ja">リッチテキストドキュメント</comment>
+ <comment xml:lang="kk">пішімделген мәтіндік құжаты</comment>
+ <comment xml:lang="ko">enriched text 문서</comment>
+ <comment xml:lang="lt">praturtinto teksto dokumentas</comment>
+ <comment xml:lang="lv">bagātināta teksta formāts</comment>
+ <comment xml:lang="ms">Dokumen teks diperkaya</comment>
+ <comment xml:lang="nb">riktekst-dokument</comment>
+ <comment xml:lang="nl">verrijkt tekstdocument</comment>
+ <comment xml:lang="nn">rik tekst tekstdokument</comment>
+ <comment xml:lang="pl">Wzbogacony dokument tekstowy</comment>
+ <comment xml:lang="pt">documento de texto rico</comment>
+ <comment xml:lang="pt_BR">documento de texto enriquecido</comment>
+ <comment xml:lang="ro">document text îmbogățit</comment>
+ <comment xml:lang="ru">форматированный текстовый документ</comment>
+ <comment xml:lang="sk">Rozšírený textový dokument</comment>
+ <comment xml:lang="sl">dokument z obogatenim besedilom</comment>
+ <comment xml:lang="sq">Dokument teksti i pasuruar</comment>
+ <comment xml:lang="sr">обогаћени текстуални документ</comment>
+ <comment xml:lang="sv">berikat textdokument</comment>
+ <comment xml:lang="uk">форматований текстовий документ</comment>
+ <comment xml:lang="vi">tài liệu văn bản có kiểu dáng</comment>
+ <comment xml:lang="zh_CN">富文本文档</comment>
+ <comment xml:lang="zh_TW">豐富化文字文件</comment>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="text/htmlh">
+ <comment>help page</comment>
+ <comment xml:lang="ar">صفحة المساعدة</comment>
+ <comment xml:lang="az">yardım səhifəsi</comment>
+ <comment xml:lang="be@latin">staronka dapamohi</comment>
+ <comment xml:lang="bg">Страница от помощта</comment>
+ <comment xml:lang="ca">pàgina d'ajuda</comment>
+ <comment xml:lang="cs">Stránka nápovědy</comment>
+ <comment xml:lang="cy">tudalen gymorth</comment>
+ <comment xml:lang="da">hjælpeside</comment>
+ <comment xml:lang="de">Hilfeseite</comment>
+ <comment xml:lang="el">σελίδα βοηθείας</comment>
+ <comment xml:lang="en_GB">help page</comment>
+ <comment xml:lang="eo">help-paĝo</comment>
+ <comment xml:lang="es">página de ayuda</comment>
+ <comment xml:lang="eu">laguntzako orria</comment>
+ <comment xml:lang="fi">ohjesivu</comment>
+ <comment xml:lang="fo">hjálparsíða</comment>
+ <comment xml:lang="fr">page d'aide</comment>
+ <comment xml:lang="ga">leathanach cabhrach</comment>
+ <comment xml:lang="gl">páxina de axuda</comment>
+ <comment xml:lang="he">דף עזרה</comment>
+ <comment xml:lang="hu">súgóoldal</comment>
+ <comment xml:lang="id">halaman bantuan</comment>
+ <comment xml:lang="it">Pagina di aiuto</comment>
+ <comment xml:lang="ja">ヘルプページ</comment>
+ <comment xml:lang="kk">анықтама парағы</comment>
+ <comment xml:lang="ko">도움말 페이지</comment>
+ <comment xml:lang="lt">žinyno puslapis</comment>
+ <comment xml:lang="lv">palīdzības lapa</comment>
+ <comment xml:lang="ms">Halaman bantuan</comment>
+ <comment xml:lang="nb">hjelpside</comment>
+ <comment xml:lang="nl">hulppagina</comment>
+ <comment xml:lang="nn">hjelpeside</comment>
+ <comment xml:lang="pl">Strona pomocy</comment>
+ <comment xml:lang="pt">página de ajuda</comment>
+ <comment xml:lang="pt_BR">página de ajuda</comment>
+ <comment xml:lang="ro">pagină de ajutor</comment>
+ <comment xml:lang="ru">страница справки</comment>
+ <comment xml:lang="sk">Stránka Pomocníka</comment>
+ <comment xml:lang="sl">stran pomoči</comment>
+ <comment xml:lang="sq">Faqe ndihme</comment>
+ <comment xml:lang="sr">страна помоћи</comment>
+ <comment xml:lang="sv">hjälpsida</comment>
+ <comment xml:lang="uk">сторінка довідки</comment>
+ <comment xml:lang="vi">trang trợ giúp</comment>
+ <comment xml:lang="zh_CN">帮助页面</comment>
+ <comment xml:lang="zh_TW">幫助頁面</comment>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="text/plain">
+ <comment>plain text document</comment>
+ <comment xml:lang="ar">مستند نصي مجرد</comment>
+ <comment xml:lang="be@latin">prosty tekstavy dakument</comment>
+ <comment xml:lang="bg">Документ с неформатиран текст</comment>
+ <comment xml:lang="ca">document de text pla</comment>
+ <comment xml:lang="cs">Prostý textový dokument</comment>
+ <comment xml:lang="da">rent tekstdokument</comment>
+ <comment xml:lang="de">Einfaches Textdokument</comment>
+ <comment xml:lang="el">έγγραφο απλού κειμένου</comment>
+ <comment xml:lang="en_GB">plain text document</comment>
+ <comment xml:lang="eo">plata teksta dokumento</comment>
+ <comment xml:lang="es">documento de texto sencillo</comment>
+ <comment xml:lang="eu">testu soileko dokumentua</comment>
+ <comment xml:lang="fi">perustekstiasiakirja</comment>
+ <comment xml:lang="fr">document texte brut</comment>
+ <comment xml:lang="ga">cáipéis ghnáth-théacs</comment>
+ <comment xml:lang="gl">documento de texto sinxelo</comment>
+ <comment xml:lang="he">מסמך טקסט פשוט</comment>
+ <comment xml:lang="hu">egyszerű szöveg</comment>
+ <comment xml:lang="id">dokumen teks biasa</comment>
+ <comment xml:lang="it">Documento in testo semplice</comment>
+ <comment xml:lang="ja">平文テキストドキュメント</comment>
+ <comment xml:lang="kk">мәтіндік құжаты</comment>
+ <comment xml:lang="ko">보통 text 문서</comment>
+ <comment xml:lang="lt">paprastas tekstinis dokumentas</comment>
+ <comment xml:lang="lv">vienkāršs teksta dokuments</comment>
+ <comment xml:lang="ms">Dokumen teks jernih</comment>
+ <comment xml:lang="nb">vanlig tekstdokument</comment>
+ <comment xml:lang="nl">plattetekst-document</comment>
+ <comment xml:lang="nn">vanleg tekstdokument</comment>
+ <comment xml:lang="pl">Zwykły dokument tekstowy</comment>
+ <comment xml:lang="pt">documento em texto simples</comment>
+ <comment xml:lang="pt_BR">documento somente texto</comment>
+ <comment xml:lang="ro">document text simplu</comment>
+ <comment xml:lang="ru">текстовый документ</comment>
+ <comment xml:lang="sk">Obyčajný textový dokument</comment>
+ <comment xml:lang="sl">običajna besedilna datoteka</comment>
+ <comment xml:lang="sq">Dokument në tekst të thjeshtë</comment>
+ <comment xml:lang="sr">обичан текстуални документ</comment>
+ <comment xml:lang="sv">vanligt textdokument</comment>
+ <comment xml:lang="uk">звичайний текстовий документ</comment>
+ <comment xml:lang="vi">tài liệu nhập thô</comment>
+ <comment xml:lang="zh_CN">纯文本文档</comment>
+ <comment xml:lang="zh_TW">純文字文件</comment>
+ <magic priority="50">
+ <match value="This is TeX," type="string" offset="0"/>
+ <match value="This is METAFONT," type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.txt"/>
+ <glob pattern="*.asc"/>
+ <glob pattern="*,v"/>
+ </mime-type>
+ <mime-type type="application/rdf+xml">
+ <comment>RDF file</comment>
+ <comment xml:lang="ar">ملف RDF</comment>
+ <comment xml:lang="be@latin">Fajł RDF</comment>
+ <comment xml:lang="bg">Файл — RDF</comment>
+ <comment xml:lang="ca">fitxer RDF</comment>
+ <comment xml:lang="cs">Soubor RDF</comment>
+ <comment xml:lang="da">RDF-fil</comment>
+ <comment xml:lang="de">RDF-Datei</comment>
+ <comment xml:lang="en_GB">RDF file</comment>
+ <comment xml:lang="eo">RDF-dosiero</comment>
+ <comment xml:lang="es">archivo RDF</comment>
+ <comment xml:lang="eu">RDF fitxategia</comment>
+ <comment xml:lang="fi">RDF-tiedosto</comment>
+ <comment xml:lang="fo">RDF fíla</comment>
+ <comment xml:lang="fr">fichier RDF</comment>
+ <comment xml:lang="ga">comhad RDF</comment>
+ <comment xml:lang="gl">ficheiro RDF</comment>
+ <comment xml:lang="he">קובץ RDF</comment>
+ <comment xml:lang="hu">RDF fájl</comment>
+ <comment xml:lang="id">Arsip RDF</comment>
+ <comment xml:lang="it">File RDF</comment>
+ <comment xml:lang="ja">RDF ファイル</comment>
+ <comment xml:lang="kk">RDF файлы</comment>
+ <comment xml:lang="ko">RDF 파일</comment>
+ <comment xml:lang="lt">RDF failas</comment>
+ <comment xml:lang="lv">RDF fails</comment>
+ <comment xml:lang="nb">RDF-fil</comment>
+ <comment xml:lang="nl">RDF-bestand</comment>
+ <comment xml:lang="nn">RDF-fil</comment>
+ <comment xml:lang="pl">Plik RDF</comment>
+ <comment xml:lang="pt_BR">Arquivo RDF</comment>
+ <comment xml:lang="ro">Fișier RDF</comment>
+ <comment xml:lang="ru">файл RDF</comment>
+ <comment xml:lang="sk">Súbor RDF</comment>
+ <comment xml:lang="sl">Datoteka RDF</comment>
+ <comment xml:lang="sq">File RDF</comment>
+ <comment xml:lang="sv">RDF-fil</comment>
+ <comment xml:lang="uk">файл RDF</comment>
+ <comment xml:lang="vi">Tập tin RDF</comment>
+ <comment xml:lang="zh_CN">RDF 文件</comment>
+ <comment xml:lang="zh_TW">RDF 檔</comment>
+ <acronym>RDF</acronym>
+ <expanded-acronym>Resource Description Framework</expanded-acronym>
+ <alias type="text/rdf"/>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.rdf"/>
+ <glob pattern="*.rdfs"/>
+ <glob pattern="*.owl"/>
+ <root-XML namespaceURI="http://www.w3.org/1999/02/22-rdf-syntax-ns#" localName="RDF"/>
+ </mime-type>
+ <mime-type type="text/rfc822-headers">
+ <comment>email headers</comment>
+ <comment xml:lang="ar">ترويسة البريد الإلكتروني</comment>
+ <comment xml:lang="az">epoçt başlıqları</comment>
+ <comment xml:lang="be@latin">paštovyja zahałoŭki</comment>
+ <comment xml:lang="bg">Заглавни части на електронни писма</comment>
+ <comment xml:lang="ca">capçaleres de correu electrònic</comment>
+ <comment xml:lang="cs">Záhlaví e-mailu</comment>
+ <comment xml:lang="cy">penawdau e-bost</comment>
+ <comment xml:lang="da">posthoveder</comment>
+ <comment xml:lang="de">E-Mail-Kopfzeilen</comment>
+ <comment xml:lang="el">κεφαλίδες ηλ. μηνυμάτων</comment>
+ <comment xml:lang="en_GB">email headers</comment>
+ <comment xml:lang="eo">retpoŝtaj ĉapoj</comment>
+ <comment xml:lang="es">cabeceras de correo electrónico</comment>
+ <comment xml:lang="eu">helbide elektronikoen goiburuak</comment>
+ <comment xml:lang="fi">sähköpostiotsakkeet</comment>
+ <comment xml:lang="fo">t-post tekshøvd</comment>
+ <comment xml:lang="fr">en-têtes de courriel</comment>
+ <comment xml:lang="ga">ceanntásca ríomhphoist</comment>
+ <comment xml:lang="gl">cabeceiras de correo electrónico</comment>
+ <comment xml:lang="he">כותרת דוא"ל</comment>
+ <comment xml:lang="hu">levélfejléc</comment>
+ <comment xml:lang="id">tajuk email</comment>
+ <comment xml:lang="it">Intestazioni email</comment>
+ <comment xml:lang="ja">メールヘッダー</comment>
+ <comment xml:lang="kk">пошталық тақырыптамалары</comment>
+ <comment xml:lang="ko">전자우편 헤더</comment>
+ <comment xml:lang="lt">el. laiško antraštės</comment>
+ <comment xml:lang="lv">e-pasta galvene</comment>
+ <comment xml:lang="ms">Pengepala emel</comment>
+ <comment xml:lang="nb">e-posthode</comment>
+ <comment xml:lang="nl">e-mail-kopregels</comment>
+ <comment xml:lang="nn">e-post-hovud</comment>
+ <comment xml:lang="pl">Nagłówki wiadomości e-mail</comment>
+ <comment xml:lang="pt">cabeçalhos de e-mail</comment>
+ <comment xml:lang="pt_BR">cabeçalhos de e-mail</comment>
+ <comment xml:lang="ro">antete email</comment>
+ <comment xml:lang="ru">почтовые заголовки</comment>
+ <comment xml:lang="sk">Hlavičky e-mailu</comment>
+ <comment xml:lang="sl">glava elektronske pošte</comment>
+ <comment xml:lang="sq">Header email</comment>
+ <comment xml:lang="sr">заглавља е-порука</comment>
+ <comment xml:lang="sv">e-posthuvuden</comment>
+ <comment xml:lang="uk">заголовки email</comment>
+ <comment xml:lang="vi">dòng đầu thư điện tử</comment>
+ <comment xml:lang="zh_CN">电子邮件头</comment>
+ <comment xml:lang="zh_TW">電子郵件標頭</comment>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="text/richtext">
+ <comment>rich text document</comment>
+ <comment xml:lang="ar">مستند نصي غني</comment>
+ <comment xml:lang="az">zəngin mətn sənədi</comment>
+ <comment xml:lang="be@latin">azdobleny tekstavy dakument</comment>
+ <comment xml:lang="bg">Документ — rich text</comment>
+ <comment xml:lang="ca">document de text enriquit</comment>
+ <comment xml:lang="cs">Textový dokument RTF</comment>
+ <comment xml:lang="cy">dogfen testun gyfoethog (rtf)</comment>
+ <comment xml:lang="da">richtekstdokument</comment>
+ <comment xml:lang="de">RTF-Textdokument</comment>
+ <comment xml:lang="el">έγγραφο εμπλουτισμένου κειμένου (RTF)</comment>
+ <comment xml:lang="en_GB">rich text document</comment>
+ <comment xml:lang="eo">riĉteksta dokumento</comment>
+ <comment xml:lang="es">documento de texto enriquecido</comment>
+ <comment xml:lang="eu">aberastutako testu formatua</comment>
+ <comment xml:lang="fi">RTF-asiakirja</comment>
+ <comment xml:lang="fr">document « rich text »</comment>
+ <comment xml:lang="ga">cáipéis mhéith-théacs</comment>
+ <comment xml:lang="gl">documento do texto enriquecido</comment>
+ <comment xml:lang="he">מסמך טקסט עשיר</comment>
+ <comment xml:lang="hu">rich text-dokumentum</comment>
+ <comment xml:lang="id">dokumen teks kaya</comment>
+ <comment xml:lang="it">Documento rich text</comment>
+ <comment xml:lang="ja">リッチテキストドキュメント</comment>
+ <comment xml:lang="kk">пішімделген мәтіні бар құжаты</comment>
+ <comment xml:lang="ko">rich text 문서</comment>
+ <comment xml:lang="lt">praturtinto teksto dokumentas</comment>
+ <comment xml:lang="lv">bagātā teksta dokuments</comment>
+ <comment xml:lang="ms">Dokumen teks diperkaya</comment>
+ <comment xml:lang="nb">rik tekst-dokument</comment>
+ <comment xml:lang="nl">opgemaakt tekstdocument</comment>
+ <comment xml:lang="nn">rik tekst-dokument</comment>
+ <comment xml:lang="pl">Dokument Rich Text</comment>
+ <comment xml:lang="pt">documento em texto rico</comment>
+ <comment xml:lang="pt_BR">documento rich text</comment>
+ <comment xml:lang="ro">document text îmbogățit</comment>
+ <comment xml:lang="ru">документ с форматированным текстом</comment>
+ <comment xml:lang="sk">Textový dokument RTF</comment>
+ <comment xml:lang="sl">dokument z oblikovanim besedilom</comment>
+ <comment xml:lang="sq">Dokument rich text</comment>
+ <comment xml:lang="sr">обогаћени текстуални документ</comment>
+ <comment xml:lang="sv">RTF-textdokument</comment>
+ <comment xml:lang="uk">форматований текстовий документ</comment>
+ <comment xml:lang="vi">tài liệu văn bản có kiểu dáng (RTF)</comment>
+ <comment xml:lang="zh_CN">RTF 丰富文本文档</comment>
+ <comment xml:lang="zh_TW">豐富文字文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.rtx"/>
+ </mime-type>
+ <mime-type type="application/rss+xml">
+ <comment>RSS summary</comment>
+ <comment xml:lang="ar">ملخص RSS</comment>
+ <comment xml:lang="be@latin">Karotki ahlad RSS</comment>
+ <comment xml:lang="bg">Обобщение за сайтове — RSS</comment>
+ <comment xml:lang="ca">resum RSS</comment>
+ <comment xml:lang="cs">Souhrn RSS</comment>
+ <comment xml:lang="da">RSS-sammendrag</comment>
+ <comment xml:lang="de">RSS-Zusammenfassung</comment>
+ <comment xml:lang="en_GB">RSS summary</comment>
+ <comment xml:lang="es">resumen RSS</comment>
+ <comment xml:lang="eu">RSS laburpena</comment>
+ <comment xml:lang="fi">RSS-tiivistelmä</comment>
+ <comment xml:lang="fo">RSS samandráttur</comment>
+ <comment xml:lang="fr">résumé RSS</comment>
+ <comment xml:lang="ga">achoimre RSS</comment>
+ <comment xml:lang="gl">Resumo RSS</comment>
+ <comment xml:lang="he">תקציר RSS</comment>
+ <comment xml:lang="hu">RSS összefoglaló</comment>
+ <comment xml:lang="id">Ringkasan RSS</comment>
+ <comment xml:lang="it">Sommario RSS</comment>
+ <comment xml:lang="ja">RSS サマリ</comment>
+ <comment xml:lang="kk">RSS жинақталғаны</comment>
+ <comment xml:lang="ko">RSS 요약</comment>
+ <comment xml:lang="lt">RSS santrauka</comment>
+ <comment xml:lang="lv">RSS kopsavilkums</comment>
+ <comment xml:lang="nb">RSS-sammendrag</comment>
+ <comment xml:lang="nl">RSS-samenvatting</comment>
+ <comment xml:lang="nn">RSS-samandrag</comment>
+ <comment xml:lang="pl">Podsumowanie RSS</comment>
+ <comment xml:lang="pt_BR">Resumo RSS</comment>
+ <comment xml:lang="ro">Rezumat RSS</comment>
+ <comment xml:lang="ru">сводка RSS</comment>
+ <comment xml:lang="sk">Súhrn RSS</comment>
+ <comment xml:lang="sl">Datoteka povzetek RSS</comment>
+ <comment xml:lang="sq">Përmbledhje RSS</comment>
+ <comment xml:lang="sv">RSS-sammanfattning</comment>
+ <comment xml:lang="uk">зведення сайту RSS</comment>
+ <comment xml:lang="vi">Bản tóm tắt RSS</comment>
+ <comment xml:lang="zh_CN">RSS 摘要</comment>
+ <comment xml:lang="zh_TW">RSS 摘要</comment>
+ <acronym>RSS</acronym>
+ <expanded-acronym>RDF Site Summary</expanded-acronym>
+ <alias type="text/rss"/>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-html"/>
+ <glob pattern="*.rss"/>
+ <magic priority="70">
+ <match value="&lt;rss " type="string" offset="0:256"/>
+ <match value="&lt;RSS " type="string" offset="0:256"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/atom+xml">
+ <comment>Atom syndication feed</comment>
+ <comment xml:lang="ar">مروج تغذية Atom</comment>
+ <comment xml:lang="be@latin">Syndykacyjny kanał navinaŭ Atom</comment>
+ <comment xml:lang="bg">Емисия — Atom</comment>
+ <comment xml:lang="ca">canal de sindicació Atom</comment>
+ <comment xml:lang="cs">Kanál Atom</comment>
+ <comment xml:lang="da">Atom syndication-feed</comment>
+ <comment xml:lang="de">Atom-Nachrichtenquelle</comment>
+ <comment xml:lang="es">proveedor de noticias Atom</comment>
+ <comment xml:lang="eu">Atom harpidetze-iturria</comment>
+ <comment xml:lang="fi">Atom-yhdistevirta</comment>
+ <comment xml:lang="fr">fil de syndication Atom</comment>
+ <comment xml:lang="ga">fotha sindeacáitithe Atom</comment>
+ <comment xml:lang="gl">fonte de sindicación Atom</comment>
+ <comment xml:lang="he">הזנה דרך הרשת של Atom</comment>
+ <comment xml:lang="hu">Atom egyesítőfolyam</comment>
+ <comment xml:lang="id">Umpan sindikasi Atom</comment>
+ <comment xml:lang="it">Feed di distribuzione Atom</comment>
+ <comment xml:lang="ja">Atom 配信フィード</comment>
+ <comment xml:lang="kk">Atom жаңалықтар таспасы</comment>
+ <comment xml:lang="ko">Atom 묶음 피드</comment>
+ <comment xml:lang="lt">Atom sindikacijos kanalas</comment>
+ <comment xml:lang="lv">Atom sindikāta barotne</comment>
+ <comment xml:lang="nb">Atom syndikeringsstrøm</comment>
+ <comment xml:lang="nl">Atom-syndicatie-feed</comment>
+ <comment xml:lang="nn">Atom-kjelde</comment>
+ <comment xml:lang="pl">Kanał Atom</comment>
+ <comment xml:lang="pt_BR">Fonte de notícias Atom</comment>
+ <comment xml:lang="ro">Flux agregare Atom</comment>
+ <comment xml:lang="ru">лента новостей Atom</comment>
+ <comment xml:lang="sk">Kanál Atom</comment>
+ <comment xml:lang="sl">Sindikalni vir Atom</comment>
+ <comment xml:lang="sq">Feed për përhapje Atom</comment>
+ <comment xml:lang="sv">Atom-syndikeringskanal</comment>
+ <comment xml:lang="uk">трансляція подач Atom</comment>
+ <comment xml:lang="vi">Nguồn tin tức Atom</comment>
+ <comment xml:lang="zh_CN">Atom 更新种子</comment>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-html"/>
+ <glob pattern="*.atom"/>
+ <magic priority="70">
+ <match value="&lt;feed " type="string" offset="0:256"/>
+ </magic>
+ <root-XML namespaceURI="http://www.w3.org/2005/Atom" localName="feed"/>
+ </mime-type>
+ <mime-type type="text/x-opml+xml">
+ <comment>OPML syndication feed</comment>
+ <comment xml:lang="ar">مروج تغذية OPML</comment>
+ <comment xml:lang="be@latin">Syndykacyjny kanał OPML</comment>
+ <comment xml:lang="bg">Емисия — OPML</comment>
+ <comment xml:lang="ca">canal de sindicació OPML</comment>
+ <comment xml:lang="cs">Kanál OPML</comment>
+ <comment xml:lang="da">OPML-syndikeringsfeed</comment>
+ <comment xml:lang="de">OPML-Nachrichtenquelle</comment>
+ <comment xml:lang="es">proveedor de noticias OPML</comment>
+ <comment xml:lang="eu">OPML harpidetze-iturria</comment>
+ <comment xml:lang="fi">OPML-yhdistevirta</comment>
+ <comment xml:lang="fr">fil de syndication OPML</comment>
+ <comment xml:lang="ga">fotha sindeacáitithe OPML</comment>
+ <comment xml:lang="gl">fonte de sindicación OPML</comment>
+ <comment xml:lang="he">הזנה דרך הרשת OPML</comment>
+ <comment xml:lang="hu">OPML egyesítőfolyam</comment>
+ <comment xml:lang="id">Umpan sindikasi OPML</comment>
+ <comment xml:lang="it">Feed di distribuzione OPML</comment>
+ <comment xml:lang="ja">OPML 配信フィード</comment>
+ <comment xml:lang="kk">OPML жаңалықтар таспасы</comment>
+ <comment xml:lang="ko">OPML 묶음 feed</comment>
+ <comment xml:lang="lt">OPML sindikacijos kanalas</comment>
+ <comment xml:lang="lv">OPML sindikāta barotne</comment>
+ <comment xml:lang="nb">OPML syndikeringsstrøm</comment>
+ <comment xml:lang="nl">OPML-syndicatie-feed</comment>
+ <comment xml:lang="nn">OPML-kjelde</comment>
+ <comment xml:lang="pl">Kanał OPML</comment>
+ <comment xml:lang="pt_BR">Fonte de notícias OPML</comment>
+ <comment xml:lang="ro">Flux OPML syndication</comment>
+ <comment xml:lang="ru">лента новостей OPML</comment>
+ <comment xml:lang="sk">Kanál OPML</comment>
+ <comment xml:lang="sl">Sindikalni vir OPML</comment>
+ <comment xml:lang="sq">Feed për përhapje OPML</comment>
+ <comment xml:lang="sv">OPML-syndikeringskanal</comment>
+ <comment xml:lang="uk">трансляція подач OPML</comment>
+ <comment xml:lang="vi">Nguồn tin tức OPML</comment>
+ <comment xml:lang="zh_CN">OPML 聚合种子</comment>
+ <sub-class-of type="application/xml"/>
+ <alias type="text/x-opml"/>
+ <generic-icon name="text-html"/>
+ <glob pattern="*.opml"/>
+ <magic priority="70">
+ <match value="&lt;opml " type="string" offset="0:256"/>
+ </magic>
+ </mime-type>
+ <mime-type type="text/sgml">
+ <comment>SGML document</comment>
+ <comment xml:lang="ar">مستند SGML</comment>
+ <comment xml:lang="be@latin">Dakument SGML</comment>
+ <comment xml:lang="bg">Документ — SGML</comment>
+ <comment xml:lang="ca">document SGML</comment>
+ <comment xml:lang="cs">Dokument SGML</comment>
+ <comment xml:lang="cy">Dogfen SGML</comment>
+ <comment xml:lang="da">SGML-dokument</comment>
+ <comment xml:lang="de">SGML-Dokument</comment>
+ <comment xml:lang="el">έγγραφο SGML</comment>
+ <comment xml:lang="en_GB">SGML document</comment>
+ <comment xml:lang="eo">SGML-dokumento</comment>
+ <comment xml:lang="es">documento SGML</comment>
+ <comment xml:lang="eu">SGML dokumentua</comment>
+ <comment xml:lang="fi">SGML-asiakirja</comment>
+ <comment xml:lang="fo">SGML skjal</comment>
+ <comment xml:lang="fr">document SGML</comment>
+ <comment xml:lang="ga">cáipéis SGML</comment>
+ <comment xml:lang="gl">documento SGML</comment>
+ <comment xml:lang="he">מסמך SGML</comment>
+ <comment xml:lang="hu">SGML-dokumentum</comment>
+ <comment xml:lang="id">Dokumen SGML</comment>
+ <comment xml:lang="it">Documento SGML</comment>
+ <comment xml:lang="ja">SGML ドキュメント</comment>
+ <comment xml:lang="kk">SGML құжаты</comment>
+ <comment xml:lang="ko">SGML 문서</comment>
+ <comment xml:lang="lt">SGML dokumentas</comment>
+ <comment xml:lang="lv">SGML dokuments</comment>
+ <comment xml:lang="ms">Dokumen SGML</comment>
+ <comment xml:lang="nb">SGML-dokument</comment>
+ <comment xml:lang="nl">SGML-document</comment>
+ <comment xml:lang="nn">SGML-dokument</comment>
+ <comment xml:lang="pl">Dokument SGML</comment>
+ <comment xml:lang="pt">documento SGML</comment>
+ <comment xml:lang="pt_BR">Documento SGML</comment>
+ <comment xml:lang="ro">Document SGML</comment>
+ <comment xml:lang="ru">документ SGML</comment>
+ <comment xml:lang="sk">Dokument SGML</comment>
+ <comment xml:lang="sl">Dokument SGML</comment>
+ <comment xml:lang="sq">Dokument SGML</comment>
+ <comment xml:lang="sr">SGML документ</comment>
+ <comment xml:lang="sv">SGML-dokument</comment>
+ <comment xml:lang="uk">документ SGML</comment>
+ <comment xml:lang="vi">Tài liệu SGML</comment>
+ <comment xml:lang="zh_CN">SGML 文档</comment>
+ <comment xml:lang="zh_TW">SGML 文件</comment>
+ <acronym>SGML</acronym>
+ <expanded-acronym>Standard Generalized Markup Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.sgml"/>
+ <glob pattern="*.sgm"/>
+ </mime-type>
+ <mime-type type="text/spreadsheet">
+ <comment>spreadsheet interchange document</comment>
+ <comment xml:lang="ar">مستند تبادل الجدول</comment>
+ <comment xml:lang="be@latin">dakument dla abmienu raźlikovymi arkušami</comment>
+ <comment xml:lang="bg">Документ за обмяна между програми за електронни таблици</comment>
+ <comment xml:lang="ca">document d'intercanvi de full de càlcul</comment>
+ <comment xml:lang="cs">Sešitový přenosový dokument</comment>
+ <comment xml:lang="da">regnearksudvekslingsdokument</comment>
+ <comment xml:lang="de">Tabellenkalkulations-Austauschdokument</comment>
+ <comment xml:lang="es">documento de intercambio de hojas de cálculo</comment>
+ <comment xml:lang="eu">kalkulu-orriak trukatzeko dokumentua</comment>
+ <comment xml:lang="fi">taulukkovälitysasiakirja</comment>
+ <comment xml:lang="fo">rokniarks umbýtisskjal</comment>
+ <comment xml:lang="fr">document d'échange de feuilles de calcul</comment>
+ <comment xml:lang="ga">cáipéis idirmhalartaithe scarbhileog</comment>
+ <comment xml:lang="gl">documento de intercambio de follas de cálculo</comment>
+ <comment xml:lang="he">מסמך גליון נתונים מתחלף</comment>
+ <comment xml:lang="hu">spreadsheet-cserélhetődokumentum</comment>
+ <comment xml:lang="id">dokumen lembar sebar saling tukar</comment>
+ <comment xml:lang="it">Documento di scambio per foglio di calcolo</comment>
+ <comment xml:lang="ja">スプレッドシート交換ドキュメント</comment>
+ <comment xml:lang="kk">spreadsheet interchange құжаты</comment>
+ <comment xml:lang="ko">spreadsheet 교환 문서</comment>
+ <comment xml:lang="lt">skaičialenčių apsikeitimo dokumentas</comment>
+ <comment xml:lang="lv">izklājlapu apmaiņas dokuments</comment>
+ <comment xml:lang="nb">dokument for regnearkutveksling</comment>
+ <comment xml:lang="nl">rekenblad-uitwisselingsdocument</comment>
+ <comment xml:lang="nn">Utvekslingsdokument for rekneark</comment>
+ <comment xml:lang="pl">Dokument wymiany arkuszy kalkulacyjnych</comment>
+ <comment xml:lang="pt_BR">Documento de intercâmbio de planilhas</comment>
+ <comment xml:lang="ro">document schimb filă de calcul</comment>
+ <comment xml:lang="ru">документ Spreadsheet Interchange</comment>
+ <comment xml:lang="sk">Zošitový prenosový dokument</comment>
+ <comment xml:lang="sl">dokument izmenjeve razpredelnic</comment>
+ <comment xml:lang="sq">Dokument shkëmbimi për fletë llogaritje</comment>
+ <comment xml:lang="sv">spreadsheet interchange-dokument</comment>
+ <comment xml:lang="uk">документ обміну ел. таблицями</comment>
+ <comment xml:lang="vi">tài liệu hoán đổi bảng tính</comment>
+ <comment xml:lang="zh_CN">电子表格交换文档</comment>
+ <comment xml:lang="zh_TW">試算表交換文件</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="ID;" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.sylk"/>
+ <glob pattern="*.slk"/>
+ </mime-type>
+ <mime-type type="text/tab-separated-values">
+ <comment>TSV document</comment>
+ <comment xml:lang="ar">مستند TSV</comment>
+ <comment xml:lang="be@latin">Dakument TSV</comment>
+ <comment xml:lang="bg">Документ — TSV</comment>
+ <comment xml:lang="ca">document TSV</comment>
+ <comment xml:lang="cs">Dokument TSV</comment>
+ <comment xml:lang="da">TSV-dokument</comment>
+ <comment xml:lang="de">TSV-Dokument</comment>
+ <comment xml:lang="en_GB">TSV document</comment>
+ <comment xml:lang="es">documento TSV</comment>
+ <comment xml:lang="eu">TSV dokumentua</comment>
+ <comment xml:lang="fi">TSV-asiakirja</comment>
+ <comment xml:lang="fo">TSV skjal</comment>
+ <comment xml:lang="fr">document TSV</comment>
+ <comment xml:lang="ga">cáipéis TSV</comment>
+ <comment xml:lang="gl">documento TSV</comment>
+ <comment xml:lang="he">מסמך TSV</comment>
+ <comment xml:lang="hu">TSV dokumentum</comment>
+ <comment xml:lang="id">Dokumen TSV</comment>
+ <comment xml:lang="it">Documento TSV</comment>
+ <comment xml:lang="ja">TSV ドキュメント</comment>
+ <comment xml:lang="kk">TSV құжаты</comment>
+ <comment xml:lang="ko">TSV 문서</comment>
+ <comment xml:lang="lt">TSV dokumentas</comment>
+ <comment xml:lang="lv">TSV dokuments</comment>
+ <comment xml:lang="nb">TSV-dokument</comment>
+ <comment xml:lang="nl">TSV-document</comment>
+ <comment xml:lang="nn">TSV-dokument</comment>
+ <comment xml:lang="pl">Dokument TSV</comment>
+ <comment xml:lang="pt_BR">Documento TSV</comment>
+ <comment xml:lang="ro">Document TSV</comment>
+ <comment xml:lang="ru">документ TSV</comment>
+ <comment xml:lang="sk">Dokument TSV</comment>
+ <comment xml:lang="sl">Dokument TSV</comment>
+ <comment xml:lang="sq">Dokument TSV</comment>
+ <comment xml:lang="sv">TSV-dokument</comment>
+ <comment xml:lang="uk">документ TSV</comment>
+ <comment xml:lang="vi">Tài liệu TSV</comment>
+ <comment xml:lang="zh_CN">TSV 文档</comment>
+ <comment xml:lang="zh_TW">TSV 文件</comment>
+ <acronym>TSV</acronym>
+ <expanded-acronym>Tab Separated Values</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.tsv"/>
+ </mime-type>
+ <mime-type type="text/vnd.graphviz">
+ <comment>Graphviz DOT graph</comment>
+ <comment xml:lang="ar">مبيان Graphviz DOT</comment>
+ <comment xml:lang="bg">Граф — Graphviz DOT</comment>
+ <comment xml:lang="ca">gràfic Graphviz DOT</comment>
+ <comment xml:lang="cs">Graf Graphviz DOT</comment>
+ <comment xml:lang="da">Graphviz DOT-graf</comment>
+ <comment xml:lang="de">Graphviz-DOT-Graph</comment>
+ <comment xml:lang="es">gráfico Graphviz DOT</comment>
+ <comment xml:lang="eu">Graphviz DOT grafikoa</comment>
+ <comment xml:lang="fi">Graphviz DOT -graafi</comment>
+ <comment xml:lang="fo">Graphviz DOT ritmynd</comment>
+ <comment xml:lang="fr">graphe Graphviz DOT</comment>
+ <comment xml:lang="ga">graf DOT Graphviz</comment>
+ <comment xml:lang="gl">gráfica DOT de Graphviz</comment>
+ <comment xml:lang="he">גרף של Graphviz DOT</comment>
+ <comment xml:lang="hu">Graphviz DOT-grafikon</comment>
+ <comment xml:lang="id">Grafik Graphviz DOT</comment>
+ <comment xml:lang="it">Grafico Graphviz DOT</comment>
+ <comment xml:lang="ja">Graphviz DOT グラフ</comment>
+ <comment xml:lang="kk">Graphviz DOT сызбасы</comment>
+ <comment xml:lang="ko">Graphviz DOT 그래프</comment>
+ <comment xml:lang="lt">Graphviz DOT diagrama</comment>
+ <comment xml:lang="lv">Graphviz DOT grafiks</comment>
+ <comment xml:lang="nl">Graphviz wetenschappelijke grafiek</comment>
+ <comment xml:lang="pl">Wykres DOT Graphviz</comment>
+ <comment xml:lang="pt_BR">Gráfico do Graphviz DOT</comment>
+ <comment xml:lang="ro">Grafic Graphviz DOT</comment>
+ <comment xml:lang="ru">Диаграмма Graphviz DOT</comment>
+ <comment xml:lang="sk">Graf Graphviz DOT</comment>
+ <comment xml:lang="sl">Datoteka grafikona Graphviz DOT</comment>
+ <comment xml:lang="sv">Graphviz DOT-graf</comment>
+ <comment xml:lang="uk">граф DOT Graphviz</comment>
+ <comment xml:lang="vi">Biểu đồ DOT Graphviz</comment>
+ <comment xml:lang="zh_CN">Graphviz DOT 科学图形</comment>
+ <comment xml:lang="zh_TW">Graphviz DOT 圖</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="digraph " type="string" offset="0"/>
+ <match value="strict digraph " type="string" offset="0"/>
+ <match value="graph " type="string" offset="0"/>
+ <match value="strict graph " type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.gv"/>
+ <glob pattern="*.dot"/>
+ </mime-type>
+ <mime-type type="text/vnd.sun.j2me.app-descriptor">
+ <comment>JAD document</comment>
+ <comment xml:lang="ar">مستند JAD</comment>
+ <comment xml:lang="be@latin">Dakument JAD</comment>
+ <comment xml:lang="bg">Документ — JAD</comment>
+ <comment xml:lang="ca">document JAD</comment>
+ <comment xml:lang="cs">Dokument JAD</comment>
+ <comment xml:lang="da">JAD-dokument</comment>
+ <comment xml:lang="de">JAD-Dokument</comment>
+ <comment xml:lang="eo">JAD-dokumento</comment>
+ <comment xml:lang="es">documento JAD</comment>
+ <comment xml:lang="eu">JAD dokumentua</comment>
+ <comment xml:lang="fi">JAD-asiakirja</comment>
+ <comment xml:lang="fo">JAD skjal</comment>
+ <comment xml:lang="fr">document JAD</comment>
+ <comment xml:lang="ga">cáipéis JAD</comment>
+ <comment xml:lang="gl">documento JAD</comment>
+ <comment xml:lang="he">מסמך JAD</comment>
+ <comment xml:lang="hu">JAD dokumentum</comment>
+ <comment xml:lang="id">Dokumen JAD</comment>
+ <comment xml:lang="it">Documento JAD</comment>
+ <comment xml:lang="ja">JAD ドキュメント</comment>
+ <comment xml:lang="kk">JAD құжаты</comment>
+ <comment xml:lang="ko">JAD 문서</comment>
+ <comment xml:lang="lt">JAD dokumentas</comment>
+ <comment xml:lang="lv">JAD dokuments</comment>
+ <comment xml:lang="nb">JAD-dokument</comment>
+ <comment xml:lang="nl">JAD-document</comment>
+ <comment xml:lang="nn">JAD-dokument</comment>
+ <comment xml:lang="pl">Dokument JAD</comment>
+ <comment xml:lang="pt_BR">Documento JAD</comment>
+ <comment xml:lang="ro">Document JAD</comment>
+ <comment xml:lang="ru">документ JAD</comment>
+ <comment xml:lang="sk">Dokument JAD</comment>
+ <comment xml:lang="sl">Dokument JAD</comment>
+ <comment xml:lang="sq">Dokument JAD</comment>
+ <comment xml:lang="sv">JAD-dokument</comment>
+ <comment xml:lang="uk">документ JAD</comment>
+ <comment xml:lang="vi">Tài liệu JAD</comment>
+ <comment xml:lang="zh_CN">JAD 文档</comment>
+ <comment xml:lang="zh_TW">JAD 文件</comment>
+ <acronym>JAD</acronym>
+ <expanded-acronym>Java Application Descriptor</expanded-acronym>
+ <magic priority="50">
+ <match value="MIDlet-" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.jad"/>
+ </mime-type>
+ <mime-type type="text/vnd.wap.wml">
+ <comment>WML document</comment>
+ <comment xml:lang="ar">مستند WML</comment>
+ <comment xml:lang="az">WML sənədi</comment>
+ <comment xml:lang="be@latin">Dakument WML</comment>
+ <comment xml:lang="bg">Документ — WML</comment>
+ <comment xml:lang="ca">document WML</comment>
+ <comment xml:lang="cs">Dokument WML</comment>
+ <comment xml:lang="cy">Dogfen WML</comment>
+ <comment xml:lang="da">WML-dokument</comment>
+ <comment xml:lang="de">WML-Dokument</comment>
+ <comment xml:lang="el">έγγραφο WML</comment>
+ <comment xml:lang="en_GB">WML document</comment>
+ <comment xml:lang="eo">WML-dokumento</comment>
+ <comment xml:lang="es">documento WML</comment>
+ <comment xml:lang="eu">WML dokumentua</comment>
+ <comment xml:lang="fi">WML-asiakirja</comment>
+ <comment xml:lang="fo">WML skjal</comment>
+ <comment xml:lang="fr">document WML</comment>
+ <comment xml:lang="ga">cáipéis WML</comment>
+ <comment xml:lang="gl">documento WML</comment>
+ <comment xml:lang="he">מסמך WML</comment>
+ <comment xml:lang="hu">WML-dokumentum</comment>
+ <comment xml:lang="id">Dokumen WML</comment>
+ <comment xml:lang="it">Documento WML</comment>
+ <comment xml:lang="ja">WML ドキュメント</comment>
+ <comment xml:lang="kk">WML құжаты</comment>
+ <comment xml:lang="ko">WML 문서</comment>
+ <comment xml:lang="lt">WML dokumentas</comment>
+ <comment xml:lang="lv">WML dokuments</comment>
+ <comment xml:lang="ms">Dokumen XML</comment>
+ <comment xml:lang="nb">WML-dokument</comment>
+ <comment xml:lang="nl">WML-document</comment>
+ <comment xml:lang="nn">WML-dokument</comment>
+ <comment xml:lang="pl">Dokument WML</comment>
+ <comment xml:lang="pt">documento WML</comment>
+ <comment xml:lang="pt_BR">Documento WML</comment>
+ <comment xml:lang="ro">Document WML</comment>
+ <comment xml:lang="ru">документ WML</comment>
+ <comment xml:lang="sk">Dokument WML</comment>
+ <comment xml:lang="sl">Dokument WML</comment>
+ <comment xml:lang="sq">Dokument WML</comment>
+ <comment xml:lang="sr">WML документ</comment>
+ <comment xml:lang="sv">WML-dokument</comment>
+ <comment xml:lang="uk">документ WML</comment>
+ <comment xml:lang="vi">Tài liệu WML</comment>
+ <comment xml:lang="zh_CN">WML 文档</comment>
+ <comment xml:lang="zh_TW">WML 文件</comment>
+ <acronym>WML</acronym>
+ <expanded-acronym>Wireless Markup Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.wml"/>
+ </mime-type>
+ <mime-type type="text/vnd.wap.wmlscript">
+ <comment>WMLScript program</comment>
+ <comment xml:lang="ar">برنامج WMLScript</comment>
+ <comment xml:lang="be@latin">Prahrama WMLScript</comment>
+ <comment xml:lang="bg">Програма — WMLScript</comment>
+ <comment xml:lang="ca">programa WMLScript</comment>
+ <comment xml:lang="cs">Program WMLScript</comment>
+ <comment xml:lang="da">WMLScript-program</comment>
+ <comment xml:lang="de">WMLScript-Programm</comment>
+ <comment xml:lang="es">programa en WMLScript</comment>
+ <comment xml:lang="eu">WMLScript programa</comment>
+ <comment xml:lang="fi">WMLScript-ohjelma</comment>
+ <comment xml:lang="fo">WMLScript forrit</comment>
+ <comment xml:lang="fr">programme WMLScript</comment>
+ <comment xml:lang="ga">ríomhchlár WMLScript</comment>
+ <comment xml:lang="gl">programa en WMLScript</comment>
+ <comment xml:lang="he">תוכנית של WMLScript</comment>
+ <comment xml:lang="hu">WMLScript program</comment>
+ <comment xml:lang="id">Program WMLScript</comment>
+ <comment xml:lang="it">Programma WMLScript</comment>
+ <comment xml:lang="ja">WMLScript プログラム</comment>
+ <comment xml:lang="kk">WMLScript бағдарламасы</comment>
+ <comment xml:lang="ko">WML스크립트 프로그램</comment>
+ <comment xml:lang="lt">WMLScript programa</comment>
+ <comment xml:lang="lv">WMLScript programma</comment>
+ <comment xml:lang="nb">WMLScript-program</comment>
+ <comment xml:lang="nl">WMLScript-programma</comment>
+ <comment xml:lang="nn">WMLScript-program</comment>
+ <comment xml:lang="pl">Pogram WMLScript</comment>
+ <comment xml:lang="pt_BR">Programa WMLScript</comment>
+ <comment xml:lang="ro">Program WMLScript</comment>
+ <comment xml:lang="ru">сценарий WMLScript</comment>
+ <comment xml:lang="sk">Program WMLScript</comment>
+ <comment xml:lang="sl">Programska datoteka WMLScript</comment>
+ <comment xml:lang="sq">Program WMLScript</comment>
+ <comment xml:lang="sv">WMLScript-program</comment>
+ <comment xml:lang="uk">програма мовою WMLScript</comment>
+ <comment xml:lang="vi">Chương trình WMLScript</comment>
+ <comment xml:lang="zh_CN">WMLScript 程序</comment>
+ <comment xml:lang="zh_TW">WMLScript 程式</comment>
+ <glob pattern="*.wmls"/>
+ </mime-type>
+ <mime-type type="application/x-ace">
+ <comment>ACE archive</comment>
+ <comment xml:lang="ar">أرشيف ACE</comment>
+ <comment xml:lang="be@latin">Archiŭ ACE</comment>
+ <comment xml:lang="bg">Архив — ACE</comment>
+ <comment xml:lang="ca">arxiu ACE</comment>
+ <comment xml:lang="cs">Archiv ACE</comment>
+ <comment xml:lang="da">ACE-arkiv</comment>
+ <comment xml:lang="de">ACE-Archiv</comment>
+ <comment xml:lang="eo">ACE-arkivo</comment>
+ <comment xml:lang="es">archivador ACE</comment>
+ <comment xml:lang="eu">ACE artxiboa</comment>
+ <comment xml:lang="fi">ACE-arkisto</comment>
+ <comment xml:lang="fo">ACE skjalasavn</comment>
+ <comment xml:lang="fr">archive ACE</comment>
+ <comment xml:lang="ga">cartlann ACE</comment>
+ <comment xml:lang="gl">arquivo ACE</comment>
+ <comment xml:lang="he">ארכיון ACE</comment>
+ <comment xml:lang="hu">ACE archívum</comment>
+ <comment xml:lang="id">Arsip ACE</comment>
+ <comment xml:lang="it">Archivio ACE</comment>
+ <comment xml:lang="ja">ACE アーカイブ</comment>
+ <comment xml:lang="kk">ACE архиві</comment>
+ <comment xml:lang="ko">ACE 묶음 파일</comment>
+ <comment xml:lang="lt">ACE archyvas</comment>
+ <comment xml:lang="lv">ACE arhīvs</comment>
+ <comment xml:lang="nb">ACE-arkiv</comment>
+ <comment xml:lang="nl">ACE-archief</comment>
+ <comment xml:lang="nn">ACE-arkiv</comment>
+ <comment xml:lang="pl">Archiwum ACE</comment>
+ <comment xml:lang="pt_BR">Pacote ACE</comment>
+ <comment xml:lang="ro">Arhivă ACE</comment>
+ <comment xml:lang="ru">архив ACE</comment>
+ <comment xml:lang="sk">Archív ACE</comment>
+ <comment xml:lang="sl">Datoteka arhiva ACE</comment>
+ <comment xml:lang="sq">Arkiv ACE</comment>
+ <comment xml:lang="sv">ACE-arkiv</comment>
+ <comment xml:lang="uk">архів ACE</comment>
+ <comment xml:lang="vi">Kho nén ACE</comment>
+ <comment xml:lang="zh_CN">ACE 归档文件</comment>
+ <comment xml:lang="zh_TW">ACE 封存檔</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="**ACE**" type="string" offset="7"/>
+ </magic>
+ <glob pattern="*.ace"/>
+ </mime-type>
+ <mime-type type="text/x-adasrc">
+ <comment>Ada source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Ada</comment>
+ <comment xml:lang="be@latin">Kryničny kod Ada</comment>
+ <comment xml:lang="bg">Изходен код — Ada</comment>
+ <comment xml:lang="ca">codi font en Ada</comment>
+ <comment xml:lang="cs">Zdrojový kód v Adě</comment>
+ <comment xml:lang="da">Ada-kildekode</comment>
+ <comment xml:lang="de">Ada-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Ada</comment>
+ <comment xml:lang="en_GB">Ada source code</comment>
+ <comment xml:lang="eo">Ada-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Ada</comment>
+ <comment xml:lang="eu">Ada iturburu-kodea</comment>
+ <comment xml:lang="fi">Ada-lähdekoodi</comment>
+ <comment xml:lang="fo">Ada keldukota</comment>
+ <comment xml:lang="fr">code source Ada</comment>
+ <comment xml:lang="ga">cód foinseach Ada</comment>
+ <comment xml:lang="gl">código fonte en Ada</comment>
+ <comment xml:lang="he">קוד מקור Ada</comment>
+ <comment xml:lang="hu">Ada-forráskód</comment>
+ <comment xml:lang="id">Kode program Ada</comment>
+ <comment xml:lang="it">Codice sorgente Ada</comment>
+ <comment xml:lang="ja">Ada ソースコード</comment>
+ <comment xml:lang="kk">Ada бастапқы коды</comment>
+ <comment xml:lang="ko">Ada 소스 코드</comment>
+ <comment xml:lang="lt">Ada pradinis kodas</comment>
+ <comment xml:lang="lv">Ada pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Ada</comment>
+ <comment xml:lang="nb">Ada-kildekode</comment>
+ <comment xml:lang="nl">Ada-broncode</comment>
+ <comment xml:lang="nn">Ada-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Ada</comment>
+ <comment xml:lang="pt">código fonte Ada</comment>
+ <comment xml:lang="pt_BR">Código fonte Ada</comment>
+ <comment xml:lang="ro">Cod sursă Ada</comment>
+ <comment xml:lang="ru">исходный код Ada</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka Ada</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Ada</comment>
+ <comment xml:lang="sq">Kod burues Ada</comment>
+ <comment xml:lang="sr">Ада изворни ко̂д</comment>
+ <comment xml:lang="sv">Ada-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Ada</comment>
+ <comment xml:lang="vi">Mã nguồn Ada</comment>
+ <comment xml:lang="zh_CN">Ada 源代码</comment>
+ <comment xml:lang="zh_TW">Ada 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.adb"/>
+ <glob pattern="*.ads"/>
+ </mime-type>
+ <mime-type type="text/x-authors">
+ <comment>author list</comment>
+ <comment xml:lang="ar">لائحة المؤلف</comment>
+ <comment xml:lang="be@latin">śpis aŭtaraŭ</comment>
+ <comment xml:lang="bg">Списък на авторите</comment>
+ <comment xml:lang="ca">llista d'autors</comment>
+ <comment xml:lang="cs">Seznam autorů</comment>
+ <comment xml:lang="da">forfatterliste</comment>
+ <comment xml:lang="de">Autorenliste</comment>
+ <comment xml:lang="el">κατάλογος συγγραφέων</comment>
+ <comment xml:lang="en_GB">author list</comment>
+ <comment xml:lang="eo">listo de aŭtoroj</comment>
+ <comment xml:lang="es">lista de autores</comment>
+ <comment xml:lang="eu">egile-zerrenda</comment>
+ <comment xml:lang="fi">tekijäluettelo</comment>
+ <comment xml:lang="fo">høvundalisti</comment>
+ <comment xml:lang="fr">liste d'auteurs</comment>
+ <comment xml:lang="ga">liosta údar</comment>
+ <comment xml:lang="gl">lista de autores</comment>
+ <comment xml:lang="he">רשימת יוצרים</comment>
+ <comment xml:lang="hu">szerzőlista</comment>
+ <comment xml:lang="id">senarai penulis</comment>
+ <comment xml:lang="it">Elenco autori</comment>
+ <comment xml:lang="ja">著者リスト</comment>
+ <comment xml:lang="kk">авторлар тізімі</comment>
+ <comment xml:lang="ko">저자 목록</comment>
+ <comment xml:lang="lt">autorių sąrašas</comment>
+ <comment xml:lang="lv">autoru saraksts</comment>
+ <comment xml:lang="ms">Senarai penulis</comment>
+ <comment xml:lang="nb">forfatterliste</comment>
+ <comment xml:lang="nl">auteurslijst</comment>
+ <comment xml:lang="nn">forfattarliste</comment>
+ <comment xml:lang="pl">Lista autorów</comment>
+ <comment xml:lang="pt">lista de autores</comment>
+ <comment xml:lang="pt_BR">lista de autores</comment>
+ <comment xml:lang="ro">listă autori</comment>
+ <comment xml:lang="ru">список авторов</comment>
+ <comment xml:lang="sk">Zoznam autorov</comment>
+ <comment xml:lang="sl">seznam avtorjev</comment>
+ <comment xml:lang="sq">Lista e autorëve</comment>
+ <comment xml:lang="sr">списак аутора</comment>
+ <comment xml:lang="sv">författarlista</comment>
+ <comment xml:lang="uk">перелік авторів</comment>
+ <comment xml:lang="vi">danh sách tác giả</comment>
+ <comment xml:lang="zh_CN">作者列表</comment>
+ <comment xml:lang="zh_TW">作者清單</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="AUTHORS"/>
+ </mime-type>
+ <mime-type type="text/x-bibtex">
+ <comment>BibTeX document</comment>
+ <comment xml:lang="ar">مستند BibTeX</comment>
+ <comment xml:lang="be@latin">Dakument BibTeX</comment>
+ <comment xml:lang="bg">Документ — BibTeX</comment>
+ <comment xml:lang="ca">document BibTeX</comment>
+ <comment xml:lang="cs">Dokument BibTeX</comment>
+ <comment xml:lang="da">BibTeX-dokument</comment>
+ <comment xml:lang="de">BibTeX-Dokument</comment>
+ <comment xml:lang="en_GB">BibTeX document</comment>
+ <comment xml:lang="eo">BibTeX-dokumento</comment>
+ <comment xml:lang="es">documento BibTeX</comment>
+ <comment xml:lang="eu">BibTeX dokumentua</comment>
+ <comment xml:lang="fi">BibTeX-asiakirja</comment>
+ <comment xml:lang="fo">BibTeX skjal</comment>
+ <comment xml:lang="fr">document BibTeX</comment>
+ <comment xml:lang="ga">cáipéis BibTeX</comment>
+ <comment xml:lang="gl">documento BibTex</comment>
+ <comment xml:lang="he">מסמך BibTeX</comment>
+ <comment xml:lang="hu">BibTeX dokumentum</comment>
+ <comment xml:lang="id">Dokumen BibTeX</comment>
+ <comment xml:lang="it">Documento BibTeX</comment>
+ <comment xml:lang="ja">BibTeX ドキュメント</comment>
+ <comment xml:lang="kk">BibTeX құжаты</comment>
+ <comment xml:lang="ko">BibTeX 문서</comment>
+ <comment xml:lang="lt">BibTeX dokumentas</comment>
+ <comment xml:lang="lv">BibTeX dokuments</comment>
+ <comment xml:lang="nb">BibTeX-dokument</comment>
+ <comment xml:lang="nl">BibTeX-document</comment>
+ <comment xml:lang="nn">BibTeX-dokument</comment>
+ <comment xml:lang="pl">Dokument BibTeX</comment>
+ <comment xml:lang="pt_BR">Documento BibTeX</comment>
+ <comment xml:lang="ro">Document BibTeX</comment>
+ <comment xml:lang="ru">документ BibTeX</comment>
+ <comment xml:lang="sk">Dokument BibTeX</comment>
+ <comment xml:lang="sl">Dokument BibTeX</comment>
+ <comment xml:lang="sq">Dokument BibTeX</comment>
+ <comment xml:lang="sv">BibTeX-dokument</comment>
+ <comment xml:lang="uk">документ BibTeX</comment>
+ <comment xml:lang="vi">Tài liệu BibTeX</comment>
+ <comment xml:lang="zh_CN">BibTeX 文档</comment>
+ <comment xml:lang="zh_TW">BibTeX 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
+ <match value="% This file was created with JabRef" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.bib"/>
+ </mime-type>
+ <mime-type type="text/x-c++hdr">
+ <comment>C++ header</comment>
+ <comment xml:lang="ar">ترويسة سي++</comment>
+ <comment xml:lang="be@latin">Zahałoŭny fajł C++</comment>
+ <comment xml:lang="bg">Заглавен файл — C++</comment>
+ <comment xml:lang="ca">capçalera en C++</comment>
+ <comment xml:lang="cs">Záhlaví v C++</comment>
+ <comment xml:lang="da">C++-posthoved</comment>
+ <comment xml:lang="de">C++-Header</comment>
+ <comment xml:lang="en_GB">C++ header</comment>
+ <comment xml:lang="es">cabecera de código fuente en C++</comment>
+ <comment xml:lang="eu">C++ goiburua</comment>
+ <comment xml:lang="fi">C++-otsake</comment>
+ <comment xml:lang="fo">C++ tekshøvd</comment>
+ <comment xml:lang="fr">en-tête C++</comment>
+ <comment xml:lang="ga">ceanntásc C++</comment>
+ <comment xml:lang="gl">cabeceira de código fonte en C++</comment>
+ <comment xml:lang="he">כותר ++C</comment>
+ <comment xml:lang="hu">C++ fejléc</comment>
+ <comment xml:lang="id">Tajuk C++</comment>
+ <comment xml:lang="it">Header C++</comment>
+ <comment xml:lang="ja">C++ ヘッダー</comment>
+ <comment xml:lang="kk">C++ тақырыптама файлы</comment>
+ <comment xml:lang="ko">C++ 헤더</comment>
+ <comment xml:lang="lt">C++ antraštė</comment>
+ <comment xml:lang="lv">C++ galvene</comment>
+ <comment xml:lang="nb">C++-kildekodeheader</comment>
+ <comment xml:lang="nl">C++-header</comment>
+ <comment xml:lang="nn">C++-kjeldekode-hovud</comment>
+ <comment xml:lang="pl">Plik nagłówkowy C++</comment>
+ <comment xml:lang="pt_BR">Cabeçalho C++</comment>
+ <comment xml:lang="ro">Antet C++</comment>
+ <comment xml:lang="ru">заголовочный файл C++</comment>
+ <comment xml:lang="sk">Hlavičky jazyka C++</comment>
+ <comment xml:lang="sl">Datoteka glave C++</comment>
+ <comment xml:lang="sq">Header C++</comment>
+ <comment xml:lang="sv">C++-huvud</comment>
+ <comment xml:lang="uk">файл заголовків мовою C++</comment>
+ <comment xml:lang="vi">Phần đầu mã nguồn C++</comment>
+ <comment xml:lang="zh_CN">C++ 源代码头文件</comment>
+ <comment xml:lang="zh_TW">C++ 標頭檔</comment>
+ <sub-class-of type="text/x-chdr"/>
+ <glob pattern="*.hh"/>
+ <glob pattern="*.hp"/>
+ <glob pattern="*.hpp"/>
+ <glob pattern="*.h++"/>
+ <glob pattern="*.hxx"/>
+ </mime-type>
+ <mime-type type="text/x-c++src">
+ <comment>C++ source code</comment>
+ <comment xml:lang="ar">شفرة مصدر سي++</comment>
+ <comment xml:lang="be@latin">Kryničny kod C++</comment>
+ <comment xml:lang="bg">Изходен код — C++</comment>
+ <comment xml:lang="ca">codi font en C++</comment>
+ <comment xml:lang="cs">Zdrojový kód v C++</comment>
+ <comment xml:lang="da">C++-kildekode</comment>
+ <comment xml:lang="de">C++-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας C++</comment>
+ <comment xml:lang="en_GB">C++ source code</comment>
+ <comment xml:lang="eo">C++-fontkodo</comment>
+ <comment xml:lang="es">código fuente en C++</comment>
+ <comment xml:lang="eu">C++ iturburu-kodea</comment>
+ <comment xml:lang="fi">C++-lähdekoodi</comment>
+ <comment xml:lang="fo">C++ keldukota</comment>
+ <comment xml:lang="fr">code source C++</comment>
+ <comment xml:lang="ga">cód foinseach C++</comment>
+ <comment xml:lang="gl">código fonte de C++</comment>
+ <comment xml:lang="he">קוד מקור של C++</comment>
+ <comment xml:lang="hu">C++-forráskód</comment>
+ <comment xml:lang="id">Kode program C++</comment>
+ <comment xml:lang="it">Codice sorgente C++</comment>
+ <comment xml:lang="ja">C++ ソースコード</comment>
+ <comment xml:lang="kk">C++ бастапқы коды</comment>
+ <comment xml:lang="ko">C++ 소스 코드</comment>
+ <comment xml:lang="lt">C++ pradinis kodas</comment>
+ <comment xml:lang="lv">C++ pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber C++</comment>
+ <comment xml:lang="nb">C++-kildekode</comment>
+ <comment xml:lang="nl">C++-broncode</comment>
+ <comment xml:lang="nn">C++-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy C++</comment>
+ <comment xml:lang="pt">código fonte C++</comment>
+ <comment xml:lang="pt_BR">Código fonte C++</comment>
+ <comment xml:lang="ro">Cod sursă C++</comment>
+ <comment xml:lang="ru">исходный код C++</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka C++</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode C++</comment>
+ <comment xml:lang="sq">Kod burues C++</comment>
+ <comment xml:lang="sr">C++ изворни ко̂д</comment>
+ <comment xml:lang="sv">C++-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою C++</comment>
+ <comment xml:lang="vi">Mã nguồn C++</comment>
+ <comment xml:lang="zh_CN">C++ 源代码</comment>
+ <comment xml:lang="zh_TW">C++ 源代碼</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.cpp"/>
+ <glob pattern="*.cxx"/>
+ <glob pattern="*.cc"/>
+ <glob pattern="*.C" case-sensitive="true"/>
+ <glob pattern="*.c++"/>
+ </mime-type>
+ <mime-type type="text/x-changelog">
+ <comment>ChangeLog document</comment>
+ <comment xml:lang="ar">مستند ChangeLog</comment>
+ <comment xml:lang="be@latin">Dakument zafiksavanych źmienaŭ ChangeLog</comment>
+ <comment xml:lang="bg">Дневник за промени — ChangeLog</comment>
+ <comment xml:lang="ca">document de registre de canvis</comment>
+ <comment xml:lang="cs">Dokument ChangeLog</comment>
+ <comment xml:lang="da">ChangeLot-dokument</comment>
+ <comment xml:lang="de">Änderungsprotokoll</comment>
+ <comment xml:lang="en_GB">ChangeLog document</comment>
+ <comment xml:lang="es">documento de cambios</comment>
+ <comment xml:lang="eu">ChangeLog dokumentua</comment>
+ <comment xml:lang="fi">Muutoslokiasiakirja</comment>
+ <comment xml:lang="fo">ChangeLog skjal</comment>
+ <comment xml:lang="fr">document ChangeLog</comment>
+ <comment xml:lang="ga">cáipéis ChangeLog</comment>
+ <comment xml:lang="gl">documento Changelog</comment>
+ <comment xml:lang="he">מסמך של ChangeLog</comment>
+ <comment xml:lang="hu">ChangeLog dokumentum</comment>
+ <comment xml:lang="id">Dokumen ChangeLog</comment>
+ <comment xml:lang="it">Documento ChangeLog</comment>
+ <comment xml:lang="ja">ChangeLog ドキュメント</comment>
+ <comment xml:lang="kk">ChangeLog құжаты</comment>
+ <comment xml:lang="ko">ChangeLog 문서</comment>
+ <comment xml:lang="lt">ChangeLog dokumentas</comment>
+ <comment xml:lang="lv">ChangeLog dokuments</comment>
+ <comment xml:lang="nb">ChangeLog-dokument</comment>
+ <comment xml:lang="nl">ChangeLog-document</comment>
+ <comment xml:lang="nn">ChangeLog-dokument</comment>
+ <comment xml:lang="pl">Dokument zmian (ChangeLog)</comment>
+ <comment xml:lang="pt_BR">Documento ChangeLog</comment>
+ <comment xml:lang="ro">Document ChangeLog</comment>
+ <comment xml:lang="ru">протокол изменений</comment>
+ <comment xml:lang="sk">Dokument ChangeLog</comment>
+ <comment xml:lang="sl">Dokument ChangeLog</comment>
+ <comment xml:lang="sq">Dokument ChangeLog</comment>
+ <comment xml:lang="sv">Ändringsloggsdokument</comment>
+ <comment xml:lang="uk">документ ChangeLog</comment>
+ <comment xml:lang="vi">Tài liệu ChangeLog (ghi lưu thay đổi)</comment>
+ <comment xml:lang="zh_CN">变更日志文档</comment>
+ <comment xml:lang="zh_TW">ChangeLog 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="ChangeLog"/>
+ </mime-type>
+ <mime-type type="text/x-chdr">
+ <comment>C header</comment>
+ <comment xml:lang="ar">ترويسة C</comment>
+ <comment xml:lang="be@latin">Zahałoŭny fajł C</comment>
+ <comment xml:lang="bg">Заглавен файл — C</comment>
+ <comment xml:lang="ca">capçalera en C</comment>
+ <comment xml:lang="cs">Záhlaví v C</comment>
+ <comment xml:lang="da">C-posthoved</comment>
+ <comment xml:lang="de">C-Header</comment>
+ <comment xml:lang="en_GB">C header</comment>
+ <comment xml:lang="es">cabecera de código fuente en C</comment>
+ <comment xml:lang="eu">C goiburua</comment>
+ <comment xml:lang="fi">C-otsake</comment>
+ <comment xml:lang="fo">C tekshøvd</comment>
+ <comment xml:lang="fr">en-tête C</comment>
+ <comment xml:lang="ga">ceanntásc C</comment>
+ <comment xml:lang="gl">cabeceira de códifo fonte de C</comment>
+ <comment xml:lang="he">כותר C</comment>
+ <comment xml:lang="hu">C fejléc</comment>
+ <comment xml:lang="id">Tajuk C</comment>
+ <comment xml:lang="it">Header C</comment>
+ <comment xml:lang="ja">C ヘッダー</comment>
+ <comment xml:lang="kk">C тақырыптама файлы</comment>
+ <comment xml:lang="ko">C 헤더</comment>
+ <comment xml:lang="lt">C antraštė</comment>
+ <comment xml:lang="lv">C galvene</comment>
+ <comment xml:lang="nb">C-kildekodeheader</comment>
+ <comment xml:lang="nl">C-header</comment>
+ <comment xml:lang="nn">C-kjeldekode-hovud</comment>
+ <comment xml:lang="pl">Plik nagłówkowy C</comment>
+ <comment xml:lang="pt_BR">Cabeçalho C</comment>
+ <comment xml:lang="ro">Antet C</comment>
+ <comment xml:lang="ru">заголовочный файл C</comment>
+ <comment xml:lang="sk">Hlavičky jazyka C</comment>
+ <comment xml:lang="sl">Datoteka glave C</comment>
+ <comment xml:lang="sq">Header C</comment>
+ <comment xml:lang="sv">C-huvud</comment>
+ <comment xml:lang="uk">файл заголовків мовою C</comment>
+ <comment xml:lang="vi">Phần đầu mã nguồn C</comment>
+ <comment xml:lang="zh_CN">C 程序头文件</comment>
+ <comment xml:lang="zh_TW">C 標頭檔</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.h"/>
+ </mime-type>
+ <mime-type type="text/x-cmake">
+ <comment>CMake source code</comment>
+ <comment xml:lang="ar">شفرة مصدر CMake</comment>
+ <comment xml:lang="be@latin">Kryničny kod CMake</comment>
+ <comment xml:lang="bg">Изходен код — CMake</comment>
+ <comment xml:lang="ca">codi font en CMake</comment>
+ <comment xml:lang="cs">Zdrojový kód CMake</comment>
+ <comment xml:lang="da">CMake-kildekode</comment>
+ <comment xml:lang="de">CMake-Quelltext</comment>
+ <comment xml:lang="eo">CMake-fontkodo</comment>
+ <comment xml:lang="es">código fuente en CMake</comment>
+ <comment xml:lang="eu">CMake iturburu-kodea</comment>
+ <comment xml:lang="fi">CMake-lähdekoodi</comment>
+ <comment xml:lang="fo">CMake keldukota</comment>
+ <comment xml:lang="fr">code source CMake</comment>
+ <comment xml:lang="ga">cód foinseach CMake</comment>
+ <comment xml:lang="gl">código fonte de CMake</comment>
+ <comment xml:lang="he">קוד מקור של CMake</comment>
+ <comment xml:lang="hu">CMake-forráskód</comment>
+ <comment xml:lang="id">Kode program CMake</comment>
+ <comment xml:lang="it">Codice sorgente CMake</comment>
+ <comment xml:lang="ja">CMake ソースコード</comment>
+ <comment xml:lang="kk">CMake бастапқы коды</comment>
+ <comment xml:lang="ko">CMake 소스 코드</comment>
+ <comment xml:lang="lt">CMake pirminis tekstas</comment>
+ <comment xml:lang="lv">CMake pirmkods</comment>
+ <comment xml:lang="nb">CMake-kildekode</comment>
+ <comment xml:lang="nl">CMake-broncode</comment>
+ <comment xml:lang="nn">CMake-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy CMake</comment>
+ <comment xml:lang="pt_BR">Código fonte CMake</comment>
+ <comment xml:lang="ro">Cod sursă CMake</comment>
+ <comment xml:lang="ru">исходный код CMake</comment>
+ <comment xml:lang="sk">Zdrojový kód CMake</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode CMake</comment>
+ <comment xml:lang="sq">Kod burues CMake</comment>
+ <comment xml:lang="sv">CMake-källkod</comment>
+ <comment xml:lang="uk">вихідний код CMake</comment>
+ <comment xml:lang="vi">Mã nguồn CMake</comment>
+ <comment xml:lang="zh_CN">CMake 源代码</comment>
+ <comment xml:lang="zh_TW">CMake 源代碼</comment>
+ <glob pattern="*.cmake"/>
+ <glob pattern="CMakeLists.txt"/>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="text/csv">
+ <comment>CSV document</comment>
+ <comment xml:lang="ar">مستند CSV</comment>
+ <comment xml:lang="be@latin">Dakument CSV</comment>
+ <comment xml:lang="bg">Документ — CSV</comment>
+ <comment xml:lang="ca">document CSV</comment>
+ <comment xml:lang="cs">Dokument CSV</comment>
+ <comment xml:lang="da">CSV-dokument</comment>
+ <comment xml:lang="de">CSV-Dokument</comment>
+ <comment xml:lang="en_GB">CSV document</comment>
+ <comment xml:lang="eo">CSV-dokumento</comment>
+ <comment xml:lang="es">documento CSV</comment>
+ <comment xml:lang="eu">CSV dokumentua</comment>
+ <comment xml:lang="fi">CSV-asiakirja</comment>
+ <comment xml:lang="fo">CSV skjal</comment>
+ <comment xml:lang="fr">document CSV</comment>
+ <comment xml:lang="ga">cáipéis CSV</comment>
+ <comment xml:lang="gl">documento CSV</comment>
+ <comment xml:lang="he">מסמך CSV</comment>
+ <comment xml:lang="hu">CSV dokumentum</comment>
+ <comment xml:lang="id">Dokumen CSV</comment>
+ <comment xml:lang="it">Documento CSV</comment>
+ <comment xml:lang="ja">CSV ドキュメント</comment>
+ <comment xml:lang="kk">CSV құжаты</comment>
+ <comment xml:lang="ko">CSV 문서</comment>
+ <comment xml:lang="lt">CSV dokumentas</comment>
+ <comment xml:lang="lv">CSV dokuments</comment>
+ <comment xml:lang="nb">CSV-dokument</comment>
+ <comment xml:lang="nl">CSV-document</comment>
+ <comment xml:lang="nn">CSV-dokument</comment>
+ <comment xml:lang="pl">Dokument CSV</comment>
+ <comment xml:lang="pt_BR">Documento CSV</comment>
+ <comment xml:lang="ro">Document CSV</comment>
+ <comment xml:lang="ru">документ CSV</comment>
+ <comment xml:lang="sk">Dokument CSV</comment>
+ <comment xml:lang="sl">Dokument CSV</comment>
+ <comment xml:lang="sq">Dokument CSV</comment>
+ <comment xml:lang="sv">CSV-dokument</comment>
+ <comment xml:lang="uk">документ CSV</comment>
+ <comment xml:lang="vi">Tài liệu CSV</comment>
+ <comment xml:lang="zh_CN">CSV 文档</comment>
+ <comment xml:lang="zh_TW">CSV 文件</comment>
+ <acronym>CSV</acronym>
+ <expanded-acronym>Comma Separated Values</expanded-acronym>
+ <alias type="text/x-comma-separated-values"/>
+ <alias type="text/x-csv"/>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.csv"/>
+ </mime-type>
+ <mime-type type="text/x-copying">
+ <comment>license terms</comment>
+ <comment xml:lang="ar">شروط الترخيص</comment>
+ <comment xml:lang="be@latin">licenzijnyja ŭmovy</comment>
+ <comment xml:lang="bg">Лицензни условия</comment>
+ <comment xml:lang="ca">condicions de llicència</comment>
+ <comment xml:lang="cs">Licenční podmínky</comment>
+ <comment xml:lang="da">licensbetingelser</comment>
+ <comment xml:lang="de">Lizenzbedingungen</comment>
+ <comment xml:lang="en_GB">licence terms</comment>
+ <comment xml:lang="es">términos de licencia</comment>
+ <comment xml:lang="eu">lizentzia baldintzak</comment>
+ <comment xml:lang="fi">lisenssiehdot</comment>
+ <comment xml:lang="fo">loyvistreytir</comment>
+ <comment xml:lang="fr">termes de licence</comment>
+ <comment xml:lang="ga">téarmaí ceadúnais</comment>
+ <comment xml:lang="gl">termos de licenza</comment>
+ <comment xml:lang="he">תנאי רישיון</comment>
+ <comment xml:lang="hu">licencfeltételek</comment>
+ <comment xml:lang="id">persyaratan lisensi</comment>
+ <comment xml:lang="it">Termini di licenza</comment>
+ <comment xml:lang="ja">ソフトウェアライセンス条項</comment>
+ <comment xml:lang="kk">лицензиялық келісімі</comment>
+ <comment xml:lang="ko">라이선스 조항</comment>
+ <comment xml:lang="lt">licencijos sąlygos</comment>
+ <comment xml:lang="lv">licences nosacījumi</comment>
+ <comment xml:lang="nb">lisensbestemmelser</comment>
+ <comment xml:lang="nl">licentievoorwaarden</comment>
+ <comment xml:lang="nn">lisensvilkår</comment>
+ <comment xml:lang="pl">Warunki licencji</comment>
+ <comment xml:lang="pt_BR">termos de licença</comment>
+ <comment xml:lang="ro">termeni de licență</comment>
+ <comment xml:lang="ru">лицензионное соглашение</comment>
+ <comment xml:lang="sk">Licenčné podmienky</comment>
+ <comment xml:lang="sl">pogoji in dovoljenja uporabe</comment>
+ <comment xml:lang="sq">Kushte liçence</comment>
+ <comment xml:lang="sv">licensvillkor</comment>
+ <comment xml:lang="uk">ліцензійні умови</comment>
+ <comment xml:lang="vi">điều kiện giấy phép</comment>
+ <comment xml:lang="zh_CN">软件许可条款</comment>
+ <comment xml:lang="zh_TW">授權條款</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="COPYING"/>
+ </mime-type>
+ <mime-type type="text/x-credits">
+ <comment>author credits</comment>
+ <comment xml:lang="ar">شكر وتقدير المؤلف</comment>
+ <comment xml:lang="be@latin">zasłuhi aŭtara</comment>
+ <comment xml:lang="bg">Благодарности към авторите</comment>
+ <comment xml:lang="ca">atribucions d'autor</comment>
+ <comment xml:lang="cs">Autorské zásluhy</comment>
+ <comment xml:lang="da">bidragydere</comment>
+ <comment xml:lang="de">Autorendanksagung</comment>
+ <comment xml:lang="en_GB">author credits</comment>
+ <comment xml:lang="es">reconocimiento de autoría</comment>
+ <comment xml:lang="fi">tekijöiden kiitokset</comment>
+ <comment xml:lang="fo">høvundaheiður</comment>
+ <comment xml:lang="fr">remerciements</comment>
+ <comment xml:lang="ga">admhálacha údar</comment>
+ <comment xml:lang="gl">créditos de autor</comment>
+ <comment xml:lang="he">קרדיטים של היוצר</comment>
+ <comment xml:lang="hu">szerzők listája</comment>
+ <comment xml:lang="id">kredit penulis</comment>
+ <comment xml:lang="it">Riconoscimenti autori</comment>
+ <comment xml:lang="ja">ソフトウェア作者クレジット</comment>
+ <comment xml:lang="kk">бағдарлама авторлары</comment>
+ <comment xml:lang="ko">저작자 크레디트</comment>
+ <comment xml:lang="lt">padėkos autoriams</comment>
+ <comment xml:lang="lv">veidotāji</comment>
+ <comment xml:lang="nb">liste med bidragsytere</comment>
+ <comment xml:lang="nl">auteursinformatie</comment>
+ <comment xml:lang="nn">forfattarliste</comment>
+ <comment xml:lang="pl">Podziękowania autorów programu</comment>
+ <comment xml:lang="pt_BR">créditos do autor</comment>
+ <comment xml:lang="ro">mulțumiri autori</comment>
+ <comment xml:lang="ru">авторы программы</comment>
+ <comment xml:lang="sk">Autorské zásluhy</comment>
+ <comment xml:lang="sl">avtorske zasluge</comment>
+ <comment xml:lang="sq">Kreditë e autorëve</comment>
+ <comment xml:lang="sv">författarlista</comment>
+ <comment xml:lang="uk">подяки авторам програми</comment>
+ <comment xml:lang="vi">công trạng tác giả</comment>
+ <comment xml:lang="zh_CN">软件作者致谢</comment>
+ <comment xml:lang="zh_TW">作者致謝名單</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="CREDITS"/>
+ </mime-type>
+ <mime-type type="text/x-csrc">
+ <comment>C source code</comment>
+ <comment xml:lang="ar">شفرة مصدر سي</comment>
+ <comment xml:lang="be@latin">Kryničny kod C</comment>
+ <comment xml:lang="bg">Изходен код — C</comment>
+ <comment xml:lang="ca">codi font en C</comment>
+ <comment xml:lang="cs">Zdrojový kód v C</comment>
+ <comment xml:lang="da">C-kildekode</comment>
+ <comment xml:lang="de">C-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας C</comment>
+ <comment xml:lang="en_GB">C source code</comment>
+ <comment xml:lang="eo">C-fontkodo</comment>
+ <comment xml:lang="es">código fuente en C</comment>
+ <comment xml:lang="eu">C iturburu-kodea</comment>
+ <comment xml:lang="fi">C-lähdekoodi</comment>
+ <comment xml:lang="fo">C keldukota</comment>
+ <comment xml:lang="fr">code source C</comment>
+ <comment xml:lang="ga">cód foinseach C</comment>
+ <comment xml:lang="gl">código fonte en C</comment>
+ <comment xml:lang="he">קוד מקור של C</comment>
+ <comment xml:lang="hu">C-forráskód</comment>
+ <comment xml:lang="id">Kode program C</comment>
+ <comment xml:lang="it">Codice sorgente C</comment>
+ <comment xml:lang="ja">C ソースコード</comment>
+ <comment xml:lang="kk">C бастапқы коды</comment>
+ <comment xml:lang="ko">C 소스 코드</comment>
+ <comment xml:lang="lt">C pradinis kodas</comment>
+ <comment xml:lang="lv">C pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber C</comment>
+ <comment xml:lang="nb">C-kildekode</comment>
+ <comment xml:lang="nl">C-broncode</comment>
+ <comment xml:lang="nn">C-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy C</comment>
+ <comment xml:lang="pt">código fonte C</comment>
+ <comment xml:lang="pt_BR">Código fonte C</comment>
+ <comment xml:lang="ro">Cod sursă C</comment>
+ <comment xml:lang="ru">исходный код C</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka C</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode C</comment>
+ <comment xml:lang="sq">Kod burues C</comment>
+ <comment xml:lang="sr">C изворни ко̂д</comment>
+ <comment xml:lang="sv">C-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою C</comment>
+ <comment xml:lang="vi">Mã nguồn C</comment>
+ <comment xml:lang="zh_CN">C 源代码</comment>
+ <comment xml:lang="zh_TW">C 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <alias type="text/x-c"/>
+ <glob pattern="*.c" case-sensitive="true"/>
+ <magic priority="30">
+ <match value="/*" type="string" offset="0"/>
+ <match value="//" type="string" offset="0"/>
+ <match value="#include" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="text/x-csharp">
+ <comment>C# source code</comment>
+ <comment xml:lang="ar">شفرة مصدر سي#</comment>
+ <comment xml:lang="be@latin">Kryničny kod C#</comment>
+ <comment xml:lang="bg">Изходен код — C#</comment>
+ <comment xml:lang="ca">codi font en C#</comment>
+ <comment xml:lang="cs">Zdrojový kód v C#</comment>
+ <comment xml:lang="da">C#-kildekode</comment>
+ <comment xml:lang="de">C#-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας C#</comment>
+ <comment xml:lang="en_GB">C# source code</comment>
+ <comment xml:lang="eo">C#-fontkodo</comment>
+ <comment xml:lang="es">código fuente en C#</comment>
+ <comment xml:lang="eu">C# iturburu-kodea</comment>
+ <comment xml:lang="fi">C#-lähdekoodi</comment>
+ <comment xml:lang="fo">C# keldukota</comment>
+ <comment xml:lang="fr">code source C#</comment>
+ <comment xml:lang="ga">cód foinseach C#</comment>
+ <comment xml:lang="gl">código fonte en C#</comment>
+ <comment xml:lang="he">קוד מקור של C#</comment>
+ <comment xml:lang="hu">C#-forráskód</comment>
+ <comment xml:lang="id">Kode program C#</comment>
+ <comment xml:lang="it">Codice sorgente C#</comment>
+ <comment xml:lang="ja">C# ソースコード</comment>
+ <comment xml:lang="kk">C# бастапқы коды</comment>
+ <comment xml:lang="ko">C# 소스 코드</comment>
+ <comment xml:lang="lt">C# pradinis kodas</comment>
+ <comment xml:lang="lv">C# pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber C#</comment>
+ <comment xml:lang="nb">C#-kildekode</comment>
+ <comment xml:lang="nl">C#-broncode</comment>
+ <comment xml:lang="nn">C#-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy C#</comment>
+ <comment xml:lang="pt">código fonte C#</comment>
+ <comment xml:lang="pt_BR">Código fonte C#</comment>
+ <comment xml:lang="ro">Cod sursă C#</comment>
+ <comment xml:lang="ru">исходный код C#</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka C#</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode C#</comment>
+ <comment xml:lang="sq">Kod burues C#</comment>
+ <comment xml:lang="sr">C# изворни ко̂д</comment>
+ <comment xml:lang="sv">C#-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою C#</comment>
+ <comment xml:lang="vi">Mã nguồn C#</comment>
+ <comment xml:lang="zh_CN">C# 源代码</comment>
+ <comment xml:lang="zh_TW">C# 源代碼</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.cs"/>
+ </mime-type>
+ <mime-type type="text/x-vala">
+ <comment>Vala source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Vala</comment>
+ <comment xml:lang="be@latin">Kryničny kod Vala</comment>
+ <comment xml:lang="bg">Изходен код — Vala</comment>
+ <comment xml:lang="ca">codi font en Vala</comment>
+ <comment xml:lang="cs">Zdrojový kód Vala</comment>
+ <comment xml:lang="da">Valakildekode</comment>
+ <comment xml:lang="de">Vala-Quelltext</comment>
+ <comment xml:lang="eo">Vala-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Vala</comment>
+ <comment xml:lang="eu">Vala iturburu-kodea</comment>
+ <comment xml:lang="fi">Vala-lähdekoodi</comment>
+ <comment xml:lang="fo">Vala keldukota</comment>
+ <comment xml:lang="fr">code source Vala</comment>
+ <comment xml:lang="ga">cód foinseach Vala</comment>
+ <comment xml:lang="gl">código fonte en Vala</comment>
+ <comment xml:lang="he">קוד מקור של Vala</comment>
+ <comment xml:lang="hu">Vala forráskód</comment>
+ <comment xml:lang="id">Kode program Vala</comment>
+ <comment xml:lang="it">Codice sorgente Vala</comment>
+ <comment xml:lang="ja">Vala ソースコード</comment>
+ <comment xml:lang="kk">Vala бастапқы коды</comment>
+ <comment xml:lang="ko">Vala 소스 코드</comment>
+ <comment xml:lang="lt">Vala pradinis kodas</comment>
+ <comment xml:lang="lv">Vala pirmkods</comment>
+ <comment xml:lang="nb">Vala-kildekode</comment>
+ <comment xml:lang="nl">Vala-broncode</comment>
+ <comment xml:lang="nn">Vala-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Vala</comment>
+ <comment xml:lang="pt_BR">Código fonte Vala</comment>
+ <comment xml:lang="ro">Cod sursă Vala</comment>
+ <comment xml:lang="ru">исходный код Vala</comment>
+ <comment xml:lang="sk">Zdrojový kód Vala</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Vala</comment>
+ <comment xml:lang="sq">Kod burues Vala</comment>
+ <comment xml:lang="sv">Vala-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Vala</comment>
+ <comment xml:lang="vi">Mã nguồn Vala</comment>
+ <comment xml:lang="zh_CN">Vala 源代码</comment>
+ <comment xml:lang="zh_TW">Vala 源代碼</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.vala"/>
+ <glob pattern="*.vapi"/>
+ </mime-type>
+ <mime-type type="text/x-ooc">
+ <comment>OOC source code</comment>
+ <comment xml:lang="bg">Изходен код — OOC</comment>
+ <comment xml:lang="ca">codi font en OOC</comment>
+ <comment xml:lang="cs">Zdrojový kód OOC</comment>
+ <comment xml:lang="de">OOC-Quellcode</comment>
+ <comment xml:lang="eo">OOC-fontkodo</comment>
+ <comment xml:lang="es">Código fuente en OOC</comment>
+ <comment xml:lang="fi">OOC-lähdekoodi</comment>
+ <comment xml:lang="fr">source code OOC</comment>
+ <comment xml:lang="gl">código fonte de OOC</comment>
+ <comment xml:lang="he">קוד מקור של OOC</comment>
+ <comment xml:lang="hu">OOC forráskód</comment>
+ <comment xml:lang="id">Kode sumber OOC</comment>
+ <comment xml:lang="it">Codice sorgente OOC</comment>
+ <comment xml:lang="ja">OOC ソースコード</comment>
+ <comment xml:lang="kk">OOC бастапқы коды</comment>
+ <comment xml:lang="ko">OOC 소스 코드</comment>
+ <comment xml:lang="lv">OOC pirmkods</comment>
+ <comment xml:lang="pl">Kod źródłowy OOC</comment>
+ <comment xml:lang="ru">исходный код OOC</comment>
+ <comment xml:lang="sl">Izvorna koda OOC</comment>
+ <comment xml:lang="sv">OOC-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою OOC</comment>
+ <comment xml:lang="zh_CN">OOC</comment>
+ <comment xml:lang="zh_TW">OOC 源代碼</comment>
+ <acronym>OOC</acronym>
+ <expanded-acronym>Out Of Class</expanded-acronym>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.ooc"/>
+ </mime-type>
+ <mime-type type="text/x-dcl">
+ <comment>DCL script</comment>
+ <comment xml:lang="ar">سكربت DCL</comment>
+ <comment xml:lang="az">DCL skripti</comment>
+ <comment xml:lang="be@latin">Skrypt DCL</comment>
+ <comment xml:lang="bg">Скрипт — DCL</comment>
+ <comment xml:lang="ca">script DCL</comment>
+ <comment xml:lang="cs">Skript DCL</comment>
+ <comment xml:lang="cy">Sgript DCL</comment>
+ <comment xml:lang="da">DCL-program</comment>
+ <comment xml:lang="de">DCL-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών DCL</comment>
+ <comment xml:lang="en_GB">DCL script</comment>
+ <comment xml:lang="eo">DCL-skripto</comment>
+ <comment xml:lang="es">script en DCL</comment>
+ <comment xml:lang="eu">DCL script-a</comment>
+ <comment xml:lang="fi">DCL-komentotiedosto</comment>
+ <comment xml:lang="fo">DCL boðrøð</comment>
+ <comment xml:lang="fr">script DCL</comment>
+ <comment xml:lang="ga">script DCL</comment>
+ <comment xml:lang="gl">script de DCL</comment>
+ <comment xml:lang="he">תסריט DCL</comment>
+ <comment xml:lang="hu">DCL-parancsfájl</comment>
+ <comment xml:lang="id">Skrip DCL</comment>
+ <comment xml:lang="it">Script DCL</comment>
+ <comment xml:lang="ja">DCL スクリプト</comment>
+ <comment xml:lang="kk">DCL сценарийі</comment>
+ <comment xml:lang="ko">DCL 스크립트</comment>
+ <comment xml:lang="lt">DCL scenarijus</comment>
+ <comment xml:lang="lv">DCL skripts</comment>
+ <comment xml:lang="ms">Skrip DCL</comment>
+ <comment xml:lang="nb">DCL-skript</comment>
+ <comment xml:lang="nl">DCL-script</comment>
+ <comment xml:lang="nn">DCL-skript</comment>
+ <comment xml:lang="pl">Skrypt DCL</comment>
+ <comment xml:lang="pt">'script' DCL</comment>
+ <comment xml:lang="pt_BR">Script DCL</comment>
+ <comment xml:lang="ro">Script DCL</comment>
+ <comment xml:lang="ru">сценарий DCL</comment>
+ <comment xml:lang="sk">Skript DCL</comment>
+ <comment xml:lang="sl">Skriptna datoteka DCL</comment>
+ <comment xml:lang="sq">Script DCL</comment>
+ <comment xml:lang="sr">DCL скрипта</comment>
+ <comment xml:lang="sv">DCL-skript</comment>
+ <comment xml:lang="uk">скрипт DCL</comment>
+ <comment xml:lang="vi">Văn lệnh DCL</comment>
+ <comment xml:lang="zh_CN">DCL 脚本</comment>
+ <comment xml:lang="zh_TW">DCL 指令稿</comment>
+ <acronym>DCL</acronym>
+ <expanded-acronym>Data Conversion Laboratory</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.dcl"/>
+ </mime-type>
+ <mime-type type="text/x-dsl">
+ <comment>DSSSL document</comment>
+ <comment xml:lang="ar">مستند DSSSL</comment>
+ <comment xml:lang="az">DSSSL sənədi</comment>
+ <comment xml:lang="be@latin">Dakument DSSSL</comment>
+ <comment xml:lang="bg">Документ — DSSSL</comment>
+ <comment xml:lang="ca">document DSSSL</comment>
+ <comment xml:lang="cs">Dokument DSSSL</comment>
+ <comment xml:lang="cy">Dogfen DSSSL</comment>
+ <comment xml:lang="da">DSSSL-dokument</comment>
+ <comment xml:lang="de">DSSSL-Dokument</comment>
+ <comment xml:lang="el">έγγραφο DSSSL</comment>
+ <comment xml:lang="en_GB">DSSSL document</comment>
+ <comment xml:lang="eo">DSSSL-dokumento</comment>
+ <comment xml:lang="es">documento DSSSL</comment>
+ <comment xml:lang="eu">DSSSL dokumentua</comment>
+ <comment xml:lang="fi">DSSSL-asiakirja</comment>
+ <comment xml:lang="fo">DSSSL skjal</comment>
+ <comment xml:lang="fr">document DSSSL</comment>
+ <comment xml:lang="ga">cáipéis DSSSL</comment>
+ <comment xml:lang="gl">documento DSSSL</comment>
+ <comment xml:lang="he">מסמך DSSSL</comment>
+ <comment xml:lang="hu">DSSSL-dokumentum</comment>
+ <comment xml:lang="id">Dokumen DSSSL</comment>
+ <comment xml:lang="it">Documento DSSSL</comment>
+ <comment xml:lang="ja">DSSSL ドキュメント</comment>
+ <comment xml:lang="kk">DSSSL құжаты</comment>
+ <comment xml:lang="ko">DSSSL 문서</comment>
+ <comment xml:lang="lt">DSSSL dokumentas</comment>
+ <comment xml:lang="lv">DSSSL dokuments</comment>
+ <comment xml:lang="ms">Dokumen DSSSL</comment>
+ <comment xml:lang="nb">DSSSL-dokument</comment>
+ <comment xml:lang="nl">DSSSL-document</comment>
+ <comment xml:lang="nn">DSSSL-dokument</comment>
+ <comment xml:lang="pl">Dokument DSSSL</comment>
+ <comment xml:lang="pt">documento DSSSL</comment>
+ <comment xml:lang="pt_BR">Documento DSSSL</comment>
+ <comment xml:lang="ro">Document DSSSL</comment>
+ <comment xml:lang="ru">документ DSSSL</comment>
+ <comment xml:lang="sk">Dokument DSSSL</comment>
+ <comment xml:lang="sl">Dokument DSSSL</comment>
+ <comment xml:lang="sq">Dokument DSSSL</comment>
+ <comment xml:lang="sr">DSSSL документ</comment>
+ <comment xml:lang="sv">DSSSL-dokument</comment>
+ <comment xml:lang="uk">документ DSSSL</comment>
+ <comment xml:lang="vi">Tài liệu DSSSL</comment>
+ <comment xml:lang="zh_CN">DSSSL 文档</comment>
+ <comment xml:lang="zh_TW">DSSSL 文件</comment>
+ <acronym>DSSSL</acronym>
+ <expanded-acronym>Document Style Semantics and Specification Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.dsl"/>
+ </mime-type>
+ <mime-type type="text/x-dsrc">
+ <comment>D source code</comment>
+ <comment xml:lang="ar">شفرة مصدر D</comment>
+ <comment xml:lang="be@latin">Kryničny kod D</comment>
+ <comment xml:lang="bg">Изходен код — D</comment>
+ <comment xml:lang="ca">codi font en D</comment>
+ <comment xml:lang="cs">Zdrojový kód v D</comment>
+ <comment xml:lang="da">D-kildekode</comment>
+ <comment xml:lang="de">D-Quelltext</comment>
+ <comment xml:lang="en_GB">D source code</comment>
+ <comment xml:lang="eo">D-fontkodo</comment>
+ <comment xml:lang="es">código fuente en D</comment>
+ <comment xml:lang="eu">D iturburu-kodea</comment>
+ <comment xml:lang="fi">D-lähdekoodi</comment>
+ <comment xml:lang="fo">D keldukota</comment>
+ <comment xml:lang="fr">code source D</comment>
+ <comment xml:lang="ga">cód foinseach D</comment>
+ <comment xml:lang="gl">código fonte de D</comment>
+ <comment xml:lang="he">קוד מקור לשפת D</comment>
+ <comment xml:lang="hu">D-forráskód</comment>
+ <comment xml:lang="id">Kode program D</comment>
+ <comment xml:lang="it">Codice sorgente D</comment>
+ <comment xml:lang="ja">D ソースコード</comment>
+ <comment xml:lang="kk">D бастапқы коды</comment>
+ <comment xml:lang="ko">D 소스 코드</comment>
+ <comment xml:lang="lt">D pradinis kodas</comment>
+ <comment xml:lang="lv">D pirmkods</comment>
+ <comment xml:lang="nb">D-kildekode</comment>
+ <comment xml:lang="nl">D-broncode</comment>
+ <comment xml:lang="nn">D-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy D</comment>
+ <comment xml:lang="pt_BR">Código fonte D</comment>
+ <comment xml:lang="ro">Cod sursă D</comment>
+ <comment xml:lang="ru">исходный код D</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka D</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode D</comment>
+ <comment xml:lang="sq">Kod burues D</comment>
+ <comment xml:lang="sr">D изворни ко̂д</comment>
+ <comment xml:lang="sv">D-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою D</comment>
+ <comment xml:lang="vi">Mã nguồn D</comment>
+ <comment xml:lang="zh_CN">D 源代码</comment>
+ <comment xml:lang="zh_TW">D 源代碼</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.d"/>
+ </mime-type>
+ <mime-type type="application/xml-dtd">
+ <comment>DTD file</comment>
+ <comment xml:lang="ar">ملف DTD</comment>
+ <comment xml:lang="be@latin">Fajł DTD</comment>
+ <comment xml:lang="bg">Документ — DTD</comment>
+ <comment xml:lang="ca">fitxer DTD</comment>
+ <comment xml:lang="cs">Soubor DTD</comment>
+ <comment xml:lang="da">DTD-fil</comment>
+ <comment xml:lang="de">DTD-Datei</comment>
+ <comment xml:lang="en_GB">DTD file</comment>
+ <comment xml:lang="eo">DTD-dosiero</comment>
+ <comment xml:lang="es">archivo DTD</comment>
+ <comment xml:lang="eu">DTD fitxategia</comment>
+ <comment xml:lang="fi">DTD-tiedosto</comment>
+ <comment xml:lang="fo">DTD fíla</comment>
+ <comment xml:lang="fr">fichier DTD</comment>
+ <comment xml:lang="ga">comhad DTD</comment>
+ <comment xml:lang="gl">ficheiro DTD</comment>
+ <comment xml:lang="he">מסמך DTD</comment>
+ <comment xml:lang="hu">DTD fájl</comment>
+ <comment xml:lang="id">Berkas DTD</comment>
+ <comment xml:lang="it">File DTD</comment>
+ <comment xml:lang="ja">DTD ファイル</comment>
+ <comment xml:lang="kk">DTD файлы</comment>
+ <comment xml:lang="ko">DTD 파일</comment>
+ <comment xml:lang="lt">DTD failas</comment>
+ <comment xml:lang="lv">DTD fails</comment>
+ <comment xml:lang="nb">DTD-fil</comment>
+ <comment xml:lang="nl">DTD-bestand</comment>
+ <comment xml:lang="nn">DTD-fil</comment>
+ <comment xml:lang="pl">Plik DTD</comment>
+ <comment xml:lang="pt_BR">Arquivo DTD</comment>
+ <comment xml:lang="ro">Fișier DTD</comment>
+ <comment xml:lang="ru">файл DTD</comment>
+ <comment xml:lang="sk">Súbor DTD</comment>
+ <comment xml:lang="sl">Datoteka DTD</comment>
+ <comment xml:lang="sq">File DTD</comment>
+ <comment xml:lang="sv">DTD-fil</comment>
+ <comment xml:lang="uk">файл DTD</comment>
+ <comment xml:lang="vi">Tập tin DTD</comment>
+ <comment xml:lang="zh_CN">DTD 文件</comment>
+ <comment xml:lang="zh_TW">DTD 檔</comment>
+ <acronym>DTD</acronym>
+ <expanded-acronym>Document Type Definition</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.dtd"/>
+ <alias type="text/x-dtd"/>
+ </mime-type>
+ <mime-type type="text/x-eiffel">
+ <comment>Eiffel source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Eiffel</comment>
+ <comment xml:lang="be@latin">Kryničny kod Eiffel</comment>
+ <comment xml:lang="bg">Изходен код — Eiffel</comment>
+ <comment xml:lang="ca">codi font en Eiffel</comment>
+ <comment xml:lang="cs">Zdrojový kód Eiffel</comment>
+ <comment xml:lang="da">Eiffelkildekode</comment>
+ <comment xml:lang="de">Eiffel-Quelltext</comment>
+ <comment xml:lang="eo">Eiffel-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Eiffel</comment>
+ <comment xml:lang="eu">Eiffel iturburu-kodea</comment>
+ <comment xml:lang="fi">Eiffel-lähdekoodi</comment>
+ <comment xml:lang="fo">Eiffel keldukota</comment>
+ <comment xml:lang="fr">code source Eiffel</comment>
+ <comment xml:lang="ga">cód foinseach Eiffel</comment>
+ <comment xml:lang="gl">código fone de Eiffel</comment>
+ <comment xml:lang="he">קוד מקור של Eiffel</comment>
+ <comment xml:lang="hu">Eiffel forráskód</comment>
+ <comment xml:lang="id">Kode program Eiffel</comment>
+ <comment xml:lang="it">Codice sorgente Eiffel</comment>
+ <comment xml:lang="ja">Eiffel ソースコード</comment>
+ <comment xml:lang="kk">Eiffel бастапқы коды</comment>
+ <comment xml:lang="ko">Eiffel 소스 코드</comment>
+ <comment xml:lang="lt">Eiffel pirminis programos tekstas</comment>
+ <comment xml:lang="lv">Eiffel pirmkods</comment>
+ <comment xml:lang="nb">Eiffel-kildekode</comment>
+ <comment xml:lang="nl">Eiffel-broncode</comment>
+ <comment xml:lang="nn">Eiffel-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Eiffel</comment>
+ <comment xml:lang="pt_BR">Código fonte Eiffel</comment>
+ <comment xml:lang="ro">Cod sursă Eiffel</comment>
+ <comment xml:lang="ru">исходный код Eiffel</comment>
+ <comment xml:lang="sk">Zdrojový kód Eiffel</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Eiffel</comment>
+ <comment xml:lang="sq">Kod burues Eiffel</comment>
+ <comment xml:lang="sv">Eiffel-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Eiffel</comment>
+ <comment xml:lang="vi">Mã nguồn Eiffel</comment>
+ <comment xml:lang="zh_CN">Eiffel 源代码</comment>
+ <comment xml:lang="zh_TW">Eiffel 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.e"/>
+ <glob pattern="*.eif"/>
+ </mime-type>
+ <mime-type type="text/x-emacs-lisp">
+ <comment>Emacs Lisp source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Emacs Lisp</comment>
+ <comment xml:lang="az">Emacs Lisp mənbə kodu</comment>
+ <comment xml:lang="be@latin">Kryničny kod Emacs Lisp</comment>
+ <comment xml:lang="bg">Изходен код — Emacs Lisp</comment>
+ <comment xml:lang="ca">codi font en Emacs Lisp</comment>
+ <comment xml:lang="cs">Zdrojový kód Emacs Lisp</comment>
+ <comment xml:lang="cy">Ffynhonnell rhaglen EMACS LISP</comment>
+ <comment xml:lang="da">Emacs Lisp-kildekode</comment>
+ <comment xml:lang="de">Emacs-Lisp-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Emacs Lisp</comment>
+ <comment xml:lang="en_GB">Emacs Lisp source code</comment>
+ <comment xml:lang="eo">fontkodo en Emacs Lisp</comment>
+ <comment xml:lang="es">código fuente en Lisp de Emacs</comment>
+ <comment xml:lang="eu">Emacs Lisp iturburu-kodea</comment>
+ <comment xml:lang="fi">Emacs Lisp -lähdekoodi</comment>
+ <comment xml:lang="fo">Emacs Lisp keldukota</comment>
+ <comment xml:lang="fr">code source Emacs Lisp</comment>
+ <comment xml:lang="ga">cód foinseach Emacs Lisp</comment>
+ <comment xml:lang="gl">código fonte de Emacs Lisp</comment>
+ <comment xml:lang="he">קוד מקור של Emcas Lisp</comment>
+ <comment xml:lang="hu">Emacs Lisp-forráskód</comment>
+ <comment xml:lang="id">Kode sumber Emacs Lisp</comment>
+ <comment xml:lang="it">Codice sorgente Emacs Lisp</comment>
+ <comment xml:lang="ja">Emacs Lisp ソースコード</comment>
+ <comment xml:lang="kk">Emacs Lisp бастапқы коды</comment>
+ <comment xml:lang="ko">Emacs Lisp 소스 코드</comment>
+ <comment xml:lang="lt">Emacs Lisp pradinis kodas</comment>
+ <comment xml:lang="lv">Emacs Lisp pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Emacs Lisp</comment>
+ <comment xml:lang="nb">Emacs Lisp-kildekode</comment>
+ <comment xml:lang="nl">Emacs Lisp-broncode</comment>
+ <comment xml:lang="nn">Emacs Lisp kjeldekode</comment>
+ <comment xml:lang="pl">Plik źródłowy Emacs Lisp</comment>
+ <comment xml:lang="pt">código fonte Emacs Lisp</comment>
+ <comment xml:lang="pt_BR">Código fonte Lisp do Emacs</comment>
+ <comment xml:lang="ro">Cod sursă Emacs Lisp</comment>
+ <comment xml:lang="ru">исходный код Emacs Lisp</comment>
+ <comment xml:lang="sk">Zdrojový kód Emacs Lisp</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Emacs Lisp</comment>
+ <comment xml:lang="sq">Kod burues Emacs Lisp</comment>
+ <comment xml:lang="sr">Емакс Лисп изворни ко̂д</comment>
+ <comment xml:lang="sv">Emacs Lisp-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Emacs Lisp</comment>
+ <comment xml:lang="vi">Mã nguồn Lisp Emacs</comment>
+ <comment xml:lang="zh_CN">Emacs Lisp 源代码</comment>
+ <comment xml:lang="zh_TW">Emacs Lisp 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="\012(" type="string" offset="0"/>
+ <match value=";ELC\023\000\000\000" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.el"/>
+ </mime-type>
+ <mime-type type="text/x-erlang">
+ <comment>Erlang source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Erlang</comment>
+ <comment xml:lang="be@latin">Kryničny kod Erlang</comment>
+ <comment xml:lang="bg">Изходен код — Erlang</comment>
+ <comment xml:lang="ca">codi font en Erlang</comment>
+ <comment xml:lang="cs">Zdrojový kód Erlang</comment>
+ <comment xml:lang="da">Erlangkildekode</comment>
+ <comment xml:lang="de">Erlang-Quelltext</comment>
+ <comment xml:lang="eo">Erlang-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Erlang</comment>
+ <comment xml:lang="eu">Erlang iturburu-kodea</comment>
+ <comment xml:lang="fi">Erlang-lähdekoodi</comment>
+ <comment xml:lang="fo">Erlang keldukota</comment>
+ <comment xml:lang="fr">code source Erlang</comment>
+ <comment xml:lang="ga">cód foinseach Erlang</comment>
+ <comment xml:lang="gl">código fonte de Erlang</comment>
+ <comment xml:lang="he">קוד מקור של Erlang</comment>
+ <comment xml:lang="hu">Erlang forráskód</comment>
+ <comment xml:lang="id">Kode program Erlang</comment>
+ <comment xml:lang="it">Codice sorgente Erlang</comment>
+ <comment xml:lang="ja">Erlang ソースコード</comment>
+ <comment xml:lang="kk">Erlang бастапқы коды</comment>
+ <comment xml:lang="ko">Erlang 소스 코드</comment>
+ <comment xml:lang="lt">Erlang pradinis kodas</comment>
+ <comment xml:lang="lv">Erlang pirmkods</comment>
+ <comment xml:lang="nb">Erlang-kildekode</comment>
+ <comment xml:lang="nl">Erlang-broncode</comment>
+ <comment xml:lang="nn">Erlang-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Erlang</comment>
+ <comment xml:lang="pt_BR">Código fonte Erlang</comment>
+ <comment xml:lang="ro">Cod sursă Erlang</comment>
+ <comment xml:lang="ru">исходный код Erlang</comment>
+ <comment xml:lang="sk">Zdrojový kód Erlang</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Erlang</comment>
+ <comment xml:lang="sq">Kod burues Erlang</comment>
+ <comment xml:lang="sv">Erlang-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Erlang</comment>
+ <comment xml:lang="vi">Mã nguồn Erlang</comment>
+ <comment xml:lang="zh_CN">Erlang 源代码</comment>
+ <comment xml:lang="zh_TW">Erlang 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.erl"/>
+ </mime-type>
+ <mime-type type="text/x-fortran">
+ <comment>Fortran source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Fortran</comment>
+ <comment xml:lang="az">Fortran mənbə kodu</comment>
+ <comment xml:lang="be@latin">Kryničny kod Fortran</comment>
+ <comment xml:lang="bg">Изходен код — Fortran</comment>
+ <comment xml:lang="ca">codi font en Fortran</comment>
+ <comment xml:lang="cs">Zdrojový kód Fortran</comment>
+ <comment xml:lang="cy">Ffynhonnell rhaglen FORTRAN</comment>
+ <comment xml:lang="da">Fortrankildekode</comment>
+ <comment xml:lang="de">Fortran-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Fortran</comment>
+ <comment xml:lang="en_GB">Fortran source code</comment>
+ <comment xml:lang="eo">Fotran-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Fortran</comment>
+ <comment xml:lang="eu">Fortran-en iturburu-kodea</comment>
+ <comment xml:lang="fi">Fortran-lähdekoodi</comment>
+ <comment xml:lang="fo">Fortran keldukota</comment>
+ <comment xml:lang="fr">code source Fortran</comment>
+ <comment xml:lang="ga">cód foinseach Fortran</comment>
+ <comment xml:lang="gl">código fonte de Fortran</comment>
+ <comment xml:lang="he">קוד מקור של Fortran</comment>
+ <comment xml:lang="hu">Fortran-forráskód</comment>
+ <comment xml:lang="id">Kode program Fortran</comment>
+ <comment xml:lang="it">Codice sorgente Fortran</comment>
+ <comment xml:lang="ja">Fortran ソースコード</comment>
+ <comment xml:lang="kk">Fortran бастапқы коды</comment>
+ <comment xml:lang="ko">포트란 소스 코드</comment>
+ <comment xml:lang="lt">Fortran pradinis kodas</comment>
+ <comment xml:lang="lv">Fortran pirmkods</comment>
+ <comment xml:lang="ms">kod sumber Fortran</comment>
+ <comment xml:lang="nb">Fortran-kildekode</comment>
+ <comment xml:lang="nl">Fortran-broncode</comment>
+ <comment xml:lang="nn">Fortran-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Fortran</comment>
+ <comment xml:lang="pt">código fonte Fortran</comment>
+ <comment xml:lang="pt_BR">Código fonte Fortran</comment>
+ <comment xml:lang="ro">Cod sursă Fortran</comment>
+ <comment xml:lang="ru">исходный код Fortran</comment>
+ <comment xml:lang="sk">Zdrojový kód Fortran</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Fortran</comment>
+ <comment xml:lang="sq">Kod burues Fortran</comment>
+ <comment xml:lang="sr">Фортран изворни ко̂д</comment>
+ <comment xml:lang="sv">Fortran-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Fortran</comment>
+ <comment xml:lang="vi">Mã nguồn Fortran</comment>
+ <comment xml:lang="zh_CN">Fortran 源代码</comment>
+ <comment xml:lang="zh_TW">Fortran 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.f"/>
+ <glob pattern="*.f90"/>
+ <glob pattern="*.f95"/>
+ <glob pattern="*.for"/>
+ </mime-type>
+ <mime-type type="text/x-gettext-translation">
+ <comment>translation file</comment>
+ <comment xml:lang="ar">ملف الترجمة</comment>
+ <comment xml:lang="be@latin">fajł pierakładu</comment>
+ <comment xml:lang="bg">Превод</comment>
+ <comment xml:lang="ca">fitxer traducció</comment>
+ <comment xml:lang="cs">Soubor překladu</comment>
+ <comment xml:lang="da">oversættelsesfil</comment>
+ <comment xml:lang="de">Übersetzungsdatei</comment>
+ <comment xml:lang="eo">tradukad-dosiero</comment>
+ <comment xml:lang="es">archivo de traducción</comment>
+ <comment xml:lang="eu">itzulpen-fitxategia</comment>
+ <comment xml:lang="fi">käännöstiedosto</comment>
+ <comment xml:lang="fo">týðingarfíla</comment>
+ <comment xml:lang="fr">fichier de traduction</comment>
+ <comment xml:lang="ga">comhad aistrithe</comment>
+ <comment xml:lang="gl">ficheiro de tradución</comment>
+ <comment xml:lang="he">קובץ תרגום</comment>
+ <comment xml:lang="hu">fordítási fájl</comment>
+ <comment xml:lang="id">berkas terjemahan</comment>
+ <comment xml:lang="it">File traduzione</comment>
+ <comment xml:lang="ja">翻訳ファイル</comment>
+ <comment xml:lang="kk">аудармалар файлы</comment>
+ <comment xml:lang="ko">번역 파일</comment>
+ <comment xml:lang="lt">vertimo failas</comment>
+ <comment xml:lang="lv">tulkošanas fails</comment>
+ <comment xml:lang="nb">oversettelsesfil</comment>
+ <comment xml:lang="nl">vertalingsbestand</comment>
+ <comment xml:lang="nn">omsetjingsfil</comment>
+ <comment xml:lang="pl">Plik tłumaczenia</comment>
+ <comment xml:lang="pt_BR">Arquivo de tradução</comment>
+ <comment xml:lang="ro">fișier traducere</comment>
+ <comment xml:lang="ru">файл переводов</comment>
+ <comment xml:lang="sk">Súbor prekladu</comment>
+ <comment xml:lang="sl">datoteka prevoda programa</comment>
+ <comment xml:lang="sq">File përkthimesh</comment>
+ <comment xml:lang="sv">översättningsfil</comment>
+ <comment xml:lang="uk">файл перекладу</comment>
+ <comment xml:lang="vi">tập tin dịch</comment>
+ <comment xml:lang="zh_CN">消息翻译文件</comment>
+ <comment xml:lang="zh_TW">翻譯檔</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.po"/>
+ <alias type="text/x-po"/>
+ <alias type="application/x-gettext"/>
+ </mime-type>
+ <mime-type type="text/x-gettext-translation-template">
+ <comment>translation template</comment>
+ <comment xml:lang="ar">قالب الترجمة</comment>
+ <comment xml:lang="be@latin">šablon dla pierakładu</comment>
+ <comment xml:lang="bg">Шаблон за преводи</comment>
+ <comment xml:lang="ca">plantilla de traducció</comment>
+ <comment xml:lang="cs">Šablona překladu</comment>
+ <comment xml:lang="da">oversættelsesskabelon</comment>
+ <comment xml:lang="de">Übersetzungsvorlage</comment>
+ <comment xml:lang="en_GB">translation template</comment>
+ <comment xml:lang="eo">tradukad-ŝablono</comment>
+ <comment xml:lang="es">plantilla de traducción</comment>
+ <comment xml:lang="eu">itzulpenen txantiloia</comment>
+ <comment xml:lang="fi">käännösmalli</comment>
+ <comment xml:lang="fo">týðingarformur</comment>
+ <comment xml:lang="fr">modèle de traduction</comment>
+ <comment xml:lang="ga">teimpléad aistrithe</comment>
+ <comment xml:lang="gl">plantilla de tradución</comment>
+ <comment xml:lang="he">תבנית תרגום</comment>
+ <comment xml:lang="hu">fordítási sablon</comment>
+ <comment xml:lang="id">templat terjemahan</comment>
+ <comment xml:lang="it">Modello di traduzione</comment>
+ <comment xml:lang="ja">翻訳テンプレート</comment>
+ <comment xml:lang="kk">аудармалар үлгісі</comment>
+ <comment xml:lang="ko">메세지 번역 서식</comment>
+ <comment xml:lang="lt">vertimo šablonas</comment>
+ <comment xml:lang="lv">tulkošanas veidne</comment>
+ <comment xml:lang="nb">mal for oversetting</comment>
+ <comment xml:lang="nl">vertalingssjabloon</comment>
+ <comment xml:lang="nn">omsetjingsmal</comment>
+ <comment xml:lang="pl">Szablon tłumaczenia</comment>
+ <comment xml:lang="pt_BR">modelo de tradução</comment>
+ <comment xml:lang="ro">șablon de traducere</comment>
+ <comment xml:lang="ru">шаблон переводов</comment>
+ <comment xml:lang="sk">Šablóna prekladu</comment>
+ <comment xml:lang="sl">predloga datoteke prevoda programa</comment>
+ <comment xml:lang="sq">Model përkthimesh</comment>
+ <comment xml:lang="sv">översättningsmall</comment>
+ <comment xml:lang="uk">шаблон перекладу</comment>
+ <comment xml:lang="vi">mẫu dịch</comment>
+ <comment xml:lang="zh_CN">消息翻译模板</comment>
+ <comment xml:lang="zh_TW">翻譯模版</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.pot"/>
+ <alias type="text/x-pot"/>
+ </mime-type>
+ <mime-type type="text/html">
+ <comment>HTML document</comment>
+ <comment xml:lang="ar">مستند HTML</comment>
+ <comment xml:lang="be@latin">Dakument HTML</comment>
+ <comment xml:lang="bg">Документ — HTML</comment>
+ <comment xml:lang="ca">document HTML</comment>
+ <comment xml:lang="cs">Dokument HTML</comment>
+ <comment xml:lang="da">HTML-dokument</comment>
+ <comment xml:lang="de">HTML-Dokument</comment>
+ <comment xml:lang="en_GB">HTML document</comment>
+ <comment xml:lang="eo">HTML-dokumento</comment>
+ <comment xml:lang="es">documento HTML</comment>
+ <comment xml:lang="eu">HTML dokumentua</comment>
+ <comment xml:lang="fi">HTML-asiakirja</comment>
+ <comment xml:lang="fo">HTML skjal</comment>
+ <comment xml:lang="fr">document HTML</comment>
+ <comment xml:lang="ga">cáipéis HTML</comment>
+ <comment xml:lang="gl">documento HTML</comment>
+ <comment xml:lang="he">מסמך HTML</comment>
+ <comment xml:lang="hu">HTML dokumentum</comment>
+ <comment xml:lang="id">Dokumen HTML</comment>
+ <comment xml:lang="it">Documento HTML</comment>
+ <comment xml:lang="ja">HTML ドキュメント</comment>
+ <comment xml:lang="kk">HTML құжаты</comment>
+ <comment xml:lang="ko">HTML 문서</comment>
+ <comment xml:lang="lt">HTML dokumentas</comment>
+ <comment xml:lang="lv">HTML dokuments</comment>
+ <comment xml:lang="nb">HTML-dokument</comment>
+ <comment xml:lang="nl">HTML-document</comment>
+ <comment xml:lang="nn">HTML-dokument</comment>
+ <comment xml:lang="pl">Dokument HTML</comment>
+ <comment xml:lang="pt_BR">Documento HTML</comment>
+ <comment xml:lang="ro">Document HTML</comment>
+ <comment xml:lang="ru">документ HTML</comment>
+ <comment xml:lang="sk">Dokument HTML</comment>
+ <comment xml:lang="sl">Dokument HTML</comment>
+ <comment xml:lang="sq">Dokument HTML</comment>
+ <comment xml:lang="sv">HTML-dokument</comment>
+ <comment xml:lang="uk">документ HTML</comment>
+ <comment xml:lang="vi">Tài liệu HTML</comment>
+ <comment xml:lang="zh_CN">HTML 文档</comment>
+ <comment xml:lang="zh_TW">HTML 文件</comment>
+ <acronym>HTML</acronym>
+ <expanded-acronym>HyperText Markup Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="&lt;!DOCTYPE HTML" type="string" offset="0:256"/>
+ <match value="&lt;!doctype html" type="string" offset="0:256"/>
+ <match value="&lt;HEAD" type="string" offset="0:256"/>
+ <match value="&lt;head" type="string" offset="0:256"/>
+ <match value="&lt;TITLE" type="string" offset="0:256"/>
+ <match value="&lt;title" type="string" offset="0:256"/>
+ <match value="&lt;HTML" type="string" offset="0:256"/>
+ <match value="&lt;html" type="string" offset="0:256"/>
+ <match value="&lt;SCRIPT" type="string" offset="0:256"/>
+ <match value="&lt;script" type="string" offset="0:256"/>
+ <match value="&lt;BODY" type="string" offset="0"/>
+ <match value="&lt;body" type="string" offset="0"/>
+ <match value="&lt;!--" type="string" offset="0"/>
+ <match value="&lt;h1" type="string" offset="0"/>
+ <match value="&lt;H1" type="string" offset="0"/>
+ <match value="&lt;!doctype HTML" type="string" offset="0"/>
+ <match value="&lt;!DOCTYPE html" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.html"/>
+ <glob pattern="*.htm"/>
+ </mime-type>
+ <mime-type type="text/cache-manifest">
+ <comment>Web application cache manifest</comment>
+ <comment xml:lang="ar">قائمة التخزين الموقت لتطبيق الويب</comment>
+ <comment xml:lang="bg">Манифест за кеша на уеб приложение</comment>
+ <comment xml:lang="ca">manifest de memòria cau d'aplicació Web</comment>
+ <comment xml:lang="cs">Manifest mezipaměti webové aplikace</comment>
+ <comment xml:lang="da">Manifest for internetprogrammellemlager</comment>
+ <comment xml:lang="de">Webanwendungscache-Manifest</comment>
+ <comment xml:lang="es">manifiesto de caché de aplicación web</comment>
+ <comment xml:lang="eu">Web aplikazioaren cache-aren agiria</comment>
+ <comment xml:lang="fo">Net nýtsluskipanarkova manifest</comment>
+ <comment xml:lang="fr">manifeste de cache d'application Web</comment>
+ <comment xml:lang="ga">lastliosta taisce d'fheidhmchlár Gréasáin</comment>
+ <comment xml:lang="gl">manifesto de caché de aplicativo web</comment>
+ <comment xml:lang="he">הצהרה של מטמון של תוכנית ברשת</comment>
+ <comment xml:lang="hu">Webalkalmazás gyorsítótár-összefoglalója</comment>
+ <comment xml:lang="id">Manifes singgahan aplikasi web</comment>
+ <comment xml:lang="it">Manifesto cache applicazione Web</comment>
+ <comment xml:lang="ja">Web アプリケーションキャッシュ manifest</comment>
+ <comment xml:lang="kk">Веб қолданбасының кэш манифесті</comment>
+ <comment xml:lang="ko">웹 애플리케이션 캐시 정의</comment>
+ <comment xml:lang="lt">Žiniatinklio programos podėlio manifestas</comment>
+ <comment xml:lang="lv">Tīmekļa lietotņu keša manifests</comment>
+ <comment xml:lang="pl">Manifest pamięci podręcznej aplikacji WWW</comment>
+ <comment xml:lang="ro">Manifest de cache pentru aplicații web</comment>
+ <comment xml:lang="ru">манифест кэша веб-приложения</comment>
+ <comment xml:lang="sl">Predpomnilnik spletnega programa</comment>
+ <comment xml:lang="sv">Cachemanifest för webbapplikation</comment>
+ <comment xml:lang="uk">маніфест кешу веб-програми</comment>
+ <comment xml:lang="zh_CN">网络应用程序缓存清单</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
+ <match value="CACHE MANIFEST" type="string" offset="0">
+ <match value="\x20" type="string" offset="14"/>
+ <match value="\x09" type="string" offset="14"/>
+ <match value="\x0a" type="string" offset="14"/>
+ <match value="\x0d" type="string" offset="14"/>
+ </match>
+ </magic>
+ <glob pattern="*.manifest"/>
+ </mime-type>
+ <mime-type type="text/x-google-video-pointer">
+ <comment>Google Video Pointer</comment>
+ <comment xml:lang="ar">مؤشر فيديو جوجل</comment>
+ <comment xml:lang="be@latin">Pakazalnik Google Video</comment>
+ <comment xml:lang="bg">Документ-указател към видео на Google</comment>
+ <comment xml:lang="ca">apuntador a vídeo de Google</comment>
+ <comment xml:lang="cs">Google Video Pointer</comment>
+ <comment xml:lang="da">Google Video-peger</comment>
+ <comment xml:lang="de">Google Video Pointer</comment>
+ <comment xml:lang="es">lista de reproducción de Google Video (GVP)</comment>
+ <comment xml:lang="eu">Google Video-ren erreprodukzio-zerrenda</comment>
+ <comment xml:lang="fi">Google-video-osoitin</comment>
+ <comment xml:lang="fo">Google Video Pointer</comment>
+ <comment xml:lang="fr">pointeur vidéo Google</comment>
+ <comment xml:lang="ga">pointeoir Google Video</comment>
+ <comment xml:lang="gl">punteiro de vídeo de Google</comment>
+ <comment xml:lang="he">מצביע וידאו של Google</comment>
+ <comment xml:lang="hu">Google Video Pointer</comment>
+ <comment xml:lang="id">Google Video Pointer</comment>
+ <comment xml:lang="it">Puntatore Google Video</comment>
+ <comment xml:lang="ja">Google ビデオポインター</comment>
+ <comment xml:lang="kk">Google Video Pointer</comment>
+ <comment xml:lang="ko">구글 비디오 포인터</comment>
+ <comment xml:lang="lt">Google Video Pointer</comment>
+ <comment xml:lang="lv">Google Video Pointer</comment>
+ <comment xml:lang="nb">Peker til Google Video</comment>
+ <comment xml:lang="nl">Google-videoverwijzing</comment>
+ <comment xml:lang="nn">Google Video-peikar</comment>
+ <comment xml:lang="pl">Lista odtwarzania Google Video</comment>
+ <comment xml:lang="pt_BR">Ponteiro do Google Vídeo</comment>
+ <comment xml:lang="ro">Indicator Google Video</comment>
+ <comment xml:lang="ru">Google Video Pointer</comment>
+ <comment xml:lang="sk">Google Video Pointer</comment>
+ <comment xml:lang="sl">Kazalec Google Video</comment>
+ <comment xml:lang="sq">Puntues Google Video</comment>
+ <comment xml:lang="sv">Google Video-pekare</comment>
+ <comment xml:lang="uk">вказівник відео Google</comment>
+ <comment xml:lang="vi">Con trỏ ảnh động Google</comment>
+ <comment xml:lang="zh_CN">Google 视频指向</comment>
+ <comment xml:lang="zh_TW">Google Video Pointer</comment>
+ <magic priority="50">
+ <match value="#.download.the.free.Google.Video.Player" type="string" offset="0"/>
+ <match value="# download the free Google Video Player" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.gvp"/>
+ <alias type="text/google-video-pointer"/>
+ </mime-type>
+ <mime-type type="text/x-haskell">
+ <comment>Haskell source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Haskell</comment>
+ <comment xml:lang="az">Haskell mənbə kodu</comment>
+ <comment xml:lang="be@latin">Kryničny kod Haskell</comment>
+ <comment xml:lang="bg">Изходен код на Haskell</comment>
+ <comment xml:lang="ca">codi font en Haskell</comment>
+ <comment xml:lang="cs">Zdrojový kód Haskell</comment>
+ <comment xml:lang="cy">Ffynhonnell rhaglen Haskell</comment>
+ <comment xml:lang="da">Haskellkildekode</comment>
+ <comment xml:lang="de">Haskell-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Haskell</comment>
+ <comment xml:lang="en_GB">Haskell source code</comment>
+ <comment xml:lang="eo">Haskell-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Haskell</comment>
+ <comment xml:lang="eu">Haskell iturburu-kodea</comment>
+ <comment xml:lang="fi">Haskell-lähdekoodi</comment>
+ <comment xml:lang="fo">Haskell keldukota</comment>
+ <comment xml:lang="fr">code source Haskell</comment>
+ <comment xml:lang="ga">cód foinseach Haskell</comment>
+ <comment xml:lang="gl">código fonte de Haskell</comment>
+ <comment xml:lang="he">קוד מקור של Haskell</comment>
+ <comment xml:lang="hu">Haskell-forráskód</comment>
+ <comment xml:lang="id">Kode program Haskell</comment>
+ <comment xml:lang="it">Codice sorgente Haskell</comment>
+ <comment xml:lang="ja">Haskell ソースコード</comment>
+ <comment xml:lang="kk">Haskell бастапқы коды</comment>
+ <comment xml:lang="ko">Haskell 소스 코드</comment>
+ <comment xml:lang="lt">Haskell pradinis kodas</comment>
+ <comment xml:lang="lv">Haskell pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Haskell</comment>
+ <comment xml:lang="nb">Haskell-kildekode</comment>
+ <comment xml:lang="nl">Haskell-broncode</comment>
+ <comment xml:lang="nn">Haskell-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Haskell</comment>
+ <comment xml:lang="pt">código fonte Haskell</comment>
+ <comment xml:lang="pt_BR">Código fonte Haskell</comment>
+ <comment xml:lang="ro">Cod sursă Haskell</comment>
+ <comment xml:lang="ru">исходный код Haskell</comment>
+ <comment xml:lang="sk">Zdrojový kód Haskell</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Haskell</comment>
+ <comment xml:lang="sq">Kod burues Haskell</comment>
+ <comment xml:lang="sr">Haskell изворни ко̂д</comment>
+ <comment xml:lang="sv">Haskell-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Haskell</comment>
+ <comment xml:lang="vi">Mã nguồn Haskell</comment>
+ <comment xml:lang="zh_CN">Haskell 源代码</comment>
+ <comment xml:lang="zh_TW">Haskell 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.hs"/>
+ </mime-type>
+ <mime-type type="text/x-idl">
+ <comment>IDL document</comment>
+ <comment xml:lang="ar">مستند IDL</comment>
+ <comment xml:lang="az">IDL sənədi</comment>
+ <comment xml:lang="be@latin">Dakument IDL</comment>
+ <comment xml:lang="bg">Документ — IDL</comment>
+ <comment xml:lang="ca">document IDL</comment>
+ <comment xml:lang="cs">Dokument IDL</comment>
+ <comment xml:lang="cy">Dogfen IDL</comment>
+ <comment xml:lang="da">IDL-dokument</comment>
+ <comment xml:lang="de">IDL-Dokument</comment>
+ <comment xml:lang="el">έγγραφο IDL</comment>
+ <comment xml:lang="en_GB">IDL document</comment>
+ <comment xml:lang="eo">IDL-dokumento</comment>
+ <comment xml:lang="es">documento IDL</comment>
+ <comment xml:lang="eu">IDL dokumentua</comment>
+ <comment xml:lang="fi">IDL-asiakirja</comment>
+ <comment xml:lang="fo">IDL skjal</comment>
+ <comment xml:lang="fr">document IDL</comment>
+ <comment xml:lang="ga">cáipéis IDL</comment>
+ <comment xml:lang="gl">documento IDL</comment>
+ <comment xml:lang="he">מסמך IDL</comment>
+ <comment xml:lang="hu">IDL-dokumentum</comment>
+ <comment xml:lang="id">Dokumen IDL</comment>
+ <comment xml:lang="it">Documento IDL</comment>
+ <comment xml:lang="ja">IDL ドキュメント</comment>
+ <comment xml:lang="kk">IDL құжаты</comment>
+ <comment xml:lang="ko">IDL 문서</comment>
+ <comment xml:lang="lt">IDL dokumentas</comment>
+ <comment xml:lang="lv">IDL dokuments</comment>
+ <comment xml:lang="ms">Dokumen IDL</comment>
+ <comment xml:lang="nb">IDL-dokument</comment>
+ <comment xml:lang="nl">IDL-document</comment>
+ <comment xml:lang="nn">IDL-dokument</comment>
+ <comment xml:lang="pl">Dokument IDL</comment>
+ <comment xml:lang="pt">documento IDL</comment>
+ <comment xml:lang="pt_BR">Documento IDL</comment>
+ <comment xml:lang="ro">Document IDL</comment>
+ <comment xml:lang="ru">документ IDL</comment>
+ <comment xml:lang="sk">Dokument IDL</comment>
+ <comment xml:lang="sl">Dokument IDL</comment>
+ <comment xml:lang="sq">Dokument IDL</comment>
+ <comment xml:lang="sr">IDL документ</comment>
+ <comment xml:lang="sv">IDL-dokument</comment>
+ <comment xml:lang="uk">документ IDL</comment>
+ <comment xml:lang="vi">Tài liệu IDL</comment>
+ <comment xml:lang="zh_CN">IDL 文档</comment>
+ <comment xml:lang="zh_TW">IDL 文件</comment>
+ <acronym>IDL</acronym>
+ <expanded-acronym>Interface Definition Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.idl"/>
+ </mime-type>
+ <mime-type type="text/x-install">
+ <comment>installation instructions</comment>
+ <comment xml:lang="ar">تعليمات التثبيت</comment>
+ <comment xml:lang="be@latin">instrukcyja dla instalavańnia</comment>
+ <comment xml:lang="bg">Инструкции за инсталация</comment>
+ <comment xml:lang="ca">instruccions d'instal·lació</comment>
+ <comment xml:lang="cs">Návod k instalaci</comment>
+ <comment xml:lang="da">installationsinstruktioner</comment>
+ <comment xml:lang="de">Installationsanleitung</comment>
+ <comment xml:lang="en_GB">installation instructions</comment>
+ <comment xml:lang="es">instrucciones de instalación</comment>
+ <comment xml:lang="eu">instalazioaren instrukzioak</comment>
+ <comment xml:lang="fi">asennusohjeet</comment>
+ <comment xml:lang="fo">innleggingar vegleiðing</comment>
+ <comment xml:lang="fr">instructions d'installation</comment>
+ <comment xml:lang="ga">treoracha suiteála</comment>
+ <comment xml:lang="gl">instrucións de instalación</comment>
+ <comment xml:lang="he">הוראות התקנה</comment>
+ <comment xml:lang="hu">telepítési utasítások</comment>
+ <comment xml:lang="id">instruksi instalasi</comment>
+ <comment xml:lang="it">Istruzioni di installazione</comment>
+ <comment xml:lang="ja">ソフトウェアインストール説明</comment>
+ <comment xml:lang="kk">бағдарламаны орнату нұсқаулары</comment>
+ <comment xml:lang="ko">설치 방법</comment>
+ <comment xml:lang="lt">diegimo instrukcijos</comment>
+ <comment xml:lang="lv">instalācijas instrukcijas</comment>
+ <comment xml:lang="nb">installationsinstruksjoner</comment>
+ <comment xml:lang="nl">installatie-instructies</comment>
+ <comment xml:lang="nn">installasjonsinstruksjonar</comment>
+ <comment xml:lang="pl">Instrukcje instalacji</comment>
+ <comment xml:lang="pt_BR">instruções de instalação</comment>
+ <comment xml:lang="ro">instrucțiuni de instalare</comment>
+ <comment xml:lang="ru">инструкции по установке программы</comment>
+ <comment xml:lang="sk">Návod na inštaláciu</comment>
+ <comment xml:lang="sl">navodila namestitve</comment>
+ <comment xml:lang="sq">Udhëzime instalimi</comment>
+ <comment xml:lang="sv">installationsinstruktioner</comment>
+ <comment xml:lang="uk">інструкції з встановлення</comment>
+ <comment xml:lang="vi">hướng dẫn cài đặt</comment>
+ <comment xml:lang="zh_CN">软件安装指南</comment>
+ <comment xml:lang="zh_TW">安裝指引</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="INSTALL"/>
+ </mime-type>
+ <mime-type type="text/x-java">
+ <comment>Java source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Java</comment>
+ <comment xml:lang="be@latin">Kryničny kod Java</comment>
+ <comment xml:lang="bg">Изходен код на Java</comment>
+ <comment xml:lang="ca">codi font en Java</comment>
+ <comment xml:lang="cs">Zdrojový kód v Javě</comment>
+ <comment xml:lang="da">Javakildekode</comment>
+ <comment xml:lang="de">Java-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Java</comment>
+ <comment xml:lang="en_GB">Java source code</comment>
+ <comment xml:lang="eo">Java-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Java</comment>
+ <comment xml:lang="eu">Java iturburu-kodea</comment>
+ <comment xml:lang="fi">Java-lähdekoodi</comment>
+ <comment xml:lang="fo">Java keldukota</comment>
+ <comment xml:lang="fr">code source Java</comment>
+ <comment xml:lang="ga">cód foinseach Java</comment>
+ <comment xml:lang="gl">código fonte de Java</comment>
+ <comment xml:lang="he">קוד מקור ב־Java</comment>
+ <comment xml:lang="hu">Java-forráskód</comment>
+ <comment xml:lang="id">Kode program Java</comment>
+ <comment xml:lang="it">Codice sorgente Java</comment>
+ <comment xml:lang="ja">Java ソースコード</comment>
+ <comment xml:lang="kk">Java бастапқы коды</comment>
+ <comment xml:lang="ko">자바 소스 코드</comment>
+ <comment xml:lang="lt">Java pradinis kodas</comment>
+ <comment xml:lang="lv">Java pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Java</comment>
+ <comment xml:lang="nb">Java-kildekode</comment>
+ <comment xml:lang="nl">Java-broncode</comment>
+ <comment xml:lang="nn">Java-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Java</comment>
+ <comment xml:lang="pt">código fonte Java</comment>
+ <comment xml:lang="pt_BR">Código fonte Java</comment>
+ <comment xml:lang="ro">Cod sursă Java</comment>
+ <comment xml:lang="ru">исходный код Java</comment>
+ <comment xml:lang="sk">Zdrojový kód Java</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Java</comment>
+ <comment xml:lang="sq">Kod burues Java</comment>
+ <comment xml:lang="sr">Јава изворни ко̂д</comment>
+ <comment xml:lang="sv">Java-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Java</comment>
+ <comment xml:lang="vi">Mã nguồn Java</comment>
+ <comment xml:lang="zh_CN">Java 源代码</comment>
+ <comment xml:lang="zh_TW">Java 源代碼</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.java"/>
+ </mime-type>
+ <mime-type type="text/x-ldif">
+ <comment>LDIF address book</comment>
+ <comment xml:lang="ar">دفتر عناوين LDIF</comment>
+ <comment xml:lang="be@latin">Adrasnaja kniha LDIF</comment>
+ <comment xml:lang="bg">Адресна книга — LDIF</comment>
+ <comment xml:lang="ca">llibreta d'adreces LDIF</comment>
+ <comment xml:lang="cs">Adresář LDIF</comment>
+ <comment xml:lang="da">LDIF-adressebog</comment>
+ <comment xml:lang="de">LDIF-Adressbuch</comment>
+ <comment xml:lang="eo">LDIF-adresaro</comment>
+ <comment xml:lang="es">libreta de direcciones LDIF</comment>
+ <comment xml:lang="eu">LDIF helbide-liburua</comment>
+ <comment xml:lang="fi">LDIF-osoitekirja</comment>
+ <comment xml:lang="fo">LDIF adressubók</comment>
+ <comment xml:lang="fr">carnet d'adresses LDIF</comment>
+ <comment xml:lang="ga">leabhar sheoltaí LDIF</comment>
+ <comment xml:lang="gl">lista de enderezos LDIF</comment>
+ <comment xml:lang="he">ספר כתובות של LDIF</comment>
+ <comment xml:lang="hu">LDIF címjegyzék</comment>
+ <comment xml:lang="id">Buku alamat LDIF</comment>
+ <comment xml:lang="it">Rubrica LDIF</comment>
+ <comment xml:lang="ja">LDIF アドレス帳</comment>
+ <comment xml:lang="kk">LDIF адрестер кітабы</comment>
+ <comment xml:lang="ko">LDIF 주소록</comment>
+ <comment xml:lang="lt">LDIF adresų knygelė</comment>
+ <comment xml:lang="lv">LDIF adrešu grāmata</comment>
+ <comment xml:lang="nb">LDIF-adressebok</comment>
+ <comment xml:lang="nl">LDIF-adresboek</comment>
+ <comment xml:lang="nn">LDIF-adressebok</comment>
+ <comment xml:lang="pl">Książka adresowa LDIF</comment>
+ <comment xml:lang="pt_BR">Livro de endereços LDIF</comment>
+ <comment xml:lang="ro">Agendă LDIF</comment>
+ <comment xml:lang="ru">адресная книга LDIF</comment>
+ <comment xml:lang="sk">Adresár LDIF</comment>
+ <comment xml:lang="sl">Datoteka imenika naslovov LDIF</comment>
+ <comment xml:lang="sq">Rubrikë LDIF</comment>
+ <comment xml:lang="sv">LDIF-adressbok</comment>
+ <comment xml:lang="uk">адресна книга LDIF</comment>
+ <comment xml:lang="vi">Sổ địa chỉ LDIF</comment>
+ <comment xml:lang="zh_CN">LDIF 地址簿</comment>
+ <comment xml:lang="zh_TW">LDIF 通訊錄</comment>
+ <acronym>LDIF</acronym>
+ <expanded-acronym>LDAP Data Interchange Format</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="dn: cn=" type="string" offset="0"/>
+ <match value="dn: mail=" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.ldif"/>
+ </mime-type>
+ <mime-type type="text/x-lilypond">
+ <comment>Lilypond music sheet</comment>
+ <comment xml:lang="ar">صفحة موسيقى Lilypond</comment>
+ <comment xml:lang="be@latin">Muzyčny arkuš Lilypond</comment>
+ <comment xml:lang="bg">Нотация на Lilypond</comment>
+ <comment xml:lang="ca">full de música Lilypond</comment>
+ <comment xml:lang="cs">Notový papír Lilypond</comment>
+ <comment xml:lang="da">Lilypondmusikkort</comment>
+ <comment xml:lang="de">Lilypond-Notenblatt</comment>
+ <comment xml:lang="es">hoja de música Lilypond</comment>
+ <comment xml:lang="eu">Lilypond musika-orria</comment>
+ <comment xml:lang="fi">Lilypond-nuotit</comment>
+ <comment xml:lang="fo">Lilypond tónleika ark</comment>
+ <comment xml:lang="fr">partition musicale Lilypond</comment>
+ <comment xml:lang="ga">bileog cheoil Lilypond</comment>
+ <comment xml:lang="gl">folla de música de Lilypond</comment>
+ <comment xml:lang="he">דף מוזיקה של Lilypond</comment>
+ <comment xml:lang="hu">Lilypond kotta</comment>
+ <comment xml:lang="id">Lembar musik Lilypond</comment>
+ <comment xml:lang="it">Partitura Lilypond</comment>
+ <comment xml:lang="ja">Lilypond 楽譜データ</comment>
+ <comment xml:lang="kk">Lilypond музыка тізімі</comment>
+ <comment xml:lang="ko">Lilypond 음악 시트</comment>
+ <comment xml:lang="lt">Lilypond muzikos lapas</comment>
+ <comment xml:lang="lv">Lilypond mūzikas lapa</comment>
+ <comment xml:lang="nl">Lilypond-muziekblad</comment>
+ <comment xml:lang="nn">Lilypond noteark</comment>
+ <comment xml:lang="pl">Plik partytury Lilypond</comment>
+ <comment xml:lang="pt_BR">Folha de música do Lilypond</comment>
+ <comment xml:lang="ro">Fișă muzică Lilypond</comment>
+ <comment xml:lang="ru">список музыки Lilypond</comment>
+ <comment xml:lang="sk">Notový papier Lilypond</comment>
+ <comment xml:lang="sl">Glasbena predloga Lilypond</comment>
+ <comment xml:lang="sq">Partiturë Lilypond</comment>
+ <comment xml:lang="sv">Lilypond-notblad</comment>
+ <comment xml:lang="uk">нотний запис Lilypond</comment>
+ <comment xml:lang="vi">Bản nhạc Lilypond</comment>
+ <comment xml:lang="zh_CN">Lilypond 乐谱</comment>
+ <comment xml:lang="zh_TW">Lilypond 樂譜</comment>
+ <glob pattern="*.ly"/>
+ <sub-class-of type="text/plain"/>
+ </mime-type>
+ <mime-type type="text/x-literate-haskell">
+ <comment>LHS source code</comment>
+ <comment xml:lang="ar">شفرة مصدر LHS</comment>
+ <comment xml:lang="be@latin">Kryničny kod LHS</comment>
+ <comment xml:lang="bg">Изходен код на LHS</comment>
+ <comment xml:lang="ca">codi font en LHS</comment>
+ <comment xml:lang="cs">Zdrojový kód v LHS</comment>
+ <comment xml:lang="da">LHS-kildekode</comment>
+ <comment xml:lang="de">LHS-Quelltext</comment>
+ <comment xml:lang="en_GB">LHS source code</comment>
+ <comment xml:lang="eo">LHS-fontkodo</comment>
+ <comment xml:lang="es">código fuente en LHS</comment>
+ <comment xml:lang="eu">LHS iturburu-kodea</comment>
+ <comment xml:lang="fi">LHS-lähdekoodi</comment>
+ <comment xml:lang="fo">LHS keld</comment>
+ <comment xml:lang="fr">code source LHS</comment>
+ <comment xml:lang="ga">cód foinseach LHS</comment>
+ <comment xml:lang="gl">código fonte en LHS</comment>
+ <comment xml:lang="he">קוד מקור של LHS</comment>
+ <comment xml:lang="hu">LHS forráskód</comment>
+ <comment xml:lang="id">Kode program LHS</comment>
+ <comment xml:lang="it">Codice sorgente LHS</comment>
+ <comment xml:lang="ja">LHS ソースコード</comment>
+ <comment xml:lang="kk">LHS бастапқы коды</comment>
+ <comment xml:lang="ko">LHS 소스 코드</comment>
+ <comment xml:lang="lt">LHS pradinis kodas</comment>
+ <comment xml:lang="lv">LHS pirmkods</comment>
+ <comment xml:lang="nb">LHS-kildekode</comment>
+ <comment xml:lang="nl">LHS-broncode</comment>
+ <comment xml:lang="nn">LHS-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy LHS</comment>
+ <comment xml:lang="pt_BR">Código fonte LHS</comment>
+ <comment xml:lang="ro">Cod sursă LHS</comment>
+ <comment xml:lang="ru">исходный код LHS</comment>
+ <comment xml:lang="sk">Zdrojový kód LHS</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode LHS</comment>
+ <comment xml:lang="sq">Kod burues LHS</comment>
+ <comment xml:lang="sv">LHS-källkod</comment>
+ <comment xml:lang="uk">вихідний код LHS</comment>
+ <comment xml:lang="vi">Mã nguồn LHS</comment>
+ <comment xml:lang="zh_CN">LHS 源代码</comment>
+ <comment xml:lang="zh_TW">LHS 源代碼</comment>
+ <acronym>LHS</acronym>
+ <expanded-acronym>Literate Haskell source code</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.lhs"/>
+ </mime-type>
+ <mime-type type="text/x-log">
+ <comment>application log</comment>
+ <comment xml:lang="ar">سجل التطبيق</comment>
+ <comment xml:lang="be@latin">časopis aplikacyi</comment>
+ <comment xml:lang="bg">Файл-дневник на приложение</comment>
+ <comment xml:lang="ca">registre d'aplicació</comment>
+ <comment xml:lang="cs">Záznam aplikace</comment>
+ <comment xml:lang="da">programlog</comment>
+ <comment xml:lang="de">Anwendungsprotokoll</comment>
+ <comment xml:lang="el">ημερολόγιο συμβάντων εφαρμογής</comment>
+ <comment xml:lang="en_GB">application log</comment>
+ <comment xml:lang="eo">protokolo de aplikaĵo</comment>
+ <comment xml:lang="es">registro de aplicación</comment>
+ <comment xml:lang="eu">aplikazio egunkaria</comment>
+ <comment xml:lang="fi">sovelluksen lokitiedosto</comment>
+ <comment xml:lang="fo">nýtsluskipan logg</comment>
+ <comment xml:lang="fr">journal d'application</comment>
+ <comment xml:lang="ga">logchomhad feidhmchláir</comment>
+ <comment xml:lang="gl">rexistro de aplicativo</comment>
+ <comment xml:lang="he">יומן התוכנה</comment>
+ <comment xml:lang="hu">alkalmazás naplója</comment>
+ <comment xml:lang="id">log aplikasi</comment>
+ <comment xml:lang="it">Log applicazione</comment>
+ <comment xml:lang="ja">アプリケーションログ</comment>
+ <comment xml:lang="kk">мәлімдемелер журналы</comment>
+ <comment xml:lang="ko">프로그램 기록</comment>
+ <comment xml:lang="lt">programos žurnalas</comment>
+ <comment xml:lang="lv">lietotnes žurnāls</comment>
+ <comment xml:lang="ms">Log aplikasi</comment>
+ <comment xml:lang="nb">applikasjonslogg</comment>
+ <comment xml:lang="nl">programma-logbestand</comment>
+ <comment xml:lang="nn">programlogg</comment>
+ <comment xml:lang="pl">Dziennik programu</comment>
+ <comment xml:lang="pt">registo de aplicação</comment>
+ <comment xml:lang="pt_BR">Registro de aplicação</comment>
+ <comment xml:lang="ro">înregistrare aplicație</comment>
+ <comment xml:lang="ru">журнал сообщений</comment>
+ <comment xml:lang="sk">Záznam aplikácie</comment>
+ <comment xml:lang="sl">dnevnik programa</comment>
+ <comment xml:lang="sq">log i mesazheve të programit</comment>
+ <comment xml:lang="sr">дневник програма</comment>
+ <comment xml:lang="sv">programlogg</comment>
+ <comment xml:lang="uk">журнал програми</comment>
+ <comment xml:lang="vi">bản ghi ứng dụng</comment>
+ <comment xml:lang="zh_CN">应用程序日志</comment>
+ <comment xml:lang="zh_TW">程式紀錄檔</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.log"/>
+ </mime-type>
+ <mime-type type="text/x-makefile">
+ <comment>Makefile</comment>
+ <comment xml:lang="ar">ملف Makefile</comment>
+ <comment xml:lang="az">İnşa faylı</comment>
+ <comment xml:lang="be@latin">Makefile</comment>
+ <comment xml:lang="bg">Файл — make</comment>
+ <comment xml:lang="ca">Makefile</comment>
+ <comment xml:lang="cs">Makefile</comment>
+ <comment xml:lang="cy">Ffeil "make"</comment>
+ <comment xml:lang="da">Bygningsfil</comment>
+ <comment xml:lang="de">Makefile</comment>
+ <comment xml:lang="el">Makefile</comment>
+ <comment xml:lang="en_GB">Makefile</comment>
+ <comment xml:lang="eo">Muntodosiero</comment>
+ <comment xml:lang="es">Makefile</comment>
+ <comment xml:lang="eu">Makefile</comment>
+ <comment xml:lang="fi">Makefile</comment>
+ <comment xml:lang="fo">Makefile</comment>
+ <comment xml:lang="fr">makefile</comment>
+ <comment xml:lang="ga">Makefile</comment>
+ <comment xml:lang="gl">Makefile</comment>
+ <comment xml:lang="he">Makefile</comment>
+ <comment xml:lang="hu">Makefile</comment>
+ <comment xml:lang="id">Makefile</comment>
+ <comment xml:lang="it">Makefile</comment>
+ <comment xml:lang="ja">Makefile</comment>
+ <comment xml:lang="kk">Makefile (жинау файлы)</comment>
+ <comment xml:lang="ko">Makefile</comment>
+ <comment xml:lang="lt">Makefile</comment>
+ <comment xml:lang="lv">Makefile</comment>
+ <comment xml:lang="ms">Makefile</comment>
+ <comment xml:lang="nb">Makefile</comment>
+ <comment xml:lang="nl">Makefile</comment>
+ <comment xml:lang="nn">Makefile</comment>
+ <comment xml:lang="pl">Plik make</comment>
+ <comment xml:lang="pt">Makefile</comment>
+ <comment xml:lang="pt_BR">Makefile (arquivo do make)</comment>
+ <comment xml:lang="ro">Makefile</comment>
+ <comment xml:lang="ru">Makefile (файл сборки)</comment>
+ <comment xml:lang="sk">Makefile</comment>
+ <comment xml:lang="sl">Datoteka Makefile</comment>
+ <comment xml:lang="sq">Makefile</comment>
+ <comment xml:lang="sr">Производна датотека</comment>
+ <comment xml:lang="sv">Makefil</comment>
+ <comment xml:lang="uk">файл проекту make</comment>
+ <comment xml:lang="vi">Tập tin tạo ứng dụng (Makefile)</comment>
+ <comment xml:lang="zh_CN">Makefile</comment>
+ <comment xml:lang="zh_TW">Makefile</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="makefile"/>
+ <glob pattern="GNUmakefile"/>
+ <glob weight="10" pattern="Makefile.*"/>
+ <magic priority="50">
+ <match value="#!/usr/bin/make" type="string" offset="0"/>
+ <match value="#! /usr/bin/make" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="text/x-markdown">
+ <comment>Markdown document</comment>
+ <comment xml:lang="bg">Документ — Markdown</comment>
+ <comment xml:lang="ca">document Markdown</comment>
+ <comment xml:lang="cs">Dokument Markdown</comment>
+ <comment xml:lang="es">Documento de Markdown</comment>
+ <comment xml:lang="fi">Markdown-asiakirja</comment>
+ <comment xml:lang="fr">document Markdown</comment>
+ <comment xml:lang="gl">documento de Markdown</comment>
+ <comment xml:lang="he">מסמך Markdown</comment>
+ <comment xml:lang="id">Dokumen markdown</comment>
+ <comment xml:lang="it">Documento Markdown</comment>
+ <comment xml:lang="ja">Markdown </comment>
+ <comment xml:lang="kk">Markdown құжаты</comment>
+ <comment xml:lang="lv">Markdown dokuments</comment>
+ <comment xml:lang="pl">Dokument Markdown</comment>
+ <comment xml:lang="ru">документ Markdown</comment>
+ <comment xml:lang="sl">Dokument Markdown</comment>
+ <comment xml:lang="uk">документ Markdown</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.md"/>
+ <glob pattern="*.mkd"/>
+ <glob pattern="*.markdown"/>
+ </mime-type>
+ <mime-type type="text/x-moc">
+ <comment>Qt MOC file</comment>
+ <comment xml:lang="ar">ملف Qt MOC</comment>
+ <comment xml:lang="be@latin">Fajł Qt MOC</comment>
+ <comment xml:lang="bg">Файл — Qt MOC</comment>
+ <comment xml:lang="ca">fitxer MOC de Qt</comment>
+ <comment xml:lang="cs">Soubor Qt MOC</comment>
+ <comment xml:lang="da">Qt MOC-fil</comment>
+ <comment xml:lang="de">Qt-MOC-Datei</comment>
+ <comment xml:lang="en_GB">Qt MOC file</comment>
+ <comment xml:lang="es">archivo MOC Qt</comment>
+ <comment xml:lang="eu">Qt MOC fitxategia</comment>
+ <comment xml:lang="fi">Qt MOC -tiedosto</comment>
+ <comment xml:lang="fo">Qt MOC fíla</comment>
+ <comment xml:lang="fr">fichier Qt MOC</comment>
+ <comment xml:lang="ga">comhad MOC Qt</comment>
+ <comment xml:lang="gl">ficheiro MOC Qt</comment>
+ <comment xml:lang="he">קובץ Qt MOC</comment>
+ <comment xml:lang="hu">Qt MOC fájl</comment>
+ <comment xml:lang="id">Berkas Qt MOC</comment>
+ <comment xml:lang="it">File MOC Qt</comment>
+ <comment xml:lang="ja">Qt MOC ファイル</comment>
+ <comment xml:lang="kk">Qt MOC файлы</comment>
+ <comment xml:lang="ko">Qt MOC 파일</comment>
+ <comment xml:lang="lt">Qt MOC failas</comment>
+ <comment xml:lang="lv">Qt MOC fails</comment>
+ <comment xml:lang="nb">Qt MOC-fil</comment>
+ <comment xml:lang="nl">Qt MOC-bestand</comment>
+ <comment xml:lang="nn">Qt MOC-fil</comment>
+ <comment xml:lang="pl">Plik Qt MOC</comment>
+ <comment xml:lang="pt_BR">Arquivo Qt MOC</comment>
+ <comment xml:lang="ro">Fișier Qt MOC</comment>
+ <comment xml:lang="ru">файл Qt MOC</comment>
+ <comment xml:lang="sk">Súbor Qt MOC</comment>
+ <comment xml:lang="sl">Datoteka Qt MOC</comment>
+ <comment xml:lang="sq">File Qt MOC</comment>
+ <comment xml:lang="sv">Qt MOC-fil</comment>
+ <comment xml:lang="uk">файл-метаоб'єкт Qt</comment>
+ <comment xml:lang="vi">Tập tin MOC của Qt</comment>
+ <comment xml:lang="zh_CN">Qt 元对象编译文件</comment>
+ <comment xml:lang="zh_TW">Qt MOC 檔</comment>
+ <acronym>Qt MOC</acronym>
+ <expanded-acronym>Qt Meta Object Compiler</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.moc"/>
+ </mime-type>
+ <mime-type type="text/x-ms-regedit">
+ <comment>Windows Registry extract</comment>
+ <comment xml:lang="ar">استخراج مسجل ويندوز</comment>
+ <comment xml:lang="be@latin">Element rehistru Windows</comment>
+ <comment xml:lang="bg">Извадка от регистъра на Windows</comment>
+ <comment xml:lang="ca">extracte del registre de Windows</comment>
+ <comment xml:lang="cs">Část registrů Windows</comment>
+ <comment xml:lang="da">Windows Registy-udtrækning</comment>
+ <comment xml:lang="de">Windows-Registry-Auszug</comment>
+ <comment xml:lang="es">extracto del registro de Windows</comment>
+ <comment xml:lang="eu">Windows-eko erregistro erauzlea</comment>
+ <comment xml:lang="fi">Windows-rekisteritietue</comment>
+ <comment xml:lang="fo">Windows Registry úrdráttur</comment>
+ <comment xml:lang="fr">extrait de registre Windows</comment>
+ <comment xml:lang="ga">sliocht as Clárlann Windows</comment>
+ <comment xml:lang="gl">Extracto do rexistro de Windows</comment>
+ <comment xml:lang="he">קובץ Registry של Windows</comment>
+ <comment xml:lang="hu">Windows Registry kivonat</comment>
+ <comment xml:lang="id">Ekstrak Windows Registry</comment>
+ <comment xml:lang="it">Estratto Windows Registry</comment>
+ <comment xml:lang="ja">WIndows レジストリ抽出ファイル</comment>
+ <comment xml:lang="kk">Windows Registry бөлігі</comment>
+ <comment xml:lang="ko">윈도우 레지스트리 파일</comment>
+ <comment xml:lang="lt">Windows registro ištrauka</comment>
+ <comment xml:lang="lv">Windows Registry izvilkums</comment>
+ <comment xml:lang="nb">Utdrag av Windows Registry</comment>
+ <comment xml:lang="nl">Windows Registry-extract</comment>
+ <comment xml:lang="nn">Windows Registry-utdrag</comment>
+ <comment xml:lang="pl">Wycinek rejestru Windows</comment>
+ <comment xml:lang="pt_BR">Extrator de registro do Windows</comment>
+ <comment xml:lang="ro">Extras al registrului Windows</comment>
+ <comment xml:lang="ru">фрагмент Windows Registry</comment>
+ <comment xml:lang="sk">Časť registrov Windows</comment>
+ <comment xml:lang="sl">izvleček vpisnika Windows</comment>
+ <comment xml:lang="sq">Pjesë Windows Registry</comment>
+ <comment xml:lang="sv">Windows Registry-utdrag</comment>
+ <comment xml:lang="uk">частина реєстру Windows</comment>
+ <comment xml:lang="vi">Bản trích Registry Windows</comment>
+ <comment xml:lang="zh_CN">Windows 注册表文件</comment>
+ <comment xml:lang="zh_TW">Windows Registry 抽出</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="REGEDIT" type="string" offset="0"/>
+ <match value="Windows Registry Editor Version 5.00" type="string" offset="0"/>
+ <match value="\xff\xfeW\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x00R\x00e\x00g\x00i\x00s\x00t\x00r\x00y\x00 \x00E\x00d\x00i\x00t\x00o\x00r\x00" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.reg"/>
+ </mime-type>
+ <mime-type type="text/x-mof">
+ <comment>Managed Object Format</comment>
+ <comment xml:lang="ar">صيغة كائن مدار</comment>
+ <comment xml:lang="be@latin">Farmat Managed Object</comment>
+ <comment xml:lang="bg">Управлявани обекти — MOF</comment>
+ <comment xml:lang="ca">format d'objecte gestionat</comment>
+ <comment xml:lang="cs">Managed Object Format</comment>
+ <comment xml:lang="da">Håndteret objektformat</comment>
+ <comment xml:lang="de">Managed Object Format</comment>
+ <comment xml:lang="es">formato de objeto manejado</comment>
+ <comment xml:lang="eu">Kudeatutako objektu formatua</comment>
+ <comment xml:lang="fi">Managed Object Format</comment>
+ <comment xml:lang="fr">format Managed Object</comment>
+ <comment xml:lang="ga">formáid réada bainistithe</comment>
+ <comment xml:lang="gl">formato de obxecto xestionado</comment>
+ <comment xml:lang="he">פורמט ניהול אובייקט</comment>
+ <comment xml:lang="hu">Felügyelt objektum (MO) formátum</comment>
+ <comment xml:lang="id">Managed Object Format</comment>
+ <comment xml:lang="it">Managed Object Format</comment>
+ <comment xml:lang="ja">管理オブジェクトフォーマット</comment>
+ <comment xml:lang="kk">Басқарылатын объект пішімі</comment>
+ <comment xml:lang="ko">관리되는 오브젝트 형식</comment>
+ <comment xml:lang="lt">Sutvarkytų objektų formatas</comment>
+ <comment xml:lang="lv">Pārvaldītu objektu formāts</comment>
+ <comment xml:lang="nb">Managed Object Format</comment>
+ <comment xml:lang="nl">Managed Object Format</comment>
+ <comment xml:lang="nn">Managed Object Format</comment>
+ <comment xml:lang="pl">Plik Managed Object Format</comment>
+ <comment xml:lang="pt_BR">Formato de objeto gerenciado</comment>
+ <comment xml:lang="ro">Managed Object Format</comment>
+ <comment xml:lang="ru">формат управляемого объекта</comment>
+ <comment xml:lang="sk">Formát Managed Object</comment>
+ <comment xml:lang="sl">Datoteka Managed Object</comment>
+ <comment xml:lang="sq">Managed Object Format</comment>
+ <comment xml:lang="sv">Managed Object Format</comment>
+ <comment xml:lang="uk">формат керування об’єктами</comment>
+ <comment xml:lang="vi">Định dạng Đối tượng đã Quản lý</comment>
+ <comment xml:lang="zh_CN">托管对象格式</comment>
+ <comment xml:lang="zh_TW">Managed Object Format</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <glob pattern="*.mof"/>
+ </mime-type>
+ <mime-type type="text/x-mup">
+ <comment>Mup publication</comment>
+ <comment xml:lang="ar">منشور Mup</comment>
+ <comment xml:lang="be@latin">Publikacyja Mup</comment>
+ <comment xml:lang="bg">Издание — Mup</comment>
+ <comment xml:lang="ca">publicació Mup</comment>
+ <comment xml:lang="cs">Publikace Mup</comment>
+ <comment xml:lang="da">Mupudgivelse</comment>
+ <comment xml:lang="de">Mup-Veröffentlichung</comment>
+ <comment xml:lang="en_GB">Mup publication</comment>
+ <comment xml:lang="es">publicación Mup</comment>
+ <comment xml:lang="eu">Mup publikazioa</comment>
+ <comment xml:lang="fi">Mup-julkaisu</comment>
+ <comment xml:lang="fo">Mup útgáva</comment>
+ <comment xml:lang="fr">publication Mup</comment>
+ <comment xml:lang="ga">foilseachán Mup</comment>
+ <comment xml:lang="gl">publicación Mup</comment>
+ <comment xml:lang="he">פרסום של Mup</comment>
+ <comment xml:lang="hu">Mup publikáció</comment>
+ <comment xml:lang="id">Publikasi Mup</comment>
+ <comment xml:lang="it">Pubblicazione Mup</comment>
+ <comment xml:lang="ja">Mup 出版ファイル</comment>
+ <comment xml:lang="kk">Mup жариялымы</comment>
+ <comment xml:lang="ko">Mup 출판</comment>
+ <comment xml:lang="lt">Mup leidinys</comment>
+ <comment xml:lang="lv">Mup publikācija</comment>
+ <comment xml:lang="nb">Mup publikasjon</comment>
+ <comment xml:lang="nl">Mup-publicatie</comment>
+ <comment xml:lang="nn">Mup-publikasjon</comment>
+ <comment xml:lang="pl">Publikacja Mup</comment>
+ <comment xml:lang="pt_BR">Publicação do Mup</comment>
+ <comment xml:lang="ro">Publicație Mup</comment>
+ <comment xml:lang="ru">публикация Mup</comment>
+ <comment xml:lang="sk">Publikácie Mup</comment>
+ <comment xml:lang="sl">Datoteka objave Mup</comment>
+ <comment xml:lang="sq">Publikim Mup</comment>
+ <comment xml:lang="sv">Mup-publicering</comment>
+ <comment xml:lang="uk">публікація Mup</comment>
+ <comment xml:lang="vi">Bản xuất Mup</comment>
+ <comment xml:lang="zh_CN">Mup 应用程序</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="//!Mup" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.mup"/>
+ <glob pattern="*.not"/>
+ </mime-type>
+ <mime-type type="text/x-objcsrc">
+ <comment>Objective-C source code</comment>
+ <comment xml:lang="ar">شفرة مصدر الهدف-C </comment>
+ <comment xml:lang="be@latin">Kryničny kod Objective-C</comment>
+ <comment xml:lang="bg">Изходен код — Objective C</comment>
+ <comment xml:lang="ca">codi font en Objective-C</comment>
+ <comment xml:lang="cs">Zdrojový kód v Objective-C</comment>
+ <comment xml:lang="da">Objektiv C-kildekode</comment>
+ <comment xml:lang="de">Objective-C-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Objective-C</comment>
+ <comment xml:lang="en_GB">Objective-C source code</comment>
+ <comment xml:lang="eo">fontkodo en Objective-C</comment>
+ <comment xml:lang="es">código fuente en Objective-C</comment>
+ <comment xml:lang="eu">Objective-C iturburu-kodea</comment>
+ <comment xml:lang="fi">Objective-C-lähdekoodi</comment>
+ <comment xml:lang="fo">Objective-C keldukota</comment>
+ <comment xml:lang="fr">code source Objective-C</comment>
+ <comment xml:lang="ga">cód foinseach Objective-C</comment>
+ <comment xml:lang="gl">código fonte de Objective-C</comment>
+ <comment xml:lang="he">קוד מקור של Objective-C</comment>
+ <comment xml:lang="hu">Objective-C forráskód</comment>
+ <comment xml:lang="id">Kode program Objective-C</comment>
+ <comment xml:lang="it">Codice sorgente Objective-C</comment>
+ <comment xml:lang="ja">Objective-C ソースコード</comment>
+ <comment xml:lang="kk">Objective-C бастапқы коды</comment>
+ <comment xml:lang="ko">Objective-C 소스 코드</comment>
+ <comment xml:lang="lt">Objective-C pradinis kodas</comment>
+ <comment xml:lang="lv">Objective-C pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Objective-C</comment>
+ <comment xml:lang="nb">Objective-C-kildekode</comment>
+ <comment xml:lang="nl">Objective-C-broncode</comment>
+ <comment xml:lang="nn">Objective-C-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Objective-C</comment>
+ <comment xml:lang="pt">código fonte Objective-C</comment>
+ <comment xml:lang="pt_BR">Código fonte Objective-C</comment>
+ <comment xml:lang="ro">Cod sursă Objective-C</comment>
+ <comment xml:lang="ru">исходный код Objective-C</comment>
+ <comment xml:lang="sk">Zdrojový kód Objective-C</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Objective-C</comment>
+ <comment xml:lang="sq">Kod burues C objekt</comment>
+ <comment xml:lang="sr">Објектни-C изворни ко̂д</comment>
+ <comment xml:lang="sv">Objective-C-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Objective-C</comment>
+ <comment xml:lang="vi">Mã nguồn Objective-C</comment>
+ <comment xml:lang="zh_CN">Objective-C 源代码</comment>
+ <comment xml:lang="zh_TW">Objective-C 源代碼</comment>
+ <sub-class-of type="text/x-csrc"/>
+ <magic priority="30">
+ <match value="#import" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.m"/>
+ </mime-type>
+ <mime-type type="text/x-ocaml">
+ <comment>OCaml source code</comment>
+ <comment xml:lang="ar">شفرة مصدر OCaml</comment>
+ <comment xml:lang="be@latin">Kryničny kod OCaml</comment>
+ <comment xml:lang="bg">Изходен код — OCaml</comment>
+ <comment xml:lang="ca">codi font en OCaml</comment>
+ <comment xml:lang="cs">Zdrojový kód OCaml</comment>
+ <comment xml:lang="da">OCaml-kildekode</comment>
+ <comment xml:lang="de">OCaml-Quelltext</comment>
+ <comment xml:lang="eo">OCaml-fontkodo</comment>
+ <comment xml:lang="es">código fuente en OCaml</comment>
+ <comment xml:lang="eu">OCaml iturburu-kodea</comment>
+ <comment xml:lang="fi">OCaml-lähdekoodi</comment>
+ <comment xml:lang="fo">OCaml keldukota</comment>
+ <comment xml:lang="fr">code source OCaml</comment>
+ <comment xml:lang="ga">cód foinseach OCaml</comment>
+ <comment xml:lang="gl">código fonte de OCaml</comment>
+ <comment xml:lang="he">קוד מקור של OCaml</comment>
+ <comment xml:lang="hu">OCaml forráskód</comment>
+ <comment xml:lang="id">Kode program OCaml</comment>
+ <comment xml:lang="it">Codice sorgente OCaml</comment>
+ <comment xml:lang="ja">OCaml ソースコード</comment>
+ <comment xml:lang="kk">OCaml бастапқы коды</comment>
+ <comment xml:lang="ko">OCaml 소스 코드</comment>
+ <comment xml:lang="lt">OCaml pradinis kodas</comment>
+ <comment xml:lang="lv">OCaml pirmkods</comment>
+ <comment xml:lang="nb">OCaml-kildekode</comment>
+ <comment xml:lang="nl">OCaml-broncode</comment>
+ <comment xml:lang="nn">OCaml-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy OCaml</comment>
+ <comment xml:lang="pt_BR">Código fonte do OCaml</comment>
+ <comment xml:lang="ro">Cod sursă OCaml</comment>
+ <comment xml:lang="ru">исходный код OCaml</comment>
+ <comment xml:lang="sk">Zdrojový kód OCaml</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode OCaml</comment>
+ <comment xml:lang="sq">Kod burues OCaml</comment>
+ <comment xml:lang="sv">OCaml-källkod</comment>
+ <comment xml:lang="uk">первинний код мовою OCaml</comment>
+ <comment xml:lang="vi">Mã nguồn OCaml</comment>
+ <comment xml:lang="zh_CN">OCaml 源代码</comment>
+ <comment xml:lang="zh_TW">OCaml 源代碼</comment>
+ <glob pattern="*.ml"/>
+ <glob pattern="*.mli"/>
+ </mime-type>
+ <mime-type type="text/x-matlab">
+ <comment>MATLAB script/function</comment>
+ <comment xml:lang="ar">سكربت/وظيفة MATLAB</comment>
+ <comment xml:lang="be@latin">Skrypt/funkcyja MATLAB</comment>
+ <comment xml:lang="bg">Скрипт/функция — MATLAB</comment>
+ <comment xml:lang="ca">script/funció MATLAB</comment>
+ <comment xml:lang="cs">Skript/funkce MATLAB</comment>
+ <comment xml:lang="da">MATLAB-program/-funktion</comment>
+ <comment xml:lang="de">MATLAB-Skript/-Funktion</comment>
+ <comment xml:lang="en_GB">MATLAB script/function</comment>
+ <comment xml:lang="es">script/función de MATLAB</comment>
+ <comment xml:lang="eu">MATLAB script/funtzioa</comment>
+ <comment xml:lang="fi">MATLAB-komentotiedosto/funktio</comment>
+ <comment xml:lang="fo">MATLAB boðrøð/funka</comment>
+ <comment xml:lang="fr">script/fonction MATLAB</comment>
+ <comment xml:lang="ga">script/feidhm MATLAB</comment>
+ <comment xml:lang="gl">función/script de MATLAB</comment>
+ <comment xml:lang="he">תסריט/פונקציית MATLAB</comment>
+ <comment xml:lang="hu">MATLAB parancsfájl/funkció</comment>
+ <comment xml:lang="id">Skrip/fungsi MATLAB</comment>
+ <comment xml:lang="it">Script/Funzione MATLAB</comment>
+ <comment xml:lang="ja">MATLAB スクリプト/関数</comment>
+ <comment xml:lang="kk">MATLAB сценарий/функциясы</comment>
+ <comment xml:lang="ko">MATLAB 스크립트/함수</comment>
+ <comment xml:lang="lt">MATLAB scenarijus / funkcija</comment>
+ <comment xml:lang="lv">MATLAB skripts/funkcija</comment>
+ <comment xml:lang="nb">Skript/funksjon for MATLAB</comment>
+ <comment xml:lang="nl">MATLAB-script/functie</comment>
+ <comment xml:lang="nn">MATLAB-skript/funksjon</comment>
+ <comment xml:lang="pl">Skrypt/funkcja MATLAB</comment>
+ <comment xml:lang="pt_BR">Script/função do MATLAB</comment>
+ <comment xml:lang="ro">Funcție/script MATLAB</comment>
+ <comment xml:lang="ru">сценарий/функция MATLAB</comment>
+ <comment xml:lang="sk">Skript/funkcia MATLAB</comment>
+ <comment xml:lang="sl">Skriptna datoteka MATLAB</comment>
+ <comment xml:lang="sq">Script/Funksion MATLAB</comment>
+ <comment xml:lang="sv">MATLAB-skript/funktion</comment>
+ <comment xml:lang="uk">скрипт/функція MATLAB</comment>
+ <comment xml:lang="vi">Văn lệnh/chức năng MATLAB</comment>
+ <comment xml:lang="zh_CN">MATLAB 脚本/函数</comment>
+ <comment xml:lang="zh_TW">MATLAB 指令稿/函式</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="10">
+ <match value="%" type="string" offset="0"/>
+ </magic>
+ <magic priority="10">
+ <match value="##" type="string" offset="0"/>
+ </magic>
+ <magic priority="50">
+ <match value="function" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.m"/>
+ <alias type="text/x-octave"/>
+ </mime-type>
+ <mime-type type="text/x-pascal">
+ <comment>Pascal source code</comment>
+ <comment xml:lang="ar">شفرة مصدر باسكال</comment>
+ <comment xml:lang="be@latin">Kryničny kod Pascal</comment>
+ <comment xml:lang="bg">Изходен код — Pascal</comment>
+ <comment xml:lang="ca">codi font en Pascal</comment>
+ <comment xml:lang="cs">Zdrojový kód v Pascalu</comment>
+ <comment xml:lang="da">Pascalkildekode</comment>
+ <comment xml:lang="de">Pascal-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Pascal</comment>
+ <comment xml:lang="en_GB">Pascal source code</comment>
+ <comment xml:lang="eo">Pascal-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Pascal</comment>
+ <comment xml:lang="eu">Pascal iturburu-kodea</comment>
+ <comment xml:lang="fi">Pascal-lähdekoodi</comment>
+ <comment xml:lang="fo">Pascal keldukota</comment>
+ <comment xml:lang="fr">code source Pascal</comment>
+ <comment xml:lang="ga">cód foinseach Pascal</comment>
+ <comment xml:lang="gl">código fonte en Pascal</comment>
+ <comment xml:lang="he">קוד מקור של Pascal</comment>
+ <comment xml:lang="hu">Pascal-forráskód</comment>
+ <comment xml:lang="id">Kode program Pascal</comment>
+ <comment xml:lang="it">Codice sorgente Pascal</comment>
+ <comment xml:lang="ja">Pascal ソースコード</comment>
+ <comment xml:lang="kk">Pascal бастапқы коды</comment>
+ <comment xml:lang="ko">파스칼 소스 코드</comment>
+ <comment xml:lang="lt">Pascal pradinis kodas</comment>
+ <comment xml:lang="lv">Pascal pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Pascal</comment>
+ <comment xml:lang="nb">Pascal-kildekode</comment>
+ <comment xml:lang="nl">Pascal-broncode</comment>
+ <comment xml:lang="nn">Pascal-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Pascal</comment>
+ <comment xml:lang="pt">código fonte Pascal</comment>
+ <comment xml:lang="pt_BR">Código fonte Pascal</comment>
+ <comment xml:lang="ro">Cod sursă Pascal</comment>
+ <comment xml:lang="ru">исходный код Pascal</comment>
+ <comment xml:lang="sk">Zdrojový kód Pascal</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Pascal</comment>
+ <comment xml:lang="sq">Kod burues Pascal</comment>
+ <comment xml:lang="sr">Паскал изворни ко̂д</comment>
+ <comment xml:lang="sv">Pascal-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Pascal</comment>
+ <comment xml:lang="vi">Mã nguồn Pascal</comment>
+ <comment xml:lang="zh_CN">Pascal 源代码</comment>
+ <comment xml:lang="zh_TW">Pascal 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.p"/>
+ <glob pattern="*.pas"/>
+ </mime-type>
+ <mime-type type="text/x-patch">
+ <comment>differences between files</comment>
+ <comment xml:lang="ar">الاختلافات بين الملفات</comment>
+ <comment xml:lang="be@latin">adroźnieńni pamiž fajłami</comment>
+ <comment xml:lang="bg">Разлики между файлове</comment>
+ <comment xml:lang="ca">diferències entre fitxers</comment>
+ <comment xml:lang="cs">Rozdíly mezi soubory</comment>
+ <comment xml:lang="da">forskel mellem filer</comment>
+ <comment xml:lang="de">Unterschiede zwischen Dateien</comment>
+ <comment xml:lang="el">διαφορές μεταξύ αρχείων</comment>
+ <comment xml:lang="en_GB">differences between files</comment>
+ <comment xml:lang="eo">diferencoj inter dosieroj</comment>
+ <comment xml:lang="es">diferencias entre archivos</comment>
+ <comment xml:lang="eu">fitxategien arteko ezberdintasunak</comment>
+ <comment xml:lang="fi">tiedostojen väliset erot</comment>
+ <comment xml:lang="fo">munur millum fílur</comment>
+ <comment xml:lang="fr">différences entre fichiers</comment>
+ <comment xml:lang="ga">difríochtaí idir chomhaid</comment>
+ <comment xml:lang="gl">diferenzas entre ficheiros</comment>
+ <comment xml:lang="he">ההבדל בין קבצים</comment>
+ <comment xml:lang="hu">diff-különbségfájl</comment>
+ <comment xml:lang="id">perbedaan diantara berkas</comment>
+ <comment xml:lang="it">Differenze tra file</comment>
+ <comment xml:lang="ja">ファイル間差分</comment>
+ <comment xml:lang="kk">файлдар арасындағы айырмашылықтары</comment>
+ <comment xml:lang="ko">파일 사이의 바뀐점</comment>
+ <comment xml:lang="lt">skirtumai tarp failų</comment>
+ <comment xml:lang="lv">divu failu atšķirība</comment>
+ <comment xml:lang="ms">Perbezaan antara fail</comment>
+ <comment xml:lang="nb">forskjeller mellom filer</comment>
+ <comment xml:lang="nl">verschillen tussen bestanden</comment>
+ <comment xml:lang="nn">skilnader mellom filer</comment>
+ <comment xml:lang="pl">Różnica pomiędzy plikami</comment>
+ <comment xml:lang="pt">diferenças entre ficheiros</comment>
+ <comment xml:lang="pt_BR">diferenças entre arquivos</comment>
+ <comment xml:lang="ro">diferențe între fișiere</comment>
+ <comment xml:lang="ru">различия между файлами</comment>
+ <comment xml:lang="sk">Rozdiely medzi súbormi</comment>
+ <comment xml:lang="sl">razlike med datotekami</comment>
+ <comment xml:lang="sq">Diferencë midis file</comment>
+ <comment xml:lang="sr">разлике међу датотекама</comment>
+ <comment xml:lang="sv">skillnader mellan filer</comment>
+ <comment xml:lang="uk">різниця між файлами</comment>
+ <comment xml:lang="vi">khác biệt giữa các tập tin</comment>
+ <comment xml:lang="zh_CN">文件的区别</comment>
+ <comment xml:lang="zh_TW">檔案內容差異</comment>
+ <alias type="text/x-diff"/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="diff\t" type="string" offset="0"/>
+ <match value="diff " type="string" offset="0"/>
+ <match value="***\t" type="string" offset="0"/>
+ <match value="*** " type="string" offset="0"/>
+ <match value="=== " type="string" offset="0"/>
+ <match value="--- " type="string" offset="0"/>
+ <match value="Only in\t" type="string" offset="0"/>
+ <match value="Only in " type="string" offset="0"/>
+ <match value="Common subdirectories: " type="string" offset="0"/>
+ <match value="Index:" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.diff"/>
+ <glob pattern="*.patch"/>
+ </mime-type>
+ <mime-type type="text/x-go">
+ <comment>Go source code</comment>
+ <comment xml:lang="bg">Изходен код — Go</comment>
+ <comment xml:lang="ca">codi font en Go</comment>
+ <comment xml:lang="cs">Zdrojový kód Go</comment>
+ <comment xml:lang="de">Go-Quellcode</comment>
+ <comment xml:lang="eo">Go-fontkodo</comment>
+ <comment xml:lang="es">Ir al código fuente</comment>
+ <comment xml:lang="fi">Go-lähdekoodi</comment>
+ <comment xml:lang="fr">code source Go</comment>
+ <comment xml:lang="gl">código fonte de Go</comment>
+ <comment xml:lang="he">קוד מקור של Go</comment>
+ <comment xml:lang="hu">Go forráskód</comment>
+ <comment xml:lang="id">Kode sumber Go</comment>
+ <comment xml:lang="it">Codice sorgente Go</comment>
+ <comment xml:lang="ja">Go ソースコード</comment>
+ <comment xml:lang="kk">Go бастапқы коды</comment>
+ <comment xml:lang="ko">Go 소스 코드</comment>
+ <comment xml:lang="lv">Go pirmkods</comment>
+ <comment xml:lang="pl">Kod źródłowy Go</comment>
+ <comment xml:lang="ru">исходный код Go</comment>
+ <comment xml:lang="sl">Izvorna koda Go</comment>
+ <comment xml:lang="uk">вихідний код мовою Go</comment>
+ <comment xml:lang="zh_CN">Go </comment>
+ <comment xml:lang="zh_TW">Go 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.go"/>
+ </mime-type>
+ <mime-type type="text/x-python">
+ <comment>Python script</comment>
+ <comment xml:lang="ar">سكربت بايثون</comment>
+ <comment xml:lang="be@latin">Skrypt Python</comment>
+ <comment xml:lang="bg">Скрипт — Python</comment>
+ <comment xml:lang="ca">script Python</comment>
+ <comment xml:lang="cs">Skript v Pythonu</comment>
+ <comment xml:lang="da">Pythonprogram</comment>
+ <comment xml:lang="de">Python-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών Python</comment>
+ <comment xml:lang="en_GB">Python script</comment>
+ <comment xml:lang="eo">Python-skripto</comment>
+ <comment xml:lang="es">script en Python</comment>
+ <comment xml:lang="eu">Python script-a</comment>
+ <comment xml:lang="fi">Python-komentotiedosto</comment>
+ <comment xml:lang="fo">Python boðrøð</comment>
+ <comment xml:lang="fr">script Python</comment>
+ <comment xml:lang="ga">script Python</comment>
+ <comment xml:lang="gl">Script en Python</comment>
+ <comment xml:lang="he">תסריט Python</comment>
+ <comment xml:lang="hu">Python-parancsfájl</comment>
+ <comment xml:lang="id">Skrip Python</comment>
+ <comment xml:lang="it">Script Python</comment>
+ <comment xml:lang="ja">Python スクリプト</comment>
+ <comment xml:lang="kk">Python сценарийі</comment>
+ <comment xml:lang="ko">파이썬 스크립트</comment>
+ <comment xml:lang="lt">Python scenarijus</comment>
+ <comment xml:lang="lv">Python skripts</comment>
+ <comment xml:lang="ms">Skrip Python</comment>
+ <comment xml:lang="nb">Python-skript</comment>
+ <comment xml:lang="nl">Python-script</comment>
+ <comment xml:lang="nn">Python-skript</comment>
+ <comment xml:lang="pl">Skrypt Python</comment>
+ <comment xml:lang="pt">'script' Python</comment>
+ <comment xml:lang="pt_BR">Script Python</comment>
+ <comment xml:lang="ro">Script Python</comment>
+ <comment xml:lang="ru">сценарий Python</comment>
+ <comment xml:lang="sk">Skript Python</comment>
+ <comment xml:lang="sl">Skriptna datoteka Python</comment>
+ <comment xml:lang="sq">Script Python</comment>
+ <comment xml:lang="sr">Питон скрипта</comment>
+ <comment xml:lang="sv">Pythonskript</comment>
+ <comment xml:lang="uk">скрипт мовою Python</comment>
+ <comment xml:lang="vi">Văn lệnh Python</comment>
+ <comment xml:lang="zh_CN">Python 脚本</comment>
+ <comment xml:lang="zh_TW">Python 指令稿</comment>
+ <sub-class-of type='application/x-executable'/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="#!/bin/python" type="string" offset="0"/>
+ <match value="#! /bin/python" type="string" offset="0"/>
+ <match value='eval \"exec /bin/python' type="string" offset="0"/>
+ <match value="#!/usr/bin/python" type="string" offset="0"/>
+ <match value="#! /usr/bin/python" type="string" offset="0"/>
+ <match value='eval \"exec /usr/bin/python' type="string" offset="0"/>
+ <match value="#!/usr/local/bin/python" type="string" offset="0"/>
+ <match value="#! /usr/local/bin/python" type="string" offset="0"/>
+ <match value='eval \"exec /usr/local/bin/python' type="string" offset="0"/>
+ <match value='/bin/env python' type="string" offset="1:16"/>
+ </magic>
+ <glob pattern="*.py"/>
+ <glob pattern="*.wsgi"/>
+ </mime-type>
+ <mime-type type="text/x-lua">
+ <comment>Lua script</comment>
+ <comment xml:lang="ar">سكربت Lua</comment>
+ <comment xml:lang="be@latin">Skrypt Lua</comment>
+ <comment xml:lang="bg">Скрипт на Lua</comment>
+ <comment xml:lang="ca">script Lua</comment>
+ <comment xml:lang="cs">Skript Lua</comment>
+ <comment xml:lang="da">Luaprogram</comment>
+ <comment xml:lang="de">Lua-Skript</comment>
+ <comment xml:lang="eo">Lua-skripto</comment>
+ <comment xml:lang="es">script en Lua</comment>
+ <comment xml:lang="eu">Lua script-a</comment>
+ <comment xml:lang="fi">Lua-komentotiedosto</comment>
+ <comment xml:lang="fo">Lua boðrøð</comment>
+ <comment xml:lang="fr">script Lua</comment>
+ <comment xml:lang="ga">script Lua</comment>
+ <comment xml:lang="gl">script de Lua</comment>
+ <comment xml:lang="he">תסריט Lua</comment>
+ <comment xml:lang="hu">Lua parancsfájl</comment>
+ <comment xml:lang="id">Skrip Lua</comment>
+ <comment xml:lang="it">Script Lua</comment>
+ <comment xml:lang="ja">Lua スクリプト</comment>
+ <comment xml:lang="kk">Lua сценарийі</comment>
+ <comment xml:lang="ko">Lua 스크립트</comment>
+ <comment xml:lang="lt">Lua scenarijus</comment>
+ <comment xml:lang="lv">Lua skripts</comment>
+ <comment xml:lang="nb">Lua-skript</comment>
+ <comment xml:lang="nl">Lua-script</comment>
+ <comment xml:lang="nn">Lua-skript</comment>
+ <comment xml:lang="pl">Skrypt Lua</comment>
+ <comment xml:lang="pt_BR">Script Lua</comment>
+ <comment xml:lang="ro">Script Lua</comment>
+ <comment xml:lang="ru">сценарий Lua</comment>
+ <comment xml:lang="sk">Skript Lua</comment>
+ <comment xml:lang="sl">Skriptna datoteka Lua</comment>
+ <comment xml:lang="sq">Script Lua</comment>
+ <comment xml:lang="sv">Lua-skript</comment>
+ <comment xml:lang="uk">скрипт Lua</comment>
+ <comment xml:lang="vi">Văn lệnh Lua</comment>
+ <comment xml:lang="zh_CN">Lua 脚本</comment>
+ <comment xml:lang="zh_TW">Lua 指令稿</comment>
+ <sub-class-of type='application/x-executable'/>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="/bin/lua" type="string" offset="0"/>
+ <match value="/bin/env lua" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.lua"/>
+ </mime-type>
+ <mime-type type="text/x-readme">
+ <comment>README document</comment>
+ <comment xml:lang="ar">مستند README</comment>
+ <comment xml:lang="az">README sənədi</comment>
+ <comment xml:lang="be@latin">Dakument README</comment>
+ <comment xml:lang="bg">Документ — „Да се прочете“</comment>
+ <comment xml:lang="ca">document README</comment>
+ <comment xml:lang="cs">Dokument README</comment>
+ <comment xml:lang="cy">Dogfen README</comment>
+ <comment xml:lang="da">README-dokument</comment>
+ <comment xml:lang="de">README-Dokument</comment>
+ <comment xml:lang="el">έγγραφο README</comment>
+ <comment xml:lang="en_GB">README document</comment>
+ <comment xml:lang="eo">README-dokumento</comment>
+ <comment xml:lang="es">documento README</comment>
+ <comment xml:lang="eu">README dokumentua</comment>
+ <comment xml:lang="fi">LUEMINUT-asiakirja</comment>
+ <comment xml:lang="fo">README skjal</comment>
+ <comment xml:lang="fr">document LISEZ-MOI</comment>
+ <comment xml:lang="ga">cáipéis README</comment>
+ <comment xml:lang="gl">documento README</comment>
+ <comment xml:lang="he">מסמך README</comment>
+ <comment xml:lang="hu">README-dokumentum</comment>
+ <comment xml:lang="id">Dokumen README</comment>
+ <comment xml:lang="it">Documento README</comment>
+ <comment xml:lang="ja">README ドキュメント</comment>
+ <comment xml:lang="kk">README құжаты</comment>
+ <comment xml:lang="ko">README 문서</comment>
+ <comment xml:lang="lt">README dokumentas</comment>
+ <comment xml:lang="lv">README dokuments</comment>
+ <comment xml:lang="ms">Dokumen README</comment>
+ <comment xml:lang="nb">README-dokument</comment>
+ <comment xml:lang="nl">LEESMIJ-document</comment>
+ <comment xml:lang="nn">README-dokument</comment>
+ <comment xml:lang="pl">Dokument README</comment>
+ <comment xml:lang="pt">documento LEIA-ME</comment>
+ <comment xml:lang="pt_BR">Documento README</comment>
+ <comment xml:lang="ro">Document README</comment>
+ <comment xml:lang="ru">документ README</comment>
+ <comment xml:lang="sk">Dokument README</comment>
+ <comment xml:lang="sl">Dokument README</comment>
+ <comment xml:lang="sq">Dokument README</comment>
+ <comment xml:lang="sr">ПРОЧИТАЈМЕ документ</comment>
+ <comment xml:lang="sv">README-dokument</comment>
+ <comment xml:lang="uk">документ README</comment>
+ <comment xml:lang="vi">Tài liệu Đọc Đi (README)</comment>
+ <comment xml:lang="zh_CN">README 文档</comment>
+ <comment xml:lang="zh_TW">README 說明文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob weight="10" pattern="README*"/>
+ </mime-type>
+ <mime-type type="text/x-nfo">
+ <comment>NFO document</comment>
+ <comment xml:lang="ar">مستند NFO</comment>
+ <comment xml:lang="be@latin">Dakument NFO</comment>
+ <comment xml:lang="bg">Документ — NFO</comment>
+ <comment xml:lang="ca">document NFO</comment>
+ <comment xml:lang="cs">Dokument NFO</comment>
+ <comment xml:lang="da">NFO-dokument</comment>
+ <comment xml:lang="de">NFO-Dokument</comment>
+ <comment xml:lang="eo">NFO-dokumento</comment>
+ <comment xml:lang="es">documento NFO</comment>
+ <comment xml:lang="eu">NFO dokumentua</comment>
+ <comment xml:lang="fi">NFO-asiakirja</comment>
+ <comment xml:lang="fo">NFO skjal</comment>
+ <comment xml:lang="fr">document NFO</comment>
+ <comment xml:lang="ga">cáipéis NFO</comment>
+ <comment xml:lang="gl">documento NFO</comment>
+ <comment xml:lang="he">מסמך NFO</comment>
+ <comment xml:lang="hu">NFO-dokumentum</comment>
+ <comment xml:lang="id">Dokumen NFO</comment>
+ <comment xml:lang="it">Documento NFO</comment>
+ <comment xml:lang="ja">NFO ドキュメント</comment>
+ <comment xml:lang="kk">NFO құжаты</comment>
+ <comment xml:lang="ko">NFO 문서</comment>
+ <comment xml:lang="lt">NFO dokumentas</comment>
+ <comment xml:lang="lv">NFO dokuments</comment>
+ <comment xml:lang="nb">NFO-dokument</comment>
+ <comment xml:lang="nl">NFO-document</comment>
+ <comment xml:lang="nn">NFO-dokument</comment>
+ <comment xml:lang="pl">Dokument NFO</comment>
+ <comment xml:lang="pt_BR">Documento NFO</comment>
+ <comment xml:lang="ro">Document NFO</comment>
+ <comment xml:lang="ru">документ NFO</comment>
+ <comment xml:lang="sk">Dokument NFO</comment>
+ <comment xml:lang="sl">Dokument NFO</comment>
+ <comment xml:lang="sq">Dokument NFO</comment>
+ <comment xml:lang="sv">NFO-dokument</comment>
+ <comment xml:lang="uk">документ NFO</comment>
+ <comment xml:lang="vi">Tài liệu NFO</comment>
+ <comment xml:lang="zh_CN">NFO 文档</comment>
+ <comment xml:lang="zh_TW">NFO 文件</comment>
+ <sub-class-of type="text/x-readme"/>
+ <glob pattern="*.nfo"/>
+ </mime-type>
+ <mime-type type="text/x-rpm-spec">
+ <comment>RPM spec file</comment>
+ <comment xml:lang="ar">ملف مواصفات RPM</comment>
+ <comment xml:lang="be@latin">Specyfikacyjny fajł RPM</comment>
+ <comment xml:lang="bg">Файл — спецификация за RPM</comment>
+ <comment xml:lang="ca">fitxer spec RPM</comment>
+ <comment xml:lang="cs">Soubor spec RPM</comment>
+ <comment xml:lang="da">RPM spec-fil</comment>
+ <comment xml:lang="de">RPM-Spezifikationsdatei</comment>
+ <comment xml:lang="es">archivo de especificaciones RPM</comment>
+ <comment xml:lang="eu">RPM espezifikazio fitxategia</comment>
+ <comment xml:lang="fi">RPM spec -tiedosto</comment>
+ <comment xml:lang="fo">RPM tøknilýsingarfíla</comment>
+ <comment xml:lang="fr">fichier de spécification RPM</comment>
+ <comment xml:lang="ga">comhad spec RPM</comment>
+ <comment xml:lang="gl">ficheiro de especificacións RPM</comment>
+ <comment xml:lang="he">קובץ מפרט RPM</comment>
+ <comment xml:lang="hu">RPM spec fájl</comment>
+ <comment xml:lang="id">Berkas spesifikasi RPM</comment>
+ <comment xml:lang="it">File specifica RPM</comment>
+ <comment xml:lang="ja">RPM spec ファイル</comment>
+ <comment xml:lang="kk">RPM анықтама файлы</comment>
+ <comment xml:lang="ko">RPM spec 파일</comment>
+ <comment xml:lang="lt">RPM spec failas</comment>
+ <comment xml:lang="lv">RPM specifikācijas fails</comment>
+ <comment xml:lang="nb">RPM-spesifikasjonsfil</comment>
+ <comment xml:lang="nl">RPM-spec-bestand</comment>
+ <comment xml:lang="nn">RPM spec-fil</comment>
+ <comment xml:lang="pl">Plik spec RPM</comment>
+ <comment xml:lang="pt_BR">Arquivo de especificação RPM</comment>
+ <comment xml:lang="ro">Fișier RPM spec</comment>
+ <comment xml:lang="ru">файл описания RPM</comment>
+ <comment xml:lang="sk">Súbor RPM spec</comment>
+ <comment xml:lang="sl">Določilna datoteka RPM</comment>
+ <comment xml:lang="sq">File specifikimi RPM</comment>
+ <comment xml:lang="sv">RPM spec-fil</comment>
+ <comment xml:lang="uk">spec-файл RPM</comment>
+ <comment xml:lang="vi">Tập tin đặc tả RPM</comment>
+ <comment xml:lang="zh_CN">RPM spec 文件</comment>
+ <comment xml:lang="zh_TW">RPM spec 規格檔</comment>
+ <acronym>RPM</acronym>
+ <expanded-acronym>Red Hat Package Manager</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.spec"/>
+ <magic priority="50">
+ <match value="Summary: " type="string" offset="0"/>
+ <match value="%define " type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="text/x-scala">
+ <comment>Scala source code</comment>
+ <comment xml:lang="bg">Изходен код — Scala</comment>
+ <comment xml:lang="ca">codi font en Scala</comment>
+ <comment xml:lang="cs">Zdrojový kód Scala</comment>
+ <comment xml:lang="es">Código fuente en Scala</comment>
+ <comment xml:lang="fi">Scala-lähdekoodi</comment>
+ <comment xml:lang="fr">code source Scala</comment>
+ <comment xml:lang="gl">código fnote en Scala</comment>
+ <comment xml:lang="he">קוד מקור של Scala</comment>
+ <comment xml:lang="id">Kode sumber Scala</comment>
+ <comment xml:lang="it">Codice sorgente Scala</comment>
+ <comment xml:lang="ja">Scala ソースコード</comment>
+ <comment xml:lang="kk">Scala бастапқы коды</comment>
+ <comment xml:lang="lv">Scala pirmkods</comment>
+ <comment xml:lang="pl">Kod źródłowy Scala</comment>
+ <comment xml:lang="ru">исходный код Scala</comment>
+ <comment xml:lang="sl">Izvorna koda Scala</comment>
+ <comment xml:lang="sv">Scala-källkod</comment>
+ <comment xml:lang="uk">вихідний код мовою Scala</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.scala"/>
+ </mime-type>
+ <mime-type type="text/x-scheme">
+ <comment>Scheme source code</comment>
+ <comment xml:lang="ar">شفرة مصدر Scheme</comment>
+ <comment xml:lang="az">Sxem mənbə kodu</comment>
+ <comment xml:lang="be@latin">Kryničny kod Scheme</comment>
+ <comment xml:lang="bg">Изходен код — Scheme</comment>
+ <comment xml:lang="ca">codi font en Scheme</comment>
+ <comment xml:lang="cs">Zdrojový kód Scheme</comment>
+ <comment xml:lang="cy">Ffynhonnell Rhaglen Scheme</comment>
+ <comment xml:lang="da">Schemekildekode</comment>
+ <comment xml:lang="de">Scheme-Quelltext</comment>
+ <comment xml:lang="el">πηγαίος κώδικας Scheme</comment>
+ <comment xml:lang="en_GB">Scheme source code</comment>
+ <comment xml:lang="eo">Scheme-fontkodo</comment>
+ <comment xml:lang="es">código fuente en Scheme</comment>
+ <comment xml:lang="eu">Scheme iturburu-kodea</comment>
+ <comment xml:lang="fi">Scheme-lähdekoodi</comment>
+ <comment xml:lang="fo">Scheme keldukota</comment>
+ <comment xml:lang="fr">code source Scheme</comment>
+ <comment xml:lang="ga">cód foinseach Scheme</comment>
+ <comment xml:lang="gl">código fonte en Scheme</comment>
+ <comment xml:lang="he">קוד מקור של Scheme</comment>
+ <comment xml:lang="hu">Scheme-forráskód</comment>
+ <comment xml:lang="id">Kode program Scheme</comment>
+ <comment xml:lang="it">Codice sorgente Scheme</comment>
+ <comment xml:lang="ja">Scheme ソースコード</comment>
+ <comment xml:lang="kk">Scheme бастапқы коды</comment>
+ <comment xml:lang="ko">Scheme 소스 코드</comment>
+ <comment xml:lang="lt">Scheme pradinis kodas</comment>
+ <comment xml:lang="lv">Scheme pirmkods</comment>
+ <comment xml:lang="ms">Kod sumber Scheme</comment>
+ <comment xml:lang="nb">Scheme-kildekode</comment>
+ <comment xml:lang="nl">Scheme-broncode</comment>
+ <comment xml:lang="nn">Scheme-kjeldekode</comment>
+ <comment xml:lang="pl">Kod źródłowy Scheme</comment>
+ <comment xml:lang="pt">código fonte Scheme</comment>
+ <comment xml:lang="pt_BR">Código fonte Scheme</comment>
+ <comment xml:lang="ro">Cod sursă Scheme</comment>
+ <comment xml:lang="ru">исходный код Scheme</comment>
+ <comment xml:lang="sk">Zdrojový kód Scheme</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Scheme</comment>
+ <comment xml:lang="sq">Kod burues Scheme</comment>
+ <comment xml:lang="sr">Scheme изворни ко̂д</comment>
+ <comment xml:lang="sv">Scheme-källkod</comment>
+ <comment xml:lang="uk">вихідний файл мовою Scheme</comment>
+ <comment xml:lang="vi">Mã nguồn Scheme</comment>
+ <comment xml:lang="zh_CN">Scheme 源代码</comment>
+ <comment xml:lang="zh_TW">Scheme 源代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.scm"/>
+ <glob pattern="*.ss"/>
+ </mime-type>
+ <mime-type type="text/x-setext">
+ <comment>Setext document</comment>
+ <comment xml:lang="ar">مستند Setext</comment>
+ <comment xml:lang="az">Setext sənədi</comment>
+ <comment xml:lang="be@latin">Dakument Setext</comment>
+ <comment xml:lang="bg">Документ — Setext</comment>
+ <comment xml:lang="ca">document Setext</comment>
+ <comment xml:lang="cs">Dokument Setext</comment>
+ <comment xml:lang="cy">Dogfen Setext</comment>
+ <comment xml:lang="da">Setextdokument</comment>
+ <comment xml:lang="de">Setext-Dokument</comment>
+ <comment xml:lang="el">έγγραφο Setext</comment>
+ <comment xml:lang="en_GB">Setext document</comment>
+ <comment xml:lang="eo">Setext-dokumento</comment>
+ <comment xml:lang="es">documento Setext</comment>
+ <comment xml:lang="eu">Setext dokumentua</comment>
+ <comment xml:lang="fi">Setext-asiakirja</comment>
+ <comment xml:lang="fo">Setext skjal</comment>
+ <comment xml:lang="fr">document Setext</comment>
+ <comment xml:lang="ga">cáipéis Setext</comment>
+ <comment xml:lang="gl">documento Settext</comment>
+ <comment xml:lang="he">מסמך של Setext</comment>
+ <comment xml:lang="hu">Setext-dokumentum</comment>
+ <comment xml:lang="id">Dokumen Setext</comment>
+ <comment xml:lang="it">Documento Setext</comment>
+ <comment xml:lang="ja">Setext ドキュメント</comment>
+ <comment xml:lang="kk">Setext құжаты</comment>
+ <comment xml:lang="ko">Setext 문서</comment>
+ <comment xml:lang="lt">Setext dokumentas</comment>
+ <comment xml:lang="lv">Setext dokuments</comment>
+ <comment xml:lang="ms">Dokumen Setext</comment>
+ <comment xml:lang="nb">Setext-dokument</comment>
+ <comment xml:lang="nl">Setext-document</comment>
+ <comment xml:lang="nn">Setext-dokument</comment>
+ <comment xml:lang="pl">Dokument Setext</comment>
+ <comment xml:lang="pt">documento Setext</comment>
+ <comment xml:lang="pt_BR">Documento Setext</comment>
+ <comment xml:lang="ro">Document Setext</comment>
+ <comment xml:lang="ru">документ Setext</comment>
+ <comment xml:lang="sk">Dokument Setext</comment>
+ <comment xml:lang="sl">Dokument Setext</comment>
+ <comment xml:lang="sq">Dokument Setext</comment>
+ <comment xml:lang="sr">Setext документ</comment>
+ <comment xml:lang="sv">Setext-dokument</comment>
+ <comment xml:lang="uk">документ Setext</comment>
+ <comment xml:lang="vi">Tài liệu Setext</comment>
+ <comment xml:lang="zh_CN">Setext 文档</comment>
+ <comment xml:lang="zh_TW">Setext 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.etx"/>
+ </mime-type>
+ <mime-type type="text/x-sql">
+ <comment>SQL code</comment>
+ <comment xml:lang="ar">شفرة SQL</comment>
+ <comment xml:lang="az">SQL kodu</comment>
+ <comment xml:lang="be@latin">Kod SQL</comment>
+ <comment xml:lang="bg">Код — SQL</comment>
+ <comment xml:lang="ca">codi en SQL</comment>
+ <comment xml:lang="cs">Kód SQL</comment>
+ <comment xml:lang="cy">Côd SQL</comment>
+ <comment xml:lang="da">SQL-kode</comment>
+ <comment xml:lang="de">SQL-Befehle</comment>
+ <comment xml:lang="el">κώδικας SQL</comment>
+ <comment xml:lang="en_GB">SQL code</comment>
+ <comment xml:lang="eo">SQL-kodo</comment>
+ <comment xml:lang="es">código SQL</comment>
+ <comment xml:lang="eu">SQL kodea</comment>
+ <comment xml:lang="fi">SQL-koodi</comment>
+ <comment xml:lang="fo">SQL kota</comment>
+ <comment xml:lang="fr">code SQL</comment>
+ <comment xml:lang="ga">cód SQL</comment>
+ <comment xml:lang="gl">código SQL</comment>
+ <comment xml:lang="he">קוד SQL</comment>
+ <comment xml:lang="hu">SQL-kód</comment>
+ <comment xml:lang="id">Kode SQL</comment>
+ <comment xml:lang="it">Codice SQL</comment>
+ <comment xml:lang="ja">SQL コード</comment>
+ <comment xml:lang="kk">SQL коды</comment>
+ <comment xml:lang="ko">SQL 코드</comment>
+ <comment xml:lang="lt">SQL kodas</comment>
+ <comment xml:lang="lv">SQL kods</comment>
+ <comment xml:lang="ms">Kod SQL</comment>
+ <comment xml:lang="nb">SQL-kildekode</comment>
+ <comment xml:lang="nl">SQL-code</comment>
+ <comment xml:lang="nn">SQL-kode</comment>
+ <comment xml:lang="pl">Kod SQL</comment>
+ <comment xml:lang="pt">código SQL</comment>
+ <comment xml:lang="pt_BR">Código SQL</comment>
+ <comment xml:lang="ro">Cod SQL</comment>
+ <comment xml:lang="ru">код SQL</comment>
+ <comment xml:lang="sk">Kód SQL</comment>
+ <comment xml:lang="sl">Datoteka kode SQL</comment>
+ <comment xml:lang="sq">Kod SQL</comment>
+ <comment xml:lang="sr">SQL ко̂д</comment>
+ <comment xml:lang="sv">SQL-kod</comment>
+ <comment xml:lang="uk">код SQL</comment>
+ <comment xml:lang="vi">Mã SQL</comment>
+ <comment xml:lang="zh_CN">SQL 代码</comment>
+ <comment xml:lang="zh_TW">SQL 代碼</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.sql"/>
+ </mime-type>
+ <mime-type type="text/x-tcl">
+ <comment>Tcl script</comment>
+ <comment xml:lang="ar">سكربت Tcl</comment>
+ <comment xml:lang="be@latin">Skrypt Tcl</comment>
+ <comment xml:lang="bg">Скрипт — Tcl</comment>
+ <comment xml:lang="ca">script Tcl</comment>
+ <comment xml:lang="cs">Skript v Tcl</comment>
+ <comment xml:lang="da">Tcl-program</comment>
+ <comment xml:lang="de">Tcl-Skript</comment>
+ <comment xml:lang="el">πρόγραμμα εντολών Tcl</comment>
+ <comment xml:lang="en_GB">Tcl script</comment>
+ <comment xml:lang="eo">Tcl-skripto</comment>
+ <comment xml:lang="es">script en Tcl</comment>
+ <comment xml:lang="eu">Tcl script-a</comment>
+ <comment xml:lang="fi">Tcl-komentotiedosto</comment>
+ <comment xml:lang="fo">Tcl boðrøð</comment>
+ <comment xml:lang="fr">script Tcl</comment>
+ <comment xml:lang="ga">script Tcl</comment>
+ <comment xml:lang="gl">Script en Tcl</comment>
+ <comment xml:lang="he">תסריט Tcl</comment>
+ <comment xml:lang="hu">Tcl-parancsfájl</comment>
+ <comment xml:lang="id">Skrip Tcl</comment>
+ <comment xml:lang="it">Script Tcl</comment>
+ <comment xml:lang="ja">Tcl スクリプト</comment>
+ <comment xml:lang="kk">Tcl сценарийі</comment>
+ <comment xml:lang="ko">Tcl 스크립트</comment>
+ <comment xml:lang="lt">Tcl scenarijus</comment>
+ <comment xml:lang="lv">Tcl skripts</comment>
+ <comment xml:lang="ms">Skrip Tcl</comment>
+ <comment xml:lang="nb">Tcl-skript</comment>
+ <comment xml:lang="nl">Tcl-script</comment>
+ <comment xml:lang="nn">Tcl-skript</comment>
+ <comment xml:lang="pl">Skrypt Tcl</comment>
+ <comment xml:lang="pt">'script' Tcl</comment>
+ <comment xml:lang="pt_BR">Script Tcl</comment>
+ <comment xml:lang="ro">Script Tcl</comment>
+ <comment xml:lang="ru">сценарий Tcl</comment>
+ <comment xml:lang="sk">Skript Tcl</comment>
+ <comment xml:lang="sl">Skriptna datoteka Tcl</comment>
+ <comment xml:lang="sq">Script Tcl</comment>
+ <comment xml:lang="sr">Tcl скрипта</comment>
+ <comment xml:lang="sv">Tcl-skript</comment>
+ <comment xml:lang="uk">скрипт Tcl</comment>
+ <comment xml:lang="vi">Văn lệnh Tcl</comment>
+ <comment xml:lang="zh_CN">Tcl 脚本</comment>
+ <comment xml:lang="zh_TW">Tcl 描述語言檔</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.tcl"/>
+ <glob pattern="*.tk"/>
+ </mime-type>
+ <mime-type type="text/x-tex">
+ <comment>TeX document</comment>
+ <comment xml:lang="ar">مستند TeX</comment>
+ <comment xml:lang="be@latin">Dakument TeX</comment>
+ <comment xml:lang="bg">Документ — TeX</comment>
+ <comment xml:lang="ca">document TeX</comment>
+ <comment xml:lang="cs">Dokument TeX</comment>
+ <comment xml:lang="cy">Dogfen TeX </comment>
+ <comment xml:lang="da">TeX-dokument</comment>
+ <comment xml:lang="de">TeX-Dokument</comment>
+ <comment xml:lang="el">έγγραφο TeX</comment>
+ <comment xml:lang="en_GB">TeX document</comment>
+ <comment xml:lang="eo">TeX-dokumento</comment>
+ <comment xml:lang="es">documento TeX</comment>
+ <comment xml:lang="eu">TeX dokumentua</comment>
+ <comment xml:lang="fi">TeX-asiakirja</comment>
+ <comment xml:lang="fo">TeX skjal</comment>
+ <comment xml:lang="fr">document TeX</comment>
+ <comment xml:lang="ga">cáipéis TeX</comment>
+ <comment xml:lang="gl">documenton TeX</comment>
+ <comment xml:lang="he">מסמך TeX</comment>
+ <comment xml:lang="hu">TeX-dokumentum</comment>
+ <comment xml:lang="id">Dokumen TeX</comment>
+ <comment xml:lang="it">Documento TeX</comment>
+ <comment xml:lang="ja">TeX ドキュメント</comment>
+ <comment xml:lang="kk">TeX құжаты</comment>
+ <comment xml:lang="ko">TeX 문서</comment>
+ <comment xml:lang="lt">TeX dokumentas</comment>
+ <comment xml:lang="lv">TeX dokuments</comment>
+ <comment xml:lang="ms">Dokumen TeX</comment>
+ <comment xml:lang="nb">TeX-dokument</comment>
+ <comment xml:lang="nl">TeX-document</comment>
+ <comment xml:lang="nn">TeX-dokument</comment>
+ <comment xml:lang="pl">Dokument TeX</comment>
+ <comment xml:lang="pt">documento TeX</comment>
+ <comment xml:lang="pt_BR">Documento TeX</comment>
+ <comment xml:lang="ro">Document TeX</comment>
+ <comment xml:lang="ru">документ TeX</comment>
+ <comment xml:lang="sk">Dokument TeX</comment>
+ <comment xml:lang="sl">Dokument TeX</comment>
+ <comment xml:lang="sq">Dokument TeX</comment>
+ <comment xml:lang="sr">ТеХ документ</comment>
+ <comment xml:lang="sv">TeX-dokument</comment>
+ <comment xml:lang="uk">документ TeX</comment>
+ <comment xml:lang="vi">Tài liệu TeX</comment>
+ <comment xml:lang="zh_CN">TeX 文档</comment>
+ <comment xml:lang="zh_TW">TeX 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <alias type="application/x-tex"/>
+ <glob pattern="*.tex"/>
+ <glob pattern="*.ltx"/>
+ <glob pattern="*.sty"/>
+ <glob pattern="*.cls"/>
+ <glob pattern="*.dtx"/>
+ <glob pattern="*.ins"/>
+ <glob pattern="*.latex"/>
+ <magic priority="10">
+ <match value="%" type="string" offset="0"/>
+ </magic>
+ <magic priority="50">
+ <match value="documentclass" type="string" offset="1"/>
+ </magic>
+ </mime-type>
+ <mime-type type="text/x-texinfo">
+ <comment>TeXInfo document</comment>
+ <comment xml:lang="ar">مستند TeXInfo</comment>
+ <comment xml:lang="az">TeXInfo sənədi</comment>
+ <comment xml:lang="be@latin">Dakument TeXInfo</comment>
+ <comment xml:lang="bg">Документ — TeXInfo</comment>
+ <comment xml:lang="ca">document TeXInfo</comment>
+ <comment xml:lang="cs">Dokument TeXInfo</comment>
+ <comment xml:lang="cy">Dogfen TeXInfo</comment>
+ <comment xml:lang="da">TeXInfo-dokument</comment>
+ <comment xml:lang="de">TeXInfo-Dokument</comment>
+ <comment xml:lang="el">έγγραφο TeXInfo</comment>
+ <comment xml:lang="en_GB">TeXInfo document</comment>
+ <comment xml:lang="eo">TeXInfo-dokumento</comment>
+ <comment xml:lang="es">documento TeXInfo</comment>
+ <comment xml:lang="eu">TeXInfo dokumentua</comment>
+ <comment xml:lang="fi">TeXInfo-asiakirja</comment>
+ <comment xml:lang="fo">TeXInfo skjal</comment>
+ <comment xml:lang="fr">document TeXInfo</comment>
+ <comment xml:lang="ga">cáipéis TeXInfo</comment>
+ <comment xml:lang="gl">documento TeXInfo</comment>
+ <comment xml:lang="he">מסמך של TeXInfo</comment>
+ <comment xml:lang="hu">TeXInfo-dokumentum</comment>
+ <comment xml:lang="id">Dokumen TeXInfo</comment>
+ <comment xml:lang="it">Documento TeXInfo</comment>
+ <comment xml:lang="ja">TeXInfo ドキュメント</comment>
+ <comment xml:lang="kk">TeXInfo құжаты</comment>
+ <comment xml:lang="ko">TeXInfo 문서</comment>
+ <comment xml:lang="lt">TeXInfo dokumentas</comment>
+ <comment xml:lang="lv">TeXInfo dokuments</comment>
+ <comment xml:lang="ms">Dokumen TeXInfo</comment>
+ <comment xml:lang="nb">TeXInfo-dokument</comment>
+ <comment xml:lang="nl">TeXInfo-document</comment>
+ <comment xml:lang="nn">TeXInfo-dokument</comment>
+ <comment xml:lang="pl">Dokument TeXInfo</comment>
+ <comment xml:lang="pt">documento TeXInfo</comment>
+ <comment xml:lang="pt_BR">Documento TeXInfo</comment>
+ <comment xml:lang="ro">Document TexInfo</comment>
+ <comment xml:lang="ru">документ TeXInfo</comment>
+ <comment xml:lang="sk">Dokument TeXInfo</comment>
+ <comment xml:lang="sl">Dokument TeXInfo</comment>
+ <comment xml:lang="sq">Dokument TeXInfo</comment>
+ <comment xml:lang="sr">ТеХинфо документ</comment>
+ <comment xml:lang="sv">TeXInfo-dokument</comment>
+ <comment xml:lang="uk">документ TeXInfo</comment>
+ <comment xml:lang="vi">Tài liệu TeXInfo</comment>
+ <comment xml:lang="zh_CN">TeXInfo 文档</comment>
+ <comment xml:lang="zh_TW">TeXInfo 文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.texi"/>
+ <glob pattern="*.texinfo"/>
+ </mime-type>
+ <mime-type type="text/x-troff-me">
+ <comment>Troff ME input document</comment>
+ <comment xml:lang="ar">مستند Troff ME input</comment>
+ <comment xml:lang="be@latin">Uvodny dakument Troff ME</comment>
+ <comment xml:lang="bg">Изходен документ — Troff ME</comment>
+ <comment xml:lang="ca">document d'entrada Troff ME</comment>
+ <comment xml:lang="cs">Vstupní dokument Troff ME</comment>
+ <comment xml:lang="da">Troff ME inddata-dokument</comment>
+ <comment xml:lang="de">Troff-ME-Eingabedokument</comment>
+ <comment xml:lang="el">έγγραφο/πρόγραμμα εντολών troff ME</comment>
+ <comment xml:lang="en_GB">Troff ME input document</comment>
+ <comment xml:lang="eo">eniga dokumento de Troff ME</comment>
+ <comment xml:lang="es">documento de entrada Troff ME</comment>
+ <comment xml:lang="eu">Troff ME sarrerako dokumentua</comment>
+ <comment xml:lang="fi">Troff ME -syöteasiakirja</comment>
+ <comment xml:lang="fo">Troff ME inntaksskjal</comment>
+ <comment xml:lang="fr">document d'entrée Troff ME</comment>
+ <comment xml:lang="ga">cáipéis ionchur Troff ME</comment>
+ <comment xml:lang="gl">documento de entrada Troff ME</comment>
+ <comment xml:lang="he">מסמך קלט של Troff ME</comment>
+ <comment xml:lang="hu">Troff ME bemeneti dokumentum</comment>
+ <comment xml:lang="id">Dokumen masukan Troff ME</comment>
+ <comment xml:lang="it">Documento di input Troff ME</comment>
+ <comment xml:lang="ja">Troff ME 入力ドキュメント</comment>
+ <comment xml:lang="kk">Troff ME кіріс құжаты</comment>
+ <comment xml:lang="ko">Troff ME 입력 문서</comment>
+ <comment xml:lang="lt">Troff ME įvesties dokumentas</comment>
+ <comment xml:lang="lv">Troff ME ievades dokuments</comment>
+ <comment xml:lang="ms">Dokumen input Troff ME</comment>
+ <comment xml:lang="nb">Troff ME-inndatadokument</comment>
+ <comment xml:lang="nl">Troff ME-invoerdocument</comment>
+ <comment xml:lang="nn">Troff ME inndata-dokument</comment>
+ <comment xml:lang="pl">Dokument wejściowy Troff ME</comment>
+ <comment xml:lang="pt">documento origem Troff ME</comment>
+ <comment xml:lang="pt_BR">Documento de entrada Troff ME</comment>
+ <comment xml:lang="ro">Document intrare Troff ME</comment>
+ <comment xml:lang="ru">входной документ Troff ME</comment>
+ <comment xml:lang="sk">Vstupný dokument Troff ME</comment>
+ <comment xml:lang="sl">Vnosni dokument Troff ME</comment>
+ <comment xml:lang="sq">Dokument i input Troff ME</comment>
+ <comment xml:lang="sr">Troff ME улазни документ</comment>
+ <comment xml:lang="sv">Troff ME-indatadokument</comment>
+ <comment xml:lang="uk">вхідний документ Troff ME</comment>
+ <comment xml:lang="vi">Tài liệu nhập ME Troff</comment>
+ <comment xml:lang="zh_CN">Troff ME 输入文档</comment>
+ <comment xml:lang="zh_TW">Troff ME 輸入文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.me"/>
+ </mime-type>
+ <mime-type type="text/x-troff-mm">
+ <comment>Troff MM input document</comment>
+ <comment xml:lang="ar">مستند Troff MM input</comment>
+ <comment xml:lang="be@latin">Uvodny dakument Troff MM</comment>
+ <comment xml:lang="bg">Изходен документ — Troff MM</comment>
+ <comment xml:lang="ca">document d'entrada Troff MM</comment>
+ <comment xml:lang="cs">Vstupní dokument Troff MM</comment>
+ <comment xml:lang="da">Troff MM inddata-dokument</comment>
+ <comment xml:lang="de">Troff-MM-Eingabedokument</comment>
+ <comment xml:lang="el">έγγραφο/πρόγραμμα εντολών troff MM</comment>
+ <comment xml:lang="en_GB">Troff MM input document</comment>
+ <comment xml:lang="eo">eniga dokumento de Troff MM</comment>
+ <comment xml:lang="es">documento de entrada Troff MM</comment>
+ <comment xml:lang="eu">Troff MM sarrerako dokumentua</comment>
+ <comment xml:lang="fi">Troff MM -syöteasiakirja</comment>
+ <comment xml:lang="fo">Troff MM inntaksskjal</comment>
+ <comment xml:lang="fr">document d'entrée Troff MM</comment>
+ <comment xml:lang="ga">cáipéis ionchur Troff MM</comment>
+ <comment xml:lang="gl">documento de entrada Troff MM</comment>
+ <comment xml:lang="he">מסמך קלט של Troff MM</comment>
+ <comment xml:lang="hu">Troff MM bemeneti dokumentum</comment>
+ <comment xml:lang="id">Dokumen masukan Troff MM</comment>
+ <comment xml:lang="it">Documento di input Troff MM</comment>
+ <comment xml:lang="ja">Troff MM 入力ドキュメント</comment>
+ <comment xml:lang="kk">Troff MM кіріс құжаты</comment>
+ <comment xml:lang="ko">Troff MM 입력 문서</comment>
+ <comment xml:lang="lt">Troff MM įvesties dokumentas</comment>
+ <comment xml:lang="lv">Troff MM ievades dokuments</comment>
+ <comment xml:lang="ms">Dokumen input Troff MM</comment>
+ <comment xml:lang="nb">Troff MM-inndatadokument</comment>
+ <comment xml:lang="nl">Troff MM-invoerdocument</comment>
+ <comment xml:lang="nn">Troff MM inndata-dokument</comment>
+ <comment xml:lang="pl">Dokument wejściowy Troff MM</comment>
+ <comment xml:lang="pt">documento origem Troff MM</comment>
+ <comment xml:lang="pt_BR">Documento de entrada Troff MM</comment>
+ <comment xml:lang="ro">Document intrare Troff MM</comment>
+ <comment xml:lang="ru">входной документ Troff MM</comment>
+ <comment xml:lang="sk">Vstupný dokument Troff MM</comment>
+ <comment xml:lang="sl">Vnosni dokument Troff MM</comment>
+ <comment xml:lang="sq">Dokument i input Troff MM</comment>
+ <comment xml:lang="sr">Troff MM улазни документ</comment>
+ <comment xml:lang="sv">Troff MM-indatadokument</comment>
+ <comment xml:lang="uk">вхідний документ Troff MM</comment>
+ <comment xml:lang="vi">Tài liệu nhập MM Troff</comment>
+ <comment xml:lang="zh_CN">Troff MM 输入文档</comment>
+ <comment xml:lang="zh_TW">Troff MM 輸入文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.mm"/>
+ </mime-type>
+ <mime-type type="text/x-troff-ms">
+ <comment>Troff MS input document</comment>
+ <comment xml:lang="ar">مستند Troff MS input</comment>
+ <comment xml:lang="be@latin">Uvodny dakument Troff MS</comment>
+ <comment xml:lang="bg">Изходен документ — Troff MS</comment>
+ <comment xml:lang="ca">document d'entrada Troff MS</comment>
+ <comment xml:lang="cs">Vstupní dokument Troff MS</comment>
+ <comment xml:lang="da">Troff MS inddata-dokument</comment>
+ <comment xml:lang="de">Troff-MS-Eingabedokument</comment>
+ <comment xml:lang="el">έγγραφο/πρόγραμμα εντολών troff MS</comment>
+ <comment xml:lang="en_GB">Troff MS input document</comment>
+ <comment xml:lang="eo">eniga dokumento de Troff MS</comment>
+ <comment xml:lang="es">documento de entrada Troff MS</comment>
+ <comment xml:lang="eu">Troff MS sarrerako dokumentua</comment>
+ <comment xml:lang="fi">Troff MS -syöteasiakirja</comment>
+ <comment xml:lang="fo">Troff MS inntaksskjal</comment>
+ <comment xml:lang="fr">document d'entrée Troff MS</comment>
+ <comment xml:lang="ga">cáipéis ionchur Troff MS</comment>
+ <comment xml:lang="gl">documento de entrada Troff MS</comment>
+ <comment xml:lang="he">מסמך קלט של Troff MS</comment>
+ <comment xml:lang="hu">Troff MS bemeneti dokumentum</comment>
+ <comment xml:lang="id">Dokumen masukan Troff MS</comment>
+ <comment xml:lang="it">Documento di input Troff MS</comment>
+ <comment xml:lang="ja">Troff MS 入力ドキュメント</comment>
+ <comment xml:lang="kk">Troff MS кіріс құжаты</comment>
+ <comment xml:lang="ko">Troff Ms 입력 문서</comment>
+ <comment xml:lang="lt">Troff MS įvesties dokumentas</comment>
+ <comment xml:lang="lv">Troff MS ievades dokuments</comment>
+ <comment xml:lang="ms">Dokumen input Troff MS</comment>
+ <comment xml:lang="nb">Troff MS-inndatadokument</comment>
+ <comment xml:lang="nl">Troff MS-invoerdocument</comment>
+ <comment xml:lang="nn">Troff MS inndata-dokument</comment>
+ <comment xml:lang="pl">Dokument wejściowy Troff MS</comment>
+ <comment xml:lang="pt">documento origem Troff MS</comment>
+ <comment xml:lang="pt_BR">Documento de entrada Troff MS</comment>
+ <comment xml:lang="ro">Document intrare Troff MS</comment>
+ <comment xml:lang="ru">входной документ Troff MS</comment>
+ <comment xml:lang="sk">Vstupný dokument Troff MS</comment>
+ <comment xml:lang="sl">Vnosni dokument Troff MS</comment>
+ <comment xml:lang="sq">Dokument i input Troff MS</comment>
+ <comment xml:lang="sr">Troff MS улазни документ</comment>
+ <comment xml:lang="sv">Troff MS-indatadokument</comment>
+ <comment xml:lang="uk">вхідний документ Troff MS</comment>
+ <comment xml:lang="vi">Tài liệu nhập MS Troff</comment>
+ <comment xml:lang="zh_CN">Troff MS 输入文档</comment>
+ <comment xml:lang="zh_TW">Troff MS 輸入文件</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.ms"/>
+ </mime-type>
+ <mime-type type="text/x-uil">
+ <comment>X-Motif UIL table</comment>
+ <comment xml:lang="ar">جدول X-Motif UIL</comment>
+ <comment xml:lang="be@latin">Tablica X-Motif UIL</comment>
+ <comment xml:lang="bg">Таблица — X-Motif UIL</comment>
+ <comment xml:lang="ca">taula UIL de X-Motif</comment>
+ <comment xml:lang="cs">Tabulka X-Motif UIL</comment>
+ <comment xml:lang="da">X-Motif UIL-tabel</comment>
+ <comment xml:lang="de">X-Motif-UIL-Tabelle</comment>
+ <comment xml:lang="el">πίνακας X-Motif UIL</comment>
+ <comment xml:lang="en_GB">X-Motif UIL table</comment>
+ <comment xml:lang="es">tabla de X-Motif UIL</comment>
+ <comment xml:lang="eu">X-Motif UIL taula</comment>
+ <comment xml:lang="fi">X-Motif UIL -taulukko</comment>
+ <comment xml:lang="fo">X-Motif UIL talva</comment>
+ <comment xml:lang="fr">table X-Motif UIL</comment>
+ <comment xml:lang="ga">tábla X-Motif UIL</comment>
+ <comment xml:lang="gl">Táboa de X-Motif UIL</comment>
+ <comment xml:lang="he">טבלה של X-Motif UIL</comment>
+ <comment xml:lang="hu">X-Motif UIL-táblázat</comment>
+ <comment xml:lang="id">Tabel X-Motif UIL</comment>
+ <comment xml:lang="it">Tabella UIL X-Motif</comment>
+ <comment xml:lang="ja">X-Motif UIL 表</comment>
+ <comment xml:lang="kk">X-Motif UIL кестесі</comment>
+ <comment xml:lang="ko">X-Motif UIL 테이블</comment>
+ <comment xml:lang="lt">X-Motif UIL lentelė</comment>
+ <comment xml:lang="lv">X-Motif UIL tabula</comment>
+ <comment xml:lang="ms">Jadual X-Motif UIL</comment>
+ <comment xml:lang="nb">X-Motif UIL-tabell</comment>
+ <comment xml:lang="nl">X-Motif UIL-tabel</comment>
+ <comment xml:lang="nn">X-Motif UIL-tabell</comment>
+ <comment xml:lang="pl">Tabela UIL X-Motif</comment>
+ <comment xml:lang="pt">tabela UIL do X-Motif</comment>
+ <comment xml:lang="pt_BR">Tabela do X-Motif UIL</comment>
+ <comment xml:lang="ro">Tabel X-Motif UIL</comment>
+ <comment xml:lang="ru">таблица UIL X-Motif</comment>
+ <comment xml:lang="sk">Tabuľka X-Motif UIL</comment>
+ <comment xml:lang="sl">Preglednica X-Motif UIL</comment>
+ <comment xml:lang="sq">Tabelë X-Motif UIL</comment>
+ <comment xml:lang="sr">X-Motif UIL табела</comment>
+ <comment xml:lang="sv">X-Motif UIL-tabell</comment>
+ <comment xml:lang="uk">таблиця X-Motif UIL</comment>
+ <comment xml:lang="vi">Bảng UIL X-Motif</comment>
+ <comment xml:lang="zh_CN">X-Motif UIL 表</comment>
+ <comment xml:lang="zh_TW">X-Motif UIL 表格</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.uil"/>
+ </mime-type>
+ <mime-type type="text/x-uri">
+ <comment>resource location</comment>
+ <comment xml:lang="ar">موقع المورد</comment>
+ <comment xml:lang="be@latin">pałažeńnie resursu</comment>
+ <comment xml:lang="bg">Местоположение на ресурс</comment>
+ <comment xml:lang="ca">localització de recurs</comment>
+ <comment xml:lang="cs">Umístění zdroje</comment>
+ <comment xml:lang="da">resurseplacering</comment>
+ <comment xml:lang="de">Ressourcenort</comment>
+ <comment xml:lang="el">τοποθεσία πόρου</comment>
+ <comment xml:lang="en_GB">resource location</comment>
+ <comment xml:lang="eo">loko de risurco</comment>
+ <comment xml:lang="es">ubicación del recurso</comment>
+ <comment xml:lang="eu">baliabidearen kokalekua</comment>
+ <comment xml:lang="fi">resurssisijainti</comment>
+ <comment xml:lang="fo">tilfeingisstaður</comment>
+ <comment xml:lang="fr">localisation de ressource</comment>
+ <comment xml:lang="ga">suíomh acmhainne</comment>
+ <comment xml:lang="gl">localización do recurso</comment>
+ <comment xml:lang="he">מיקומו של המקור</comment>
+ <comment xml:lang="hu">erőforrás-hely</comment>
+ <comment xml:lang="id">lokasi sumber daya</comment>
+ <comment xml:lang="it">Posizione risorsa</comment>
+ <comment xml:lang="ja">リソースの場所</comment>
+ <comment xml:lang="kk">ресурс орналасуы</comment>
+ <comment xml:lang="ko">자원 위치</comment>
+ <comment xml:lang="lt">resurso vieta</comment>
+ <comment xml:lang="lv">resursa atrašanās vieta</comment>
+ <comment xml:lang="ms">Lokasi sumber</comment>
+ <comment xml:lang="nb">ressurslokasjon</comment>
+ <comment xml:lang="nl">bronlocatie</comment>
+ <comment xml:lang="nn">ressursplassering</comment>
+ <comment xml:lang="pl">Położenie zasobu</comment>
+ <comment xml:lang="pt">localização de recurso</comment>
+ <comment xml:lang="pt_BR">localização de recurso</comment>
+ <comment xml:lang="ro">locație de resursă</comment>
+ <comment xml:lang="ru">расположение ресурса</comment>
+ <comment xml:lang="sk">Umiestnenie zdroja</comment>
+ <comment xml:lang="sl">mesto vira</comment>
+ <comment xml:lang="sq">Pozicion rezerve</comment>
+ <comment xml:lang="sr">путања ресурса</comment>
+ <comment xml:lang="sv">resursplats</comment>
+ <comment xml:lang="uk">розташування ресурсу</comment>
+ <comment xml:lang="vi">địa điểm tài nguyên</comment>
+ <comment xml:lang="zh_CN">资源位置</comment>
+ <comment xml:lang="zh_TW">資源位置</comment>
+ <sub-class-of type="text/plain"/>
+
+ </mime-type>
+ <mime-type type="text/x-xmi">
+ <comment>XMI file</comment>
+ <comment xml:lang="ar">ملف XMI</comment>
+ <comment xml:lang="be@latin">Fajł XMI</comment>
+ <comment xml:lang="bg">Файл — XMI</comment>
+ <comment xml:lang="ca">fitxer XMI</comment>
+ <comment xml:lang="cs">Soubor XMI</comment>
+ <comment xml:lang="da">XMI-fil</comment>
+ <comment xml:lang="de">XMI-Datei</comment>
+ <comment xml:lang="en_GB">XMI file</comment>
+ <comment xml:lang="eo">XMI-dosiero</comment>
+ <comment xml:lang="es">archivo XMI</comment>
+ <comment xml:lang="eu">XMI fitxategia</comment>
+ <comment xml:lang="fi">XMI-tiedosto</comment>
+ <comment xml:lang="fo">XMI fíla</comment>
+ <comment xml:lang="fr">fichier XMI</comment>
+ <comment xml:lang="ga">comhad XMI</comment>
+ <comment xml:lang="gl">ficheiro XMI</comment>
+ <comment xml:lang="he">קובץ XMI</comment>
+ <comment xml:lang="hu">XMI fájl</comment>
+ <comment xml:lang="id">Berkas XMI</comment>
+ <comment xml:lang="it">File XMI</comment>
+ <comment xml:lang="ja">XMI ファイル</comment>
+ <comment xml:lang="kk">XMI файлы</comment>
+ <comment xml:lang="ko">XMI 파일</comment>
+ <comment xml:lang="lt">XMI failas</comment>
+ <comment xml:lang="lv">XMI fails</comment>
+ <comment xml:lang="nb">XMI-fil</comment>
+ <comment xml:lang="nl">XMI-bestand</comment>
+ <comment xml:lang="nn">XMI-fil</comment>
+ <comment xml:lang="pl">Plik XMI</comment>
+ <comment xml:lang="pt_BR">Arquivo XMI</comment>
+ <comment xml:lang="ro">Fișier XMI</comment>
+ <comment xml:lang="ru">файл XMI</comment>
+ <comment xml:lang="sk">Súbor XMI</comment>
+ <comment xml:lang="sl">Datoteka XMI</comment>
+ <comment xml:lang="sq">File XMI</comment>
+ <comment xml:lang="sv">XMI-fil</comment>
+ <comment xml:lang="uk">файл XMI</comment>
+ <comment xml:lang="vi">Tập tin XMI</comment>
+ <comment xml:lang="zh_CN">XMI 文件</comment>
+ <comment xml:lang="zh_TW">XMI 檔</comment>
+ <acronym>XMI</acronym>
+ <expanded-acronym>XML Metadata Interchange</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.xmi"/>
+ <root-XML namespaceURI="http://schema.omg.org/spec/XMI/2.0" localName="XMI"/>
+ <root-XML namespaceURI="http://schema.omg.org/spec/XMI/2.1" localName="XMI"/>
+ </mime-type>
+ <mime-type type="text/x-xslfo">
+ <comment>XSL FO file</comment>
+ <comment xml:lang="ar">ملف XSL FO</comment>
+ <comment xml:lang="be@latin">Fajł XSL FO</comment>
+ <comment xml:lang="bg">Форматиращ файл — XSL FO</comment>
+ <comment xml:lang="ca">fitxer FO XSL</comment>
+ <comment xml:lang="cs">Soubor XSL FO</comment>
+ <comment xml:lang="da">XML FO-fil</comment>
+ <comment xml:lang="de">XSL-FO-Datei</comment>
+ <comment xml:lang="en_GB">XSL FO file</comment>
+ <comment xml:lang="eo">XSL-FO-dosiero</comment>
+ <comment xml:lang="es">archivo XSL FO</comment>
+ <comment xml:lang="eu">XSL FO fitxategia</comment>
+ <comment xml:lang="fi">XSL FO -tiedosto</comment>
+ <comment xml:lang="fo">XSL FO fíla</comment>
+ <comment xml:lang="fr">fichier XSL FO</comment>
+ <comment xml:lang="ga">comhad XSL FO</comment>
+ <comment xml:lang="gl">ficheiro XSL FO</comment>
+ <comment xml:lang="he">קובץ XSL FO</comment>
+ <comment xml:lang="hu">XSL FO fájl</comment>
+ <comment xml:lang="id">Berkas XSL FO</comment>
+ <comment xml:lang="it">File XSL FO</comment>
+ <comment xml:lang="ja">XSL FO ファイル</comment>
+ <comment xml:lang="kk">XSL FO файлы</comment>
+ <comment xml:lang="ko">XSL 포매팅 개체 파일</comment>
+ <comment xml:lang="lt">XSL FO failas</comment>
+ <comment xml:lang="lv">XSL FO fails</comment>
+ <comment xml:lang="nb">FO-fil for XSL</comment>
+ <comment xml:lang="nl">XSL FO-bestand</comment>
+ <comment xml:lang="nn">XSL FO-fil</comment>
+ <comment xml:lang="pl">Plik XSL FO</comment>
+ <comment xml:lang="pt_BR">Arquivo XSL FO</comment>
+ <comment xml:lang="ro">Fișier XSL FO</comment>
+ <comment xml:lang="ru">файл XSL FO</comment>
+ <comment xml:lang="sk">Súbor XSL FO</comment>
+ <comment xml:lang="sl">Datoteka XSL FO</comment>
+ <comment xml:lang="sq">File XSL FO</comment>
+ <comment xml:lang="sv">XSL FO-fil</comment>
+ <comment xml:lang="uk">файл XSL FO</comment>
+ <comment xml:lang="vi">Tập tin FO của XSL (XFO)</comment>
+ <comment xml:lang="zh_CN">XSL 格式化对象文件</comment>
+ <comment xml:lang="zh_TW">XSL FO 檔</comment>
+ <acronym>XSL FO</acronym>
+ <expanded-acronym>XSL Formatting Objects</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.fo"/>
+ <glob pattern="*.xslfo"/>
+ <root-XML namespaceURI="http://www.w3.org/1999/XSL/Format" localName="root"/>
+ </mime-type>
+ <mime-type type="text/x-iptables">
+ <comment>iptables configuration file</comment>
+ <comment xml:lang="ar">ملف تضبيط iptables</comment>
+ <comment xml:lang="be@latin">kanfihuracyjny fajł iptables</comment>
+ <comment xml:lang="bg">Настройки за iptables</comment>
+ <comment xml:lang="ca">fitxer de configuració d'iptables</comment>
+ <comment xml:lang="cs">Soubor nastavení iptables</comment>
+ <comment xml:lang="da">iptableskonfigurationsfil</comment>
+ <comment xml:lang="de">iptables-Konfigurationsdatei</comment>
+ <comment xml:lang="es">archivo de configuración de iptables</comment>
+ <comment xml:lang="eu">iptables konfigurazio-fitxategia</comment>
+ <comment xml:lang="fi">iptables-asetustiedosto</comment>
+ <comment xml:lang="fo">iptables samansetingarfíla</comment>
+ <comment xml:lang="fr">fichier de configuration iptables</comment>
+ <comment xml:lang="ga">comhad cumraíochta iptables</comment>
+ <comment xml:lang="gl">ficheiro de configuración de iptables</comment>
+ <comment xml:lang="he">קובץ הגדרה של iptables</comment>
+ <comment xml:lang="hu">iptables beállítófájl</comment>
+ <comment xml:lang="id">berkas konfigurasi iptables</comment>
+ <comment xml:lang="it">File configurazione iptables</comment>
+ <comment xml:lang="ja">iptables 設定ファイル</comment>
+ <comment xml:lang="kk">iptables баптаулар файлы</comment>
+ <comment xml:lang="ko">iptables 설정 파일</comment>
+ <comment xml:lang="lt">iptables konfigūracijos failas</comment>
+ <comment xml:lang="lv">iptables konfigurācijas fails</comment>
+ <comment xml:lang="nb">konfigurasjonsfil for iptables</comment>
+ <comment xml:lang="nl">iptables-configuratiebestand</comment>
+ <comment xml:lang="nn">iptables oppsettfil</comment>
+ <comment xml:lang="pl">Plik konfiguracji iptables</comment>
+ <comment xml:lang="pt_BR">arquivo de configuração do iptables</comment>
+ <comment xml:lang="ro">fișier configurare iptables</comment>
+ <comment xml:lang="ru">конфигурационный файл iptables</comment>
+ <comment xml:lang="sk">Súbor nastavení iptables</comment>
+ <comment xml:lang="sl">nastavitvena datoteka iptables</comment>
+ <comment xml:lang="sq">File konfigurimi iptables</comment>
+ <comment xml:lang="sv">iptables-konfigurationsfil</comment>
+ <comment xml:lang="uk">файл налаштувань iptables</comment>
+ <comment xml:lang="vi">tập tin cấu hình iptables</comment>
+ <comment xml:lang="zh_CN">iptables 防火墙配置文件</comment>
+ <comment xml:lang="zh_TW">iptables 組態檔</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="/etc/sysconfig/iptables" type="string" offset="0:256"/>
+ <match value="*filter" type="string" offset="0:256">
+ <match value=":INPUT" type="string" offset="0:256">
+ <match value=":FORWARD" type="string" offset="0:256">
+ <match value=":OUTPUT" type="string" offset="0:256"/>
+ </match>
+ </match>
+ </match>
+ <match value="-A INPUT" type="string" offset="0:256">
+ <match value="-A FORWARD" type="string" offset="0:256">
+ <match value="-A OUTPUT" type="string" offset="0:256"/>
+ </match>
+ </match>
+ <match value="-P INPUT" type="string" offset="0:256">
+ <match value="-P FORWARD" type="string" offset="0:256">
+ <match value="-P OUTPUT" type="string" offset="0:256"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.iptables"/>
+ </mime-type>
+ <mime-type type="application/xslt+xml">
+ <comment>XSLT stylesheet</comment>
+ <comment xml:lang="ar">نمط XSLT</comment>
+ <comment xml:lang="be@latin">Arkuš stylaŭ XSLT</comment>
+ <comment xml:lang="bg">Стилове — XSLT</comment>
+ <comment xml:lang="ca">full d'estil XSLT</comment>
+ <comment xml:lang="cs">Styl XSLT</comment>
+ <comment xml:lang="da">XSLT-stilark</comment>
+ <comment xml:lang="de">XSLT-Stylesheet</comment>
+ <comment xml:lang="el">φύλλο στυλ XSLT</comment>
+ <comment xml:lang="en_GB">XSLT stylesheet</comment>
+ <comment xml:lang="eo">XSLT-stilfolio</comment>
+ <comment xml:lang="es">hoja de estilo XSLT</comment>
+ <comment xml:lang="eu">XSLT estilo-orria</comment>
+ <comment xml:lang="fi">XSLT-tyylitiedosto</comment>
+ <comment xml:lang="fo">XSLT sniðark</comment>
+ <comment xml:lang="fr">feuille de style XSLT</comment>
+ <comment xml:lang="ga">stílbhileog XSLT</comment>
+ <comment xml:lang="gl">folla de estilo XSLT</comment>
+ <comment xml:lang="he">סגנון גליון XSLT</comment>
+ <comment xml:lang="hu">XSLT-stíluslap</comment>
+ <comment xml:lang="id">Lembar gaya XSLT</comment>
+ <comment xml:lang="it">Foglio di stile XSLT</comment>
+ <comment xml:lang="ja">XSLT スタイルシート</comment>
+ <comment xml:lang="kk">XSLT стильдер кестесі</comment>
+ <comment xml:lang="ko">XSLT 스타일시트</comment>
+ <comment xml:lang="lt">XSLT stiliaus aprašas</comment>
+ <comment xml:lang="lv">XSLT izklājlapa</comment>
+ <comment xml:lang="ms">Helaian Gaya XSLT</comment>
+ <comment xml:lang="nb">XSLT-stilark</comment>
+ <comment xml:lang="nl">XSLT-stijlblad</comment>
+ <comment xml:lang="nn">XSLT-stilark</comment>
+ <comment xml:lang="pl">Arkusz stylów XSLT</comment>
+ <comment xml:lang="pt">folha de estilos XSLT</comment>
+ <comment xml:lang="pt_BR">Folha de estilo XSLT</comment>
+ <comment xml:lang="ro">Fișă de stil XSLT</comment>
+ <comment xml:lang="ru">таблица стилей XSLT</comment>
+ <comment xml:lang="sk">Štýl XSLT</comment>
+ <comment xml:lang="sl">Slogovna predloga XSLT</comment>
+ <comment xml:lang="sq">Fletë stili XSLT</comment>
+ <comment xml:lang="sr">Датотека са XSLT стилом</comment>
+ <comment xml:lang="sv">XSLT-stilmall</comment>
+ <comment xml:lang="uk">таблиця стилів XSLT</comment>
+ <comment xml:lang="vi">Tờ kiểu dáng XSLT</comment>
+ <comment xml:lang="zh_CN">XSLT 样式表</comment>
+ <comment xml:lang="zh_TW">XSLT 樣式表</comment>
+ <acronym>XSLT</acronym>
+ <expanded-acronym>eXtensible Stylesheet Language Transformation</expanded-acronym>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="&lt;xsl:stylesheet" type="string" offset="0:256"/>
+ </magic>
+ <glob pattern="*.xsl"/>
+ <glob pattern="*.xslt"/>
+ <root-XML namespaceURI="http://www.w3.org/1999/XSL/Transform" localName="stylesheet"/>
+ <sub-class-of type="application/xml"/>
+ </mime-type>
+ <mime-type type="text/xmcd">
+ <comment>XMCD CD database</comment>
+ <comment xml:lang="ar">قاعدة بيانات XMCD CD</comment>
+ <comment xml:lang="be@latin">Baza źviestak ab dyskach XMCD</comment>
+ <comment xml:lang="bg">База от данни за CD-та — XMCD</comment>
+ <comment xml:lang="ca">base de dades de CD XMCD</comment>
+ <comment xml:lang="cs">Databáze XMCD CD</comment>
+ <comment xml:lang="da">XMCD-cd-database</comment>
+ <comment xml:lang="de">XMCD-CD-Datenbank</comment>
+ <comment xml:lang="es">base de datos de CD XMCD</comment>
+ <comment xml:lang="eu">XMCD CD datu-basea</comment>
+ <comment xml:lang="fi">XMCD CD -tietokanta</comment>
+ <comment xml:lang="fo">XMCD fløgu dátustovnur</comment>
+ <comment xml:lang="fr">base de données de CD XMCD</comment>
+ <comment xml:lang="ga">bunachar sonraí XMCD CD</comment>
+ <comment xml:lang="gl">base de datos de CD XMCD</comment>
+ <comment xml:lang="he">בסיס נתונים XMCD CD</comment>
+ <comment xml:lang="hu">XMCD CD-adatbázis</comment>
+ <comment xml:lang="id">Basis data XMCD CD</comment>
+ <comment xml:lang="it">Database XMCD CD</comment>
+ <comment xml:lang="ja">XMCD CD データベース</comment>
+ <comment xml:lang="kk">XMCD CD дерекқоры</comment>
+ <comment xml:lang="ko">XMCD CD 데이터베이스</comment>
+ <comment xml:lang="lt">XMCD CD duomenų bazė</comment>
+ <comment xml:lang="lv">XMCD CD datubāze</comment>
+ <comment xml:lang="nb">XMCD CD-database</comment>
+ <comment xml:lang="nl">XMCD CD-gegevensbank</comment>
+ <comment xml:lang="nn">XMCD CD-database</comment>
+ <comment xml:lang="pl">Baza danych CD XMCD</comment>
+ <comment xml:lang="pt_BR">Banco de dados de CD XMCD</comment>
+ <comment xml:lang="ro">Bază de date XMCD CD</comment>
+ <comment xml:lang="ru">база данных компакт-дисков XMCD</comment>
+ <comment xml:lang="sk">Databáza XMCD CD</comment>
+ <comment xml:lang="sl">Podatkovna zbirka XMCD CD</comment>
+ <comment xml:lang="sq">Bazë me të dhëna XMCD CD</comment>
+ <comment xml:lang="sv">XMCD cd-databas</comment>
+ <comment xml:lang="uk">база даних XMCD CD</comment>
+ <comment xml:lang="vi">Cơ sở dữ liệu CD XMCD</comment>
+ <comment xml:lang="zh_CN">XMCD CD 数据库</comment>
+ <comment xml:lang="zh_TW">XMCD CD 資料庫</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="50">
+ <match value="# xmcd" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/xml">
+ <comment>XML document</comment>
+ <comment xml:lang="ar">مستند XML</comment>
+ <comment xml:lang="be@latin">Dakument XML</comment>
+ <comment xml:lang="bg">Документ — XML</comment>
+ <comment xml:lang="ca">document XML</comment>
+ <comment xml:lang="cs">Dokument XML</comment>
+ <comment xml:lang="da">XML-dokument</comment>
+ <comment xml:lang="de">XML-Dokument</comment>
+ <comment xml:lang="en_GB">XML document</comment>
+ <comment xml:lang="eo">XML-dokumento</comment>
+ <comment xml:lang="es">documento XML</comment>
+ <comment xml:lang="eu">XML dokumentua</comment>
+ <comment xml:lang="fi">XML-asiakirja</comment>
+ <comment xml:lang="fo">XML skjal</comment>
+ <comment xml:lang="fr">document XML</comment>
+ <comment xml:lang="ga">cáipéis XML</comment>
+ <comment xml:lang="gl">documento XML</comment>
+ <comment xml:lang="he">מסמך XML</comment>
+ <comment xml:lang="hu">XML dokumentum</comment>
+ <comment xml:lang="id">Dokumen XML</comment>
+ <comment xml:lang="it">Documento XML</comment>
+ <comment xml:lang="ja">XML ドキュメント</comment>
+ <comment xml:lang="kk">XML құжаты</comment>
+ <comment xml:lang="ko">XML 문서</comment>
+ <comment xml:lang="lt">XML dokumentas</comment>
+ <comment xml:lang="lv">XML dokuments</comment>
+ <comment xml:lang="nb">XML-dokument</comment>
+ <comment xml:lang="nl">XML-document</comment>
+ <comment xml:lang="nn">XML-dokument</comment>
+ <comment xml:lang="pl">Dokument XML</comment>
+ <comment xml:lang="pt_BR">Documento XML</comment>
+ <comment xml:lang="ro">Document XML</comment>
+ <comment xml:lang="ru">документ XML</comment>
+ <comment xml:lang="sk">Dokument XML</comment>
+ <comment xml:lang="sl">Dokument XML</comment>
+ <comment xml:lang="sq">Dokument XML</comment>
+ <comment xml:lang="sv">XML-dokument</comment>
+ <comment xml:lang="uk">документ XML</comment>
+ <comment xml:lang="vi">Tài liệu XML</comment>
+ <comment xml:lang="zh_CN">XML 文档</comment>
+ <comment xml:lang="zh_TW">XML 文件</comment>
+ <acronym>XML</acronym>
+ <expanded-acronym>eXtensible Markup Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-html"/>
+ <magic priority="40">
+ <match value="&lt;?xml" type="string" offset="0"/>
+ <match value="&lt;!--" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.xml"/>
+ <glob pattern="*.xbl"/>
+ <glob pattern="*.xsd"/>
+ <glob pattern="*.rng"/>
+ <alias type="text/xml"/>
+ </mime-type>
+ <mime-type type="application/xml-external-parsed-entity">
+ <comment>XML entities document</comment>
+ <comment xml:lang="ar">مستند كيانات XML</comment>
+ <comment xml:lang="be@latin">Dakument elementaŭ XML</comment>
+ <comment xml:lang="bg">Документ — заместващи последователности в XML</comment>
+ <comment xml:lang="ca">document d'entitats XML</comment>
+ <comment xml:lang="cs">Dokument entit XML</comment>
+ <comment xml:lang="da">XML-enhedsdokument</comment>
+ <comment xml:lang="de">XML-Dokument-Entitäten</comment>
+ <comment xml:lang="es">documento de entidades XML</comment>
+ <comment xml:lang="eu">XML entitateen dokumentua</comment>
+ <comment xml:lang="fi">XML-entiteettiasiakirja</comment>
+ <comment xml:lang="fo">XML einindisskjal</comment>
+ <comment xml:lang="fr">document d'entités XML</comment>
+ <comment xml:lang="ga">cáipéis aonán XML</comment>
+ <comment xml:lang="gl">documento de entidades XML</comment>
+ <comment xml:lang="he">מסמך ישיות XML</comment>
+ <comment xml:lang="hu">XML egyeddokumentum</comment>
+ <comment xml:lang="id">Dokumen entitas XML</comment>
+ <comment xml:lang="it">Documento entità XML</comment>
+ <comment xml:lang="ja">XML エントリドキュメント</comment>
+ <comment xml:lang="kk">XML мәндер құжаты</comment>
+ <comment xml:lang="ko">XML 엔티티 문서</comment>
+ <comment xml:lang="lt">XML esybių dokumentas</comment>
+ <comment xml:lang="lv">XML vienību dokuments</comment>
+ <comment xml:lang="nb">XML-entitetsdokument</comment>
+ <comment xml:lang="nl">XML entiteiten-document</comment>
+ <comment xml:lang="nn">XML-entitet-dokument</comment>
+ <comment xml:lang="pl">Dokument jednostek XML</comment>
+ <comment xml:lang="pt_BR">Documento de entidades XML</comment>
+ <comment xml:lang="ro">Document entități XML</comment>
+ <comment xml:lang="ru">файл сущностей XML</comment>
+ <comment xml:lang="sk">Dokument entít XML</comment>
+ <comment xml:lang="sl">Dokument XML določil</comment>
+ <comment xml:lang="sq">Dokument njësish XML</comment>
+ <comment xml:lang="sv">XML-entitetsdokument</comment>
+ <comment xml:lang="uk">документ об’єктів XML</comment>
+ <comment xml:lang="vi">Tài liệu thực thể XML</comment>
+ <comment xml:lang="zh_CN">XML 特征文档</comment>
+ <comment xml:lang="zh_TW">XML 實體文件</comment>
+ <acronym>XML</acronym>
+ <expanded-acronym>eXtensible Markup Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-html"/>
+ <glob pattern="*.ent"/>
+ <alias type="text/xml-external-parsed-entity"/>
+ </mime-type>
+ <mime-type type="video/dv">
+ <comment>DV video</comment>
+ <comment xml:lang="ar">DV مرئي</comment>
+ <comment xml:lang="be@latin">Videa DV</comment>
+ <comment xml:lang="bg">Видео — DV</comment>
+ <comment xml:lang="ca">vídeo DV</comment>
+ <comment xml:lang="cs">Video DV</comment>
+ <comment xml:lang="da">DV-video</comment>
+ <comment xml:lang="de">DV-Video</comment>
+ <comment xml:lang="en_GB">DV video</comment>
+ <comment xml:lang="eo">DV-video</comment>
+ <comment xml:lang="es">vídeo DV</comment>
+ <comment xml:lang="eu">DV bideoa</comment>
+ <comment xml:lang="fi">DV-video</comment>
+ <comment xml:lang="fo">DV video</comment>
+ <comment xml:lang="fr">vidéo DV</comment>
+ <comment xml:lang="ga">físeán DV</comment>
+ <comment xml:lang="gl">vídeo DV</comment>
+ <comment xml:lang="he">וידאו DV</comment>
+ <comment xml:lang="hu">DV videó</comment>
+ <comment xml:lang="id">Video DV</comment>
+ <comment xml:lang="it">Video DV</comment>
+ <comment xml:lang="ja">DV 動画</comment>
+ <comment xml:lang="kk">DV видеосы</comment>
+ <comment xml:lang="ko">DV 비디오</comment>
+ <comment xml:lang="lt">DV vaizdo įrašas</comment>
+ <comment xml:lang="lv">DV video</comment>
+ <comment xml:lang="nb">DV-film</comment>
+ <comment xml:lang="nl">DV-video</comment>
+ <comment xml:lang="nn">DV-video</comment>
+ <comment xml:lang="pl">Plik wideo DV</comment>
+ <comment xml:lang="pt_BR">Vídeo DV</comment>
+ <comment xml:lang="ro">Video DV</comment>
+ <comment xml:lang="ru">видео DV</comment>
+ <comment xml:lang="sk">Video DV</comment>
+ <comment xml:lang="sl">Video datoteka DV</comment>
+ <comment xml:lang="sq">Video DV</comment>
+ <comment xml:lang="sv">DV-video</comment>
+ <comment xml:lang="uk">відеокліп DV</comment>
+ <comment xml:lang="vi">Ảnh động DV</comment>
+ <comment xml:lang="zh_CN">DV 视频</comment>
+ <comment xml:lang="zh_TW">DV 視訊</comment>
+ <acronym>DV</acronym>
+ <expanded-acronym>Digital Video</expanded-acronym>
+ <magic priority="50">
+ <match value="0x1f070000" type="big32" offset="0" mask="0xffffff00"/>
+ </magic>
+ <glob pattern="*.dv"/>
+ </mime-type>
+ <mime-type type="video/isivideo">
+ <comment>ISI video</comment>
+ <comment xml:lang="ar">مرئي ISI</comment>
+ <comment xml:lang="az">ISI video faylı</comment>
+ <comment xml:lang="be@latin">Videa ISI</comment>
+ <comment xml:lang="bg">Видео — ISI</comment>
+ <comment xml:lang="ca">vídeo ISI</comment>
+ <comment xml:lang="cs">Video ISI</comment>
+ <comment xml:lang="cy">Fideo ISI</comment>
+ <comment xml:lang="da">ISI-video</comment>
+ <comment xml:lang="de">ISI-Video</comment>
+ <comment xml:lang="el">βίντεο ISI</comment>
+ <comment xml:lang="en_GB">ISI video</comment>
+ <comment xml:lang="eo">ISI-video</comment>
+ <comment xml:lang="es">vídeo ISI</comment>
+ <comment xml:lang="eu">ISI bideoa</comment>
+ <comment xml:lang="fi">ISI-video</comment>
+ <comment xml:lang="fo">ISI video</comment>
+ <comment xml:lang="fr">vidéo ISI</comment>
+ <comment xml:lang="ga">físeán ISI</comment>
+ <comment xml:lang="gl">vídeo ISI</comment>
+ <comment xml:lang="he">וידאו ISI</comment>
+ <comment xml:lang="hu">ISI-videó</comment>
+ <comment xml:lang="id">Video ISI</comment>
+ <comment xml:lang="it">Video ISI</comment>
+ <comment xml:lang="ja">ISI 動画</comment>
+ <comment xml:lang="kk">ISI видеосы</comment>
+ <comment xml:lang="ko">ISI 비디오</comment>
+ <comment xml:lang="lt">ISI vaizdo įrašas</comment>
+ <comment xml:lang="lv">ISI video</comment>
+ <comment xml:lang="ms">Video ISI</comment>
+ <comment xml:lang="nb">ISI-film</comment>
+ <comment xml:lang="nl">ISI-video</comment>
+ <comment xml:lang="nn">ISI video</comment>
+ <comment xml:lang="pl">Plik wideo ISI</comment>
+ <comment xml:lang="pt">vídeoISI</comment>
+ <comment xml:lang="pt_BR">Vídeo ISI</comment>
+ <comment xml:lang="ro">Video ISI</comment>
+ <comment xml:lang="ru">видео ISI</comment>
+ <comment xml:lang="sk">Video ISI</comment>
+ <comment xml:lang="sl">Video datoteka ISI</comment>
+ <comment xml:lang="sq">Video ISI</comment>
+ <comment xml:lang="sr">ISI видео</comment>
+ <comment xml:lang="sv">ISI-video</comment>
+ <comment xml:lang="uk">відеокліп ISI</comment>
+ <comment xml:lang="vi">Ảnh động ISI</comment>
+ <comment xml:lang="zh_CN">ISI 视频</comment>
+ <comment xml:lang="zh_TW">ISI 視訊</comment>
+ </mime-type>
+ <mime-type type="video/mp2t">
+ <comment>MPEG-2 transport stream</comment>
+ <comment xml:lang="ar">بث نقل MPEG-2</comment>
+ <comment xml:lang="bg">Поток — транспорт по MPEG-2</comment>
+ <comment xml:lang="ca">flux de transport MPEG-2</comment>
+ <comment xml:lang="cs">Přenosový proud MPEG-2</comment>
+ <comment xml:lang="da">MPEG-2-transportstrøm</comment>
+ <comment xml:lang="de">MPEG-2-Transportstrom</comment>
+ <comment xml:lang="es">flujo de transporte MPEG-2</comment>
+ <comment xml:lang="fi">MPEG-2 -siirtobittivirta</comment>
+ <comment xml:lang="fo">MPEG-2 flutningsstreymur</comment>
+ <comment xml:lang="fr">flux de transport MPEG-2</comment>
+ <comment xml:lang="ga">Sruth aistrithe MPEG-2</comment>
+ <comment xml:lang="gl">fluxo de transporte MPEG-2</comment>
+ <comment xml:lang="he">העברת זרימה של MPEG-2</comment>
+ <comment xml:lang="hu">MPEG-2 átviteli adatfolyam</comment>
+ <comment xml:lang="id">Stream transport MPEG-2</comment>
+ <comment xml:lang="it">Stream di trasporto MPEG-2</comment>
+ <comment xml:lang="ja">MPEG-2 トランスポートストリーム</comment>
+ <comment xml:lang="kk">MPEG-2 көліктік ағыны</comment>
+ <comment xml:lang="ko">MPEG-2 전송 스트림</comment>
+ <comment xml:lang="lt">MPEG-2 transportavimo srautas</comment>
+ <comment xml:lang="lv">MPEG-2 transporta straume</comment>
+ <comment xml:lang="pl">Strumień przesyłania MPEG-2</comment>
+ <comment xml:lang="ro">Flux transport MPEG-2</comment>
+ <comment xml:lang="ru">транспортный поток MPEG-2</comment>
+ <comment xml:lang="sl">Pretočni vir prenosega MPEG</comment>
+ <comment xml:lang="sv">MPEG-2 transportström</comment>
+ <comment xml:lang="uk">потік передавання даних MPEG-2</comment>
+ <comment xml:lang="zh_CN">MPEG-2 传输流</comment>
+ <comment xml:lang="zh_TW">MPEG-2 傳輸串流</comment>
+ <acronym>MPEG-2 TS</acronym>
+ <expanded-acronym>Moving Picture Experts Group 2 Transport Stream</expanded-acronym>
+ <magic priority="50">
+ <match value="0x47400010" type="big32" offset="0" mask="0xff4000df"/>
+ </magic>
+ <glob pattern="*.m2t"/>
+ <glob pattern="*.m2ts"/>
+ <glob pattern="*.ts"/>
+ <glob pattern="*.mts"/>
+ <glob pattern="*.cpi"/>
+ <glob pattern="*.clpi"/>
+ <glob pattern="*.mpl"/>
+ <glob pattern="*.mpls"/>
+ <glob pattern="*.bdm"/>
+ <glob pattern="*.bdmv"/>
+ </mime-type>
+ <mime-type type="video/mpeg">
+ <comment>MPEG video</comment>
+ <comment xml:lang="ar">MPEG مرئي</comment>
+ <comment xml:lang="be@latin">Videa MPEG</comment>
+ <comment xml:lang="bg">Видео — MPEG</comment>
+ <comment xml:lang="ca">vídeo MPEG</comment>
+ <comment xml:lang="cs">Video MPEG</comment>
+ <comment xml:lang="da">MPEG-video</comment>
+ <comment xml:lang="de">MPEG-Video</comment>
+ <comment xml:lang="el">βίντεο MPEG</comment>
+ <comment xml:lang="en_GB">MPEG video</comment>
+ <comment xml:lang="eo">MPEG-video</comment>
+ <comment xml:lang="es">vídeo MPEG</comment>
+ <comment xml:lang="eu">MPEG bideoa</comment>
+ <comment xml:lang="fi">MPEG-video</comment>
+ <comment xml:lang="fo">MPEG video</comment>
+ <comment xml:lang="fr">vidéo MPEG</comment>
+ <comment xml:lang="ga">físeán MPEG</comment>
+ <comment xml:lang="gl">vídeo MPEG</comment>
+ <comment xml:lang="he">וידאו MPEG</comment>
+ <comment xml:lang="hu">MPEG-videó</comment>
+ <comment xml:lang="id">Video MPEG</comment>
+ <comment xml:lang="it">Video MPEG</comment>
+ <comment xml:lang="ja">MPEG 動画</comment>
+ <comment xml:lang="kk">MPEG видеосы</comment>
+ <comment xml:lang="ko">MPEG 비디오</comment>
+ <comment xml:lang="lt">MPEG vaizdo įrašas</comment>
+ <comment xml:lang="lv">MPEG video</comment>
+ <comment xml:lang="ms">Video MPEG</comment>
+ <comment xml:lang="nb">MPEG-film</comment>
+ <comment xml:lang="nl">MPEG-video</comment>
+ <comment xml:lang="nn">MPEG-video</comment>
+ <comment xml:lang="pl">Plik wideo MPEG</comment>
+ <comment xml:lang="pt">vídeo MPEG</comment>
+ <comment xml:lang="pt_BR">Vídeo MPEG</comment>
+ <comment xml:lang="ro">Video MPEG</comment>
+ <comment xml:lang="ru">видео MPEG</comment>
+ <comment xml:lang="sk">Video MPEG</comment>
+ <comment xml:lang="sl">Video datoteka MPEG</comment>
+ <comment xml:lang="sq">Video MPEG</comment>
+ <comment xml:lang="sr">MPEG видео</comment>
+ <comment xml:lang="sv">MPEG-video</comment>
+ <comment xml:lang="uk">відеокліп MPEG</comment>
+ <comment xml:lang="vi">Ảnh động MPEG</comment>
+ <comment xml:lang="zh_CN">MPEG 视频</comment>
+ <comment xml:lang="zh_TW">MPEG 視訊</comment>
+ <acronym>MPEG</acronym>
+ <expanded-acronym>Moving Picture Experts Group</expanded-acronym>
+ <alias type="video/x-mpeg"/>
+ <alias type="video/x-mpeg2"/>
+ <magic priority="50">
+ <match value="\x47\x3f\xff\x10" type="string" offset="0"/>
+ <match value="0x000001b3" type="big32" offset="0"/>
+ <match value="0x000001ba" type="big32" offset="0"/>
+ </magic>
+ <glob pattern="*.mpeg"/>
+ <glob pattern="*.mpg"/>
+ <glob pattern="*.mp2"/>
+ <glob pattern="*.mpe"/>
+ <glob pattern="*.vob"/>
+ <glob pattern="[0-9][0-9][0-9].vdr"/>
+ </mime-type>
+ <mime-type type="video/vnd.mpegurl">
+ <comment>MPEG video (streamed)</comment>
+ <comment xml:lang="bg">Видео — MPEG, поточно</comment>
+ <comment xml:lang="ca">vídeo MPEG (flux)</comment>
+ <comment xml:lang="cs">Video MPEG (proud)</comment>
+ <comment xml:lang="de">MPEG-Video (Datenstrom)</comment>
+ <comment xml:lang="es">Vídeo MPEG (flujo)</comment>
+ <comment xml:lang="fi">MPEG-video (virtaus)</comment>
+ <comment xml:lang="fr">vidéo MPEG (flux)</comment>
+ <comment xml:lang="gl">vídeo MPEG (en stream)</comment>
+ <comment xml:lang="he">קובץ MPEG (בהזרמה)</comment>
+ <comment xml:lang="hu">MPEG videó (szórt)</comment>
+ <comment xml:lang="id">Video MPEG (di-stream-kan)</comment>
+ <comment xml:lang="it">Video MPEG (streamed)</comment>
+ <comment xml:lang="ja">MPEG ビデオ(ストリーム)</comment>
+ <comment xml:lang="kk">MPEG видео (ағымдық)</comment>
+ <comment xml:lang="ko">MPEG 비디오 (스트리밍)</comment>
+ <comment xml:lang="lv">MPEG video (straumēts)</comment>
+ <comment xml:lang="pl">Plik wideo MPEG (strumień)</comment>
+ <comment xml:lang="ru">видео MPEG (потоковое)</comment>
+ <comment xml:lang="sl">MPEG-video (pretočni)</comment>
+ <comment xml:lang="sv">MPEG-video (strömmad)</comment>
+ <comment xml:lang="uk">відеокліп MPEG (потоковий)</comment>
+ <comment xml:lang="zh_TW">MPEG 視訊 (串流)</comment>
+ <sub-class-of type="text/plain"/>
+ <alias type="video/x-mpegurl"/>
+ <magic priority="50">
+ <match value="#EXTM4U" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.m1u"/>
+ <glob pattern="*.m4u"/>
+ <glob pattern="*.mxu"/>
+ </mime-type>
+ <mime-type type="video/quicktime">
+ <comment>QuickTime video</comment>
+ <comment xml:lang="ar">QuickTime مرئي</comment>
+ <comment xml:lang="be@latin">Videa QuickTime</comment>
+ <comment xml:lang="bg">Видео — QuickTime</comment>
+ <comment xml:lang="ca">vídeo QuickTime</comment>
+ <comment xml:lang="cs">Video QuickTime</comment>
+ <comment xml:lang="da">QuickTime-video</comment>
+ <comment xml:lang="de">QuickTime-Video</comment>
+ <comment xml:lang="el">βίντεο QuickTime</comment>
+ <comment xml:lang="eo">QuickTime-video</comment>
+ <comment xml:lang="es">vídeo QuickTime</comment>
+ <comment xml:lang="eu">QuickTime bideoa</comment>
+ <comment xml:lang="fi">QuickTime-video</comment>
+ <comment xml:lang="fo">QuickTime video</comment>
+ <comment xml:lang="fr">vidéo QuickTime</comment>
+ <comment xml:lang="ga">físeán QuickTime</comment>
+ <comment xml:lang="gl">vídeo QuickTime</comment>
+ <comment xml:lang="he">וידאו של QuickTime</comment>
+ <comment xml:lang="hu">QuickTime videó</comment>
+ <comment xml:lang="id">Video QuickTime</comment>
+ <comment xml:lang="it">Video QuickTime</comment>
+ <comment xml:lang="ja">QuickTime 動画</comment>
+ <comment xml:lang="kk">QuickTime видеосы</comment>
+ <comment xml:lang="ko">퀵타임 비디오</comment>
+ <comment xml:lang="lt">QuickTime vaizdo įrašas</comment>
+ <comment xml:lang="lv">QuickTime video</comment>
+ <comment xml:lang="ms">Video QuickTime</comment>
+ <comment xml:lang="nb">Quicktime film</comment>
+ <comment xml:lang="nl">QuickTime-video</comment>
+ <comment xml:lang="nn">QuickTime-video</comment>
+ <comment xml:lang="pl">Plik wideo QuickTime</comment>
+ <comment xml:lang="pt">vídeo QuickTime</comment>
+ <comment xml:lang="pt_BR">Vídeo do QuickTime</comment>
+ <comment xml:lang="ro">Video QuickTime</comment>
+ <comment xml:lang="ru">видео QuickTime</comment>
+ <comment xml:lang="sk">Video QuickTime</comment>
+ <comment xml:lang="sl">Video datoteka QuickTime</comment>
+ <comment xml:lang="sq">Video QuickTime</comment>
+ <comment xml:lang="sr">QuickTime видео</comment>
+ <comment xml:lang="sv">QuickTime-video</comment>
+ <comment xml:lang="uk">відеокліп QuickTime</comment>
+ <comment xml:lang="vi">Ảnh động QuickTime</comment>
+ <comment xml:lang="zh_CN">QuickTime 视频</comment>
+ <comment xml:lang="zh_TW">QuickTime 視訊</comment>
+ <magic priority="50">
+ <match value="mdat" type="string" offset="12"/>
+ <match value="mdat" type="string" offset="4"/>
+ <match value="moov" type="string" offset="4"/>
+ <match value="ftypqt" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.qt"/>
+ <glob pattern="*.mov"/>
+ <glob pattern="*.moov"/>
+ <glob pattern="*.qtvr"/>
+ </mime-type>
+ <mime-type type="image/x-quicktime">
+ <comment>QuickTime image</comment>
+ <comment xml:lang="ar">صورة QuickTime</comment>
+ <comment xml:lang="be@latin">Vyjava QuickTime</comment>
+ <comment xml:lang="bg">Изображение — QuickTime</comment>
+ <comment xml:lang="ca">imatge QuickTime</comment>
+ <comment xml:lang="cs">Obrázek QuickTime</comment>
+ <comment xml:lang="da">QuickTime-billede</comment>
+ <comment xml:lang="de">QuickTime-Bild</comment>
+ <comment xml:lang="eo">QuickTime-bildo</comment>
+ <comment xml:lang="es">imagen QuickTime</comment>
+ <comment xml:lang="eu">QuickTime irudia</comment>
+ <comment xml:lang="fi">QuickTime-kuva</comment>
+ <comment xml:lang="fo">QuickTime mynd</comment>
+ <comment xml:lang="fr">image QuickTime</comment>
+ <comment xml:lang="ga">íomhá QuickTime</comment>
+ <comment xml:lang="gl">imaxe QuickTime</comment>
+ <comment xml:lang="he">תמונה של QuickTime</comment>
+ <comment xml:lang="hu">QuickTime kép</comment>
+ <comment xml:lang="id">Citra QuickTime</comment>
+ <comment xml:lang="it">Immagine QuickTime</comment>
+ <comment xml:lang="ja">QuickTime 画像</comment>
+ <comment xml:lang="kk">QuickTime суреті</comment>
+ <comment xml:lang="ko">퀵타임 그림</comment>
+ <comment xml:lang="lt">QuickTime paveikslėlis</comment>
+ <comment xml:lang="lv">QuickTime attēls</comment>
+ <comment xml:lang="nb">Quicktime bilde</comment>
+ <comment xml:lang="nl">QuickTime-afbeelding</comment>
+ <comment xml:lang="nn">QuickTime-bilete</comment>
+ <comment xml:lang="pl">Obraz QuickTime</comment>
+ <comment xml:lang="pt_BR">Imagem do QuickTime</comment>
+ <comment xml:lang="ro">Imagine QuickTime</comment>
+ <comment xml:lang="ru">изображение QuickTime</comment>
+ <comment xml:lang="sk">Obrázok QuickTime</comment>
+ <comment xml:lang="sl">Slikovna datoteka QuickTime</comment>
+ <comment xml:lang="sq">Figurë QuickTime</comment>
+ <comment xml:lang="sv">QuickTime-bild</comment>
+ <comment xml:lang="uk">зображення QuickTime</comment>
+ <comment xml:lang="vi">Ảnh QuickTime</comment>
+ <comment xml:lang="zh_CN">QuickTime 图像</comment>
+ <comment xml:lang="zh_TW">QuickTime 影像</comment>
+ <magic priority="50">
+ <match value="idat" type="string" offset="4"/>
+ </magic>
+ <glob pattern="*.qtif"/>
+ <glob pattern="*.qif"/>
+ </mime-type>
+ <mime-type type="video/vivo">
+ <comment>Vivo video</comment>
+ <comment xml:lang="ar">Vivo مرئي</comment>
+ <comment xml:lang="az">Vivo video faylı</comment>
+ <comment xml:lang="be@latin">Videa Vivo</comment>
+ <comment xml:lang="bg">Видео — Vivo</comment>
+ <comment xml:lang="ca">vídeo Vivo</comment>
+ <comment xml:lang="cs">Video Vivo</comment>
+ <comment xml:lang="cy">Fideo Vivo</comment>
+ <comment xml:lang="da">Vivo-video</comment>
+ <comment xml:lang="de">Vivo-Video</comment>
+ <comment xml:lang="el">βίντεο Vivo</comment>
+ <comment xml:lang="en_GB">Vivo video</comment>
+ <comment xml:lang="eo">Vivo-video</comment>
+ <comment xml:lang="es">vídeo Vivo</comment>
+ <comment xml:lang="eu">Vivo bideoa</comment>
+ <comment xml:lang="fi">Vivo-video</comment>
+ <comment xml:lang="fo">Vivo video</comment>
+ <comment xml:lang="fr">vidéo Vivo</comment>
+ <comment xml:lang="ga">físeán Vivo</comment>
+ <comment xml:lang="gl">vídeo Vivo</comment>
+ <comment xml:lang="he">וידאו של Vivo</comment>
+ <comment xml:lang="hu">Vivo-videó</comment>
+ <comment xml:lang="id">Video Vivo</comment>
+ <comment xml:lang="it">Video Vivo</comment>
+ <comment xml:lang="ja">Vivo 動画</comment>
+ <comment xml:lang="kk">Vivo видеосы</comment>
+ <comment xml:lang="ko">Vivo 비디오</comment>
+ <comment xml:lang="lt">Vivo vaizdo įrašas</comment>
+ <comment xml:lang="lv">Vivo video</comment>
+ <comment xml:lang="ms">Video Vivo</comment>
+ <comment xml:lang="nb">Vivo-film</comment>
+ <comment xml:lang="nl">Vivo-video</comment>
+ <comment xml:lang="nn">Vivo-film</comment>
+ <comment xml:lang="pl">Plik wideo Vivo</comment>
+ <comment xml:lang="pt">vídeo Vivo</comment>
+ <comment xml:lang="pt_BR">Vídeo Vivo</comment>
+ <comment xml:lang="ro">Video Vivo</comment>
+ <comment xml:lang="ru">видео Vivo</comment>
+ <comment xml:lang="sk">Video Vivo</comment>
+ <comment xml:lang="sl">Video datoteka Vivo</comment>
+ <comment xml:lang="sq">Video Vivo</comment>
+ <comment xml:lang="sr">Vivo видео</comment>
+ <comment xml:lang="sv">Vivo-video</comment>
+ <comment xml:lang="uk">відео Vivo</comment>
+ <comment xml:lang="vi">Ảnh động Vivo</comment>
+ <comment xml:lang="zh_CN">Vivo 视频</comment>
+ <comment xml:lang="zh_TW">Vivo 視訊</comment>
+ <alias type="video/vnd.vivo"/>
+ <glob pattern="*.viv"/>
+ <glob pattern="*.vivo"/>
+ </mime-type>
+ <mime-type type="video/wavelet">
+ <comment>Wavelet video</comment>
+ <comment xml:lang="ar">Wavelet مرئي</comment>
+ <comment xml:lang="az">Wavelet video faylı</comment>
+ <comment xml:lang="be@latin">Videa Wavelet</comment>
+ <comment xml:lang="bg">Видео — Wavelet</comment>
+ <comment xml:lang="ca">vídeo Wavelet</comment>
+ <comment xml:lang="cs">Video Wavelet</comment>
+ <comment xml:lang="cy">Fideo Wavelet</comment>
+ <comment xml:lang="da">Waveletvideo</comment>
+ <comment xml:lang="de">Wavelet-Video</comment>
+ <comment xml:lang="el">βίντεο Wavelet</comment>
+ <comment xml:lang="en_GB">Wavelet video</comment>
+ <comment xml:lang="eo">Wavelet-video</comment>
+ <comment xml:lang="es">vídeo Wavelet</comment>
+ <comment xml:lang="eu">Wavelet bideoa</comment>
+ <comment xml:lang="fi">Wavelet-video</comment>
+ <comment xml:lang="fo">Wavelet video</comment>
+ <comment xml:lang="fr">vidéo Wavelet</comment>
+ <comment xml:lang="ga">físeán Wavelet</comment>
+ <comment xml:lang="gl">vídeo Wavelet</comment>
+ <comment xml:lang="he">וידאו של Wavelet</comment>
+ <comment xml:lang="hu">Wavelet-videó</comment>
+ <comment xml:lang="id">Video Wavelet</comment>
+ <comment xml:lang="it">Video Wavelet</comment>
+ <comment xml:lang="ja">Wavelet 動画</comment>
+ <comment xml:lang="kk">Wavelet видеосы</comment>
+ <comment xml:lang="ko">Wavelet 비디오</comment>
+ <comment xml:lang="lt">Wavelet vaizdo įrašas</comment>
+ <comment xml:lang="lv">Wavelet video</comment>
+ <comment xml:lang="ms">Video Wavelet</comment>
+ <comment xml:lang="nb">Wavelet-film</comment>
+ <comment xml:lang="nl">Wavelet-video</comment>
+ <comment xml:lang="nn">Wavelet video</comment>
+ <comment xml:lang="pl">Plik wideo Wavelet</comment>
+ <comment xml:lang="pt">vídeo Wavelet</comment>
+ <comment xml:lang="pt_BR">Vídeo Wavelet</comment>
+ <comment xml:lang="ro">Video Wavelet</comment>
+ <comment xml:lang="ru">видео Wavelet</comment>
+ <comment xml:lang="sk">Video Wavelet</comment>
+ <comment xml:lang="sl">Video datoteka Wavelet</comment>
+ <comment xml:lang="sq">Video Wavelet</comment>
+ <comment xml:lang="sr">Wavelet видео</comment>
+ <comment xml:lang="sv">Wavelet-video</comment>
+ <comment xml:lang="uk">відеокліп Wavelet</comment>
+ <comment xml:lang="vi">Ảnh động Wavelet</comment>
+ <comment xml:lang="zh_CN">Wavelet 视频</comment>
+ <comment xml:lang="zh_TW">Wavelet 視訊</comment>
+ </mime-type>
+ <mime-type type="video/x-anim">
+ <comment>ANIM animation</comment>
+ <comment xml:lang="ar">تحريكة ANIM</comment>
+ <comment xml:lang="az">ANIM animasiyası</comment>
+ <comment xml:lang="be@latin">Animacyja ANIM</comment>
+ <comment xml:lang="bg">Анимация — ANIM</comment>
+ <comment xml:lang="ca">animació ANIM</comment>
+ <comment xml:lang="cs">Animace ANIM</comment>
+ <comment xml:lang="cy">Animeiddiad ANIM</comment>
+ <comment xml:lang="da">ANIM-animation</comment>
+ <comment xml:lang="de">ANIM-Animation</comment>
+ <comment xml:lang="el">κινούμενο σχέδιο ANIM</comment>
+ <comment xml:lang="en_GB">ANIM animation</comment>
+ <comment xml:lang="eo">ANIM-animacio</comment>
+ <comment xml:lang="es">animación ANIM</comment>
+ <comment xml:lang="eu">ANIM animazioa</comment>
+ <comment xml:lang="fi">ANIM-animaatio</comment>
+ <comment xml:lang="fo">ANIM teknmyndagerð</comment>
+ <comment xml:lang="fr">animation ANIM</comment>
+ <comment xml:lang="ga">beochan ANIM</comment>
+ <comment xml:lang="gl">animación ANIM</comment>
+ <comment xml:lang="he">הנפשת ANIM</comment>
+ <comment xml:lang="hu">ANIM-animáció</comment>
+ <comment xml:lang="id">Animasi ANIM</comment>
+ <comment xml:lang="it">Animazione ANIM</comment>
+ <comment xml:lang="ja">ANIM アニメーション</comment>
+ <comment xml:lang="kk">ANIM анимациясы</comment>
+ <comment xml:lang="ko">ANIM 동화상</comment>
+ <comment xml:lang="lt">ANIM animacija</comment>
+ <comment xml:lang="lv">ANIM animācija</comment>
+ <comment xml:lang="ms">Animasi ANIM</comment>
+ <comment xml:lang="nb">ANIM-animasjon</comment>
+ <comment xml:lang="nl">ANIM-animatie</comment>
+ <comment xml:lang="nn">ANIM-animasjon</comment>
+ <comment xml:lang="pl">Plik animacji ANIM</comment>
+ <comment xml:lang="pt">animação ANIM</comment>
+ <comment xml:lang="pt_BR">Animação ANIM</comment>
+ <comment xml:lang="ro">Animație ANIM</comment>
+ <comment xml:lang="ru">анимация ANIM</comment>
+ <comment xml:lang="sk">Animácia ANIM</comment>
+ <comment xml:lang="sl">Datoteka animacije ANIM</comment>
+ <comment xml:lang="sq">Animim ANIM</comment>
+ <comment xml:lang="sr">ANIM анимација</comment>
+ <comment xml:lang="sv">ANIM-animering</comment>
+ <comment xml:lang="uk">анімація ANIM</comment>
+ <comment xml:lang="vi">Hoạt ảnh ANIM</comment>
+ <comment xml:lang="zh_CN">ANIM 动画</comment>
+ <comment xml:lang="zh_TW">ANIM 動畫</comment>
+ <glob pattern="*.anim[1-9j]"/>
+ </mime-type>
+ <mime-type type="video/x-flic">
+ <comment>FLIC animation</comment>
+ <comment xml:lang="ar">تحريكة FLIC</comment>
+ <comment xml:lang="be@latin">Animacyja FLIC</comment>
+ <comment xml:lang="bg">Анимация — FLIC</comment>
+ <comment xml:lang="ca">animació FLIC</comment>
+ <comment xml:lang="cs">Animace FLIC</comment>
+ <comment xml:lang="da">FLIC-animation</comment>
+ <comment xml:lang="de">FLIC-Animation</comment>
+ <comment xml:lang="en_GB">FLIC animation</comment>
+ <comment xml:lang="es">animación FLIC</comment>
+ <comment xml:lang="eu">FLIC animazioa</comment>
+ <comment xml:lang="fi">FLIC-animaatio</comment>
+ <comment xml:lang="fo">FLIC teknimyndagerð</comment>
+ <comment xml:lang="fr">animation FLIC</comment>
+ <comment xml:lang="ga">beochan FLIC</comment>
+ <comment xml:lang="gl">animación FLIC</comment>
+ <comment xml:lang="he">הנפשת FLIC</comment>
+ <comment xml:lang="hu">FLIC animáció</comment>
+ <comment xml:lang="id">Animasi FLIC</comment>
+ <comment xml:lang="it">Animazione FLIC</comment>
+ <comment xml:lang="ja">FLIC アニメーション</comment>
+ <comment xml:lang="kk">FLIC анимациясы</comment>
+ <comment xml:lang="ko">FLIC 동화상</comment>
+ <comment xml:lang="lt">FLIC animacija</comment>
+ <comment xml:lang="lv">FLIC animācija</comment>
+ <comment xml:lang="nb">FLIC-animasjon</comment>
+ <comment xml:lang="nl">FLIC-animatie</comment>
+ <comment xml:lang="nn">FLIC-animasjon</comment>
+ <comment xml:lang="pl">Plik animacji FLIC</comment>
+ <comment xml:lang="pt_BR">Animação FLIC</comment>
+ <comment xml:lang="ro">Animație FLIC</comment>
+ <comment xml:lang="ru">анимация FLIC</comment>
+ <comment xml:lang="sk">Animácia FLIC</comment>
+ <comment xml:lang="sl">Datoteka animacije FLIC</comment>
+ <comment xml:lang="sq">Animim FLIC</comment>
+ <comment xml:lang="sv">FLIC-animering</comment>
+ <comment xml:lang="uk">анімація FLIC</comment>
+ <comment xml:lang="vi">Hoạt ảnh FLIC</comment>
+ <comment xml:lang="zh_CN">FLIC 动画</comment>
+ <comment xml:lang="zh_TW">FLIC 動畫</comment>
+ <alias type="video/fli"/>
+ <alias type="video/x-fli"/>
+ <magic priority="50">
+ <match value="0xAF11" type="little16" offset="0"/>
+ <match value="0xAF12" type="little16" offset="0"/>
+ </magic>
+ <glob pattern="*.fli"/>
+ <glob pattern="*.flc"/>
+ </mime-type>
+ <mime-type type="application/x-hwp">
+ <comment>Haansoft Hangul document</comment>
+ <comment xml:lang="ar">مستند Haansoft Hangul</comment>
+ <comment xml:lang="be@latin">Dakument Haansoft Hangul</comment>
+ <comment xml:lang="bg">Документ — Haansoft Hangul</comment>
+ <comment xml:lang="ca">document Haansoft Hangul</comment>
+ <comment xml:lang="cs">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="da">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="de">Haansoft-Hangul-Dokument</comment>
+ <comment xml:lang="es">documento de Haansoft Hangul</comment>
+ <comment xml:lang="eu">Haansoft Hangul dokumentua</comment>
+ <comment xml:lang="fi">Haansoft Hangul -asiakirja</comment>
+ <comment xml:lang="fo">Haansoft Hangul skjal</comment>
+ <comment xml:lang="fr">document Haansoft Hangul</comment>
+ <comment xml:lang="ga">cáipéis Haansoft Hangul</comment>
+ <comment xml:lang="gl">documento de Haansoft Hangul</comment>
+ <comment xml:lang="he">מסמך Haansoft Hangul</comment>
+ <comment xml:lang="hu">Haansoft hangul dokumentum</comment>
+ <comment xml:lang="id">Dokumen Haansoft Hangul</comment>
+ <comment xml:lang="it">Documento Haansoft Hangul</comment>
+ <comment xml:lang="ja">Haansoft Hangul ドキュメント</comment>
+ <comment xml:lang="kk">Haansoft Hangul құжаты</comment>
+ <comment xml:lang="ko">한소프트 한글 문서</comment>
+ <comment xml:lang="lt">Haansoft Hangul dokumentas</comment>
+ <comment xml:lang="lv">Haansoft Hangul dokuments</comment>
+ <comment xml:lang="nb">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="nl">Haansoft Hangul-document</comment>
+ <comment xml:lang="nn">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="pl">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="pt_BR">Documento do Haansoft Hangul</comment>
+ <comment xml:lang="ro">Document Haansoft Hangul</comment>
+ <comment xml:lang="ru">документ Haansoft Hangul</comment>
+ <comment xml:lang="sk">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="sl">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="sq">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="sv">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="uk">документ Haansoft Hangul</comment>
+ <comment xml:lang="vi">Tài liệu Hangul Haansoft</comment>
+ <comment xml:lang="zh_CN">Haansoft Hangul 文档</comment>
+ <comment xml:lang="zh_TW">Haansoft 韓文文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="HWP Document File" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.hwp"/>
+ <alias type="application/vnd.haansoft-hwp"/>
+ </mime-type>
+ <mime-type type="application/x-hwt">
+ <comment>Haansoft Hangul document template</comment>
+ <comment xml:lang="ar">قالب مستند Haansoft Hangul</comment>
+ <comment xml:lang="be@latin">Šablon dakumentu Haansoft Hangul</comment>
+ <comment xml:lang="bg">Шаблон за документи — Haansoft Hangul</comment>
+ <comment xml:lang="ca">plantilla de document Haansoft Hangul</comment>
+ <comment xml:lang="cs">Šablona dokumentu Haansoft Hangul</comment>
+ <comment xml:lang="da">Haansoft Hangul-dokumentskabelon</comment>
+ <comment xml:lang="de">Haansoft-Hangul-Dokumentvorlage</comment>
+ <comment xml:lang="es">plantilla de documento de Haansoft Hangul</comment>
+ <comment xml:lang="eu">Haansoft Hangul dokumentuaren txantiloia</comment>
+ <comment xml:lang="fi">Haansoft Hangul -asiakirjamalli</comment>
+ <comment xml:lang="fo">Haansoft Hangul skjalaformur</comment>
+ <comment xml:lang="fr">modèle de document Haansoft Hangul</comment>
+ <comment xml:lang="ga">teimpléad cháipéis Haansoft Hangul</comment>
+ <comment xml:lang="gl">modelo de documento de Haansoft Hangul</comment>
+ <comment xml:lang="he">תבנית מסמך של Haansoft Hangul</comment>
+ <comment xml:lang="hu">Haansoft hangul dokumentumsablon</comment>
+ <comment xml:lang="id">Templat dokumen Haansoft Hangul</comment>
+ <comment xml:lang="it">Modello documento Haansoft Hangul</comment>
+ <comment xml:lang="ja">Haansoft Hangul ドキュメントテンプレート</comment>
+ <comment xml:lang="kk">Haansoft Hangul құжат үлгісі</comment>
+ <comment xml:lang="ko">한소프트 한글 문서 서식</comment>
+ <comment xml:lang="lt">Haansoft Hangul dokumento šablonas</comment>
+ <comment xml:lang="lv">Haansoft Hangul dokumentu veidne</comment>
+ <comment xml:lang="nb">Haansoft Hangul-dokumentmal</comment>
+ <comment xml:lang="nl">Haansoft Hangul-documentsjabloon</comment>
+ <comment xml:lang="nn">Haansoft Hangul-dokumentmal</comment>
+ <comment xml:lang="pl">Szablon dokumentu Haansoft Hangul</comment>
+ <comment xml:lang="pt_BR">Modelo de documento do Haansoft Hangul</comment>
+ <comment xml:lang="ro">Document șablon Haansoft Hangul</comment>
+ <comment xml:lang="ru">шаблон документа Haansoft Hangul</comment>
+ <comment xml:lang="sk">Šablóna dokumentu Haansoft Hangul</comment>
+ <comment xml:lang="sl">Predloga dokumenta Haansoft Hangul</comment>
+ <comment xml:lang="sq">Model dokumenti Haansoft Hangul</comment>
+ <comment xml:lang="sv">Haansoft Hangul-dokumentmall</comment>
+ <comment xml:lang="uk">шаблон документа Haansoft Hangul</comment>
+ <comment xml:lang="vi">Mẫu tài liệu Hangul Haansoft</comment>
+ <comment xml:lang="zh_CN">Haansoft Hangul 文档模板</comment>
+ <comment xml:lang="zh_TW">Haansoft 韓文文件範本</comment>
+ <generic-icon name="x-office-document"/>
+ <glob pattern="*.hwt"/>
+ <alias type="application/vnd.haansoft-hwt"/>
+ </mime-type>
+ <mime-type type="video/x-mng">
+ <comment>MNG animation</comment>
+ <comment xml:lang="ar">تحريكة MNG</comment>
+ <comment xml:lang="be@latin">Animacyja MNG</comment>
+ <comment xml:lang="bg">Анимация — MNG</comment>
+ <comment xml:lang="ca">animació MNG</comment>
+ <comment xml:lang="cs">Animace MNG</comment>
+ <comment xml:lang="da">MNG-animation</comment>
+ <comment xml:lang="de">MNG-Animation</comment>
+ <comment xml:lang="el">κινούμενα σχέδια MNG</comment>
+ <comment xml:lang="en_GB">MNG animation</comment>
+ <comment xml:lang="eo">MNG-animacio</comment>
+ <comment xml:lang="es">animación MNG</comment>
+ <comment xml:lang="eu">MNG animazioa</comment>
+ <comment xml:lang="fi">MNG-animaatio</comment>
+ <comment xml:lang="fo">MNG teknimyndagerð</comment>
+ <comment xml:lang="fr">animation MNG</comment>
+ <comment xml:lang="ga">beochan MNG</comment>
+ <comment xml:lang="gl">animación MNG</comment>
+ <comment xml:lang="he">הנפשת MNG</comment>
+ <comment xml:lang="hu">MNG-animáció</comment>
+ <comment xml:lang="id">Animasi MNG</comment>
+ <comment xml:lang="it">Animazione MNG</comment>
+ <comment xml:lang="ja">MNG アニメーション</comment>
+ <comment xml:lang="kk">MNG анимациясы</comment>
+ <comment xml:lang="ko">MNG 동화상</comment>
+ <comment xml:lang="lt">MNG animacija</comment>
+ <comment xml:lang="lv">MNG animācija</comment>
+ <comment xml:lang="ms">Animasi MNG</comment>
+ <comment xml:lang="nb">MNG-animasjon</comment>
+ <comment xml:lang="nl">MNG-animatie</comment>
+ <comment xml:lang="nn">MNG-animasjon</comment>
+ <comment xml:lang="pl">Animacja MNG</comment>
+ <comment xml:lang="pt">animação MNG</comment>
+ <comment xml:lang="pt_BR">Animação MNG</comment>
+ <comment xml:lang="ro">Animație MNG</comment>
+ <comment xml:lang="ru">анимация MNG</comment>
+ <comment xml:lang="sk">Animácia MNG</comment>
+ <comment xml:lang="sl">Datoteka animacije MNG</comment>
+ <comment xml:lang="sq">Animim MNG</comment>
+ <comment xml:lang="sr">MNG анимација</comment>
+ <comment xml:lang="sv">MNG-animering</comment>
+ <comment xml:lang="uk">анімація MNG</comment>
+ <comment xml:lang="vi">Hoạt ảnh MNG</comment>
+ <comment xml:lang="zh_CN">MNG 动画</comment>
+ <comment xml:lang="zh_TW">MNG 動畫</comment>
+ <acronym>MNG</acronym>
+ <expanded-acronym>Multiple-Image Network Graphics</expanded-acronym>
+ <glob pattern="*.mng"/>
+ </mime-type>
+ <mime-type type="video/x-ms-asf">
+ <comment>ASF video</comment>
+ <comment xml:lang="ar">ASF مرئي</comment>
+ <comment xml:lang="be@latin">Videa ASF</comment>
+ <comment xml:lang="bg">Видео — ASF</comment>
+ <comment xml:lang="ca">vídeo ASF</comment>
+ <comment xml:lang="cs">Video ASF</comment>
+ <comment xml:lang="da">ASF-video</comment>
+ <comment xml:lang="de">ASF-Video</comment>
+ <comment xml:lang="en_GB">ASF video</comment>
+ <comment xml:lang="eo">ASF-video</comment>
+ <comment xml:lang="es">vídeo ASF</comment>
+ <comment xml:lang="eu">ASF bideoa</comment>
+ <comment xml:lang="fi">ASF-video</comment>
+ <comment xml:lang="fo">ASF video</comment>
+ <comment xml:lang="fr">vidéo ASF</comment>
+ <comment xml:lang="ga">físeán ASF</comment>
+ <comment xml:lang="gl">vídeo ASF</comment>
+ <comment xml:lang="he">וידאו ASF</comment>
+ <comment xml:lang="hu">ASF videó</comment>
+ <comment xml:lang="id">Video ASF</comment>
+ <comment xml:lang="it">Video ASF</comment>
+ <comment xml:lang="ja">ASF 動画</comment>
+ <comment xml:lang="kk">ASF видеосы</comment>
+ <comment xml:lang="ko">ASF 비디오</comment>
+ <comment xml:lang="lt">ASF vaizdo įrašas</comment>
+ <comment xml:lang="lv">ASF video</comment>
+ <comment xml:lang="nb">ASF-film</comment>
+ <comment xml:lang="nl">ASF-video</comment>
+ <comment xml:lang="nn">ASF-video</comment>
+ <comment xml:lang="pl">Plik wideo ASF</comment>
+ <comment xml:lang="pt_BR">Vídeo ASF</comment>
+ <comment xml:lang="ro">Video ASF</comment>
+ <comment xml:lang="ru">видео ASF</comment>
+ <comment xml:lang="sk">Video ASF</comment>
+ <comment xml:lang="sl">Video datoteka ASF</comment>
+ <comment xml:lang="sq">Video ASF</comment>
+ <comment xml:lang="sv">ASF-video</comment>
+ <comment xml:lang="uk">відеокліп ASF</comment>
+ <comment xml:lang="vi">Ảnh động ASF</comment>
+ <comment xml:lang="zh_CN">ASF 视频</comment>
+ <comment xml:lang="zh_TW">ASF 視訊</comment>
+ <acronym>ASF</acronym>
+ <expanded-acronym>Advanced Streaming Format</expanded-acronym>
+ <alias type="video/x-ms-wm"/>
+ <alias type="application/vnd.ms-asf"/>
+ <glob pattern="*.asf"/>
+ <magic priority="50">
+ <match value="0x3026b275" type="big32" offset="0"/>
+ <match value="[Reference]" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-netshow-channel">
+ <comment>Windows Media Station file</comment>
+ <comment xml:lang="ar">ملف محطة Windows Media</comment>
+ <comment xml:lang="be@latin">Fajł Windows Media Station</comment>
+ <comment xml:lang="bg">Файл — Windows Media Station</comment>
+ <comment xml:lang="ca">fitxer Windows Media Station</comment>
+ <comment xml:lang="cs">Soubor Windows Media Station</comment>
+ <comment xml:lang="da">Windows Media Station-fil</comment>
+ <comment xml:lang="de">Windows-Media-Streamingbeschreibung</comment>
+ <comment xml:lang="es">archivo de emisora de Windows Media</comment>
+ <comment xml:lang="eu">Windows Media Station fitxategia</comment>
+ <comment xml:lang="fi">Windows Media Station-tiedosto</comment>
+ <comment xml:lang="fo">Windows Media Station fíla</comment>
+ <comment xml:lang="fr">fichier Windows Media Station</comment>
+ <comment xml:lang="ga">comhad Windows Media Station</comment>
+ <comment xml:lang="gl">ficheiro de emisora de Windows Media</comment>
+ <comment xml:lang="he">קובץ תחנה של Windows Media</comment>
+ <comment xml:lang="hu">Windows Media Station fájl</comment>
+ <comment xml:lang="id">Berkas Windows Media Station</comment>
+ <comment xml:lang="it">File Windows Media Station</comment>
+ <comment xml:lang="ja">Windows Media Station ファイル</comment>
+ <comment xml:lang="kk">Windows Media Station файлы</comment>
+ <comment xml:lang="ko">윈도우 미디어 방송국 파일</comment>
+ <comment xml:lang="lt">Windows Media Station failas</comment>
+ <comment xml:lang="lv">Windows Media Station fails</comment>
+ <comment xml:lang="nb">Windows Media Station-fil</comment>
+ <comment xml:lang="nl">Windows Media Station-bestand</comment>
+ <comment xml:lang="nn">Windows Media Station-fil</comment>
+ <comment xml:lang="pl">Plik Windows Media Station</comment>
+ <comment xml:lang="pt_BR">Arquivo de estação de mídia do Windows</comment>
+ <comment xml:lang="ro">Fișier Windows Media Station</comment>
+ <comment xml:lang="ru">файл Windows Media Station</comment>
+ <comment xml:lang="sk">Súbor Windows Media Station</comment>
+ <comment xml:lang="sl">Datoteka Windows Media Station</comment>
+ <comment xml:lang="sq">File Windows Media Station</comment>
+ <comment xml:lang="sv">Windows Media Station-fil</comment>
+ <comment xml:lang="uk">файл Windows Media Station</comment>
+ <comment xml:lang="vi">Tập tin Windows Media Station</comment>
+ <comment xml:lang="zh_CN">Windows 媒体工作站文件</comment>
+ <comment xml:lang="zh_TW">Windows Media Station 檔</comment>
+ <sub-class-of type="video/x-ms-asf"/>
+ <generic-icon name="video-x-generic"/>
+ <glob pattern="*.nsc"/>
+ <magic priority="50">
+ <match value="[Address]" type="string" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="video/x-ms-wmv">
+ <comment>Windows Media video</comment>
+ <comment xml:lang="ar">Windows Media مرئي</comment>
+ <comment xml:lang="be@latin">Videa Windows Media</comment>
+ <comment xml:lang="bg">Видео — Windows Media</comment>
+ <comment xml:lang="ca">vídeo Windows Media</comment>
+ <comment xml:lang="cs">Video Windows Media</comment>
+ <comment xml:lang="da">Windows Medie-video</comment>
+ <comment xml:lang="de">Windows-Media-Video</comment>
+ <comment xml:lang="es">vídeo de Windows Media</comment>
+ <comment xml:lang="eu">Windows Media bideoa</comment>
+ <comment xml:lang="fi">Windows Media -video</comment>
+ <comment xml:lang="fo">Windows Media video</comment>
+ <comment xml:lang="fr">vidéo Windows Media</comment>
+ <comment xml:lang="ga">físeán Windows Media</comment>
+ <comment xml:lang="gl">vídeo de Windows Media</comment>
+ <comment xml:lang="he">וידאו של Windows Media</comment>
+ <comment xml:lang="hu">Windows Media videó</comment>
+ <comment xml:lang="id">Video Windows Media</comment>
+ <comment xml:lang="it">Video Windows Media</comment>
+ <comment xml:lang="ja">Windows Media 動画</comment>
+ <comment xml:lang="kk">Windows Media видеосы</comment>
+ <comment xml:lang="ko">윈도우 미디어 비디오</comment>
+ <comment xml:lang="lt">Windows Media vaizdo įrašas</comment>
+ <comment xml:lang="lv">Windows Media video</comment>
+ <comment xml:lang="nb">Windows Media film</comment>
+ <comment xml:lang="nl">Windows Media-video</comment>
+ <comment xml:lang="nn">Windows Media-video</comment>
+ <comment xml:lang="pl">Plik wideo Windows Media</comment>
+ <comment xml:lang="pt_BR">Vídeo do Windows Media</comment>
+ <comment xml:lang="ro">Video Windows Media</comment>
+ <comment xml:lang="ru">видео Windows Media</comment>
+ <comment xml:lang="sk">Video Windows Media</comment>
+ <comment xml:lang="sl">Video datoteka Windows Media</comment>
+ <comment xml:lang="sq">Video Windows Media</comment>
+ <comment xml:lang="sv">Windows Media-video</comment>
+ <comment xml:lang="uk">відеокліп Windows Media</comment>
+ <comment xml:lang="vi">Ảnh động Windows Media</comment>
+ <comment xml:lang="zh_CN">Windows Media 视频</comment>
+ <comment xml:lang="zh_TW">Windows Media 視訊</comment>
+ <sub-class-of type="video/x-ms-asf"/>
+ <glob pattern="*.wmv"/>
+ </mime-type>
+ <mime-type type="video/x-msvideo">
+ <comment>AVI video</comment>
+ <comment xml:lang="ar">AVI مرئي</comment>
+ <comment xml:lang="az">AVI video faylı</comment>
+ <comment xml:lang="be@latin">Videa AVI</comment>
+ <comment xml:lang="bg">Видео — AVI</comment>
+ <comment xml:lang="ca">vídeo AVI</comment>
+ <comment xml:lang="cs">Video AVI</comment>
+ <comment xml:lang="cy">Fideo AVI</comment>
+ <comment xml:lang="da">AVI-video</comment>
+ <comment xml:lang="de">AVI-Video</comment>
+ <comment xml:lang="el">βίντεο AVI</comment>
+ <comment xml:lang="en_GB">AVI video</comment>
+ <comment xml:lang="eo">AVI-video</comment>
+ <comment xml:lang="es">vídeo AVI</comment>
+ <comment xml:lang="eu">AVI bideoa</comment>
+ <comment xml:lang="fi">AVI-video</comment>
+ <comment xml:lang="fo">AVI video</comment>
+ <comment xml:lang="fr">vidéo AVI</comment>
+ <comment xml:lang="ga">físeán AVI</comment>
+ <comment xml:lang="gl">vídeo AVI</comment>
+ <comment xml:lang="he">וידאו AVI</comment>
+ <comment xml:lang="hu">AVI-videó</comment>
+ <comment xml:lang="id">Video AVI</comment>
+ <comment xml:lang="it">Video AVI</comment>
+ <comment xml:lang="ja">AVI 動画</comment>
+ <comment xml:lang="kk">AVI видеосы</comment>
+ <comment xml:lang="ko">AVI 비디오</comment>
+ <comment xml:lang="lt">AVI vaizdo įrašas</comment>
+ <comment xml:lang="lv">AVI video</comment>
+ <comment xml:lang="ms">Video AVI</comment>
+ <comment xml:lang="nb">AVI-film</comment>
+ <comment xml:lang="nl">AVI-video</comment>
+ <comment xml:lang="nn">AVI-video</comment>
+ <comment xml:lang="pl">Plik wideo AVI</comment>
+ <comment xml:lang="pt">vídeo AVI</comment>
+ <comment xml:lang="pt_BR">Vídeo AVI</comment>
+ <comment xml:lang="ro">Video AVI</comment>
+ <comment xml:lang="ru">видео AVI</comment>
+ <comment xml:lang="sk">Video AVI</comment>
+ <comment xml:lang="sl">Video datoteka AVI</comment>
+ <comment xml:lang="sq">Video AVI</comment>
+ <comment xml:lang="sr">AVI видео</comment>
+ <comment xml:lang="sv">AVI-video</comment>
+ <comment xml:lang="uk">відеокліп AVI</comment>
+ <comment xml:lang="vi">Ảnh động AVI</comment>
+ <comment xml:lang="zh_CN">AVI 视频</comment>
+ <comment xml:lang="zh_TW">AVI 視訊</comment>
+ <acronym>AVI</acronym>
+ <expanded-acronym>Audio Video Interleave</expanded-acronym>
+ <alias type="video/x-avi"/>
+ <alias type="video/avi"/>
+ <alias type="video/divx"/>
+ <alias type="video/msvideo"/>
+ <alias type="video/vnd.divx"/>
+ <magic priority="50">
+ <match value="RIFF" type="string" offset="0">
+ <match value="AVI " type="string" offset="8"/>
+ </match>
+ </magic>
+ <glob pattern="*.avi"/>
+ <glob pattern="*.divx"/>
+ </mime-type>
+ <mime-type type="video/x-nsv">
+ <comment>NullSoft video</comment>
+ <comment xml:lang="ar">NullSoft مرئي</comment>
+ <comment xml:lang="be@latin">Videa NullSoft</comment>
+ <comment xml:lang="bg">Видео — NullSoft</comment>
+ <comment xml:lang="ca">vídeo NullSoft</comment>
+ <comment xml:lang="cs">Video NullSoft</comment>
+ <comment xml:lang="da">NullSoft-video</comment>
+ <comment xml:lang="de">NullSoft-Video</comment>
+ <comment xml:lang="eo">NullSoft-video</comment>
+ <comment xml:lang="es">vídeo NullSoft</comment>
+ <comment xml:lang="eu">NullSoft bideoa</comment>
+ <comment xml:lang="fi">NullSoft-video</comment>
+ <comment xml:lang="fo">NullSoft video</comment>
+ <comment xml:lang="fr">vidéo NullSoft</comment>
+ <comment xml:lang="ga">físeán NullSoft</comment>
+ <comment xml:lang="gl">vídeo de NullSoft</comment>
+ <comment xml:lang="he">וידאו של NullSot</comment>
+ <comment xml:lang="hu">NullSoft videó</comment>
+ <comment xml:lang="id">Video NullSoft</comment>
+ <comment xml:lang="it">Video NullSoft</comment>
+ <comment xml:lang="ja">NullSoft 動画</comment>
+ <comment xml:lang="kk">NullSoft видеосы</comment>
+ <comment xml:lang="ko">널소프트 비디오</comment>
+ <comment xml:lang="lt">NullSoft vaizdo įrašas</comment>
+ <comment xml:lang="lv">NullSoft video</comment>
+ <comment xml:lang="nb">Nullsoft-film</comment>
+ <comment xml:lang="nl">NullSoft-video</comment>
+ <comment xml:lang="nn">NullSoft-video</comment>
+ <comment xml:lang="pl">Plik wideo NullSoft</comment>
+ <comment xml:lang="pt_BR">Vídeo do Nullsoft</comment>
+ <comment xml:lang="ro">Video NullSoft</comment>
+ <comment xml:lang="ru">видео Nullsoft</comment>
+ <comment xml:lang="sk">Video NullSoft</comment>
+ <comment xml:lang="sl">Video datoteka NullSoft</comment>
+ <comment xml:lang="sq">Video NullSoft</comment>
+ <comment xml:lang="sv">NullSoft-video</comment>
+ <comment xml:lang="uk">відеокліп NullSoft</comment>
+ <comment xml:lang="vi">Ảnh động NullSoft</comment>
+ <comment xml:lang="zh_CN">Nullsoft 视频</comment>
+ <comment xml:lang="zh_TW">NullSoft 視訊</comment>
+ <magic priority="50">
+ <match value="NSVf" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.nsv"/>
+ </mime-type>
+ <mime-type type="application/sdp">
+ <comment>SDP multicast stream file</comment>
+ <comment xml:lang="ar">ملف دفق متعدد البث SDP</comment>
+ <comment xml:lang="be@latin">Šmatadrasny płynievy fajł SDP</comment>
+ <comment xml:lang="bg">Файл за поток — SDP multicast</comment>
+ <comment xml:lang="ca">fitxer de flux de multidifusió SDP</comment>
+ <comment xml:lang="cs">Soubor vícesměrového vysílání proudu SDP</comment>
+ <comment xml:lang="da">SDP multicast-strømfil</comment>
+ <comment xml:lang="de">SDP-Multicast-Datenstromdatei</comment>
+ <comment xml:lang="es">archivo de flujo multicast SDP</comment>
+ <comment xml:lang="eu">SDP multicast korrontearen fitxategia</comment>
+ <comment xml:lang="fi">SDP-monilähetysvirran tiedosto</comment>
+ <comment xml:lang="fo">SDP margvarpað streymafíla</comment>
+ <comment xml:lang="fr">fichier de flux multidiffusion SDP</comment>
+ <comment xml:lang="ga">comhad shruth ilchraolacháin SDP</comment>
+ <comment xml:lang="gl">ficheiro de fluxo multicast SDP</comment>
+ <comment xml:lang="he">קובץ שידור בזרימה SDP</comment>
+ <comment xml:lang="hu">SDP multicast műsorfájl</comment>
+ <comment xml:lang="id">Berkas SDP multicast stream</comment>
+ <comment xml:lang="it">File stream multicast SDP</comment>
+ <comment xml:lang="ja">SDP マルチキャストストリームファイル</comment>
+ <comment xml:lang="kk">SDP мультикаст ағым файлы</comment>
+ <comment xml:lang="ko">SDP 멀티캐스트 스트림 파일</comment>
+ <comment xml:lang="lt">SDP daugiaadresio srauto failas</comment>
+ <comment xml:lang="lv">SDP multiraides straumes fails</comment>
+ <comment xml:lang="nb">SDP-multicaststrøm</comment>
+ <comment xml:lang="nl">SDP-multicast-streambestand</comment>
+ <comment xml:lang="nn">SDP multicast straumfil</comment>
+ <comment xml:lang="pl">Plik strumienia multicast SDP</comment>
+ <comment xml:lang="pt_BR">Arquivo de canal multicast SDP</comment>
+ <comment xml:lang="ro">Fișier flux multicast SDP</comment>
+ <comment xml:lang="ru">файл мультикаст-потока SDP</comment>
+ <comment xml:lang="sk">Súbor viacsmerového vysielania prúdu SDP</comment>
+ <comment xml:lang="sl">Pretočni vir večsmernega oddajanja</comment>
+ <comment xml:lang="sq">File stream multicast SDP</comment>
+ <comment xml:lang="sv">SDP multicast stream-fil</comment>
+ <comment xml:lang="uk">файл потокової трансляції SDP</comment>
+ <comment xml:lang="vi">Tập tin luồng truyền một-nhiều SDP</comment>
+ <comment xml:lang="zh_CN">SDP 多播流文件</comment>
+ <acronym>SDP</acronym>
+ <expanded-acronym>Session Description Protocol</expanded-acronym>
+ <alias type="application/x-sdp"/>
+ <alias type="application/vnd.sdp"/>
+ <generic-icon name="video-x-generic"/>
+ <magic priority="50">
+ <match value="v=" type="string" offset="0">
+ <match value="s=" type="string" offset="0:256"/>
+ </match>
+ </magic>
+ <glob pattern="*.sdp"/>
+ </mime-type>
+ <mime-type type="video/x-sgi-movie">
+ <comment>SGI video</comment>
+ <comment xml:lang="ar">SGI مرئي</comment>
+ <comment xml:lang="az">SGI video faylı</comment>
+ <comment xml:lang="be@latin">Videa SGI</comment>
+ <comment xml:lang="bg">Видео — SGI</comment>
+ <comment xml:lang="ca">vídeo SGI</comment>
+ <comment xml:lang="cs">Video SGI</comment>
+ <comment xml:lang="cy">Video SGI</comment>
+ <comment xml:lang="da">SGI-video</comment>
+ <comment xml:lang="de">SGI-Video</comment>
+ <comment xml:lang="el">βίντεο SGI</comment>
+ <comment xml:lang="en_GB">SGI video</comment>
+ <comment xml:lang="eo">SGI-video</comment>
+ <comment xml:lang="es">vídeo SGI</comment>
+ <comment xml:lang="eu">SGI bideoa</comment>
+ <comment xml:lang="fi">SGI-video</comment>
+ <comment xml:lang="fo">SGI video</comment>
+ <comment xml:lang="fr">vidéo SGI</comment>
+ <comment xml:lang="ga">físeán SGI</comment>
+ <comment xml:lang="gl">vídeo SGI</comment>
+ <comment xml:lang="he">וידאו SGI</comment>
+ <comment xml:lang="hu">SGI-videó</comment>
+ <comment xml:lang="id">Video SGI</comment>
+ <comment xml:lang="it">Video SGI</comment>
+ <comment xml:lang="ja">SGI 動画</comment>
+ <comment xml:lang="kk">SGI видеосы</comment>
+ <comment xml:lang="ko">SGI 비디오</comment>
+ <comment xml:lang="lt">SGI vaizdo įrašas</comment>
+ <comment xml:lang="lv">SGI video</comment>
+ <comment xml:lang="ms">Video SGI</comment>
+ <comment xml:lang="nb">SGI-film</comment>
+ <comment xml:lang="nl">SGI-video</comment>
+ <comment xml:lang="nn">SGI-video</comment>
+ <comment xml:lang="pl">Plik wideo SGI</comment>
+ <comment xml:lang="pt">vídeo SGI</comment>
+ <comment xml:lang="pt_BR">Vídeo SGI</comment>
+ <comment xml:lang="ro">Video SGI</comment>
+ <comment xml:lang="ru">видео SGI</comment>
+ <comment xml:lang="sk">Video SGI</comment>
+ <comment xml:lang="sl">Video datoteka SGI</comment>
+ <comment xml:lang="sq">Video SGI</comment>
+ <comment xml:lang="sr">SGI видео</comment>
+ <comment xml:lang="sv">SGI-video</comment>
+ <comment xml:lang="uk">відеокліп SGI</comment>
+ <comment xml:lang="vi">Ảnh động SGI</comment>
+ <comment xml:lang="zh_CN">SGI 视频</comment>
+ <comment xml:lang="zh_TW">SGI 視訊</comment>
+ <magic priority="50">
+ <match value="MOVI" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.movie"/>
+ </mime-type>
+ <mime-type type="application/vnd.emusic-emusic_package">
+ <comment>eMusic download package</comment>
+ <comment xml:lang="ar">حزمة تنزيل eMusic</comment>
+ <comment xml:lang="be@latin">pakunak zahruzki eMusic</comment>
+ <comment xml:lang="bg">Пакет за сваляне — eMusic</comment>
+ <comment xml:lang="ca">paquet de descàrrega eMusic</comment>
+ <comment xml:lang="cs">Balíček stahování eMusic</comment>
+ <comment xml:lang="da">eMusic-hentpakke</comment>
+ <comment xml:lang="de">eMusic-Download-Paket</comment>
+ <comment xml:lang="es">paquete de descarga eMusic</comment>
+ <comment xml:lang="eu">eMusic deskargaren paketea</comment>
+ <comment xml:lang="fi">eMusic-imurointipaketti</comment>
+ <comment xml:lang="fo">eMusic niðurtøkupakki</comment>
+ <comment xml:lang="fr">paquet de téléchargement eMusic</comment>
+ <comment xml:lang="ga">pacáiste íosluchtú eMusic</comment>
+ <comment xml:lang="gl">paquete de descarga de eMusic</comment>
+ <comment xml:lang="he">חבילת הורדה של eMusic</comment>
+ <comment xml:lang="hu">eMusic letöltési csomag</comment>
+ <comment xml:lang="id">paket unduh eMusic</comment>
+ <comment xml:lang="it">Pacchetto scaricamento eMusic</comment>
+ <comment xml:lang="ja">eMusic ダウンロードパッケージ</comment>
+ <comment xml:lang="kk">eMusic жүктемелер дестесі</comment>
+ <comment xml:lang="ko">eMusic 다운로드 패키지</comment>
+ <comment xml:lang="lt">eMusic atsiuntimo paketas</comment>
+ <comment xml:lang="lv">eMusic lejupielādes paciņa</comment>
+ <comment xml:lang="nb">eMusic nedlastingspakke</comment>
+ <comment xml:lang="nl">eMusic-downloadpakket</comment>
+ <comment xml:lang="nn">eMusic nedlastingspakke</comment>
+ <comment xml:lang="pl">Pobieralny pakiet eMusic</comment>
+ <comment xml:lang="pt_BR">Pacote de download do eMusic</comment>
+ <comment xml:lang="ro">pachet descărcare eMusic</comment>
+ <comment xml:lang="ru">пакет загрузок eMusic</comment>
+ <comment xml:lang="sk">Balíček sťahovania eMusic</comment>
+ <comment xml:lang="sl">Datoteka paketa eMusic</comment>
+ <comment xml:lang="sq">Paketë shkarkimi eMusic</comment>
+ <comment xml:lang="sv">eMusic-hämtningspaket</comment>
+ <comment xml:lang="uk">пакунок завантаження eMusic</comment>
+ <comment xml:lang="vi">gói nhạc tải xuống eMusic</comment>
+ <comment xml:lang="zh_CN">eMusic 下载包</comment>
+ <comment xml:lang="zh_TW">eMusic 下載套件</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic priority="50">
+ <match value="nF7YLao" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.emp"/>
+ </mime-type>
+ <mime-type type="application/vnd.google-earth.kml+xml">
+ <comment>KML geographic data</comment>
+ <comment xml:lang="ar">بيانات جغرافية KML</comment>
+ <comment xml:lang="bg">Географски данни — KML</comment>
+ <comment xml:lang="ca">dades geogràfiques KML</comment>
+ <comment xml:lang="cs">Geografická data KML</comment>
+ <comment xml:lang="da">Geografiske data i KML-format</comment>
+ <comment xml:lang="de">KML geographische Daten</comment>
+ <comment xml:lang="es">datos geográficos KML</comment>
+ <comment xml:lang="eu">KML datu geografikoak</comment>
+ <comment xml:lang="fo">KML landafrøðilig dáta</comment>
+ <comment xml:lang="fr">données géographiques KML</comment>
+ <comment xml:lang="ga">sonraí geografacha KML</comment>
+ <comment xml:lang="gl">datos xeográficos KML</comment>
+ <comment xml:lang="he">מידע גאוגרפי KML</comment>
+ <comment xml:lang="hu">KML földrajzi adatok</comment>
+ <comment xml:lang="id">Data geografis KML</comment>
+ <comment xml:lang="it">Dati geografici KML</comment>
+ <comment xml:lang="ja">KML 地理データ</comment>
+ <comment xml:lang="kk">KML географилық ақпараты</comment>
+ <comment xml:lang="ko">KML 지리 정보 데이터</comment>
+ <comment xml:lang="lt">KML geografiniai duomenys</comment>
+ <comment xml:lang="lv">KML ģeogrāfiskie dati</comment>
+ <comment xml:lang="pl">Dane geograficzne KML</comment>
+ <comment xml:lang="ro">Date geografice KML</comment>
+ <comment xml:lang="ru">географические данные KML</comment>
+ <comment xml:lang="sk">Zemepisné údaje KML</comment>
+ <comment xml:lang="sl">Datoteka geografskih podatkov KML</comment>
+ <comment xml:lang="sv">KML geografisk data</comment>
+ <comment xml:lang="uk">географічні дані KML</comment>
+ <comment xml:lang="zh_CN">KML 地理数据</comment>
+ <comment xml:lang="zh_TW">KML 地理資料</comment>
+ <acronym>KML</acronym>
+ <expanded-acronym>Keyhole Markup Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.kml"/>
+ <root-XML namespaceURI="http://www.opengis.net/kml/2.2" localName="kml"/>
+ </mime-type>
+ <mime-type type="application/vnd.google-earth.kmz">
+ <comment>KML geographic compressed data</comment>
+ <comment xml:lang="ar">بيانات جغرافية مضغوطة KML</comment>
+ <comment xml:lang="bg">Географски данни — KML, компресирани</comment>
+ <comment xml:lang="ca">dades geogràfiques comprimides KML</comment>
+ <comment xml:lang="cs">Komprimovaná geografická data KML</comment>
+ <comment xml:lang="da">KML-geografiske komprimerede data</comment>
+ <comment xml:lang="de">KML geographische komprimierte Daten</comment>
+ <comment xml:lang="es">datos geográficos comprimidos KML</comment>
+ <comment xml:lang="eu">KML datu geografiko konprimituak</comment>
+ <comment xml:lang="fo">KML landafrøðilig stappað dáta</comment>
+ <comment xml:lang="fr">données géographiques KML compressées</comment>
+ <comment xml:lang="ga">sonraí comhbhrúite geografacha KML</comment>
+ <comment xml:lang="gl">datos xeográficos KML comprimidos </comment>
+ <comment xml:lang="he">מידע גאוגרפי דחוס KML</comment>
+ <comment xml:lang="hu">KML tömörített földrajzi adatok</comment>
+ <comment xml:lang="id">Data geografis KML terkompresi</comment>
+ <comment xml:lang="it">Dati geografici KML compressi</comment>
+ <comment xml:lang="ja">KML 地理圧縮データ</comment>
+ <comment xml:lang="kk">KML географиялық сығылған ақпарат</comment>
+ <comment xml:lang="ko">KML 지리 정보 압축 데이터</comment>
+ <comment xml:lang="lt">KML geografiniai suglaudinti duomenys</comment>
+ <comment xml:lang="lv">KML saspiesti ģeogrāfiskie dati</comment>
+ <comment xml:lang="pl">Skompresowane dane geograficzne KML</comment>
+ <comment xml:lang="ro">Date geografice comprimate KML</comment>
+ <comment xml:lang="ru">сжатые географические данные KML</comment>
+ <comment xml:lang="sk">Komprimované zemepisné údaje KML</comment>
+ <comment xml:lang="sl">Skrčeni geografski podatki KML</comment>
+ <comment xml:lang="sv">KML geografiskt komprimerat data</comment>
+ <comment xml:lang="uk">стиснуті географічні дані KML</comment>
+ <comment xml:lang="zh_CN">KML 压缩地理数据</comment>
+ <comment xml:lang="zh_TW">KML 地理壓縮資料</comment>
+ <acronym>KML</acronym>
+ <expanded-acronym>Keyhole Markup Language</expanded-acronym>
+ <sub-class-of type="application/zip"/>
+ <glob pattern="*.kmz"/>
+ </mime-type>
+ <mime-type type="application/x-ica">
+ <comment>Citrix ICA settings file</comment>
+ <comment xml:lang="ar">ملف إعدادات Citrix ICA</comment>
+ <comment xml:lang="be@latin">Fajł naładaŭ Citrix ICA</comment>
+ <comment xml:lang="bg">Настройки — Citrix ICA</comment>
+ <comment xml:lang="ca">fitxer de paràmetres de Citrix ICA</comment>
+ <comment xml:lang="cs">Soubor nastavení Citrix ICA</comment>
+ <comment xml:lang="da">Citrix ICA-opsætningsfil</comment>
+ <comment xml:lang="de">Citrix-ICA-Einstellungsdatei</comment>
+ <comment xml:lang="es">archivo de opciones de Citrix ICA</comment>
+ <comment xml:lang="eu">Citrix ICA ezarpenen fitxategia</comment>
+ <comment xml:lang="fi">Citrix ICA -asetustiedosto</comment>
+ <comment xml:lang="fo">Citrix ICA stillingarfíla</comment>
+ <comment xml:lang="fr">fichier de paramètres ICA Citrix</comment>
+ <comment xml:lang="ga">comhad socruithe Citrix ICA</comment>
+ <comment xml:lang="gl">ficheiro de configuracións de Citrix ICA</comment>
+ <comment xml:lang="he">קובץ הגדרות של Citrix ICA</comment>
+ <comment xml:lang="hu">Citrix ICA beállításfájl</comment>
+ <comment xml:lang="id">Berkas penataan Citrix ICA</comment>
+ <comment xml:lang="it">File impostazioni Citrix ICA</comment>
+ <comment xml:lang="ja">Citrix ICA 設定ファイル</comment>
+ <comment xml:lang="kk">Citrix ICA баптаулар файлы</comment>
+ <comment xml:lang="ko">시트릭스 ICA 설정 파일</comment>
+ <comment xml:lang="lt">Citrix ICA parametrų failas</comment>
+ <comment xml:lang="lv">Citrix ICA iestatījumu fails</comment>
+ <comment xml:lang="nb">Innstillingsfil for Citrix ICA</comment>
+ <comment xml:lang="nl">Citrix ICA-instellingen</comment>
+ <comment xml:lang="nn">Citrix ICA-innstillingsfil</comment>
+ <comment xml:lang="pl">Plik ustawień Citrix ICA</comment>
+ <comment xml:lang="pt_BR">Arquivo de configurações do Citrix ICA</comment>
+ <comment xml:lang="ro">Fișier de configurări Citrix ICA</comment>
+ <comment xml:lang="ru">файл настроек Citrix ICA</comment>
+ <comment xml:lang="sk">Súbor nastavení Citrix ICA</comment>
+ <comment xml:lang="sl">Nastavitvena datoteka Citrix ICA</comment>
+ <comment xml:lang="sq">File rregullimesh Citrix ICA</comment>
+ <comment xml:lang="sv">Citrix ICA-inställningsfil</comment>
+ <comment xml:lang="uk">файл параметрів ICA Citrix</comment>
+ <comment xml:lang="vi">Tập tin thiết lập ICA Citrix</comment>
+ <comment xml:lang="zh_CN">Citrix ICA 设置文件</comment>
+ <comment xml:lang="zh_TW">Citrix ICA 設定值檔案</comment>
+ <acronym>ICA</acronym>
+ <expanded-acronym>Independent Computing Architecture</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.ica"/>
+ </mime-type>
+ <mime-type type="application/vnd.mozilla.xul+xml">
+ <comment>XUL interface document</comment>
+ <comment xml:lang="ar">مستند واجهة XUL</comment>
+ <comment xml:lang="be@latin">Interfejsny dakument XUL</comment>
+ <comment xml:lang="bg">Документ — интерфейс за XUL</comment>
+ <comment xml:lang="ca">document d'interfície XUL</comment>
+ <comment xml:lang="cs">Dokument rozhraní XUL</comment>
+ <comment xml:lang="da">XUL-grænsefladedokument</comment>
+ <comment xml:lang="de">XUL-Oberflächendokument</comment>
+ <comment xml:lang="es">documento de interfaz XUL</comment>
+ <comment xml:lang="eu">XUL interfazearen dokumentua</comment>
+ <comment xml:lang="fi">XUL-käyttöliittymäasiakirja</comment>
+ <comment xml:lang="fo">XUL markamótsskjal</comment>
+ <comment xml:lang="fr">document d'interface XUL</comment>
+ <comment xml:lang="ga">cáipéis chomhéadan XUL</comment>
+ <comment xml:lang="gl">documento de interface XUL</comment>
+ <comment xml:lang="he">מסמך ממשק XUL</comment>
+ <comment xml:lang="hu">XUL-felületdokumentum</comment>
+ <comment xml:lang="id">Dokumen antarmuka XUL</comment>
+ <comment xml:lang="it">Documento interfaccia XUL</comment>
+ <comment xml:lang="ja">XUL インターフェイスドキュメント</comment>
+ <comment xml:lang="kk">XUL интерфейс құжаты</comment>
+ <comment xml:lang="ko">XUL 인터페이스 문서</comment>
+ <comment xml:lang="lt">XUL sąsajos dokumentas</comment>
+ <comment xml:lang="lv">XUL saskarnes dokuments</comment>
+ <comment xml:lang="nb">XUL-grensesnittdokument</comment>
+ <comment xml:lang="nl">XUL-interface-document</comment>
+ <comment xml:lang="nn">XUL-grensesnitt-dokument</comment>
+ <comment xml:lang="pl">Dokument interfejsu XUL</comment>
+ <comment xml:lang="pt_BR">Documento de interface XUL</comment>
+ <comment xml:lang="ro">Document interfață XUL</comment>
+ <comment xml:lang="ru">документ интерфейса XUL</comment>
+ <comment xml:lang="sk">Dokument rozhrania XUL</comment>
+ <comment xml:lang="sl">Dokument vmesnika XUL</comment>
+ <comment xml:lang="sq">Dokument interfaqe XUL</comment>
+ <comment xml:lang="sv">XUL-gränssnittsdokument</comment>
+ <comment xml:lang="uk">документ інтерфейсу XUL</comment>
+ <comment xml:lang="vi">Tài liệu giao diện XUL</comment>
+ <comment xml:lang="zh_CN">XUL 界面文档</comment>
+ <comment xml:lang="zh_TW">XUL 介面文件</comment>
+ <acronym>XUL</acronym>
+ <expanded-acronym>XML User interface markup Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="x-office-document"/>
+ <root-XML namespaceURI="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" localName="window"/>
+ <glob pattern="*.xul"/>
+ </mime-type>
+ <mime-type type="application/x-xpinstall">
+ <comment>XPInstall installer module</comment>
+ <comment xml:lang="ar">وحدة مثبت XPInstall </comment>
+ <comment xml:lang="bg">Пакет — инсталация XPInstall</comment>
+ <comment xml:lang="ca">mòdul instal·lador d'XPinstall</comment>
+ <comment xml:lang="cs">Modul instalátoru XPInstall</comment>
+ <comment xml:lang="da">XPInstall-installationsmodul</comment>
+ <comment xml:lang="de">XPInstall-Installermodul</comment>
+ <comment xml:lang="es">módulo del instalador XPInstall</comment>
+ <comment xml:lang="eu">XPInstall instalatzailearen modulua</comment>
+ <comment xml:lang="fi">XPInstall-asennuspaketti</comment>
+ <comment xml:lang="fo">XPInstall innleggjaramótul</comment>
+ <comment xml:lang="fr">module d'installation XPInstall</comment>
+ <comment xml:lang="ga">modúl suiteála XPInstall</comment>
+ <comment xml:lang="gl">Módulo do instalador XPInstall</comment>
+ <comment xml:lang="he">מודול התקנה של XPInstall</comment>
+ <comment xml:lang="hu">XPInstall telepítőmodul</comment>
+ <comment xml:lang="id">Modul installer XPInstall</comment>
+ <comment xml:lang="it">Modulo installatore XPInstall</comment>
+ <comment xml:lang="ja">XPInstall インストーラモジュール</comment>
+ <comment xml:lang="kk">XPInstall орнату модулі</comment>
+ <comment xml:lang="ko">XPInstall 설치 프로그램 모듈</comment>
+ <comment xml:lang="lt">XPInstall įdiegiklio modulis</comment>
+ <comment xml:lang="lv">XPInstall instalatora modulis</comment>
+ <comment xml:lang="pl">Moduł instalatora XPInstall</comment>
+ <comment xml:lang="ro">Modul de instalare XPInstall</comment>
+ <comment xml:lang="ru">модуль установщика XPInstall</comment>
+ <comment xml:lang="sk">Modul inštalátora XPInstall</comment>
+ <comment xml:lang="sl">modul namestilnika XPInstall</comment>
+ <comment xml:lang="sv">XPInstall-installeringsmodul</comment>
+ <comment xml:lang="uk">модуль засобу встановлення XPInstall</comment>
+ <comment xml:lang="zh_CN">XPInstall 安装工具模块</comment>
+ <comment xml:lang="zh_TW">XPInstall 安裝程式模組</comment>
+ <sub-class-of type="application/zip"/>
+ <glob pattern="*.xpi"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.document">
+ <comment>Word 2007 document</comment>
+ <comment xml:lang="ar">مستند Word 2007</comment>
+ <comment xml:lang="bg">Документ — Word 2007</comment>
+ <comment xml:lang="ca">document de Word 2007</comment>
+ <comment xml:lang="cs">Dokument Word 2007</comment>
+ <comment xml:lang="da">Word 2007-dokument</comment>
+ <comment xml:lang="de">Word-2007-Dokument</comment>
+ <comment xml:lang="es">documento de Word 2007</comment>
+ <comment xml:lang="eu">Word 2007 dokumentua</comment>
+ <comment xml:lang="fi">Word 2007 -asiakirja</comment>
+ <comment xml:lang="fo">Word 2007 skjal</comment>
+ <comment xml:lang="fr">document Word 2007</comment>
+ <comment xml:lang="ga">cáipéis Word 2007</comment>
+ <comment xml:lang="gl">documento de Word 2007</comment>
+ <comment xml:lang="he">מסמך Word 2007</comment>
+ <comment xml:lang="hu">Word 2007 dokumentum</comment>
+ <comment xml:lang="id">Dokumen Word 2007</comment>
+ <comment xml:lang="it">Documento Word 2007</comment>
+ <comment xml:lang="ja">Word 2007 ドキュメント</comment>
+ <comment xml:lang="kk">Word 2007 құжаты</comment>
+ <comment xml:lang="ko">워드 2007 문서</comment>
+ <comment xml:lang="lt">Word 2007 dokumentas</comment>
+ <comment xml:lang="lv">Word 2007 dokuments</comment>
+ <comment xml:lang="nl">Word 2007-document</comment>
+ <comment xml:lang="pl">Dokument Word 2007</comment>
+ <comment xml:lang="pt_BR">Documento do Word 2007</comment>
+ <comment xml:lang="ro">Document Word 2007</comment>
+ <comment xml:lang="ru">документ Word 2007</comment>
+ <comment xml:lang="sk">Dokument Word 2007</comment>
+ <comment xml:lang="sl">Dokument Word 2007</comment>
+ <comment xml:lang="sv">Word 2007-dokument</comment>
+ <comment xml:lang="uk">документ Word 2007</comment>
+ <comment xml:lang="vi">Tài liệu Word 2007</comment>
+ <comment xml:lang="zh_CN">Microsoft Word 2007 文档</comment>
+ <comment xml:lang="zh_TW">Word 2007 文件</comment>
+ <glob pattern="*.docx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.template">
+ <comment>Word 2007 document template</comment>
+ <comment xml:lang="bg">Шаблон за документи — Word 2007</comment>
+ <comment xml:lang="ca">plantilla de document de Word 2007</comment>
+ <comment xml:lang="cs">Šablona dokumentu Word 2007</comment>
+ <comment xml:lang="de">Word 2007-Dokumentvorlage</comment>
+ <comment xml:lang="es">Plantilla de documento de Word 2007</comment>
+ <comment xml:lang="fi">Word 2007 -asiakirjamalli</comment>
+ <comment xml:lang="fr">modèle de document Word 2007</comment>
+ <comment xml:lang="gl">Plantilla de documento de Word 2007</comment>
+ <comment xml:lang="he">תבנית מסמך של Word 2007</comment>
+ <comment xml:lang="hu">Word 2007 dokumentumsablon</comment>
+ <comment xml:lang="id">Templat dokumen Word 2007</comment>
+ <comment xml:lang="it">Modello documento Word 2007</comment>
+ <comment xml:lang="ja">Word 2007 文書テンプレート</comment>
+ <comment xml:lang="kk">Word 2007 құжатының үлгісі</comment>
+ <comment xml:lang="ko">워드 2007 문서 서식</comment>
+ <comment xml:lang="lv">Word 2007 dokumenta veidne</comment>
+ <comment xml:lang="pl">Szablon dokumentu Word 2007</comment>
+ <comment xml:lang="ru">шаблон документа Word 2007</comment>
+ <comment xml:lang="sl">Predloga dokumenta Word 2007</comment>
+ <comment xml:lang="sv">Word 2007-dokumentmall</comment>
+ <comment xml:lang="uk">шаблон документа Word 2007</comment>
+ <comment xml:lang="zh_TW">Word 2007 文件範本</comment>
+ <glob pattern="*.dotx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.presentation">
+ <comment>PowerPoint 2007 presentation</comment>
+ <comment xml:lang="ar">عرض تقديمي PowerPoint 2007</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint 2007</comment>
+ <comment xml:lang="ca">presentació de PowerPoint 2007</comment>
+ <comment xml:lang="cs">Prezentace PowerPoint 2007</comment>
+ <comment xml:lang="da">PowerPoint 2007-præsentation</comment>
+ <comment xml:lang="de">PowerPoint-2007-Präsentation</comment>
+ <comment xml:lang="es">presentación de PowerPoint 2007</comment>
+ <comment xml:lang="eu">PowerPoint 2007 aurkezpena</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -esitys</comment>
+ <comment xml:lang="fo">PowerPoint 2007 framløga</comment>
+ <comment xml:lang="fr">présentation PowerPoint 2007</comment>
+ <comment xml:lang="ga">láithreoireacht PowerPoint 2007</comment>
+ <comment xml:lang="gl">presentación de PowerPoint 2007</comment>
+ <comment xml:lang="he">מצגת של PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 prezentáció</comment>
+ <comment xml:lang="id">Presentasi PowerPoint 2007</comment>
+ <comment xml:lang="it">Presentazione standard PowerPoint 2007</comment>
+ <comment xml:lang="ja">PowerPoint 2007 プレゼンテーション</comment>
+ <comment xml:lang="kk">PowerPoint 2007 презентациясы</comment>
+ <comment xml:lang="ko">파워포인트 2007 프리젠테이션</comment>
+ <comment xml:lang="lt">PowerPoint 2007 pateiktis</comment>
+ <comment xml:lang="lv">PowerPoint 2007 prezentācija</comment>
+ <comment xml:lang="nl">PowerPoint 2007-presentatie</comment>
+ <comment xml:lang="pl">Prezentacja PowerPoint 2007</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint 2007</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint 2007</comment>
+ <comment xml:lang="ru">презентация PowerPoint 2007</comment>
+ <comment xml:lang="sk">Prezentácia PowerPoint 2007</comment>
+ <comment xml:lang="sl">Predstavitev Microsoft PowerPoint 2007</comment>
+ <comment xml:lang="sv">PowerPoint 2007-presentation</comment>
+ <comment xml:lang="uk">презентація PowerPoint 2007</comment>
+ <comment xml:lang="vi">Trình diễn PowerPoint 2007</comment>
+ <comment xml:lang="zh_CN">Microsoft PowerPoint 2007 演示文稿</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 簡報</comment>
+ <glob pattern="*.pptx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slide">
+ <comment>PowerPoint 2007 slide</comment>
+ <comment xml:lang="bg">Кадър — PoerPoint 2007</comment>
+ <comment xml:lang="ca">dispositiva de PowerPoint 2007</comment>
+ <comment xml:lang="cs">Snímek PowerPoint 2007</comment>
+ <comment xml:lang="de">PowerPoint 2007-Folie</comment>
+ <comment xml:lang="es">Diapositiva de PowerPoint 2007</comment>
+ <comment xml:lang="fr">diapositive PowerPoint 2007</comment>
+ <comment xml:lang="gl">Diaporama de PowerPoint 2007</comment>
+ <comment xml:lang="he">שקופית של PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 dia</comment>
+ <comment xml:lang="id">Slide PowerPoint 2007</comment>
+ <comment xml:lang="it">Diapositiva PowerPoint 2007</comment>
+ <comment xml:lang="ja">PowerPoint 2007 スライド</comment>
+ <comment xml:lang="kk">PowerPoint 2007 слайды</comment>
+ <comment xml:lang="ko">파워포인트 2007 슬라이드</comment>
+ <comment xml:lang="lv">PowerPoint 2007 slaids</comment>
+ <comment xml:lang="pl">Slajd PowerPoint 2007</comment>
+ <comment xml:lang="ru">слайд PowerPoint 2007</comment>
+ <comment xml:lang="sl">Prosojnica PowerPoint 2007</comment>
+ <comment xml:lang="uk">слайд PowerPoint 2007</comment>
+ <comment xml:lang="zh_CN">PowerPoint 2007 文稿</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 投影片</comment>
+ <glob pattern="*.sldx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slideshow">
+ <comment>PowerPoint 2007 show</comment>
+ <comment xml:lang="ar">عرض PowerPoint 2007</comment>
+ <comment xml:lang="bg">Презентация-шоу — PowerPoint 2007</comment>
+ <comment xml:lang="ca">exposició de PowerPoint 2007</comment>
+ <comment xml:lang="cs">Prezentace PowerPoint 2007</comment>
+ <comment xml:lang="da">PowerPoint 2007-dias</comment>
+ <comment xml:lang="de">PowerPoint-2007-Präsentation</comment>
+ <comment xml:lang="es">exposición de PowerPoint 2007</comment>
+ <comment xml:lang="eu">PowerPoint 2007 ikuskizuna</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -diaesitys</comment>
+ <comment xml:lang="fo">PowerPoint 2007 framsýning</comment>
+ <comment xml:lang="fr">diaporama PowerPoint 2007</comment>
+ <comment xml:lang="ga">taispeántas PowerPoint 2007</comment>
+ <comment xml:lang="gl">Exposición de PowerPoint 2007</comment>
+ <comment xml:lang="he">תצוגה של PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 bemutató</comment>
+ <comment xml:lang="id">Presentasi PowerPoint 2007</comment>
+ <comment xml:lang="it">Solo presentazione PowerPoint 2007</comment>
+ <comment xml:lang="ja">PowerPoint 2007 プレゼンテーション</comment>
+ <comment xml:lang="kk">PowerPoint 2007 көрсетілімі</comment>
+ <comment xml:lang="ko">파워포인트 2007 쇼</comment>
+ <comment xml:lang="lt">PowerPoint 2007 pateiktis</comment>
+ <comment xml:lang="lv">PowerPoint 2007 slīdrāde</comment>
+ <comment xml:lang="pl">Pokaz PowerPoint 2007</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint 2007</comment>
+ <comment xml:lang="ru">презентация PowerPoint 2007</comment>
+ <comment xml:lang="sk">Ukážka PowerPoint 2007</comment>
+ <comment xml:lang="sl">Zagonska predstavitev PowerPoint 2007</comment>
+ <comment xml:lang="sv">PowerPoint 2007-visning</comment>
+ <comment xml:lang="uk">показ слайдів PowerPoint 2007</comment>
+ <comment xml:lang="zh_CN">Microsoft PowerPoint 2007 演示文稿</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 展示</comment>
+ <glob pattern="*.ppsx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.template">
+ <comment>PowerPoint 2007 presentation template</comment>
+ <comment xml:lang="bg">Шаблон за презентации — PowerPoint 2007</comment>
+ <comment xml:lang="ca">plantilla de presentació de PowerPoint 2007</comment>
+ <comment xml:lang="cs">Šablona prezentace PowerPoint 2007</comment>
+ <comment xml:lang="de">PowerPoint 2007-Präsentationsvorlage</comment>
+ <comment xml:lang="es">Plantilla de presentación de PowerPoint 2007</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -esitysmalli</comment>
+ <comment xml:lang="fr">modèle de présentation PowerPoint 2007</comment>
+ <comment xml:lang="gl">modelo de presentación de PowerPoint 2007</comment>
+ <comment xml:lang="he">תבנית למצגת של PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 bemutatósablon</comment>
+ <comment xml:lang="id">Templat presentasi PowerPoint 2007</comment>
+ <comment xml:lang="it">Modello presentazione PowerPoint 2007</comment>
+ <comment xml:lang="ja">PowerPoint 2007 プレゼンテーションテンプレート</comment>
+ <comment xml:lang="kk">PowerPoint 2007 презентация шаблоны</comment>
+ <comment xml:lang="ko">파워포인트 2007 프리젠테이션 서식</comment>
+ <comment xml:lang="lv">PowerPoint 2007 prezentācijas veidne</comment>
+ <comment xml:lang="pl">Szablon prezentacji PowerPoint 2007</comment>
+ <comment xml:lang="ru">шаблон презентации PowerPoint 2007</comment>
+ <comment xml:lang="sl">Predloga predstavitve PowerPoint 2007</comment>
+ <comment xml:lang="sv">PowerPoint 2007-presentationsmall</comment>
+ <comment xml:lang="uk">шаблон презентації PowerPoint 2007</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 簡報範本</comment>
+ <glob pattern="*.potx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-presentation"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
+ <comment>Excel 2007 spreadsheet</comment>
+ <comment xml:lang="ar">جدول Excel 2007</comment>
+ <comment xml:lang="bg">Таблица — Excel 2007</comment>
+ <comment xml:lang="ca">full de càlcul d'Excel 2007</comment>
+ <comment xml:lang="cs">Sešit Excel 2007</comment>
+ <comment xml:lang="da">Excel 2007-regneark</comment>
+ <comment xml:lang="de">Excel-2007-Tabelle</comment>
+ <comment xml:lang="es">hoja de cálculo de Excel 2007</comment>
+ <comment xml:lang="eu">Excel 2007 kalkulu-orria</comment>
+ <comment xml:lang="fi">Excel 2007 -taulukko</comment>
+ <comment xml:lang="fo">Excel 2007 rokniark</comment>
+ <comment xml:lang="fr">feuille de calcul Excel 2007</comment>
+ <comment xml:lang="ga">scarbhileog Excel 2007</comment>
+ <comment xml:lang="gl">folla de cálculo de Excel 2007</comment>
+ <comment xml:lang="he">גליון נתונים של אקסל 2007</comment>
+ <comment xml:lang="hu">Excel 2007 táblázat</comment>
+ <comment xml:lang="id">Lembar sebar Excel 2007</comment>
+ <comment xml:lang="it">Foglio di calcolo Excel 2007</comment>
+ <comment xml:lang="ja">Excel 2007 スプレッドシート</comment>
+ <comment xml:lang="kk">Excel 2007 электрондық кестесі</comment>
+ <comment xml:lang="ko">엑셀 2007 스프레드시트</comment>
+ <comment xml:lang="lt">Excel 2007 skaičialentė</comment>
+ <comment xml:lang="lv">Excel 2007 izklājlapa</comment>
+ <comment xml:lang="nl">Excel 2007-rekenblad</comment>
+ <comment xml:lang="pl">Arkusz Excel 2007</comment>
+ <comment xml:lang="pt_BR">Planilha do Excel 2007</comment>
+ <comment xml:lang="ro">Foaie de calcul Excel 2007</comment>
+ <comment xml:lang="ru">электронная таблица Excel 2007</comment>
+ <comment xml:lang="sk">Zošit Excel 2007</comment>
+ <comment xml:lang="sl">Razpredelnica Microsoft Excel 2007</comment>
+ <comment xml:lang="sv">Excel 2007-kalkylblad</comment>
+ <comment xml:lang="uk">ел. таблиця Excel 2007</comment>
+ <comment xml:lang="vi">Bảng tính Excel 2007</comment>
+ <comment xml:lang="zh_CN">Microsoft Excel 2007 工作簿</comment>
+ <comment xml:lang="zh_TW">Excel 2007 試算表</comment>
+ <glob pattern="*.xlsx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ </mime-type>
+ <mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.template">
+ <comment>Excel 2007 spreadsheet template</comment>
+ <comment xml:lang="bg">Шаблон за таблици — Excel 2007</comment>
+ <comment xml:lang="ca">plantilla de full de càlcul d'Excel 2007</comment>
+ <comment xml:lang="cs">Šablona sešitu Excel 2007</comment>
+ <comment xml:lang="de">Excel 2007-Datenblattvorlage</comment>
+ <comment xml:lang="es">Plantilla de hoja de cálculo Excel 2007</comment>
+ <comment xml:lang="fi">Excel 2007 -taulukkomalli</comment>
+ <comment xml:lang="fr">modèle de feuille de calcul Excel 2007</comment>
+ <comment xml:lang="gl">modelo de folla de cálculo Excel 2007</comment>
+ <comment xml:lang="he">תבנית של גיליון נתונים של Excel 2007</comment>
+ <comment xml:lang="hu">Excel 2007 táblázatsablon</comment>
+ <comment xml:lang="id">Templat lembar kerja Excel 2007</comment>
+ <comment xml:lang="it">Modello foglio di calcolo Excel 2007</comment>
+ <comment xml:lang="ja">Excel 2007 スプレッドシートテンプレート</comment>
+ <comment xml:lang="kk">Excel 2007 кесте шаблоны</comment>
+ <comment xml:lang="ko">엑셀 2007 스프레드쉬트 </comment>
+ <comment xml:lang="lv">Excel 2007 izklājlapas veidne</comment>
+ <comment xml:lang="pl">Szablon arkusza Excel 2007</comment>
+ <comment xml:lang="ru">шаблон электронной таблицы Excel 2007</comment>
+ <comment xml:lang="sl">Predloga razpredelnice Excel 2007</comment>
+ <comment xml:lang="sv">Excel 2007-kalkylarksmall</comment>
+ <comment xml:lang="uk">шаблон електронної таблиці Excel 2007</comment>
+ <comment xml:lang="zh_TW">Excel 2007 試算表範本</comment>
+ <glob pattern="*.xltx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ </mime-type>
+ <mime-type type="application/x-t602">
+ <comment>T602 document</comment>
+ <comment xml:lang="ar">مستند T602</comment>
+ <comment xml:lang="be@latin">Dakument T602</comment>
+ <comment xml:lang="bg">Документ — T602</comment>
+ <comment xml:lang="ca">document T602</comment>
+ <comment xml:lang="cs">Dokument T602</comment>
+ <comment xml:lang="da">T602-dokument</comment>
+ <comment xml:lang="de">T602-Dokument</comment>
+ <comment xml:lang="eo">T602-dokumento</comment>
+ <comment xml:lang="es">documento T602</comment>
+ <comment xml:lang="eu">T602 dokumentua</comment>
+ <comment xml:lang="fi">T602-asiakirja</comment>
+ <comment xml:lang="fo">T602 skjal</comment>
+ <comment xml:lang="fr">document T602</comment>
+ <comment xml:lang="ga">cáipéis T602</comment>
+ <comment xml:lang="gl">documento T602</comment>
+ <comment xml:lang="he">מסמך T602</comment>
+ <comment xml:lang="hu">T602 dokumentum</comment>
+ <comment xml:lang="id">Dokumen T602</comment>
+ <comment xml:lang="it">Documento T602</comment>
+ <comment xml:lang="ja">T602 ドキュメント</comment>
+ <comment xml:lang="kk">T602 құжаты</comment>
+ <comment xml:lang="ko">T602 문서</comment>
+ <comment xml:lang="lt">T602 dokumentas</comment>
+ <comment xml:lang="lv">T602 dokuments</comment>
+ <comment xml:lang="nb">T602-dokument</comment>
+ <comment xml:lang="nl">T602-document</comment>
+ <comment xml:lang="nn">T602-dokument</comment>
+ <comment xml:lang="pl">Dokument T602</comment>
+ <comment xml:lang="pt_BR">Documento T602</comment>
+ <comment xml:lang="ro">Document T602</comment>
+ <comment xml:lang="ru">документ T602</comment>
+ <comment xml:lang="sk">Dokument T602</comment>
+ <comment xml:lang="sl">Dokument T602</comment>
+ <comment xml:lang="sq">Dokument T602</comment>
+ <comment xml:lang="sv">T602-dokument</comment>
+ <comment xml:lang="uk">документ T602</comment>
+ <comment xml:lang="vi">Tài liệu T602</comment>
+ <comment xml:lang="zh_CN">T602 文档</comment>
+ <comment xml:lang="zh_TW">T602 文件</comment>
+ <generic-icon name="x-office-document"/>
+ <magic priority="50">
+ <match value="@CT 0" type="string" offset="0"/>
+ <match value="@CT 1" type="string" offset="0"/>
+ <match value="@CT 2" type="string" offset="0"/>
+ </magic>
+ <glob pattern="*.602"/>
+ </mime-type>
+ <mime-type type="application/x-cisco-vpn-settings">
+ <comment>Cisco VPN Settings</comment>
+ <comment xml:lang="ar">إعدادات Cisco VPN</comment>
+ <comment xml:lang="be@latin">Nałady Cisco VPN</comment>
+ <comment xml:lang="bg">Настройки — ВЧМ на Cisco</comment>
+ <comment xml:lang="ca">paràmetres VPN de Cisco</comment>
+ <comment xml:lang="cs">Nastavení Cisco VPN</comment>
+ <comment xml:lang="da">Cisco VPN-opsætning</comment>
+ <comment xml:lang="de">Cisco-VPN-Einstellungen</comment>
+ <comment xml:lang="es">configuración VPN de Cisco</comment>
+ <comment xml:lang="eu">Cisco VPN ezarpenak</comment>
+ <comment xml:lang="fi">Cisco VPN -asetukset</comment>
+ <comment xml:lang="fo">Cisco VPN stillingar</comment>
+ <comment xml:lang="fr">paramètres VPN Cisco</comment>
+ <comment xml:lang="ga">socruithe VPN Cisco</comment>
+ <comment xml:lang="gl">configuracións de VPN de Cisco</comment>
+ <comment xml:lang="he">הגדרות של Cisco VPN</comment>
+ <comment xml:lang="hu">Cisco VPN beállítások</comment>
+ <comment xml:lang="id">Penataan Cisco VPN</comment>
+ <comment xml:lang="it">Impostazioni VPN Cisco</comment>
+ <comment xml:lang="ja">Cisco VPN 設定</comment>
+ <comment xml:lang="kk">Cisco VPN баптаулары</comment>
+ <comment xml:lang="ko">Cisco VPN 설정</comment>
+ <comment xml:lang="lt">Cisco VPN parametrai</comment>
+ <comment xml:lang="lv">Cisco VPN iestatījumi</comment>
+ <comment xml:lang="nb">Cisco VPN-innstillinger</comment>
+ <comment xml:lang="nl">Cisco VPN-instellingen</comment>
+ <comment xml:lang="nn">Cisco VPN-innstillingar</comment>
+ <comment xml:lang="pl">Ustawienia VPN Cisco</comment>
+ <comment xml:lang="pt_BR">Configurações de VPN da Cisco</comment>
+ <comment xml:lang="ro">Configurări VPN Cisco</comment>
+ <comment xml:lang="ru">файл настроек Cisco VPN</comment>
+ <comment xml:lang="sk">Nastavenia Cisco VPN</comment>
+ <comment xml:lang="sl">Datoteka nastavitev Cisco VPN</comment>
+ <comment xml:lang="sq">Rregullime VPN Cisco</comment>
+ <comment xml:lang="sv">Cisco VPN-inställningar</comment>
+ <comment xml:lang="uk">параметри VPN Cisco</comment>
+ <comment xml:lang="vi">Thiết lập VPN Cisco</comment>
+ <comment xml:lang="zh_CN">Cisco VPN 设置</comment>
+ <comment xml:lang="zh_TW">Cisco VPN 設定值</comment>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="50">
+ <match value="[main]" type="string" offset="0">
+ <match value="AuthType=" type="string" offset="0:256"/>
+ </match>
+ </magic>
+ <glob pattern="*.pcf"/>
+ </mime-type>
+ <mime-type type="application/vnd.iccprofile">
+ <comment>ICC profile</comment>
+ <comment xml:lang="ar">تشكيلة OCL</comment>
+ <comment xml:lang="bg">Цветови профил — OCL</comment>
+ <comment xml:lang="ca">perfil ICC</comment>
+ <comment xml:lang="cs">Profil ICC</comment>
+ <comment xml:lang="da">ICC-profil</comment>
+ <comment xml:lang="de">ICC-Profil</comment>
+ <comment xml:lang="eo">ICC-profilo</comment>
+ <comment xml:lang="es">perfil ICC</comment>
+ <comment xml:lang="eu">ICC profila</comment>
+ <comment xml:lang="fi">ICC-profiili</comment>
+ <comment xml:lang="fo">ICC umhvarv</comment>
+ <comment xml:lang="fr">profil ICC</comment>
+ <comment xml:lang="ga">próifíl ICC</comment>
+ <comment xml:lang="gl">perfíl ICC</comment>
+ <comment xml:lang="he">פרופיל ICC</comment>
+ <comment xml:lang="hu">ICC profil</comment>
+ <comment xml:lang="id">Profil ICC</comment>
+ <comment xml:lang="it">Profilo ICC</comment>
+ <comment xml:lang="ja">ICC プロファイル</comment>
+ <comment xml:lang="kk">ICC профайлы</comment>
+ <comment xml:lang="ko">ICC 프로파일</comment>
+ <comment xml:lang="lt">ICC profilis</comment>
+ <comment xml:lang="lv">ICC profils</comment>
+ <comment xml:lang="pl">Profil ICC</comment>
+ <comment xml:lang="ro">Profil ICC</comment>
+ <comment xml:lang="ru">профиль ICC</comment>
+ <comment xml:lang="sk">Profil farieb ICC</comment>
+ <comment xml:lang="sl">Datoteka profila ICC</comment>
+ <comment xml:lang="sv">ICC-profil</comment>
+ <comment xml:lang="uk">профіль ICC</comment>
+ <comment xml:lang="zh_CN">ICC 文件</comment>
+ <comment xml:lang="zh_TW">ICC 設定檔</comment>
+ <magic priority="50">
+ <match value="acsp" type="string" offset="36"/>
+ </magic>
+ <glob pattern="*.icc"/>
+ <glob pattern="*.icm"/>
+ </mime-type>
+ <mime-type type="application/x-it87">
+ <comment>IT 8.7 color calibration file</comment>
+ <comment xml:lang="ar">ملف ضبط ألوان IT 8.7</comment>
+ <comment xml:lang="bg">Файл за цветово калибриране — IT 8.7</comment>
+ <comment xml:lang="ca">fitxer de calibratge de color IT 8.7</comment>
+ <comment xml:lang="cs">Soubor kalibrace barev IT 8.7</comment>
+ <comment xml:lang="da">IT 8.7 farvekalibreringsfil</comment>
+ <comment xml:lang="de">IT 8.7 Farbkalibrierungsdatei</comment>
+ <comment xml:lang="es">archivo de calibración de color IT 8.7</comment>
+ <comment xml:lang="eu">IT 8.7 kolore-kalibrazioaren fitxategia</comment>
+ <comment xml:lang="fi">IT 8.7 -värikalibrointitiedosto</comment>
+ <comment xml:lang="fo">IT 8.7 litstillingarfíla</comment>
+ <comment xml:lang="fr">fichier de calibration couleur IT 8.7</comment>
+ <comment xml:lang="ga">comhad calabraithe dathanna IT 8.7</comment>
+ <comment xml:lang="gl">ficheiro de calibración de cor IT 8.7</comment>
+ <comment xml:lang="he">קובץ כיול צבע IT 8.7</comment>
+ <comment xml:lang="hu">IT 8.7 színkalibrációs fájl</comment>
+ <comment xml:lang="id">Berkas kalibrasi warna IT 8.7</comment>
+ <comment xml:lang="it">File calibrazione colore IT 8.7</comment>
+ <comment xml:lang="ja">IT 8.7 カラーキャリブレーションファイル</comment>
+ <comment xml:lang="kk">IT 8.7 түс баптау файлы</comment>
+ <comment xml:lang="ko">IT 8.7 색 조율 파일</comment>
+ <comment xml:lang="lt">IT 8.7 spalvų kalibravimo failas</comment>
+ <comment xml:lang="lv">IT 8.7 krāsu kalibrācijas fails</comment>
+ <comment xml:lang="pl">Plik kalibracji kolorów IT 8.7</comment>
+ <comment xml:lang="ro">Fișier de calibrare a culorii IT 8.7</comment>
+ <comment xml:lang="ru">файл калибровки цвета IT 8.7</comment>
+ <comment xml:lang="sl">Umeritvena datoteka barve IT 8.7</comment>
+ <comment xml:lang="sv">IT 8.7-färgkalibreringsfil</comment>
+ <comment xml:lang="uk">файл калібрування кольорів IT 8.7</comment>
+ <comment xml:lang="zh_CN">IT 8.7 色彩校准文件</comment>
+ <comment xml:lang="zh_TW">IT 8.7 色彩校正檔</comment>
+ <magic priority="50">
+ <match value="IT8.7" type="string" offset="0"/>
+ </magic>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.it87"/>
+ </mime-type>
+
+
+ <mime-type type="x-content/image-dcf">
+
+ <comment>digital photos</comment>
+ <comment xml:lang="ar">الصور الرقمية</comment>
+ <comment xml:lang="be@latin">ličbavyja zdymki</comment>
+ <comment xml:lang="bg">Цифрови фотографии</comment>
+ <comment xml:lang="ca">fotos digitals</comment>
+ <comment xml:lang="cs">Digitální fotografie</comment>
+ <comment xml:lang="da">digitale billeder</comment>
+ <comment xml:lang="de">Digitale Fotos</comment>
+ <comment xml:lang="es">fotos digitales</comment>
+ <comment xml:lang="eu">argazki digitalak</comment>
+ <comment xml:lang="fi">digivalokuvia</comment>
+ <comment xml:lang="fo">talgildar myndir</comment>
+ <comment xml:lang="fr">photos numériques</comment>
+ <comment xml:lang="ga">grianghraif dhigiteacha</comment>
+ <comment xml:lang="gl">fotos dixitais</comment>
+ <comment xml:lang="he">תמונות דיגיטליות</comment>
+ <comment xml:lang="hu">digitális fényképek</comment>
+ <comment xml:lang="id">foto digital</comment>
+ <comment xml:lang="it">Foto digitali</comment>
+ <comment xml:lang="ja">デジタルフォト</comment>
+ <comment xml:lang="kk">сандық фотосуреттер</comment>
+ <comment xml:lang="ko">디지털 사진</comment>
+ <comment xml:lang="lt">skaitmeninės nuotraukos</comment>
+ <comment xml:lang="lv">digitāla fotogrāfija</comment>
+ <comment xml:lang="nl">digitale foto's</comment>
+ <comment xml:lang="nn">digitale fotografi</comment>
+ <comment xml:lang="pl">Zdjęcia cyfrowe</comment>
+ <comment xml:lang="pt_BR">fotos digitais</comment>
+ <comment xml:lang="ro">fotografii digitale</comment>
+ <comment xml:lang="ru">цифровые фотографии</comment>
+ <comment xml:lang="sk">Digitálne fotografie</comment>
+ <comment xml:lang="sl">digitalne fotografije</comment>
+ <comment xml:lang="sq">Fotografi dixhitale</comment>
+ <comment xml:lang="sv">digitalbilder</comment>
+ <comment xml:lang="uk">цифрові фотографії</comment>
+ <comment xml:lang="vi">ảnh chụp số</comment>
+ <comment xml:lang="zh_CN">数字化图像</comment>
+ <comment xml:lang="zh_TW">數位相片</comment>
+ <treemagic>
+ <treematch type="directory" path="dcim" non-empty="true"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/video-vcd">
+
+ <comment>Video CD</comment>
+ <comment xml:lang="ar">Video CD</comment>
+ <comment xml:lang="be@latin">Videa CD</comment>
+ <comment xml:lang="bg">CD — видео</comment>
+ <comment xml:lang="ca">Video CD</comment>
+ <comment xml:lang="cs">Video CD</comment>
+ <comment xml:lang="da">Video-cd</comment>
+ <comment xml:lang="de">Video-CD</comment>
+ <comment xml:lang="eo">Video-KD</comment>
+ <comment xml:lang="es">Video CD</comment>
+ <comment xml:lang="eu">Bideo CDa</comment>
+ <comment xml:lang="fi">Video CD</comment>
+ <comment xml:lang="fo">Video CD</comment>
+ <comment xml:lang="fr">CD vidéo</comment>
+ <comment xml:lang="ga">Video CD</comment>
+ <comment xml:lang="gl">Video CD</comment>
+ <comment xml:lang="he">תקליטור וידאו</comment>
+ <comment xml:lang="hu">Video CD</comment>
+ <comment xml:lang="id">Video CD</comment>
+ <comment xml:lang="it">Video CD</comment>
+ <comment xml:lang="ja">ビデオ CD</comment>
+ <comment xml:lang="kk">видео CD</comment>
+ <comment xml:lang="ko">비디오 CD</comment>
+ <comment xml:lang="lt">Vaizdo CD</comment>
+ <comment xml:lang="lv">Video CD</comment>
+ <comment xml:lang="nl">video-CD</comment>
+ <comment xml:lang="nn">Video-CD</comment>
+ <comment xml:lang="pl">Video CD</comment>
+ <comment xml:lang="pt_BR">CD de vídeo</comment>
+ <comment xml:lang="ro">CD video</comment>
+ <comment xml:lang="ru">видеодиск VCD</comment>
+ <comment xml:lang="sk">Video CD</comment>
+ <comment xml:lang="sl">Video CD</comment>
+ <comment xml:lang="sq">CD Video</comment>
+ <comment xml:lang="sv">Video-cd</comment>
+ <comment xml:lang="uk">Video CD</comment>
+ <comment xml:lang="vi">Đĩa CD ảnh động</comment>
+ <comment xml:lang="zh_CN">VCD</comment>
+ <comment xml:lang="zh_TW">Video CD</comment>
+ <treemagic>
+ <treematch type="file" path="mpegav/AVSEQ01.DAT"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/video-svcd">
+
+ <comment>Super Video CD</comment>
+ <comment xml:lang="ar">Super Video CD</comment>
+ <comment xml:lang="be@latin">Super Video CD</comment>
+ <comment xml:lang="bg">CD — супер видео</comment>
+ <comment xml:lang="ca">Super Video CD</comment>
+ <comment xml:lang="cs">Super Video CD</comment>
+ <comment xml:lang="da">Super Video-cd</comment>
+ <comment xml:lang="de">Super-Video-CD</comment>
+ <comment xml:lang="eo">Super-Video-KD</comment>
+ <comment xml:lang="es">Super Video CD</comment>
+ <comment xml:lang="eu">Super Bideo CDa</comment>
+ <comment xml:lang="fi">Super Video CD</comment>
+ <comment xml:lang="fo">Super Video CD</comment>
+ <comment xml:lang="fr">Super VCD</comment>
+ <comment xml:lang="ga">Super Video CD</comment>
+ <comment xml:lang="gl">Super vídeo CD</comment>
+ <comment xml:lang="he">Super Video CD</comment>
+ <comment xml:lang="hu">Super Video CD</comment>
+ <comment xml:lang="id">Super Video CD</comment>
+ <comment xml:lang="it">Super Video CD</comment>
+ <comment xml:lang="ja">スーパービデオ CD</comment>
+ <comment xml:lang="kk">Super Video CD</comment>
+ <comment xml:lang="ko">슈퍼 비디오 CD</comment>
+ <comment xml:lang="lt">Super vaizdo CD</comment>
+ <comment xml:lang="lv">Super Video CD</comment>
+ <comment xml:lang="nl">super-video-CD</comment>
+ <comment xml:lang="nn">Super Video-CD</comment>
+ <comment xml:lang="pl">Super Video CD</comment>
+ <comment xml:lang="pt_BR">CD de Super Vídeo (SVCD)</comment>
+ <comment xml:lang="ro">Super Video CD</comment>
+ <comment xml:lang="ru">компакт-диск Super Video</comment>
+ <comment xml:lang="sk">Super Video CD</comment>
+ <comment xml:lang="sl">Super Video CD</comment>
+ <comment xml:lang="sq">CD Super Video</comment>
+ <comment xml:lang="sv">Super Video CD</comment>
+ <comment xml:lang="uk">Super Video CD</comment>
+ <comment xml:lang="vi">Đĩa CD siêu ảnh động</comment>
+ <comment xml:lang="zh_CN">SVCD</comment>
+ <comment xml:lang="zh_TW">Super Video CD</comment>
+ <treemagic>
+ <treematch type="file" path="MPEG2/AVSEQ01.MPG"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/video-dvd">
+
+ <comment>video DVD</comment>
+ <comment xml:lang="ar">DVD مرئي</comment>
+ <comment xml:lang="be@latin">videa DVD</comment>
+ <comment xml:lang="bg">DVD — видео</comment>
+ <comment xml:lang="ca">vídeo DVD</comment>
+ <comment xml:lang="cs">DVD-Video</comment>
+ <comment xml:lang="da">video-dvd</comment>
+ <comment xml:lang="de">Video-DVD</comment>
+ <comment xml:lang="eo">video-DVD</comment>
+ <comment xml:lang="es">DVD de vídeo</comment>
+ <comment xml:lang="eu">bideo DVDa</comment>
+ <comment xml:lang="fi">video-DVD</comment>
+ <comment xml:lang="fo">video DVD</comment>
+ <comment xml:lang="fr">DVD vidéo</comment>
+ <comment xml:lang="ga">DVD físe</comment>
+ <comment xml:lang="gl">DVD de vídeo</comment>
+ <comment xml:lang="he">DVD וידאו</comment>
+ <comment xml:lang="hu">video DVD</comment>
+ <comment xml:lang="id">DVD video</comment>
+ <comment xml:lang="it">DVD video</comment>
+ <comment xml:lang="ja">ビデオ DVD</comment>
+ <comment xml:lang="kk">видео DVD</comment>
+ <comment xml:lang="ko">비디오 CD</comment>
+ <comment xml:lang="lt">vaizdo DVD</comment>
+ <comment xml:lang="lv">video DVD</comment>
+ <comment xml:lang="nl">video-DVD</comment>
+ <comment xml:lang="nn">Video-DVD</comment>
+ <comment xml:lang="pl">DVD-Video</comment>
+ <comment xml:lang="pt_BR">DVD de vídeo</comment>
+ <comment xml:lang="ro">DVD video</comment>
+ <comment xml:lang="ru">видео-DVD</comment>
+ <comment xml:lang="sk">DVD-Video</comment>
+ <comment xml:lang="sl">video DVD</comment>
+ <comment xml:lang="sq">DVD video</comment>
+ <comment xml:lang="sv">video-dvd</comment>
+ <comment xml:lang="uk">відео-DVD</comment>
+ <comment xml:lang="vi">đĩa DVD ảnh động</comment>
+ <comment xml:lang="zh_CN">视频 DVD</comment>
+ <comment xml:lang="zh_TW">視訊 DVD</comment>
+ <treemagic>
+ <treematch type="file" path="VIDEO_TS/VIDEO_TS.IFO"/>
+ <treematch type="file" path="VIDEO_TS/VIDEO_TS.IFO;1"/>
+ <treematch type="file" path="VIDEO_TS.IFO"/>
+ <treematch type="file" path="VIDEO_TS.IFO;1"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/audio-cdda">
+
+ <comment>audio CD</comment>
+ <comment xml:lang="ar">CD سمعي</comment>
+ <comment xml:lang="be@latin">aŭdyjo CD</comment>
+ <comment xml:lang="bg">CD — аудио</comment>
+ <comment xml:lang="ca">CD d'àudio</comment>
+ <comment xml:lang="cs">Zvukové CD</comment>
+ <comment xml:lang="da">lyd-cd</comment>
+ <comment xml:lang="de">Audio-CD</comment>
+ <comment xml:lang="eo">Son-KD</comment>
+ <comment xml:lang="es">CD de sonido</comment>
+ <comment xml:lang="eu">Audio CDa</comment>
+ <comment xml:lang="fi">ääni-CD</comment>
+ <comment xml:lang="fo">audio CD</comment>
+ <comment xml:lang="fr">CD audio</comment>
+ <comment xml:lang="ga">dlúthdhiosca fuaime</comment>
+ <comment xml:lang="gl">CD de son</comment>
+ <comment xml:lang="he">תקליטור שמע</comment>
+ <comment xml:lang="hu">hang CD</comment>
+ <comment xml:lang="id">CD audio</comment>
+ <comment xml:lang="it">CD audio</comment>
+ <comment xml:lang="ja">オーディオ CD</comment>
+ <comment xml:lang="kk">аудио CD</comment>
+ <comment xml:lang="ko">오디오 CD</comment>
+ <comment xml:lang="lt">garso CD</comment>
+ <comment xml:lang="lv">audio CD</comment>
+ <comment xml:lang="nl">audio-CD</comment>
+ <comment xml:lang="nn">lyd-CD</comment>
+ <comment xml:lang="pl">CD-Audio</comment>
+ <comment xml:lang="pt_BR">CD de áudio</comment>
+ <comment xml:lang="ro">CD audio</comment>
+ <comment xml:lang="ru">звуковой CD</comment>
+ <comment xml:lang="sk">Zvukové CD</comment>
+ <comment xml:lang="sl">zvočni CD</comment>
+ <comment xml:lang="sq">CD audio</comment>
+ <comment xml:lang="sv">ljud-cd</comment>
+ <comment xml:lang="uk">звуковий CD</comment>
+ <comment xml:lang="vi">đĩa CD âm thanh</comment>
+ <comment xml:lang="zh_CN">音频 CD</comment>
+ <comment xml:lang="zh_TW">音訊 CD</comment>
+ </mime-type>
+
+ <mime-type type="x-content/blank-cd">
+
+ <comment>blank CD disc</comment>
+ <comment xml:lang="ar">قرص CD فارغ</comment>
+ <comment xml:lang="be@latin">čysty dysk CD</comment>
+ <comment xml:lang="bg">CD — празно</comment>
+ <comment xml:lang="ca">disc CD en blanc</comment>
+ <comment xml:lang="cs">Prázdný disk CD</comment>
+ <comment xml:lang="da">tom cd-disk</comment>
+ <comment xml:lang="de">Leere CD</comment>
+ <comment xml:lang="es">disco CD virgen</comment>
+ <comment xml:lang="eu">CD disko hutsa</comment>
+ <comment xml:lang="fi">tyhjä CD-levy</comment>
+ <comment xml:lang="fo">blonk fløga</comment>
+ <comment xml:lang="fr">CD vierge</comment>
+ <comment xml:lang="ga">dlúthdhiosca folamh</comment>
+ <comment xml:lang="gl">disco de CD en brancho</comment>
+ <comment xml:lang="he">תקליטור ריק</comment>
+ <comment xml:lang="hu">üres CD-lemez</comment>
+ <comment xml:lang="id">cakram CD kosong</comment>
+ <comment xml:lang="it">Disco vuoto CD</comment>
+ <comment xml:lang="ja">ブランク CD ディスク</comment>
+ <comment xml:lang="kk">таза CD дискі</comment>
+ <comment xml:lang="ko">빈 CD 디스크</comment>
+ <comment xml:lang="lt">tuščias CD diskas</comment>
+ <comment xml:lang="lv">tukšs CD disks</comment>
+ <comment xml:lang="nl">blanco CD</comment>
+ <comment xml:lang="nn">tom CD-plate</comment>
+ <comment xml:lang="pl">Pusta płyta CD</comment>
+ <comment xml:lang="pt_BR">Disco CD virgem</comment>
+ <comment xml:lang="ro">disc gol CD</comment>
+ <comment xml:lang="ru">чистый компакт-диск</comment>
+ <comment xml:lang="sk">Prázdny disk CD</comment>
+ <comment xml:lang="sl">prazen CD disk</comment>
+ <comment xml:lang="sq">Disk bosh CD</comment>
+ <comment xml:lang="sv">tom cd-skiva</comment>
+ <comment xml:lang="uk">порожній компакт-диск</comment>
+ <comment xml:lang="vi">đĩa CD trống</comment>
+ <comment xml:lang="zh_CN">空 CD 光盘</comment>
+ <comment xml:lang="zh_TW">空白 CD 光碟</comment>
+ </mime-type>
+
+ <mime-type type="x-content/blank-dvd">
+
+ <comment>blank DVD disc</comment>
+ <comment xml:lang="ar">قرص DVD فارغ</comment>
+ <comment xml:lang="be@latin">čysty dysk DVD</comment>
+ <comment xml:lang="bg">DVD — празно</comment>
+ <comment xml:lang="ca">disc DVD en blanc</comment>
+ <comment xml:lang="cs">Prázdný disk DVD</comment>
+ <comment xml:lang="da">tom dvd-disk</comment>
+ <comment xml:lang="de">Leere DVD</comment>
+ <comment xml:lang="es">disco DVD virgen</comment>
+ <comment xml:lang="eu">DVD disko hutsa</comment>
+ <comment xml:lang="fi">tyhjä DVD-levy</comment>
+ <comment xml:lang="fo">blonk margfløga</comment>
+ <comment xml:lang="fr">DVD vierge</comment>
+ <comment xml:lang="ga">DVD folamh</comment>
+ <comment xml:lang="gl">disco de DVD en branco</comment>
+ <comment xml:lang="he">תקליטור DVD ריק</comment>
+ <comment xml:lang="hu">üres DVD-lemez</comment>
+ <comment xml:lang="id">cakram DVD kosong</comment>
+ <comment xml:lang="it">Disco vuoto DVD</comment>
+ <comment xml:lang="ja">ブランク DVD ディスク</comment>
+ <comment xml:lang="kk">таза DVD дискі</comment>
+ <comment xml:lang="ko">빈 DVD 디스크</comment>
+ <comment xml:lang="lt">tuščias DVD diskas</comment>
+ <comment xml:lang="lv">tukšs DVD disks</comment>
+ <comment xml:lang="nl">blanco DVD</comment>
+ <comment xml:lang="nn">tom DVD-plate</comment>
+ <comment xml:lang="pl">Pusta płyta DVD</comment>
+ <comment xml:lang="pt_BR">Disco DVD virgem</comment>
+ <comment xml:lang="ro">disc gol DVD</comment>
+ <comment xml:lang="ru">чистый диск DVD</comment>
+ <comment xml:lang="sk">Prázdny disk DVD</comment>
+ <comment xml:lang="sl">prazen DVD disk</comment>
+ <comment xml:lang="sq">Disk bosh DVD</comment>
+ <comment xml:lang="sv">tom dvd-skiva</comment>
+ <comment xml:lang="uk">порожній диск DVD</comment>
+ <comment xml:lang="vi">đĩa DVD trống</comment>
+ <comment xml:lang="zh_CN">空 DVD 光盘</comment>
+ <comment xml:lang="zh_TW">空白 DVD 光碟</comment>
+ </mime-type>
+
+ <mime-type type="x-content/blank-bd">
+
+ <comment>blank Blu-ray disc</comment>
+ <comment xml:lang="ar">قرص بلو-راي فارغ</comment>
+ <comment xml:lang="be@latin">čysty dysk Blu-ray</comment>
+ <comment xml:lang="bg">Blu-ray — празно</comment>
+ <comment xml:lang="ca">disc Blu-Ray en blanc</comment>
+ <comment xml:lang="cs">Prázdný disk Blu-ray</comment>
+ <comment xml:lang="da">tom Blu-ray-disk</comment>
+ <comment xml:lang="de">Leeres Blu-Ray-Medium</comment>
+ <comment xml:lang="es">disco Blu-ray virgen</comment>
+ <comment xml:lang="eu">Blu-ray disko hutsa</comment>
+ <comment xml:lang="fi">tyhjä Blu-ray-levy</comment>
+ <comment xml:lang="fo">blankur Blu-ray diskur</comment>
+ <comment xml:lang="fr">disque Blu-Ray vierge</comment>
+ <comment xml:lang="ga">diosca folamh Blu-Ray</comment>
+ <comment xml:lang="gl">disco Blu-ray en branco</comment>
+ <comment xml:lang="he">תקליטור בלו־ריי ריק</comment>
+ <comment xml:lang="hu">üres Blu-Ray lemez</comment>
+ <comment xml:lang="id">cakram Blu-ray kosong</comment>
+ <comment xml:lang="it">Disco vuoto Blu-ray</comment>
+ <comment xml:lang="ja">ブランク Blu-ray ディスク</comment>
+ <comment xml:lang="kk">таза Blu-ray дискі</comment>
+ <comment xml:lang="ko">빈 블루레이 디스크</comment>
+ <comment xml:lang="lt">tuščias Blu-ray diskas</comment>
+ <comment xml:lang="lv">tukšs Blu-ray disks</comment>
+ <comment xml:lang="nl">blanco Blu-ray-disk</comment>
+ <comment xml:lang="nn">tom Blu-Ray-plate</comment>
+ <comment xml:lang="pl">Pusta płyta Blu-ray</comment>
+ <comment xml:lang="pt_BR">Disco Blu-Ray virgem</comment>
+ <comment xml:lang="ro">disc gol Blu-ray</comment>
+ <comment xml:lang="ru">чистый диск Blu-ray</comment>
+ <comment xml:lang="sk">Prázdny disk Blu-ray</comment>
+ <comment xml:lang="sl">prazen Blu-Ray disk</comment>
+ <comment xml:lang="sq">Disk bosh Blu-ray</comment>
+ <comment xml:lang="sv">tom Blu-ray-skiva</comment>
+ <comment xml:lang="uk">порожній диск Blu-ray</comment>
+ <comment xml:lang="vi">đĩa Blu-ray trống</comment>
+ <comment xml:lang="zh_CN">空蓝光 DVD</comment>
+ <comment xml:lang="zh_TW">空白 Blu-ray 光碟</comment>
+ </mime-type>
+
+ <mime-type type="x-content/blank-hddvd">
+
+ <comment>blank HD DVD disc</comment>
+ <comment xml:lang="ar">قرص HD DVD فارغ</comment>
+ <comment xml:lang="be@latin">čysty dysk HD DVD</comment>
+ <comment xml:lang="bg">HD DVD — празно</comment>
+ <comment xml:lang="ca">disc DVD HD en blanc</comment>
+ <comment xml:lang="cs">Prázdný disk HD DVD</comment>
+ <comment xml:lang="da">tom HD dvd-disk</comment>
+ <comment xml:lang="de">Leere HD-DVD</comment>
+ <comment xml:lang="es">disco HD DVD virgen</comment>
+ <comment xml:lang="eu">HD DVD disko hutsa</comment>
+ <comment xml:lang="fi">tyhjä HD DVD -levy</comment>
+ <comment xml:lang="fo">blankur HD DVD diskur</comment>
+ <comment xml:lang="fr">disque HD-DVD vierge</comment>
+ <comment xml:lang="ga">HD DVD folamh</comment>
+ <comment xml:lang="gl">disco de HD DVD en branco</comment>
+ <comment xml:lang="he">דיסק HD DVD ריק</comment>
+ <comment xml:lang="hu">üres HD DVD-lemez</comment>
+ <comment xml:lang="id">cakram HD DVD kosong</comment>
+ <comment xml:lang="it">Disco vuoto DVD HD</comment>
+ <comment xml:lang="ja">ブランク HD DVD ディスク</comment>
+ <comment xml:lang="kk">таза HD DVD дискі</comment>
+ <comment xml:lang="ko">빈 HD DVD 디스크</comment>
+ <comment xml:lang="lt">tuščias HD DVD diskas</comment>
+ <comment xml:lang="lv">tukšs HD DVD disks</comment>
+ <comment xml:lang="nl">blanco HD-DVD</comment>
+ <comment xml:lang="nn">tom HD-DVD-plate</comment>
+ <comment xml:lang="pl">Pusta płyta HD DVD</comment>
+ <comment xml:lang="pt_BR">Disco DVD HD virgem</comment>
+ <comment xml:lang="ro">disc gol HD DVD</comment>
+ <comment xml:lang="ru">чистый диск HD DVD</comment>
+ <comment xml:lang="sk">Prázdny disk HD DVD</comment>
+ <comment xml:lang="sl">prazen HD DVD disk</comment>
+ <comment xml:lang="sq">Disk bosh DVD HD</comment>
+ <comment xml:lang="sv">tom HD DVD-skiva</comment>
+ <comment xml:lang="uk">порожній диск HD DVD</comment>
+ <comment xml:lang="vi">đĩa DVD HD trống</comment>
+ <comment xml:lang="zh_CN">空 HD DVD 光盘</comment>
+ <comment xml:lang="zh_TW">空白 HD DVD 光碟</comment>
+ </mime-type>
+
+ <mime-type type="x-content/audio-dvd">
+
+ <comment>audio DVD</comment>
+ <comment xml:lang="ar">DVD سمعي</comment>
+ <comment xml:lang="be@latin">aŭdyjo DVD</comment>
+ <comment xml:lang="bg">DVD — аудио</comment>
+ <comment xml:lang="ca">DVD d'àudio</comment>
+ <comment xml:lang="cs">Zvukové DVD</comment>
+ <comment xml:lang="da">lyd-dvd</comment>
+ <comment xml:lang="de">Audio-DVD</comment>
+ <comment xml:lang="eo">Son-DVD</comment>
+ <comment xml:lang="es">DVD de sonido</comment>
+ <comment xml:lang="eu">audio DVDa</comment>
+ <comment xml:lang="fi">ääni-DVD</comment>
+ <comment xml:lang="fo">Ljóð DVD</comment>
+ <comment xml:lang="fr">DVD audio</comment>
+ <comment xml:lang="ga">DVD fuaime</comment>
+ <comment xml:lang="gl">DVD de son</comment>
+ <comment xml:lang="he">DVD שמע</comment>
+ <comment xml:lang="hu">hang DVD</comment>
+ <comment xml:lang="id">DVD audio</comment>
+ <comment xml:lang="it">DVD audio</comment>
+ <comment xml:lang="ja">オーディオ DVD</comment>
+ <comment xml:lang="kk">аудио DVD</comment>
+ <comment xml:lang="ko">오디오 DVD</comment>
+ <comment xml:lang="lt">garso DVD</comment>
+ <comment xml:lang="lv">audio DVD</comment>
+ <comment xml:lang="nl">audio-DVD</comment>
+ <comment xml:lang="nn">lyd-DVD</comment>
+ <comment xml:lang="pl">DVD-Audio</comment>
+ <comment xml:lang="pt_BR">DVD de áudio</comment>
+ <comment xml:lang="ro">DVD audio</comment>
+ <comment xml:lang="ru">звуковой DVD</comment>
+ <comment xml:lang="sk">Zvukové DVD</comment>
+ <comment xml:lang="sl">zvočni DVD</comment>
+ <comment xml:lang="sq">DVD audio</comment>
+ <comment xml:lang="sv">ljud-dvd</comment>
+ <comment xml:lang="uk">звуковий DVD</comment>
+ <comment xml:lang="vi">đĩa DVD âm thanh</comment>
+ <comment xml:lang="zh_CN">音频 DVD</comment>
+ <comment xml:lang="zh_TW">音訊 DVD</comment>
+ <treemagic>
+ <treematch type="file" path="AUDIO_TS/AUDIO_TS.IFO"/>
+ <treematch type="file" path="AUDIO_TS/AUDIO_TS.IFO;1"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/video-bluray">
+
+ <comment>Blu-ray video disc</comment>
+ <comment xml:lang="ar">قرص بلو-راي مرئي</comment>
+ <comment xml:lang="be@latin">Videadysk Blu-ray</comment>
+ <comment xml:lang="bg">Blu-ray — видео</comment>
+ <comment xml:lang="ca">disc de vídeo Blu-Ray</comment>
+ <comment xml:lang="cs">Videodisk Blu-ray</comment>
+ <comment xml:lang="da">Blu-ray video-disk</comment>
+ <comment xml:lang="de">Blu-ray-Videoscheibe</comment>
+ <comment xml:lang="es">disco de vídeo Blu-ray</comment>
+ <comment xml:lang="eu">Blu-ray bideo-diskoa</comment>
+ <comment xml:lang="fi">Blu-ray-videolevy</comment>
+ <comment xml:lang="fo">Blu-ray diskur</comment>
+ <comment xml:lang="fr">disque vidéo Blu-Ray</comment>
+ <comment xml:lang="ga">diosca físe Blu-Ray</comment>
+ <comment xml:lang="gl">disco de vídeo Blu-ray</comment>
+ <comment xml:lang="he">תקליטור וידאו מסוג בלו־ריי</comment>
+ <comment xml:lang="hu">Blu-ray videolemez</comment>
+ <comment xml:lang="id">Cakram video Blu-ray</comment>
+ <comment xml:lang="it">Disco video Blu-ray</comment>
+ <comment xml:lang="ja">Blu-ray ビデオディスク</comment>
+ <comment xml:lang="kk">Blu-ray видео дискі</comment>
+ <comment xml:lang="ko">블루레이 비디오 디스크</comment>
+ <comment xml:lang="lt">Blu-ray vaizdo diskas</comment>
+ <comment xml:lang="lv">Blu-ray video disks</comment>
+ <comment xml:lang="nl">Blu-ray-videodisk</comment>
+ <comment xml:lang="nn">Blu-Ray videoplate</comment>
+ <comment xml:lang="pl">Płyta wideo Blu-ray</comment>
+ <comment xml:lang="pt_BR">Disco de vídeo do Blu-Ray</comment>
+ <comment xml:lang="ro">Disc video Blu-ray</comment>
+ <comment xml:lang="ru">видеодиск Blu-ray</comment>
+ <comment xml:lang="sk">Videodisk Blu-ray</comment>
+ <comment xml:lang="sl">Blu-ray video disk</comment>
+ <comment xml:lang="sq">Disk video Blu-ray</comment>
+ <comment xml:lang="sv">Blu-ray-videoskiva</comment>
+ <comment xml:lang="uk">відеодиск Blu-ray</comment>
+ <comment xml:lang="vi">Đĩa ảnh động Blu-ray</comment>
+ <comment xml:lang="zh_CN">蓝光视频光盘</comment>
+ <comment xml:lang="zh_TW">Blu-ray 視訊光碟</comment>
+ <treemagic>
+ <treematch type="directory" path="BDAV" non-empty="true"/>
+ <treematch type="directory" path="BDMV" non-empty="true"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/video-hddvd">
+
+ <comment>HD DVD video disc</comment>
+ <comment xml:lang="ar">قرص HD DVD مرئي</comment>
+ <comment xml:lang="be@latin">Videadysk HD DVD</comment>
+ <comment xml:lang="bg">HD DVD — видео</comment>
+ <comment xml:lang="ca">disc de vídeo DVD HD</comment>
+ <comment xml:lang="cs">Videodisk HD DVD</comment>
+ <comment xml:lang="da">HD DVD-videodisk</comment>
+ <comment xml:lang="de">HD-DVD-Videoscheibe</comment>
+ <comment xml:lang="es">disco de vídeo HD DVD</comment>
+ <comment xml:lang="eu">HD DVD bideo-diskoa</comment>
+ <comment xml:lang="fi">HD DVD -videolevy</comment>
+ <comment xml:lang="fo">HD DVD video diskur</comment>
+ <comment xml:lang="fr">disque vidéo HD DVD</comment>
+ <comment xml:lang="ga">diosca físe HD DVD</comment>
+ <comment xml:lang="gl">disco de vídeo HD DVD</comment>
+ <comment xml:lang="he">תקליטור וידאו HD DVD</comment>
+ <comment xml:lang="hu">HD DVD videolemez</comment>
+ <comment xml:lang="id">Cakram video HD DVD</comment>
+ <comment xml:lang="it">Disco video DVD HD</comment>
+ <comment xml:lang="ja">HD DVD ビデオディスク</comment>
+ <comment xml:lang="kk">HD DVD видео дискі</comment>
+ <comment xml:lang="ko">HD DVD 비디오 디스크</comment>
+ <comment xml:lang="lt">HD DVD vaizdo diskas</comment>
+ <comment xml:lang="lv">HD DVD video disks</comment>
+ <comment xml:lang="nl">HD-DVD-videodisk</comment>
+ <comment xml:lang="nn">HD-DVD-videodisk</comment>
+ <comment xml:lang="pl">Płyta wideo HD DVD</comment>
+ <comment xml:lang="pt_BR">Disco DVD de vídeo HD (HDDVD)</comment>
+ <comment xml:lang="ro">Disc video HD DVD</comment>
+ <comment xml:lang="ru">видеодиск HD DVD</comment>
+ <comment xml:lang="sk">Videodisk HD DVD</comment>
+ <comment xml:lang="sl">HD DVD video disk</comment>
+ <comment xml:lang="sq">Disk video DVD HD</comment>
+ <comment xml:lang="sv">HD DVD-videoskiva</comment>
+ <comment xml:lang="uk">відеодиск HD DVD</comment>
+ <comment xml:lang="vi">Đĩa ảnh động DVD HD</comment>
+ <comment xml:lang="zh_CN">HD DVD 视频光盘</comment>
+ <comment xml:lang="zh_TW">HD DVD 視訊光碟</comment>
+ <treemagic>
+ <treematch type="file" path="HVDVD_TS/HV000I01.IFO"/>
+ <treematch type="file" path="HVDVD_TS/HV001I01.IFO"/>
+ <treematch type="file" path="HVDVD_TS/HVA00001.VTI"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/ebook-reader">
+
+ <comment>e-book reader</comment>
+ <comment xml:lang="bg">Четец на е-книги</comment>
+ <comment xml:lang="ca">lector de llibres electrònics</comment>
+ <comment xml:lang="cs">Čtečka elektronických knih</comment>
+ <comment xml:lang="da">e-bogslæser</comment>
+ <comment xml:lang="de">E-Book-Leser</comment>
+ <comment xml:lang="es">lector de libros electrónicos</comment>
+ <comment xml:lang="fi">e-kirjan lukulaite</comment>
+ <comment xml:lang="fr">lecteur de livre numérique</comment>
+ <comment xml:lang="gl">lector de libros electrónicos</comment>
+ <comment xml:lang="he">קורא ספרים אלקטרוניים</comment>
+ <comment xml:lang="hu">e-könyvolvasó</comment>
+ <comment xml:lang="id">Pembaca e-book</comment>
+ <comment xml:lang="it">Lettore e-book</comment>
+ <comment xml:lang="ja">電子書籍リーダー</comment>
+ <comment xml:lang="kk">электронды кітаптарды оқу құрылғысы</comment>
+ <comment xml:lang="ko">이북 리더</comment>
+ <comment xml:lang="lv">e-grāmatu lasītājs</comment>
+ <comment xml:lang="pl">Czytnik e-booków</comment>
+ <comment xml:lang="ru">устройство для чтения электронных книг</comment>
+ <comment xml:lang="sl">Bralnik elektronskih knjig</comment>
+ <comment xml:lang="sv">e-book-läsare</comment>
+ <comment xml:lang="uk">пристрій для читання електронних книг</comment>
+ <comment xml:lang="zh_CN">电子书阅读器</comment>
+ <comment xml:lang="zh_TW">e-book 閱讀器</comment>
+ </mime-type>
+
+ <mime-type type="x-content/image-picturecd">
+
+ <comment>Picture CD</comment>
+ <comment xml:lang="ar">Picture CD</comment>
+ <comment xml:lang="be@latin">Picture CD</comment>
+ <comment xml:lang="bg">CD — изображения</comment>
+ <comment xml:lang="ca">Picture CD</comment>
+ <comment xml:lang="cs">Picture CD</comment>
+ <comment xml:lang="da">Billedcd</comment>
+ <comment xml:lang="de">Bild-CD</comment>
+ <comment xml:lang="es">Picture CD</comment>
+ <comment xml:lang="eu">Picture CD</comment>
+ <comment xml:lang="fi">Picture CD</comment>
+ <comment xml:lang="fo">Picture CD</comment>
+ <comment xml:lang="fr">CD Picture</comment>
+ <comment xml:lang="ga">Picture CD</comment>
+ <comment xml:lang="gl">Picture CD</comment>
+ <comment xml:lang="he">תקליטור תמונות</comment>
+ <comment xml:lang="hu">Picture CD</comment>
+ <comment xml:lang="id">CD Gambar</comment>
+ <comment xml:lang="it">Picture CD</comment>
+ <comment xml:lang="ja">ピクチャー CD</comment>
+ <comment xml:lang="kk">Picture CD</comment>
+ <comment xml:lang="ko">Picture CD</comment>
+ <comment xml:lang="lt">Paveikslėlių CD</comment>
+ <comment xml:lang="lv">Attēlu CD</comment>
+ <comment xml:lang="nl">foto-CD</comment>
+ <comment xml:lang="nn">Bilete-CD</comment>
+ <comment xml:lang="pl">Picture CD</comment>
+ <comment xml:lang="pt_BR">CD de Fotos</comment>
+ <comment xml:lang="ro">CD cu fotografii</comment>
+ <comment xml:lang="ru">Picture CD</comment>
+ <comment xml:lang="sk">Picture CD</comment>
+ <comment xml:lang="sl">Slikovni CD</comment>
+ <comment xml:lang="sq">Picture CD</comment>
+ <comment xml:lang="sv">Picture CD</comment>
+ <comment xml:lang="uk">CD з зображеннями</comment>
+ <comment xml:lang="vi">Đĩa CD ảnh</comment>
+ <comment xml:lang="zh_CN">柯达 Picture CD</comment>
+ <comment xml:lang="zh_TW">圖片 CD</comment>
+ <treemagic>
+ <treematch type="directory" path="PICTURES" non-empty="true" match-case="true"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/audio-player">
+
+ <comment>portable audio player</comment>
+ <comment xml:lang="ar">مشغل الملفات المسموعة المحمولة</comment>
+ <comment xml:lang="be@latin">pieranosny aŭdyjoplayer</comment>
+ <comment xml:lang="bg">Преносим аудио плеър</comment>
+ <comment xml:lang="ca">reproductor d'àudio portàtil</comment>
+ <comment xml:lang="cs">Přenosný zvukový přehrávač</comment>
+ <comment xml:lang="da">bærbar lydafspiller</comment>
+ <comment xml:lang="de">Portables Audio-Wiedergabegerät</comment>
+ <comment xml:lang="es">dispositivo de sonido portable</comment>
+ <comment xml:lang="eu">audio erreproduzigailu eramangarria</comment>
+ <comment xml:lang="fi">siirrettävä äänisoitin</comment>
+ <comment xml:lang="fo">leysur ljóðavspælari</comment>
+ <comment xml:lang="fr">lecteur audio portable</comment>
+ <comment xml:lang="ga">seinnteoir iniompartha fuaime</comment>
+ <comment xml:lang="gl">dispositivo de son portábel</comment>
+ <comment xml:lang="he">נגן מוזיקה נייד</comment>
+ <comment xml:lang="hu">hordozható zenelejátszó</comment>
+ <comment xml:lang="id">pemutar audio portable</comment>
+ <comment xml:lang="it">Lettore audio portabile</comment>
+ <comment xml:lang="ja">ポータブルオーディオプレイヤー</comment>
+ <comment xml:lang="kk">тасымалы аудио плеер</comment>
+ <comment xml:lang="ko">휴대용 오디오 플레이어</comment>
+ <comment xml:lang="lt">nešiojamasis garso leistuvas</comment>
+ <comment xml:lang="lv">portatīvais audio atskaņotājs</comment>
+ <comment xml:lang="nl">draagbare audiospeler</comment>
+ <comment xml:lang="nn">portable audio layer</comment>
+ <comment xml:lang="pl">Przenośny odtwarzacz dźwięku</comment>
+ <comment xml:lang="pt_BR">reprodutor de áudio portátil</comment>
+ <comment xml:lang="ro">player audio portabil</comment>
+ <comment xml:lang="ru">портативный аудиопроигрыватель</comment>
+ <comment xml:lang="sk">Prenosný hudobný prehrávač</comment>
+ <comment xml:lang="sl">prenosni predvajalnik zvoka</comment>
+ <comment xml:lang="sq">Lexues audio portativ</comment>
+ <comment xml:lang="sv">bärbar ljudspelare</comment>
+ <comment xml:lang="uk">портативний аудіопрогравач</comment>
+ <comment xml:lang="vi">bộ phát nhạc di động</comment>
+ <comment xml:lang="zh_CN">便携式音频播放器</comment>
+ <comment xml:lang="zh_TW">可攜式音訊播放程式</comment>
+ </mime-type>
+
+ <mime-type type="x-content/software">
+
+ <comment>software</comment>
+ <comment xml:lang="ar">برنامج</comment>
+ <comment xml:lang="be@latin">prahrama</comment>
+ <comment xml:lang="bg">Софтуер</comment>
+ <comment xml:lang="ca">programari</comment>
+ <comment xml:lang="cs">Software</comment>
+ <comment xml:lang="da">software</comment>
+ <comment xml:lang="de">Software</comment>
+ <comment xml:lang="es">software</comment>
+ <comment xml:lang="eu">softwarea</comment>
+ <comment xml:lang="fi">ohjelmisto</comment>
+ <comment xml:lang="fo">ritbúnaður</comment>
+ <comment xml:lang="fr">logiciel</comment>
+ <comment xml:lang="ga">bogearraí</comment>
+ <comment xml:lang="gl">software</comment>
+ <comment xml:lang="he">תכנה</comment>
+ <comment xml:lang="hu">szoftver</comment>
+ <comment xml:lang="id">peranti lunak</comment>
+ <comment xml:lang="it">Software</comment>
+ <comment xml:lang="ja">ソフトウェア</comment>
+ <comment xml:lang="kk">бағдарламалық қамтама</comment>
+ <comment xml:lang="ko">소프트웨어</comment>
+ <comment xml:lang="lt">programinė įranga</comment>
+ <comment xml:lang="lv">programmatūra</comment>
+ <comment xml:lang="nl">software</comment>
+ <comment xml:lang="nn">programvare</comment>
+ <comment xml:lang="pl">Oprogramowanie</comment>
+ <comment xml:lang="pt_BR">Aplicação</comment>
+ <comment xml:lang="ro">software</comment>
+ <comment xml:lang="ru">программное обеспечение</comment>
+ <comment xml:lang="sk">Softvér</comment>
+ <comment xml:lang="sl">programska oprema</comment>
+ <comment xml:lang="sq">Software</comment>
+ <comment xml:lang="sv">programvara</comment>
+ <comment xml:lang="uk">програмне забезпечення</comment>
+ <comment xml:lang="vi">phần mềm</comment>
+ <comment xml:lang="zh_CN">软件</comment>
+ <comment xml:lang="zh_TW">軟體</comment>
+ </mime-type>
+
+ <mime-type type="x-content/unix-software">
+
+ <comment>UNIX software</comment>
+ <comment xml:lang="ar">برنامج يونكس</comment>
+ <comment xml:lang="bg">Софтуер за UNIX</comment>
+ <comment xml:lang="ca">programari UNIX</comment>
+ <comment xml:lang="cs">Software UNIX</comment>
+ <comment xml:lang="da">UNIX-programmer</comment>
+ <comment xml:lang="de">UNIX Software</comment>
+ <comment xml:lang="es">software de UNIX</comment>
+ <comment xml:lang="eu">UNIXeko softwarea</comment>
+ <comment xml:lang="fi">UNIX-ohjelmisto</comment>
+ <comment xml:lang="fo">UNIX ritbúnaður</comment>
+ <comment xml:lang="fr">logiciel UNIX</comment>
+ <comment xml:lang="ga">bogearraí UNIX</comment>
+ <comment xml:lang="gl">Software de UNIX</comment>
+ <comment xml:lang="he">תוכנת UNIX</comment>
+ <comment xml:lang="hu">UNIX-szoftver</comment>
+ <comment xml:lang="id">Peranti lunak UNIX</comment>
+ <comment xml:lang="it">Software UNIX</comment>
+ <comment xml:lang="ja">UNIX ソフトウェア</comment>
+ <comment xml:lang="kk">UNIX бағдарламасы</comment>
+ <comment xml:lang="ko">유닉스 소프트웨어</comment>
+ <comment xml:lang="lt">UNIX programinė įranga</comment>
+ <comment xml:lang="lv">UNIX programmatūra</comment>
+ <comment xml:lang="pl">Oprogramowanie systemu UNIX</comment>
+ <comment xml:lang="ro">Software UNIX</comment>
+ <comment xml:lang="ru">программа UNIX</comment>
+ <comment xml:lang="sk">Softvér UNIX</comment>
+ <comment xml:lang="sl">Programska datoteka UNIX</comment>
+ <comment xml:lang="sv">UNIX-programvara</comment>
+ <comment xml:lang="uk">програмне забезпечення UNIX</comment>
+ <comment xml:lang="zh_CN">UNIX 软件</comment>
+ <comment xml:lang="zh_TW">UNIX 軟體</comment>
+ <sub-class-of type="x-content/software"/>
+ <treemagic>
+ <treematch type="file" path=".autorun" match-case="true"/>
+ <treematch type="file" path="autorun" match-case="true"/>
+ <treematch type="file" path="autorun.sh" match-case="true"/>
+ </treemagic>
+ </mime-type>
+
+ <mime-type type="x-content/win32-software">
+
+ <comment>Windows software</comment>
+ <comment xml:lang="ar">برنامج ويندوز</comment>
+ <comment xml:lang="bg">Софтуер — Windows</comment>
+ <comment xml:lang="ca">programari de Windows</comment>
+ <comment xml:lang="cs">Software Windows</comment>
+ <comment xml:lang="da">Windowsprogram</comment>
+ <comment xml:lang="de">Windows-Software</comment>
+ <comment xml:lang="es">software de Windows</comment>
+ <comment xml:lang="eu">Windows-eko softwarea</comment>
+ <comment xml:lang="fi">Windows-ohjelmisto</comment>
+ <comment xml:lang="fo">Windows ritbúnaður</comment>
+ <comment xml:lang="fr">logiciel Windows</comment>
+ <comment xml:lang="ga">bogearraí Windows</comment>
+ <comment xml:lang="gl">Software de Windows</comment>
+ <comment xml:lang="he">תוכנה לWindows</comment>
+ <comment xml:lang="hu">Windows-szoftver</comment>
+ <comment xml:lang="id">Piranti lunak Windows</comment>
+ <comment xml:lang="it">Software Windows</comment>
+ <comment xml:lang="ja">Windows ソフトウェア</comment>
+ <comment xml:lang="kk">Windows бағдарламасы</comment>
+ <comment xml:lang="ko">윈도우 소프트웨어</comment>
+ <comment xml:lang="lt">Windows programinė įranga</comment>
+ <comment xml:lang="lv">Windows programmatūra</comment>
+ <comment xml:lang="pl">Oprogramowanie systemu Windows</comment>
+ <comment xml:lang="ro">Software Windows</comment>
+ <comment xml:lang="ru">программа Windows</comment>
+ <comment xml:lang="sk">Softvér Windows</comment>
+ <comment xml:lang="sl">Programska oprema za okolje Windows</comment>
+ <comment xml:lang="sv">Windows-program</comment>
+ <comment xml:lang="uk">програмне забезпечення Windows</comment>
+ <comment xml:lang="zh_CN">Windows 软件</comment>
+ <comment xml:lang="zh_TW">Windows 軟體</comment>
+ <sub-class-of type="x-content/software"/>
+ <treemagic>
+ <treematch type="file" path="autorun.exe" executable="true"/>
+ <treematch type="file" path="autorun.inf"/>
+ </treemagic>
+ </mime-type>
+
+</mime-info> \ No newline at end of file
diff --git a/src/corelib/mimetypes/mimetypes.pri b/src/corelib/mimetypes/mimetypes.pri
new file mode 100644
index 0000000000..238aa837e2
--- /dev/null
+++ b/src/corelib/mimetypes/mimetypes.pri
@@ -0,0 +1,25 @@
+# Qt core mimetype module
+
+HEADERS += \
+ mimetypes/qmimedatabase.h \
+ mimetypes/qmimetype.h \
+ mimetypes/qmimemagicrulematcher_p.h \
+ mimetypes/qmimetype_p.h \
+ mimetypes/qmimetypeparser_p.h \
+ mimetypes/qmimedatabase_p.h \
+ mimetypes/qmimemagicrule_p.h \
+ mimetypes/qmimeglobpattern_p.h \
+ mimetypes/qmimeprovider_p.h
+
+SOURCES += \
+ mimetypes/qmimedatabase.cpp \
+ mimetypes/qmimetype.cpp \
+ mimetypes/qmimemagicrulematcher.cpp \
+ mimetypes/qmimetypeparser.cpp \
+ mimetypes/qmimemagicrule.cpp \
+ mimetypes/qmimeglobpattern.cpp \
+ mimetypes/qmimeprovider.cpp
+
+RESOURCES += \
+ mimetypes/mimetypes.qrc
+
diff --git a/src/corelib/mimetypes/mimetypes.qrc b/src/corelib/mimetypes/mimetypes.qrc
new file mode 100644
index 0000000000..f0cf47cd49
--- /dev/null
+++ b/src/corelib/mimetypes/mimetypes.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/qt-project.org/qmime">
+ <file alias="freedesktop.org.xml">mime/packages/freedesktop.org.xml</file>
+ </qresource>
+</RCC>
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
new file mode 100644
index 0000000000..a7e14eed24
--- /dev/null
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -0,0 +1,609 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qplatformdefs.h> // always first
+
+#include "qmimedatabase.h"
+
+#include "qmimedatabase_p.h"
+
+#include "qmimeprovider_p.h"
+#include "qmimetype_p.h"
+
+#include <QtCore/QFile>
+#include <QtCore/QFileInfo>
+#include <QtCore/QSet>
+#include <QtCore/QBuffer>
+#include <QtCore/QUrl>
+#include <QtCore/QStack>
+#include <QtCore/QDebug>
+
+#include <algorithm>
+#include <functional>
+
+QT_BEGIN_NAMESPACE
+
+bool qt_isQMimeDatabaseDebuggingActivated (false);
+
+#ifndef QT_NO_DEBUG_OUTPUT
+#define DBG() if (qt_isQMimeDatabaseDebuggingActivated) qDebug() << static_cast<const void *>(this) << Q_FUNC_INFO
+#else
+#define DBG() if (0) qDebug() << static_cast<const void *>(this) << Q_FUNC_INFO
+#endif
+
+Q_GLOBAL_STATIC(QMimeDatabasePrivate, staticQMimeDatabase)
+
+QMimeDatabasePrivate *QMimeDatabasePrivate::instance()
+{
+ return staticQMimeDatabase();
+}
+
+QMimeDatabasePrivate::QMimeDatabasePrivate()
+ : m_provider(0), m_defaultMimeType(QLatin1String("application/octet-stream"))
+{
+}
+
+QMimeDatabasePrivate::~QMimeDatabasePrivate()
+{
+ delete m_provider;
+ m_provider = 0;
+}
+
+QMimeProviderBase *QMimeDatabasePrivate::provider()
+{
+ if (!m_provider) {
+ QMimeProviderBase *binaryProvider = new QMimeBinaryProvider(this);
+ if (binaryProvider->isValid()) {
+ m_provider = binaryProvider;
+ } else {
+ delete binaryProvider;
+ m_provider = new QMimeXMLProvider(this);
+ }
+ }
+ return m_provider;
+}
+
+void QMimeDatabasePrivate::setProvider(QMimeProviderBase *theProvider)
+{
+ delete m_provider;
+ m_provider = theProvider;
+}
+
+/*!
+ \internal
+ Returns a MIME type or an invalid one if none found
+ */
+QMimeType QMimeDatabasePrivate::mimeTypeForName(const QString &nameOrAlias)
+{
+ return provider()->mimeTypeForName(provider()->resolveAlias(nameOrAlias));
+}
+
+QStringList QMimeDatabasePrivate::mimeTypeForFileName(const QString &fileName, QString *foundSuffix)
+{
+ if (fileName.endsWith(QLatin1Char('/')))
+ return QStringList() << QLatin1String("inode/directory");
+
+ const QStringList matchingMimeTypes = provider()->findByFileName(QFileInfo(fileName).fileName(), foundSuffix);
+ return matchingMimeTypes;
+}
+
+static inline bool isTextFile(const QByteArray &data)
+{
+ // UTF16 byte order marks
+ static const char bigEndianBOM[] = "\xFE\xFF";
+ static const char littleEndianBOM[] = "\xFF\xFE";
+ if (data.startsWith(bigEndianBOM) || data.startsWith(littleEndianBOM))
+ return true;
+
+ // Check the first 32 bytes (see shared-mime spec)
+ const char *p = data.constData();
+ const char *e = p + qMin(32, data.size());
+ for ( ; p < e; ++p) {
+ if ((unsigned char)(*p) < 32 && *p != 9 && *p !=10 && *p != 13)
+ return false;
+ }
+
+ return true;
+}
+
+QMimeType QMimeDatabasePrivate::findByData(const QByteArray &data, int *accuracyPtr)
+{
+ if (data.isEmpty()) {
+ *accuracyPtr = 100;
+ return mimeTypeForName(QLatin1String("application/x-zerosize"));
+ }
+
+ *accuracyPtr = 0;
+ QMimeType candidate = provider()->findByMagic(data, accuracyPtr);
+
+ if (candidate.isValid())
+ return candidate;
+
+ if (isTextFile(data)) {
+ *accuracyPtr = 5;
+ return mimeTypeForName(QLatin1String("text/plain"));
+ }
+
+ return mimeTypeForName(defaultMimeType());
+}
+
+QMimeType QMimeDatabasePrivate::mimeTypeForNameAndData(const QString &fileName, QIODevice *device, int *accuracyPtr)
+{
+ // First, glob patterns are evaluated. If there is a match with max weight,
+ // this one is selected and we are done. Otherwise, the file contents are
+ // evaluated and the match with the highest value (either a magic priority or
+ // a glob pattern weight) is selected. Matching starts from max level (most
+ // specific) in both cases, even when there is already a suffix matching candidate.
+ *accuracyPtr = 0;
+
+ // Pass 1) Try to match on the file name
+ QStringList candidatesByName = mimeTypeForFileName(fileName);
+ if (candidatesByName.count() == 1) {
+ *accuracyPtr = 100;
+ const QMimeType mime = mimeTypeForName(candidatesByName.at(0));
+ if (mime.isValid())
+ return mime;
+ candidatesByName.clear();
+ }
+
+ // Extension is unknown, or matches multiple mimetypes.
+ // Pass 2) Match on content, if we can read the data
+ if (device->isOpen()) {
+
+ // Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h).
+ // This is much faster than seeking back and forth into QIODevice.
+ const QByteArray data = device->peek(16384);
+
+ int magicAccuracy = 0;
+ QMimeType candidateByData(findByData(data, &magicAccuracy));
+
+ // Disambiguate conflicting extensions (if magic matching found something)
+ if (candidateByData.isValid() && magicAccuracy > 0) {
+ // "for glob_match in glob_matches:"
+ // "if glob_match is subclass or equal to sniffed_type, use glob_match"
+ const QString sniffedMime = candidateByData.name();
+ foreach (const QString &m, candidatesByName) {
+ if (inherits(m, sniffedMime)) {
+ // We have magic + pattern pointing to this, so it's a pretty good match
+ *accuracyPtr = 100;
+ return mimeTypeForName(m);
+ }
+ }
+ *accuracyPtr = magicAccuracy;
+ return candidateByData;
+ }
+ }
+
+ if (candidatesByName.count() > 1) {
+ *accuracyPtr = 20;
+ candidatesByName.sort(); // to make it deterministic
+ const QMimeType mime = mimeTypeForName(candidatesByName.at(0));
+ if (mime.isValid())
+ return mime;
+ }
+
+ return mimeTypeForName(defaultMimeType());
+}
+
+QList<QMimeType> QMimeDatabasePrivate::allMimeTypes()
+{
+ return provider()->allMimeTypes();
+}
+
+bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
+{
+ const QString resolvedParent = provider()->resolveAlias(parent);
+ //Q_ASSERT(provider()->resolveAlias(mime) == mime);
+ QStack<QString> toCheck;
+ toCheck.push(mime);
+ while (!toCheck.isEmpty()) {
+ const QString current = toCheck.pop();
+ if (current == resolvedParent)
+ return true;
+ foreach (const QString &par, provider()->parents(current))
+ toCheck.push(par);
+ }
+ return false;
+}
+
+/*!
+ \class QMimeDatabase
+ \brief The QMimeDatabase class maintains a database of MIME types.
+
+ \since 5.0
+
+ The MIME type database is provided by the freedesktop.org shared-mime-info
+ project. If the MIME type database cannot be found on the system, as is the case
+ on most Windows and Mac OS X systems, Qt will use its own copy of it.
+
+ Applications which want to define custom MIME types need to install an
+ XML file into the locations searched for MIME definitions.
+ These locations can be queried with
+ \code
+ QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/packages"),
+ QStandardPaths::LocateDirectory);
+ \endcode
+ On a typical Unix system, this will be /usr/share/mime/packages/, but it is also
+ possible to extend the list of directories by setting the environment variable
+ XDG_DATA_DIRS. For instance adding /opt/myapp/share to XDG_DATA_DIRS will result
+ in /opt/myapp/share/mime/packages/ being searched for MIME definitions.
+
+ Here is an example of MIME XML:
+ \code
+ <?xml version="1.0" encoding="UTF-8"?>
+ <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/vnd.nokia.qt.qmakeprofile">
+ <comment xml:lang="en">Qt qmake Profile</comment>
+ <glob pattern="*.pro" weight="50"/>
+ </mime-type>
+ </mime-info>
+ \endcode
+
+ For more details about the syntax of XML MIME definitions, including defining
+ "magic" in order to detect MIME types based on data as well, read the
+ Shared Mime Info specification at
+ http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
+
+ On Unix systems, a binary cache is used for more performance. This cache is generated
+ by the command "update-mime-database path", where path would be /opt/myapp/share/mime
+ in the above example. Make sure to run this command when installing the MIME type
+ definition file.
+
+ \threadsafe
+
+ \snippet doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp 0
+
+ \sa QMimeType
+ */
+
+/*!
+ \fn QMimeDatabase::QMimeDatabase();
+ Constructs this QMimeDatabase object.
+ */
+QMimeDatabase::QMimeDatabase() :
+ d(staticQMimeDatabase())
+{
+ DBG();
+}
+
+/*!
+ \fn QMimeDatabase::~QMimeDatabase();
+ Destroys the QMimeDatabase object.
+ */
+QMimeDatabase::~QMimeDatabase()
+{
+ DBG();
+
+ d = 0;
+}
+
+/*!
+ \fn QMimeType QMimeDatabase::mimeTypeForName(const QString &nameOrAlias) const;
+ Returns a MIME type for \a nameOrAlias or an invalid one if none found.
+ */
+QMimeType QMimeDatabase::mimeTypeForName(const QString &nameOrAlias) const
+{
+ QMutexLocker locker(&d->mutex);
+
+ return d->mimeTypeForName(nameOrAlias);
+}
+
+/*!
+ Returns a MIME type for \a fileInfo.
+
+ A valid MIME type is always returned.
+
+ The default matching algorithm looks at both the file name and the file
+ contents, if necessary. The file extension has priority over the contents,
+ but the contents will be used if the file extension is unknown, or
+ matches multiple MIME types.
+ If \a fileInfo is a Unix symbolic link, the file that it refers to
+ will be used instead.
+ If the file doesn't match any known pattern or data, the default MIME type
+ (application/octet-stream) is returned.
+
+ When \a mode is set to MatchExtension, only the file name is used, not
+ the file contents. The file doesn't even have to exist. If the file name
+ doesn't match any known pattern, the default MIME type (application/octet-stream)
+ is returned.
+ If multiple MIME types match this file, the first one (alphabetically) is returned.
+
+ When \a mode is set to MatchContent, and the file is readable, only the
+ file contents are used to determine the MIME type. This is equivalent to
+ calling mimeTypeForData with a QFile as input device.
+
+ In all cases, the \a fileName can also include an absolute or relative path.
+
+ \sa isDefault, mimeTypeForData
+*/
+QMimeType QMimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode) const
+{
+ DBG() << "fileInfo" << fileInfo.absoluteFilePath();
+
+ QMutexLocker locker(&d->mutex);
+
+ if (fileInfo.isDir())
+ return d->mimeTypeForName(QLatin1String("inode/directory"));
+
+ QFile file(fileInfo.absoluteFilePath());
+
+#ifdef Q_OS_UNIX
+ // Cannot access statBuf.st_mode from the filesystem engine, so we have to stat again.
+ const QByteArray nativeFilePath = QFile::encodeName(file.fileName());
+ QT_STATBUF statBuffer;
+ if (QT_LSTAT(nativeFilePath.constData(), &statBuffer) == 0) {
+ if (S_ISCHR(statBuffer.st_mode))
+ return d->mimeTypeForName(QLatin1String("inode/chardevice"));
+ if (S_ISBLK(statBuffer.st_mode))
+ return d->mimeTypeForName(QLatin1String("inode/blockdevice"));
+ if (S_ISFIFO(statBuffer.st_mode))
+ return d->mimeTypeForName(QLatin1String("inode/fifo"));
+ if (S_ISSOCK(statBuffer.st_mode))
+ return d->mimeTypeForName(QLatin1String("inode/socket"));
+ }
+#endif
+
+ int priority = 0;
+ switch (mode) {
+ case MatchDefault:
+ file.open(QIODevice::ReadOnly); // isOpen() will be tested by method below
+ return d->mimeTypeForNameAndData(fileInfo.absoluteFilePath(), &file, &priority);
+ case MatchExtension:
+ locker.unlock();
+ return mimeTypeForFile(fileInfo.absoluteFilePath(), mode);
+ case MatchContent:
+ if (file.open(QIODevice::ReadOnly)) {
+ locker.unlock();
+ return mimeTypeForData(&file);
+ } else {
+ return d->mimeTypeForName(d->defaultMimeType());
+ }
+ default:
+ Q_ASSERT(false);
+ }
+ return d->mimeTypeForName(d->defaultMimeType());
+}
+
+/*!
+ Returns a MIME type for the file named \a fileName using \a mode.
+
+ \overload
+*/
+QMimeType QMimeDatabase::mimeTypeForFile(const QString &fileName, MatchMode mode) const
+{
+ if (mode == MatchExtension) {
+ QMutexLocker locker(&d->mutex);
+ QStringList matches = d->mimeTypeForFileName(fileName);
+ const int matchCount = matches.count();
+ if (matchCount == 0) {
+ return d->mimeTypeForName(d->defaultMimeType());
+ } else if (matchCount == 1) {
+ return d->mimeTypeForName(matches.first());
+ } else {
+ // We have to pick one.
+ matches.sort(); // Make it deterministic
+ return d->mimeTypeForName(matches.first());
+ }
+ } else {
+ // Implemented as a wrapper around mimeTypeForFile(QFileInfo), so no mutex.
+ QFileInfo fileInfo(fileName);
+ return mimeTypeForFile(fileInfo);
+ }
+}
+
+/*!
+ \fn QMimeType QMimeDatabase::findMimeTypesByFileName(const QString &fileName) const;
+ Returns the MIME types for the file name \a fileName.
+
+ If the file name doesn't match any known pattern, an empty list is returned.
+ If multiple MIME types match this file, they are all returned.
+
+ This function does not try to open the file. To also use the content
+ when determining the MIME type, use mimeTypeForFile() or
+ mimeTypeForNameAndData() instead.
+
+ \sa mimeTypeForFile
+*/
+QList<QMimeType> QMimeDatabase::mimeTypesForFileName(const QString &fileName) const
+{
+ QMutexLocker locker(&d->mutex);
+
+ QStringList matches = d->mimeTypeForFileName(fileName);
+ QList<QMimeType> mimes;
+ matches.sort(); // Make it deterministic
+ foreach (const QString &mime, matches)
+ mimes.append(d->mimeTypeForName(mime));
+ return mimes;
+}
+/*!
+ Returns the suffix for the file \a fileName, as known by the MIME database.
+
+ This allows to pre-select "tar.bz2" for foo.tar.bz2, but still only
+ "txt" for my.file.with.dots.txt.
+*/
+QString QMimeDatabase::suffixForFileName(const QString &fileName) const
+{
+ QMutexLocker locker(&d->mutex);
+ QString foundSuffix;
+ d->mimeTypeForFileName(fileName, &foundSuffix);
+ return foundSuffix;
+}
+
+/*!
+ Returns a MIME type for \a data.
+
+ A valid MIME type is always returned. If \a data doesn't match any
+ known MIME type data, the default MIME type (application/octet-stream)
+ is returned.
+*/
+QMimeType QMimeDatabase::mimeTypeForData(const QByteArray &data) const
+{
+ QMutexLocker locker(&d->mutex);
+
+ int accuracy = 0;
+ return d->findByData(data, &accuracy);
+}
+
+/*!
+ Returns a MIME type for the data in \a device.
+
+ A valid MIME type is always returned. If the data in \a device doesn't match any
+ known MIME type data, the default MIME type (application/octet-stream)
+ is returned.
+*/
+QMimeType QMimeDatabase::mimeTypeForData(QIODevice *device) const
+{
+ QMutexLocker locker(&d->mutex);
+
+ int accuracy = 0;
+ const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
+ if (device->isOpen()) {
+ // Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h).
+ // This is much faster than seeking back and forth into QIODevice.
+ const QByteArray data = device->peek(16384);
+ const QMimeType result = d->findByData(data, &accuracy);
+ if (openedByUs)
+ device->close();
+ return result;
+ }
+ return d->mimeTypeForName(d->defaultMimeType());
+}
+
+/*!
+ Returns a MIME type for \a url.
+
+ If the URL is a local file, this calls mimeTypeForFile.
+
+ Otherwise the matching is done based on the file name only,
+ except for schemes where file names don't mean much, like HTTP.
+ This method always returns the default mimetype for HTTP URLs,
+ use QNetworkAccessManager to handle HTTP URLs properly.
+
+ A valid MIME type is always returned. If \a url doesn't match any
+ known MIME type data, the default MIME type (application/octet-stream)
+ is returned.
+*/
+QMimeType QMimeDatabase::mimeTypeForUrl(const QUrl &url) const
+{
+ if (url.isLocalFile())
+ return mimeTypeForFile(url.toLocalFile());
+
+ const QString scheme = url.scheme();
+ if (scheme.startsWith(QLatin1String("http")))
+ return mimeTypeForName(d->defaultMimeType());
+
+ return mimeTypeForFile(url.path());
+}
+
+/*!
+ Returns a MIME type for the given \a fileName and \a device data.
+
+ This overload can be useful when the file is remote, and we started to
+ download some of its data in a device. This allows to do full MIME type
+ matching for remote files as well.
+
+ If the device is not open, it will be opened by this function, and closed
+ after the MIME type detection is completed.
+
+ A valid MIME type is always returned. If \a device data doesn't match any
+ known MIME type data, the default MIME type (application/octet-stream)
+ is returned.
+
+ This method looks at both the file name and the file contents,
+ if necessary. The file extension has priority over the contents,
+ but the contents will be used if the file extension is unknown, or
+ matches multiple MIME types.
+*/
+QMimeType QMimeDatabase::mimeTypeForNameAndData(const QString &fileName, QIODevice *device) const
+{
+ DBG() << "fileName" << fileName;
+
+ int accuracy = 0;
+ const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
+ const QMimeType result = d->mimeTypeForNameAndData(fileName, device, &accuracy);
+ if (openedByUs)
+ device->close();
+ return result;
+}
+
+/*!
+ Returns a MIME type for the given \a fileName and device \a data.
+
+ This overload can be useful when the file is remote, and we started to
+ download some of its data. This allows to do full MIME type matching for
+ remote files as well.
+
+ A valid MIME type is always returned. If \a data doesn't match any
+ known MIME type data, the default MIME type (application/octet-stream)
+ is returned.
+
+ This method looks at both the file name and the file contents,
+ if necessary. The file extension has priority over the contents,
+ but the contents will be used if the file extension is unknown, or
+ matches multiple MIME types.
+*/
+QMimeType QMimeDatabase::mimeTypeForNameAndData(const QString &fileName, const QByteArray &data) const
+{
+ DBG() << "fileName" << fileName;
+
+ QBuffer buffer(const_cast<QByteArray *>(&data));
+ buffer.open(QIODevice::ReadOnly);
+ int accuracy = 0;
+ return d->mimeTypeForNameAndData(fileName, &buffer, &accuracy);
+}
+
+/*!
+ Returns the list of all available MIME types.
+
+ This can be useful for showing all MIME types to the user, for instance
+ in a MIME type editor. Do not use unless really necessary in other cases
+ though, prefer using the mimeTypeFor* methods for performance reasons.
+*/
+QList<QMimeType> QMimeDatabase::allMimeTypes() const
+{
+ QMutexLocker locker(&d->mutex);
+
+ return d->allMimeTypes();
+}
+
+#undef DBG
+
+QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimedatabase.h b/src/corelib/mimetypes/qmimedatabase.h
new file mode 100644
index 0000000000..cfd1cfe33d
--- /dev/null
+++ b/src/corelib/mimetypes/qmimedatabase.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QMIMEDATABASE_H
+#define QMIMEDATABASE_H
+
+#include "qmimetype.h"
+
+#include <QtCore/qstringlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QByteArray;
+class QFileInfo;
+class QIODevice;
+class QUrl;
+
+class QMimeDatabasePrivate;
+class Q_CORE_EXPORT QMimeDatabase
+{
+ Q_DISABLE_COPY(QMimeDatabase)
+
+public:
+ QMimeDatabase();
+ ~QMimeDatabase();
+
+ QMimeType mimeTypeForName(const QString &nameOrAlias) const;
+
+ enum MatchMode {
+ MatchDefault = 0x0,
+ MatchExtension = 0x1,
+ MatchContent = 0x2
+ };
+
+ QMimeType mimeTypeForFile(const QString &fileName, MatchMode mode = MatchDefault) const;
+ QMimeType mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode = MatchDefault) const;
+ QList<QMimeType> mimeTypesForFileName(const QString &fileName) const;
+
+ QMimeType mimeTypeForData(const QByteArray &data) const;
+ QMimeType mimeTypeForData(QIODevice *device) const;
+
+ QMimeType mimeTypeForUrl(const QUrl &url) const;
+ QMimeType mimeTypeForNameAndData(const QString &fileName, QIODevice *device) const;
+ QMimeType mimeTypeForNameAndData(const QString &fileName, const QByteArray &data) const;
+
+ QString suffixForFileName(const QString &fileName) const;
+
+ QList<QMimeType> allMimeTypes() const;
+
+private:
+ QMimeDatabasePrivate *d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMIMEDATABASE_H
diff --git a/src/corelib/mimetypes/qmimedatabase_p.h b/src/corelib/mimetypes/qmimedatabase_p.h
new file mode 100644
index 0000000000..7e98548a35
--- /dev/null
+++ b/src/corelib/mimetypes/qmimedatabase_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QMIMEDATABASE_P_H
+#define QMIMEDATABASE_P_H
+
+#include <QtCore/qhash.h>
+#include <QtCore/qmutex.h>
+
+#include "qmimetype.h"
+#include "qmimetype_p.h"
+#include "qmimeglobpattern_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QMimeDatabase;
+class QMimeProviderBase;
+
+class QMimeDatabasePrivate
+{
+public:
+ Q_DISABLE_COPY(QMimeDatabasePrivate)
+
+ QMimeDatabasePrivate();
+ ~QMimeDatabasePrivate();
+
+ static QMimeDatabasePrivate *instance();
+
+ QMimeProviderBase *provider();
+ void setProvider(QMimeProviderBase *theProvider);
+
+ inline QString defaultMimeType() const { return m_defaultMimeType; }
+
+ bool inherits(const QString &mime, const QString &parent);
+
+ QList<QMimeType> allMimeTypes();
+
+
+ QMimeType mimeTypeForName(const QString &nameOrAlias);
+ QMimeType mimeTypeForNameAndData(const QString &fileName, QIODevice *device, int *priorityPtr);
+ QMimeType findByData(const QByteArray &data, int *priorityPtr);
+ QStringList mimeTypeForFileName(const QString &fileName, QString *foundSuffix = 0);
+
+ mutable QMimeProviderBase *m_provider;
+ const QString m_defaultMimeType;
+ QMutex mutex;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMIMEDATABASE_P_H
diff --git a/src/corelib/mimetypes/qmimeglobpattern.cpp b/src/corelib/mimetypes/qmimeglobpattern.cpp
new file mode 100644
index 0000000000..de26dbaf15
--- /dev/null
+++ b/src/corelib/mimetypes/qmimeglobpattern.cpp
@@ -0,0 +1,240 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmimeglobpattern_p.h"
+
+#include <QRegExp>
+#include <QStringList>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ \class QMimeGlobMatchResult
+ \brief The QMimeGlobMatchResult class accumulates results from glob matching.
+
+ Handles glob weights, and preferring longer matches over shorter matches.
+*/
+
+void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const QString &pattern)
+{
+ // Is this a lower-weight pattern than the last match? Skip this match then.
+ if (weight < m_weight)
+ return;
+ bool replace = weight > m_weight;
+ if (!replace) {
+ // Compare the length of the match
+ if (pattern.length() < m_matchingPatternLength)
+ return; // too short, ignore
+ else if (pattern.length() > m_matchingPatternLength) {
+ // longer: clear any previous match (like *.bz2, when pattern is *.tar.bz2)
+ replace = true;
+ }
+ }
+ if (replace) {
+ m_matchingMimeTypes.clear();
+ // remember the new "longer" length
+ m_matchingPatternLength = pattern.length();
+ m_weight = weight;
+ }
+ m_matchingMimeTypes.append(mimeType);
+ if (pattern.startsWith(QLatin1String("*.")))
+ m_foundSuffix = pattern.mid(2);
+}
+
+/*!
+ \internal
+ \class QMimeGlobPattern
+ \brief The QMimeGlobPattern class contains the glob pattern for file names for MIME type matching.
+
+ \sa QMimeType, QMimeDatabase, QMimeMagicRuleMatcher, QMimeMagicRule
+*/
+
+bool QMimeGlobPattern::matchFileName(const QString &inputFilename) const
+{
+ // "Applications MUST match globs case-insensitively, except when the case-sensitive
+ // attribute is set to true."
+ // The constructor takes care of putting case-insensitive patterns in lowercase.
+ const QString filename = m_caseSensitivity == Qt::CaseInsensitive ? inputFilename.toLower() : inputFilename;
+
+ const int pattern_len = m_pattern.length();
+ if (!pattern_len)
+ return false;
+ const int len = filename.length();
+
+ const int starCount = m_pattern.count(QLatin1Char('*'));
+
+ // Patterns like "*~", "*.extension"
+ if (m_pattern[0] == QLatin1Char('*') && m_pattern.indexOf(QLatin1Char('[')) == -1 && starCount == 1)
+ {
+ if (len + 1 < pattern_len) return false;
+
+ const QChar *c1 = m_pattern.unicode() + pattern_len - 1;
+ const QChar *c2 = filename.unicode() + len - 1;
+ int cnt = 1;
+ while (cnt < pattern_len && *c1-- == *c2--)
+ ++cnt;
+ return cnt == pattern_len;
+ }
+
+ // Patterns like "README*" (well this is currently the only one like that...)
+ if (starCount == 1 && m_pattern.at(pattern_len - 1) == QLatin1Char('*')) {
+ if (len + 1 < pattern_len) return false;
+ if (m_pattern.at(0) == QLatin1Char('*'))
+ return filename.indexOf(m_pattern.mid(1, pattern_len - 2)) != -1;
+
+ const QChar *c1 = m_pattern.unicode();
+ const QChar *c2 = filename.unicode();
+ int cnt = 1;
+ while (cnt < pattern_len && *c1++ == *c2++)
+ ++cnt;
+ return cnt == pattern_len;
+ }
+
+ // Names without any wildcards like "README"
+ if (m_pattern.indexOf(QLatin1Char('[')) == -1 && starCount == 0 && m_pattern.indexOf(QLatin1Char('?')))
+ return (m_pattern == filename);
+
+ // Other (quite rare) patterns, like "*.anim[1-9j]": use slow but correct method
+ const QRegExp rx(m_pattern, Qt::CaseSensitive, QRegExp::WildcardUnix);
+ return rx.exactMatch(filename);
+}
+
+static bool isFastPattern(const QString &pattern)
+{
+ // starts with "*.", has no other '*' and no other '.'
+ return pattern.lastIndexOf(QLatin1Char('*')) == 0
+ && pattern.lastIndexOf(QLatin1Char('.')) == 1
+ // and contains no other special character
+ && !pattern.contains(QLatin1Char('?'))
+ && !pattern.contains(QLatin1Char('['))
+ ;
+}
+
+void QMimeAllGlobPatterns::addGlob(const QMimeGlobPattern &glob)
+{
+ const QString &pattern = glob.pattern();
+ Q_ASSERT(!pattern.isEmpty());
+
+ // Store each patterns into either m_fastPatternDict (*.txt, *.html etc. with default weight 50)
+ // or for the rest, like core.*, *.tar.bz2, *~, into highWeightPatternOffset (>50)
+ // or lowWeightPatternOffset (<=50)
+
+ if (glob.weight() == 50 && isFastPattern(pattern) && !glob.isCaseSensitive()) {
+ // The bulk of the patterns is *.foo with weight 50 --> those go into the fast patterns hash.
+ const QString extension = pattern.mid(2).toLower();
+ QStringList &patterns = m_fastPatterns[extension]; // find or create
+ // This would just slow things down: if (!patterns.contains(glob.mimeType()))
+ patterns.append(glob.mimeType());
+ } else {
+ if (glob.weight() > 50) {
+ // This would just slow things down: if (!m_highWeightGlobs.hasPattern(glob.mimeType(), glob.pattern()))
+ m_highWeightGlobs.append(glob);
+ } else {
+ //This would just slow things down: if (!m_lowWeightGlobs.hasPattern(glob.mimeType(), glob.pattern()))
+ m_lowWeightGlobs.append(glob);
+ }
+ }
+}
+
+void QMimeAllGlobPatterns::removeMimeType(const QString &mimeType)
+{
+ QMutableHashIterator<QString, QStringList> it(m_fastPatterns);
+ while (it.hasNext()) {
+ it.next().value().removeAll(mimeType);
+ }
+ m_highWeightGlobs.removeMimeType(mimeType);
+ m_lowWeightGlobs.removeMimeType(mimeType);
+}
+
+void QMimeGlobPatternList::match(QMimeGlobMatchResult &result,
+ const QString &fileName) const
+{
+
+ QMimeGlobPatternList::const_iterator it = this->constBegin();
+ const QMimeGlobPatternList::const_iterator endIt = this->constEnd();
+ for (; it != endIt; ++it) {
+ const QMimeGlobPattern &glob = *it;
+ if (glob.matchFileName(fileName))
+ result.addMatch(glob.mimeType(), glob.weight(), glob.pattern());
+ }
+}
+
+QStringList QMimeAllGlobPatterns::matchingGlobs(const QString &fileName, QString *foundSuffix) const
+{
+ // First try the high weight matches (>50), if any.
+ QMimeGlobMatchResult result;
+ m_highWeightGlobs.match(result, fileName);
+ if (result.m_matchingMimeTypes.isEmpty()) {
+
+ // Now use the "fast patterns" dict, for simple *.foo patterns with weight 50
+ // (which is most of them, so this optimization is definitely worth it)
+ const int lastDot = fileName.lastIndexOf(QLatin1Char('.'));
+ if (lastDot != -1) { // if no '.', skip the extension lookup
+ const int ext_len = fileName.length() - lastDot - 1;
+ const QString simpleExtension = fileName.right(ext_len).toLower();
+ // (toLower because fast patterns are always case-insensitive and saved as lowercase)
+
+ const QStringList matchingMimeTypes = m_fastPatterns.value(simpleExtension);
+ foreach (const QString &mime, matchingMimeTypes) {
+ result.addMatch(mime, 50, QLatin1String("*.") + simpleExtension);
+ }
+ // Can't return yet; *.tar.bz2 has to win over *.bz2, so we need the low-weight mimetypes anyway,
+ // at least those with weight 50.
+ }
+
+ // Finally, try the low weight matches (<=50)
+ m_lowWeightGlobs.match(result, fileName);
+ }
+ if (foundSuffix)
+ *foundSuffix = result.m_foundSuffix;
+ return result.m_matchingMimeTypes;
+}
+
+void QMimeAllGlobPatterns::clear()
+{
+ m_fastPatterns.clear();
+ m_highWeightGlobs.clear();
+ m_lowWeightGlobs.clear();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimeglobpattern_p.h b/src/corelib/mimetypes/qmimeglobpattern_p.h
new file mode 100644
index 0000000000..b64a0e2f2b
--- /dev/null
+++ b/src/corelib/mimetypes/qmimeglobpattern_p.h
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMIMEGLOBPATTERN_P_H
+#define QMIMEGLOBPATTERN_P_H
+
+#include <QtCore/qstringlist.h>
+#include <QtCore/qhash.h>
+
+QT_BEGIN_NAMESPACE
+
+struct QMimeGlobMatchResult
+{
+ QMimeGlobMatchResult()
+ : m_weight(0), m_matchingPatternLength(0)
+ {}
+
+ void addMatch(const QString &mimeType, int weight, const QString &pattern);
+
+ QStringList m_matchingMimeTypes;
+ int m_weight;
+ int m_matchingPatternLength;
+ QString m_foundSuffix;
+};
+
+class QMimeGlobPattern
+{
+public:
+ static const unsigned MaxWeight = 100;
+ static const unsigned DefaultWeight = 50;
+ static const unsigned MinWeight = 1;
+
+ explicit QMimeGlobPattern(const QString &thePattern, const QString &theMimeType, unsigned theWeight = DefaultWeight, Qt::CaseSensitivity s = Qt::CaseInsensitive) :
+ m_pattern(thePattern), m_mimeType(theMimeType), m_weight(theWeight), m_caseSensitivity(s)
+ {
+ if (s == Qt::CaseInsensitive) {
+ m_pattern = m_pattern.toLower();
+ }
+ }
+ ~QMimeGlobPattern() {}
+
+ bool matchFileName(const QString &filename) const;
+
+ inline const QString &pattern() const { return m_pattern; }
+ inline unsigned weight() const { return m_weight; }
+ inline const QString &mimeType() const { return m_mimeType; }
+ inline bool isCaseSensitive() const { return m_caseSensitivity == Qt::CaseSensitive; }
+
+private:
+ QString m_pattern;
+ QString m_mimeType;
+ int m_weight;
+ Qt::CaseSensitivity m_caseSensitivity;
+};
+
+class QMimeGlobPatternList : public QList<QMimeGlobPattern>
+{
+public:
+ bool hasPattern(const QString &mimeType, const QString &pattern) const
+ {
+ const_iterator it = begin();
+ const const_iterator myend = end();
+ for (; it != myend; ++it)
+ if ((*it).pattern() == pattern && (*it).mimeType() == mimeType)
+ return true;
+ return false;
+ }
+
+ /*!
+ "noglobs" is very rare occurrence, so it's ok if it's slow
+ */
+ void removeMimeType(const QString &mimeType)
+ {
+ QMutableListIterator<QMimeGlobPattern> it(*this);
+ while (it.hasNext()) {
+ if (it.next().mimeType() == mimeType)
+ it.remove();
+ }
+ }
+
+ void match(QMimeGlobMatchResult &result, const QString &fileName) const;
+};
+
+/*!
+ Result of the globs parsing, as data structures ready for efficient MIME type matching.
+ This contains:
+ 1) a map of fast regular patterns (e.g. *.txt is stored as "txt" in a qhash's key)
+ 2) a linear list of high-weight globs
+ 3) a linear list of low-weight globs
+ */
+class QMimeAllGlobPatterns
+{
+public:
+ typedef QHash<QString, QStringList> PatternsMap; // MIME type -> patterns
+
+ void addGlob(const QMimeGlobPattern &glob);
+ void removeMimeType(const QString &mimeType);
+ QStringList matchingGlobs(const QString &fileName, QString *foundSuffix) const;
+ void clear();
+
+ PatternsMap m_fastPatterns; // example: "doc" -> "application/msword", "text/plain"
+ QMimeGlobPatternList m_highWeightGlobs;
+ QMimeGlobPatternList m_lowWeightGlobs; // <= 50, including the non-fast 50 patterns
+};
+
+QT_END_NAMESPACE
+
+#endif // QMIMEGLOBPATTERN_P_H
diff --git a/src/corelib/mimetypes/qmimemagicrule.cpp b/src/corelib/mimetypes/qmimemagicrule.cpp
new file mode 100644
index 0000000000..1dee62f6d0
--- /dev/null
+++ b/src/corelib/mimetypes/qmimemagicrule.cpp
@@ -0,0 +1,387 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#define QT_NO_CAST_FROM_ASCII
+
+#include "qmimemagicrule_p.h"
+
+#include <QtCore/QList>
+#include <QtCore/QDebug>
+#include <qendian.h>
+
+QT_BEGIN_NAMESPACE
+
+// in the same order as Type!
+static const char magicRuleTypes_string[] =
+ "invalid\0"
+ "string\0"
+ "host16\0"
+ "host32\0"
+ "big16\0"
+ "big32\0"
+ "little16\0"
+ "little32\0"
+ "byte\0"
+ "\0";
+
+static const int magicRuleTypes_indices[] = {
+ 0, 8, 15, 22, 29, 35, 41, 50, 59, 65, 0
+};
+
+QMimeMagicRule::Type QMimeMagicRule::type(const QByteArray &theTypeName)
+{
+ for (int i = String; i <= Byte; ++i) {
+ if (theTypeName == magicRuleTypes_string + magicRuleTypes_indices[i])
+ return Type(i);
+ }
+ return Invalid;
+}
+
+QByteArray QMimeMagicRule::typeName(QMimeMagicRule::Type theType)
+{
+ return magicRuleTypes_string + magicRuleTypes_indices[theType];
+}
+
+class QMimeMagicRulePrivate
+{
+public:
+ bool operator==(const QMimeMagicRulePrivate &other) const;
+
+ QMimeMagicRule::Type type;
+ QByteArray value;
+ int startPos;
+ int endPos;
+ QByteArray mask;
+
+ QByteArray pattern;
+ quint32 number;
+ quint32 numberMask;
+
+ typedef bool (*MatchFunction)(const QMimeMagicRulePrivate *d, const QByteArray &data);
+ MatchFunction matchFunction;
+};
+
+bool QMimeMagicRulePrivate::operator==(const QMimeMagicRulePrivate &other) const
+{
+ return type == other.type &&
+ value == other.value &&
+ startPos == other.startPos &&
+ endPos == other.endPos &&
+ mask == other.mask &&
+ pattern == other.pattern &&
+ number == other.number &&
+ numberMask == other.numberMask &&
+ matchFunction == other.matchFunction;
+}
+
+// Used by both providers
+bool QMimeMagicRule::matchSubstring(const char *dataPtr, int dataSize, int rangeStart, int rangeLength,
+ int valueLength, const char *valueData, const char *mask)
+{
+ // Size of searched data.
+ // Example: value="ABC", rangeLength=3 -> we need 3+3-1=5 bytes (ABCxx,xABCx,xxABC would match)
+ const int dataNeeded = qMin(rangeLength + valueLength - 1, dataSize - rangeStart);
+
+ if (!mask) {
+ // callgrind says QByteArray::indexOf is much slower, since our strings are typically too
+ // short for be worth Boyer-Moore matching (1 to 71 bytes, 11 bytes on average).
+ bool found = false;
+ for (int i = rangeStart; i < rangeStart + rangeLength; ++i) {
+ if (i + valueLength > dataSize)
+ break;
+
+ if (memcmp(valueData, dataPtr + i, valueLength) == 0) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ return false;
+ } else {
+ bool found = false;
+ const char *readDataBase = dataPtr + rangeStart;
+ // Example (continued from above):
+ // deviceSize is 4, so dataNeeded was max'ed to 4.
+ // maxStartPos = 4 - 3 + 1 = 2, and indeed
+ // we need to check for a match a positions 0 and 1 (ABCx and xABC).
+ const int maxStartPos = dataNeeded - valueLength + 1;
+ for (int i = 0; i < maxStartPos; ++i) {
+ const char *d = readDataBase + i;
+ bool valid = true;
+ for (int idx = 0; idx < valueLength; ++idx) {
+ if (((*d++) & mask[idx]) != (valueData[idx] & mask[idx])) {
+ valid = false;
+ break;
+ }
+ }
+ if (valid)
+ found = true;
+ }
+ if (!found)
+ return false;
+ }
+ //qDebug() << "Found" << value << "in" << searchedData;
+ return true;
+}
+
+static bool matchString(const QMimeMagicRulePrivate *d, const QByteArray &data)
+{
+ const int rangeLength = d->endPos - d->startPos + 1;
+ return QMimeMagicRule::matchSubstring(data.constData(), data.size(), d->startPos, rangeLength, d->pattern.size(), d->pattern.constData(), d->mask.constData());
+}
+
+template <typename T>
+static bool matchNumber(const QMimeMagicRulePrivate *d, const QByteArray &data)
+{
+ const T value(d->number);
+ const T mask(d->numberMask);
+
+ //qDebug() << "matchNumber" << "0x" << QString::number(d->number, 16) << "size" << sizeof(T);
+ //qDebug() << "mask" << QString::number(d->numberMask, 16);
+
+ const char *p = data.constData() + d->startPos;
+ const char *e = data.constData() + qMin(data.size() - int(sizeof(T)), d->endPos + 1);
+ for ( ; p <= e; ++p) {
+ if ((*reinterpret_cast<const T*>(p) & mask) == (value & mask))
+ return true;
+ }
+
+ return false;
+}
+
+static inline QByteArray makePattern(const QByteArray &value)
+{
+ QByteArray pattern(value.size(), Qt::Uninitialized);
+ char *data = pattern.data();
+
+ const char *p = value.constData();
+ const char *e = p + value.size();
+ for ( ; p < e; ++p) {
+ if (*p == '\\' && ++p < e) {
+ if (*p == 'x') { // hex (\\xff)
+ char c = 0;
+ for (int i = 0; i < 2 && p + 1 < e; ++i) {
+ ++p;
+ if (*p >= '0' && *p <= '9')
+ c = (c << 4) + *p - '0';
+ else if (*p >= 'a' && *p <= 'f')
+ c = (c << 4) + *p - 'a' + 10;
+ else if (*p >= 'A' && *p <= 'F')
+ c = (c << 4) + *p - 'A' + 10;
+ else
+ continue;
+ }
+ *data++ = c;
+ } else if (*p >= '0' && *p <= '7') { // oct (\\7, or \\77, or \\377)
+ char c = *p - '0';
+ if (p + 1 < e && p[1] >= '0' && p[1] <= '7') {
+ c = (c << 3) + *(++p) - '0';
+ if (p + 1 < e && p[1] >= '0' && p[1] <= '7' && p[-1] <= '3')
+ c = (c << 3) + *(++p) - '0';
+ }
+ *data++ = c;
+ } else if (*p == 'n') {
+ *data++ = '\n';
+ } else if (*p == 'r') {
+ *data++ = '\r';
+ } else { // escaped
+ *data++ = *p;
+ }
+ } else {
+ *data++ = *p;
+ }
+ }
+ pattern.truncate(data - pattern.data());
+
+ return pattern;
+}
+
+QMimeMagicRule::QMimeMagicRule(QMimeMagicRule::Type theType,
+ const QByteArray &theValue,
+ int theStartPos,
+ int theEndPos,
+ const QByteArray &theMask) :
+ d(new QMimeMagicRulePrivate)
+{
+ Q_ASSERT(!theValue.isEmpty());
+
+ d->type = theType;
+ d->value = theValue;
+ d->startPos = theStartPos;
+ d->endPos = theEndPos;
+ d->mask = theMask;
+ d->matchFunction = 0;
+
+ if (d->type >= Host16 && d->type <= Byte) {
+ bool ok;
+ d->number = d->value.toUInt(&ok, 0); // autodetect
+ Q_ASSERT(ok);
+ d->numberMask = !d->mask.isEmpty() ? d->mask.toUInt(&ok, 0) : 0; // autodetect
+ }
+
+ switch (d->type) {
+ case String:
+ d->pattern = makePattern(d->value);
+ d->pattern.squeeze();
+ if (!d->mask.isEmpty()) {
+ Q_ASSERT(d->mask.size() >= 4 && d->mask.startsWith("0x"));
+ d->mask = QByteArray::fromHex(QByteArray::fromRawData(d->mask.constData() + 2, d->mask.size() - 2));
+ Q_ASSERT(d->mask.size() == d->pattern.size());
+ } else {
+ d->mask.fill(static_cast<char>(0xff), d->pattern.size());
+ }
+ d->mask.squeeze();
+ d->matchFunction = matchString;
+ break;
+ case Byte:
+ if (d->number <= quint8(-1)) {
+ if (d->numberMask == 0)
+ d->numberMask = quint8(-1);
+ d->matchFunction = matchNumber<quint8>;
+ }
+ break;
+ case Big16:
+ case Host16:
+ case Little16:
+ if (d->number <= quint16(-1)) {
+ d->number = d->type == Little16 ? qFromLittleEndian<quint16>(d->number) : qFromBigEndian<quint16>(d->number);
+ if (d->numberMask == 0)
+ d->numberMask = quint16(-1);
+ d->matchFunction = matchNumber<quint16>;
+ }
+ break;
+ case Big32:
+ case Host32:
+ case Little32:
+ if (d->number <= quint32(-1)) {
+ d->number = d->type == Little32 ? qFromLittleEndian<quint32>(d->number) : qFromBigEndian<quint32>(d->number);
+ if (d->numberMask == 0)
+ d->numberMask = quint32(-1);
+ d->matchFunction = matchNumber<quint32>;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+QMimeMagicRule::QMimeMagicRule(const QMimeMagicRule &other) :
+ d(new QMimeMagicRulePrivate(*other.d))
+{
+}
+
+QMimeMagicRule::~QMimeMagicRule()
+{
+}
+
+QMimeMagicRule &QMimeMagicRule::operator=(const QMimeMagicRule &other)
+{
+ *d = *other.d;
+ return *this;
+}
+
+bool QMimeMagicRule::operator==(const QMimeMagicRule &other) const
+{
+ return d == other.d ||
+ *d == *other.d;
+}
+
+QMimeMagicRule::Type QMimeMagicRule::type() const
+{
+ return d->type;
+}
+
+QByteArray QMimeMagicRule::value() const
+{
+ return d->value;
+}
+
+int QMimeMagicRule::startPos() const
+{
+ return d->startPos;
+}
+
+int QMimeMagicRule::endPos() const
+{
+ return d->endPos;
+}
+
+QByteArray QMimeMagicRule::mask() const
+{
+ QByteArray result = d->mask;
+ if (d->type == String) {
+ // restore '0x'
+ result = "0x" + result.toHex();
+ }
+ return result;
+}
+
+bool QMimeMagicRule::isValid() const
+{
+ return d->matchFunction;
+}
+
+bool QMimeMagicRule::matches(const QByteArray &data) const
+{
+ const bool ok = d->matchFunction && d->matchFunction(d.data(), data);
+ if (!ok)
+ return false;
+
+ // No submatch? Then we are done.
+ if (m_subMatches.isEmpty())
+ return true;
+
+ //qDebug() << "Checking" << m_subMatches.count() << "sub-rules";
+ // Check that one of the submatches matches too
+ for ( QList<QMimeMagicRule>::const_iterator it = m_subMatches.begin(), end = m_subMatches.end() ;
+ it != end ; ++it ) {
+ if ((*it).matches(data)) {
+ // One of the hierarchies matched -> mimetype recognized.
+ return true;
+ }
+ }
+ return false;
+
+
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimemagicrule_p.h b/src/corelib/mimetypes/qmimemagicrule_p.h
new file mode 100644
index 0000000000..655ca365fa
--- /dev/null
+++ b/src/corelib/mimetypes/qmimemagicrule_p.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QMIMEMAGICRULE_P_H
+#define QMIMEMAGICRULE_P_H
+
+#include <QtCore/qbytearray.h>
+#include <QtCore/qscopedpointer.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMimeMagicRulePrivate;
+class QMimeMagicRule
+{
+public:
+ enum Type { Invalid = 0, String, Host16, Host32, Big16, Big32, Little16, Little32, Byte };
+
+ QMimeMagicRule(Type type, const QByteArray &value, int startPos, int endPos, const QByteArray &mask = QByteArray());
+ QMimeMagicRule(const QMimeMagicRule &other);
+ ~QMimeMagicRule();
+
+ QMimeMagicRule &operator=(const QMimeMagicRule &other);
+
+ bool operator==(const QMimeMagicRule &other) const;
+
+ Type type() const;
+ QByteArray value() const;
+ int startPos() const;
+ int endPos() const;
+ QByteArray mask() const;
+
+ bool isValid() const;
+
+ bool matches(const QByteArray &data) const;
+
+ QList<QMimeMagicRule> m_subMatches;
+
+ static Type type(const QByteArray &type);
+ static QByteArray typeName(Type type);
+
+ static bool matchSubstring(const char *dataPtr, int dataSize, int rangeStart, int rangeLength, int valueLength, const char *valueData, const char *mask);
+
+private:
+ const QScopedPointer<QMimeMagicRulePrivate> d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMIMEMAGICRULE_H
diff --git a/src/corelib/mimetypes/qmimemagicrulematcher.cpp b/src/corelib/mimetypes/qmimemagicrulematcher.cpp
new file mode 100644
index 0000000000..8579d02b00
--- /dev/null
+++ b/src/corelib/mimetypes/qmimemagicrulematcher.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#define QT_NO_CAST_FROM_ASCII
+
+#include "qmimemagicrulematcher_p.h"
+
+#include "qmimetype_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ \class QMimeMagicRuleMatcher
+
+ \brief The QMimeMagicRuleMatcher class checks a number of rules based on operator "or".
+
+ It is used for rules parsed from XML files.
+
+ \sa QMimeType, QMimeDatabase, MagicRule, MagicStringRule, MagicByteRule, GlobPattern
+ \sa QMimeTypeParserBase, MimeTypeParser
+*/
+
+QMimeMagicRuleMatcher::QMimeMagicRuleMatcher(const QString &mime, unsigned thePriority) :
+ m_list(),
+ m_priority(thePriority),
+ m_mimetype(mime)
+{
+}
+
+bool QMimeMagicRuleMatcher::operator==(const QMimeMagicRuleMatcher &other)
+{
+ return m_list == other.m_list &&
+ m_priority == other.m_priority;
+}
+
+void QMimeMagicRuleMatcher::addRule(const QMimeMagicRule &rule)
+{
+ m_list.append(rule);
+}
+
+void QMimeMagicRuleMatcher::addRules(const QList<QMimeMagicRule> &rules)
+{
+ m_list.append(rules);
+}
+
+QList<QMimeMagicRule> QMimeMagicRuleMatcher::magicRules() const
+{
+ return m_list;
+}
+
+// Check for a match on contents of a file
+bool QMimeMagicRuleMatcher::matches(const QByteArray &data) const
+{
+ foreach (const QMimeMagicRule &magicRule, m_list) {
+ if (magicRule.matches(data))
+ return true;
+ }
+
+ return false;
+}
+
+// Return a priority value from 1..100
+unsigned QMimeMagicRuleMatcher::priority() const
+{
+ return m_priority;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/touchscreen/qtoucheventsenderqpa.h b/src/corelib/mimetypes/qmimemagicrulematcher_p.h
index 6b21dfe259..299f447a4c 100644
--- a/src/plugins/generic/touchscreen/qtoucheventsenderqpa.h
+++ b/src/corelib/mimetypes/qmimemagicrulematcher_p.h
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the plugins module of the Qt Toolkit.
+** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,39 +39,41 @@
**
****************************************************************************/
-#ifndef QTOUCHEVENTSENDERQPA_H
-#define QTOUCHEVENTSENDERQPA_H
-#include "qtouchscreen.h"
+#ifndef QMIMEMAGICRULEMATCHER_P_H
+#define QMIMEMAGICRULEMATCHER_P_H
-QT_BEGIN_HEADER
+#include <QtCore/qbytearray.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qstring.h>
-QT_BEGIN_NAMESPACE
+#include "qmimemagicrule_p.h"
-class QTouchDevice;
+QT_BEGIN_NAMESPACE
-class QTouchEventSenderQPA : public QTouchScreenObserver
+class QMimeMagicRuleMatcher
{
public:
- QTouchEventSenderQPA(const QString &spec = QString());
- void touch_configure(int x_min, int x_max, int y_min, int y_max,
- int pressure_min, int pressure_max, const QString &dev_name);
- void touch_point(const QList<QWindowSystemInterface::TouchPoint> &points);
+ explicit QMimeMagicRuleMatcher(const QString &mime, unsigned priority = 65535);
+
+ bool operator==(const QMimeMagicRuleMatcher &other);
+
+ void addRule(const QMimeMagicRule &rule);
+ void addRules(const QList<QMimeMagicRule> &rules);
+ QList<QMimeMagicRule> magicRules() const;
+
+ bool matches(const QByteArray &data) const;
+
+ unsigned priority() const;
+
+ QString mimetype() const { return m_mimetype; }
private:
- bool m_forceToActiveWindow;
- int hw_range_x_min;
- int hw_range_x_max;
- int hw_range_y_min;
- int hw_range_y_max;
- int hw_pressure_min;
- int hw_pressure_max;
- QString hw_dev_name;
- QTouchDevice *m_device;
+ QList<QMimeMagicRule> m_list;
+ unsigned m_priority;
+ QString m_mimetype;
};
QT_END_NAMESPACE
-QT_END_HEADER
-
-#endif // QTOUCHEVENTSENDERQPA_H
+#endif // QMIMEMAGICRULEMATCHER_P_H
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
new file mode 100644
index 0000000000..8ef0ee8881
--- /dev/null
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -0,0 +1,830 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmimeprovider_p.h"
+
+#include "qmimetypeparser_p.h"
+#include <qstandardpaths.h>
+#include "qmimemagicrulematcher_p.h"
+
+#include <QXmlStreamReader>
+#include <QDir>
+#include <QFile>
+#include <QByteArrayMatcher>
+#include <QDebug>
+#include <QDateTime>
+#include <QtEndian>
+
+QT_BEGIN_NAMESPACE
+
+static QString fallbackParent(const QString &mimeTypeName)
+{
+ const QString myGroup = mimeTypeName.left(mimeTypeName.indexOf(QLatin1Char('/')));
+ // All text/* types are subclasses of text/plain.
+ if (myGroup == QLatin1String("text") && mimeTypeName != QLatin1String("text/plain"))
+ return QLatin1String("text/plain");
+ // All real-file mimetypes implicitly derive from application/octet-stream
+ if (myGroup != QLatin1String("inode") &&
+ // ignore non-file extensions
+ myGroup != QLatin1String("all") && myGroup != QLatin1String("fonts") && myGroup != QLatin1String("print") && myGroup != QLatin1String("uri")
+ && mimeTypeName != QLatin1String("application/octet-stream")) {
+ return QLatin1String("application/octet-stream");
+ }
+ return QString();
+}
+
+QMimeProviderBase::QMimeProviderBase(QMimeDatabasePrivate *db)
+ : m_db(db)
+{
+}
+
+Q_CORE_EXPORT int qmime_secondsBetweenChecks = 5; // exported for the unit test
+
+bool QMimeProviderBase::shouldCheck()
+{
+ const QDateTime now = QDateTime::currentDateTime();
+ if (m_lastCheck.isValid() && m_lastCheck.secsTo(now) < qmime_secondsBetweenChecks)
+ return false;
+ m_lastCheck = now;
+ return true;
+}
+
+QMimeBinaryProvider::QMimeBinaryProvider(QMimeDatabasePrivate *db)
+ : QMimeProviderBase(db), m_mimetypeListLoaded(false)
+{
+}
+
+#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
+#define QT_USE_MMAP
+#endif
+
+struct QMimeBinaryProvider::CacheFile
+{
+ CacheFile(const QString &fileName);
+ ~CacheFile();
+
+ bool isValid() const { return m_valid; }
+ inline quint16 getUint16(int offset) const
+ {
+ return qFromBigEndian(*reinterpret_cast<quint16 *>(data + offset));
+ }
+ inline quint32 getUint32(int offset) const
+ {
+ return qFromBigEndian(*reinterpret_cast<quint32 *>(data + offset));
+ }
+ inline const char *getCharStar(int offset) const
+ {
+ return reinterpret_cast<const char *>(data + offset);
+ }
+ bool load();
+ bool reload();
+
+ QFile file;
+ uchar *data;
+ QDateTime m_mtime;
+ bool m_valid;
+};
+
+QMimeBinaryProvider::CacheFile::CacheFile(const QString &fileName)
+ : file(fileName), m_valid(false)
+{
+ load();
+}
+
+QMimeBinaryProvider::CacheFile::~CacheFile()
+{
+}
+
+bool QMimeBinaryProvider::CacheFile::load()
+{
+ if (!file.open(QIODevice::ReadOnly))
+ return false;
+ data = file.map(0, file.size());
+ if (data) {
+ const int major = getUint16(0);
+ const int minor = getUint16(2);
+ m_valid = (major == 1 && minor >= 1 && minor <= 2);
+ }
+ m_mtime = QFileInfo(file).lastModified();
+ return m_valid;
+}
+
+bool QMimeBinaryProvider::CacheFile::reload()
+{
+ //qDebug() << "reload!" << file->fileName();
+ m_valid = false;
+ if (file.isOpen()) {
+ file.close();
+ }
+ data = 0;
+ return load();
+}
+
+QMimeBinaryProvider::CacheFile *QMimeBinaryProvider::CacheFileList::findCacheFile(const QString &fileName) const
+{
+ for (const_iterator it = begin(); it != end(); ++it) {
+ if ((*it)->file.fileName() == fileName)
+ return *it;
+ }
+ return 0;
+}
+
+QMimeBinaryProvider::~QMimeBinaryProvider()
+{
+ qDeleteAll(m_cacheFiles);
+}
+
+// Position of the "list offsets" values, at the beginning of the mime.cache file
+enum {
+ PosAliasListOffset = 4,
+ PosParentListOffset = 8,
+ PosLiteralListOffset = 12,
+ PosReverseSuffixTreeOffset = 16,
+ PosGlobListOffset = 20,
+ PosMagicListOffset = 24,
+ // PosNamespaceListOffset = 28,
+ PosIconsListOffset = 32,
+ PosGenericIconsListOffset = 36
+};
+
+bool QMimeBinaryProvider::isValid()
+{
+#if defined(QT_USE_MMAP)
+ if (!qgetenv("QT_NO_MIME_CACHE").isEmpty())
+ return false;
+
+ Q_ASSERT(m_cacheFiles.isEmpty()); // this method is only ever called once
+ checkCache();
+
+ if (m_cacheFiles.count() > 1)
+ return true;
+ if (m_cacheFiles.isEmpty())
+ return false;
+
+ // We found exactly one file; is it the user-modified mimes, or a system file?
+ const QString foundFile = m_cacheFiles.first()->file.fileName();
+ const QString localCacheFile = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/mime/mime.cache");
+
+ return foundFile != localCacheFile;
+#else
+ return false;
+#endif
+}
+
+bool QMimeBinaryProvider::CacheFileList::checkCacheChanged()
+{
+ bool somethingChanged = false;
+ QMutableListIterator<CacheFile *> it(*this);
+ while (it.hasNext()) {
+ CacheFile *cacheFile = it.next();
+ QFileInfo fileInfo(cacheFile->file);
+ if (!fileInfo.exists()) { // This can't happen by just running update-mime-database. But the user could use rm -rf :-)
+ delete cacheFile;
+ it.remove();
+ somethingChanged = true;
+ } else if (fileInfo.lastModified() > cacheFile->m_mtime) {
+ if (!cacheFile->reload()) {
+ delete cacheFile;
+ it.remove();
+ }
+ somethingChanged = true;
+ }
+ }
+ return somethingChanged;
+}
+
+void QMimeBinaryProvider::checkCache()
+{
+ if (!shouldCheck())
+ return;
+
+ // First iterate over existing known cache files and check for uptodate
+ if (m_cacheFiles.checkCacheChanged())
+ m_mimetypeListLoaded = false;
+
+ // Then check if new cache files appeared
+ const QStringList cacheFileNames = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/mime.cache"));
+ if (cacheFileNames != m_cacheFileNames) {
+ foreach (const QString &cacheFileName, cacheFileNames) {
+ CacheFile *cacheFile = m_cacheFiles.findCacheFile(cacheFileName);
+ if (!cacheFile) {
+ //qDebug() << "new file:" << cacheFileName;
+ cacheFile = new CacheFile(cacheFileName);
+ if (cacheFile->isValid()) // verify version
+ m_cacheFiles.append(cacheFile);
+ else
+ delete cacheFile;
+ }
+ }
+ m_cacheFileNames = cacheFileNames;
+ m_mimetypeListLoaded = false;
+ }
+}
+
+static QMimeType mimeTypeForNameUnchecked(const QString &name)
+{
+ QMimeTypePrivate data;
+ data.name = name;
+ // The rest is retrieved on demand.
+ // comment and globPatterns: in loadMimeTypePrivate
+ // iconName: in loadIcon
+ // genericIconName: in loadGenericIcon
+ return QMimeType(data);
+}
+
+QMimeType QMimeBinaryProvider::mimeTypeForName(const QString &name)
+{
+ checkCache();
+ if (!m_mimetypeListLoaded)
+ loadMimeTypeList();
+ if (!m_mimetypeNames.contains(name))
+ return QMimeType(); // unknown mimetype
+ return mimeTypeForNameUnchecked(name);
+}
+
+QStringList QMimeBinaryProvider::findByFileName(const QString &fileName, QString *foundSuffix)
+{
+ checkCache();
+ const QString lowerFileName = fileName.toLower();
+ QMimeGlobMatchResult result;
+ // TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly.
+ foreach (CacheFile *cacheFile, m_cacheFiles) {
+ matchGlobList(result, cacheFile, cacheFile->getUint32(PosLiteralListOffset), fileName);
+ matchGlobList(result, cacheFile, cacheFile->getUint32(PosGlobListOffset), fileName);
+ const int reverseSuffixTreeOffset = cacheFile->getUint32(PosReverseSuffixTreeOffset);
+ const int numRoots = cacheFile->getUint32(reverseSuffixTreeOffset);
+ const int firstRootOffset = cacheFile->getUint32(reverseSuffixTreeOffset + 4);
+ matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, fileName.length() - 1, false);
+ if (result.m_matchingMimeTypes.isEmpty())
+ matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, fileName, fileName.length() - 1, true);
+ }
+ if (foundSuffix)
+ *foundSuffix = result.m_foundSuffix;
+ return result.m_matchingMimeTypes;
+}
+
+void QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int off, const QString &fileName)
+{
+ const int numGlobs = cacheFile->getUint32(off);
+ //qDebug() << "Loading" << numGlobs << "globs from" << cacheFile->file.fileName() << "at offset" << cacheFile->globListOffset;
+ for (int i = 0; i < numGlobs; ++i) {
+ const int globOffset = cacheFile->getUint32(off + 4 + 12 * i);
+ const int mimeTypeOffset = cacheFile->getUint32(off + 4 + 12 * i + 4);
+ const int flagsAndWeight = cacheFile->getUint32(off + 4 + 12 * i + 8);
+ const int weight = flagsAndWeight & 0xff;
+ const bool caseSensitive = flagsAndWeight & 0x100;
+ const Qt::CaseSensitivity qtCaseSensitive = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
+ const QString pattern = QLatin1String(cacheFile->getCharStar(globOffset));
+
+ const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ //qDebug() << pattern << mimeType << weight << caseSensitive;
+ QMimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive);
+
+ // TODO: this could be done faster for literals where a simple == would do.
+ if (glob.matchFileName(fileName))
+ result.addMatch(QLatin1String(mimeType), weight, pattern);
+ }
+}
+
+bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result, QMimeBinaryProvider::CacheFile *cacheFile, int numEntries, int firstOffset, const QString &fileName, int charPos, bool caseSensitiveCheck)
+{
+ QChar fileChar = fileName[charPos];
+ int min = 0;
+ int max = numEntries - 1;
+ while (min <= max) {
+ const int mid = (min + max) / 2;
+ const int off = firstOffset + 12 * mid;
+ const QChar ch = cacheFile->getUint32(off);
+ if (ch < fileChar)
+ min = mid + 1;
+ else if (ch > fileChar)
+ max = mid - 1;
+ else {
+ --charPos;
+ int numChildren = cacheFile->getUint32(off + 4);
+ int childrenOffset = cacheFile->getUint32(off + 8);
+ bool success = false;
+ if (charPos > 0)
+ success = matchSuffixTree(result, cacheFile, numChildren, childrenOffset, fileName, charPos, caseSensitiveCheck);
+ if (!success) {
+ for (int i = 0; i < numChildren; ++i) {
+ const int childOff = childrenOffset + 12 * i;
+ const int mch = cacheFile->getUint32(childOff);
+ if (mch != 0)
+ break;
+ const int mimeTypeOffset = cacheFile->getUint32(childOff + 4);
+ const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ const int flagsAndWeight = cacheFile->getUint32(childOff + 8);
+ const int weight = flagsAndWeight & 0xff;
+ const bool caseSensitive = flagsAndWeight & 0x100;
+ if (caseSensitiveCheck || !caseSensitive) {
+ result.addMatch(QLatin1String(mimeType), weight, QLatin1Char('*') + fileName.mid(charPos+1));
+ success = true;
+ }
+ }
+ }
+ return success;
+ }
+ }
+ return false;
+}
+
+bool QMimeBinaryProvider::matchMagicRule(QMimeBinaryProvider::CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data)
+{
+ const char *dataPtr = data.constData();
+ const int dataSize = data.size();
+ for (int matchlet = 0; matchlet < numMatchlets; ++matchlet) {
+ const int off = firstOffset + matchlet * 32;
+ const int rangeStart = cacheFile->getUint32(off);
+ const int rangeLength = cacheFile->getUint32(off + 4);
+ //const int wordSize = cacheFile->getUint32(off + 8);
+ const int valueLength = cacheFile->getUint32(off + 12);
+ const int valueOffset = cacheFile->getUint32(off + 16);
+ const int maskOffset = cacheFile->getUint32(off + 20);
+ const char *mask = maskOffset ? cacheFile->getCharStar(maskOffset) : NULL;
+
+ if (!QMimeMagicRule::matchSubstring(dataPtr, dataSize, rangeStart, rangeLength, valueLength, cacheFile->getCharStar(valueOffset), mask))
+ continue;
+
+ const int numChildren = cacheFile->getUint32(off + 24);
+ const int firstChildOffset = cacheFile->getUint32(off + 28);
+ if (numChildren == 0) // No submatch? Then we are done.
+ return true;
+ // Check that one of the submatches matches too
+ if (matchMagicRule(cacheFile, numChildren, firstChildOffset, data))
+ return true;
+ }
+ return false;
+}
+
+QMimeType QMimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr)
+{
+ checkCache();
+ foreach (CacheFile *cacheFile, m_cacheFiles) {
+ const int magicListOffset = cacheFile->getUint32(PosMagicListOffset);
+ const int numMatches = cacheFile->getUint32(magicListOffset);
+ //const int maxExtent = cacheFile->getUint32(magicListOffset + 4);
+ const int firstMatchOffset = cacheFile->getUint32(magicListOffset + 8);
+
+ for (int i = 0; i < numMatches; ++i) {
+ const int off = firstMatchOffset + i * 16;
+ const int numMatchlets = cacheFile->getUint32(off + 8);
+ const int firstMatchletOffset = cacheFile->getUint32(off + 12);
+ if (matchMagicRule(cacheFile, numMatchlets, firstMatchletOffset, data)) {
+ const int mimeTypeOffset = cacheFile->getUint32(off + 4);
+ const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ *accuracyPtr = cacheFile->getUint32(off);
+ // Return the first match. We have no rules for conflicting magic data...
+ // (mime.cache itself is sorted, but what about local overrides with a lower prio?)
+ return mimeTypeForNameUnchecked(QLatin1String(mimeType));
+ }
+ }
+ }
+ return QMimeType();
+}
+
+QStringList QMimeBinaryProvider::parents(const QString &mime)
+{
+ checkCache();
+ const QByteArray mimeStr = mime.toLatin1();
+ QStringList result;
+ foreach (CacheFile *cacheFile, m_cacheFiles) {
+ const int parentListOffset = cacheFile->getUint32(PosParentListOffset);
+ const int numEntries = cacheFile->getUint32(parentListOffset);
+
+ int begin = 0;
+ int end = numEntries - 1;
+ while (begin <= end) {
+ const int medium = (begin + end) / 2;
+ const int off = parentListOffset + 4 + 8 * medium;
+ const int mimeOffset = cacheFile->getUint32(off);
+ const char *aMime = cacheFile->getCharStar(mimeOffset);
+ const int cmp = qstrcmp(aMime, mimeStr);
+ if (cmp < 0) {
+ begin = medium + 1;
+ } else if (cmp > 0) {
+ end = medium - 1;
+ } else {
+ const int parentsOffset = cacheFile->getUint32(off + 4);
+ const int numParents = cacheFile->getUint32(parentsOffset);
+ for (int i = 0; i < numParents; ++i) {
+ const int parentOffset = cacheFile->getUint32(parentsOffset + 4 + 4 * i);
+ const char *aParent = cacheFile->getCharStar(parentOffset);
+ result.append(QString::fromLatin1(aParent));
+ }
+ break;
+ }
+ }
+ }
+ if (result.isEmpty()) {
+ const QString parent = fallbackParent(mime);
+ if (!parent.isEmpty())
+ result.append(parent);
+ }
+ return result;
+}
+
+QString QMimeBinaryProvider::resolveAlias(const QString &name)
+{
+ checkCache();
+ const QByteArray input = name.toLatin1();
+ foreach (CacheFile *cacheFile, m_cacheFiles) {
+ const int aliasListOffset = cacheFile->getUint32(PosAliasListOffset);
+ const int numEntries = cacheFile->getUint32(aliasListOffset);
+ int begin = 0;
+ int end = numEntries - 1;
+ while (begin <= end) {
+ const int medium = (begin + end) / 2;
+ const int off = aliasListOffset + 4 + 8 * medium;
+ const int aliasOffset = cacheFile->getUint32(off);
+ const char *alias = cacheFile->getCharStar(aliasOffset);
+ const int cmp = qstrcmp(alias, input);
+ if (cmp < 0) {
+ begin = medium + 1;
+ } else if (cmp > 0) {
+ end = medium - 1;
+ } else {
+ const int mimeOffset = cacheFile->getUint32(off + 4);
+ const char *mimeType = cacheFile->getCharStar(mimeOffset);
+ return QLatin1String(mimeType);
+ }
+ }
+ }
+
+ return name;
+}
+
+void QMimeBinaryProvider::loadMimeTypeList()
+{
+ if (!m_mimetypeListLoaded) {
+ m_mimetypeListLoaded = true;
+ m_mimetypeNames.clear();
+ // Unfortunately mime.cache doesn't have a full list of all mimetypes.
+ // So we have to parse the plain-text files called "types".
+ const QStringList typesFilenames = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/types"));
+ foreach (const QString &typeFilename, typesFilenames) {
+ QFile file(typeFilename);
+ if (file.open(QIODevice::ReadOnly)) {
+ while (!file.atEnd()) {
+ QByteArray line = file.readLine();
+ line.chop(1);
+ m_mimetypeNames.insert(QString::fromLatin1(line.constData(), line.size()));
+ }
+ }
+ }
+ }
+}
+
+QList<QMimeType> QMimeBinaryProvider::allMimeTypes()
+{
+ QList<QMimeType> result;
+ loadMimeTypeList();
+
+ for (QSet<QString>::const_iterator it = m_mimetypeNames.constBegin();
+ it != m_mimetypeNames.constEnd(); ++it)
+ result.append(mimeTypeForNameUnchecked(*it));
+
+ return result;
+}
+
+void QMimeBinaryProvider::loadMimeTypePrivate(QMimeTypePrivate &data)
+{
+ // load comment and globPatterns
+
+ const QString file = data.name + QLatin1String(".xml");
+ const QStringList mimeFiles = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString::fromLatin1("mime/") + file);
+ if (mimeFiles.isEmpty()) {
+ // TODO: ask Thiago about this
+ qWarning() << "No file found for" << file << ", even though the file appeared in a directory listing.";
+ qWarning() << "Either it was just removed, or the directory doesn't have executable permission...";
+ qWarning() << QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime"), QStandardPaths::LocateDirectory);
+ return;
+ }
+
+ QString comment;
+ QString mainPattern;
+ const QString preferredLanguage = QLocale::system().name();
+
+ QListIterator<QString> mimeFilesIter(mimeFiles);
+ mimeFilesIter.toBack();
+ while (mimeFilesIter.hasPrevious()) { // global first, then local.
+ const QString fullPath = mimeFilesIter.previous();
+ QFile qfile(fullPath);
+ if (!qfile.open(QFile::ReadOnly))
+ continue;
+
+ QXmlStreamReader xml(&qfile);
+ if (xml.readNextStartElement()) {
+ if (xml.name() != QLatin1String("mime-type")) {
+ continue;
+ }
+ const QString name = xml.attributes().value(QLatin1String("type")).toString();
+ if (name.isEmpty())
+ continue;
+ if (name != data.name) {
+ qWarning() << "Got name" << name << "in file" << file << "expected" << data.name;
+ }
+
+ while (xml.readNextStartElement()) {
+ const QStringRef tag = xml.name();
+ if (tag == QLatin1String("comment")) {
+ QString lang = xml.attributes().value(QLatin1String("xml:lang")).toString();
+ const QString text = xml.readElementText();
+ if (lang.isEmpty()) {
+ lang = QLatin1String("en_US");
+ }
+ data.localeComments.insert(lang, text);
+ continue; // we called readElementText, so we're at the EndElement already.
+ } else if (tag == QLatin1String("icon")) { // as written out by shared-mime-info >= 0.40
+ data.iconName = xml.attributes().value(QLatin1String("name")).toString();
+ } else if (tag == QLatin1String("glob-deleteall")) { // as written out by shared-mime-info >= 0.70
+ data.globPatterns.clear();
+ } else if (tag == QLatin1String("glob")) { // as written out by shared-mime-info >= 0.70
+ const QString pattern = xml.attributes().value(QLatin1String("pattern")).toString();
+ if (mainPattern.isEmpty() && pattern.startsWith(QLatin1Char('*'))) {
+ mainPattern = pattern;
+ }
+ if (!data.globPatterns.contains(pattern))
+ data.globPatterns.append(pattern);
+ }
+ xml.skipCurrentElement();
+ }
+ Q_ASSERT(xml.name() == QLatin1String("mime-type"));
+ }
+ }
+
+ // Let's assume that shared-mime-info is at least version 0.70
+ // Otherwise we would need 1) a version check, and 2) code for parsing patterns from the globs file.
+#if 1
+ if (!mainPattern.isEmpty() && data.globPatterns.first() != mainPattern) {
+ // ensure it's first in the list of patterns
+ data.globPatterns.removeAll(mainPattern);
+ data.globPatterns.prepend(mainPattern);
+ }
+#else
+ const bool globsInXml = sharedMimeInfoVersion() >= QT_VERSION_CHECK(0, 70, 0);
+ if (globsInXml) {
+ if (!mainPattern.isEmpty() && data.globPatterns.first() != mainPattern) {
+ // ensure it's first in the list of patterns
+ data.globPatterns.removeAll(mainPattern);
+ data.globPatterns.prepend(mainPattern);
+ }
+ } else {
+ // Fallback: get the patterns from the globs file
+ // TODO: This would be the only way to support shared-mime-info < 0.70
+ // But is this really worth the effort?
+ }
+#endif
+}
+
+// Binary search in the icons or generic-icons list
+QString QMimeBinaryProvider::iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime)
+{
+ const int iconsListOffset = cacheFile->getUint32(posListOffset);
+ const int numIcons = cacheFile->getUint32(iconsListOffset);
+ int begin = 0;
+ int end = numIcons - 1;
+ while (begin <= end) {
+ const int medium = (begin + end) / 2;
+ const int off = iconsListOffset + 4 + 8 * medium;
+ const int mimeOffset = cacheFile->getUint32(off);
+ const char *mime = cacheFile->getCharStar(mimeOffset);
+ const int cmp = qstrcmp(mime, inputMime);
+ if (cmp < 0)
+ begin = medium + 1;
+ else if (cmp > 0)
+ end = medium - 1;
+ else {
+ const int iconOffset = cacheFile->getUint32(off + 4);
+ return QLatin1String(cacheFile->getCharStar(iconOffset));
+ }
+ }
+ return QString();
+}
+
+void QMimeBinaryProvider::loadIcon(QMimeTypePrivate &data)
+{
+ checkCache();
+ const QByteArray inputMime = data.name.toLatin1();
+ foreach (CacheFile *cacheFile, m_cacheFiles) {
+ const QString icon = iconForMime(cacheFile, PosIconsListOffset, inputMime);
+ if (!icon.isEmpty()) {
+ data.iconName = icon;
+ return;
+ }
+ }
+}
+
+void QMimeBinaryProvider::loadGenericIcon(QMimeTypePrivate &data)
+{
+ checkCache();
+ const QByteArray inputMime = data.name.toLatin1();
+ foreach (CacheFile *cacheFile, m_cacheFiles) {
+ const QString icon = iconForMime(cacheFile, PosGenericIconsListOffset, inputMime);
+ if (!icon.isEmpty()) {
+ data.genericIconName = icon;
+ return;
+ }
+ }
+}
+
+////
+
+QMimeXMLProvider::QMimeXMLProvider(QMimeDatabasePrivate *db)
+ : QMimeProviderBase(db), m_loaded(false)
+{
+}
+
+bool QMimeXMLProvider::isValid()
+{
+ return true;
+}
+
+QMimeType QMimeXMLProvider::mimeTypeForName(const QString &name)
+{
+ ensureLoaded();
+
+ return m_nameMimeTypeMap.value(name);
+}
+
+QStringList QMimeXMLProvider::findByFileName(const QString &fileName, QString *foundSuffix)
+{
+ ensureLoaded();
+
+ const QStringList matchingMimeTypes = m_mimeTypeGlobs.matchingGlobs(fileName, foundSuffix);
+ return matchingMimeTypes;
+}
+
+QMimeType QMimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr)
+{
+ ensureLoaded();
+
+ QString candidate;
+
+ foreach (const QMimeMagicRuleMatcher &matcher, m_magicMatchers) {
+ if (matcher.matches(data)) {
+ const int priority = matcher.priority();
+ if (priority > *accuracyPtr) {
+ *accuracyPtr = priority;
+ candidate = matcher.mimetype();
+ }
+ }
+ }
+ return mimeTypeForName(candidate);
+}
+
+void QMimeXMLProvider::ensureLoaded()
+{
+ if (!m_loaded || shouldCheck()) {
+ bool fdoXmlFound = false;
+ QStringList allFiles;
+
+ const QStringList packageDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/packages"), QStandardPaths::LocateDirectory);
+ //qDebug() << "packageDirs=" << packageDirs;
+ foreach (const QString &packageDir, packageDirs) {
+ QDir dir(packageDir);
+ const QStringList files = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
+ //qDebug() << static_cast<const void *>(this) << Q_FUNC_INFO << packageDir << files;
+ if (!fdoXmlFound)
+ fdoXmlFound = files.contains(QLatin1String("freedesktop.org.xml"));
+ QStringList::const_iterator endIt(files.constEnd());
+ for (QStringList::const_iterator it(files.constBegin()); it != endIt; ++it) {
+ allFiles.append(packageDir + QLatin1Char('/') + *it);
+ }
+ }
+
+ if (!fdoXmlFound) {
+ // We could instead install the file as part of installing Qt?
+ allFiles.prepend(QLatin1String(":/qt-project.org/qmime/freedesktop.org.xml"));
+ }
+
+ if (m_allFiles == allFiles)
+ return;
+ m_allFiles = allFiles;
+
+ m_nameMimeTypeMap.clear();
+ m_aliases.clear();
+ m_parents.clear();
+ m_mimeTypeGlobs.clear();
+ m_magicMatchers.clear();
+
+ //qDebug() << "Loading" << m_allFiles;
+
+ foreach (const QString &file, allFiles)
+ load(file);
+ }
+}
+
+void QMimeXMLProvider::load(const QString &fileName)
+{
+ QString errorMessage;
+ if (!load(fileName, &errorMessage))
+ qWarning("QMimeDatabase: Error loading %s\n%s", qPrintable(fileName), qPrintable(errorMessage));
+}
+
+bool QMimeXMLProvider::load(const QString &fileName, QString *errorMessage)
+{
+ m_loaded = true;
+
+ QFile file(fileName);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ if (errorMessage)
+ *errorMessage = QString::fromLatin1("Cannot open %1: %2").arg(fileName, file.errorString());
+ return false;
+ }
+
+ if (errorMessage)
+ errorMessage->clear();
+
+ QMimeTypeParser parser(*this);
+ return parser.parse(&file, fileName, errorMessage);
+}
+
+void QMimeXMLProvider::addGlobPattern(const QMimeGlobPattern &glob)
+{
+ m_mimeTypeGlobs.addGlob(glob);
+}
+
+void QMimeXMLProvider::addMimeType(const QMimeType &mt)
+{
+ m_nameMimeTypeMap.insert(mt.name(), mt);
+}
+
+QStringList QMimeXMLProvider::parents(const QString &mime)
+{
+ ensureLoaded();
+ QStringList result = m_parents.value(mime);
+ if (result.isEmpty()) {
+ const QString parent = fallbackParent(mime);
+ if (!parent.isEmpty())
+ result.append(parent);
+ }
+ return result;
+}
+
+void QMimeXMLProvider::addParent(const QString &child, const QString &parent)
+{
+ m_parents[child].append(parent);
+}
+
+QString QMimeXMLProvider::resolveAlias(const QString &name)
+{
+ ensureLoaded();
+ return m_aliases.value(name, name);
+}
+
+void QMimeXMLProvider::addAlias(const QString &alias, const QString &name)
+{
+ m_aliases.insert(alias, name);
+}
+
+QList<QMimeType> QMimeXMLProvider::allMimeTypes()
+{
+ ensureLoaded();
+ return m_nameMimeTypeMap.values();
+}
+
+void QMimeXMLProvider::addMagicMatcher(const QMimeMagicRuleMatcher &matcher)
+{
+ m_magicMatchers.append(matcher);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimeprovider_p.h b/src/corelib/mimetypes/qmimeprovider_p.h
new file mode 100644
index 0000000000..cb51ba11ee
--- /dev/null
+++ b/src/corelib/mimetypes/qmimeprovider_p.h
@@ -0,0 +1,165 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMIMEPROVIDER_P_H
+#define QMIMEPROVIDER_P_H
+
+#include <QtCore/qdatetime.h>
+#include "qmimedatabase_p.h"
+#include <QtCore/qset.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMimeMagicRuleMatcher;
+
+class QMimeProviderBase
+{
+public:
+ QMimeProviderBase(QMimeDatabasePrivate *db);
+ virtual ~QMimeProviderBase() {}
+
+ virtual bool isValid() = 0;
+ virtual QMimeType mimeTypeForName(const QString &name) = 0;
+ virtual QStringList findByFileName(const QString &fileName, QString *foundSuffix) = 0;
+ virtual QStringList parents(const QString &mime) = 0;
+ virtual QString resolveAlias(const QString &name) = 0;
+ virtual QMimeType findByMagic(const QByteArray &data, int *accuracyPtr) = 0;
+ virtual QList<QMimeType> allMimeTypes() = 0;
+ virtual void loadMimeTypePrivate(QMimeTypePrivate &) {}
+ virtual void loadIcon(QMimeTypePrivate &) {}
+ virtual void loadGenericIcon(QMimeTypePrivate &) {}
+
+ QMimeDatabasePrivate *m_db;
+protected:
+ bool shouldCheck();
+ QDateTime m_lastCheck;
+};
+
+/*
+ Parses the files 'mime.cache' and 'types' on demand
+ */
+class QMimeBinaryProvider : public QMimeProviderBase
+{
+public:
+ QMimeBinaryProvider(QMimeDatabasePrivate *db);
+ virtual ~QMimeBinaryProvider();
+
+ virtual bool isValid();
+ virtual QMimeType mimeTypeForName(const QString &name);
+ virtual QStringList findByFileName(const QString &fileName, QString *foundSuffix);
+ virtual QStringList parents(const QString &mime);
+ virtual QString resolveAlias(const QString &name);
+ virtual QMimeType findByMagic(const QByteArray &data, int *accuracyPtr);
+ virtual QList<QMimeType> allMimeTypes();
+ virtual void loadMimeTypePrivate(QMimeTypePrivate &);
+ virtual void loadIcon(QMimeTypePrivate &);
+ virtual void loadGenericIcon(QMimeTypePrivate &);
+
+private:
+ struct CacheFile;
+
+ void matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int offset, const QString &fileName);
+ bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries, int firstOffset, const QString &fileName, int charPos, bool caseSensitiveCheck);
+ bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data);
+ QString iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime);
+ void loadMimeTypeList();
+ void checkCache();
+
+ class CacheFileList : public QList<CacheFile *>
+ {
+ public:
+ CacheFile *findCacheFile(const QString &fileName) const;
+ bool checkCacheChanged();
+ };
+ CacheFileList m_cacheFiles;
+ QStringList m_cacheFileNames;
+ QSet<QString> m_mimetypeNames;
+ bool m_mimetypeListLoaded;
+};
+
+/*
+ Parses the raw XML files (slower)
+ */
+class QMimeXMLProvider : public QMimeProviderBase
+{
+public:
+ QMimeXMLProvider(QMimeDatabasePrivate *db);
+
+ virtual bool isValid();
+ virtual QMimeType mimeTypeForName(const QString &name);
+ virtual QStringList findByFileName(const QString &fileName, QString *foundSuffix);
+ virtual QStringList parents(const QString &mime);
+ virtual QString resolveAlias(const QString &name);
+ virtual QMimeType findByMagic(const QByteArray &data, int *accuracyPtr);
+ virtual QList<QMimeType> allMimeTypes();
+
+ bool load(const QString &fileName, QString *errorMessage);
+
+ // Called by the mimetype xml parser
+ void addMimeType(const QMimeType &mt);
+ void addGlobPattern(const QMimeGlobPattern &glob);
+ void addParent(const QString &child, const QString &parent);
+ void addAlias(const QString &alias, const QString &name);
+ void addMagicMatcher(const QMimeMagicRuleMatcher &matcher);
+
+private:
+ void ensureLoaded();
+ void load(const QString &fileName);
+
+ bool m_loaded;
+
+ typedef QHash<QString, QMimeType> NameMimeTypeMap;
+ NameMimeTypeMap m_nameMimeTypeMap;
+
+ typedef QHash<QString, QString> AliasHash;
+ AliasHash m_aliases;
+
+ typedef QHash<QString, QStringList> ParentsHash;
+ ParentsHash m_parents;
+ QMimeAllGlobPatterns m_mimeTypeGlobs;
+
+ QList<QMimeMagicRuleMatcher> m_magicMatchers;
+ QStringList m_allFiles;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMIMEPROVIDER_P_H
diff --git a/src/corelib/mimetypes/qmimetype.cpp b/src/corelib/mimetypes/qmimetype.cpp
new file mode 100644
index 0000000000..77592880a0
--- /dev/null
+++ b/src/corelib/mimetypes/qmimetype.cpp
@@ -0,0 +1,506 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qmimetype.h"
+
+#include "qmimetype_p.h"
+#include "qmimedatabase_p.h"
+#include "qmimeprovider_p.h"
+
+#include "qmimeglobpattern_p.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QLocale>
+
+QT_BEGIN_NAMESPACE
+
+bool qt_isQMimeTypeDebuggingActivated (false);
+
+#ifndef QT_NO_DEBUG_OUTPUT
+#define DBG() if (qt_isQMimeTypeDebuggingActivated) qDebug() << static_cast<const void *>(this) << Q_FUNC_INFO
+#else
+#define DBG() if (0) qDebug() << static_cast<const void *>(this) << Q_FUNC_INFO
+#endif
+
+QMimeTypePrivate::QMimeTypePrivate()
+ : name()
+ //, comment()
+ , localeComments()
+ , genericIconName()
+ , iconName()
+ , globPatterns()
+{}
+
+QMimeTypePrivate::QMimeTypePrivate(const QMimeType &other)
+ : name(other.d->name)
+ //, comment(other.d->comment)
+ , localeComments(other.d->localeComments)
+ , genericIconName(other.d->genericIconName)
+ , iconName(other.d->iconName)
+ , globPatterns(other.d->globPatterns)
+{}
+
+void QMimeTypePrivate::clear()
+{
+ name.clear();
+ //comment.clear();
+ localeComments.clear();
+ genericIconName.clear();
+ iconName.clear();
+ globPatterns.clear();
+}
+
+/*!
+ \fn bool QMimeTypePrivate::operator==(const QMimeTypePrivate &other) const;
+ Returns true if \a other equals this QMimeTypePrivate object, otherwise returns false.
+ */
+bool QMimeTypePrivate::operator==(const QMimeTypePrivate &other) const
+{
+ DBG();
+ if (name == other.name &&
+ //comment == other.comment &&
+ localeComments == other.localeComments &&
+ genericIconName == other.genericIconName &&
+ iconName == other.iconName &&
+ globPatterns == other.globPatterns) {
+ return true;
+ }
+
+ DBG() << name << other.name << (name == other.name);
+ //DBG() << comment << other.comment << (comment == other.comment);
+ DBG() << localeComments << other.localeComments << (localeComments == other.localeComments);
+ DBG() << genericIconName << other.genericIconName << (genericIconName == other.genericIconName);
+ DBG() << iconName << other.iconName << (iconName == other.iconName);
+ DBG() << globPatterns << other.globPatterns << (globPatterns == other.globPatterns);
+ return false;
+}
+
+void QMimeTypePrivate::addGlobPattern(const QString &pattern)
+{
+ globPatterns.append(pattern);
+}
+
+/*!
+ \class QMimeType
+ \brief The QMimeType class describes types of file or data, represented by a MIME type string.
+
+ \since 5.0
+
+ For instance a file named "readme.txt" has the MIME type "text/plain".
+ The MIME type can be determined from the file name, or from the file
+ contents, or from both. MIME type determination can also be done on
+ buffers of data not coming from files.
+
+ Determining the MIME type of a file can be useful to make sure your
+ application supports it. It is also useful in file-manager-like applications
+ or widgets, in order to display an appropriate icon() for the file, or even
+ the descriptive comment() in detailed views.
+
+ To check if a file has the expected MIME type, you should use inherits()
+ rather than a simple string comparison based on the name(). This is because
+ MIME types can inherit from each other: for instance a C source file is
+ a specific type of plain text file, so text/x-csrc inherits text/plain.
+
+ \sa QMimeDatabase
+ */
+
+/*!
+ \fn QMimeType::QMimeType();
+ Constructs this QMimeType object initialized with default property values that indicate an invalid MIME type.
+ */
+QMimeType::QMimeType() :
+ d(new QMimeTypePrivate())
+{
+ DBG() << "name():" << name();
+ //DBG() << "aliases():" << aliases();
+ //DBG() << "comment():" << comment();
+ DBG() << "genericIconName():" << genericIconName();
+ DBG() << "iconName():" << iconName();
+ DBG() << "globPatterns():" << globPatterns();
+ DBG() << "suffixes():" << suffixes();
+ DBG() << "preferredSuffix():" << preferredSuffix();
+}
+
+/*!
+ \fn QMimeType::QMimeType(const QMimeType &other);
+ Constructs this QMimeType object as a copy of \a other.
+ */
+QMimeType::QMimeType(const QMimeType &other) :
+ d(other.d)
+{
+ DBG() << "name():" << name();
+ //DBG() << "aliases():" << aliases();
+ //DBG() << "comment():" << comment();
+ DBG() << "genericIconName():" << genericIconName();
+ DBG() << "iconName():" << iconName();
+ DBG() << "globPatterns():" << globPatterns();
+ DBG() << "suffixes():" << suffixes();
+ DBG() << "preferredSuffix():" << preferredSuffix();
+}
+
+/*!
+ \fn QMimeType &QMimeType::operator=(const QMimeType &other);
+ Assigns the data of \a other to this QMimeType object, and returns a reference to this object.
+ */
+QMimeType &QMimeType::operator=(const QMimeType &other)
+{
+ if (d != other.d)
+ d = other.d;
+ return *this;
+}
+
+#ifdef Q_COMPILER_RVALUE_REFS
+/*!
+ \fn QMimeType::QMimeType(QMimeType &&other);
+ Constructs this QMimeType object by moving the data of the rvalue reference \a other.
+ */
+QMimeType::QMimeType(QMimeType &&other) :
+ d(std::move(other.d))
+{
+ DBG() << "name():" << name();
+ //DBG() << "aliases():" << aliases();
+ //DBG() << "comment():" << comment();
+ DBG() << "genericIconName():" << genericIconName();
+ DBG() << "iconName():" << iconName();
+ DBG() << "globPatterns():" << globPatterns();
+ DBG() << "suffixes():" << suffixes();
+ DBG() << "preferredSuffix():" << preferredSuffix();
+}
+#endif
+
+/*!
+ \fn QMimeType::QMimeType(const QMimeTypePrivate &dd);
+ Assigns the data of the QMimeTypePrivate \a dd to this QMimeType object, and returns a reference to this object.
+ */
+QMimeType::QMimeType(const QMimeTypePrivate &dd) :
+ d(new QMimeTypePrivate(dd))
+{
+ DBG() << "name():" << name();
+ //DBG() << "aliases():" << aliases();
+ //DBG() << "comment():" << comment();
+ DBG() << "genericIconName():" << genericIconName();
+ DBG() << "iconName():" << iconName();
+ DBG() << "globPatterns():" << globPatterns();
+ DBG() << "suffixes():" << suffixes();
+ DBG() << "preferredSuffix():" << preferredSuffix();
+}
+
+/*!
+ \fn void QMimeType::swap(QMimeType &other);
+ Swaps QMimeType \a other with this QMimeType object.
+
+ This operation is very fast and never fails.
+
+ The swap() method helps with the implementation of assignment
+ operators in an exception-safe way. For more information consult
+ \l {http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap}
+ {More C++ Idioms - Copy-and-swap}.
+ */
+
+/*!
+ \fn QMimeType::~QMimeType();
+ Destroys the QMimeType object, and releases the d pointer.
+ */
+QMimeType::~QMimeType()
+{
+ DBG() << "name():" << name();
+ //DBG() << "aliases():" << aliases();
+ //DBG() << "comment():" << comment();
+ DBG() << "genericIconName():" << genericIconName();
+ DBG() << "iconName():" << iconName();
+ DBG() << "globPatterns():" << globPatterns();
+ DBG() << "suffixes():" << suffixes();
+ DBG() << "preferredSuffix():" << preferredSuffix();
+}
+
+/*!
+ \fn bool QMimeType::operator==(const QMimeType &other) const;
+ Returns true if \a other equals this QMimeType object, otherwise returns false.
+ */
+bool QMimeType::operator==(const QMimeType &other) const
+{
+ return d == other.d || *d == *other.d;
+}
+
+/*!
+ \fn bool QMimeType::operator!=(const QMimeType &other) const;
+ Returns true if \a other does not equal this QMimeType object, otherwise returns false.
+ */
+
+/*!
+ \fn bool QMimeType::isValid() const;
+ Returns true if the QMimeType object contains valid data, otherwise returns false.
+ A valid MIME type has a non-empty name().
+ The invalid MIME type is the default-constructed QMimeType.
+ */
+bool QMimeType::isValid() const
+{
+ return !d->name.isEmpty();
+}
+
+/*!
+ \fn bool QMimeType::isDefault() const;
+ Returns true if this MIME type is the default MIME type which
+ applies to all files: application/octet-stream.
+ */
+bool QMimeType::isDefault() const
+{
+ return d->name == QMimeDatabasePrivate::instance()->defaultMimeType();
+}
+
+/*!
+ \fn QString QMimeType::name() const;
+ Returns the name of the MIME type.
+ */
+QString QMimeType::name() const
+{
+ return d->name;
+}
+
+/*!
+ Returns the description of the MIME type to be displayed on user interfaces.
+
+ The system language (QLocale::system().name()) is used to select the appropriate translation.
+ Another language can be specified by setting the \a localeName argument.
+ */
+QString QMimeType::comment() const
+{
+ QMimeDatabasePrivate::instance()->provider()->loadMimeTypePrivate(*d);
+
+ QStringList languageList;
+ languageList << QLocale::system().name();
+ languageList << QLocale::system().uiLanguages();
+ Q_FOREACH (const QString &lang, languageList) {
+ const QString comm = d->localeComments.value(lang);
+ if (!comm.isEmpty())
+ return comm;
+ const int pos = lang.indexOf(QLatin1Char('_'));
+ if (pos != -1) {
+ // "pt_BR" not found? try just "pt"
+ const QString shortLang = lang.left(pos);
+ const QString commShort = d->localeComments.value(shortLang);
+ if (!commShort.isEmpty())
+ return commShort;
+ }
+ }
+
+ // Use the mimetype name as fallback
+ return d->name;
+}
+
+/*!
+ \fn QString QMimeType::genericIconName() const;
+ Returns the file name of a generic icon that represents the MIME type.
+
+ This should be used if the icon returned by iconName() cannot be found on
+ the system. It is used for categories of similar types (like spreadsheets
+ or archives) that can use a common icon.
+ The freedesktop.org Icon Naming Specification lists a set of such icon names.
+
+ The icon name can be given to QIcon::fromTheme() in order to load the icon.
+ */
+QString QMimeType::genericIconName() const
+{
+ QMimeDatabasePrivate::instance()->provider()->loadGenericIcon(*d);
+ if (d->genericIconName.isEmpty()) {
+ // From the spec:
+ // If the generic icon name is empty (not specified by the mimetype definition)
+ // then the mimetype is used to generate the generic icon by using the top-level
+ // media type (e.g. "video" in "video/ogg") and appending "-x-generic"
+ // (i.e. "video-x-generic" in the previous example).
+ QString group = name();
+ const int slashindex = group.indexOf(QLatin1Char('/'));
+ if (slashindex != -1)
+ group = group.left(slashindex);
+ return group + QLatin1String("-x-generic");
+ }
+ return d->genericIconName;
+}
+
+/*!
+ \fn QString QMimeType::iconName() const;
+ Returns the file name of an icon image that represents the MIME type.
+
+ The icon name can be given to QIcon::fromTheme() in order to load the icon.
+ */
+QString QMimeType::iconName() const
+{
+ QMimeDatabasePrivate::instance()->provider()->loadIcon(*d);
+ if (d->iconName.isEmpty()) {
+ // Make default icon name from the mimetype name
+ d->iconName = name();
+ const int slashindex = d->iconName.indexOf(QLatin1Char('/'));
+ if (slashindex != -1)
+ d->iconName[slashindex] = QLatin1Char('-');
+ }
+ return d->iconName;
+}
+
+/*!
+ \fn QStringList QMimeType::globPatterns() const;
+ Returns the list of glob matching patterns.
+ */
+QStringList QMimeType::globPatterns() const
+{
+ QMimeDatabasePrivate::instance()->provider()->loadMimeTypePrivate(*d);
+ return d->globPatterns;
+}
+
+/*!
+ A type is a subclass of another type if any instance of the first type is
+ also an instance of the second. For example, all image/svg+xml files are also
+ text/xml, text/plain and application/octet-stream files. Subclassing is about
+ the format, rather than the category of the data (for example, there is no
+ 'generic spreadsheet' class that all spreadsheets inherit from).
+ Conversely, the parent mimetype of image/svg+xml is text/xml.
+
+ A mimetype can have multiple parents. For instance application/x-perl
+ has two parents: application/x-executable and text/plain. This makes
+ it possible to both execute perl scripts, and to open them in text editors.
+*/
+QStringList QMimeType::parentMimeTypes() const
+{
+ return QMimeDatabasePrivate::instance()->provider()->parents(d->name);
+}
+
+static void collectParentMimeTypes(const QString &mime, QStringList &allParents)
+{
+ QStringList parents = QMimeDatabasePrivate::instance()->provider()->parents(mime);
+ foreach (const QString &parent, parents) {
+ // I would use QSet, but since order matters I better not
+ if (!allParents.contains(parent))
+ allParents.append(parent);
+ }
+ // We want a breadth-first search, so that the least-specific parent (octet-stream) is last
+ // This means iterating twice, unfortunately.
+ foreach (const QString &parent, parents) {
+ collectParentMimeTypes(parent, allParents);
+ }
+}
+
+/*!
+ Return all the parent mimetypes of this mimetype, direct and indirect.
+ This includes the parent(s) of its parent(s), etc.
+
+ For instance, for image/svg+xml the list would be:
+ application/xml, text/plain, application/octet-stream.
+
+ Note that application/octet-stream is the ultimate parent for all types
+ of files (but not directories).
+*/
+QStringList QMimeType::allAncestors() const
+{
+ QStringList allParents;
+ collectParentMimeTypes(d->name, allParents);
+ return allParents;
+}
+
+/*!
+ \fn QStringList QMimeType::suffixes() const;
+ Returns the known suffixes for the MIME type.
+ */
+QStringList QMimeType::suffixes() const
+{
+ QMimeDatabasePrivate::instance()->provider()->loadMimeTypePrivate(*d);
+
+ QStringList result;
+ foreach (const QString &pattern, d->globPatterns) {
+ // Not a simple suffix if if looks like: README or *. or *.* or *.JP*G or *.JP?
+ if (pattern.startsWith(QLatin1String("*.")) &&
+ pattern.length() > 2 &&
+ pattern.indexOf(QLatin1Char('*'), 2) < 0 && pattern.indexOf(QLatin1Char('?'), 2) < 0) {
+ const QString suffix = pattern.mid(2);
+ result.append(suffix);
+ }
+ }
+
+ return result;
+}
+
+/*!
+ \fn QString QMimeType::preferredSuffix() const;
+ Returns the preferred suffix for the MIME type.
+ */
+QString QMimeType::preferredSuffix() const
+{
+ const QStringList suffixList = suffixes();
+ return suffixList.isEmpty() ? QString() : suffixList.at(0);
+}
+
+/*!
+ \fn QString QMimeType::filterString() const;
+ Returns a filter string usable for a file dialog.
+*/
+QString QMimeType::filterString() const
+{
+ QMimeDatabasePrivate::instance()->provider()->loadMimeTypePrivate(*d);
+ QString filter;
+
+ if (!d->globPatterns.empty()) {
+ filter += comment() + QLatin1String(" (");
+ for (int i = 0; i < d->globPatterns.size(); ++i) {
+ if (i != 0)
+ filter += QLatin1Char(' ');
+ filter += d->globPatterns.at(i);
+ }
+ filter += QLatin1Char(')');
+ }
+
+ return filter;
+}
+
+/*!
+ \fn bool QMimeType::inherits(const QString &mimeTypeName) const;
+ Returns true if this mimetype is \a mimeTypeName,
+ or inherits \a mimeTypeName (see parentMimeTypes()),
+ or \a mimeTypeName is an alias for this mimetype.
+ */
+bool QMimeType::inherits(const QString &mimeTypeName) const
+{
+ if (d->name == mimeTypeName)
+ return true;
+ return QMimeDatabasePrivate::instance()->inherits(d->name, mimeTypeName);
+}
+
+#undef DBG
+
+QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimetype.h b/src/corelib/mimetypes/qmimetype.h
new file mode 100644
index 0000000000..68d17caaba
--- /dev/null
+++ b/src/corelib/mimetypes/qmimetype.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QMIMETYPE_H
+#define QMIMETYPE_H
+
+#include <QtCore/qshareddata.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMimeTypePrivate;
+class QFileinfo;
+class QStringList;
+
+class Q_CORE_EXPORT QMimeType
+{
+public:
+ QMimeType();
+ QMimeType(const QMimeType &other);
+ QMimeType &operator=(const QMimeType &other);
+#ifdef Q_COMPILER_RVALUE_REFS
+ QMimeType(QMimeType &&other);
+
+ QMimeType &operator=(QMimeType &&other)
+ {
+ qSwap(d, other.d);
+ return *this;
+ }
+#endif
+ void swap(QMimeType &other)
+ {
+ qSwap(d, other.d);
+ }
+ explicit QMimeType(const QMimeTypePrivate &dd);
+ ~QMimeType();
+
+ bool operator==(const QMimeType &other) const;
+
+ inline bool operator!=(const QMimeType &other) const
+ {
+ return !operator==(other);
+ }
+
+ bool isValid() const;
+
+ bool isDefault() const;
+
+ QString name() const;
+ QString comment() const;
+ QString genericIconName() const;
+ QString iconName() const;
+ QStringList globPatterns() const;
+ QStringList parentMimeTypes() const;
+ QStringList allAncestors() const;
+ QStringList suffixes() const;
+ QString preferredSuffix() const;
+
+ bool inherits(const QString &mimeTypeName) const;
+
+ QString filterString() const;
+
+protected:
+ friend class QMimeTypeParserBase;
+ friend class MimeTypeMapEntry;
+ friend class QMimeDatabasePrivate;
+ friend class QMimeXMLProvider;
+ friend class QMimeBinaryProvider;
+ friend class QMimeTypePrivate;
+
+ QExplicitlySharedDataPointer<QMimeTypePrivate> d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMIMETYPE_H
diff --git a/src/corelib/mimetypes/qmimetype_p.h b/src/corelib/mimetypes/qmimetype_p.h
new file mode 100644
index 0000000000..d8aadccf50
--- /dev/null
+++ b/src/corelib/mimetypes/qmimetype_p.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QMIMETYPE_P_H
+#define QMIMETYPE_P_H
+
+#include "qmimetype.h"
+
+#include <QtCore/qhash.h>
+#include <QtCore/qstringlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_AUTOTEST_EXPORT QMimeTypePrivate : public QSharedData
+{
+public:
+ typedef QHash<QString, QString> LocaleHash;
+
+ QMimeTypePrivate();
+ explicit QMimeTypePrivate(const QMimeType &other);
+
+ void clear();
+
+ bool operator==(const QMimeTypePrivate &other) const;
+
+ void addGlobPattern(const QString &pattern);
+
+ QString name;
+ LocaleHash localeComments;
+ QString genericIconName;
+ QString iconName;
+ QStringList globPatterns;
+};
+
+QT_END_NAMESPACE
+
+#define QMIMETYPE_BUILDER \
+ QT_BEGIN_NAMESPACE \
+ static QMimeType buildQMimeType ( \
+ const QString &name, \
+ const QString &genericIconName, \
+ const QString &iconName, \
+ const QStringList &globPatterns \
+ ) \
+ { \
+ QMimeTypePrivate qMimeTypeData; \
+ qMimeTypeData.name = name; \
+ qMimeTypeData.genericIconName = genericIconName; \
+ qMimeTypeData.iconName = iconName; \
+ qMimeTypeData.globPatterns = globPatterns; \
+ return QMimeType(qMimeTypeData); \
+ } \
+ QT_END_NAMESPACE
+
+#ifdef Q_COMPILER_RVALUE_REFS
+#define QMIMETYPE_BUILDER_FROM_RVALUE_REFS \
+ QT_BEGIN_NAMESPACE \
+ static QMimeType buildQMimeType ( \
+ QString &&name, \
+ QString &&genericIconName, \
+ QString &&iconName, \
+ QStringList &&globPatterns \
+ ) \
+ { \
+ QMimeTypePrivate qMimeTypeData; \
+ qMimeTypeData.name = std::move(name); \
+ qMimeTypeData.genericIconName = std::move(genericIconName); \
+ qMimeTypeData.iconName = std::move(iconName); \
+ qMimeTypeData.globPatterns = std::move(globPatterns); \
+ return QMimeType(qMimeTypeData); \
+ } \
+ QT_END_NAMESPACE
+#endif
+
+#endif // QMIMETYPE_P_H
diff --git a/src/corelib/mimetypes/qmimetypeparser.cpp b/src/corelib/mimetypes/qmimetypeparser.cpp
new file mode 100644
index 0000000000..23f57367e3
--- /dev/null
+++ b/src/corelib/mimetypes/qmimetypeparser.cpp
@@ -0,0 +1,342 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#define QT_NO_CAST_FROM_ASCII
+
+#include "qmimetypeparser_p.h"
+
+#include "qmimetype_p.h"
+#include "qmimemagicrulematcher_p.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QPair>
+#include <QtCore/QXmlStreamReader>
+#include <QtCore/QXmlStreamWriter>
+#include <QtCore/QStack>
+
+QT_BEGIN_NAMESPACE
+
+// XML tags in MIME files
+const char *const mimeInfoTagC = "mime-info";
+const char *const mimeTypeTagC = "mime-type";
+const char *const mimeTypeAttributeC = "type";
+const char *const subClassTagC = "sub-class-of";
+const char *const commentTagC = "comment";
+const char *const genericIconTagC = "generic-icon";
+const char *const iconTagC = "icon";
+const char *const nameAttributeC = "name";
+const char *const globTagC = "glob";
+const char *const aliasTagC = "alias";
+const char *const patternAttributeC = "pattern";
+const char *const weightAttributeC = "weight";
+const char *const caseSensitiveAttributeC = "case-sensitive";
+const char *const localeAttributeC = "xml:lang";
+
+const char *const magicTagC = "magic";
+const char *const priorityAttributeC = "priority";
+
+const char *const matchTagC = "match";
+const char *const matchValueAttributeC = "value";
+const char *const matchTypeAttributeC = "type";
+const char *const matchOffsetAttributeC = "offset";
+const char *const matchMaskAttributeC = "mask";
+
+/*!
+ \class QMimeTypeParser
+ \internal
+ \brief The QMimeTypeParser class parses MIME types, and builds a MIME database hierarchy by adding to QMimeDatabasePrivate.
+
+ Populates QMimeDataBase
+
+ \sa QMimeDatabase, QMimeMagicRuleMatcher, MagicRule, MagicStringRule, MagicByteRule, GlobPattern
+ \sa QMimeTypeParser
+*/
+
+
+/*!
+ \class QMimeTypeParserBase
+ \brief The QMimeTypeParserBase class parses for a sequence of <mime-type> in a generic way.
+
+ Calls abstract handler function process for QMimeType it finds.
+
+ \sa QMimeDatabase, QMimeMagicRuleMatcher, MagicRule, MagicStringRule, MagicByteRule, GlobPattern
+ \sa QMimeTypeParser
+*/
+
+/*!
+ \fn virtual bool QMimeTypeParserBase::process(const QMimeType &t, QString *errorMessage) = 0;
+ Overwrite to process the sequence of parsed data
+*/
+
+QMimeTypeParserBase::ParseState QMimeTypeParserBase::nextState(ParseState currentState, const QStringRef &startElement)
+{
+ switch (currentState) {
+ case ParseBeginning:
+ if (startElement == QLatin1String(mimeInfoTagC))
+ return ParseMimeInfo;
+ if (startElement == QLatin1String(mimeTypeTagC))
+ return ParseMimeType;
+ return ParseError;
+ case ParseMimeInfo:
+ return startElement == QLatin1String(mimeTypeTagC) ? ParseMimeType : ParseError;
+ case ParseMimeType:
+ case ParseComment:
+ case ParseGenericIcon:
+ case ParseIcon:
+ case ParseGlobPattern:
+ case ParseSubClass:
+ case ParseAlias:
+ case ParseOtherMimeTypeSubTag:
+ case ParseMagicMatchRule:
+ if (startElement == QLatin1String(mimeTypeTagC)) // Sequence of <mime-type>
+ return ParseMimeType;
+ if (startElement == QLatin1String(commentTagC ))
+ return ParseComment;
+ if (startElement == QLatin1String(genericIconTagC))
+ return ParseGenericIcon;
+ if (startElement == QLatin1String(iconTagC))
+ return ParseIcon;
+ if (startElement == QLatin1String(globTagC))
+ return ParseGlobPattern;
+ if (startElement == QLatin1String(subClassTagC))
+ return ParseSubClass;
+ if (startElement == QLatin1String(aliasTagC))
+ return ParseAlias;
+ if (startElement == QLatin1String(magicTagC))
+ return ParseMagic;
+ if (startElement == QLatin1String(matchTagC))
+ return ParseMagicMatchRule;
+ return ParseOtherMimeTypeSubTag;
+ case ParseMagic:
+ if (startElement == QLatin1String(matchTagC))
+ return ParseMagicMatchRule;
+ break;
+ case ParseError:
+ break;
+ }
+ return ParseError;
+}
+
+// Parse int number from an (attribute) string)
+static bool parseNumber(const QString &n, int *target, QString *errorMessage)
+{
+ bool ok;
+ *target = n.toInt(&ok);
+ if (!ok) {
+ *errorMessage = QString::fromLatin1("Not a number '%1'.").arg(n);
+ return false;
+ }
+ return true;
+}
+
+// Evaluate a magic match rule like
+// <match value="must be converted with BinHex" type="string" offset="11"/>
+// <match value="0x9501" type="big16" offset="0:64"/>
+static bool createMagicMatchRule(const QXmlStreamAttributes &atts,
+ QString *errorMessage, QMimeMagicRule *&rule)
+{
+ const QString type = atts.value(QLatin1String(matchTypeAttributeC)).toString();
+ QMimeMagicRule::Type magicType = QMimeMagicRule::type(type.toLatin1());
+ if (magicType == QMimeMagicRule::Invalid) {
+ qWarning("%s: match type %s is not supported.", Q_FUNC_INFO, type.toUtf8().constData());
+ return true;
+ }
+ const QString value = atts.value(QLatin1String(matchValueAttributeC)).toString();
+ if (value.isEmpty()) {
+ *errorMessage = QString::fromLatin1("Empty match value detected.");
+ return false;
+ }
+ // Parse for offset as "1" or "1:10"
+ int startPos, endPos;
+ const QString offsetS = atts.value(QLatin1String(matchOffsetAttributeC)).toString();
+ const int colonIndex = offsetS.indexOf(QLatin1Char(':'));
+ const QString startPosS = colonIndex == -1 ? offsetS : offsetS.mid(0, colonIndex);
+ const QString endPosS = colonIndex == -1 ? offsetS : offsetS.mid(colonIndex + 1);
+ if (!parseNumber(startPosS, &startPos, errorMessage) || !parseNumber(endPosS, &endPos, errorMessage))
+ return false;
+ const QString mask = atts.value(QLatin1String(matchMaskAttributeC)).toString();
+
+ rule = new QMimeMagicRule(magicType, value.toUtf8(), startPos, endPos, mask.toLatin1());
+
+ return true;
+}
+
+bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString *errorMessage)
+{
+ QMimeTypePrivate data;
+ int priority = 50;
+ QStack<QMimeMagicRule *> currentRules; // stack for the nesting of rules
+ QList<QMimeMagicRule> rules; // toplevel rules
+ QXmlStreamReader reader(dev);
+ ParseState ps = ParseBeginning;
+ QXmlStreamAttributes atts;
+ while (!reader.atEnd()) {
+ switch (reader.readNext()) {
+ case QXmlStreamReader::StartElement:
+ ps = nextState(ps, reader.name());
+ atts = reader.attributes();
+ switch (ps) {
+ case ParseMimeType: { // start parsing a MIME type name
+ const QString name = atts.value(QLatin1String(mimeTypeAttributeC)).toString();
+ if (name.isEmpty()) {
+ reader.raiseError(QString::fromLatin1("Missing '%1'-attribute").arg(QString::fromLatin1(mimeTypeAttributeC)));
+ } else {
+ data.name = name;
+ }
+ }
+ break;
+ case ParseGenericIcon:
+ data.genericIconName = atts.value(QLatin1String(nameAttributeC)).toString();
+ break;
+ case ParseIcon:
+ data.iconName = atts.value(QLatin1String(nameAttributeC)).toString();
+ break;
+ case ParseGlobPattern: {
+ const QString pattern = atts.value(QLatin1String(patternAttributeC)).toString();
+ unsigned weight = atts.value(QLatin1String(weightAttributeC)).toString().toInt();
+ const bool caseSensitive = atts.value(QLatin1String(caseSensitiveAttributeC)).toString() == QLatin1String("true");
+
+ if (weight == 0)
+ weight = QMimeGlobPattern::DefaultWeight;
+
+ Q_ASSERT(!data.name.isEmpty());
+ const QMimeGlobPattern glob(pattern, data.name, weight, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
+ if (!process(glob, errorMessage)) // for actual glob matching
+ return false;
+ data.addGlobPattern(pattern); // just for QMimeType::globPatterns()
+ }
+ break;
+ case ParseSubClass: {
+ const QString inheritsFrom = atts.value(QLatin1String(mimeTypeAttributeC)).toString();
+ if (!inheritsFrom.isEmpty())
+ processParent(data.name, inheritsFrom);
+ }
+ break;
+ case ParseComment: {
+ // comments have locale attributes. We want the default, English one
+ QString locale = atts.value(QLatin1String(localeAttributeC)).toString();
+ const QString comment = reader.readElementText();
+ if (locale.isEmpty())
+ locale = QString::fromLatin1("en_US");
+ data.localeComments.insert(locale, comment);
+ }
+ break;
+ case ParseAlias: {
+ const QString alias = atts.value(QLatin1String(mimeTypeAttributeC)).toString();
+ if (!alias.isEmpty())
+ processAlias(alias, data.name);
+ }
+ break;
+ case ParseMagic: {
+ priority = 50;
+ const QString priorityS = atts.value(QLatin1String(priorityAttributeC)).toString();
+ if (!priorityS.isEmpty()) {
+ if (!parseNumber(priorityS, &priority, errorMessage))
+ return false;
+
+ }
+ currentRules.clear();
+ //qDebug() << "MAGIC start for mimetype" << data.name;
+ }
+ break;
+ case ParseMagicMatchRule: {
+ QMimeMagicRule *rule = 0;
+ if (!createMagicMatchRule(atts, errorMessage, rule))
+ return false;
+ QList<QMimeMagicRule> *ruleList;
+ if (currentRules.isEmpty())
+ ruleList = &rules;
+ else // nest this rule into the proper parent
+ ruleList = &currentRules.top()->m_subMatches;
+ ruleList->append(*rule);
+ //qDebug() << " MATCH added. Stack size was" << currentRules.size();
+ currentRules.push(&ruleList->last());
+ delete rule;
+ break;
+ }
+ case ParseError:
+ reader.raiseError(QString::fromLatin1("Unexpected element <%1>").
+ arg(reader.name().toString()));
+ break;
+ default:
+ break;
+ }
+ break;
+ // continue switch QXmlStreamReader::Token...
+ case QXmlStreamReader::EndElement: // Finished element
+ {
+ const QStringRef elementName = reader.name();
+ if (elementName == QLatin1String(mimeTypeTagC)) {
+ if (!process(QMimeType(data), errorMessage))
+ return false;
+ data.clear();
+ } else if (elementName == QLatin1String(matchTagC)) {
+ // Closing a <match> tag, pop stack
+ currentRules.pop();
+ //qDebug() << " MATCH closed. Stack size is now" << currentRules.size();
+ } else if (elementName == QLatin1String(magicTagC)) {
+ //qDebug() << "MAGIC ended, we got" << rules.count() << "rules, with prio" << priority;
+ // Finished a <magic> sequence
+ QMimeMagicRuleMatcher ruleMatcher(data.name, priority);
+ ruleMatcher.addRules(rules);
+ processMagicMatcher(ruleMatcher);
+ rules.clear();
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ if (reader.hasError()) {
+ if (errorMessage)
+ *errorMessage = QString::fromLatin1("An error has been encountered at line %1 of %2: %3:").arg(reader.lineNumber()).arg(fileName, reader.errorString());
+ return false;
+ }
+
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimetypeparser_p.h b/src/corelib/mimetypes/qmimetypeparser_p.h
new file mode 100644
index 0000000000..455c07063c
--- /dev/null
+++ b/src/corelib/mimetypes/qmimetypeparser_p.h
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef MIMETYPEPARSER_P_H
+#define MIMETYPEPARSER_P_H
+
+#include "qmimedatabase_p.h"
+#include "qmimeprovider_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QIODevice;
+
+// XML tags in MIME files
+extern const char *const mimeInfoTagC;
+extern const char *const mimeTypeTagC;
+extern const char *const mimeTypeAttributeC;
+extern const char *const subClassTagC;
+extern const char *const commentTagC;
+extern const char *const genericIconTagC;
+extern const char *const nameAttributeC;
+extern const char *const globTagC;
+extern const char *const aliasTagC;
+extern const char *const patternAttributeC;
+extern const char *const weightAttributeC;
+extern const char *const caseSensitiveAttributeC;
+extern const char *const localeAttributeC;
+
+extern const char *const magicTagC;
+extern const char *const priorityAttributeC;
+
+extern const char *const matchTagC;
+extern const char *const matchValueAttributeC;
+extern const char *const matchTypeAttributeC;
+extern const char *const matchOffsetAttributeC;
+extern const char *const matchMaskAttributeC;
+
+class QMimeTypeParserBase
+{
+ Q_DISABLE_COPY(QMimeTypeParserBase)
+
+public:
+ QMimeTypeParserBase() {}
+ virtual ~QMimeTypeParserBase() {}
+
+ bool parse(QIODevice *dev, const QString &fileName, QString *errorMessage);
+
+protected:
+ virtual bool process(const QMimeType &t, QString *errorMessage) = 0;
+ virtual bool process(const QMimeGlobPattern &t, QString *errorMessage) = 0;
+ virtual void processParent(const QString &child, const QString &parent) = 0;
+ virtual void processAlias(const QString &alias, const QString &name) = 0;
+ virtual void processMagicMatcher(const QMimeMagicRuleMatcher &matcher) = 0;
+
+private:
+ enum ParseState {
+ ParseBeginning,
+ ParseMimeInfo,
+ ParseMimeType,
+ ParseComment,
+ ParseGenericIcon,
+ ParseIcon,
+ ParseGlobPattern,
+ ParseSubClass,
+ ParseAlias,
+ ParseMagic,
+ ParseMagicMatchRule,
+ ParseOtherMimeTypeSubTag,
+ ParseError
+ };
+
+ static ParseState nextState(ParseState currentState, const QStringRef &startElement);
+};
+
+
+class QMimeTypeParser : public QMimeTypeParserBase
+{
+public:
+ explicit QMimeTypeParser(QMimeXMLProvider &provider) : m_provider(provider) {}
+
+protected:
+ inline bool process(const QMimeType &t, QString *)
+ { m_provider.addMimeType(t); return true; }
+
+ inline bool process(const QMimeGlobPattern &glob, QString *)
+ { m_provider.addGlobPattern(glob); return true; }
+
+ inline void processParent(const QString &child, const QString &parent)
+ { m_provider.addParent(child, parent); }
+
+ inline void processAlias(const QString &alias, const QString &name)
+ { m_provider.addAlias(alias, name); }
+
+ inline void processMagicMatcher(const QMimeMagicRuleMatcher &matcher)
+ { m_provider.addMagicMatcher(matcher); }
+
+private:
+ QMimeXMLProvider &m_provider;
+};
+
+QT_END_NAMESPACE
+
+#endif // MIMETYPEPARSER_P_H
diff --git a/src/corelib/plugin/qelfparser_p.cpp b/src/corelib/plugin/qelfparser_p.cpp
index 0e8d43454c..70abbaf6e1 100644
--- a/src/corelib/plugin/qelfparser_p.cpp
+++ b/src/corelib/plugin/qelfparser_p.cpp
@@ -203,7 +203,7 @@ int QElfParser::parse(const char *dataStart, ulong fdlen, const QString &library
qDebug() << "++++" << i << shnam;
#endif
- if (qstrcmp(shnam, ".qtplugin") == 0 || qstrcmp(shnam, ".rodata") == 0) {
+ if (qstrcmp(shnam, ".qtmetadata") == 0 || qstrcmp(shnam, ".qtplugin") == 0 || qstrcmp(shnam, ".rodata") == 0) {
if (!(sh.type & 0x1)) {
if (shnam[1] == 'r') {
if (lib)
@@ -227,7 +227,7 @@ int QElfParser::parse(const char *dataStart, ulong fdlen, const QString &library
*pos = sh.offset;
*sectionlen = sh.size - 1;
if (shnam[1] == 'q')
- return Ok;
+ return shnam[3] == 'm' ? QtMetaDataSection : QtPluginSection;
}
s += e_shentsize;
}
diff --git a/src/corelib/plugin/qelfparser_p.h b/src/corelib/plugin/qelfparser_p.h
index 96e1eac33f..afd8112138 100644
--- a/src/corelib/plugin/qelfparser_p.h
+++ b/src/corelib/plugin/qelfparser_p.h
@@ -72,7 +72,7 @@ typedef quintptr qelfaddr_t;
class QElfParser
{
public:
- enum {Ok = 0, NotElf = 1, NoQtSection = 2, Corrupt = 3};
+ enum { QtMetaDataSection, QtPluginSection, NoQtSection, NotElf, Corrupt };
enum {ElfLittleEndian = 0, ElfBigEndian = 1};
struct ElfSectionHeader
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index e887ae8bf9..566ece77c9 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -51,6 +51,10 @@
#include "qpluginloader.h"
#include "private/qobject_p.h"
#include "private/qcoreapplication_p.h"
+#include "qjsondocument.h"
+#include "qjsonvalue.h"
+#include "qjsonobject.h"
+#include "qjsonarray.h"
QT_BEGIN_NAMESPACE
@@ -78,8 +82,11 @@ public:
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
{
- for (int i = 0; i < libraryList.count(); ++i)
- libraryList.at(i)->release();
+ for (int i = 0; i < libraryList.count(); ++i) {
+ QLibraryPrivate *library = libraryList.at(i);
+ library->unload();
+ library->release();
+ }
}
QFactoryLoader::QFactoryLoader(const char *iid,
@@ -134,26 +141,45 @@ void QFactoryLoader::update()
continue;
}
QStringList keys;
- if (!library->loadPlugin()) {
- if (qt_debug_component()) {
- qDebug() << library->errorString;
- qDebug() << " could not load";
+ if (library->compatPlugin) {
+ qWarning("Qt plugin loader: Compatibility plugin '%s', need to load for accessing meta data.",
+ qPrintable(QDir::toNativeSeparators(fileName)));
+ if (!library->loadPlugin()) {
+ if (qt_debug_component()) {
+ qDebug() << library->errorString;
+ qDebug() << " could not load";
+ }
+ library->release();
+ continue;
}
- library->release();
- continue;
- }
- QObject *instance = library->instance();
- if (!instance) {
- library->release();
- // ignore plugins that have a valid signature but cannot be loaded.
- continue;
+
+ if (!library->inst)
+ library->inst = library->instance();
+ QObject *instance = library->inst.data();
+ if (!instance) {
+ library->release();
+ // ignore plugins that have a valid signature but cannot be loaded.
+ continue;
+ }
+ QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instance);
+ if (instance && factory && instance->qt_metacast(d->iid))
+ keys = factory->keys();
+ } else {
+ QString iid = library->metaData.value(QLatin1String("IID")).toString();
+ if (iid == QLatin1String(d->iid.constData(), d->iid.size())) {
+ QJsonObject object = library->metaData.value(QLatin1String("MetaData")).toObject();
+ QJsonArray k = object.value(QLatin1String("Keys")).toArray();
+ for (int i = 0; i < k.size(); ++i) {
+ QString s = k.at(i).toString();
+ keys += s;
+ }
+ }
+ if (qt_debug_component())
+ qDebug() << "Got keys from plugin meta data" << keys;
}
- QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instance);
- if (instance && factory && instance->qt_metacast(d->iid))
- keys = factory->keys();
- if (keys.isEmpty())
- library->unload();
+
if (keys.isEmpty()) {
+ library->unload();
library->release();
continue;
}
@@ -167,7 +193,12 @@ void QFactoryLoader::update()
if (!d->cs)
key = key.toLower();
QLibraryPrivate *previous = d->keyMap.value(key);
- if (!previous || (previous->qt_version > QT_VERSION && library->qt_version <= QT_VERSION)) {
+ int prev_qt_version = 0;
+ if (previous) {
+ prev_qt_version = (int)previous->metaData.value(QLatin1String("version")).toDouble();
+ }
+ int qt_version = (int)library->metaData.value(QLatin1String("version")).toDouble();
+ if (!previous || (prev_qt_version > QT_VERSION && qt_version <= QT_VERSION)) {
d->keyMap[key] = library;
d->keyList += keys.at(k);
}
@@ -194,29 +225,85 @@ QStringList QFactoryLoader::keys() const
Q_D(const QFactoryLoader);
QMutexLocker locker(&d->mutex);
QStringList keys = d->keyList;
- QObjectList instances = QPluginLoader::staticInstances();
- for (int i = 0; i < instances.count(); ++i)
- if (QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instances.at(i)))
- if (instances.at(i)->qt_metacast(d->iid))
+ QVector<QStaticPlugin> staticPlugins = QLibraryPrivate::staticPlugins();
+ for (int i = 0; i < staticPlugins.count(); ++i) {
+ if (staticPlugins.at(i).metaData) {
+ const char *rawMetaData = staticPlugins.at(i).metaData();
+ QJsonObject object = QLibraryPrivate::fromRawMetaData(rawMetaData).object();
+ if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size()))
+ continue;
+
+ QJsonObject meta = object.value(QLatin1String("MetaData")).toObject();
+ QJsonArray a = meta.value(QLatin1String("Keys")).toArray();
+ for (int i = 0; i < a.size(); ++i) {
+ QString s = a.at(i).toString();
+ if (!s.isEmpty())
+ keys += s;
+ }
+ } else {
+ // compat plugin
+ QObject *instance = staticPlugins.at(i).instance();
+ QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instance);
+ if (instance && factory && instance->qt_metacast(d->iid))
keys += factory->keys();
+ }
+ }
return keys;
}
+QList<QJsonObject> QFactoryLoader::metaData() const
+{
+ Q_D(const QFactoryLoader);
+ QMutexLocker locker(&d->mutex);
+ QList<QJsonObject> metaData;
+ for (int i = 0; i < d->libraryList.size(); ++i)
+ metaData.append(d->libraryList.at(i)->metaData);
+
+ QVector<QStaticPlugin> staticPlugins = QLibraryPrivate::staticPlugins();
+ for (int i = 0; i < staticPlugins.count(); ++i) {
+ if (staticPlugins.at(i).metaData) {
+ const char *rawMetaData = staticPlugins.at(i).metaData();
+ QJsonObject object = QLibraryPrivate::fromRawMetaData(rawMetaData).object();
+ if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size()))
+ continue;
+
+ QJsonObject meta = object.value(QLatin1String("MetaData")).toObject();
+ metaData.append(meta);
+ } else {
+ // compat plugins
+ QObject *instance = staticPlugins.at(i).instance();
+ QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instance);
+ if (instance && factory && instance->qt_metacast(d->iid)) {
+ QJsonObject meta;
+ QJsonArray a = QJsonArray::fromStringList(factory->keys());
+ meta.insert(QLatin1String("Keys"), a);
+ metaData.append(meta);
+ }
+ }
+ }
+ return metaData;
+}
+
QObject *QFactoryLoader::instance(const QString &key) const
{
Q_D(const QFactoryLoader);
QMutexLocker locker(&d->mutex);
- QObjectList instances = QPluginLoader::staticInstances();
- for (int i = 0; i < instances.count(); ++i)
- if (QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instances.at(i)))
- if (instances.at(i)->qt_metacast(d->iid) && factory->keys().contains(key, Qt::CaseInsensitive))
- return instances.at(i);
+ QVector<QStaticPlugin> staticPlugins = QLibraryPrivate::staticPlugins();
+ for (int i = 0; i < staticPlugins.count(); ++i) {
+ QObject *instance = staticPlugins.at(i).instance();
+ if (QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instance))
+ if (instance->qt_metacast(d->iid) && factory->keys().contains(key, Qt::CaseInsensitive))
+ return instance;
+ }
QString lowered = d->cs ? key : key.toLower();
if (QLibraryPrivate* library = d->keyMap.value(lowered)) {
if (library->instance || library->loadPlugin()) {
- if (QObject *obj = library->instance()) {
- if (obj && !obj->parent())
+ if (!library->inst)
+ library->inst = library->instance();
+ QObject *obj = library->inst.data();
+ if (obj) {
+ if (!obj->parent())
obj->moveToThread(QCoreApplicationPrivate::mainThread());
return obj;
}
@@ -225,6 +312,26 @@ QObject *QFactoryLoader::instance(const QString &key) const
return 0;
}
+QObject *QFactoryLoader::instance(int index) const
+{
+ Q_D(const QFactoryLoader);
+ if (index < 0 || index >= d->libraryList.size())
+ return 0;
+
+ QLibraryPrivate *library = d->libraryList.at(index);
+ if (library->instance || library->loadPlugin()) {
+ if (!library->inst)
+ library->inst = library->instance();
+ QObject *obj = library->inst.data();
+ if (obj) {
+ if (!obj->parent())
+ obj->moveToThread(QCoreApplicationPrivate::mainThread());
+ return obj;
+ }
+ }
+ return 0;
+}
+
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
QLibraryPrivate *QFactoryLoader::library(const QString &key) const
{
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index 2241a22e5f..ee7a68d6f8 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -55,8 +55,8 @@
#include "QtCore/qobject.h"
#include "QtCore/qstringlist.h"
+#include "QtCore/qjsonobject.h"
#include "private/qlibrary_p.h"
-
#ifndef QT_NO_LIBRARY
QT_BEGIN_NAMESPACE
@@ -74,8 +74,11 @@ public:
Qt::CaseSensitivity = Qt::CaseSensitive);
~QFactoryLoader();
- QStringList keys() const;
- QObject *instance(const QString &key) const;
+ QT_DEPRECATED QStringList keys() const;
+ QList<QJsonObject> metaData() const;
+
+ QT_DEPRECATED QObject *instance(const QString &key) const;
+ QObject *instance(int index) const;
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
QLibraryPrivate *library(const QString &key) const;
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index dc08b32db1..b171577184 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -60,6 +60,9 @@
#include <qdebug.h>
#include <qvector.h>
#include <qdir.h>
+#include <qendian.h>
+#include <qjsondocument.h>
+#include <qjsonvalue.h>
#include "qelfparser_p.h"
QT_BEGIN_NAMESPACE
@@ -330,7 +333,7 @@ static long qt_find_pattern(const char *s, ulong s_len,
information could not be read.
Returns true if version information is present and successfully read.
*/
-static bool qt_unix_query(const QString &library, uint *version, bool *debug, QLibraryPrivate *lib = 0)
+static bool qt_unix_query(const QString &library, QLibraryPrivate *lib)
{
QFile file(library);
if (!file.open(QIODevice::ReadOnly)) {
@@ -357,35 +360,71 @@ static bool qt_unix_query(const QString &library, uint *version, bool *debug, QL
/*
ELF binaries on GNU, have .qplugin sections.
*/
+ bool hasMetaData = false;
long pos = 0;
- const char pattern[] = "pattern=QT_PLUGIN_VERIFICATION_DATA";
+ const char oldPattern[] = "pattern=QT_PLUGIN_VERIFICATION_DATA";
+ const ulong oldPlen = qstrlen(oldPattern);
+ const char pattern[] = "QTMETADATA ";
const ulong plen = qstrlen(pattern);
#if defined (Q_OF_ELF) && defined(Q_CC_GNU)
int r = QElfParser().parse(filedata, fdlen, library, lib, &pos, &fdlen);
- if (r == QElfParser::NoQtSection) {
+ if (r == QElfParser::Corrupt || r == QElfParser::NotElf) {
+ if (lib && qt_debug_component()) {
+ qWarning("QElfParser: %s",qPrintable(lib->errorString));
+ }
+ return false;
+ } else if (r == QElfParser::NoQtSection || r == QElfParser::QtPluginSection) {
if (pos > 0) {
// find inside .rodata
- long rel = qt_find_pattern(filedata + pos, fdlen, pattern, plen);
+ long rel = qt_find_pattern(filedata + pos, fdlen, oldPattern, oldPlen);
if (rel < 0) {
pos = -1;
} else {
pos += rel;
}
} else {
- pos = qt_find_pattern(filedata, fdlen, pattern, plen);
- }
- } else if (r != QElfParser::Ok) {
- if (lib && qt_debug_component()) {
- qWarning("QElfParser: %s",qPrintable(lib->errorString));
+ pos = qt_find_pattern(filedata, fdlen, oldPattern, oldPlen);
}
- return false;
+ } else if (r == QElfParser::QtMetaDataSection) {
+ long rel = qt_find_pattern(filedata + pos, fdlen, pattern, plen);
+ if (rel < 0)
+ pos = -1;
+ else
+ pos += rel;
+ hasMetaData = true;
}
#else
pos = qt_find_pattern(filedata, fdlen, pattern, plen);
+ if (pos > 0)
+ hasMetaData = true;
+ else
+ pos = qt_find_pattern(filedata, fdlen, oldPattern, oldPlen);
#endif // defined(Q_OF_ELF) && defined(Q_CC_GNU)
+
bool ret = false;
- if (pos >= 0)
- ret = qt_parse_pattern(filedata + pos, version, debug);
+
+ if (pos >= 0) {
+ if (hasMetaData) {
+ const char *data = filedata + pos;
+ QJsonDocument doc = QLibraryPrivate::fromRawMetaData(data);
+ lib->metaData = doc.object();
+ lib->compatPlugin = false;
+ if (qt_debug_component())
+ qWarning("Found metadata in lib %s, metadata=\n%s\n",
+ library.toLocal8Bit().constData(), doc.toJson().constData());
+ ret = !doc.isNull();
+ } else {
+ qWarning("Old plugin format found in lib %s", library.toLocal8Bit().constData());
+ uint version;
+ bool isDebug;
+ ret = qt_parse_pattern(filedata + pos, &version, &isDebug);
+ if (ret) {
+ lib->metaData.insert(QLatin1String("version"), (int)version);
+ lib->metaData.insert(QLatin1String("debug"), isDebug);
+ lib->compatPlugin = true;
+ }
+ }
+ }
if (!ret && lib)
lib->errorString = QLibrary::tr("Plugin verification data mismatch in '%1'").arg(library);
@@ -446,8 +485,9 @@ static LibraryMap *libraryMap()
}
QLibraryPrivate::QLibraryPrivate(const QString &canonicalFileName, const QString &version)
- :pHnd(0), fileName(canonicalFileName), fullVersion(version), instance(0), qt_version(0),
- libraryRefCount(1), libraryUnloadCount(0), pluginState(MightBeAPlugin)
+ : pHnd(0), fileName(canonicalFileName), fullVersion(version), instance(0),
+ compatPlugin(false), loadHints(0),
+ libraryRefCount(1), libraryUnloadCount(0), pluginState(MightBeAPlugin)
{ libraryMap()->insert(canonicalFileName, this); }
QLibraryPrivate *QLibraryPrivate::findOrCreate(const QString &fileName, const QString &version)
@@ -488,6 +528,8 @@ bool QLibraryPrivate::load()
return false;
bool ret = load_sys();
+ if (qt_debug_component())
+ qDebug() << "loaded library" << fileName;
if (ret) {
//when loading a library we add a reference to it so that the QLibraryPrivate won't get deleted
//this allows to unload the library at a later time
@@ -643,13 +685,33 @@ const char* qt_try_versioninfo(void *pfn, bool *exceptionThrown)
}
#endif
-#ifdef Q_CC_BOR
-typedef const char * __stdcall (*QtPluginQueryVerificationDataFunction)();
-#else
typedef const char * (*QtPluginQueryVerificationDataFunction)();
+
+bool qt_get_verificationdata(QtPluginQueryVerificationDataFunction pfn, QLibraryPrivate *priv, bool *exceptionThrown)
+{
+ *exceptionThrown = false;
+ const char *szData = 0;
+ if (!pfn)
+ return false;
+#ifdef QT_USE_MS_STD_EXCEPTION
+ szData = qt_try_versioninfo((void *)pfn, exceptionThrown);
+ if (*exceptionThrown)
+ return false;
+#else
+ szData = pfn();
#endif
+ uint qt_version;
+ bool debug;
+ if (qt_parse_pattern(szData, &qt_version, &debug)) {
+ priv->metaData.insert(QLatin1String("version"), (int)qt_version);
+ priv->metaData.insert(QLatin1String("debug"), debug);
+ priv->compatPlugin = true;
+ return true;
+ }
+ return false;
+}
-bool qt_get_verificationdata(QtPluginQueryVerificationDataFunction pfn, uint *qt_version, bool *debug, bool *exceptionThrown)
+bool qt_get_metadata(QtPluginQueryVerificationDataFunction pfn, QLibraryPrivate *priv, bool *exceptionThrown)
{
*exceptionThrown = false;
const char *szData = 0;
@@ -662,9 +724,17 @@ bool qt_get_verificationdata(QtPluginQueryVerificationDataFunction pfn, uint *qt
#else
szData = pfn();
#endif
- return qt_parse_pattern(szData, qt_version, debug);
+ if (!szData)
+ return false;
+ QJsonDocument doc = QLibraryPrivate::fromRawMetaData(szData);
+ if (doc.isNull())
+ return false;
+ priv->metaData = doc.object();
+ priv->compatPlugin = false;
+ return true;
}
+
bool QLibraryPrivate::isPlugin()
{
errorString.clear();
@@ -672,7 +742,6 @@ bool QLibraryPrivate::isPlugin()
return pluginState == IsAPlugin;
#ifndef QT_NO_PLUGIN_CHECK
- bool debug = !QLIBRARY_AS_DEBUG;
bool success = false;
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
@@ -692,7 +761,7 @@ bool QLibraryPrivate::isPlugin()
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
if (!pHnd) {
// use unix shortcut to avoid loading the library
- success = qt_unix_query(fileName, &qt_version, &debug, this);
+ success = qt_unix_query(fileName, this);
} else
#endif
{
@@ -713,24 +782,50 @@ bool QLibraryPrivate::isPlugin()
temporary_load = load_sys();
#endif
}
+ QtPluginQueryVerificationDataFunction getMetaData = NULL;
+
+ bool exceptionThrown = false;
+ bool ret = false;
#ifdef Q_OS_WIN
- QtPluginQueryVerificationDataFunction qtPluginQueryVerificationDataFunction = hTempModule ? (QtPluginQueryVerificationDataFunction)
+ if (hTempModule) {
+ getMetaData = (QtPluginQueryVerificationDataFunction)
#ifdef Q_OS_WINCE
- ::GetProcAddress(hTempModule, L"qt_plugin_query_verification_data")
+ ::GetProcAddress(hTempModule, L"qt_plugin_query_metadata")
#else
- ::GetProcAddress(hTempModule, "qt_plugin_query_verification_data")
+ ::GetProcAddress(hTempModule, "qt_plugin_query_metadata")
+#endif
+ ;
+ } else
#endif
- : (QtPluginQueryVerificationDataFunction) resolve("qt_plugin_query_verification_data");
+ {
+ getMetaData = (QtPluginQueryVerificationDataFunction) resolve("qt_plugin_query_metadata");
+ }
+
+ if (getMetaData) {
+ ret = qt_get_metadata(getMetaData, this, &exceptionThrown);
+ } else {
+ // try the old plugin style
+ QtPluginQueryVerificationDataFunction qtPluginQueryVerificationDataFunction = NULL;
+#ifdef Q_OS_WIN
+ if (hTempModule) {
+ qtPluginQueryVerificationDataFunction = (QtPluginQueryVerificationDataFunction)
+#ifdef Q_OS_WINCE
+ ::GetProcAddress(hTempModule, L"qt_plugin_query_verification_data")
#else
- QtPluginQueryVerificationDataFunction qtPluginQueryVerificationDataFunction = NULL;
- qtPluginQueryVerificationDataFunction = (QtPluginQueryVerificationDataFunction) resolve("qt_plugin_query_verification_data");
+ ::GetProcAddress(hTempModule, "qt_plugin_query_verification_data")
#endif
- bool exceptionThrown = false;
- bool ret = qt_get_verificationdata(qtPluginQueryVerificationDataFunction,
- &qt_version, &debug, &exceptionThrown);
+ ;
+ } else
+#endif
+ {
+ qtPluginQueryVerificationDataFunction = (QtPluginQueryVerificationDataFunction) resolve("qt_plugin_query_verification_data");
+ }
+
+ ret = qt_get_verificationdata(qtPluginQueryVerificationDataFunction, this, &exceptionThrown);
+ }
+
if (!exceptionThrown) {
if (!ret) {
- qt_version = 0;
if (temporary_load)
unload_sys();
} else {
@@ -772,6 +867,8 @@ bool QLibraryPrivate::isPlugin()
pluginState = IsNotAPlugin; // be pessimistic
+ uint qt_version = (uint)metaData.value(QLatin1String("version")).toDouble();
+ bool debug = metaData.value(QLatin1String("debug")).toBool();
if ((qt_version & 0x00ff00) > (QT_VERSION & 0x00ff00) || (qt_version & 0xff0000) != (QT_VERSION & 0xff0000)) {
if (qt_debug_component()) {
qWarning("In %s:\n"
diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h
index a5f366070c..604a5fbdde 100644
--- a/src/corelib/plugin/qlibrary_p.h
+++ b/src/corelib/plugin/qlibrary_p.h
@@ -58,6 +58,9 @@
#include "QtCore/qstringlist.h"
#include "QtCore/qplugin.h"
#include "QtCore/qsharedpointer.h"
+#include "QtCore/qjsonobject.h"
+#include "QtCore/qjsondocument.h"
+#include "QtCore/qendian.h"
#ifdef Q_OS_WIN
# include "QtCore/qt_windows.h"
#endif
@@ -90,16 +93,26 @@ public:
static QLibraryPrivate *findOrCreate(const QString &fileName, const QString &version = QString());
+ static QVector<QStaticPlugin> staticPlugins();
+
+
QWeakPointer<QObject> inst;
QtPluginInstanceFunction instance;
- uint qt_version;
- QString lastModified;
+ QJsonObject metaData;
+ bool compatPlugin;
QString errorString;
QLibrary::LoadHints loadHints;
bool isPlugin();
+ static inline QJsonDocument fromRawMetaData(const char *raw) {
+ raw += strlen("QTMETADATA ");
+ // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
+ // but doesn't include the size of the header (8 bytes)
+ QByteArray json(raw, qFromLittleEndian<uint>(*(uint *)(raw + 8)) + 8);
+ return QJsonDocument::fromBinaryData(json);
+ }
private:
explicit QLibraryPrivate(const QString &canonicalFileName, const QString &version);
@@ -112,7 +125,7 @@ private:
QAtomicInt libraryRefCount;
QAtomicInt libraryUnloadCount;
- enum {IsAPlugin, IsNotAPlugin, MightBeAPlugin } pluginState;
+ enum { IsAPlugin, IsNotAPlugin, MightBeAPlugin } pluginState;
friend class QLibraryPrivateHasFriends;
};
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 6cc0ceb5c2..93be7248c3 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -59,15 +59,33 @@ QT_BEGIN_NAMESPACE
#endif
typedef QObject *(*QtPluginInstanceFunction)();
+typedef const char *(*QtPluginMetaDataFunction)();
+
+struct QStaticPlugin
+{
+ QtPluginInstanceFunction instance;
+ QtPluginMetaDataFunction metaData;
+};
+
+void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
+
+#if defined (Q_OF_ELF) && defined (Q_CC_GNU)
+# define QT_PLUGIN_VERIFICATION_SECTION \
+ __attribute__ ((section (".qtplugin"))) __attribute__((used))
+# define QT_PLUGIN_METADATA_SECTION \
+ __attribute__ ((section (".qtmetadata"))) __attribute__((used))
+#else
+# define QT_PLUGIN_VERIFICATION_SECTION
+# define QT_PLUGIN_METADATA_SECTION
+#endif
-void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunction function);
#define Q_IMPORT_PLUGIN(PLUGIN) \
- extern QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##PLUGIN(); \
+ extern const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGIN(); \
class Static##PLUGIN##PluginInstance{ \
public: \
Static##PLUGIN##PluginInstance() { \
- qRegisterStaticPluginInstanceFunction(qt_plugin_instance_##PLUGIN); \
+ qRegisterStaticPluginFunction(qt_static_plugin_##PLUGIN()); \
} \
}; \
static Static##PLUGIN##PluginInstance static##PLUGIN##Instance;
@@ -80,21 +98,43 @@ void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunctio
return _instance; \
}
-# define Q_EXPORT_PLUGIN(PLUGIN) \
- Q_EXPORT_PLUGIN2(PLUGIN, PLUGIN)
+#if defined(QT_STATICPLUGIN)
-# define Q_EXPORT_STATIC_PLUGIN(PLUGIN) \
- Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGIN)
+# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS) \
+ static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ static const char *qt_plugin_query_metadata() { return (const char *)qt_pluginMetaData; } \
+ const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGINCLASS() { \
+ QT_PREPEND_NAMESPACE(QStaticPlugin) plugin = { qt_plugin_instance, qt_plugin_query_metadata }; \
+ return plugin; \
+ }
-#if defined(QT_STATICPLUGIN)
+#else
-# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \
- QT_PREPEND_NAMESPACE(QObject) \
- *qt_plugin_instance_##PLUGIN() \
+# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS) \
+ Q_EXTERN_C Q_DECL_EXPORT \
+ const char *qt_plugin_query_metadata() \
+ { return (const char *)qt_pluginMetaData; } \
+ Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
Q_PLUGIN_INSTANCE(PLUGINCLASS)
-# define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS) \
- Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)
+#endif
+
+
+#define Q_EXPORT_PLUGIN(PLUGIN) \
+ Q_EXPORT_PLUGIN2(PLUGIN, PLUGIN)
+#define Q_EXPORT_STATIC_PLUGIN(PLUGIN)
+#define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS)
+
+#if defined(QT_STATICPLUGIN)
+
+# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \
+ static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGIN() { \
+ QT_PREPEND_NAMESPACE(QStaticPlugin) plugin = { qt_plugin_instance, 0 }; \
+ return plugin; \
+ }
#else
// NOTE: if you change pattern, you MUST change the pattern in
@@ -114,29 +154,17 @@ void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunctio
# endif
# define Q_PLUGIN_VERIFICATION_DATA \
static const char qt_plugin_verification_data[] = \
- "pattern=""QT_PLUGIN_VERIFICATION_DATA""\n" \
- "version="QT_VERSION_STR"\n" \
- "debug="QPLUGIN_DEBUG_STR;
+ "pattern=" "QT_PLUGIN_VERIFICATION_DATA" "\n" \
+ "version=" QT_VERSION_STR "\n" \
+ "debug=" QPLUGIN_DEBUG_STR;
-# if defined (Q_OF_ELF) && defined (Q_CC_GNU)
-# define Q_PLUGIN_VERIFICATION_SECTION \
- __attribute__ ((section (".qtplugin"))) __attribute__((used))
-# else
-# define Q_PLUGIN_VERIFICATION_SECTION
-# endif
-
-# if defined (Q_OS_WIN32) && defined(Q_CC_BOR)
-# define Q_STANDARD_CALL __stdcall
-# else
-# define Q_STANDARD_CALL
-# endif
# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \
- Q_PLUGIN_VERIFICATION_SECTION Q_PLUGIN_VERIFICATION_DATA \
+ QT_PLUGIN_VERIFICATION_SECTION Q_PLUGIN_VERIFICATION_DATA \
Q_EXTERN_C Q_DECL_EXPORT \
- const char * Q_STANDARD_CALL qt_plugin_query_verification_data() \
+ const char * qt_plugin_query_verification_data() \
{ return qt_plugin_verification_data; } \
- Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) * Q_STANDARD_CALL qt_plugin_instance() \
+ Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) * qt_plugin_instance() \
Q_PLUGIN_INSTANCE(PLUGINCLASS)
# define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS)
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
index 4ef04f2ea3..d652b251f1 100644
--- a/src/corelib/plugin/qpluginloader.cpp
+++ b/src/corelib/plugin/qpluginloader.cpp
@@ -291,8 +291,8 @@ QString QPluginLoader::errorString() const
return (!d || d->errorString.isEmpty()) ? tr("Unknown error") : d->errorString;
}
-typedef QList<QtPluginInstanceFunction> StaticInstanceFunctionList;
-Q_GLOBAL_STATIC(StaticInstanceFunctionList, staticInstanceFunctionList)
+typedef QVector<QStaticPlugin> StaticPluginList;
+Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
/*! \since 4.4
@@ -329,13 +329,13 @@ QLibrary::LoadHints QPluginLoader::loadHints() const
/*!
\relates QPluginLoader
- \since 4.4
+ \since 5.0
- Registers the given \a function with the plugin loader.
+ Registers the given \a plugin with the plugin loader.
*/
-void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunction function)
+void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin plugin)
{
- staticInstanceFunctionList()->append(function);
+ staticPluginList()->append(plugin);
}
/*!
@@ -345,14 +345,23 @@ void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunctio
QObjectList QPluginLoader::staticInstances()
{
QObjectList instances;
- StaticInstanceFunctionList *functions = staticInstanceFunctionList();
- if (functions) {
- for (int i = 0; i < functions->count(); ++i)
- instances.append((*functions)[i]());
+ const StaticPluginList *plugins = staticPluginList();
+ if (plugins) {
+ for (int i = 0; i < plugins->size(); ++i)
+ instances += plugins->at(i).instance();
}
return instances;
}
+
+QVector<QStaticPlugin> QLibraryPrivate::staticPlugins()
+{
+ StaticPluginList *plugins = staticPluginList();
+ if (plugins)
+ return *plugins;
+ return QVector<QStaticPlugin>();
+}
+
QT_END_NAMESPACE
#endif // QT_NO_LIBRARY
diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h
index ee62986f21..6ca1892fa9 100644
--- a/src/corelib/plugin/qpluginloader.h
+++ b/src/corelib/plugin/qpluginloader.h
@@ -55,7 +55,6 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-
class QLibraryPrivate;
class Q_CORE_EXPORT QPluginLoader : public QObject
@@ -70,7 +69,7 @@ public:
QObject *instance();
- static QObjectList staticInstances();
+ QT_DEPRECATED static QObjectList staticInstances();
bool load();
bool unload();
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 7b1c682e21..3d7988a8fc 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -45,6 +45,9 @@
#include "qendian.h"
#include "qdebug.h"
+#ifndef QT_BOOTSTRAPPED
+#include "qcryptographichash.h"
+#endif
QT_BEGIN_NAMESPACE
#ifndef QT_NO_QUUID_STRING
@@ -133,6 +136,7 @@ bool _q_uuidFromHex(const Char *&src, uint &d1, ushort &d2, ushort &d3, uchar (&
}
#endif
+#ifndef QT_BOOTSTRAPPED
static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCryptographicHash::Algorithm algorithm, int version)
{
QByteArray hashResult;
@@ -155,6 +159,7 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto
return result;
}
+#endif
/*!
\class QUuid
@@ -437,7 +442,7 @@ QUuid::QUuid(const QByteArray &text)
\sa variant(), version(), createUuidV3()
*/
-
+#ifndef QT_BOOTSTRAPPED
QUuid QUuid::createUuidV3(const QUuid &ns, const QByteArray &baseData)
{
return createFromName(ns, baseData, QCryptographicHash::Md5, 3);
@@ -447,6 +452,7 @@ QUuid QUuid::createUuidV5(const QUuid &ns, const QByteArray &baseData)
{
return createFromName(ns, baseData, QCryptographicHash::Sha1, 5);
}
+#endif
/*!
Creates a QUuid object from the binary representation of the UUID, as
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h
index a55d6af3eb..dee97d93a5 100644
--- a/src/corelib/plugin/quuid.h
+++ b/src/corelib/plugin/quuid.h
@@ -43,7 +43,6 @@
#define QUUID_H
#include <QtCore/qstring.h>
-#include <QtCore/qcryptographichash.h>
QT_BEGIN_HEADER
@@ -175,6 +174,7 @@ public:
}
#endif
static QUuid createUuid();
+#ifndef QT_BOOTSTRAPPED
static QUuid createUuidV3(const QUuid &ns, const QByteArray &baseData);
static QUuid createUuidV5(const QUuid &ns, const QByteArray &baseData);
#ifndef QT_NO_QUUID_STRING
@@ -189,6 +189,7 @@ public:
}
#endif
+#endif
QUuid::Variant variant() const;
QUuid::Version version() const;
diff --git a/src/corelib/statemachine/qsignaleventgenerator_p.h b/src/corelib/statemachine/qsignaleventgenerator_p.h
index 2cdca89424..c117a92a01 100644
--- a/src/corelib/statemachine/qsignaleventgenerator_p.h
+++ b/src/corelib/statemachine/qsignaleventgenerator_p.h
@@ -61,13 +61,13 @@ class QStateMachine;
class QSignalEventGenerator : public QObject
{
+ Q_OBJECT_FAKE
public:
QSignalEventGenerator(QStateMachine *parent);
- static const QMetaObject staticMetaObject;
- virtual const QMetaObject *metaObject() const;
- virtual void *qt_metacast(const char *);
- virtual int qt_metacall(QMetaObject::Call, int, void **argv);
+private:
+// slots
+ void execute(void **_a);
private:
Q_DISABLE_COPY(QSignalEventGenerator)
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index 52fd806b05..7ff005f9a1 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -2210,16 +2210,19 @@ void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
#endif // QT_NO_ANIMATION
+// Begin moc-generated code -- modify carefully (check "HAND EDIT" parts)!
static const uint qt_meta_data_QSignalEventGenerator[] = {
// content:
- 2, // revision
+ 6, // revision
0, // classname
0, 0, // classinfo
- 1, 12, // methods
+ 1, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
+ 0, // flags
+ 0, // signalCount
// slots: signature, parameters, type, tag, flags
23, 22, 22, 22, 0x0a,
@@ -2231,9 +2234,26 @@ static const char qt_meta_stringdata_QSignalEventGenerator[] = {
"QSignalEventGenerator\0\0execute()\0"
};
+void QSignalEventGenerator::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
+{
+ if (_c == QMetaObject::InvokeMetaMethod) {
+ Q_ASSERT(staticMetaObject.cast(_o));
+ QSignalEventGenerator *_t = static_cast<QSignalEventGenerator *>(_o);
+ switch (_id) {
+ case 0: _t->execute(_a); break; // HAND EDIT: add the _a parameter
+ default: ;
+ }
+ }
+ Q_UNUSED(_a);
+}
+
+const QMetaObjectExtraData QSignalEventGenerator::staticMetaObjectExtraData = {
+ 0, qt_static_metacall
+};
+
const QMetaObject QSignalEventGenerator::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_QSignalEventGenerator,
- qt_meta_data_QSignalEventGenerator, 0 }
+ qt_meta_data_QSignalEventGenerator, &staticMetaObjectExtraData }
};
const QMetaObject *QSignalEventGenerator::metaObject() const
@@ -2255,26 +2275,27 @@ int QSignalEventGenerator::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
- switch (_id) {
- case 0: {
-// ### in Qt 4.6 we can use QObject::senderSignalIndex()
- QObjectPrivate *d = static_cast<QObjectPrivate *>(d_ptr.data());
- int signalIndex = -1;
- QObject *sender = this->sender();
- if (sender && d->currentSender)
- signalIndex = d->currentSender->signal;
-
- Q_ASSERT(signalIndex != -1);
- QStateMachine *machine = qobject_cast<QStateMachine*>(parent());
- QStateMachinePrivate::get(machine)->handleTransitionSignal(sender, signalIndex, _a);
- break;
- }
- default: ;
- }
+ if (_id < 1)
+ qt_static_metacall(this, _c, _id, _a);
_id -= 1;
}
return _id;
}
+// End moc-generated code
+
+void QSignalEventGenerator::execute(void **_a)
+{
+// ### in Qt 4.6 we can use QObject::senderSignalIndex()
+ QObjectPrivate *d = static_cast<QObjectPrivate *>(d_ptr.data());
+ int signalIndex = -1;
+ QObject *sender = this->sender();
+ if (sender && d->currentSender)
+ signalIndex = d->currentSender->signal;
+
+ Q_ASSERT(signalIndex != -1);
+ QStateMachine *machine = qobject_cast<QStateMachine*>(parent());
+ QStateMachinePrivate::get(machine)->handleTransitionSignal(sender, signalIndex, _a);
+}
QSignalEventGenerator::QSignalEventGenerator(QStateMachine *parent)
: QObject(parent)
diff --git a/src/corelib/thread/qatomic.h b/src/corelib/thread/qatomic.h
index b75ae94429..94cef790db 100644
--- a/src/corelib/thread/qatomic.h
+++ b/src/corelib/thread/qatomic.h
@@ -63,17 +63,11 @@ public:
// Non-atomic API
inline QAtomicInt(int value = 0)
{
-#ifdef QT_ARCH_PARISC
- this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
-#endif
_q_value = value;
}
inline QAtomicInt(const QAtomicInt &other)
{
-#ifdef QT_ARCH_PARISC
- this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
-#endif
store(other.load());
}
@@ -123,16 +117,10 @@ class QAtomicPointer : public QBasicAtomicPointer<T>
public:
inline QAtomicPointer(T *value = 0)
{
-#ifdef QT_ARCH_PARISC
- this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
-#endif
this->store(value);
}
inline QAtomicPointer(const QAtomicPointer<T> &other)
{
-#ifdef QT_ARCH_PARISC
- this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
-#endif
this->store(other.load());
}
diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h
index 47d690c13f..96338c62dc 100644
--- a/src/corelib/thread/qbasicatomic.h
+++ b/src/corelib/thread/qbasicatomic.h
@@ -46,30 +46,62 @@
#if defined(QT_MOC) || defined(QT_BUILD_QMAKE) || defined(QT_RCC) || defined(QT_UIC) || defined(QT_BOOTSTRAPPED)
# include <QtCore/qatomic_bootstrap.h>
+
+// Compiler dependent implementation
#elif defined(Q_CC_MSVC)
# include <QtCore/qatomic_msvc.h>
-#elif defined(__arm__) || defined(__TARGET_ARCH_ARM)
-# include <QtCore/qatomic_arm.h>
-#elif defined(__i386) || defined(__i386__)
-# include <QtCore/qatomic_i386.h>
-#elif defined(__ia64) || defined(__ia64__)
+
+// Operating system dependent implementation
+#elif defined(Q_OS_INTEGRITY)
+# include "QtCore/qatomic_integrity.h"
+#elif defined(Q_OS_VXWORKS)
+# include "QtCore/qatomic_vxworks.h"
+
+// Processor dependent implementation
+#elif defined(Q_PROCESSOR_ALPHA)
+# include "QtCore/qatomic_alpha.h"
+#elif defined(Q_PROCESSOR_ARM_V7)
+# include "QtCore/qatomic_armv7.h"
+#elif defined(Q_PROCESSOR_ARM_V6)
+# include "QtCore/qatomic_armv6.h"
+#elif defined(Q_PROCESSOR_ARM_V5)
+# include "QtCore/qatomic_armv5.h"
+#elif defined(Q_PROCESSOR_BFIN)
+# include "QtCore/qatomic_bfin.h"
+#elif defined(Q_PROCESSOR_IA64)
# include "QtCore/qatomic_ia64.h"
-#elif defined(__mips) || defined(__mips__)
+#elif defined(Q_PROCESSOR_MIPS)
# include "QtCore/qatomic_mips.h"
-#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64)
+#elif defined(Q_PROCESSOR_POWER)
+# include "QtCore/qatomic_power.h"
+#elif defined(Q_PROCESSOR_S390)
+# include "QtCore/qatomic_s390.h"
+#elif defined(Q_PROCESSOR_SH4A)
+# include "QtCore/qatomic_sh4a.h"
+#elif defined(Q_PROCESSOR_SPARC)
+# include "QtCore/qatomic_sparc.h"
+#elif defined(Q_PROCESSOR_X86_32)
+# include <QtCore/qatomic_i386.h>
+#elif defined(Q_PROCESSOR_X86_64)
# include <QtCore/qatomic_x86_64.h>
+
+// Fallback compiler dependent implementation
#elif defined(Q_COMPILER_ATOMICS) && defined(Q_COMPILER_CONSTEXPR)
# include <QtCore/qatomic_cxx11.h>
#elif defined(Q_CC_GNU)
# include <QtCore/qatomic_gcc.h>
+
+// Fallback operating system dependent implementation
+#elif defined(Q_OS_UNIX)
+# include <QtCore/qatomic_unix.h>
+
+// No fallback
#else
-# define QT_OLD_ATOMICS
+# error "Qt has not been ported to this platform"
#endif
-#ifdef QT_OLD_ATOMICS
-# include "QtCore/qoldbasicatomic.h"
-# undef QT_OLD_ATOMICS
-#else
+// Only include if the implementation has been ported to QAtomicOps
+#ifndef QOLDBASICATOMIC_H
QT_BEGIN_HEADER
@@ -78,6 +110,10 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Core)
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_no_master_include
#pragma qt_sync_stop_processing
#endif
@@ -226,7 +262,6 @@ QT_END_NAMESPACE
QT_END_HEADER
-#endif // QT_OLD_ATOMICS
-
+#endif // QOLDBASICATOMIC_H
-#endif // QBASIC_ATOMIC
+#endif // QBASICATOMIC_H
diff --git a/src/corelib/thread/qgenericatomic.h b/src/corelib/thread/qgenericatomic.h
index 984ebed47b..f4d5e2f8d9 100644
--- a/src/corelib/thread/qgenericatomic.h
+++ b/src/corelib/thread/qgenericatomic.h
@@ -48,6 +48,10 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 4a64feff0e..e13c78636c 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -49,7 +49,7 @@
#include "qthread.h"
#include "qmutex_p.h"
-#ifndef Q_OS_LINUX
+#ifndef Q_MUTEX_LINUX
#include "private/qfreelist_p.h"
#endif
@@ -154,7 +154,7 @@ QMutex::~QMutex()
if (quintptr(d) > 0x3 && d->recursive) {
delete static_cast<QRecursiveMutexPrivate *>(d);
} else if (d) {
-#ifndef Q_OS_LINUX
+#ifndef Q_MUTEX_LINUX
if (d != dummyLocked() && static_cast<QMutexPrivate *>(d)->possiblyUnlocked.load()
&& tryLock()) {
unlock();
@@ -340,7 +340,7 @@ bool QBasicMutex::isRecursive() {
\sa unlock()
*/
-#ifndef Q_OS_LINUX //linux implementation is in qmutex_linux.cpp
+#ifndef Q_MUTEX_LINUX //linux implementation is in qmutex_linux.cpp
/*!
\internal helper for lock()
*/
diff --git a/src/corelib/thread/qmutex_p.h b/src/corelib/thread/qmutex_p.h
index 3cf0938e94..8a9d0bf39b 100644
--- a/src/corelib/thread/qmutex_p.h
+++ b/src/corelib/thread/qmutex_p.h
@@ -63,6 +63,11 @@
# include <mach/semaphore.h>
#endif
+#if defined(Q_OS_LINUX) && !defined(QT_LINUXBASE)
+// use Linux mutexes everywhere except for LSB builds
+# define Q_MUTEX_LINUX
+#endif
+
QT_BEGIN_NAMESPACE
class QMutexData
@@ -73,8 +78,9 @@ public:
: recursive(mode == QMutex::Recursive) {}
};
-#if !defined(Q_OS_LINUX)
-class QMutexPrivate : public QMutexData {
+#if !defined(Q_MUTEX_LINUX)
+class QMutexPrivate : public QMutexData
+{
public:
~QMutexPrivate();
QMutexPrivate();
@@ -122,7 +128,7 @@ public:
Qt::HANDLE event;
#endif
};
-#endif //Q_OS_LINUX
+#endif //Q_MUTEX_LINUX
class QRecursiveMutexPrivate : public QMutexData
{
diff --git a/src/corelib/thread/qoldbasicatomic.h b/src/corelib/thread/qoldbasicatomic.h
index a1985793ed..4df07adfd0 100644
--- a/src/corelib/thread/qoldbasicatomic.h
+++ b/src/corelib/thread/qoldbasicatomic.h
@@ -50,6 +50,10 @@ QT_BEGIN_NAMESPACE
#if 0
+// silence syncqt warnings
+QT_END_NAMESPACE
+QT_END_HEADER
+
#pragma qt_no_master_include
#pragma qt_sync_stop_processing
#endif
@@ -57,16 +61,7 @@ QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
-#ifdef QT_ARCH_PARISC
- int _q_lock[4];
-#endif
-#if defined(QT_ARCH_WINDOWS) || defined(QT_ARCH_WINDOWSCE)
- union { // needed for Q_BASIC_ATOMIC_INITIALIZER
- volatile long _q_value;
- };
-#else
volatile int _q_value;
-#endif
// Atomic API, implemented in qatomic_XXX.h
@@ -110,22 +105,7 @@ template <typename T>
class QBasicAtomicPointer
{
public:
-#ifdef QT_ARCH_PARISC
- int _q_lock[4];
-#endif
-#if defined(QT_ARCH_WINDOWS) || defined(QT_ARCH_WINDOWSCE)
- union {
- T * volatile _q_value;
-# if !defined(Q_OS_WINCE) && !defined(__i386__) && !defined(_M_IX86)
- qint64
-# else
- long
-# endif
- volatile _q_value_integral;
- };
-#else
T * volatile _q_value;
-#endif
// Atomic API, implemented in qatomic_XXX.h
@@ -159,17 +139,9 @@ public:
T *fetchAndAddOrdered(qptrdiff valueToAdd);
};
-#ifdef QT_ARCH_PARISC
-# define Q_BASIC_ATOMIC_INITIALIZER(a) {{-1,-1,-1,-1},(a)}
-#elif defined(QT_ARCH_WINDOWS) || defined(QT_ARCH_WINDOWSCE)
-# define Q_BASIC_ATOMIC_INITIALIZER(a) { {(a)} }
-#else
-# define Q_BASIC_ATOMIC_INITIALIZER(a) { (a) }
-#endif
+#define Q_BASIC_ATOMIC_INITIALIZER(a) { (a) }
QT_END_NAMESPACE
QT_END_HEADER
-# include <QtCore/qatomic_arch.h>
-
-#endif // QBASIC_ATOMIC
+#endif // QOLDBASICATOMIC_H
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 9ce951cf3b..d458ee9472 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -90,6 +90,10 @@
# endif
#endif
+#if defined(Q_OS_LINUX)
+#include <sys/prctl.h>
+#endif
+
#if defined(Q_OS_LINUX) && !defined(SCHED_IDLE)
// from linux/sched.h
# define SCHED_IDLE 5
@@ -283,6 +287,20 @@ void *QThreadPrivate::start(void *arg)
else
createEventDispatcher(data);
+#if !defined(QT_NO_DEBUG) && (defined(Q_OS_LINUX) || defined(Q_OS_MAC))
+ // sets the name of the current thread.
+ QByteArray objectName = thr->objectName().toLocal8Bit();
+
+ if (objectName.isEmpty())
+ objectName = thr->metaObject()->className();
+
+#if defined(Q_OS_LINUX)
+ prctl(PR_SET_NAME, (unsigned long)objectName.constData(), 0, 0, 0);
+#elif defined(Q_OS_MAC)
+ pthread_setname_np(objectName.constData());
+#endif
+#endif
+
emit thr->started();
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_testcancel();
diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri
index 1eefa60d50..7f383d6a4c 100644
--- a/src/corelib/thread/thread.pri
+++ b/src/corelib/thread/thread.pri
@@ -44,8 +44,12 @@ integrity:SOURCES += thread/qmutex_unix.cpp \
thread/qwaitcondition_unix.cpp
unix: {
- macx-* { SOURCES += thread/qmutex_mac.cpp }
- else:linux-* { SOURCES += thread/qmutex_linux.cpp }
- else { SOURCES += thread/qmutex_unix.cpp }
+ macx-* {
+ SOURCES += thread/qmutex_mac.cpp
+ } else:linux-*:!linux-lsb-* {
+ SOURCES += thread/qmutex_linux.cpp
+ } else {
+ SOURCES += thread/qmutex_unix.cpp
+ }
}
diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index c654673959..bd3a4a8444 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -376,7 +376,7 @@ public:
template <int n>
inline QByteArray(const QStaticByteArrayData<n> &dd)
- : d(const_cast<QByteArrayData *>(&dd.str)) {}
+ : d(const_cast<QByteArrayData *>(&dd.ba)) {}
template <int N>
Q_DECL_CONSTEXPR inline QByteArray(QStaticByteArrayDataPtr<N> dd)
: d(const_cast<QByteArrayData *>(&dd.ptr->ba)) {}
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index 3da7a37066..70efb5db22 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -924,7 +924,7 @@ QDate QDate::addDays(qint64 ndays) const
else
diff = jd - minJd();
- if (abs(ndays) <= diff)
+ if ((quint64)qAbs(ndays) <= diff)
d.jd = jd + ndays;
return d;
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index 76c06cb0d5..5731faa69c 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -1303,14 +1303,20 @@ void QEasingCurve::addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qre
}
/*!
+ \fn QList<QPointF> QEasingCurve::cubicBezierSpline() const
+ \obsolete Use toCubicSpline() instead.
+ */
+
+/*!
+ \since 5.0
Returns the cubicBezierSpline that defines a custom easing curve.
If the easing curve does not have a custom bezier easing curve the list
is empty.
- */
-QList<QPointF> QEasingCurve::cubicBezierSpline() const
+*/
+QVector<QPointF> QEasingCurve::toCubicSpline() const
{
- return d_ptr->config ? d_ptr->config->_bezierCurves.toList() : QList<QPointF>();
+ return d_ptr->config ? d_ptr->config->_bezierCurves : QVector<QPointF>();
}
/*!
diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h
index 4d53af591b..ad2e510799 100644
--- a/src/corelib/tools/qeasingcurve.h
+++ b/src/corelib/tools/qeasingcurve.h
@@ -44,7 +44,11 @@
#include <QtCore/qglobal.h>
#include <QtCore/qobjectdefs.h>
-#include <QtCore/qlist.h>
+#include <QtCore/qvector.h>
+#if QT_DEPRECATED_SINCE(5, 0)
+# include <QtCore/qlist.h>
+# include <QtCore/qpoint.h>
+#endif
QT_BEGIN_HEADER
@@ -94,7 +98,10 @@ public:
void addCubicBezierSegment(const QPointF & c1, const QPointF & c2, const QPointF & endPoint);
void addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qreal b);
- QList<QPointF> cubicBezierSpline() const;
+ QVector<QPointF> toCubicSpline() const;
+#if QT_DEPRECATED_SINCE(5, 0)
+ QT_DEPRECATED QList<QPointF> cubicBezierSpline() const { return toCubicSpline().toList(); }
+#endif
Type type() const;
void setType(Type type);
diff --git a/src/corelib/tools/qline.cpp b/src/corelib/tools/qline.cpp
index 1ca9a59bde..78f1c44263 100644
--- a/src/corelib/tools/qline.cpp
+++ b/src/corelib/tools/qline.cpp
@@ -412,16 +412,12 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
*/
/*!
+ \fn bool QLineF::isNull() const
+
Returns true if the line is not set up with valid start and end point;
otherwise returns false.
*/
-bool QLineF::isNull() const
-{
- return (qFuzzyCompare(pt1.x(), pt2.x()) && qFuzzyCompare(pt1.y(), pt2.y())) ? true : false;
-}
-
-
/*!
\fn QPointF QLineF::p1() const
diff --git a/src/corelib/tools/qline.h b/src/corelib/tools/qline.h
index 3c7977a207..58ef0316ad 100644
--- a/src/corelib/tools/qline.h
+++ b/src/corelib/tools/qline.h
@@ -310,6 +310,11 @@ inline qreal QLineF::y2() const
return pt2.y();
}
+inline bool QLineF::isNull() const
+{
+ return qFuzzyCompare(pt1.x(), pt2.x()) && qFuzzyCompare(pt1.y(), pt2.y());
+}
+
inline QPointF QLineF::p1() const
{
return pt1;
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index cc335a4575..2fff58333d 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -595,7 +595,6 @@
\value Yugoslavia
\value Zambia
\value Zimbabwe
- \value SerbiaAndMontenegro
\value Montenegro
\value Serbia
\value SaintBarthelemy
diff --git a/src/corelib/tools/qpoint.cpp b/src/corelib/tools/qpoint.cpp
index 55a2261cb9..ecbe9deb9f 100644
--- a/src/corelib/tools/qpoint.cpp
+++ b/src/corelib/tools/qpoint.cpp
@@ -402,6 +402,8 @@ QDataStream &operator>>(QDataStream &s, QPoint &p)
#endif // QT_NO_DATASTREAM
/*!
+ \fn int QPoint::manhattanLength() const
+
Returns the sum of the absolute values of x() and y(),
traditionally known as the "Manhattan length" of the vector from
the origin to the point. For example:
@@ -417,10 +419,6 @@ QDataStream &operator>>(QDataStream &s, QPoint &p)
apply to travelers who can only travel on a rectangular grid, like
the streets of Manhattan.
*/
-int QPoint::manhattanLength() const
-{
- return qAbs(x())+qAbs(y());
-}
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QPoint &p) {
@@ -505,6 +503,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
/*!
+ \fn qreal QPointF::manhattanLength() const
\since 4.6
Returns the sum of the absolute values of x() and y(),
@@ -513,10 +512,6 @@ QDebug operator<<(QDebug d, const QPointF &p)
\sa QPoint::manhattanLength()
*/
-qreal QPointF::manhattanLength() const
-{
- return qAbs(x())+qAbs(y());
-}
/*!
\fn qreal QPointF::x() const
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index 827de3936c..2e987fcf41 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -130,6 +130,9 @@ inline void QPoint::setX(int xpos)
inline void QPoint::setY(int ypos)
{ yp = ypos; }
+inline int QPoint::manhattanLength() const
+{ return qAbs(x())+qAbs(y()); }
+
inline int &QPoint::rx()
{ return xp; }
@@ -267,6 +270,11 @@ inline QPointF::QPointF(qreal xpos, qreal ypos) : xp(xpos), yp(ypos) { }
inline QPointF::QPointF(const QPoint &p) : xp(p.x()), yp(p.y()) { }
+inline qreal QPointF::manhattanLength() const
+{
+ return qAbs(x())+qAbs(y());
+}
+
inline bool QPointF::isNull() const
{
return qIsNull(xp) && qIsNull(yp);
diff --git a/src/corelib/tools/qregexp.cpp b/src/corelib/tools/qregexp.cpp
index 421d15c436..e8c0d4eccc 100644
--- a/src/corelib/tools/qregexp.cpp
+++ b/src/corelib/tools/qregexp.cpp
@@ -426,7 +426,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
For historical reasons, quantifiers (e.g. \bold{*}) that apply to
capturing parentheses are more "greedy" than other quantifiers.
- For example, \bold{a*(a)*} will match "aaa" with cap(1) == "aaa".
+ For example, \bold{a*(a*)} will match "aaa" with cap(1) == "aaa".
This behavior is different from what other regexp engines do
(notably, Perl). To obtain a more intuitive capturing behavior,
specify QRegExp::RegExp2 to the QRegExp constructor or call
@@ -670,7 +670,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
Wildcard matching can be convenient because of its simplicity, but
any wildcard regexp can be defined using full regexps, e.g.
- \bold{.*\.html$}. Notice that we can't match both \c .html and \c
+ \bold{.*\\.html$}. Notice that we can't match both \c .html and \c
.htm files with a wildcard unless we use \bold{*.htm*} which will
also match 'test.html.bak'. A full regexp gives us the precision
we need, \bold{.*\\.html?$}.
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index ee0aee2399..77c3d1e2cb 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -1226,24 +1226,22 @@ QT_BEGIN_NAMESPACE
/*!
\internal
This function is called for a just-created QObject \a obj, to enable
- the use of QSharedPointer and QWeakPointer.
+ the use of QSharedPointer and QWeakPointer in the future.
+ */
+void QtSharedPointer::ExternalRefCountData::setQObjectShared(const QObject *, bool)
+{}
- When QSharedPointer is active in a QObject, the object must not be deleted
- directly: the lifetime is managed by the QSharedPointer object. In that case,
- the deleteLater() and parent-child relationship in QObject only decrease
- the strong reference count, instead of deleting the object.
+/*!
+ \internal
+ This function is called when a QSharedPointer is created from a QWeakPointer
+
+ We check that the QWeakPointer was really created from a QSharedPointer, and
+ not from a QObject.
*/
-void QtSharedPointer::ExternalRefCountData::setQObjectShared(const QObject *obj, bool)
+void QtSharedPointer::ExternalRefCountData::checkQObjectShared(const QObject *)
{
- Q_ASSERT(obj);
- QObjectPrivate *d = QObjectPrivate::get(const_cast<QObject *>(obj));
-
- if (d->sharedRefcount.load() != 0)
- qFatal("QSharedPointer: pointer %p already has reference counting", obj);
- d->sharedRefcount.store(this);
-
- // QObject decreases the refcount too, so increase it up
- weakref.ref();
+ if (strongref.load() < 0)
+ qWarning("QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
}
QtSharedPointer::ExternalRefCountData *QtSharedPointer::ExternalRefCountData::getAndRef(const QObject *obj)
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index ebab027196..58010dd8d9 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -192,7 +192,9 @@ namespace QtSharedPointer {
#ifndef QT_NO_QOBJECT
Q_CORE_EXPORT static ExternalRefCountData *getAndRef(const QObject *);
Q_CORE_EXPORT void setQObjectShared(const QObject *, bool enable);
+ Q_CORE_EXPORT void checkQObjectShared(const QObject *);
#endif
+ inline void checkQObjectShared(...) { }
inline void setQObjectShared(...) { }
};
// sizeof(ExternalRefCount) = 12 (32-bit) / 16 (64-bit)
@@ -432,10 +434,12 @@ namespace QtSharedPointer {
tmp = o->strongref.load(); // failed, try again
}
- if (tmp > 0)
+ if (tmp > 0) {
o->weakref.ref();
- else
+ } else {
+ o->checkQObjectShared(actual);
o = 0;
+ }
}
qSwap(d, o);
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index d65dfa35a6..b3d2d62819 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -47,7 +47,7 @@
# if defined(Q_OS_WINCE)
# include <qt_windows.h>
# endif
-# if defined(Q_OS_WIN64) && !defined(Q_CC_GNU)
+# if defined(Q_OS_WIN64)
# include <intrin.h>
# endif
#elif defined(Q_OS_LINUX) && defined(__arm__)
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 47c4a9952b..44428b7284 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -62,6 +62,10 @@ QT_BEGIN_HEADER
#undef QT_HAVE_MMX
#endif
+#ifdef __MINGW64_VERSION_MAJOR
+#include <intrin.h>
+#endif
+
// SSE intrinsics
#if defined(QT_HAVE_SSE2) && (defined(__SSE2__) || defined(Q_CC_MSVC))
#if defined(QT_LINUXBASE)
diff --git a/src/corelib/tools/qsize.cpp b/src/corelib/tools/qsize.cpp
index d5e6f18326..4c94f899e7 100644
--- a/src/corelib/tools/qsize.cpp
+++ b/src/corelib/tools/qsize.cpp
@@ -160,7 +160,7 @@ QT_BEGIN_NAMESPACE
/*!
Swaps the width and height values.
- \sa setWidth(), setHeight()
+ \sa setWidth(), setHeight(), transposed()
*/
void QSize::transpose()
@@ -171,6 +171,15 @@ void QSize::transpose()
}
/*!
+ \fn QSize QSize::transposed() const
+ \since 5.0
+
+ Returns a QSize with width and height swapped.
+
+ \sa transpose()
+*/
+
+/*!
\fn void QSize::scale(int width, int height, Qt::AspectRatioMode mode)
Scales the size to a rectangle with the given \a width and \a
@@ -187,7 +196,7 @@ void QSize::transpose()
Example:
\snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 0
- \sa setWidth(), setHeight()
+ \sa setWidth(), setHeight(), scaled()
*/
/*!
@@ -197,11 +206,25 @@ void QSize::transpose()
Scales the size to a rectangle with the given \a size, according to
the specified \a mode.
*/
-void QSize::scale(const QSize &s, Qt::AspectRatioMode mode)
+
+/*!
+ \fn QSize QSize::scaled(int width, int height, Qt::AspectRatioMode mode) const
+ \since 5.0
+
+ Return a size scaled to a rectangle with the given \a width and \a
+ height, according to the specified \a mode.
+
+ \sa scale()
+*/
+
+/*!
+ \overload
+ \since 5.0
+*/
+QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const
{
if (mode == Qt::IgnoreAspectRatio || wd == 0 || ht == 0) {
- wd = s.wd;
- ht = s.ht;
+ return s;
} else {
bool useHeight;
qint64 rw = qint64(s.ht) * qint64(wd) / qint64(ht);
@@ -213,11 +236,10 @@ void QSize::scale(const QSize &s, Qt::AspectRatioMode mode)
}
if (useHeight) {
- wd = rw;
- ht = s.ht;
+ return QSize(rw, s.ht);
} else {
- ht = qint32(qint64(s.wd) * qint64(ht) / qint64(wd));
- wd = s.wd;
+ return QSize(s.wd,
+ qint32(qint64(s.wd) * qint64(ht) / qint64(wd)));
}
}
}
@@ -566,7 +588,7 @@ QDebug operator<<(QDebug dbg, const QSize &s) {
/*!
Swaps the width and height values.
- \sa setWidth(), setHeight()
+ \sa setWidth(), setHeight(), transposed()
*/
void QSizeF::transpose()
@@ -577,6 +599,15 @@ void QSizeF::transpose()
}
/*!
+ \fn QSizeF QSizeF::transposed() const
+ \since 5.0
+
+ Returns the size with width and height values swapped.
+
+ \sa transpose()
+*/
+
+/*!
\fn void QSizeF::scale(qreal width, qreal height, Qt::AspectRatioMode mode)
Scales the size to a rectangle with the given \a width and \a
@@ -593,7 +624,7 @@ void QSizeF::transpose()
Example:
\snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 5
- \sa setWidth(), setHeight()
+ \sa setWidth(), setHeight(), scaled()
*/
/*!
@@ -603,11 +634,25 @@ void QSizeF::transpose()
Scales the size to a rectangle with the given \a size, according to
the specified \a mode.
*/
-void QSizeF::scale(const QSizeF &s, Qt::AspectRatioMode mode)
+
+/*!
+ \fn QSizeF QSizeF::scaled(int width, int height, Qt::AspectRatioMode mode) const
+ \since 5.0
+
+ Returns a size scaled to a rectangle with the given \a width and
+ \a height, according to the specified \mode.
+
+ \sa scale()
+*/
+
+/*!
+ \overload
+ \since 5.0
+*/
+QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const
{
if (mode == Qt::IgnoreAspectRatio || qIsNull(wd) || qIsNull(ht)) {
- wd = s.wd;
- ht = s.ht;
+ return s;
} else {
bool useHeight;
qreal rw = s.ht * wd / ht;
@@ -619,11 +664,9 @@ void QSizeF::scale(const QSizeF &s, Qt::AspectRatioMode mode)
}
if (useHeight) {
- wd = rw;
- ht = s.ht;
+ return QSizeF(rw, s.ht);
} else {
- ht = s.wd * ht / wd;
- wd = s.wd;
+ return QSizeF(s.wd, s.wd * ht / wd);
}
}
}
diff --git a/src/corelib/tools/qsize.h b/src/corelib/tools/qsize.h
index 5400f76a3a..fece0ac943 100644
--- a/src/corelib/tools/qsize.h
+++ b/src/corelib/tools/qsize.h
@@ -64,9 +64,12 @@ public:
void setWidth(int w);
void setHeight(int h);
void transpose();
+ QSize transposed() const;
void scale(int w, int h, Qt::AspectRatioMode mode);
void scale(const QSize &s, Qt::AspectRatioMode mode);
+ QSize scaled(int w, int h, Qt::AspectRatioMode mode) const;
+ QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const;
QSize expandedTo(const QSize &) const;
QSize boundedTo(const QSize &) const;
@@ -134,9 +137,18 @@ inline void QSize::setWidth(int w)
inline void QSize::setHeight(int h)
{ ht = h; }
+inline QSize QSize::transposed() const
+{ return QSize(ht, wd); }
+
inline void QSize::scale(int w, int h, Qt::AspectRatioMode mode)
{ scale(QSize(w, h), mode); }
+inline void QSize::scale(const QSize &s, Qt::AspectRatioMode mode)
+{ *this = scaled(s, mode); }
+
+inline QSize QSize::scaled(int w, int h, Qt::AspectRatioMode mode) const
+{ return scaled(QSize(w, h), mode); }
+
inline int &QSize::rwidth()
{ return wd; }
@@ -214,9 +226,12 @@ public:
void setWidth(qreal w);
void setHeight(qreal h);
void transpose();
+ QSizeF transposed() const;
void scale(qreal w, qreal h, Qt::AspectRatioMode mode);
void scale(const QSizeF &s, Qt::AspectRatioMode mode);
+ QSizeF scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const;
+ QSizeF scaled(const QSizeF &s, Qt::AspectRatioMode mode) const;
QSizeF expandedTo(const QSizeF &) const;
QSizeF boundedTo(const QSizeF &) const;
@@ -292,9 +307,18 @@ inline void QSizeF::setWidth(qreal w)
inline void QSizeF::setHeight(qreal h)
{ ht = h; }
+inline QSizeF QSizeF::transposed() const
+{ return QSizeF(ht, wd); }
+
inline void QSizeF::scale(qreal w, qreal h, Qt::AspectRatioMode mode)
{ scale(QSizeF(w, h), mode); }
+inline void QSizeF::scale(const QSizeF &s, Qt::AspectRatioMode mode)
+{ *this = scaled(s, mode); }
+
+inline QSizeF QSizeF::scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const
+{ return scaled(QSizeF(w, h), mode); }
+
inline qreal &QSizeF::rwidth()
{ return wd; }
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 0f7d398972..57210901ee 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -936,7 +936,7 @@ int QString::grow(int size)
systems).
This method is only available if Qt is configured with STL
- compatibility enabled.
+ compatibility enabled and if QT_NO_STL is not defined.
\sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4()
*/
@@ -964,7 +964,7 @@ int QString::grow(int size)
that accepts a std::wstring object.
This operator is only available if Qt is configured with STL
- compatibility enabled.
+ compatibility enabled and if QT_NO_STL is not defined.
\sa utf16(), toAscii(), toLatin1(), toUtf8(), toLocal8Bit()
*/
@@ -7006,7 +7006,7 @@ bool QString::isRightToLeft() const
can lead to loss of information.
This operator is only available if Qt is configured with STL
- compatibility enabled.
+ compatibility enabled and if QT_NO_STL is not defined.
\sa toAscii(), toLatin1(), toUtf8(), toLocal8Bit()
*/
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index b47dddab14..83b1910450 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -67,7 +67,7 @@ struct Q_CORE_EXPORT QVectorData
QtPrivate::RefCount ref;
int alloc;
int size;
-#if defined(QT_ARCH_SPARC) && defined(Q_CC_GNU) && defined(__LP64__) && defined(QT_BOOTSTRAPPED)
+#if defined(Q_PROCESSOR_SPARC) && defined(Q_CC_GNU) && defined(__LP64__) && defined(QT_BOOTSTRAPPED)
// workaround for bug in gcc 3.4.2
uint capacity;
uint reserved;
diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp
index 9eae45b34b..7bdd947a37 100644
--- a/src/dbus/qdbusabstractadaptor.cpp
+++ b/src/dbus/qdbusabstractadaptor.cpp
@@ -57,6 +57,17 @@
QT_BEGIN_NAMESPACE
+static int cachedRelaySlotMethodIndex = -1;
+
+int QDBusAdaptorConnector::relaySlotMethodIndex()
+{
+ if (cachedRelaySlotMethodIndex == -1) {
+ cachedRelaySlotMethodIndex = staticMetaObject.indexOfMethod("relaySlot()");
+ Q_ASSERT(cachedRelaySlotMethodIndex != -1);
+ }
+ return cachedRelaySlotMethodIndex;
+}
+
QDBusAdaptorConnector *qDBusFindAdaptorConnector(QObject *obj)
{
if (!obj)
@@ -237,12 +248,12 @@ void QDBusAdaptorConnector::addAdaptor(QDBusAbstractAdaptor *adaptor)
void QDBusAdaptorConnector::disconnectAllSignals(QObject *obj)
{
- QMetaObject::disconnect(obj, -1, this, metaObject()->methodOffset());
+ QMetaObject::disconnect(obj, -1, this, relaySlotMethodIndex());
}
void QDBusAdaptorConnector::connectAllSignals(QObject *obj)
{
- QMetaObject::connect(obj, -1, this, metaObject()->methodOffset(), Qt::DirectConnection);
+ QMetaObject::connect(obj, -1, this, relaySlotMethodIndex(), Qt::DirectConnection);
}
void QDBusAdaptorConnector::polish()
@@ -310,37 +321,58 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void **
// our Meta Object
// modify carefully: this has been hand-edited!
-// the relaySlot slot has local ID 0 (we use this when calling QMetaObject::connect)
-// it also gets called with the void** array
+// the relaySlot slot gets called with the void** array
static const uint qt_meta_data_QDBusAdaptorConnector[] = {
+
// content:
- 1, // revision
+ 6, // revision
0, // classname
0, 0, // classinfo
- 3, 10, // methods
+ 3, 14, // methods
0, 0, // properties
0, 0, // enums/sets
-
- // slots: signature, parameters, type, tag, flags
- 106, 22, 22, 22, 0x0a,
- 118, 22, 22, 22, 0x0a,
+ 0, 0, // constructors
+ 0, // flags
+ 1, // signalCount
// signals: signature, parameters, type, tag, flags
47, 23, 22, 22, 0x05,
+ // slots: signature, parameters, type, tag, flags
+ 105, 22, 22, 22, 0x0a,
+ 117, 22, 22, 22, 0x0a,
+
0 // eod
};
static const char qt_meta_stringdata_QDBusAdaptorConnector[] = {
- "QDBusAdaptorConnector\0\0obj,metaobject,sid,args\0"
- "relaySignal(QObject*,const QMetaObject*,int,QVariantList)\0\0relaySlot()\0"
- "polish()\0"
+ "QDBusAdaptorConnector\0\0obj,metaObject,sid,args\0"
+ "relaySignal(QObject*,const QMetaObject*,int,QVariantList)\0"
+ "relaySlot()\0polish()\0"
+};
+
+void QDBusAdaptorConnector::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
+{
+ if (_c == QMetaObject::InvokeMetaMethod) {
+ Q_ASSERT(staticMetaObject.cast(_o));
+ QDBusAdaptorConnector *_t = static_cast<QDBusAdaptorConnector *>(_o);
+ switch (_id) {
+ case 0: _t->relaySignal((*reinterpret_cast< QObject*(*)>(_a[1])),(*reinterpret_cast< const QMetaObject*(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< const QVariantList(*)>(_a[4]))); break;
+ case 1: _t->relaySlot(_a); break; // HAND EDIT: add the _a parameter
+ case 2: _t->polish(); break;
+ default: ;
+ }
+ }
+}
+
+const QMetaObjectExtraData QDBusAdaptorConnector::staticMetaObjectExtraData = {
+ 0, qt_static_metacall
};
const QMetaObject QDBusAdaptorConnector::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector,
- qt_meta_data_QDBusAdaptorConnector, 0 }
+ qt_meta_data_QDBusAdaptorConnector, &staticMetaObjectExtraData }
};
const QMetaObject *QDBusAdaptorConnector::metaObject() const
@@ -352,7 +384,7 @@ void *QDBusAdaptorConnector::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_QDBusAdaptorConnector))
- return static_cast<void*>(const_cast<QDBusAdaptorConnector*>(this));
+ return static_cast<void*>(const_cast< QDBusAdaptorConnector*>(this));
return QObject::qt_metacast(_clname);
}
@@ -362,11 +394,8 @@ int QDBusAdaptorConnector::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
- switch (_id) {
- case 0: relaySlot(_a); break; // HAND EDIT: add the _a parameter
- case 1: polish(); break;
- case 2: relaySignal((*reinterpret_cast< QObject*(*)>(_a[1])),(*reinterpret_cast< const QMetaObject*(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< const QVariantList(*)>(_a[4]))); break;
- }
+ if (_id < 3)
+ qt_static_metacall(this, _c, _id, _a);
_id -= 3;
}
return _id;
@@ -376,7 +405,7 @@ int QDBusAdaptorConnector::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
void QDBusAdaptorConnector::relaySignal(QObject * _t1, const QMetaObject * _t2, int _t3, const QVariantList & _t4)
{
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)) };
- QMetaObject::activate(this, &staticMetaObject, 2, _a);
+ QMetaObject::activate(this, &staticMetaObject, 0, _a);
}
QT_END_NAMESPACE
diff --git a/src/dbus/qdbusabstractadaptor_p.h b/src/dbus/qdbusabstractadaptor_p.h
index a0b61e1887..9b10f03eda 100644
--- a/src/dbus/qdbusabstractadaptor_p.h
+++ b/src/dbus/qdbusabstractadaptor_p.h
@@ -127,6 +127,9 @@ protected:
public: // member variables
AdaptorMap adaptors;
bool waitingForPolish : 1;
+
+private:
+ static int relaySlotMethodIndex();
};
extern QDBusAdaptorConnector *qDBusFindAdaptorConnector(QObject *object);
diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp
index c83865978c..bd7b83bf65 100644
--- a/src/dbus/qdbusmetaobject.cpp
+++ b/src/dbus/qdbusmetaobject.cpp
@@ -73,8 +73,6 @@ private:
QByteArray typeName;
QByteArray tag;
QByteArray name;
- QByteArray inputSignature;
- QByteArray outputSignature;
QVarLengthArray<int, 4> inputTypes;
QVarLengthArray<int, 4> outputTypes;
int flags;
@@ -108,7 +106,7 @@ private:
};
static const int intsPerProperty = 2;
-static const int intsPerMethod = 5;
+static const int intsPerMethod = 3;
struct QDBusMetaObjectPrivate : public QMetaObjectPrivate
{
@@ -215,7 +213,6 @@ void QDBusMetaObjectGenerator::parseMethods()
break;
}
- mm.inputSignature += arg.type.toLatin1();
mm.inputTypes.append(type.id);
mm.parameters.append(arg.name.toLatin1());
@@ -236,7 +233,6 @@ void QDBusMetaObjectGenerator::parseMethods()
break;
}
- mm.outputSignature += arg.type.toLatin1();
mm.outputTypes.append(type.id);
if (i == 0) {
@@ -297,7 +293,6 @@ void QDBusMetaObjectGenerator::parseSignals()
break;
}
- mm.inputSignature += arg.type.toLatin1();
mm.inputTypes.append(type.id);
mm.parameters.append(arg.name.toLatin1());
@@ -360,9 +355,39 @@ void QDBusMetaObjectGenerator::parseProperties()
void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
{
+ class MetaStringTable
+ {
+ public:
+ typedef QHash<QByteArray, int> Entries; // string --> offset mapping
+ typedef Entries::const_iterator const_iterator;
+ Entries::const_iterator constBegin() const
+ { return m_entries.constBegin(); }
+ Entries::const_iterator constEnd() const
+ { return m_entries.constEnd(); }
+
+ MetaStringTable() : m_offset(0) {}
+
+ int enter(const QByteArray &value)
+ {
+ Entries::iterator it = m_entries.find(value);
+ if (it != m_entries.end())
+ return it.value();
+ int pos = m_offset;
+ m_entries.insert(value, pos);
+ m_offset += value.size() + 1;
+ return pos;
+ }
+
+ int arraySize() const { return m_offset; }
+
+ private:
+ Entries m_entries;
+ int m_offset;
+ };
+
// this code here is mostly copied from qaxbase.cpp
// with a few modifications to make it cleaner
-
+
QString className = interface;
className.replace(QLatin1Char('.'), QLatin1String("::"));
if (className.isEmpty())
@@ -400,10 +425,8 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
data_size += 2 + mm.inputTypes.count() + mm.outputTypes.count();
idata.resize(data_size + 1);
- char null('\0');
- QByteArray stringdata = className.toLatin1();
- stringdata += null;
- stringdata.reserve(8192);
+ MetaStringTable strings;
+ strings.enter(className.toLatin1());
int offset = header->methodData;
int signatureOffset = header->methodDBusData;
@@ -416,32 +439,16 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
QMap<QByteArray, Method> &map = (x == 0) ? signals_ : methods;
for (QMap<QByteArray, Method>::ConstIterator it = map.constBegin();
it != map.constEnd(); ++it) {
- // form "prototype\0parameters\0typeName\0tag\0methodname\0inputSignature\0outputSignature"
+ // form "prototype\0parameters\0typeName\0tag\0methodname\0"
const Method &mm = it.value();
- idata[offset++] = stringdata.length();
- stringdata += it.key(); // prototype
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mm.parameters;
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mm.typeName;
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mm.tag;
- stringdata += null;
+ idata[offset++] = strings.enter(it.key()); // prototype
+ idata[offset++] = strings.enter(mm.parameters);
+ idata[offset++] = strings.enter(mm.typeName);
+ idata[offset++] = strings.enter(mm.tag);
idata[offset++] = mm.flags;
- idata[signatureOffset++] = stringdata.length();
- stringdata += mm.name;
- stringdata += null;
- idata[signatureOffset++] = stringdata.length();
- stringdata += mm.inputSignature;
- stringdata += null;
- idata[signatureOffset++] = stringdata.length();
- stringdata += mm.outputSignature;
- stringdata += null;
+ idata[signatureOffset++] = strings.enter(mm.name);
idata[signatureOffset++] = typeidOffset;
idata[typeidOffset++] = mm.inputTypes.count();
@@ -466,25 +473,25 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
const Property &mp = it.value();
// form is "name\0typeName\0signature\0"
- idata[offset++] = stringdata.length();
- stringdata += it.key(); // name
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mp.typeName;
- stringdata += null;
+ idata[offset++] = strings.enter(it.key()); // name
+ idata[offset++] = strings.enter(mp.typeName);
idata[offset++] = mp.flags;
- idata[signatureOffset++] = stringdata.length();
- stringdata += mp.signature;
- stringdata += null;
+ idata[signatureOffset++] = strings.enter(mp.signature);
idata[signatureOffset++] = mp.type;
}
Q_ASSERT(offset == header->propertyDBusData);
Q_ASSERT(signatureOffset == header->methodDBusData);
- char *string_data = new char[stringdata.length()];
- memcpy(string_data, stringdata, stringdata.length());
+ char *string_data = new char[strings.arraySize()];
+ {
+ MetaStringTable::const_iterator it;
+ for (it = strings.constBegin(); it != strings.constEnd(); ++it) {
+ memcpy(string_data + it.value(), it.key().constData(), it.key().size());
+ string_data[it.value() + it.key().size()] = '\0';
+ }
+ }
uint *uint_data = new uint[idata.size()];
memcpy(uint_data, idata.data(), idata.size() * sizeof(int));
@@ -616,32 +623,12 @@ const char *QDBusMetaObject::dbusNameForMethod(int id) const
return 0;
}
-const char *QDBusMetaObject::inputSignatureForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return d.stringdata + d.data[handle + 1];
- }
- return 0;
-}
-
-const char *QDBusMetaObject::outputSignatureForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return d.stringdata + d.data[handle + 2];
- }
- return 0;
-}
-
const int *QDBusMetaObject::inputTypesForMethod(int id) const
{
//id -= methodOffset();
if (id >= 0 && id < priv(d.data)->methodCount) {
int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return reinterpret_cast<const int*>(d.data + d.data[handle + 3]);
+ return reinterpret_cast<const int*>(d.data + d.data[handle + 1]);
}
return 0;
}
@@ -651,7 +638,7 @@ const int *QDBusMetaObject::outputTypesForMethod(int id) const
//id -= methodOffset();
if (id >= 0 && id < priv(d.data)->methodCount) {
int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return reinterpret_cast<const int*>(d.data + d.data[handle + 4]);
+ return reinterpret_cast<const int*>(d.data + d.data[handle + 2]);
}
return 0;
}
diff --git a/src/dbus/qdbusmetaobject_p.h b/src/dbus/qdbusmetaobject_p.h
index d8385fbcc7..7a8de41fa0 100644
--- a/src/dbus/qdbusmetaobject_p.h
+++ b/src/dbus/qdbusmetaobject_p.h
@@ -77,8 +77,6 @@ struct Q_DBUS_EXPORT QDBusMetaObject: public QMetaObject
// methods (slots & signals):
const char *dbusNameForMethod(int id) const;
- const char *inputSignatureForMethod(int id) const;
- const char *outputSignatureForMethod(int id) const;
const int *inputTypesForMethod(int id) const;
const int *outputTypesForMethod(int id) const;
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index 8610ef726d..0d00df2a17 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -49,6 +49,7 @@
#include <QtGui/QGuiApplication>
#include <private/qguiapplication_p.h>
#include "qplatformaccessibility_qpa.h"
+#include "qplatformintegration_qpa.h"
#include <QtCore/qdebug.h>
#include <QtCore/qmetaobject.h>
@@ -359,29 +360,13 @@ QT_BEGIN_NAMESPACE
This enum type defines bit flags that can be combined to indicate
the relationship between two accessible objects.
- \value Unrelated The objects are unrelated.
- \value Self The objects are the same.
-
- \value Up The first object is above the second object.
- \value Down The first object is below the second object.
- \value Left The first object is left of the second object.
- \value Right The first object is right of the second object.
- \value Covers The first object covers the second object.
- \value Covered The first object is covered by the second object.
-
- \value FocusChild The first object is the second object's focus child.
\value Label The first object is the label of the second object.
\value Labelled The first object is labelled by the second object.
\value Controller The first object controls the second object.
\value Controlled The first object is controlled by the second object.
- \omitvalue GeometryMask
- \omitvalue LogicalMask
-
- Implementations of relationTo() return a combination of these flags.
+ Implementations of relations() return a combination of these flags.
Some values are mutually exclusive.
-
- Implementations of navigate() can accept only one distinct value.
*/
/*!
@@ -781,10 +766,9 @@ QAccessibleInterface *QAccessibleEvent::accessibleInterface() const
top-most child. childAt() is used for hit testing (finding the object
under the mouse).
- The relationTo() function provides information about how two
- different objects relate to each other, and navigate() allows
- traversing from one object to another object with a given
- relationship.
+ The relations() function provides information about the relations an
+ object has to other objects, and parent() and child() allows
+ traversing from one object to another object.
\section1 Properties
@@ -874,39 +858,27 @@ QAccessibleInterface *QAccessibleEvent::accessibleInterface() const
*/
/*!
- \fn QAccessible::Relation QAccessibleInterface::relationTo(const QAccessibleInterface *other) const
-
- Returns the relationship between this object and the \a
- other object.
-
- The returned value indicates the relation of the called object to
- the \a other object, e.g. if this object is a label for \a other
- the return value will be \c Label.
-
- Usually parent-child relations are not returned.
-
- The return value is a combination of the bit flags in the
- QAccessible::Relation enumeration.
-
- All objects provide this information.
+ Returns the meaningful relations to other widgets. Usually this will not return parent/child
+ relations, unless they are handled in a specific way such as in tree views.
+ It will typically return the labelled-by and label relations.
+ It should never return itself.
- \sa relations(), indexOfChild(), navigate()
+ \sa parent(), child()
*/
-QAccessible::Relation QAccessibleInterface::relationTo(const QAccessibleInterface *) const
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >
+QAccessibleInterface::relations(QAccessible::Relation /*match = QAccessible::AllRelations*/) const
{
- return QAccessible::Unrelated;
+ return QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >();
}
/*!
- Returns the meaningful relations to other widgets. Usually this will not return parent/child
- relations, unless they are handled in a specific way such as in tree views.
- It will typically return the labelled-by and label relations.
+ Returns the object that has the keyboard focus.
- \sa relationTo(), navigate()
+ The object returned can be any descendant, including itself.
*/
-QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > QAccessibleInterface::relations() const
+QAccessibleInterface *QAccessibleInterface::focusChild() const
{
- return QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >();
+ return 0;
}
/*!
@@ -950,49 +922,6 @@ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > QAccessibleInterfa
*/
/*!
- \fn int QAccessibleInterface::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const
-
- Navigates from this object to an object that has a relationship
- \a relation to this object, and returns the respective object in
- \a target. It is the caller's responsibility to delete *\a target
- after use.
-
- If an object is found, \a target is set to point to the object, and
- the index of the child of \a target is returned. The return value
- is 0 if \a target itself is the requested object. \a target is set
- to null if this object is the target object (i.e. the requested
- object is a handled by this object).
-
- If no object is found \a target is set to null, and the return
- value is -1.
-
- The \a entry parameter has two different meanings:
- \list
- \i \e{Hierarchical and Logical relationships} -- if multiple objects with
- the requested relationship exist \a entry specifies which one to
- return. \a entry is 1-based, e.g. use 1 to get the first (and
- possibly only) object with the requested relationship.
-
- The following code demonstrates how to use this function to
- navigate to the first child of an object:
-
- \snippet doc/src/snippets/code/src_gui_accessible_qaccessible.cpp 0
-
- \i \e{Geometric relationships} -- the index of the child from
- which to start navigating in the specified direction. \a entry
- can be 0 to navigate to a sibling of this object, or non-null to
- navigate within contained children that don't provide their own
- accessible information.
- \endlist
-
- Note that the \c Descendent value for \a relation is not supported.
-
- All objects support navigation.
-
- \sa relationTo(), childCount(), parent(), child()
-*/
-
-/*!
\fn QString QAccessibleInterface::text(QAccessible::Text t) const
Returns the value of the text property \a t of the object.
@@ -1140,60 +1069,24 @@ QColor QAccessibleInterface::backgroundColor() const
/*!
\class QAccessibleEvent
- \internal
-
- \brief The QAccessibleEvent class is used to query addition
- accessibility information about complex widgets.
-
- The event can be of type QEvent::AccessibilityDescription or
- QEvent::AccessibilityHelp.
+ \brief The QAccessibleEvent class is used to give detailed updates to the
+ accessibility framework. It is used together with \l QAccessible::updateAccessibility.
- Some QAccessibleInterface implementations send QAccessibleEvents
- to the widget they wrap to obtain the description or help text of
- a widget or of its children. The widget can answer by calling
- setValue() with the requested information.
-
- The default QWidget::event() implementation simply sets the text
- to be the widget's \l{QWidget::toolTip}{tooltip} (for \l
- AccessibilityDescription event) or its
- \l{QWidget::whatsThis}{"What's This?" text} (for \l
- AccessibilityHelp event).
+ The event is one of the \l QAccessible::Event which depending on the type of event needs to use
+ one of the subclasses of QAccessibleEvent.
\ingroup accessibility
- \ingroup events
- \inmodule QtWidgets
-*/
-
-/*!
- \fn QAccessibleEvent::QAccessibleEvent(Type type)
-
- Constructs an accessibility event of the given \a type, which
- must be QEvent::AccessibilityDescription or
- QEvent::AccessibilityHelp.
-*/
-
-/*!
- \fn int QAccessibleEvent::child() const
-
- Returns the (1-based) index of the child to which the request
- applies. If the child is 0, the request is for the widget itself.
-*/
-
-/*!
- \fn QString QAccessibleEvent::value() const
-
- Returns the text set using setValue().
-
- \sa setValue()
+ \inmodule QtGui
*/
/*!
- \fn void QAccessibleEvent::setValue(const QString &text)
+ \fn QAccessibleEvent::QAccessibleEvent(QAccessible::Event type, QObject *object, int child = -1)
- Set the description or help text for the given child() to \a
- text, thereby answering the request.
+ Constructs an accessibility event of the given \a type.
+ It also requires an \a object as source of the event and optionally a \a child index,
+ if the event comes from a child of the object.
- \sa value()
+ Using a \a child index maybe more efficient than creating the accessible interface for the child.
*/
/*!
diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h
index dc74ac1814..e57033d9bf 100644
--- a/src/gui/accessible/qaccessible.h
+++ b/src/gui/accessible/qaccessible.h
@@ -291,6 +291,7 @@ public:
Splitter = 0x0000003E,
// Additional Qt roles where enum value does not map directly to MSAA:
LayeredPane = 0x0000003F,
+ Terminal = 0x00000040,
UserRole = 0x0000ffff
};
@@ -305,13 +306,11 @@ public:
};
enum RelationFlag {
- Unrelated = 0x00000000,
- FocusChild = 0x00010000,
Label = 0x00020000,
Labelled = 0x00040000,
Controller = 0x00080000,
Controlled = 0x00100000,
- LogicalMask = 0x00ff0000
+ AllRelations = 0xffffffff
};
Q_DECLARE_FLAGS(Relation, RelationFlag)
@@ -379,8 +378,8 @@ public:
virtual QWindow *window() const;
// relations
- virtual QAccessible::Relation relationTo(const QAccessibleInterface *other) const;
- virtual QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > relations() const;
+ virtual QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > relations(QAccessible::Relation match = QAccessible::AllRelations) const;
+ virtual QAccessibleInterface *focusChild() const;
virtual QAccessibleInterface *childAt(int x, int y) const = 0;
@@ -389,7 +388,6 @@ public:
virtual QAccessibleInterface *child(int index) const = 0;
virtual int childCount() const = 0;
virtual int indexOfChild(const QAccessibleInterface *) const = 0;
- virtual int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const = 0;
// properties and state
virtual QString text(QAccessible::Text t) const = 0;
@@ -432,10 +430,10 @@ private:
class Q_GUI_EXPORT QAccessibleEvent
{
public:
- inline QAccessibleEvent(QAccessible::Event type, QObject *object, int child = -1)
- : m_type(type), m_object(object), m_child(child)
+ inline QAccessibleEvent(QAccessible::Event typ, QObject *obj, int chld = -1)
+ : m_type(typ), m_object(obj), m_child(chld)
{
- Q_ASSERT(object);
+ Q_ASSERT(obj);
}
QAccessible::Event type() const { return m_type; }
diff --git a/src/gui/accessible/qaccessibleobject.cpp b/src/gui/accessible/qaccessibleobject.cpp
index b9e0ac388b..d277f39c43 100644
--- a/src/gui/accessible/qaccessibleobject.cpp
+++ b/src/gui/accessible/qaccessibleobject.cpp
@@ -237,28 +237,13 @@ QAccessibleInterface *QAccessibleApplication::child(int index) const
return 0;
}
+
/*! \reimp */
-int QAccessibleApplication::navigate(QAccessible::RelationFlag relation, int,
- QAccessibleInterface **target) const
+QAccessibleInterface *QAccessibleApplication::focusChild() const
{
- if (!target)
- return -1;
-
- *target = 0;
- QObject *targetObject = 0;
-
- switch (relation) {
- case QAccessible::FocusChild:
- if (QWindow *window = QGuiApplication::activeWindow()) {
- *target = window->accessibleRoot();
- return 0;
- }
- break;
- default:
- break;
- }
- *target = QAccessible::queryAccessibleInterface(targetObject);
- return *target ? 0 : -1;
+ if (QWindow *window = QGuiApplication::activeWindow())
+ return window->accessibleRoot();
+ return 0;
}
/*! \reimp */
diff --git a/src/gui/accessible/qaccessibleobject.h b/src/gui/accessible/qaccessibleobject.h
index 2372e82f89..d035f17b1d 100644
--- a/src/gui/accessible/qaccessibleobject.h
+++ b/src/gui/accessible/qaccessibleobject.h
@@ -85,11 +85,11 @@ public:
// relations
int childCount() const;
int indexOfChild(const QAccessibleInterface*) const;
+ QAccessibleInterface *focusChild() const;
// navigation
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag, int, QAccessibleInterface **) const;
// properties and state
QString text(QAccessible::Text t) const;
diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri
index dd7b665ecc..f83e7e60c9 100644
--- a/src/gui/image/image.pri
+++ b/src/gui/image/image.pri
@@ -45,7 +45,6 @@ SOURCES += \
image/qimagepixmapcleanuphooks.cpp \
image/qvolatileimage.cpp
-SOURCES += image/qpixmap_qpa.cpp
win32: SOURCES += image/qpixmap_win.cpp
SOURCES += image/qvolatileimagedata.cpp
diff --git a/src/gui/image/qbitmap.cpp b/src/gui/image/qbitmap.cpp
index 8184200813..f3c26dd5b2 100644
--- a/src/gui/image/qbitmap.cpp
+++ b/src/gui/image/qbitmap.cpp
@@ -41,6 +41,7 @@
#include "qbitmap.h"
#include "qplatformpixmap_qpa.h"
+#include "qplatformintegration_qpa.h"
#include "qimage.h"
#include "qscreen.h"
#include "qvariant.h"
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 07af19d06a..5b23dbf4dc 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -74,30 +74,6 @@ static inline bool isLocked(QImageData *data)
return data != 0 && data->is_locked;
}
-static inline bool checkPixelSize(const QImage::Format format)
-{
- switch (format) {
- case QImage::Format_ARGB8565_Premultiplied:
- return (sizeof(qargb8565) == 3);
- case QImage::Format_RGB666:
- return (sizeof(qrgb666) == 3);
- case QImage::Format_ARGB6666_Premultiplied:
- return (sizeof(qargb6666) == 3);
- case QImage::Format_RGB555:
- return (sizeof(qrgb555) == 2);
- case QImage::Format_ARGB8555_Premultiplied:
- return (sizeof(qargb8555) == 3);
- case QImage::Format_RGB888:
- return (sizeof(qrgb888) == 3);
- case QImage::Format_RGB444:
- return (sizeof(qrgb444) == 2);
- case QImage::Format_ARGB4444_Premultiplied:
- return (sizeof(qargb4444) == 2);
- default:
- return true;
- }
-}
-
#if defined(Q_CC_DEC) && defined(__alpha) && (__DECCXX_VER-0 >= 50190001)
#pragma message disable narrowptr
#endif
@@ -141,12 +117,6 @@ QImageData * QImageData::create(const QSize &size, QImage::Format format, int nu
if (!size.isValid() || numColors < 0 || format == QImage::Format_Invalid)
return 0; // invalid parameter(s)
- if (!checkPixelSize(format)) {
- qWarning("QImageData::create(): Invalid pixel size for format %i",
- format);
- return 0;
- }
-
uint width = size.width();
uint height = size.height();
uint depth = qt_depthForFormat(format);
@@ -793,12 +763,6 @@ QImageData *QImageData::create(uchar *data, int width, int height, int bpl, QIm
if (format == QImage::Format_Invalid)
return d;
- if (!checkPixelSize(format)) {
- qWarning("QImageData::create(): Invalid pixel size for format %i",
- format);
- return 0;
- }
-
const int depth = qt_depthForFormat(format);
const int calc_bytes_per_line = ((width * depth + 31)/32) * 4;
const int min_bytes_per_line = (width * depth + 7)/8;
@@ -1708,9 +1672,8 @@ void QImage::fill(const QColor &color)
pixel = PREMUL(pixel);
fill((uint) pixel);
- } else if (d->depth == 16 && d->format == QImage::Format_RGB16) {
- qrgb565 p(color.rgba());
- fill((uint) p.rawValue());
+ } else if (d->format == QImage::Format_RGB16) {
+ fill((uint) qConvertRgb32To16(color.rgba()));
} else if (d->depth == 1) {
if (color == Qt::color1)
@@ -2025,12 +1988,12 @@ static bool convert_indexed8_to_RGB16_inplace(QImageData *data, Qt::ImageConvers
quint16 colorTableRGB16[256];
if (data->colortable.isEmpty()) {
for (int i = 0; i < 256; ++i)
- colorTableRGB16[i] = qt_colorConvert<quint16, quint32>(qRgb(i, i, i), 0);
+ colorTableRGB16[i] = qConvertRgb32To16(qRgb(i, i, i));
} else {
// 1) convert the existing colors to RGB16
const int tableSize = data->colortable.size();
for (int i = 0; i < tableSize; ++i)
- colorTableRGB16[i] = qt_colorConvert<quint16, quint32>(data->colortable.at(i), 0);
+ colorTableRGB16[i] = qConvertRgb32To16(data->colortable.at(i));
data->colortable = QVector<QRgb>();
// 2) fill the rest of the table in case src_data > colortable.size()
@@ -2068,7 +2031,8 @@ static bool convert_RGB_to_RGB16_inplace(QImageData *data, Qt::ImageConversionFl
quint16 *dst_data = (quint16 *) data->data;
for (int i = 0; i < data->height; ++i) {
- qt_memconvert(dst_data, src_data, data->width);
+ for (int j = 0; j < data->width; ++j)
+ dst_data[j] = qConvertRgb32To16(src_data[j]);
src_data = (quint32 *) (((char*)src_data) + src_bytes_per_line);
dst_data = (quint16 *) (((char*)dst_data) + dst_bytes_per_line);
}
@@ -2878,60 +2842,33 @@ static void convert_Mono_to_Indexed8(QImageData *dest, const QImageData *src, Qt
}
}
-#define CONVERT_DECL(DST, SRC) \
- static void convert_##SRC##_to_##DST(QImageData *dest, \
- const QImageData *src, \
- Qt::ImageConversionFlags) \
- { \
- qt_rectconvert<DST, SRC>(reinterpret_cast<DST*>(dest->data), \
- reinterpret_cast<const SRC*>(src->data), \
- 0, 0, src->width, src->height, \
- dest->bytes_per_line, src->bytes_per_line); \
+// Cannot be used with indexed formats.
+static void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
+{
+ const int buffer_size = 2048;
+ uint buffer[buffer_size];
+ const QPixelLayout *srcLayout = &qPixelLayouts[src->format];
+ const QPixelLayout *destLayout = &qPixelLayouts[dest->format];
+ const uchar *srcData = src->data;
+ uchar *destData = dest->data;
+
+ FetchPixelsFunc fetch = qFetchPixels[srcLayout->bpp];
+ StorePixelsFunc store = qStorePixels[destLayout->bpp];
+
+ for (int y = 0; y < src->height; ++y) {
+ int x = 0;
+ while (x < src->width) {
+ int l = qMin(src->width - x, buffer_size);
+ const uint *ptr = fetch(buffer, srcData, x, l);
+ ptr = srcLayout->convertToARGB32PM(buffer, ptr, l, srcLayout, 0);
+ ptr = destLayout->convertFromARGB32PM(buffer, ptr, l, destLayout, 0);
+ store(destData, ptr, x, l);
+ x += l;
+ }
+ srcData += src->bytes_per_line;
+ destData += dest->bytes_per_line;
}
-
-CONVERT_DECL(quint32, quint16)
-CONVERT_DECL(quint16, quint32)
-CONVERT_DECL(quint32, qargb8565)
-CONVERT_DECL(qargb8565, quint32)
-CONVERT_DECL(quint32, qrgb555)
-CONVERT_DECL(qrgb666, quint32)
-CONVERT_DECL(quint32, qrgb666)
-CONVERT_DECL(qargb6666, quint32)
-CONVERT_DECL(quint32, qargb6666)
-CONVERT_DECL(qrgb555, quint32)
-#if (defined(QT_QWS_DEPTH_15) && defined(QT_QWS_DEPTH_16))
-CONVERT_DECL(quint16, qrgb555)
-CONVERT_DECL(qrgb555, quint16)
-#endif
-CONVERT_DECL(quint32, qrgb888)
-CONVERT_DECL(qrgb888, quint32)
-CONVERT_DECL(quint32, qargb8555)
-CONVERT_DECL(qargb8555, quint32)
-CONVERT_DECL(quint32, qrgb444)
-CONVERT_DECL(qrgb444, quint32)
-CONVERT_DECL(quint32, qargb4444)
-CONVERT_DECL(qargb4444, quint32)
-#undef CONVERT_DECL
-#define CONVERT_PTR(DST, SRC) convert_##SRC##_to_##DST
-
-/*
- Format_Invalid,
- Format_Mono,
- Format_MonoLSB,
- Format_Indexed8,
- Format_RGB32,
- Format_ARGB32,
- Format_ARGB32_Premultiplied,
- Format_RGB16,
- Format_ARGB8565_Premultiplied,
- Format_RGB666,
- Format_ARGB6666_Premultiplied,
- Format_RGB555,
- Format_ARGB8555_Premultiplied,
- Format_RGB888
- Format_RGB444
- Format_ARGB4444_Premultiplied
-*/
+}
// first index source, second dest
@@ -3005,15 +2942,15 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
mask_alpha_converter,
mask_alpha_converter,
- CONVERT_PTR(quint16, quint32),
- CONVERT_PTR(qargb8565, quint32),
- CONVERT_PTR(qrgb666, quint32),
- CONVERT_PTR(qargb6666, quint32),
- CONVERT_PTR(qrgb555, quint32),
- CONVERT_PTR(qargb8555, quint32),
- CONVERT_PTR(qrgb888, quint32),
- CONVERT_PTR(qrgb444, quint32),
- CONVERT_PTR(qargb4444, quint32)
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic
}, // Format_RGB32
{
@@ -3024,15 +2961,15 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
mask_alpha_converter,
0,
convert_ARGB_to_ARGB_PM,
- CONVERT_PTR(quint16, quint32),
- CONVERT_PTR(qargb8565, quint32),
- CONVERT_PTR(qrgb666, quint32),
- CONVERT_PTR(qargb6666, quint32),
- CONVERT_PTR(qrgb555, quint32),
- CONVERT_PTR(qargb8555, quint32),
- CONVERT_PTR(qrgb888, quint32),
- CONVERT_PTR(qrgb444, quint32),
- CONVERT_PTR(qargb4444, quint32)
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic,
+ convert_generic
}, // Format_ARGB32
{
@@ -3059,15 +2996,15 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, quint16),
- CONVERT_PTR(quint32, quint16),
- CONVERT_PTR(quint32, quint16),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
0,
#if defined(QT_QWS_DEPTH_15) && defined(QT_QWS_DEPTH_16)
- CONVERT_PTR(qrgb555, quint16),
+ convert_generic,
#else
0,
#endif
@@ -3082,9 +3019,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qargb8565),
- CONVERT_PTR(quint32, qargb8565),
- CONVERT_PTR(quint32, qargb8565),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3101,9 +3038,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qrgb666),
- CONVERT_PTR(quint32, qrgb666),
- CONVERT_PTR(quint32, qrgb666),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3120,9 +3057,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qargb6666),
- CONVERT_PTR(quint32, qargb6666),
- CONVERT_PTR(quint32, qargb6666),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3139,11 +3076,11 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qrgb555),
- CONVERT_PTR(quint32, qrgb555),
- CONVERT_PTR(quint32, qrgb555),
+ convert_generic,
+ convert_generic,
+ convert_generic,
#if defined(QT_QWS_DEPTH_15) && defined(QT_QWS_DEPTH_16)
- CONVERT_PTR(quint16, qrgb555),
+ convert_generic,
#else
0,
#endif
@@ -3162,9 +3099,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qargb8555),
- CONVERT_PTR(quint32, qargb8555),
- CONVERT_PTR(quint32, qargb8555),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3181,9 +3118,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qrgb888),
- CONVERT_PTR(quint32, qrgb888),
- CONVERT_PTR(quint32, qrgb888),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3200,9 +3137,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qrgb444),
- CONVERT_PTR(quint32, qrgb444),
- CONVERT_PTR(quint32, qrgb444),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3219,9 +3156,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
- CONVERT_PTR(quint32, qargb4444),
- CONVERT_PTR(quint32, qargb4444),
- CONVERT_PTR(quint32, qargb4444),
+ convert_generic,
+ convert_generic,
+ convert_generic,
0,
0,
0,
@@ -3626,35 +3563,28 @@ QRgb QImage::pixel(int x, int y) const
qWarning("QImage::pixel: coordinate (%d,%d) out of range", x, y);
return 12345;
}
- const uchar * s = scanLine(y);
+
+ const uchar * s = constScanLine(y);
switch(d->format) {
case Format_Mono:
- return d->colortable.at((*(s + (x >> 3)) >> (7- (x & 7))) & 1);
+ return d->colortable.at((*(s + (x >> 3)) >> (~x & 7)) & 1);
case Format_MonoLSB:
return d->colortable.at((*(s + (x >> 3)) >> (x & 7)) & 1);
case Format_Indexed8:
return d->colortable.at((int)s[x]);
- case Format_ARGB8565_Premultiplied:
- return qt_colorConvert<quint32, qargb8565>(reinterpret_cast<const qargb8565*>(s)[x], 0);
- case Format_RGB666:
- return qt_colorConvert<quint32, qrgb666>(reinterpret_cast<const qrgb666*>(s)[x], 0);
- case Format_ARGB6666_Premultiplied:
- return qt_colorConvert<quint32, qargb6666>(reinterpret_cast<const qargb6666*>(s)[x], 0);
- case Format_RGB555:
- return qt_colorConvert<quint32, qrgb555>(reinterpret_cast<const qrgb555*>(s)[x], 0);
- case Format_ARGB8555_Premultiplied:
- return qt_colorConvert<quint32, qargb8555>(reinterpret_cast<const qargb8555*>(s)[x], 0);
- case Format_RGB888:
- return qt_colorConvert<quint32, qrgb888>(reinterpret_cast<const qrgb888*>(s)[x], 0);
- case Format_RGB444:
- return qt_colorConvert<quint32, qrgb444>(reinterpret_cast<const qrgb444*>(s)[x], 0);
- case Format_ARGB4444_Premultiplied:
- return qt_colorConvert<quint32, qargb4444>(reinterpret_cast<const qargb4444*>(s)[x], 0);
+ case Format_RGB32:
+ case Format_ARGB32: // Keep old behaviour.
+ case Format_ARGB32_Premultiplied:
+ return reinterpret_cast<const QRgb *>(s)[x];
case Format_RGB16:
- return qt_colorConvert<quint32, quint16>(reinterpret_cast<const quint16*>(s)[x], 0);
+ return qConvertRgb16To32(reinterpret_cast<const quint16 *>(s)[x]);
default:
- return ((QRgb*)s)[x];
+ break;
}
+ const QPixelLayout *layout = &qPixelLayouts[d->format];
+ uint result;
+ const uint *ptr = qFetchPixels[layout->bpp](&result, s, x, 1);
+ return *layout->convertToARGB32PM(&result, ptr, 1, layout, 0);
}
@@ -3693,7 +3623,6 @@ void QImage::setPixel(int x, int y, uint index_or_rgb)
}
// detach is called from within scanLine
uchar * s = scanLine(y);
- const quint32p p = quint32p::fromRawData(index_or_rgb);
switch(d->format) {
case Format_Mono:
case Format_MonoLSB:
@@ -3710,54 +3639,38 @@ void QImage::setPixel(int x, int y, uint index_or_rgb)
else
*(s + (x >> 3)) |= (1 << (7-(x & 7)));
}
- break;
+ return;
case Format_Indexed8:
if (index_or_rgb >= (uint)d->colortable.size()) {
qWarning("QImage::setPixel: Index %d out of range", index_or_rgb);
return;
}
s[x] = index_or_rgb;
- break;
+ return;
case Format_RGB32:
//make sure alpha is 255, we depend on it in qdrawhelper for cases
// when image is set as a texture pattern on a qbrush
((uint *)s)[x] = uint(255 << 24) | index_or_rgb;
- break;
+ return;
case Format_ARGB32:
case Format_ARGB32_Premultiplied:
((uint *)s)[x] = index_or_rgb;
- break;
+ return;
case Format_RGB16:
- ((quint16 *)s)[x] = qt_colorConvert<quint16, quint32p>(p, 0);
- break;
- case Format_ARGB8565_Premultiplied:
- ((qargb8565*)s)[x] = qt_colorConvert<qargb8565, quint32p>(p, 0);
- break;
- case Format_RGB666:
- ((qrgb666*)s)[x] = qt_colorConvert<qrgb666, quint32p>(p, 0);
- break;
- case Format_ARGB6666_Premultiplied:
- ((qargb6666*)s)[x] = qt_colorConvert<qargb6666, quint32p>(p, 0);
- break;
- case Format_RGB555:
- ((qrgb555*)s)[x] = qt_colorConvert<qrgb555, quint32p>(p, 0);
- break;
- case Format_ARGB8555_Premultiplied:
- ((qargb8555*)s)[x] = qt_colorConvert<qargb8555, quint32p>(p, 0);
- break;
- case Format_RGB888:
- ((qrgb888*)s)[x] = qt_colorConvert<qrgb888, quint32p>(p, 0);
- break;
- case Format_RGB444:
- ((qrgb444*)s)[x] = qt_colorConvert<qrgb444, quint32p>(p, 0);
- break;
- case Format_ARGB4444_Premultiplied:
- ((qargb4444*)s)[x] = qt_colorConvert<qargb4444, quint32p>(p, 0);
- break;
+ ((quint16 *)s)[x] = qConvertRgb32To16(INV_PREMUL(index_or_rgb));
+ return;
case Format_Invalid:
case NImageFormats:
Q_ASSERT(false);
+ return;
+ default:
+ break;
}
+
+ const QPixelLayout *layout = &qPixelLayouts[d->format];
+ uint result;
+ const uint *ptr = layout->convertFromARGB32PM(&result, &index_or_rgb, 1, layout, 0);
+ qStorePixels[layout->bpp](s, ptr, x, 1);
}
/*!
@@ -3774,30 +3687,56 @@ bool QImage::allGray() const
if (!d)
return true;
- if (d->depth == 32) {
- int p = width()*height();
- const QRgb* b = (const QRgb*)bits();
- while (p--)
- if (!qIsGray(*b++))
- return false;
- } else if (d->depth == 16) {
- int p = width()*height();
- const ushort* b = (const ushort *)bits();
- while (p--)
- if (!qIsGray(qt_colorConvert<quint32, quint16>(*b++, 0)))
- return false;
- } else if (d->format == QImage::Format_RGB888) {
- int p = width()*height();
- const qrgb888* b = (const qrgb888 *)bits();
- while (p--)
- if (!qIsGray(qt_colorConvert<quint32, qrgb888>(*b++, 0)))
- return false;
- } else {
- if (d->colortable.isEmpty())
- return true;
- for (int i = 0; i < colorCount(); i++)
+ switch (d->format) {
+ case Format_Mono:
+ case Format_MonoLSB:
+ case Format_Indexed8:
+ for (int i = 0; i < d->colortable.size(); ++i) {
if (!qIsGray(d->colortable.at(i)))
return false;
+ }
+ return true;
+ case Format_RGB32:
+ case Format_ARGB32:
+ case Format_ARGB32_Premultiplied:
+ for (int j = 0; j < d->height; ++j) {
+ const QRgb *b = (const QRgb *)constScanLine(j);
+ for (int i = 0; i < d->width; ++i) {
+ if (!qIsGray(b[i]))
+ return false;
+ }
+ }
+ return true;
+ case Format_RGB16:
+ for (int j = 0; j < d->height; ++j) {
+ const quint16 *b = (const quint16 *)constScanLine(j);
+ for (int i = 0; i < d->width; ++i) {
+ if (!qIsGray(qConvertRgb16To32(b[i])))
+ return false;
+ }
+ }
+ return true;
+ default:
+ break;
+ }
+
+ const int buffer_size = 2048;
+ uint buffer[buffer_size];
+ const QPixelLayout *layout = &qPixelLayouts[d->format];
+ FetchPixelsFunc fetch = qFetchPixels[layout->bpp];
+ for (int j = 0; j < d->height; ++j) {
+ const uchar *b = constScanLine(j);
+ int x = 0;
+ while (x < d->width) {
+ int l = qMin(d->width - x, buffer_size);
+ const uint *ptr = fetch(buffer, b, x, l);
+ ptr = layout->convertToARGB32PM(buffer, ptr, l, layout, 0);
+ for (int i = 0; i < l; ++i) {
+ if (!qIsGray(ptr[i]))
+ return false;
+ }
+ x += l;
+ }
}
return true;
}
@@ -4320,7 +4259,7 @@ QImage QImage::rgbSwapped() const
case Format_Invalid:
case NImageFormats:
Q_ASSERT(false);
- break;
+ return res;
case Format_Mono:
case Format_MonoLSB:
case Format_Indexed8:
@@ -4329,7 +4268,7 @@ QImage QImage::rgbSwapped() const
QRgb c = res.d->colortable.at(i);
res.d->colortable[i] = QRgb(((c << 16) & 0xff0000) | ((c >> 16) & 0xff) | (c & 0xff00ff00));
}
- break;
+ return res;
case Format_RGB32:
case Format_ARGB32:
case Format_ARGB32_Premultiplied:
@@ -4345,7 +4284,7 @@ QImage QImage::rgbSwapped() const
q++;
}
}
- break;
+ return res;
case Format_RGB16:
res = QImage(d->width, d->height, d->format);
QIMAGE_SANITYCHECK_MEMORY(res);
@@ -4359,113 +4298,41 @@ QImage QImage::rgbSwapped() const
q++;
}
}
+ return res;
+ default:
break;
- case Format_ARGB8565_Premultiplied:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- const quint8 *p = constScanLine(i);
- quint8 *q = res.scanLine(i);
- const quint8 *end = p + d->width * sizeof(qargb8565);
- while (p < end) {
- q[0] = p[0];
- q[1] = (p[1] & 0xe0) | (p[2] >> 3);
- q[2] = (p[2] & 0x07) | (p[1] << 3);
- p += sizeof(qargb8565);
- q += sizeof(qargb8565);
- }
- }
- break;
- case Format_RGB666:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- qrgb666 *q = reinterpret_cast<qrgb666*>(res.scanLine(i));
- const qrgb666 *p = reinterpret_cast<const qrgb666*>(constScanLine(i));
- const qrgb666 *end = p + d->width;
- while (p < end) {
- const QRgb rgb = quint32(*p++);
- *q++ = qRgb(qBlue(rgb), qGreen(rgb), qRed(rgb));
- }
- }
- break;
- case Format_ARGB6666_Premultiplied:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- const quint8 *p = constScanLine(i);
- const quint8 *end = p + d->width * sizeof(qargb6666);
- quint8 *q = res.scanLine(i);
- while (p < end) {
- q[0] = (p[1] >> 4) | ((p[2] & 0x3) << 4) | (p[0] & 0xc0);
- q[1] = (p[1] & 0xf) | (p[0] << 4);
- q[2] = (p[2] & 0xfc) | ((p[0] >> 4) & 0x3);
- p += sizeof(qargb6666);
- q += sizeof(qargb6666);
- }
- }
- break;
- case Format_RGB555:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- quint16 *q = (quint16*)res.scanLine(i);
- const quint16 *p = (const quint16*)constScanLine(i);
- const quint16 *end = p + d->width;
- while (p < end) {
- *q = ((*p << 10) & 0x7c00) | ((*p >> 10) & 0x1f) | (*p & 0x3e0);
- p++;
- q++;
- }
- }
- break;
- case Format_ARGB8555_Premultiplied:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- const quint8 *p = constScanLine(i);
- quint8 *q = res.scanLine(i);
- const quint8 *end = p + d->width * sizeof(qargb8555);
- while (p < end) {
- q[0] = p[0];
- q[1] = (p[1] & 0xe0) | (p[2] >> 2);
- q[2] = (p[2] & 0x03) | ((p[1] << 2) & 0x7f);
- p += sizeof(qargb8555);
- q += sizeof(qargb8555);
- }
- }
- break;
- case Format_RGB888:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- quint8 *q = res.scanLine(i);
- const quint8 *p = constScanLine(i);
- const quint8 *end = p + d->width * sizeof(qrgb888);
- while (p < end) {
- q[0] = p[2];
- q[1] = p[1];
- q[2] = p[0];
- q += sizeof(qrgb888);
- p += sizeof(qrgb888);
- }
- }
- break;
- case Format_RGB444:
- case Format_ARGB4444_Premultiplied:
- res = QImage(d->width, d->height, d->format);
- QIMAGE_SANITYCHECK_MEMORY(res);
- for (int i = 0; i < d->height; i++) {
- quint16 *q = reinterpret_cast<quint16*>(res.scanLine(i));
- const quint16 *p = reinterpret_cast<const quint16*>(constScanLine(i));
- const quint16 *end = p + d->width;
- while (p < end) {
- *q = (*p & 0xf0f0) | ((*p & 0x0f) << 8) | ((*p & 0xf00) >> 8);
- p++;
- q++;
+ }
+
+ res = QImage(d->width, d->height, d->format);
+ QIMAGE_SANITYCHECK_MEMORY(res);
+ const QPixelLayout *layout = &qPixelLayouts[d->format];
+ Q_ASSERT(layout->redWidth == layout->blueWidth);
+ FetchPixelsFunc fetch = qFetchPixels[layout->bpp];
+ StorePixelsFunc store = qStorePixels[layout->bpp];
+
+ const uint redBlueMask = (1 << layout->redWidth) - 1;
+ const uint alphaGreenMask = (((1 << layout->alphaWidth) - 1) << layout->alphaShift)
+ | (((1 << layout->greenWidth) - 1) << layout->greenShift);
+
+ const int buffer_size = 2048;
+ uint buffer[buffer_size];
+ for (int i = 0; i < d->height; ++i) {
+ uchar *q = res.scanLine(i);
+ const uchar *p = constScanLine(i);
+ int x = 0;
+ while (x < d->width) {
+ int l = qMin(d->width - x, buffer_size);
+ const uint *ptr = fetch(buffer, p, x, l);
+ for (int j = 0; j < l; ++j) {
+ uint red = (ptr[j] >> layout->redShift) & redBlueMask;
+ uint blue = (ptr[j] >> layout->blueShift) & redBlueMask;
+ buffer[j] = (ptr[j] & alphaGreenMask)
+ | (red << layout->blueShift)
+ | (blue << layout->redShift);
}
+ store(q, buffer, x, l);
+ x += l;
}
- break;
}
return res;
}
diff --git a/src/gui/image/qjpeghandler.cpp b/src/gui/image/qjpeghandler.cpp
index 0260d18217..013a1a83b0 100644
--- a/src/gui/image/qjpeghandler.cpp
+++ b/src/gui/image/qjpeghandler.cpp
@@ -106,6 +106,13 @@ static void my_error_exit (j_common_ptr cinfo)
longjmp(myerr->setjmp_buffer, 1);
}
+static void my_output_message(j_common_ptr cinfo)
+{
+ char buffer[JMSG_LENGTH_MAX];
+ (*cinfo->err->format_message)(cinfo, buffer);
+ qWarning("%s", buffer);
+}
+
#if defined(Q_C_CALLBACKS)
}
#endif
@@ -530,6 +537,7 @@ static bool write_jpeg_image(const QImage &image, QIODevice *device, int sourceQ
cinfo.err = jpeg_std_error(&jerr);
jerr.error_exit = my_error_exit;
+ jerr.output_message = my_output_message;
if (!setjmp(jerr.setjmp_buffer)) {
// WARNING:
@@ -744,6 +752,7 @@ bool QJpegHandlerPrivate::readJpegHeader(QIODevice *device)
info.src = iod_src;
info.err = jpeg_std_error(&err);
err.error_exit = my_error_exit;
+ err.output_message = my_output_message;
if (!setjmp(err.setjmp_buffer)) {
#if defined(Q_OS_UNIXWARE)
diff --git a/src/gui/image/qnativeimage.cpp b/src/gui/image/qnativeimage.cpp
index 45a8e29100..96d7a0487b 100644
--- a/src/gui/image/qnativeimage.cpp
+++ b/src/gui/image/qnativeimage.cpp
@@ -41,6 +41,7 @@
#include <qdebug.h>
#include "qnativeimage_p.h"
+#include "qplatformscreen_qpa.h"
#include "private/qguiapplication_p.h"
#include "qscreen.h"
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index f1a06fa33c..e8c1304b74 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -1003,14 +1003,6 @@ bool QPixmap::isDetached() const
return data && data->ref.load() == 1;
}
-/*! \internal
- ### Qt5 - remove me.
-*/
-void QPixmap::deref()
-{
- Q_ASSERT_X(false, "QPixmap::deref()", "Do not call this function anymore!");
-}
-
/*!
Replaces this pixmap's data with the given \a image using the
specified \a flags to control the conversion. The \a flags
@@ -1613,9 +1605,22 @@ QPixmap QPixmap::fromImageReader(QImageReader *imageReader, Qt::ImageConversionF
\warning In general, grabbing an area outside the screen is not
safe. This depends on the underlying window system.
+ \warning The function is deprecated in Qt 5.0 since there might be
+ platform plugins in which window system identifiers (\c WId)
+ are local to a screen. Use QScreen::grabWindow() instead.
+
\sa grabWidget(), {Screenshot Example}
+ \sa QScreen
+ \deprecated
*/
+QPixmap QPixmap::grabWindow(WId window, int x, int y, int w, int h)
+{
+ qWarning("%s is deprecated, use QScreen::grabWindow() instead."
+ " Defaulting to primary screen.", Q_FUNC_INFO);
+ return QGuiApplication::primaryScreen()->grabWindow(window, x, y, w, h);
+}
+
/*!
\internal
*/
diff --git a/src/gui/image/qpixmap.h b/src/gui/image/qpixmap.h
index de76321f0a..27bfe15688 100644
--- a/src/gui/image/qpixmap.h
+++ b/src/gui/image/qpixmap.h
@@ -174,7 +174,6 @@ private:
QPixmap(const QSize &s, int type);
void doInit(int, int, int);
- void deref();
Q_DUMMY_COMPARISON_OPERATOR(QPixmap)
friend class QPlatformPixmap;
friend class QBitmap;
diff --git a/src/gui/image/qpixmap_blitter.cpp b/src/gui/image/qpixmap_blitter.cpp
index e5222fa216..382c0b8d1a 100644
--- a/src/gui/image/qpixmap_blitter.cpp
+++ b/src/gui/image/qpixmap_blitter.cpp
@@ -144,27 +144,11 @@ void QBlittablePlatformPixmap::fill(const QColor &color)
m_alpha = true;
}
- uint pixel;
- switch (blittable()->lock()->format()) {
- case QImage::Format_ARGB32_Premultiplied:
- pixel = PREMUL(color.rgba());
- break;
- case QImage::Format_ARGB8565_Premultiplied:
- pixel = qargb8565(color.rgba()).rawValue();
- break;
- case QImage::Format_ARGB8555_Premultiplied:
- pixel = qargb8555(color.rgba()).rawValue();
- break;
- case QImage::Format_ARGB6666_Premultiplied:
- pixel = qargb6666(color.rgba()).rawValue();
- break;
- case QImage::Format_ARGB4444_Premultiplied:
- pixel = qargb4444(color.rgba()).rawValue();
- break;
- default:
- pixel = color.rgba();
- break;
- }
+ uint pixel = PREMUL(color.rgba());
+ const QPixelLayout *layout = &qPixelLayouts[blittable()->lock()->format()];
+ Q_ASSERT(layout->convertFromARGB32PM);
+ layout->convertFromARGB32PM(&pixel, &pixel, 1, layout, 0);
+
//so premultiplied formats are supported and ARGB32 and RGB32
blittable()->lock()->fill(pixel);
}
diff --git a/src/gui/image/qpixmap_raster.cpp b/src/gui/image/qpixmap_raster.cpp
index 3fe5216313..8125b1360d 100644
--- a/src/gui/image/qpixmap_raster.cpp
+++ b/src/gui/image/qpixmap_raster.cpp
@@ -202,46 +202,10 @@ void QRasterPlatformPixmap::fill(const QColor &color)
image = QImage(image.width(), image.height(), toFormat);
}
}
-
- switch (image.format()) {
- case QImage::Format_ARGB8565_Premultiplied:
- pixel = qargb8565(color.rgba()).rawValue();
- break;
- case QImage::Format_ARGB8555_Premultiplied:
- pixel = qargb8555(color.rgba()).rawValue();
- break;
- case QImage::Format_ARGB6666_Premultiplied:
- pixel = qargb6666(color.rgba()).rawValue();
- break;
- case QImage::Format_ARGB4444_Premultiplied:
- pixel = qargb4444(color.rgba()).rawValue();
- break;
- default:
- pixel = PREMUL(color.rgba());
- break;
- }
- } else {
- switch (image.format()) {
- case QImage::Format_RGB16:
- pixel = qt_colorConvert<quint16, quint32>(color.rgba(), 0);
- break;
- case QImage::Format_RGB444:
- pixel = qrgb444(color.rgba()).rawValue();
- break;
- case QImage::Format_RGB555:
- pixel = qrgb555(color.rgba()).rawValue();
- break;
- case QImage::Format_RGB666:
- pixel = qrgb666(color.rgba()).rawValue();
- break;
- case QImage::Format_RGB888:
- pixel = qrgb888(color.rgba()).rawValue();
- break;
- default:
- pixel = color.rgba();
- break;
- }
}
+ pixel = PREMUL(color.rgba());
+ const QPixelLayout *layout = &qPixelLayouts[image.format()];
+ layout->convertFromARGB32PM(&pixel, &pixel, 1, layout, 0);
} else {
pixel = 0;
// ### what about 8 bits
diff --git a/src/gui/image/qpixmap_win.cpp b/src/gui/image/qpixmap_win.cpp
index 6b0ec38f53..227e70e1a6 100644
--- a/src/gui/image/qpixmap_win.cpp
+++ b/src/gui/image/qpixmap_win.cpp
@@ -47,8 +47,91 @@
#include <QScopedArrayPointer>
#include <qt_windows.h>
+#ifdef Q_OS_WINCE
+#define UNDER_NT
+#include <wingdi.h>
+#endif
+
QT_BEGIN_NAMESPACE
+#ifdef Q_OS_WINCE
+#define GetDIBits(a,b,c,d,e,f,g) qt_wince_GetDIBits(a,b,c,d,e,f,g)
+int qt_wince_GetDIBits(HDC /*hdc*/ , HBITMAP hSourceBitmap, uint, uint, LPVOID lpvBits, LPBITMAPINFO, uint)
+{
+ if (!lpvBits) {
+ qWarning("::GetDIBits(), lpvBits NULL");
+ return 0;
+ }
+ BITMAP bm;
+ GetObject(hSourceBitmap, sizeof(BITMAP), &bm);
+ bm.bmHeight = qAbs(bm.bmHeight);
+
+ HBITMAP hTargetBitmap;
+ void *pixels;
+
+ BITMAPINFO dibInfo;
+ memset(&dibInfo, 0, sizeof(dibInfo));
+ dibInfo.bmiHeader.biBitCount = 32;
+ dibInfo.bmiHeader.biClrImportant = 0;
+ dibInfo.bmiHeader.biClrUsed = 0;
+ dibInfo.bmiHeader.biCompression = BI_RGB;;
+ dibInfo.bmiHeader.biHeight = -bm.bmHeight;
+ dibInfo.bmiHeader.biWidth = bm.bmWidth;
+ dibInfo.bmiHeader.biPlanes = 1;
+ dibInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ dibInfo.bmiHeader.biSizeImage = bm.bmWidth * bm.bmHeight * 4;
+
+ HDC displayDC = GetDC(NULL);
+ if (!displayDC) {
+ qWarning("::GetDIBits(), failed to GetDC");
+ return 0;
+ }
+
+ int ret = bm.bmHeight;
+
+ hTargetBitmap = CreateDIBSection(displayDC, (const BITMAPINFO*) &dibInfo, DIB_RGB_COLORS,
+ (void**)&pixels, NULL, 0);
+ if (!hTargetBitmap) {
+ qWarning("::GetDIBits(), failed to CreateDIBSection");
+ return 0;
+ }
+
+ HDC hdcSrc = CreateCompatibleDC(displayDC);
+ HDC hdcDst = CreateCompatibleDC(displayDC);
+
+ if (!(hdcDst && hdcSrc)) {
+ qWarning("::GetDIBits(), failed to CreateCompatibleDC");
+ ret = 0;
+ }
+
+ HBITMAP hOldBitmap1 = (HBITMAP) SelectObject(hdcSrc, hSourceBitmap);
+ HBITMAP hOldBitmap2 = (HBITMAP) SelectObject(hdcDst, hTargetBitmap);
+
+ if (!(hOldBitmap1 && hOldBitmap2)) {
+ qWarning("::GetDIBits(), failed to SelectObject for bitmaps");
+ ret = 0;
+ }
+
+ if (!BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight, hdcSrc, 0, 0, SRCCOPY)) {
+ qWarning("::GetDIBits(), BitBlt failed");
+ ret = 0;
+ }
+
+ SelectObject(hdcSrc, hOldBitmap1);
+ SelectObject(hdcDst, hOldBitmap2);
+
+ DeleteDC(hdcSrc);
+ DeleteDC(hdcDst);
+
+ ReleaseDC(NULL, displayDC);
+
+ memcpy(lpvBits, pixels, dibInfo.bmiHeader.biSizeImage);
+
+ DeleteObject(hTargetBitmap);
+ return ret;
+}
+#endif
+
enum HBitmapFormat
{
HBitmapNoAlpha,
@@ -128,6 +211,8 @@ Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat =
return bitmap;
}
+#ifndef Q_OS_WINCE
+
Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat = 0)
{
// Verify size
@@ -191,6 +276,8 @@ Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat =
return QPixmap::fromImage(image);
}
+#endif //ifndef Q_OS_WINCE
+
Q_GUI_EXPORT HICON qt_pixmapToWinHICON(const QPixmap &p)
{
QBitmap maskBitmap = p.mask();
@@ -214,6 +301,8 @@ Q_GUI_EXPORT HICON qt_pixmapToWinHICON(const QPixmap &p)
return hIcon;
}
+#ifndef Q_OS_WINCE
+
Q_GUI_EXPORT QImage qt_imageFromWinHBITMAP(HDC hdc, HBITMAP bitmap, int w, int h)
{
BITMAPINFO bmi;
@@ -315,5 +404,95 @@ Q_GUI_EXPORT QPixmap qt_pixmapFromWinHICON(HICON icon)
DeleteDC(hdc);
return QPixmap::fromImage(image);
}
+#else //ifndef Q_OS_WINCE
+Q_GUI_EXPORT QPixmap qt_pixmapFromWinHICON(HICON icon)
+{
+ HDC screenDevice = GetDC(0);
+ HDC hdc = CreateCompatibleDC(screenDevice);
+ ReleaseDC(0, screenDevice);
+
+ ICONINFO iconinfo;
+ bool result = GetIconInfo(icon, &iconinfo);
+ if (!result)
+ qWarning("QPixmap::fromWinHICON(), failed to GetIconInfo()");
+
+ int w = 0;
+ int h = 0;
+ if (!iconinfo.xHotspot || !iconinfo.yHotspot) {
+ // We could not retrieve the icon size via GetIconInfo,
+ // so we try again using the icon bitmap.
+ BITMAP bm;
+ int result = GetObject(iconinfo.hbmColor, sizeof(BITMAP), &bm);
+ if (!result) result = GetObject(iconinfo.hbmMask, sizeof(BITMAP), &bm);
+ if (!result) {
+ qWarning("QPixmap::fromWinHICON(), failed to retrieve icon size");
+ return QPixmap();
+ }
+ w = bm.bmWidth;
+ h = bm.bmHeight;
+ } else {
+ // x and y Hotspot describes the icon center
+ w = iconinfo.xHotspot * 2;
+ h = iconinfo.yHotspot * 2;
+ }
+ const DWORD dwImageSize = w * h * 4;
+
+ BITMAPINFO bmi;
+ memset(&bmi, 0, sizeof(bmi));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFO);
+ bmi.bmiHeader.biWidth = w;
+ bmi.bmiHeader.biHeight = -h;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biBitCount = 32;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biSizeImage = dwImageSize;
+
+ uchar* bits;
+
+ HBITMAP winBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**) &bits, 0, 0);
+ if (winBitmap )
+ memset(bits, 0xff, dwImageSize);
+ if (!winBitmap) {
+ qWarning("QPixmap::fromWinHICON(), failed to CreateDIBSection()");
+ return QPixmap();
+ }
+
+ HGDIOBJ oldhdc = (HBITMAP)SelectObject(hdc, winBitmap);
+ if (!DrawIconEx( hdc, 0, 0, icon, w, h, 0, 0, DI_NORMAL))
+ qWarning("QPixmap::fromWinHICON(), failed to DrawIcon()");
+
+ uint mask = 0xff000000;
+ // Create image and copy data into image.
+ QImage image(w, h, QImage::Format_ARGB32);
+
+ if (!image.isNull()) { // failed to alloc?
+ int bytes_per_line = w * sizeof(QRgb);
+ for (int y=0; y < h; ++y) {
+ QRgb *dest = (QRgb *) image.scanLine(y);
+ const QRgb *src = (const QRgb *) (bits + y * bytes_per_line);
+ for (int x=0; x < w; ++x) {
+ dest[x] = src[x];
+ }
+ }
+ }
+ if (!DrawIconEx( hdc, 0, 0, icon, w, h, 0, 0, DI_MASK))
+ qWarning("QPixmap::fromWinHICON(), failed to DrawIcon()");
+ if (!image.isNull()) { // failed to alloc?
+ int bytes_per_line = w * sizeof(QRgb);
+ for (int y=0; y < h; ++y) {
+ QRgb *dest = (QRgb *) image.scanLine(y);
+ const QRgb *src = (const QRgb *) (bits + y * bytes_per_line);
+ for (int x=0; x < w; ++x) {
+ if (!src[x])
+ dest[x] = dest[x] | mask;
+ }
+ }
+ }
+ SelectObject(hdc, oldhdc); //restore state
+ DeleteObject(winBitmap);
+ DeleteDC(hdc);
+ return QPixmap::fromImage(image);
+}
+#endif //ifndef Q_OS_WINCE
QT_END_NAMESPACE
diff --git a/src/gui/image/qplatformpixmap.cpp b/src/gui/image/qplatformpixmap.cpp
index 5162ea80d9..30ac6ce30e 100644
--- a/src/gui/image/qplatformpixmap.cpp
+++ b/src/gui/image/qplatformpixmap.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qplatformpixmap_qpa.h"
+#include "qplatformintegration_qpa.h"
#include <QtCore/qbuffer.h>
#include <QtGui/qbitmap.h>
#include <QtGui/qimagereader.h>
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 7b01ba14cd..9c5f3b10da 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -55,7 +55,8 @@ HEADERS += \
kernel/qtouchdevice.h \
kernel/qtouchdevice_p.h \
kernel/qplatformsharedgraphicscache_qpa.h \
- kernel/qplatformdialoghelper_qpa.h
+ kernel/qplatformdialoghelper_qpa.h \
+ kernel/qplatformservices_qpa.h
SOURCES += \
kernel/qclipboard_qpa.cpp \
@@ -97,7 +98,8 @@ SOURCES += \
kernel/qstylehints.cpp \
kernel/qtouchdevice.cpp \
kernel/qplatformsharedgraphicscache_qpa.cpp \
- kernel/qplatformdialoghelper_qpa.cpp
+ kernel/qplatformdialoghelper_qpa.cpp \
+ kernel/qplatformservices_qpa.cpp
contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2)|contains(QT_CONFIG, egl) {
HEADERS += \
diff --git a/src/gui/kernel/qclipboard_qpa.cpp b/src/gui/kernel/qclipboard_qpa.cpp
index ec940385b8..b33ccd42a2 100644
--- a/src/gui/kernel/qclipboard_qpa.cpp
+++ b/src/gui/kernel/qclipboard_qpa.cpp
@@ -46,6 +46,7 @@
#include "qmimedata.h"
#include "private/qguiapplication_p.h"
#include "qplatformclipboard_qpa.h"
+#include "qplatformintegration_qpa.h"
QT_BEGIN_NAMESPACE
diff --git a/src/gui/kernel/qdnd.cpp b/src/gui/kernel/qdnd.cpp
index b9f0fe4f5b..2fb250cf18 100644
--- a/src/gui/kernel/qdnd.cpp
+++ b/src/gui/kernel/qdnd.cpp
@@ -59,6 +59,7 @@
#include "qimagewriter.h"
#include "qdebug.h"
#include <ctype.h>
+#include <qplatformintegration_qpa.h>
#include <qplatformdrag_qpa.h>
#include <private/qguiapplication_p.h>
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 543f5453ff..c3a6be692b 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -3305,15 +3305,21 @@ QWindowStateChangeEvent::~QWindowStateChangeEvent()
\section1 Event Handling
- All touch events are of type QEvent::TouchBegin, QEvent::TouchUpdate, or QEvent::TouchEnd.
- Reimplement QWidget::event() or QAbstractScrollArea::viewportEvent() for widgets and
- QGraphicsItem::sceneEvent() for items in a graphics view to receive touch events.
+ All touch events are of type QEvent::TouchBegin, QEvent::TouchUpdate, QEvent::TouchEnd or
+ QEvent::TouchCancel. Reimplement QWidget::event() or QAbstractScrollArea::viewportEvent() for
+ widgets and QGraphicsItem::sceneEvent() for items in a graphics view to receive touch events.
The QEvent::TouchUpdate and QEvent::TouchEnd events are sent to the widget or item that
accepted the QEvent::TouchBegin event. If the QEvent::TouchBegin event is not accepted and not
filtered by an event filter, then no further touch events are sent until the next
QEvent::TouchBegin.
+ Some systems may send an event of type QEvent::TouchCancel. Upon receiving this event
+ applications are requested to ignore the entire active touch sequence. For example in a
+ composited system the compositor may decide to treat certain gestures as system-wide
+ gestures. Whenever such a decision is made (the gesture is recognized), the clients will be
+ notified with a QEvent::TouchCancel event so they can update their state accordingly.
+
The touchPoints() function returns a list of all touch points contained in the event.
Information about each touch point can be retrieved using the QTouchEvent::TouchPoint class.
The Qt::TouchPointState enum describes the different states that a touch point may have.
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index b1cbb5fcae..7cb3d4b488 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -48,6 +48,8 @@
#include "qplatformfontdatabase_qpa.h"
#include "qplatformwindow_qpa.h"
#include "qplatformnativeinterface_qpa.h"
+#include "qplatformtheme_qpa.h"
+#include "qplatformintegration_qpa.h"
#include <QtCore/QAbstractEventDispatcher>
#include <QtCore/private/qcoreapplication_p.h>
@@ -126,6 +128,7 @@ QWindow *QGuiApplicationPrivate::focus_window = 0;
static QBasicMutex applicationFontMutex;
QFont *QGuiApplicationPrivate::app_font = 0;
+bool QGuiApplicationPrivate::obey_desktop_settings = true;
extern void qRegisterGuiVariant();
extern void qUnregisterGuiVariant();
@@ -184,7 +187,8 @@ QGuiApplication::~QGuiApplication()
QGuiApplicationPrivate::QGuiApplicationPrivate(int &argc, char **argv, int flags)
: QCoreApplicationPrivate(argc, argv, flags),
styleHints(0),
- inputMethod(0)
+ inputMethod(0),
+ lastTouchType(QEvent::TouchEnd)
{
self = this;
application_type = QCoreApplication::GuiClient;
@@ -502,6 +506,8 @@ void QGuiApplicationPrivate::init()
QWindowSystemInterface::sendWindowSystemEvents(QCoreApplicationPrivate::eventDispatcher, QEventLoop::AllEvents);
}
+extern void qt_cleanupFontDatabase();
+
QGuiApplicationPrivate::~QGuiApplicationPrivate()
{
is_app_closing = true;
@@ -526,6 +532,8 @@ QGuiApplicationPrivate::~QGuiApplicationPrivate()
delete styleHints;
delete inputMethod;
+ qt_cleanupFontDatabase();
+
delete platform_integration;
platform_integration = 0;
}
@@ -655,6 +663,10 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv
QGuiApplicationPrivate::reportLogicalDotsPerInchChange(
static_cast<QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *>(e));
break;
+ case QWindowSystemInterfacePrivate::ThemeChange:
+ QGuiApplicationPrivate::processThemeChanged(
+ static_cast<QWindowSystemInterfacePrivate::ThemeChangeEvent *>(e));
+ break;
case QWindowSystemInterfacePrivate::Map:
QGuiApplicationPrivate::processMapEvent(static_cast<QWindowSystemInterfacePrivate::MapEvent *>(e));
break;
@@ -882,6 +894,14 @@ void QGuiApplicationPrivate::processWindowStateChangedEvent(QWindowSystemInterfa
}
}
+void QGuiApplicationPrivate::processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce)
+{
+ if (QWindow *window = tce->window.data()) {
+ QEvent e(QEvent::ThemeChange);
+ QGuiApplication::sendSpontaneousEvent(window, &e);
+ }
+}
+
void QGuiApplicationPrivate::processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent *e)
{
if (e->tlw.isNull())
@@ -946,8 +966,55 @@ Q_GUI_EXPORT bool operator==(const QGuiApplicationPrivate::ActiveTouchPointsKey
void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::TouchEvent *e)
{
- QWindow *window = e->window.data();
QGuiApplicationPrivate *d = self;
+
+ if (e->touchType == QEvent::TouchCancel) {
+ // The touch sequence has been canceled (e.g. by the compositor).
+ // Send the TouchCancel to all windows with active touches and clean up.
+ QTouchEvent touchEvent(QEvent::TouchCancel, e->device, e->modifiers);
+ touchEvent.setTimestamp(e->timestamp);
+ QHash<ActiveTouchPointsKey, ActiveTouchPointsValue>::const_iterator it
+ = self->activeTouchPoints.constBegin(), ite = self->activeTouchPoints.constEnd();
+ QSet<QWindow *> windowsNeedingCancel;
+ while (it != ite) {
+ QWindow *w = it->window.data();
+ if (w)
+ windowsNeedingCancel.insert(w);
+ ++it;
+ }
+ for (QSet<QWindow *>::const_iterator winIt = windowsNeedingCancel.constBegin(),
+ winItEnd = windowsNeedingCancel.constEnd(); winIt != winItEnd; ++winIt) {
+ touchEvent.setWindow(*winIt);
+ QGuiApplication::sendSpontaneousEvent(*winIt, &touchEvent);
+ }
+ if (!self->synthesizedMousePoints.isEmpty() && !e->synthetic) {
+ for (QHash<QWindow *, SynthesizedMouseData>::const_iterator synthIt = self->synthesizedMousePoints.constBegin(),
+ synthItEnd = self->synthesizedMousePoints.constEnd(); synthIt != synthItEnd; ++synthIt) {
+ if (!synthIt->window)
+ continue;
+ QWindowSystemInterfacePrivate::MouseEvent fake(synthIt->window.data(),
+ e->timestamp,
+ synthIt->pos,
+ synthIt->screenPos,
+ Qt::NoButton,
+ e->modifiers);
+ fake.synthetic = true;
+ processMouseEvent(&fake);
+ }
+ self->synthesizedMousePoints.clear();
+ }
+ self->activeTouchPoints.clear();
+ self->lastTouchType = e->touchType;
+ return;
+ }
+
+ // Prevent sending ill-formed event sequences: Cancel can only be followed by a Begin.
+ if (self->lastTouchType == QEvent::TouchCancel && e->touchType != QEvent::TouchBegin)
+ return;
+
+ self->lastTouchType = e->touchType;
+
+ QWindow *window = e->window.data();
typedef QPair<Qt::TouchPointStates, QList<QTouchEvent::TouchPoint> > StatesAndTouchPoints;
QHash<QWindow *, StatesAndTouchPoints> windowsNeedingEvents;
@@ -1097,6 +1164,8 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To
// exclude touchpads as those generate their own mouse events
if (touchEvent.device()->type() != QTouchDevice::TouchPad) {
Qt::MouseButtons b = eventType == QEvent::TouchEnd ? Qt::NoButton : Qt::LeftButton;
+ if (b == Qt::NoButton)
+ self->synthesizedMousePoints.clear();
QList<QTouchEvent::TouchPoint> touchPoints = touchEvent.touchPoints();
if (eventType == QEvent::TouchBegin)
@@ -1105,6 +1174,9 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To
for (int i = 0; i < touchPoints.count(); ++i) {
const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
if (touchPoint.id() == m_fakeMouseSourcePointId) {
+ if (b != Qt::NoButton)
+ self->synthesizedMousePoints.insert(w, SynthesizedMouseData(
+ touchPoint.pos(), touchPoint.screenPos(), w));
QWindowSystemInterfacePrivate::MouseEvent fake(w, e->timestamp,
touchPoint.pos(),
touchPoint.screenPos(),
@@ -1313,6 +1385,9 @@ QClipboard * QGuiApplication::clipboard()
QPalette QGuiApplication::palette()
{
if (!QGuiApplicationPrivate::app_pal)
+ if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
+ QGuiApplicationPrivate::app_pal = new QPalette(*themePalette);
+ if (!QGuiApplicationPrivate::app_pal)
QGuiApplicationPrivate::app_pal = new QPalette(Qt::black);
return *QGuiApplicationPrivate::app_pal;
}
@@ -1407,6 +1482,17 @@ void QGuiApplicationPrivate::emitLastWindowClosed()
}
}
+bool QGuiApplicationPrivate::shouldQuit()
+{
+ /* if there is no visible top-level window left, we allow the quit */
+ QWindowList list = QGuiApplication::topLevelWindows();
+ for (int i = 0; i < list.size(); ++i) {
+ QWindow *w = list.at(i);
+ if (w->isVisible())
+ return false;
+ }
+ return true;
+}
/*!
\property QGuiApplication::layoutDirection
@@ -1562,6 +1648,32 @@ QStyleHints *QGuiApplication::styleHints() const
return d->styleHints;
}
+/*!
+ Sets whether Qt should use the system's standard colors, fonts, etc., to
+ \a on. By default, this is true.
+
+ This function must be called before creating the QGuiApplication object, like
+ this:
+
+ \snippet doc/src/snippets/code/src_gui_kernel_qapplication.cpp 6
+
+ \sa desktopSettingsAware()
+*/
+void QGuiApplication::setDesktopSettingsAware(bool on)
+{
+ QGuiApplicationPrivate::obey_desktop_settings = on;
+}
+
+/*!
+ Returns true if Qt is set to use the system's standard colors, fonts, etc.;
+ otherwise returns false. The default is true.
+
+ \sa setDesktopSettingsAware()
+*/
+bool QGuiApplication::desktopSettingsAware()
+{
+ return QGuiApplicationPrivate::obey_desktop_settings;
+}
/*!
\since 5.0
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
index 75046d8767..c374a05986 100644
--- a/src/gui/kernel/qguiapplication.h
+++ b/src/gui/kernel/qguiapplication.h
@@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE
class QGuiApplicationPrivate;
class QPlatformNativeInterface;
+class QPlatformIntegration;
class QPalette;
class QScreen;
class QStyleHints;
@@ -121,6 +122,9 @@ public:
static inline bool isLeftToRight() { return layoutDirection() == Qt::LeftToRight; }
QStyleHints *styleHints() const;
+ static void setDesktopSettingsAware(bool on);
+ static bool desktopSettingsAware();
+
QT_DEPRECATED QInputPanel *inputPanel() const;
QInputMethod *inputMethod() const;
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index d9444ebe95..7e6e0aa8c7 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -51,14 +51,14 @@
#include <QWindowSystemInterface>
#include "private/qwindowsysteminterface_qpa_p.h"
-#include <QtGui/qplatformintegration_qpa.h>
-#include <QtGui/qplatformtheme_qpa.h>
#include "private/qshortcutmap_p.h"
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
+class QPlatformIntegration;
+class QPlatformTheme;
class Q_GUI_EXPORT QGuiApplicationPrivate : public QCoreApplicationPrivate
{
@@ -74,6 +74,8 @@ public:
virtual void notifyLayoutDirectionChange();
virtual void notifyActiveWindowChange(QWindow *previous);
+ virtual bool shouldQuit();
+
static Qt::KeyboardModifiers modifier_buttons;
static Qt::MouseButtons mouse_buttons;
@@ -125,6 +127,7 @@ public:
static void reportGeometryChange(QWindowSystemInterfacePrivate::ScreenGeometryEvent *e);
static void reportAvailableGeometryChange(QWindowSystemInterfacePrivate::ScreenAvailableGeometryEvent *e);
static void reportLogicalDotsPerInchChange(QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *e);
+ static void processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce);
static void processMapEvent(QWindowSystemInterfacePrivate::MapEvent *e);
static void processUnmapEvent(QWindowSystemInterfacePrivate::UnmapEvent *e);
@@ -181,6 +184,7 @@ public:
static QFont *app_font;
QStyleHints *styleHints;
+ static bool obey_desktop_settings;
QInputMethod *inputMethod;
static QList<QObject *> generic_plugin_list;
@@ -199,6 +203,15 @@ public:
QTouchEvent::TouchPoint touchPoint;
};
QHash<ActiveTouchPointsKey, ActiveTouchPointsValue> activeTouchPoints;
+ QEvent::Type lastTouchType;
+ struct SynthesizedMouseData {
+ SynthesizedMouseData(const QPointF &p, const QPointF &sp, QWindow *w)
+ : pos(p), screenPos(sp), window(w) { }
+ QPointF pos;
+ QPointF screenPos;
+ QWeakPointer<QWindow> window;
+ };
+ QHash<QWindow *, SynthesizedMouseData> synthesizedMousePoints;
private:
void init();
diff --git a/src/gui/kernel/qinputmethod_p.h b/src/gui/kernel/qinputmethod_p.h
index 862764d1bc..8a17c85990 100644
--- a/src/gui/kernel/qinputmethod_p.h
+++ b/src/gui/kernel/qinputmethod_p.h
@@ -47,6 +47,7 @@
#include <QtCore/QWeakPointer>
#include <QTransform>
#include <qplatforminputcontext_qpa.h>
+#include <qplatformintegration_qpa.h>
#include <private/qguiapplication_p.h>
QT_BEGIN_HEADER
diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp
index 1b6d1d34c4..ba51653fcf 100644
--- a/src/gui/kernel/qopenglcontext.cpp
+++ b/src/gui/kernel/qopenglcontext.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qplatformopenglcontext_qpa.h"
+#include "qplatformintegration_qpa.h"
#include "qopenglcontext.h"
#include "qopenglcontext_p.h"
#include "qwindow.h"
@@ -289,7 +290,7 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
return false;
if (surface->surfaceType() != QSurface::OpenGLSurface) {
- qWarning() << "QOpenGLContext::makeBuffers() called with non-opengl surface";
+ qWarning() << "QOpenGLContext::makeCurrent() called with non-opengl surface";
return false;
}
diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h
index 7b4e880ade..3e2c35f088 100644
--- a/src/gui/kernel/qopenglcontext_p.h
+++ b/src/gui/kernel/qopenglcontext_p.h
@@ -42,6 +42,8 @@
#ifndef QGUIGLCONTEXT_P_H
#define QGUIGLCONTEXT_P_H
+#ifndef QT_NO_OPENGL
+
#include "qopengl.h"
#include "qopenglcontext.h"
#include <private/qobject_p.h>
@@ -245,4 +247,5 @@ QT_END_NAMESPACE
QT_END_HEADER
+#endif // QT_NO_OPENGL
#endif // QGUIGLCONTEXT_P_H
diff --git a/src/gui/kernel/qpalette.cpp b/src/gui/kernel/qpalette.cpp
index 627731ff20..d5b17fa665 100644
--- a/src/gui/kernel/qpalette.cpp
+++ b/src/gui/kernel/qpalette.cpp
@@ -41,6 +41,7 @@
#include "qpalette.h"
#include "qguiapplication.h"
+#include "qguiapplication_p.h"
#include "qdatastream.h"
#include "qvariant.h"
#include "qdebug.h"
@@ -64,6 +65,29 @@ static QColor qt_mix_colors(QColor a, QColor b)
(a.blue() + b.blue()) / 2, (a.alpha() + b.alpha()) / 2);
}
+static void qt_palette_from_color(QPalette &pal, const QColor &button)
+{
+ int h, s, v;
+ button.getHsv(&h, &s, &v);
+ // inactive and active are the same..
+ const QBrush baseBrush = QBrush(v > 128 ? Qt::white : Qt::black);
+ const QBrush foregroundBrush = QBrush(v > 128 ? Qt::black : Qt::white);
+ const QBrush buttonBrush = QBrush(button);
+ const QBrush buttonBrushDark = QBrush(button.darker());
+ const QBrush buttonBrushDark150 = QBrush(button.darker(150));
+ const QBrush buttonBrushLight150 = QBrush(button.lighter(150));
+ const QBrush whiteBrush = QBrush(Qt::white);
+ pal.setColorGroup(QPalette::Active, foregroundBrush, buttonBrush, buttonBrushLight150,
+ buttonBrushDark, buttonBrushDark150, foregroundBrush, whiteBrush,
+ baseBrush, buttonBrush);
+ pal.setColorGroup(QPalette::Inactive, foregroundBrush, buttonBrush, buttonBrushLight150,
+ buttonBrushDark, buttonBrushDark150, foregroundBrush, whiteBrush,
+ baseBrush, buttonBrush);
+ pal.setColorGroup(QPalette::Disabled, buttonBrushDark, buttonBrush, buttonBrushLight150,
+ buttonBrushDark, buttonBrushDark150, buttonBrushDark,
+ whiteBrush, buttonBrush, buttonBrush);
+}
+
/*!
\fn const QColor &QPalette::color(ColorRole role) const
@@ -488,40 +512,20 @@ static QColor qt_mix_colors(QColor a, QColor b)
\sa QApplication::setPalette(), QApplication::palette()
*/
QPalette::QPalette()
- : d(QGuiApplication::palette().d),
- current_group(Active),
- resolve_mask(0)
-{
- d->ref.ref();
-}
-
-static void qt_palette_from_color(QPalette &pal, const QColor & button)
+ : d(0), current_group(Active), resolve_mask(0)
{
- QColor bg = button,
- btn = button,
- fg, base;
- int h, s, v;
- bg.getHsv(&h, &s, &v);
- if(v > 128) {
- fg = Qt::black;
- base = Qt::white;
+ // Initialize to application palette if present, else default to black.
+ // This makes it possible to instantiate QPalette outside QGuiApplication,
+ // for example in the platform plugins.
+ if (QGuiApplicationPrivate::app_pal) {
+ d = QGuiApplicationPrivate::app_pal->d;
+ d->ref.ref();
} else {
- fg = Qt::white;
- base = Qt::black;
+ init();
+ qt_palette_from_color(*this, Qt::black);
}
- //inactive and active are the same..
- pal.setColorGroup(QPalette::Active, QBrush(fg), QBrush(btn), QBrush(btn.lighter(150)),
- QBrush(btn.darker()), QBrush(btn.darker(150)), QBrush(fg), QBrush(Qt::white),
- QBrush(base), QBrush(bg));
- pal.setColorGroup(QPalette::Inactive, QBrush(fg), QBrush(btn), QBrush(btn.lighter(150)),
- QBrush(btn.darker()), QBrush(btn.darker(150)), QBrush(fg), QBrush(Qt::white),
- QBrush(base), QBrush(bg));
- pal.setColorGroup(QPalette::Disabled, QBrush(btn.darker()), QBrush(btn), QBrush(btn.lighter(150)),
- QBrush(btn.darker()), QBrush(btn.darker(150)), QBrush(btn.darker()),
- QBrush(Qt::white), QBrush(bg), QBrush(bg));
}
-
/*!
Constructs a palette from the \a button color. The other colors are
automatically calculated, based on this color. \c Window will be
diff --git a/src/gui/kernel/qplatformintegration_qpa.cpp b/src/gui/kernel/qplatformintegration_qpa.cpp
index e867e4e588..7a3fe05f7a 100644
--- a/src/gui/kernel/qplatformintegration_qpa.cpp
+++ b/src/gui/kernel/qplatformintegration_qpa.cpp
@@ -107,6 +107,11 @@ QPlatformNativeInterface * QPlatformIntegration::nativeInterface() const
return 0;
}
+QPlatformServices *QPlatformIntegration::services() const
+{
+ return 0;
+}
+
/*!
\class QPlatformIntegration
\since 4.8
@@ -215,12 +220,14 @@ QPlatformPixmap *QPlatformIntegration::createPlatformPixmap(QPlatformPixmap::Pix
return new QRasterPlatformPixmap(type);
}
+#ifndef QT_NO_OPENGL
QPlatformOpenGLContext *QPlatformIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
{
Q_UNUSED(context);
qWarning("This plugin does not support createPlatformOpenGLContext!");
return 0;
}
+#endif
/*!
Factory function for QPlatformSharedGraphicsCache. This function will return 0 if the platform
diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h
index efaf495b81..483964b8f3 100644
--- a/src/gui/kernel/qplatformintegration_qpa.h
+++ b/src/gui/kernel/qplatformintegration_qpa.h
@@ -66,6 +66,7 @@ class QPlatformAccessibility;
class QPlatformTheme;
class QPlatformDialogHelper;
class QPlatformSharedGraphicsCache;
+class QPlatformServices;
class Q_GUI_EXPORT QPlatformIntegration
{
@@ -86,7 +87,9 @@ public:
virtual QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
virtual QPlatformWindow *createPlatformWindow(QWindow *window) const = 0;
virtual QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const = 0;
+#ifndef QT_NO_OPENGL
virtual QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
+#endif
virtual QPlatformSharedGraphicsCache *createPlatformSharedGraphicsCache(const char *cacheId) const;
// Event dispatcher:
@@ -106,6 +109,8 @@ public:
// Access native handles. The window handle is already available from Wid;
virtual QPlatformNativeInterface *nativeInterface() const;
+ virtual QPlatformServices *services() const;
+
enum StyleHint {
CursorFlashTime,
KeyboardInputInterval,
diff --git a/src/gui/kernel/qplatformintegrationplugin_qpa.h b/src/gui/kernel/qplatformintegrationplugin_qpa.h
index 84c2567bbd..d70569cbba 100644
--- a/src/gui/kernel/qplatformintegrationplugin_qpa.h
+++ b/src/gui/kernel/qplatformintegrationplugin_qpa.h
@@ -68,7 +68,7 @@ struct QPlatformIntegrationFactoryInterface : public QFactoryInterface
virtual QPlatformIntegration *create(const QString &key, const QStringList &paramList) = 0;
};
-#define QPlatformIntegrationFactoryInterface_iid "com.nokia.Qt.QPlatformIntegrationFactoryInterface"
+#define QPlatformIntegrationFactoryInterface_iid "org.qt-project.Qt.QPlatformIntegrationFactoryInterface"
Q_DECLARE_INTERFACE(QPlatformIntegrationFactoryInterface, QPlatformIntegrationFactoryInterface_iid)
diff --git a/src/gui/kernel/qplatformopenglcontext_qpa.h b/src/gui/kernel/qplatformopenglcontext_qpa.h
index 17d4e96f8e..af70368f5e 100644
--- a/src/gui/kernel/qplatformopenglcontext_qpa.h
+++ b/src/gui/kernel/qplatformopenglcontext_qpa.h
@@ -42,6 +42,8 @@
#ifndef QPLATFORMGLCONTEXT_H
#define QPLATFORMGLCONTEXT_H
+#ifndef QT_NO_OPENGL
+
#include <QtCore/qnamespace.h>
#include <QtGui/qsurfaceformat.h>
#include <QtGui/qwindow.h>
@@ -91,5 +93,6 @@ QT_END_NAMESPACE
QT_END_HEADER
+#endif // QT_NO_OPENGL
#endif // QPLATFORMGLCONTEXT_H
diff --git a/src/gui/kernel/qplatformscreen_qpa.cpp b/src/gui/kernel/qplatformscreen_qpa.cpp
index b8f1430d1b..c832d853f4 100644
--- a/src/gui/kernel/qplatformscreen_qpa.cpp
+++ b/src/gui/kernel/qplatformscreen_qpa.cpp
@@ -93,7 +93,7 @@ QWindow *QPlatformScreen::topLevelAt(const QPoint & pos) const
QWindowList list = QGuiApplication::topLevelWindows();
for (int i = list.size()-1; i >= 0; --i) {
QWindow *w = list[i];
- if (w->visible() && w->geometry().contains(pos))
+ if (w->isVisible() && w->geometry().contains(pos))
return w;
}
diff --git a/src/gui/kernel/qplatformservices_qpa.cpp b/src/gui/kernel/qplatformservices_qpa.cpp
new file mode 100644
index 0000000000..7993a82f4e
--- /dev/null
+++ b/src/gui/kernel/qplatformservices_qpa.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplatformservices_qpa.h"
+
+#include <QtCore/QUrl>
+#include <QtCore/QString>
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QPlatformServices
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformServices provides the backend for desktop-related functionality.
+*/
+
+bool QPlatformServices::openUrl(const QUrl &url)
+{
+ qWarning("This plugin does not support QPlatformServices::openUrl() for '%s'.",
+ qPrintable(url.toString()));
+ return false;
+}
+
+bool QPlatformServices::openDocument(const QUrl &url)
+{
+ qWarning("This plugin does not support QPlatformServices::openDocument() for '%s'.",
+ qPrintable(url.toString()));
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/gui/util/qdesktopservices_qpa.cpp b/src/gui/kernel/qplatformservices_qpa.h
index b94267e72e..aff2e5d6fe 100644
--- a/src/gui/util/qdesktopservices_qpa.cpp
+++ b/src/gui/kernel/qplatformservices_qpa.h
@@ -39,23 +39,27 @@
**
****************************************************************************/
-#include <qdebug.h>
-#include <qurl.h>
+#ifndef QPLATFORMSERVICES_QPA_H
+#define QPLATFORMSERVICES_QPA_H
+
+#include <QtCore/QtGlobal>
+
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-static bool launchWebBrowser(const QUrl &url)
-{
- Q_UNUSED(url);
- qWarning("QDesktopServices::launchWebBrowser not implemented");
- return false;
-}
+class QUrl;
-static bool openDocument(const QUrl &file)
+class Q_GUI_EXPORT QPlatformServices
{
- Q_UNUSED(file);
- qWarning("QDesktopServices::openDocument not implemented");
- return false;
-}
+public:
+ virtual ~QPlatformServices() { }
+
+ virtual bool openUrl(const QUrl &url);
+ virtual bool openDocument(const QUrl &url);
+};
QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif // QPLATFORMSERVICES_QPA_H
diff --git a/src/gui/kernel/qplatformtheme_qpa.cpp b/src/gui/kernel/qplatformtheme_qpa.cpp
index d2ff804ddf..aec465f0ff 100644
--- a/src/gui/kernel/qplatformtheme_qpa.cpp
+++ b/src/gui/kernel/qplatformtheme_qpa.cpp
@@ -42,6 +42,8 @@
#include "qplatformtheme_qpa.h"
#include <QtCore/QVariant>
+#include <QtCore/QStringList>
+#include <qpalette.h>
QT_BEGIN_NAMESPACE
@@ -68,6 +70,21 @@ QT_BEGIN_NAMESPACE
\value MaximumScrollBarDragDistance (int) Determines the value returned by
QStyle::pixelMetric(PM_MaximumDragDistance)
+ \value ToolButtonStyle (int) A value representing a Qt::ToolButtonStyle.
+
+ \value ToolBarIconSize Icon size for tool bars.
+
+ \value SystemIconThemeName (QString) Name of the icon theme.
+
+ \value SystemIconFallbackThemeName (QString) Name of the fallback icon theme.
+
+ \value IconThemeSearchPaths (QStringList) Search paths for icons.
+
+ \value ItemViewActivateItemOnSingleClick (bool) Activate items by single click.
+
+ \value StyleNames (QStringList) A list of preferred style names.
+
+
\sa themeHint(), QStyle::pixelMetric()
*/
@@ -95,9 +112,28 @@ QPlatformDialogHelper *QPlatformTheme::createPlatformDialogHelper(DialogType typ
return 0;
}
+const QPalette *QPlatformTheme::palette(Palette type) const
+{
+ Q_UNUSED(type)
+ return 0;
+}
+
QVariant QPlatformTheme::themeHint(ThemeHint hint) const
{
switch (hint) {
+ case QPlatformTheme::ItemViewActivateItemOnSingleClick:
+ return QVariant(false);
+ case QPlatformTheme::ToolButtonStyle:
+ return QVariant(int(Qt::ToolButtonIconOnly));
+ case QPlatformTheme::ToolBarIconSize:
+ return QVariant(int(0));
+ case QPlatformTheme::SystemIconThemeName:
+ case QPlatformTheme::SystemIconFallbackThemeName:
+ return QVariant(QString());
+ case QPlatformTheme::IconThemeSearchPaths:
+ return QVariant(QStringList());
+ case QPlatformTheme::StyleNames:
+ return QVariant(QStringList());
case TextCursorWidth:
return QVariant(1);
case DropShadow:
diff --git a/src/gui/kernel/qplatformtheme_qpa.h b/src/gui/kernel/qplatformtheme_qpa.h
index 2b87e63287..036432054e 100644
--- a/src/gui/kernel/qplatformtheme_qpa.h
+++ b/src/gui/kernel/qplatformtheme_qpa.h
@@ -48,13 +48,13 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-
class QMenu;
class QMenuBar;
class QPlatformMenu;
class QPlatformMenuBar;
class QPlatformDialogHelper;
class QVariant;
+class QPalette;
class Q_GUI_EXPORT QPlatformTheme
{
@@ -62,7 +62,14 @@ public:
enum ThemeHint {
TextCursorWidth,
DropShadow,
- MaximumScrollBarDragDistance
+ MaximumScrollBarDragDistance,
+ ToolButtonStyle,
+ ToolBarIconSize,
+ ItemViewActivateItemOnSingleClick,
+ SystemIconThemeName,
+ SystemIconFallbackThemeName,
+ IconThemeSearchPaths,
+ StyleNames
};
enum DialogType {
@@ -71,12 +78,20 @@ public:
FontDialog
};
+ enum Palette {
+ SystemPalette,
+ ToolTipPalette,
+ NPalettes
+ };
+
virtual QPlatformMenu *createPlatformMenu(QMenu *menu = 0) const;
virtual QPlatformMenuBar *createPlatformMenuBar(QMenuBar *menuBar = 0) const;
virtual bool usePlatformNativeDialog(DialogType type) const;
virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;
+ virtual const QPalette *palette(Palette type = SystemPalette) const;
+
virtual QVariant themeHint(ThemeHint hint) const;
};
diff --git a/src/gui/kernel/qplatformthemeplugin_qpa.h b/src/gui/kernel/qplatformthemeplugin_qpa.h
index fb4f9f9b7c..3ce7cc5b02 100644
--- a/src/gui/kernel/qplatformthemeplugin_qpa.h
+++ b/src/gui/kernel/qplatformthemeplugin_qpa.h
@@ -68,7 +68,7 @@ struct QPlatformThemeFactoryInterface : public QFactoryInterface
virtual QPlatformTheme *create(const QString &key, const QStringList &paramList) = 0;
};
-#define QPlatformThemeFactoryInterface_iid "com.nokia.Qt.QPlatformThemeFactoryInterface"
+#define QPlatformThemeFactoryInterface_iid "org.qt-project.Qt.QPlatformThemeFactoryInterface"
Q_DECLARE_INTERFACE(QPlatformThemeFactoryInterface, QPlatformThemeFactoryInterface_iid)
diff --git a/src/gui/kernel/qplatformwindow_qpa.cpp b/src/gui/kernel/qplatformwindow_qpa.cpp
index c52a1cf757..e12228d7bd 100644
--- a/src/gui/kernel/qplatformwindow_qpa.cpp
+++ b/src/gui/kernel/qplatformwindow_qpa.cpp
@@ -114,6 +114,10 @@ QSurfaceFormat QPlatformWindow::format() const
can happen programatically(from ie. user application) or by the window manager. This means that
there is no need to call this function specifically from the window manager callback, instead
call QWindowSystemInterface::handleGeometryChange(QWindow *w, const QRect &newRect);
+
+ The position(x, y) part of the rect might be inclusive or exclusive of the window frame
+ as returned by frameMargins(). You can detect this in the plugin by checking
+ qt_window_private(window())->positionPolicy.
*/
void QPlatformWindow::setGeometry(const QRect &rect)
{
@@ -142,6 +146,7 @@ QMargins QPlatformWindow::frameMargins() const
void QPlatformWindow::setVisible(bool visible)
{
Q_UNUSED(visible);
+ QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size()));
}
/*!
Requests setting the window flags of this surface
@@ -152,6 +157,20 @@ Qt::WindowFlags QPlatformWindow::setWindowFlags(Qt::WindowFlags flags)
return flags;
}
+
+
+/*!
+ Returns if this window is exposed in the windowing system.
+
+ An exposeEvent() is sent every time this value changes.
+ */
+
+bool QPlatformWindow::isExposed() const
+{
+ Q_D(const QPlatformWindow);
+ return d->window->visible();
+}
+
/*!
Requests setting the window state of this surface
to \a type. Returns the actual state set.
diff --git a/src/gui/kernel/qplatformwindow_qpa.h b/src/gui/kernel/qplatformwindow_qpa.h
index 88bf633425..170f62162f 100644
--- a/src/gui/kernel/qplatformwindow_qpa.h
+++ b/src/gui/kernel/qplatformwindow_qpa.h
@@ -89,6 +89,8 @@ public:
virtual void raise();
virtual void lower();
+ virtual bool isExposed() const;
+
virtual void propagateSizeHints();
virtual void setOpacity(qreal level);
diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp
index 67eb991b19..da0716b7d5 100644
--- a/src/gui/kernel/qscreen.cpp
+++ b/src/gui/kernel/qscreen.cpp
@@ -41,6 +41,7 @@
#include "qscreen.h"
#include "qscreen_p.h"
+#include "qpixmap.h"
#include "qplatformscreen_qpa.h"
#include <QtCore/private/qobject_p.h>
@@ -542,4 +543,51 @@ void QScreenPrivate::updatePrimaryOrientation()
primaryOrientation = geometry.width() >= geometry.height() ? Qt::LandscapeOrientation : Qt::PortraitOrientation;
}
+/*!
+ Creates and returns a pixmap constructed by grabbing the contents
+ of the given \a window restricted by QRect(\a x, \a y, \a width,
+ \a height).
+
+ The arguments (\a{x}, \a{y}) specify the offset in the window,
+ whereas (\a{width}, \a{height}) specify the area to be copied. If
+ \a width is negative, the function copies everything to the right
+ border of the window. If \a height is negative, the function
+ copies everything to the bottom of the window.
+
+ The window system identifier (\c WId) can be retrieved using the
+ QWidget::winId() function. The rationale for using a window
+ identifier and not a QWidget, is to enable grabbing of windows
+ that are not part of the application, window system frames, and so
+ on.
+
+ The grabWindow() function grabs pixels from the screen, not from
+ the window, i.e. if there is another window partially or entirely
+ over the one you grab, you get pixels from the overlying window,
+ too. The mouse cursor is generally not grabbed.
+
+ Note on X11 that if the given \a window doesn't have the same depth
+ as the root window, and another window partially or entirely
+ obscures the one you grab, you will \e not get pixels from the
+ overlying window. The contents of the obscured areas in the
+ pixmap will be undefined and uninitialized.
+
+ On Windows Vista and above grabbing a layered window, which is
+ created by setting the Qt::WA_TranslucentBackground attribute, will
+ not work. Instead grabbing the desktop widget should work.
+
+ \warning In general, grabbing an area outside the screen is not
+ safe. This depends on the underlying window system.
+ \since 5.0
+*/
+
+QPixmap QScreen::grabWindow(WId window, int x, int y, int w, int h) const
+{
+ const QPlatformScreen *platformScreen = handle();
+ if (!platformScreen) {
+ qWarning("%s invoked with handle==0", Q_FUNC_INFO);
+ return QPixmap();
+ }
+ return platformScreen->grabWindow(window, x, y, w, h);
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qscreen.h b/src/gui/kernel/qscreen.h
index f73cd0836f..111e10d340 100644
--- a/src/gui/kernel/qscreen.h
+++ b/src/gui/kernel/qscreen.h
@@ -61,6 +61,7 @@ class QPlatformScreen;
class QScreenPrivate;
class QWindow;
class QRect;
+class QPixmap;
class Q_GUI_EXPORT QScreen : public QObject
{
@@ -124,6 +125,8 @@ public:
bool isPortrait(Qt::ScreenOrientation orientation);
bool isLandscape(Qt::ScreenOrientation orientation);
+ QPixmap grabWindow(WId window, int x, int y, int w, int h) const;
+
Q_SIGNALS:
void sizeChanged(const QSize &size);
void geometryChanged(const QRect &geometry);
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 4436884359..9c6b6c4bf7 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -42,6 +42,7 @@
#include "qwindow.h"
#include "qplatformwindow_qpa.h"
+#include "qplatformintegration_qpa.h"
#include "qsurfaceformat.h"
#ifndef QT_NO_OPENGL
#include "qplatformopenglcontext_qpa.h"
@@ -165,19 +166,14 @@ void QWindow::setVisible(bool visible)
return;
d->visible = visible;
emit visibleChanged(visible);
- if (QCoreApplication::instance() && !transientParent()) {
- QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
- if (visible) {
- applicationPrivate->ref();
- } else {
- applicationPrivate->deref();
- }
- }
if (!d->platformWindow)
create();
if (visible) {
+ // remove posted quit events when showing a new window
+ QCoreApplication::removePostedEvents(qApp, QEvent::Quit);
+
QShowEvent showEvent;
QGuiApplication::sendEvent(this, &showEvent);
}
@@ -190,8 +186,14 @@ void QWindow::setVisible(bool visible)
}
}
+
bool QWindow::visible() const
{
+ return isVisible();
+}
+
+bool QWindow::isVisible() const
+{
Q_D(const QWindow);
return d->visible;
@@ -219,7 +221,11 @@ WId QWindow::winId() const
Q_D(const QWindow);
if(!d->platformWindow)
const_cast<QWindow *>(this)->create();
- return d->platformWindow->winId();
+
+ WId id = d->platformWindow->winId();
+ // See the QPlatformWindow::winId() documentation
+ Q_ASSERT(id != WId(0));
+ return id;
}
QWindow *QWindow::parent() const
@@ -373,6 +379,25 @@ void QWindow::requestActivateWindow()
d->platformWindow->requestActivateWindow();
}
+
+/*!
+ Returns if this window is exposed in the windowing system.
+
+ When the window is not exposed, it is shown by the application
+ but it is still not showing in the windowing system, so the application
+ should minimize rendering and other graphical activities.
+
+ An exposeEvent() is sent every time this value changes.
+ */
+
+bool QWindow::isExposed() const
+{
+ Q_D(const QWindow);
+ if (d->platformWindow)
+ return d->platformWindow->isExposed();
+ return false;
+}
+
/*!
Returns true if the window should appear active from a style perspective.
@@ -511,15 +536,6 @@ void QWindow::setTransientParent(QWindow *parent)
QWindow *previousParent = d->transientParent;
d->transientParent = parent;
-
- if (QCoreApplication::instance() && d->visible) {
- QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
- if (parent && !previousParent) {
- applicationPrivate->deref();
- } else if (!parent && previousParent) {
- applicationPrivate->ref();
- }
- }
}
QWindow *QWindow::transientParent() const
@@ -731,6 +747,15 @@ void QWindow::setWindowIcon(const QImage &icon) const
void QWindow::destroy()
{
Q_D(QWindow);
+ QObjectList childrenWindows = children();
+ for (int i = 0; i < childrenWindows.size(); i++) {
+ QObject *object = childrenWindows.at(i);
+ if (object->isWindowType()) {
+ QWindow *w = static_cast<QWindow*>(object);
+ QGuiApplicationPrivate::window_list.removeAll(w);
+ w->destroy();
+ }
+ }
setVisible(false);
delete d->platformWindow;
d->platformWindow = 0;
@@ -881,22 +906,25 @@ bool QWindow::close()
if (QGuiApplicationPrivate::focus_window == this)
QGuiApplicationPrivate::focus_window = 0;
- QObjectList childrenWindows = children();
- for (int i = 0; i < childrenWindows.size(); i++) {
- QObject *object = childrenWindows.at(i);
- if (object->isWindowType()) {
- QWindow *w = static_cast<QWindow*>(object);
- QGuiApplicationPrivate::window_list.removeAll(w);
- w->destroy();
- }
- }
-
QGuiApplicationPrivate::window_list.removeAll(this);
destroy();
d->maybeQuitOnLastWindowClosed();
return true;
}
+
+
+/*!
+ The expose event is sent by the window system whenever the window's
+ exposure on screen changes.
+
+ If the window is moved off screen, is made totally obscured by another
+ window, iconified or similar, this function might be called and the
+ value of isExposed() might change to false. When this happens,
+ an application should stop its rendering as it is no longer visible
+ to the user.
+ */
+
void QWindow::exposeEvent(QExposeEvent *ev)
{
ev->ignore();
@@ -944,6 +972,7 @@ bool QWindow::event(QEvent *ev)
case QEvent::TouchBegin:
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
+ case QEvent::TouchCancel:
touchEvent(static_cast<QTouchEvent *>(ev));
break;
@@ -979,7 +1008,7 @@ bool QWindow::event(QEvent *ev)
case QEvent::Close: {
Q_D(QWindow);
- bool wasVisible = visible();
+ bool wasVisible = isVisible();
destroy();
if (wasVisible)
d->maybeQuitOnLastWindowClosed();
@@ -1113,13 +1142,16 @@ void QWindowPrivate::maybeQuitOnLastWindowClosed()
bool lastWindowClosed = true;
for (int i = 0; i < list.size(); ++i) {
QWindow *w = list.at(i);
- if (!w->visible() || w->parent())
+ if (!w->isVisible())
continue;
lastWindowClosed = false;
break;
}
- if (lastWindowClosed)
+ if (lastWindowClosed) {
QGuiApplicationPrivate::emitLastWindowClosed();
+ QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
+ applicationPrivate->maybeQuit();
+ }
}
}
diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h
index 98b468b142..1461f12520 100644
--- a/src/gui/kernel/qwindow.h
+++ b/src/gui/kernel/qwindow.h
@@ -89,7 +89,7 @@ class Q_GUI_EXPORT QWindow : public QObject, public QSurface
Q_PROPERTY(int y READ y WRITE setY NOTIFY yChanged)
Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)
Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged)
- Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
+ Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation WRITE reportContentOrientationChange NOTIFY contentOrientationChanged)
public:
@@ -101,7 +101,9 @@ public:
void setSurfaceType(SurfaceType surfaceType);
SurfaceType surfaceType() const;
- bool visible() const;
+ QT_DEPRECATED bool visible() const;
+
+ bool isVisible() const;
void create();
@@ -150,6 +152,8 @@ public:
bool isAncestorOf(const QWindow *child, AncestorMode mode = IncludeTransients) const;
+ bool isExposed() const;
+
QSize minimumSize() const;
QSize maximumSize() const;
QSize baseSize() const;
diff --git a/src/gui/kernel/qwindowdefs.h b/src/gui/kernel/qwindowdefs.h
index 82cce0394b..c2d7a2fe2f 100644
--- a/src/gui/kernel/qwindowdefs.h
+++ b/src/gui/kernel/qwindowdefs.h
@@ -42,6 +42,7 @@
#ifndef QWINDOWDEFS_H
#define QWINDOWDEFS_H
+#include <QtCore/qglobal.h>
#include <QtCore/qobjectdefs.h>
#include <QtCore/qnamespace.h>
@@ -99,7 +100,7 @@ QT_END_HEADER
-typedef unsigned long WId;
+typedef QT_PREPEND_NAMESPACE(quintptr) WId;
diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.cpp b/src/gui/kernel/qwindowsysteminterface_qpa.cpp
index ae94b75076..e6c4454104 100644
--- a/src/gui/kernel/qwindowsysteminterface_qpa.cpp
+++ b/src/gui/kernel/qwindowsysteminterface_qpa.cpp
@@ -296,6 +296,22 @@ void QWindowSystemInterface::handleTouchEvent(QWindow *tlw, ulong timestamp, QTo
QWindowSystemInterfacePrivate::queueWindowSystemEvent(e);
}
+void QWindowSystemInterface::handleTouchCancelEvent(QWindow *w, QTouchDevice *device,
+ Qt::KeyboardModifiers mods)
+{
+ unsigned long time = QWindowSystemInterfacePrivate::eventTime.elapsed();
+ handleTouchCancelEvent(w, time, device, mods);
+}
+
+void QWindowSystemInterface::handleTouchCancelEvent(QWindow *w, ulong timestamp, QTouchDevice *device,
+ Qt::KeyboardModifiers mods)
+{
+ QWindowSystemInterfacePrivate::TouchEvent *e =
+ new QWindowSystemInterfacePrivate::TouchEvent(w, timestamp, QEvent::TouchCancel, device,
+ QList<QTouchEvent::TouchPoint>(), mods);
+ QWindowSystemInterfacePrivate::queueWindowSystemEvent(e);
+}
+
void QWindowSystemInterface::handleScreenOrientationChange(QScreen *screen, Qt::ScreenOrientation orientation)
{
QWindowSystemInterfacePrivate::ScreenOrientationEvent *e =
@@ -324,6 +340,12 @@ void QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(QScreen *scree
QWindowSystemInterfacePrivate::queueWindowSystemEvent(e);
}
+void QWindowSystemInterface::handleThemeChange(QWindow *tlw)
+{
+ QWindowSystemInterfacePrivate::ThemeChangeEvent *e = new QWindowSystemInterfacePrivate::ThemeChangeEvent(tlw);
+ QWindowSystemInterfacePrivate::queueWindowSystemEvent(e);
+}
+
void QWindowSystemInterface::handleMapEvent(QWindow *tlw)
{
QWindowSystemInterfacePrivate::MapEvent *e = new QWindowSystemInterfacePrivate::MapEvent(tlw);
diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.h b/src/gui/kernel/qwindowsysteminterface_qpa.h
index b99363eda7..78152a1178 100644
--- a/src/gui/kernel/qwindowsysteminterface_qpa.h
+++ b/src/gui/kernel/qwindowsysteminterface_qpa.h
@@ -101,6 +101,8 @@ public:
const QList<struct TouchPoint> &points, Qt::KeyboardModifiers mods = Qt::NoModifier);
static void handleTouchEvent(QWindow *w, ulong timestamp, QTouchDevice *device,
const QList<struct TouchPoint> &points, Qt::KeyboardModifiers mods = Qt::NoModifier);
+ static void handleTouchCancelEvent(QWindow *w, QTouchDevice *device, Qt::KeyboardModifiers mods = Qt::NoModifier);
+ static void handleTouchCancelEvent(QWindow *w, ulong timestamp, QTouchDevice *device, Qt::KeyboardModifiers mods = Qt::NoModifier);
static void handleGeometryChange(QWindow *w, const QRect &newRect);
static void handleSynchronousGeometryChange(QWindow *w, const QRect &newRect);
@@ -128,6 +130,8 @@ public:
static void handleScreenAvailableGeometryChange(QScreen *screen, const QRect &newAvailableGeometry);
static void handleScreenLogicalDotsPerInchChange(QScreen *screen, qreal newDpiX, qreal newDpiY);
+ static void handleThemeChange(QWindow *tlw);
+
// For event dispatcher implementations
static bool sendWindowSystemEvents(QAbstractEventDispatcher *eventDispatcher, QEventLoop::ProcessEventsFlags flags);
static int windowSystemEventsQueued();
diff --git a/src/gui/kernel/qwindowsysteminterface_qpa_p.h b/src/gui/kernel/qwindowsysteminterface_qpa_p.h
index 0bd9ba017a..661b39da88 100644
--- a/src/gui/kernel/qwindowsysteminterface_qpa_p.h
+++ b/src/gui/kernel/qwindowsysteminterface_qpa_p.h
@@ -64,6 +64,7 @@ public:
ScreenGeometry,
ScreenAvailableGeometry,
ScreenLogicalDotsPerInch,
+ ThemeChange,
Map,
Unmap,
Expose
@@ -230,6 +231,13 @@ public:
qreal dpiY;
};
+ class ThemeChangeEvent : public WindowSystemEvent {
+ public:
+ explicit ThemeChangeEvent(QWindow * w)
+ : WindowSystemEvent(ThemeChange), window(w) { }
+ QWeakPointer<QWindow> window;
+ };
+
class MapEvent : public WindowSystemEvent {
public:
MapEvent(QWindow *mapped)
diff --git a/src/gui/opengl/qopenglbuffer.cpp b/src/gui/opengl/qopenglbuffer.cpp
index e0ab98df21..e6879a9e60 100644
--- a/src/gui/opengl/qopenglbuffer.cpp
+++ b/src/gui/opengl/qopenglbuffer.cpp
@@ -529,7 +529,11 @@ void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)
return glMapBufferARB(d->type, access);
#endif
Q_UNUSED(access);
- qWarning("QOpenGLBuffer::map(): pending implementation");
+ static bool warned = false;
+ if (!warned) {
+ qWarning("QOpenGLBuffer::map(): pending implementation");
+ warned = true;
+ }
return 0;
}
@@ -560,7 +564,11 @@ bool QOpenGLBuffer::unmap()
return false;
return glUnmapBufferARB(d->type) == GL_TRUE;
#endif
- qWarning("QOpenGLBuffer::map(): pending implementation");
+ static bool warned = false;
+ if (!warned) {
+ qWarning("QOpenGLBuffer::map(): pending implementation");
+ warned = true;
+ }
return 0;
}
diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp
index 5e22554303..0eb264b2d9 100644
--- a/src/gui/opengl/qopenglframebufferobject.cpp
+++ b/src/gui/opengl/qopenglframebufferobject.cpp
@@ -313,9 +313,8 @@ bool QOpenGLFramebufferObjectFormat::operator!=(const QOpenGLFramebufferObjectFo
return !(*this == other);
}
-bool QOpenGLFramebufferObjectPrivate::checkFramebufferStatus() const
+bool QOpenGLFramebufferObjectPrivate::checkFramebufferStatus(QOpenGLContext *ctx) const
{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
if (!ctx)
return false; // Context no longer exists.
GLenum status = ctx->functions()->glCheckFramebufferStatus(GL_FRAMEBUFFER);
@@ -402,8 +401,6 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
GLuint texture = 0;
GLuint color_buffer = 0;
- GLuint depth_buffer = 0;
- GLuint stencil_buffer = 0;
QT_CHECK_GLERROR();
// init texture
@@ -417,8 +414,8 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
int height = size.height();
int level = 0;
while (width > 1 || height > 1) {
- width = (width + 1) >> 1;
- height = (height + 1) >> 1;
+ width = qMax(1, width >> 1);
+ height = qMax(1, height >> 1);
++level;
glTexImage2D(target, level, internal_format, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
@@ -432,7 +429,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
target, texture, 0);
QT_CHECK_GLERROR();
- valid = checkFramebufferStatus();
+ valid = checkFramebufferStatus(ctx);
glBindTexture(target, 0);
color_buffer = 0;
@@ -458,12 +455,57 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
GL_RENDERBUFFER, color_buffer);
QT_CHECK_GLERROR();
- valid = checkFramebufferStatus();
+ valid = checkFramebufferStatus(ctx);
if (valid)
funcs.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples);
}
+ format.setTextureTarget(target);
+ format.setSamples(int(samples));
+ format.setInternalTextureFormat(internal_format);
+ format.setMipmap(mipmap);
+
+ initAttachments(ctx, attachment);
+
+ funcs.glBindFramebuffer(GL_FRAMEBUFFER, ctx->d_func()->current_fbo);
+ if (valid) {
+ fbo_guard = new QOpenGLSharedResourceGuard(ctx, fbo, freeFramebufferFunc);
+ if (color_buffer)
+ color_buffer_guard = new QOpenGLSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
+ else
+ texture_guard = new QOpenGLSharedResourceGuard(ctx, texture, freeTextureFunc);
+ } else {
+ if (color_buffer)
+ funcs.glDeleteRenderbuffers(1, &color_buffer);
+ else
+ glDeleteTextures(1, &texture);
+ funcs.glDeleteFramebuffers(1, &fbo);
+ }
+ QT_CHECK_GLERROR();
+}
+
+void QOpenGLFramebufferObjectPrivate::initAttachments(QOpenGLContext *ctx, QOpenGLFramebufferObject::Attachment attachment)
+{
+ int samples = format.samples();
+
+ // free existing attachments
+ if (depth_buffer_guard) {
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+ depth_buffer_guard->free();
+ }
+ if (stencil_buffer_guard) {
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+ if (stencil_buffer_guard != depth_buffer_guard)
+ stencil_buffer_guard->free();
+ }
+
+ depth_buffer_guard = 0;
+ stencil_buffer_guard = 0;
+
+ GLuint depth_buffer = 0;
+ GLuint stencil_buffer = 0;
+
// In practice, a combined depth-stencil buffer is supported by all desktop platforms, while a
// separate stencil buffer is not. On embedded devices however, a combined depth-stencil buffer
// might not be supported while separate buffers are, according to QTBUG-12861.
@@ -488,7 +530,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, stencil_buffer);
- valid = checkFramebufferStatus();
+ valid = checkFramebufferStatus(ctx);
if (!valid) {
funcs.glDeleteRenderbuffers(1, &depth_buffer);
stencil_buffer = depth_buffer = 0;
@@ -529,7 +571,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
}
funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, depth_buffer);
- valid = checkFramebufferStatus();
+ valid = checkFramebufferStatus(ctx);
if (!valid) {
funcs.glDeleteRenderbuffers(1, &depth_buffer);
depth_buffer = 0;
@@ -559,7 +601,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
}
funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, stencil_buffer);
- valid = checkFramebufferStatus();
+ valid = checkFramebufferStatus(ctx);
if (!valid) {
funcs.glDeleteRenderbuffers(1, &stencil_buffer);
stencil_buffer = 0;
@@ -567,7 +609,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
}
// The FBO might have become valid after removing the depth or stencil buffer.
- valid = checkFramebufferStatus();
+ valid = checkFramebufferStatus(ctx);
if (depth_buffer && stencil_buffer) {
fbo_attachment = QOpenGLFramebufferObject::CombinedDepthStencil;
@@ -577,13 +619,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
fbo_attachment = QOpenGLFramebufferObject::NoAttachment;
}
- funcs.glBindFramebuffer(GL_FRAMEBUFFER, ctx->d_func()->current_fbo);
if (valid) {
- fbo_guard = new QOpenGLSharedResourceGuard(ctx, fbo, freeFramebufferFunc);
- if (color_buffer)
- color_buffer_guard = new QOpenGLSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
- else
- texture_guard = new QOpenGLSharedResourceGuard(ctx, texture, freeTextureFunc);
if (depth_buffer)
depth_buffer_guard = new QOpenGLSharedResourceGuard(ctx, depth_buffer, freeRenderbufferFunc);
if (stencil_buffer) {
@@ -593,23 +629,14 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
stencil_buffer_guard = new QOpenGLSharedResourceGuard(ctx, stencil_buffer, freeRenderbufferFunc);
}
} else {
- if (color_buffer)
- funcs.glDeleteRenderbuffers(1, &color_buffer);
- else
- glDeleteTextures(1, &texture);
if (depth_buffer)
funcs.glDeleteRenderbuffers(1, &depth_buffer);
if (stencil_buffer && depth_buffer != stencil_buffer)
funcs.glDeleteRenderbuffers(1, &stencil_buffer);
- funcs.glDeleteFramebuffers(1, &fbo);
}
QT_CHECK_GLERROR();
- format.setTextureTarget(target);
- format.setSamples(int(samples));
format.setAttachment(fbo_attachment);
- format.setInternalTextureFormat(internal_format);
- format.setMipmap(mipmap);
}
/*!
@@ -861,7 +888,7 @@ bool QOpenGLFramebufferObject::bind()
qWarning("QOpenGLFramebufferObject::bind() called from incompatible context");
#endif
d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
- d->valid = d->checkFramebufferStatus();
+ d->valid = d->checkFramebufferStatus(current);
if (d->valid && current)
current->d_func()->current_fbo = d->fbo();
return d->valid;
@@ -1108,6 +1135,30 @@ QOpenGLFramebufferObject::Attachment QOpenGLFramebufferObject::attachment() cons
}
/*!
+ Sets the attachments of the framebuffer object.
+
+ This can be used to free or reattach the depth and stencil buffer
+ attachments as needed.
+ */
+void QOpenGLFramebufferObject::setAttachment(QOpenGLFramebufferObject::Attachment attachment)
+{
+ Q_D(QOpenGLFramebufferObject);
+ if (attachment == d->fbo_attachment || !isValid())
+ return;
+ QOpenGLContext *current = QOpenGLContext::currentContext();
+ if (!current)
+ return;
+#ifdef QT_DEBUG
+ if (current->shareGroup() != d->fbo_guard->group())
+ qWarning("QOpenGLFramebufferObject::setAttachment() called from incompatible context");
+#endif
+ d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
+ d->initAttachments(current, attachment);
+ if (current->d_func()->current_fbo != d->fbo())
+ d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, current->d_func()->current_fbo);
+}
+
+/*!
Returns true if the framebuffer object is currently bound to a context,
otherwise false is returned.
*/
diff --git a/src/gui/opengl/qopenglframebufferobject.h b/src/gui/opengl/qopenglframebufferobject.h
index 0b2ead1cbb..63260f1940 100644
--- a/src/gui/opengl/qopenglframebufferobject.h
+++ b/src/gui/opengl/qopenglframebufferobject.h
@@ -101,6 +101,8 @@ public:
QImage toImage() const;
Attachment attachment() const;
+ void setAttachment(Attachment attachment);
+
GLuint handle() const;
static bool bindDefault();
diff --git a/src/gui/opengl/qopenglframebufferobject_p.h b/src/gui/opengl/qopenglframebufferobject_p.h
index 78d9d93ffe..23cab8f0af 100644
--- a/src/gui/opengl/qopenglframebufferobject_p.h
+++ b/src/gui/opengl/qopenglframebufferobject_p.h
@@ -120,7 +120,9 @@ public:
QOpenGLFramebufferObject::Attachment attachment,
GLenum internal_format, GLenum texture_target,
GLint samples = 0, bool mipmap = false);
- bool checkFramebufferStatus() const;
+ void initAttachments(QOpenGLContext *ctx, QOpenGLFramebufferObject::Attachment attachment);
+
+ bool checkFramebufferStatus(QOpenGLContext *ctx) const;
QOpenGLSharedResourceGuard *fbo_guard;
QOpenGLSharedResourceGuard *texture_guard;
QOpenGLSharedResourceGuard *depth_buffer_guard;
diff --git a/src/gui/opengl/qopenglgradientcache_p.h b/src/gui/opengl/qopenglgradientcache_p.h
index 4035689abd..7acc8c1d9d 100644
--- a/src/gui/opengl/qopenglgradientcache_p.h
+++ b/src/gui/opengl/qopenglgradientcache_p.h
@@ -52,9 +52,9 @@
#include <QMultiHash>
#include <QObject>
-#include <QtGui/QtGui>
#include <private/qopenglcontext_p.h>
#include <QtCore/qmutex.h>
+#include <QGradient>
QT_BEGIN_NAMESPACE
diff --git a/src/gui/opengl/qopengltexturecache_p.h b/src/gui/opengl/qopengltexturecache_p.h
index 549a2f4eab..8ff20e9464 100644
--- a/src/gui/opengl/qopengltexturecache_p.h
+++ b/src/gui/opengl/qopengltexturecache_p.h
@@ -55,7 +55,7 @@
#include <QHash>
#include <QObject>
-#include <QtGui/QtGui>
+#include <QCache>
#include <private/qopenglcontext_p.h>
#include <QtCore/qmutex.h>
diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri
index 61a25e9ac8..4cd2351b23 100644
--- a/src/gui/painting/painting.pri
+++ b/src/gui/painting/painting.pri
@@ -34,7 +34,8 @@ HEADERS += \
painting/qtextureglyphcache_p.h \
painting/qtransform.h \
painting/qplatformbackingstore_qpa.h \
- painting/qpaintbuffer_p.h
+ painting/qpaintbuffer_p.h \
+ painting/qpathsimplifier_p.h
SOURCES += \
@@ -68,7 +69,8 @@ SOURCES += \
painting/qtextureglyphcache.cpp \
painting/qtransform.cpp \
painting/qplatformbackingstore_qpa.cpp \
- painting/qpaintbuffer.cpp
+ painting/qpaintbuffer.cpp \
+ painting/qpathsimplifier.cpp
SOURCES += \
painting/qpaintengine_raster.cpp \
diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp
index 37446f4f80..03c2fc8d6a 100644
--- a/src/gui/painting/qbackingstore.cpp
+++ b/src/gui/painting/qbackingstore.cpp
@@ -43,6 +43,7 @@
#include <qwindow.h>
#include <qpixmap.h>
#include <qplatformbackingstore_qpa.h>
+#include <qplatformintegration_qpa.h>
#include <qscreen.h>
#include <private/qguiapplication_p.h>
diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp
index a83cadb161..f17a630c8d 100644
--- a/src/gui/painting/qblendfunctions.cpp
+++ b/src/gui/painting/qblendfunctions.cpp
@@ -71,21 +71,6 @@ struct SourceAndConstAlpha
RGB16 (565) format target format
************************************************************************/
-static inline quint16 convert_argb32_to_rgb16(quint32 spix)
-{
- quint32 b = spix;
- quint32 g = spix;
- b >>= 8;
- g >>= 5;
- b &= 0x0000f800;
- g &= 0x000007e0;
- spix >>= 3;
- b |= g;
- spix &= 0x0000001f;
- b |= spix;
- return b;
-}
-
struct Blend_RGB16_on_RGB16_NoAlpha {
inline void write(quint16 *dst, quint16 src) { *dst = src; }
@@ -108,46 +93,11 @@ struct Blend_RGB16_on_RGB16_ConstAlpha {
quint32 m_ialpha;
};
-struct Blend_ARGB24_on_RGB16_SourceAlpha {
- inline void write(quint16 *dst, const qargb8565 &src) {
- const uint alpha = src.alpha();
- if (alpha) {
- quint16 s = src.rawValue16();
- if (alpha < 255)
- s += BYTE_MUL_RGB16(*dst, 255 - alpha);
- *dst = s;
- }
- }
-
- inline void flush(void *) {}
-};
-
-struct Blend_ARGB24_on_RGB16_SourceAndConstAlpha {
- inline Blend_ARGB24_on_RGB16_SourceAndConstAlpha(quint32 alpha) {
- m_alpha = (alpha * 255) >> 8;
- }
-
- inline void write(quint16 *dst, qargb8565 src) {
- src = src.byte_mul(src.alpha(m_alpha));
- const uint alpha = src.alpha();
- if (alpha) {
- quint16 s = src.rawValue16();
- if (alpha < 255)
- s += BYTE_MUL_RGB16(*dst, 255 - alpha);
- *dst = s;
- }
- }
-
- inline void flush(void *) {}
-
- quint32 m_alpha;
-};
-
struct Blend_ARGB32_on_RGB16_SourceAlpha {
inline void write(quint16 *dst, quint32 src) {
const quint8 alpha = qAlpha(src);
- if(alpha) {
- quint16 s = convert_argb32_to_rgb16(src);
+ if (alpha) {
+ quint16 s = qConvertRgb32To16(src);
if(alpha < 255)
s += BYTE_MUL_RGB16(*dst, 255 - alpha);
*dst = s;
@@ -166,7 +116,7 @@ struct Blend_ARGB32_on_RGB16_SourceAndConstAlpha {
src = BYTE_MUL(src, m_alpha);
const quint8 alpha = qAlpha(src);
if(alpha) {
- quint16 s = convert_argb32_to_rgb16(src);
+ quint16 s = qConvertRgb32To16(src);
if(alpha < 255)
s += BYTE_MUL_RGB16(*dst, 255 - alpha);
*dst = s;
@@ -203,32 +153,6 @@ void qt_scale_image_rgb16_on_rgb16(uchar *destPixels, int dbpl,
}
}
-void qt_scale_image_argb24_on_rgb16(uchar *destPixels, int dbpl,
- const uchar *srcPixels, int sbpl,
- const QRectF &targetRect,
- const QRectF &sourceRect,
- const QRect &clip,
- int const_alpha)
-{
-#ifdef QT_DEBUG_DRAW
- printf("qt_scale_argb24_on_rgb16: dst=(%p, %d), src=(%p, %d), target=(%d, %d), [%d x %d], src=(%d, %d) [%d x %d] alpha=%d\n",
- destPixels, dbpl, srcPixels, sbpl,
- targetRect.x(), targetRect.y(), targetRect.width(), targetRect.height(),
- sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height(),
- const_alpha);
-#endif
- if (const_alpha == 256) {
- Blend_ARGB24_on_RGB16_SourceAlpha noAlpha;
- qt_scale_image_16bit<qargb8565>(destPixels, dbpl, srcPixels, sbpl,
- targetRect, sourceRect, clip, noAlpha);
- } else {
- Blend_ARGB24_on_RGB16_SourceAndConstAlpha constAlpha(const_alpha);
- qt_scale_image_16bit<qargb8565>(destPixels, dbpl, srcPixels, sbpl,
- targetRect, sourceRect, clip, constAlpha);
- }
-}
-
-
void qt_scale_image_argb32_on_rgb16(uchar *destPixels, int dbpl,
const uchar *srcPixels, int sbpl,
const QRectF &targetRect,
@@ -280,7 +204,6 @@ void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl,
}
}
} else if (const_alpha != 0) {
- SourceAndConstAlpha alpha(const_alpha); // expects the 0-256 range
quint16 *d = (quint16 *) dst;
const quint16 *s = (const quint16 *) src;
quint8 a = (255 * const_alpha) >> 8;
@@ -296,79 +219,6 @@ void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl,
}
-template <typename T> void qt_blend_argb24_on_rgb16(uchar *destPixels, int dbpl,
- const uchar *srcPixels, int sbpl,
- int w, int h, const T &alphaFunc)
-{
- int srcOffset = w*3;
- int dstJPL = dbpl / 2;
- quint16 *dst = (quint16 *) destPixels;
- int dstExtraStride = dstJPL - w;
-
- for (int y=0; y<h; ++y) {
- const uchar *src = srcPixels + y * sbpl;
- const uchar *srcEnd = src + srcOffset;
- while (src < srcEnd) {
-#if defined(QT_ARCH_ARMV5) || defined(QT_ARCH_POWERPC) || defined(QT_ARCH_SH) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_WINDOWSCE) && !defined(_X86_)) || (defined(QT_ARCH_SPARC) && defined(Q_CC_GNU)) || (defined(QT_ARCH_INTEGRITY) && !defined(_X86_))
- // non-16-bit aligned memory access is not possible on PowerPC,
- // ARM <v6 (QT_ARCH_ARMV5) & SH & AVR32 & SPARC w/GCC
- quint16 spix = (quint16(src[2])<<8) + src[1];
-#else
- quint16 spix = *(quint16 *) (src + 1);
-#endif
- uchar alpha = alphaFunc.alpha(*src);
-
- if (alpha == 255) {
- *dst = spix;
- } else if (alpha != 0) {
- quint16 dpix = *dst;
- quint32 sia = 255 - alpha;
-
- quint16 dr = (dpix & 0x0000f800);
- quint16 dg = (dpix & 0x000007e0);
- quint16 db = (dpix & 0x0000001f);
-
- quint32 siar = dr * sia;
- quint32 siag = dg * sia;
- quint32 siab = db * sia;
-
- quint32 rr = ((siar + (siar>>8) + (0x80 << 8)) >> 8) & 0xf800;
- quint32 rg = ((siag + (siag>>8) + (0x80 << 3)) >> 8) & 0x07e0;
- quint32 rb = ((siab + (siab>>8) + (0x80 >> 3)) >> 8) & 0x001f;
-
- *dst = alphaFunc.bytemul(spix) + rr + rg + rb;
- }
-
- ++dst;
- src += 3;
- }
- dst += dstExtraStride;
- }
-
-}
-
-static void qt_blend_argb24_on_rgb16(uchar *destPixels, int dbpl,
- const uchar *srcPixels, int sbpl,
- int w, int h,
- int const_alpha)
-{
-#ifdef QT_DEBUG_DRAW
- printf("qt_blend_argb24_on_rgb16: dst=(%p, %d), src=(%p, %d), dim=(%d, %d) alpha=%d\n",
- destPixels, dbpl, srcPixels, sbpl, w, h, const_alpha);
-#endif
-
- if (const_alpha != 256) {
- SourceAndConstAlpha alphaFunc(const_alpha);
- qt_blend_argb24_on_rgb16(destPixels, dbpl, srcPixels, sbpl, w, h, alphaFunc);
- } else {
- SourceOnlyAlpha alphaFunc;
- qt_blend_argb24_on_rgb16(destPixels, dbpl, srcPixels, sbpl, w, h, alphaFunc);
- }
-}
-
-
-
-
void qt_blend_argb32_on_rgb16_const_alpha(uchar *destPixels, int dbpl,
const uchar *srcPixels, int sbpl,
int w, int h,
@@ -383,7 +233,7 @@ void qt_blend_argb32_on_rgb16_const_alpha(uchar *destPixels, int dbpl,
uint s = src[i];
s = BYTE_MUL(s, const_alpha);
int alpha = qAlpha(s);
- s = convert_argb32_to_rgb16(s);
+ s = qConvertRgb32To16(s);
s += BYTE_MUL_RGB16(dst[i], 255 - alpha);
dst[i] = s;
}
@@ -412,7 +262,7 @@ static void qt_blend_argb32_on_rgb16(uchar *destPixels, int dbpl,
quint32 alpha = spix >> 24;
if (alpha == 255) {
- dst[x] = convert_argb32_to_rgb16(spix);
+ dst[x] = qConvertRgb32To16(spix);
} else if (alpha != 0) {
quint32 dpix = dst[x];
@@ -473,7 +323,7 @@ static void qt_blend_rgb32_on_rgb16(uchar *destPixels, int dbpl,
while (dst < dstEnd) {
const quint32 *srcEnd = src + w;
while (src < srcEnd) {
- *dst = convert_argb32_to_rgb16(*src);
+ *dst = qConvertRgb32To16(*src);
++dst;
++src;
}
@@ -545,19 +395,11 @@ void qt_blend_rgb32_on_rgb32(uchar *destPixels, int dbpl,
const uint *src = (const uint *) srcPixels;
uint *dst = (uint *) destPixels;
- if (w <= 64) {
- for (int y=0; y<h; ++y) {
- qt_memconvert(dst, src, w);
- dst = (quint32 *)(((uchar *) dst) + dbpl);
- src = (const quint32 *)(((const uchar *) src) + sbpl);
- }
- } else {
- int len = w * 4;
- for (int y=0; y<h; ++y) {
- memcpy(dst, src, len);
- dst = (quint32 *)(((uchar *) dst) + dbpl);
- src = (const quint32 *)(((const uchar *) src) + sbpl);
- }
+ int len = w * 4;
+ for (int y=0; y<h; ++y) {
+ memcpy(dst, src, len);
+ dst = (quint32 *)(((uchar *) dst) + dbpl);
+ src = (const quint32 *)(((const uchar *) src) + sbpl);
}
}
@@ -681,28 +523,6 @@ void qt_transform_image_rgb16_on_rgb16(uchar *destPixels, int dbpl,
}
}
-void qt_transform_image_argb24_on_rgb16(uchar *destPixels, int dbpl,
- const uchar *srcPixels, int sbpl,
- const QRectF &targetRect,
- const QRectF &sourceRect,
- const QRect &clip,
- const QTransform &targetRectTransform,
- int const_alpha)
-{
- if (const_alpha == 256) {
- Blend_ARGB24_on_RGB16_SourceAlpha noAlpha;
- qt_transform_image(reinterpret_cast<quint16 *>(destPixels), dbpl,
- reinterpret_cast<const qargb8565 *>(srcPixels), sbpl,
- targetRect, sourceRect, clip, targetRectTransform, noAlpha);
- } else {
- Blend_ARGB24_on_RGB16_SourceAndConstAlpha constAlpha(const_alpha);
- qt_transform_image(reinterpret_cast<quint16 *>(destPixels), dbpl,
- reinterpret_cast<const qargb8565 *>(srcPixels), sbpl,
- targetRect, sourceRect, clip, targetRectTransform, constAlpha);
- }
-}
-
-
void qt_transform_image_argb32_on_rgb16(uchar *destPixels, int dbpl,
const uchar *srcPixels, int sbpl,
const QRectF &targetRect,
@@ -903,7 +723,7 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] =
0, // Format_ARGB32,
qt_scale_image_argb32_on_rgb16, // Format_ARGB32_Premultiplied,
qt_scale_image_rgb16_on_rgb16, // Format_RGB16,
- qt_scale_image_argb24_on_rgb16, // Format_ARGB8565_Premultiplied,
+ 0, // Format_ARGB8565_Premultiplied,
0, // Format_RGB666,
0, // Format_ARGB6666_Premultiplied,
0, // Format_RGB555,
@@ -1195,7 +1015,7 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] =
0, // Format_ARGB32,
qt_blend_argb32_on_rgb16, // Format_ARGB32_Premultiplied,
qt_blend_rgb16_on_rgb16, // Format_RGB16,
- qt_blend_argb24_on_rgb16, // Format_ARGB8565_Premultiplied,
+ 0, // Format_ARGB8565_Premultiplied,
0, // Format_RGB666,
0, // Format_ARGB6666_Premultiplied,
0, // Format_RGB555,
@@ -1486,7 +1306,7 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo
0, // Format_ARGB32,
qt_transform_image_argb32_on_rgb16, // Format_ARGB32_Premultiplied,
qt_transform_image_rgb16_on_rgb16, // Format_RGB16,
- qt_transform_image_argb24_on_rgb16, // Format_ARGB8565_Premultiplied,
+ 0, // Format_ARGB8565_Premultiplied,
0, // Format_RGB666,
0, // Format_ARGB6666_Premultiplied,
0, // Format_RGB555,
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 13b8c8cae5..0491a3deaf 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -79,6 +79,232 @@ enum {
// must be multiple of 4 for easier SIMD implementations
static const int buffer_size = 2048;
+
+
+
+// To convert in place, let 'dest' and 'src' be the same.
+static const uint *QT_FASTCALL convertIndexedToARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *, const QRgb *clut)
+{
+ for (int i = 0; i < count; ++i)
+ buffer[i] = PREMUL(clut[src[i]]);
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertPassThrough(uint *, const uint *src, int,
+ const QPixelLayout *, const QRgb *)
+{
+ return src;
+}
+
+static const uint *QT_FASTCALL convertRGB16ToARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *, const QRgb *)
+{
+ for (int i = 0; i < count; ++i)
+ buffer[i] = qConvertRgb16To32(src[i]);
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertARGB32ToARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *, const QRgb *)
+{
+ for (int i = 0; i < count; ++i)
+ buffer[i] = PREMUL(src[i]);
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertToRGB32(uint *buffer, const uint *src, int count,
+ const QPixelLayout *layout, const QRgb *)
+{
+ Q_ASSERT(layout->redWidth >= 4);
+ Q_ASSERT(layout->greenWidth >= 4);
+ Q_ASSERT(layout->blueWidth >= 4);
+ Q_ASSERT(layout->alphaWidth == 0);
+
+ const uint redMask = ((1 << layout->redWidth) - 1);
+ const uint greenMask = ((1 << layout->greenWidth) - 1);
+ const uint blueMask = ((1 << layout->blueWidth) - 1);
+
+ const uchar redLeftShift = 8 - layout->redWidth;
+ const uchar greenLeftShift = 8 - layout->greenWidth;
+ const uchar blueLeftShift = 8 - layout->blueWidth;
+
+ const uchar redRightShift = 2 * layout->redWidth - 8;
+ const uchar greenRightShift = 2 * layout->greenWidth - 8;
+ const uchar blueRightShift = 2 * layout->blueWidth - 8;
+
+ for (int i = 0; i < count; ++i) {
+ uint red = (src[i] >> layout->redShift) & redMask;
+ uint green = (src[i] >> layout->greenShift) & greenMask;
+ uint blue = (src[i] >> layout->blueShift) & blueMask;
+
+ red = ((red << redLeftShift) | (red >> redRightShift)) << 16;
+ green = ((green << greenLeftShift) | (green >> greenRightShift)) << 8;
+ blue = (blue << blueLeftShift) | (blue >> blueRightShift);
+ buffer[i] = 0xff000000 | red | green | blue;
+ }
+
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertToARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *layout, const QRgb *)
+{
+ Q_ASSERT(layout->redWidth >= 4);
+ Q_ASSERT(layout->greenWidth >= 4);
+ Q_ASSERT(layout->blueWidth >= 4);
+ Q_ASSERT(layout->alphaWidth >= 4);
+
+ const uint redMask = ((1 << layout->redWidth) - 1);
+ const uint greenMask = ((1 << layout->greenWidth) - 1);
+ const uint blueMask = ((1 << layout->blueWidth) - 1);
+
+ const uchar redLeftShift = 8 - layout->redWidth;
+ const uchar greenLeftShift = 8 - layout->greenWidth;
+ const uchar blueLeftShift = 8 - layout->blueWidth;
+
+ const uchar redRightShift = 2 * layout->redWidth - 8;
+ const uchar greenRightShift = 2 * layout->greenWidth - 8;
+ const uchar blueRightShift = 2 * layout->blueWidth - 8;
+
+ const uint alphaMask = ((1 << layout->alphaWidth) - 1);
+ const uchar alphaLeftShift = 8 - layout->alphaWidth;
+ const uchar alphaRightShift = 2 * layout->alphaWidth - 8;
+
+ if (layout->premultiplied) {
+ for (int i = 0; i < count; ++i) {
+ uint alpha = (src[i] >> layout->alphaShift) & alphaMask;
+ uint red = (src[i] >> layout->redShift) & redMask;
+ uint green = (src[i] >> layout->greenShift) & greenMask;
+ uint blue = (src[i] >> layout->blueShift) & blueMask;
+
+ alpha = (alpha << alphaLeftShift) | (alpha >> alphaRightShift);
+ red = qMin(alpha, (red << redLeftShift) | (red >> redRightShift));
+ green = qMin(alpha, (green << greenLeftShift) | (green >> greenRightShift));
+ blue = qMin(alpha, (blue << blueLeftShift) | (blue >> blueRightShift));
+ buffer[i] = (alpha << 24) | (red << 16) | (green << 8) | blue;
+ }
+ } else {
+ for (int i = 0; i < count; ++i) {
+ uint alpha = (src[i] >> layout->alphaShift) & alphaMask;
+ uint red = (src[i] >> layout->redShift) & redMask;
+ uint green = (src[i] >> layout->greenShift) & greenMask;
+ uint blue = (src[i] >> layout->blueShift) & blueMask;
+
+ alpha = (alpha << alphaLeftShift) | (alpha >> alphaRightShift);
+ red = (red << redLeftShift) | (red >> redRightShift);
+ green = (green << greenLeftShift) | (green >> greenRightShift);
+ blue = (blue << blueLeftShift) | (blue >> blueRightShift);
+ buffer[i] = PREMUL((alpha << 24) | (red << 16) | (green << 8) | blue);
+ }
+ }
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertRGB16FromARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *, const QRgb *)
+{
+ for (int i = 0; i < count; ++i)
+ buffer[i] = qConvertRgb32To16(INV_PREMUL(src[i]));
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertARGB32FromARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *, const QRgb *)
+{
+ for (int i = 0; i < count; ++i)
+ buffer[i] = INV_PREMUL(src[i]);
+ return buffer;
+}
+
+static const uint *QT_FASTCALL convertFromARGB32PM(uint *buffer, const uint *src, int count,
+ const QPixelLayout *layout, const QRgb *)
+{
+ Q_ASSERT(layout->redWidth <= 8);
+ Q_ASSERT(layout->greenWidth <= 8);
+ Q_ASSERT(layout->blueWidth <= 8);
+ Q_ASSERT(layout->alphaWidth <= 8);
+
+ const uint redMask = (1 << layout->redWidth) - 1;
+ const uint greenMask = (1 << layout->greenWidth) - 1;
+ const uint blueMask = (1 << layout->blueWidth) - 1;
+ const uint alphaMask = (1 << layout->alphaWidth) - 1;
+
+ const uchar redRightShift = 24 - layout->redWidth;
+ const uchar greenRightShift = 16 - layout->greenWidth;
+ const uchar blueRightShift = 8 - layout->blueWidth;
+ const uchar alphaRightShift = 32 - layout->alphaWidth;
+
+ if (!layout->premultiplied) {
+ for (int i = 0; i < count; ++i)
+ buffer[i] = qAlpha(src[i]) == 255 ? src[i] : INV_PREMUL(src[i]);
+ src = buffer;
+ }
+ for (int i = 0; i < count; ++i) {
+ uint red = ((src[i] >> redRightShift) & redMask) << layout->redShift;
+ uint green = ((src[i] >> greenRightShift) & greenMask) << layout->greenShift;
+ uint blue = ((src[i] >> blueRightShift) & blueMask) << layout->blueShift;
+ uint alpha = ((src[i] >> alphaRightShift) & alphaMask) << layout->alphaShift;
+ buffer[i] = red | green | blue | alpha;
+ }
+ return buffer;
+}
+
+// Note:
+// convertToArgb32() assumes that no color channel is less than 4 bits.
+// convertFromArgb32() assumes that no color channel is more than 8 bits.
+// QImage::rgbSwapped() assumes that the red and blue color channels have the same number of bits.
+QPixelLayout qPixelLayouts[QImage::NImageFormats] = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, false, QPixelLayout::BPPNone, 0, 0 }, // Format_Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, false, QPixelLayout::BPP1MSB, convertIndexedToARGB32PM, 0 }, // Format_Mono
+ { 0, 0, 0, 0, 0, 0, 0, 0, false, QPixelLayout::BPP1LSB, convertIndexedToARGB32PM, 0 }, // Format_MonoLSB
+ { 0, 0, 0, 0, 0, 0, 0, 0, false, QPixelLayout::BPP8, convertIndexedToARGB32PM, 0 }, // Format_Indexed8
+ { 8, 16, 8, 8, 8, 0, 0, 0, false, QPixelLayout::BPP32, convertPassThrough, convertPassThrough }, // Format_RGB32
+ { 8, 16, 8, 8, 8, 0, 8, 24, false, QPixelLayout::BPP32, convertARGB32ToARGB32PM, convertARGB32FromARGB32PM }, // Format_ARGB32
+ { 8, 16, 8, 8, 8, 0, 8, 24, true, QPixelLayout::BPP32, convertPassThrough, convertPassThrough }, // Format_ARGB32_Premultiplied
+ { 5, 11, 6, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, convertRGB16ToARGB32PM, convertRGB16FromARGB32PM }, // Format_RGB16
+ { 5, 19, 6, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM }, // Format_ARGB8565_Premultiplied
+ { 6, 12, 6, 6, 6, 0, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, convertFromARGB32PM }, // Format_RGB666
+ { 6, 12, 6, 6, 6, 0, 6, 18, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM }, // Format_ARGB6666_Premultiplied
+ { 5, 10, 5, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, convertFromARGB32PM }, // Format_RGB555
+ { 5, 18, 5, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM }, // Format_ARGB8555_Premultiplied
+ { 8, 0, 8, 8, 8, 16, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, convertFromARGB32PM }, // Format_RGB888
+ { 4, 8, 4, 4, 4, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, convertFromARGB32PM }, // Format_RGB444
+ { 4, 8, 4, 4, 4, 0, 4, 12, true, QPixelLayout::BPP16, convertToARGB32PM, convertFromARGB32PM } // Format_ARGB4444_Premultiplied
+};
+
+FetchPixelsFunc qFetchPixels[QPixelLayout::BPPCount] = {
+ 0, // BPPNone
+ fetchPixels<QPixelLayout::BPP1MSB>, // BPP1MSB
+ fetchPixels<QPixelLayout::BPP1LSB>, // BPP1LSB
+ fetchPixels<QPixelLayout::BPP8>, // BPP8
+ fetchPixels<QPixelLayout::BPP16>, // BPP16
+ fetchPixels<QPixelLayout::BPP24>, // BPP24
+ fetchPixels<QPixelLayout::BPP32> // BPP32
+};
+
+StorePixelsFunc qStorePixels[QPixelLayout::BPPCount] = {
+ 0, // BPPNone
+ storePixels<QPixelLayout::BPP1MSB>, // BPP1MSB
+ storePixels<QPixelLayout::BPP1LSB>, // BPP1LSB
+ storePixels<QPixelLayout::BPP8>, // BPP8
+ storePixels<QPixelLayout::BPP16>, // BPP16
+ storePixels<QPixelLayout::BPP24>, // BPP24
+ storePixels<QPixelLayout::BPP32> // BPP32
+};
+
+typedef uint (QT_FASTCALL *FetchPixelFunc)(const uchar *src, int index);
+
+FetchPixelFunc qFetchPixel[QPixelLayout::BPPCount] = {
+ 0, // BPPNone
+ fetchPixel<QPixelLayout::BPP1MSB>, // BPP1MSB
+ fetchPixel<QPixelLayout::BPP1LSB>, // BPP1LSB
+ fetchPixel<QPixelLayout::BPP8>, // BPP8
+ fetchPixel<QPixelLayout::BPP16>, // BPP16
+ fetchPixel<QPixelLayout::BPP24>, // BPP24
+ fetchPixel<QPixelLayout::BPP32> // BPP32
+};
+
/*
Destination fetch. This is simple as we don't have to do bounds checks or
transformations
@@ -110,14 +336,6 @@ static uint * QT_FASTCALL destFetchMonoLsb(uint *buffer, QRasterBuffer *rasterBu
return start;
}
-static uint * QT_FASTCALL destFetchARGB32(uint *buffer, QRasterBuffer *rasterBuffer, int x, int y, int length)
-{
- const uint *data = (const uint *)rasterBuffer->scanLine(y) + x;
- for (int i = 0; i < length; ++i)
- buffer[i] = PREMUL(data[i]);
- return buffer;
-}
-
static uint * QT_FASTCALL destFetchARGB32P(uint *, QRasterBuffer *rasterBuffer, int x, int y, int)
{
return (uint *)rasterBuffer->scanLine(y) + x;
@@ -131,37 +349,32 @@ static uint * QT_FASTCALL destFetchRGB16(uint *buffer, QRasterBuffer *rasterBuff
return buffer;
}
-template <class DST>
-Q_STATIC_TEMPLATE_FUNCTION uint * QT_FASTCALL destFetch(uint *buffer, QRasterBuffer *rasterBuffer,
- int x, int y, int length)
+static uint *QT_FASTCALL destFetch(uint *buffer, QRasterBuffer *rasterBuffer, int x, int y, int length)
{
- const DST *src = reinterpret_cast<DST*>(rasterBuffer->scanLine(y)) + x;
- quint32 *dest = reinterpret_cast<quint32*>(buffer);
- while (length--)
- *dest++ = *src++;
- return buffer;
+ const QPixelLayout *layout = &qPixelLayouts[rasterBuffer->format];
+ const uint *ptr = qFetchPixels[layout->bpp](buffer, rasterBuffer->scanLine(y), x, length);
+ return const_cast<uint *>(layout->convertToARGB32PM(buffer, ptr, length, layout, 0));
}
-# define SPANFUNC_POINTER_DESTFETCH(Arg) destFetch<Arg>
static DestFetchProc destFetchProc[QImage::NImageFormats] =
{
- 0, // Format_Invalid
- destFetchMono, // Format_Mono,
- destFetchMonoLsb, // Format_MonoLSB
- 0, // Format_Indexed8
- destFetchARGB32P, // Format_RGB32
- destFetchARGB32, // Format_ARGB32,
- destFetchARGB32P, // Format_ARGB32_Premultiplied
- destFetchRGB16, // Format_RGB16
- SPANFUNC_POINTER_DESTFETCH(qargb8565), // Format_ARGB8565_Premultiplied
- SPANFUNC_POINTER_DESTFETCH(qrgb666), // Format_RGB666
- SPANFUNC_POINTER_DESTFETCH(qargb6666), // Format_ARGB6666_Premultiplied
- SPANFUNC_POINTER_DESTFETCH(qrgb555), // Format_RGB555
- SPANFUNC_POINTER_DESTFETCH(qargb8555), // Format_ARGB8555_Premultiplied
- SPANFUNC_POINTER_DESTFETCH(qrgb888), // Format_RGB888
- SPANFUNC_POINTER_DESTFETCH(qrgb444), // Format_RGB444
- SPANFUNC_POINTER_DESTFETCH(qargb4444) // Format_ARGB4444_Premultiplied
+ 0, // Format_Invalid
+ destFetchMono, // Format_Mono,
+ destFetchMonoLsb, // Format_MonoLSB
+ 0, // Format_Indexed8
+ destFetchARGB32P, // Format_RGB32
+ destFetch, // Format_ARGB32,
+ destFetchARGB32P, // Format_ARGB32_Premultiplied
+ destFetchRGB16, // Format_RGB16
+ destFetch, // Format_ARGB8565_Premultiplied
+ destFetch, // Format_RGB666
+ destFetch, // Format_ARGB6666_Premultiplied
+ destFetch, // Format_RGB555
+ destFetch, // Format_ARGB8555_Premultiplied
+ destFetch, // Format_RGB888
+ destFetch, // Format_RGB444
+ destFetch // Format_ARGB4444_Premultiplied
};
/*
@@ -253,63 +466,47 @@ static void QT_FASTCALL destStoreMonoLsb(QRasterBuffer *rasterBuffer, int x, int
}
}
-static void QT_FASTCALL destStoreARGB32(QRasterBuffer *rasterBuffer, int x, int y, const uint *buffer, int length)
-{
- uint *data = (uint *)rasterBuffer->scanLine(y) + x;
- for (int i = 0; i < length; ++i) {
- int p = buffer[i];
- int alpha = qAlpha(p);
- if (alpha == 255)
- data[i] = p;
- else if (alpha == 0)
- data[i] = 0;
- else {
- int inv_alpha = 0xff0000/qAlpha(buffer[i]);
- data[i] = (p & 0xff000000)
- | ((qRed(p)*inv_alpha) & 0xff0000)
- | (((qGreen(p)*inv_alpha) >> 8) & 0xff00)
- | ((qBlue(p)*inv_alpha) >> 16);
- }
- }
-}
-
static void QT_FASTCALL destStoreRGB16(QRasterBuffer *rasterBuffer, int x, int y, const uint *buffer, int length)
{
quint16 *data = (quint16*)rasterBuffer->scanLine(y) + x;
- qt_memconvert<quint16, quint32>(data, buffer, length);
+ for (int i = 0; i < length; ++i)
+ data[i] = qConvertRgb32To16(buffer[i]);
}
-template <class DST>
-Q_STATIC_TEMPLATE_FUNCTION void QT_FASTCALL destStore(QRasterBuffer *rasterBuffer,
- int x, int y,
- const uint *buffer, int length)
+static void QT_FASTCALL destStore(QRasterBuffer *rasterBuffer, int x, int y, const uint *buffer, int length)
{
- DST *dest = reinterpret_cast<DST*>(rasterBuffer->scanLine(y)) + x;
- const quint32p *src = reinterpret_cast<const quint32p*>(buffer);
- while (length--)
- *dest++ = DST(*src++);
+ uint buf[buffer_size];
+ const QPixelLayout *layout = &qPixelLayouts[rasterBuffer->format];
+ StorePixelsFunc store = qStorePixels[layout->bpp];
+ uchar *dest = rasterBuffer->scanLine(y);
+ while (length) {
+ int l = qMin(length, buffer_size);
+ const uint *ptr = layout->convertFromARGB32PM(buf, buffer, l, layout, 0);
+ store(dest, ptr, x, l);
+ length -= l;
+ buffer += l;
+ x += l;
+ }
}
-# define SPANFUNC_POINTER_DESTSTORE(DEST) destStore<DEST>
-
static DestStoreProc destStoreProc[QImage::NImageFormats] =
{
- 0, // Format_Invalid
- destStoreMono, // Format_Mono,
- destStoreMonoLsb, // Format_MonoLSB
- 0, // Format_Indexed8
- 0, // Format_RGB32
- destStoreARGB32, // Format_ARGB32,
- 0, // Format_ARGB32_Premultiplied
- destStoreRGB16, // Format_RGB16
- SPANFUNC_POINTER_DESTSTORE(qargb8565), // Format_ARGB8565_Premultiplied
- SPANFUNC_POINTER_DESTSTORE(qrgb666), // Format_RGB666
- SPANFUNC_POINTER_DESTSTORE(qargb6666), // Format_ARGB6666_Premultiplied
- SPANFUNC_POINTER_DESTSTORE(qrgb555), // Format_RGB555
- SPANFUNC_POINTER_DESTSTORE(qargb8555), // Format_ARGB8555_Premultiplied
- SPANFUNC_POINTER_DESTSTORE(qrgb888), // Format_RGB888
- SPANFUNC_POINTER_DESTSTORE(qrgb444), // Format_RGB444
- SPANFUNC_POINTER_DESTSTORE(qargb4444) // Format_ARGB4444_Premultiplied
+ 0, // Format_Invalid
+ destStoreMono, // Format_Mono,
+ destStoreMonoLsb, // Format_MonoLSB
+ 0, // Format_Indexed8
+ 0, // Format_RGB32
+ destStore, // Format_ARGB32,
+ 0, // Format_ARGB32_Premultiplied
+ destStoreRGB16, // Format_RGB16
+ destStore, // Format_ARGB8565_Premultiplied
+ destStore, // Format_RGB666
+ destStore, // Format_ARGB6666_Premultiplied
+ destStore, // Format_RGB555
+ destStore, // Format_ARGB8555_Premultiplied
+ destStore, // Format_RGB888
+ destStore, // Format_RGB444
+ destStore // Format_ARGB4444_Premultiplied
};
/*
@@ -327,218 +524,139 @@ static DestStoreProc destStoreProc[QImage::NImageFormats] =
The generic implementation does pixel by pixel fetches
*/
-template <QImage::Format format>
-Q_STATIC_TEMPLATE_FUNCTION uint QT_FASTCALL qt_fetchPixel(const uchar *scanLine, int x, const QVector<QRgb> *rgb);
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_Mono>(const uchar *scanLine,
- int x, const QVector<QRgb> *rgb)
-{
- bool pixel = scanLine[x>>3] & (0x80 >> (x & 7));
- if (rgb) return PREMUL(rgb->at(pixel ? 1 : 0));
- return pixel ? 0xff000000 : 0xffffffff;
-}
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_MonoLSB>(const uchar *scanLine,
- int x, const QVector<QRgb> *rgb)
-{
- bool pixel = scanLine[x>>3] & (0x1 << (x & 7));
- if (rgb) return PREMUL(rgb->at(pixel ? 1 : 0));
- return pixel ? 0xff000000 : 0xffffffff;
-}
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_Indexed8>(const uchar *scanLine,
- int x, const QVector<QRgb> *rgb)
-{
- return PREMUL(rgb->at(scanLine[x]));
-}
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_ARGB32>(const uchar *scanLine,
- int x, const QVector<QRgb> *)
-{
- return PREMUL(((const uint *)scanLine)[x]);
-}
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_ARGB32_Premultiplied>(const uchar *scanLine,
- int x, const QVector<QRgb> *)
-{
- return ((const uint *)scanLine)[x];
-}
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_RGB16>(const uchar *scanLine,
- int x, const QVector<QRgb> *)
-{
- return qConvertRgb16To32(((const ushort *)scanLine)[x]);
-}
-
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_ARGB8565_Premultiplied>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
-{
- const qargb8565 color = reinterpret_cast<const qargb8565*>(scanLine)[x];
- return qt_colorConvert<quint32, qargb8565>(color, 0);
-}
+enum TextureBlendType {
+ BlendUntransformed,
+ BlendTiled,
+ BlendTransformed,
+ BlendTransformedTiled,
+ BlendTransformedBilinear,
+ BlendTransformedBilinearTiled,
+ NBlendTypes
+};
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_RGB666>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
+static const uint *QT_FASTCALL fetchUntransformed(uint *buffer, const Operator *,
+ const QSpanData *data, int y, int x, int length)
{
- const qrgb666 color = reinterpret_cast<const qrgb666*>(scanLine)[x];
- return qt_colorConvert<quint32, qrgb666>(color, 0);
+ const QPixelLayout *layout = &qPixelLayouts[data->texture.format];
+ const uint *ptr = qFetchPixels[layout->bpp](buffer, data->texture.scanLine(y), x, length);
+ const QRgb *clut = data->texture.colorTable ? data->texture.colorTable->constData() : 0;
+ return layout->convertToARGB32PM(buffer, ptr, length, layout, clut);
}
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_ARGB6666_Premultiplied>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
+static const uint *QT_FASTCALL fetchUntransformedARGB32PM(uint *, const Operator *,
+ const QSpanData *data, int y, int x, int)
{
- const qargb6666 color = reinterpret_cast<const qargb6666*>(scanLine)[x];
- return qt_colorConvert<quint32, qargb6666>(color, 0);
+ const uchar *scanLine = data->texture.scanLine(y);
+ return ((const uint *)scanLine) + x;
}
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_RGB555>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
+static const uint *QT_FASTCALL fetchUntransformedRGB16(uint *buffer, const Operator *,
+ const QSpanData *data, int y, int x,
+ int length)
{
- const qrgb555 color = reinterpret_cast<const qrgb555*>(scanLine)[x];
- return qt_colorConvert<quint32, qrgb555>(color, 0);
+ const quint16 *scanLine = (const quint16 *)data->texture.scanLine(y) + x;
+ for (int i = 0; i < length; ++i)
+ buffer[i] = qConvertRgb16To32(scanLine[i]);
+ return buffer;
}
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_ARGB8555_Premultiplied>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
+// blendType is either BlendTransformed or BlendTransformedTiled
+template<TextureBlendType blendType>
+Q_STATIC_TEMPLATE_FUNCTION
+const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *, const QSpanData *data,
+ int y, int x, int length)
{
- const qargb8555 color = reinterpret_cast<const qargb8555*>(scanLine)[x];
- return qt_colorConvert<quint32, qargb8555>(color, 0);
-}
+ int image_width = data->texture.width;
+ int image_height = data->texture.height;
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_RGB888>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
-{
- const qrgb888 color = reinterpret_cast<const qrgb888*>(scanLine)[x];
- return qt_colorConvert<quint32, qrgb888>(color, 0);
-}
+ const qreal cx = x + qreal(0.5);
+ const qreal cy = y + qreal(0.5);
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_RGB444>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
-{
- const qrgb444 color = reinterpret_cast<const qrgb444*>(scanLine)[x];
- return qt_colorConvert<quint32, qrgb444>(color, 0);
-}
+ const uint *end = buffer + length;
+ uint *b = buffer;
+ if (data->fast_matrix) {
+ // The increment pr x in the scanline
+ int fdx = (int)(data->m11 * fixed_scale);
+ int fdy = (int)(data->m12 * fixed_scale);
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_ARGB4444_Premultiplied>(const uchar *scanLine,
- int x,
- const QVector<QRgb> *)
-{
- const qargb4444 color = reinterpret_cast<const qargb4444*>(scanLine)[x];
- return qt_colorConvert<quint32, qargb4444>(color, 0);
-}
+ int fx = int((data->m21 * cy
+ + data->m11 * cx + data->dx) * fixed_scale);
+ int fy = int((data->m22 * cy
+ + data->m12 * cx + data->dy) * fixed_scale);
-template<>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-uint QT_FASTCALL qt_fetchPixel<QImage::Format_Invalid>(const uchar *,
- int ,
- const QVector<QRgb> *)
-{
- return 0;
-}
+ while (b < end) {
+ int px = fx >> 16;
+ int py = fy >> 16;
-typedef uint (QT_FASTCALL *FetchPixelProc)(const uchar *scanLine, int x, const QVector<QRgb> *);
+ if (blendType == BlendTransformedTiled) {
+ px %= image_width;
+ py %= image_height;
+ if (px < 0) px += image_width;
+ if (py < 0) py += image_height;
+ } else {
+ px = qBound(0, px, image_width - 1);
+ py = qBound(0, py, image_height - 1);
+ }
+ *b = reinterpret_cast<const uint *>(data->texture.scanLine(py))[px];
-#define SPANFUNC_POINTER_FETCHPIXEL(Arg) qt_fetchPixel<QImage::Arg>
+ fx += fdx;
+ fy += fdy;
+ ++b;
+ }
+ } else {
+ const qreal fdx = data->m11;
+ const qreal fdy = data->m12;
+ const qreal fdw = data->m13;
+ qreal fx = data->m21 * cy + data->m11 * cx + data->dx;
+ qreal fy = data->m22 * cy + data->m12 * cx + data->dy;
+ qreal fw = data->m23 * cy + data->m13 * cx + data->m33;
-static const FetchPixelProc fetchPixelProc[QImage::NImageFormats] =
-{
- 0,
- SPANFUNC_POINTER_FETCHPIXEL(Format_Mono),
- SPANFUNC_POINTER_FETCHPIXEL(Format_MonoLSB),
- SPANFUNC_POINTER_FETCHPIXEL(Format_Indexed8),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB32_Premultiplied),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB32),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB32_Premultiplied),
- SPANFUNC_POINTER_FETCHPIXEL(Format_RGB16),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB8565_Premultiplied),
- SPANFUNC_POINTER_FETCHPIXEL(Format_RGB666),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB6666_Premultiplied),
- SPANFUNC_POINTER_FETCHPIXEL(Format_RGB555),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB8555_Premultiplied),
- SPANFUNC_POINTER_FETCHPIXEL(Format_RGB888),
- SPANFUNC_POINTER_FETCHPIXEL(Format_RGB444),
- SPANFUNC_POINTER_FETCHPIXEL(Format_ARGB4444_Premultiplied)
-};
+ while (b < end) {
+ const qreal iw = fw == 0 ? 1 : 1 / fw;
+ const qreal tx = fx * iw;
+ const qreal ty = fy * iw;
+ int px = int(tx) - (tx < 0);
+ int py = int(ty) - (ty < 0);
-enum TextureBlendType {
- BlendUntransformed,
- BlendTiled,
- BlendTransformed,
- BlendTransformedTiled,
- BlendTransformedBilinear,
- BlendTransformedBilinearTiled,
- NBlendTypes
-};
+ if (blendType == BlendTransformedTiled) {
+ px %= image_width;
+ py %= image_height;
+ if (px < 0) px += image_width;
+ if (py < 0) py += image_height;
+ } else {
+ px = qBound(0, px, image_width - 1);
+ py = qBound(0, py, image_height - 1);
+ }
+ *b = reinterpret_cast<const uint *>(data->texture.scanLine(py))[px];
-template <QImage::Format format>
-Q_STATIC_TEMPLATE_FUNCTION const uint * QT_FASTCALL qt_fetchUntransformed(uint *buffer, const Operator *, const QSpanData *data,
- int y, int x, int length)
-{
- const uchar *scanLine = data->texture.scanLine(y);
- for (int i = 0; i < length; ++i)
- buffer[i] = qt_fetchPixel<format>(scanLine, x + i, data->texture.colorTable);
+ fx += fdx;
+ fy += fdy;
+ fw += fdw;
+ //force increment to avoid /0
+ if (!fw) {
+ fw += fdw;
+ }
+ ++b;
+ }
+ }
return buffer;
}
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION const uint * QT_FASTCALL
-qt_fetchUntransformed<QImage::Format_ARGB32_Premultiplied>(uint *, const Operator *,
- const QSpanData *data,
- int y, int x, int)
-{
- const uchar *scanLine = data->texture.scanLine(y);
- return ((const uint *)scanLine) + x;
-}
-
template<TextureBlendType blendType> /* either BlendTransformed or BlendTransformedTiled */
Q_STATIC_TEMPLATE_FUNCTION
-const uint * QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data,
- int y, int x, int length)
+const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data,
+ int y, int x, int length)
{
- FetchPixelProc fetch = fetchPixelProc[data->texture.format];
-
int image_width = data->texture.width;
int image_height = data->texture.height;
const qreal cx = x + qreal(0.5);
const qreal cy = y + qreal(0.5);
+ const QPixelLayout *layout = &qPixelLayouts[data->texture.format];
+ FetchPixelFunc fetch = qFetchPixel[layout->bpp];
+
const uint *end = buffer + length;
uint *b = buffer;
if (data->fast_matrix) {
@@ -560,18 +678,12 @@ const uint * QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const
py %= image_height;
if (px < 0) px += image_width;
if (py < 0) py += image_height;
-
- const uchar *scanLine = data->texture.scanLine(py);
- *b = fetch(scanLine, px, data->texture.colorTable);
} else {
- if ((px < 0) || (px >= image_width)
- || (py < 0) || (py >= image_height)) {
- *b = uint(0);
- } else {
- const uchar *scanLine = data->texture.scanLine(py);
- *b = fetch(scanLine, px, data->texture.colorTable);
- }
+ px = qBound(0, px, image_width - 1);
+ py = qBound(0, py, image_height - 1);
}
+ *b = fetch(data->texture.scanLine(py), px);
+
fx += fdx;
fy += fdy;
++b;
@@ -597,18 +709,12 @@ const uint * QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const
py %= image_height;
if (px < 0) px += image_width;
if (py < 0) py += image_height;
-
- const uchar *scanLine = data->texture.scanLine(py);
- *b = fetch(scanLine, px, data->texture.colorTable);
} else {
- if ((px < 0) || (px >= image_width)
- || (py < 0) || (py >= image_height)) {
- *b = uint(0);
- } else {
- const uchar *scanLine = data->texture.scanLine(py);
- *b = fetch(scanLine, px, data->texture.colorTable);
- }
+ px = qBound(0, px, image_width - 1);
+ py = qBound(0, py, image_height - 1);
}
+ *b = fetch(data->texture.scanLine(py), px);
+
fx += fdx;
fy += fdy;
fw += fdw;
@@ -619,8 +725,8 @@ const uint * QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const
++b;
}
}
-
- return buffer;
+ const QRgb *clut = data->texture.colorTable ? data->texture.colorTable->constData() : 0;
+ return layout->convertToARGB32PM(buffer, buffer, length, layout, clut);
}
/** \internal
@@ -714,42 +820,42 @@ static inline uint interpolate_4_pixels_16(uint tl, uint tr, uint bl, uint br, i
#endif
template<TextureBlendType blendType>
-Q_STATIC_TEMPLATE_FUNCTION inline void fetchTransformedBilinear_pixelBounds(int max, int l1, int l2, int &v1, int &v2)
-{
- if (blendType == BlendTransformedBilinearTiled) {
- v1 %= max;
- if (v1 < 0) v1 += max;
- v2 = v1 + 1;
- v2 %= max;
- } else {
- if (v1 < l1) {
- v2 = v1 = l1;
- } else if (v1 >= l2) {
- v2 = v1 = l2;
- } else {
- v2 = v1 + 1;
- }
- }
+void fetchTransformedBilinear_pixelBounds(int max, int l1, int l2, int &v1, int &v2);
+template<>
+Q_STATIC_TEMPLATE_SPECIALIZATION
+inline void fetchTransformedBilinear_pixelBounds<BlendTransformedBilinearTiled>(int max, int, int, int &v1, int &v2)
+{
+ v1 %= max;
+ if (v1 < 0)
+ v1 += max;
+ v2 = v1 + 1;
+ if (v2 == max)
+ v2 = 0;
Q_ASSERT(v1 >= 0 && v1 < max);
Q_ASSERT(v2 >= 0 && v2 < max);
}
-template<TextureBlendType blendType, QImage::Format format> /* blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled */
-Q_STATIC_TEMPLATE_FUNCTION
-const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *, const QSpanData *data,
- int y, int x, int length)
+template<>
+Q_STATIC_TEMPLATE_SPECIALIZATION
+inline void fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(int, int l1, int l2, int &v1, int &v2)
{
-#ifdef Q_CC_RVCT // needed to avoid compiler crash in RVCT 2.2
- FetchPixelProc fetch;
- if (format != QImage::Format_Invalid)
- fetch = qt_fetchPixel<format>;
+ if (v1 < l1)
+ v2 = v1 = l1;
+ else if (v1 >= l2)
+ v2 = v1 = l2;
else
- fetch = fetchPixelProc[data->texture.format];
-#else
- FetchPixelProc fetch = (format != QImage::Format_Invalid) ? FetchPixelProc(qt_fetchPixel<format>) : fetchPixelProc[data->texture.format];
-#endif
+ v2 = v1 + 1;
+ Q_ASSERT(v1 >= l1 && v1 <= l2);
+ Q_ASSERT(v2 >= l1 && v2 <= l2);
+}
+template<TextureBlendType blendType> /* blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled */
+Q_STATIC_TEMPLATE_FUNCTION
+const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, const Operator *,
+ const QSpanData *data, int y, int x,
+ int length)
+{
int image_width = data->texture.width;
int image_height = data->texture.height;
@@ -780,8 +886,8 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
int y1 = (fy >> 16);
int y2;
fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
- const uchar *s1 = data->texture.scanLine(y1);
- const uchar *s2 = data->texture.scanLine(y2);
+ const uint *s1 = (const uint *)data->texture.scanLine(y1);
+ const uint *s2 = (const uint *)data->texture.scanLine(y2);
if (fdx <= fixed_scale && fdx > 0) { // scale up on X
int disty = (fy & 0x0000ffff) >> 8;
@@ -806,8 +912,8 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
lim = qMin(count, image_x2-x+1);
if (x < image_x1) {
Q_ASSERT(x <= image_x2);
- uint t = fetch(s1, image_x1, data->texture.colorTable);
- uint b = fetch(s2, image_x1, data->texture.colorTable);
+ uint t = s1[image_x1];
+ uint b = s2[image_x1];
quint32 rb = (((t & 0xff00ff) * idisty + (b & 0xff00ff) * disty) >> 8) & 0xff00ff;
quint32 ag = ((((t>>8) & 0xff00ff) * idisty + ((b>>8) & 0xff00ff) * disty) >> 8) & 0xff00ff;
do {
@@ -819,8 +925,7 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
}
}
- if (blendType != BlendTransformedBilinearTiled &&
- (format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)) {
+ if (blendType != BlendTransformedBilinearTiled) {
#if defined(QT_ALWAYS_HAVE_SSE2)
const __m128i disty_ = _mm_set1_epi16(disty);
const __m128i idisty_ = _mm_set1_epi16(idisty);
@@ -890,8 +995,8 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
x = qMin(x, image_x2);
}
- uint t = fetch(s1, x, data->texture.colorTable);
- uint b = fetch(s2, x, data->texture.colorTable);
+ uint t = s1[x];
+ uint b = s2[x];
intermediate_buffer[0][f] = (((t & 0xff00ff) * idisty + (b & 0xff00ff) * disty) >> 8) & 0xff00ff;
intermediate_buffer[1][f] = ((((t>>8) & 0xff00ff) * idisty + ((b>>8) & 0xff00ff) * disty) >> 8) & 0xff00ff;
@@ -918,18 +1023,18 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
int y1 = (fy >> 16);
int y2;
fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
- const uchar *s1 = data->texture.scanLine(y1);
- const uchar *s2 = data->texture.scanLine(y2);
+ const uint *s1 = (const uint *)data->texture.scanLine(y1);
+ const uint *s2 = (const uint *)data->texture.scanLine(y2);
int disty = (fy & 0x0000ffff) >> 8;
int idisty = 256 - disty;
while (b < end) {
int x1 = (fx >> 16);
int x2;
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
+ uint tl = s1[x1];
+ uint tr = s1[x2];
+ uint bl = s2[x1];
+ uint br = s2[x2];
int distx = (fx & 0x0000ffff) >> 8;
int idistx = 256 - distx;
@@ -945,13 +1050,11 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
int y1 = (fy >> 16);
int y2;
fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
- const uchar *s1 = data->texture.scanLine(y1);
- const uchar *s2 = data->texture.scanLine(y2);
+ const uint *s1 = (const uint *)data->texture.scanLine(y1);
+ const uint *s2 = (const uint *)data->texture.scanLine(y2);
int disty = (fy & 0x0000ffff) >> 12;
- if (blendType != BlendTransformedBilinearTiled &&
- (format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)) {
-
+ if (blendType != BlendTransformedBilinearTiled) {
#define BILINEAR_DOWNSCALE_BOUNDS_PROLOG \
while (b < end) { \
int x1 = (fx >> 16); \
@@ -959,10 +1062,10 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2); \
if (x1 != x2) \
break; \
- uint tl = fetch(s1, x1, data->texture.colorTable); \
- uint tr = fetch(s1, x2, data->texture.colorTable); \
- uint bl = fetch(s2, x1, data->texture.colorTable); \
- uint br = fetch(s2, x2, data->texture.colorTable); \
+ uint tl = s1[x1]; \
+ uint tr = s1[x2]; \
+ uint bl = s2[x1]; \
+ uint br = s2[x2]; \
int distx = (fx & 0x0000ffff) >> 12; \
*b = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty); \
fx += fdx; \
@@ -1070,10 +1173,10 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
int x1 = (fx >> 16);
int x2;
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
+ uint tl = s1[x1];
+ uint tr = s1[x2];
+ uint bl = s2[x1];
+ uint br = s2[x2];
int distx = (fx & 0x0000ffff) >> 12;
*b = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty);
fx += fdx;
@@ -1092,13 +1195,13 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
- const uchar *s1 = data->texture.scanLine(y1);
- const uchar *s2 = data->texture.scanLine(y2);
+ const uint *s1 = (const uint *)data->texture.scanLine(y1);
+ const uint *s2 = (const uint *)data->texture.scanLine(y2);
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
+ uint tl = s1[x1];
+ uint tr = s1[x2];
+ uint bl = s2[x1];
+ uint br = s2[x2];
int distx = (fx & 0x0000ffff) >> 8;
int disty = (fy & 0x0000ffff) >> 8;
@@ -1124,13 +1227,13 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
- const uchar *s1 = data->texture.scanLine(y1);
- const uchar *s2 = data->texture.scanLine(y2);
+ const uint *s1 = (const uint *)data->texture.scanLine(y1);
+ const uint *s2 = (const uint *)data->texture.scanLine(y2);
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
+ uint tl = s1[x1];
+ uint tr = s1[x2];
+ uint bl = s2[x1];
+ uint br = s2[x2];
int distx = (fx & 0x0000ffff) >> 12;
int disty = (fy & 0x0000ffff) >> 12;
@@ -1170,13 +1273,13 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
- const uchar *s1 = data->texture.scanLine(y1);
- const uchar *s2 = data->texture.scanLine(y2);
+ const uint *s1 = (const uint *)data->texture.scanLine(y1);
+ const uint *s2 = (const uint *)data->texture.scanLine(y2);
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
+ uint tl = s1[x1];
+ uint tr = s1[x2];
+ uint bl = s2[x1];
+ uint br = s2[x2];
uint xtop = INTERPOLATE_PIXEL_256(tl, idistx, tr, distx);
uint xbot = INTERPOLATE_PIXEL_256(bl, idistx, br, distx);
@@ -1196,119 +1299,452 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
return buffer;
}
-#define SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Arg) qt_fetchUntransformed<QImage::Arg>
+// blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled
+template<TextureBlendType blendType>
+Q_STATIC_TEMPLATE_FUNCTION
+const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *,
+ const QSpanData *data, int y, int x, int length)
+{
+ const QPixelLayout *layout = &qPixelLayouts[data->texture.format];
+ const QRgb *clut = data->texture.colorTable ? data->texture.colorTable->constData() : 0;
+
+ int image_width = data->texture.width;
+ int image_height = data->texture.height;
+
+ int image_x1 = data->texture.x1;
+ int image_y1 = data->texture.y1;
+ int image_x2 = data->texture.x2 - 1;
+ int image_y2 = data->texture.y2 - 1;
+
+ const qreal cx = x + qreal(0.5);
+ const qreal cy = y + qreal(0.5);
+
+ if (data->fast_matrix) {
+ // The increment pr x in the scanline
+ int fdx = (int)(data->m11 * fixed_scale);
+ int fdy = (int)(data->m12 * fixed_scale);
+
+ int fx = int((data->m21 * cy + data->m11 * cx + data->dx) * fixed_scale);
+ int fy = int((data->m22 * cy + data->m12 * cx + data->dy) * fixed_scale);
+
+ fx -= half_point;
+ fy -= half_point;
+
+ if (fdy == 0) { //simple scale, no rotation
+ int y1 = (fy >> 16);
+ int y2;
+ fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
+ const uchar *s1 = data->texture.scanLine(y1);
+ const uchar *s2 = data->texture.scanLine(y2);
+
+ if (fdx <= fixed_scale && fdx > 0) { // scale up on X
+ int disty = (fy & 0x0000ffff) >> 8;
+ int idisty = 256 - disty;
+ int x = fx >> 16;
+
+ // The idea is first to do the interpolation between the row s1 and the row s2
+ // into an intermediate buffer, then we interpolate between two pixel of this buffer.
+ FetchPixelsFunc fetch = qFetchPixels[layout->bpp];
+ uint buf1[buffer_size + 2];
+ uint buf2[buffer_size + 2];
+ const uint *ptr1;
+ const uint *ptr2;
+
+ int count = qCeil(length * data->m11) + 2; //+1 for the last pixel to interpolate with, and +1 for rounding errors.
+ Q_ASSERT(count <= buffer_size + 2); //length is supposed to be <= buffer_size and data->m11 < 1 in this case
+
+ if (blendType == BlendTransformedBilinearTiled) {
+ x %= image_width;
+ if (x < 0)
+ x += image_width;
+ int len1 = qMin(count, image_width - x);
+ int len2 = qMin(x, count - len1);
+
+ ptr1 = fetch(buf1, s1, x, len1);
+ ptr1 = layout->convertToARGB32PM(buf1, ptr1, len1, layout, clut);
+ ptr2 = fetch(buf2, s2, x, len1);
+ ptr2 = layout->convertToARGB32PM(buf2, ptr2, len1, layout, clut);
+ for (int i = 0; i < len1; ++i) {
+ uint t = ptr1[i];
+ uint b = ptr2[i];
+ buf1[i] = (((t & 0xff00ff) * idisty + (b & 0xff00ff) * disty) >> 8) & 0xff00ff;
+ buf2[i] = ((((t >> 8) & 0xff00ff) * idisty + ((b >> 8) & 0xff00ff) * disty) >> 8) & 0xff00ff;
+ }
+
+ if (len2) {
+ ptr1 = fetch(buf1 + len1, s1, 0, len2);
+ ptr1 = layout->convertToARGB32PM(buf1 + len1, ptr1, len2, layout, clut);
+ ptr2 = fetch(buf2 + len1, s2, 0, len2);
+ ptr2 = layout->convertToARGB32PM(buf2 + len1, ptr2, len2, layout, clut);
+ for (int i = 0; i < len2; ++i) {
+ uint t = ptr1[i];
+ uint b = ptr2[i];
+ buf1[i + len1] = (((t & 0xff00ff) * idisty + (b & 0xff00ff) * disty) >> 8) & 0xff00ff;
+ buf2[i + len1] = ((((t >> 8) & 0xff00ff) * idisty + ((b >> 8) & 0xff00ff) * disty) >> 8) & 0xff00ff;
+ }
+ }
+ for (int i = image_width; i < count; ++i) {
+ buf1[i] = buf1[i - image_width];
+ buf2[i] = buf2[i - image_width];
+ }
+ } else {
+ int start = qMax(x, image_x1);
+ int end = qMin(x + count, image_x2 + 1);
+ int len = qMax(1, end - start);
+ int leading = start - x;
+
+ ptr1 = fetch(buf1 + leading, s1, start, len);
+ ptr1 = layout->convertToARGB32PM(buf1 + leading, ptr1, len, layout, clut);
+ ptr2 = fetch(buf2 + leading, s2, start, len);
+ ptr2 = layout->convertToARGB32PM(buf2 + leading, ptr2, len, layout, clut);
+
+ for (int i = 0; i < len; ++i) {
+ uint t = ptr1[i];
+ uint b = ptr2[i];
+ buf1[i + leading] = (((t & 0xff00ff) * idisty + (b & 0xff00ff) * disty) >> 8) & 0xff00ff;
+ buf2[i + leading] = ((((t >> 8) & 0xff00ff) * idisty + ((b >> 8) & 0xff00ff) * disty) >> 8) & 0xff00ff;
+ }
+
+ for (int i = 0; i < leading; ++i) {
+ buf1[i] = buf1[leading];
+ buf2[i] = buf2[leading];
+ }
+ for (int i = leading + len; i < count; ++i) {
+ buf1[i] = buf1[i - 1];
+ buf2[i] = buf2[i - 1];
+ }
+ }
+
+ // Now interpolate the values from the intermediate_buffer to get the final result.
+ fx &= fixed_scale - 1;
+ Q_ASSERT((fx >> 16) == 0);
+ for (int i = 0; i < length; ++i) {
+ register int x1 = (fx >> 16);
+ register int x2 = x1 + 1;
+ Q_ASSERT(x1 >= 0);
+ Q_ASSERT(x2 < count);
+
+ register int distx = (fx & 0x0000ffff) >> 8;
+ register int idistx = 256 - distx;
+ int rb = ((buf1[x1] * idistx + buf1[x2] * distx) >> 8) & 0xff00ff;
+ int ag = (buf2[x1] * idistx + buf2[x2] * distx) & 0xff00ff00;
+ buffer[i] = rb | ag;
+ fx += fdx;
+ }
+ } else {
+ FetchPixelFunc fetch = qFetchPixel[layout->bpp];
+ uint buf1[buffer_size];
+ uint buf2[buffer_size];
+ uint *b = buffer;
+ while (length) {
+ int len = qMin(length, buffer_size / 2);
+ int fracX = fx;
+ for (int i = 0; i < len; ++i) {
+ int x1 = (fx >> 16);
+ int x2;
+ fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
+
+ buf1[i * 2 + 0] = fetch(s1, x1);
+ buf1[i * 2 + 1] = fetch(s1, x2);
+ buf2[i * 2 + 0] = fetch(s2, x1);
+ buf2[i * 2 + 1] = fetch(s2, x2);
+
+ fx += fdx;
+ }
+ layout->convertToARGB32PM(buf1, buf1, len * 2, layout, clut);
+ layout->convertToARGB32PM(buf2, buf2, len * 2, layout, clut);
+
+ if ((fdx < 0 && fdx > -(fixed_scale / 8)) || fabs(data->m22) < (1./8.)) { // scale up more than 8x
+ int disty = (fy & 0x0000ffff) >> 8;
+ int idisty = 256 - disty;
+ for (int i = 0; i < len; ++i) {
+ uint tl = buf1[i * 2 + 0];
+ uint tr = buf1[i * 2 + 1];
+ uint bl = buf2[i * 2 + 0];
+ uint br = buf2[i * 2 + 1];
+ int distx = (fracX & 0x0000ffff) >> 8;
+ int idistx = 256 - distx;
+ uint xtop = INTERPOLATE_PIXEL_256(tl, idistx, tr, distx);
+ uint xbot = INTERPOLATE_PIXEL_256(bl, idistx, br, distx);
+ b[i] = INTERPOLATE_PIXEL_256(xtop, idisty, xbot, disty);
+ fracX += fdx;
+ }
+ } else { //scale down
+ int disty = (fy & 0x0000ffff) >> 12;
+ for (int i = 0; i < len; ++i) {
+ uint tl = buf1[i * 2 + 0];
+ uint tr = buf1[i * 2 + 1];
+ uint bl = buf2[i * 2 + 0];
+ uint br = buf2[i * 2 + 1];
+ int distx = (fracX & 0x0000ffff) >> 12;
+ b[i] = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty);
+ fracX += fdx;
+ }
+ }
+ length -= len;
+ b += len;
+ }
+ }
+ } else { //rotation
+ FetchPixelFunc fetch = qFetchPixel[layout->bpp];
+ uint buf1[buffer_size];
+ uint buf2[buffer_size];
+ uint *b = buffer;
+
+ while (length) {
+ int len = qMin(length, buffer_size / 2);
+ int fracX = fx;
+ int fracY = fy;
+ for (int i = 0; i < len; ++i) {
+ int x1 = (fx >> 16);
+ int x2;
+ int y1 = (fy >> 16);
+ int y2;
+ fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
+ fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
+
+ const uchar *s1 = data->texture.scanLine(y1);
+ const uchar *s2 = data->texture.scanLine(y2);
+
+ buf1[i * 2 + 0] = fetch(s1, x1);
+ buf1[i * 2 + 1] = fetch(s1, x2);
+ buf2[i * 2 + 0] = fetch(s2, x1);
+ buf2[i * 2 + 1] = fetch(s2, x2);
+
+ fx += fdx;
+ fy += fdy;
+ }
+ layout->convertToARGB32PM(buf1, buf1, len * 2, layout, clut);
+ layout->convertToARGB32PM(buf2, buf2, len * 2, layout, clut);
+
+ if (fabs(data->m11) > 8 || fabs(data->m22) > 8) {
+ //if we are zooming more than 8 times, we use 8bit precision for the position.
+ for (int i = 0; i < len; ++i) {
+ uint tl = buf1[i * 2 + 0];
+ uint tr = buf1[i * 2 + 1];
+ uint bl = buf2[i * 2 + 0];
+ uint br = buf2[i * 2 + 1];
+
+ int distx = (fracX & 0x0000ffff) >> 8;
+ int disty = (fracY & 0x0000ffff) >> 8;
+ int idistx = 256 - distx;
+ int idisty = 256 - disty;
+
+ uint xtop = INTERPOLATE_PIXEL_256(tl, idistx, tr, distx);
+ uint xbot = INTERPOLATE_PIXEL_256(bl, idistx, br, distx);
+ b[i] = INTERPOLATE_PIXEL_256(xtop, idisty, xbot, disty);
+ fracX += fdx;
+ fracY += fdy;
+ }
+ } else {
+ //we are zooming less than 8x, use 4bit precision
+ for (int i = 0; i < len; ++i) {
+ uint tl = buf1[i * 2 + 0];
+ uint tr = buf1[i * 2 + 1];
+ uint bl = buf2[i * 2 + 0];
+ uint br = buf2[i * 2 + 1];
+
+ int distx = (fracX & 0x0000ffff) >> 12;
+ int disty = (fracY & 0x0000ffff) >> 12;
+
+ b[i] = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty);
+ fracX += fdx;
+ fracY += fdy;
+ }
+ }
+
+ length -= len;
+ b += len;
+ }
+ }
+ } else {
+ const qreal fdx = data->m11;
+ const qreal fdy = data->m12;
+ const qreal fdw = data->m13;
+
+ qreal fx = data->m21 * cy + data->m11 * cx + data->dx;
+ qreal fy = data->m22 * cy + data->m12 * cx + data->dy;
+ qreal fw = data->m23 * cy + data->m13 * cx + data->m33;
+
+ FetchPixelFunc fetch = qFetchPixel[layout->bpp];
+ uint buf1[buffer_size];
+ uint buf2[buffer_size];
+ uint *b = buffer;
+
+ int distxs[buffer_size / 2];
+ int distys[buffer_size / 2];
+
+ while (length) {
+ int len = qMin(length, buffer_size / 2);
+ for (int i = 0; i < len; ++i) {
+ const qreal iw = fw == 0 ? 1 : 1 / fw;
+ const qreal px = fx * iw - qreal(0.5);
+ const qreal py = fy * iw - qreal(0.5);
+
+ int x1 = int(px) - (px < 0);
+ int x2;
+ int y1 = int(py) - (py < 0);
+ int y2;
+
+ distxs[i] = int((px - x1) * 256);
+ distys[i] = int((py - y1) * 256);
+
+ fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
+ fetchTransformedBilinear_pixelBounds<blendType>(image_height, image_y1, image_y2, y1, y2);
+
+ const uchar *s1 = data->texture.scanLine(y1);
+ const uchar *s2 = data->texture.scanLine(y2);
+
+ buf1[i * 2 + 0] = fetch(s1, x1);
+ buf1[i * 2 + 1] = fetch(s1, x2);
+ buf2[i * 2 + 0] = fetch(s2, x1);
+ buf2[i * 2 + 1] = fetch(s2, x2);
+
+ fx += fdx;
+ fy += fdy;
+ fw += fdw;
+ //force increment to avoid /0
+ if (!fw)
+ fw += fdw;
+ }
+
+ layout->convertToARGB32PM(buf1, buf1, len * 2, layout, clut);
+ layout->convertToARGB32PM(buf2, buf2, len * 2, layout, clut);
+
+ for (int i = 0; i < len; ++i) {
+ int distx = distxs[i];
+ int disty = distys[i];
+ int idistx = 256 - distx;
+ int idisty = 256 - disty;
+
+ uint tl = buf1[i * 2 + 0];
+ uint tr = buf1[i * 2 + 1];
+ uint bl = buf2[i * 2 + 0];
+ uint br = buf2[i * 2 + 1];
+
+ uint xtop = INTERPOLATE_PIXEL_256(tl, idistx, tr, distx);
+ uint xbot = INTERPOLATE_PIXEL_256(bl, idistx, br, distx);
+ b[i] = INTERPOLATE_PIXEL_256(xtop, idisty, xbot, disty);
+ }
+ length -= len;
+ b += len;
+ }
+ }
+
+ return buffer;
+}
static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
// Untransformed
{
0, // Invalid
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_Mono), // Mono
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_MonoLSB), // MonoLsb
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_Indexed8), // Indexed8
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB32_Premultiplied), // RGB32
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB32), // ARGB32
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB32_Premultiplied), // ARGB32_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB16), // RGB16
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB8565_Premultiplied),// ARGB8565_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB666), // RGB666
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB6666_Premultiplied),// ARGB6666_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB555), // RGB555
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB8555_Premultiplied),// ARGB8555_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB888), // RGB888
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB444), // RGB444
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB4444_Premultiplied) // ARGB4444_Premultiplied
+ fetchUntransformed, // Mono
+ fetchUntransformed, // MonoLsb
+ fetchUntransformed, // Indexed8
+ fetchUntransformedARGB32PM, // RGB32
+ fetchUntransformed, // ARGB32
+ fetchUntransformedARGB32PM, // ARGB32_Premultiplied
+ fetchUntransformedRGB16, // RGB16
+ fetchUntransformed, // ARGB8565_Premultiplied
+ fetchUntransformed, // RGB666
+ fetchUntransformed, // ARGB6666_Premultiplied
+ fetchUntransformed, // RGB555
+ fetchUntransformed, // ARGB8555_Premultiplied
+ fetchUntransformed, // RGB888
+ fetchUntransformed, // RGB444
+ fetchUntransformed // ARGB4444_Premultiplied
},
// Tiled
{
0, // Invalid
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_Mono), // Mono
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_MonoLSB), // MonoLsb
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_Indexed8), // Indexed8
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB32_Premultiplied), // RGB32
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB32), // ARGB32
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB32_Premultiplied), // ARGB32_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB16), // RGB16
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB8565_Premultiplied),// ARGB8565_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB666), // RGB666
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB6666_Premultiplied),// ARGB6666_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB555), // RGB555
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB8555_Premultiplied),// ARGB8555_Premultiplied
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB888), // RGB888
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_RGB444), // RGB444
- SPANFUNC_POINTER_FETCHHUNTRANSFORMED(Format_ARGB4444_Premultiplied) // ARGB4444_Premultiplied
+ fetchUntransformed, // Mono
+ fetchUntransformed, // MonoLsb
+ fetchUntransformed, // Indexed8
+ fetchUntransformedARGB32PM, // RGB32
+ fetchUntransformed, // ARGB32
+ fetchUntransformedARGB32PM, // ARGB32_Premultiplied
+ fetchUntransformedRGB16, // RGB16
+ fetchUntransformed, // ARGB8565_Premultiplied
+ fetchUntransformed, // RGB666
+ fetchUntransformed, // ARGB6666_Premultiplied
+ fetchUntransformed, // RGB555
+ fetchUntransformed, // ARGB8555_Premultiplied
+ fetchUntransformed, // RGB888
+ fetchUntransformed, // RGB444
+ fetchUntransformed // ARGB4444_Premultiplied
},
// Transformed
{
0, // Invalid
- fetchTransformed<BlendTransformed>, // Mono
- fetchTransformed<BlendTransformed>, // MonoLsb
- fetchTransformed<BlendTransformed>, // Indexed8
- fetchTransformed<BlendTransformed>, // RGB32
- fetchTransformed<BlendTransformed>, // ARGB32
- fetchTransformed<BlendTransformed>, // ARGB32_Premultiplied
- fetchTransformed<BlendTransformed>, // RGB16
- fetchTransformed<BlendTransformed>, // ARGB8565_Premultiplied
- fetchTransformed<BlendTransformed>, // RGB666
- fetchTransformed<BlendTransformed>, // ARGB6666_Premultiplied
- fetchTransformed<BlendTransformed>, // RGB555
- fetchTransformed<BlendTransformed>, // ARGB8555_Premultiplied
- fetchTransformed<BlendTransformed>, // RGB888
- fetchTransformed<BlendTransformed>, // RGB444
- fetchTransformed<BlendTransformed>, // ARGB4444_Premultiplied
+ fetchTransformed<BlendTransformed>, // Mono
+ fetchTransformed<BlendTransformed>, // MonoLsb
+ fetchTransformed<BlendTransformed>, // Indexed8
+ fetchTransformedARGB32PM<BlendTransformed>, // RGB32
+ fetchTransformed<BlendTransformed>, // ARGB32
+ fetchTransformedARGB32PM<BlendTransformed>, // ARGB32_Premultiplied
+ fetchTransformed<BlendTransformed>, // RGB16
+ fetchTransformed<BlendTransformed>, // ARGB8565_Premultiplied
+ fetchTransformed<BlendTransformed>, // RGB666
+ fetchTransformed<BlendTransformed>, // ARGB6666_Premultiplied
+ fetchTransformed<BlendTransformed>, // RGB555
+ fetchTransformed<BlendTransformed>, // ARGB8555_Premultiplied
+ fetchTransformed<BlendTransformed>, // RGB888
+ fetchTransformed<BlendTransformed>, // RGB444
+ fetchTransformed<BlendTransformed>, // ARGB4444_Premultiplied
},
{
0, // TransformedTiled
- fetchTransformed<BlendTransformedTiled>, // Mono
- fetchTransformed<BlendTransformedTiled>, // MonoLsb
- fetchTransformed<BlendTransformedTiled>, // Indexed8
- fetchTransformed<BlendTransformedTiled>, // RGB32
- fetchTransformed<BlendTransformedTiled>, // ARGB32
- fetchTransformed<BlendTransformedTiled>, // ARGB32_Premultiplied
- fetchTransformed<BlendTransformedTiled>, // RGB16
- fetchTransformed<BlendTransformedTiled>, // ARGB8565_Premultiplied
- fetchTransformed<BlendTransformedTiled>, // RGB666
- fetchTransformed<BlendTransformedTiled>, // ARGB6666_Premultiplied
- fetchTransformed<BlendTransformedTiled>, // RGB555
- fetchTransformed<BlendTransformedTiled>, // ARGB8555_Premultiplied
- fetchTransformed<BlendTransformedTiled>, // RGB888
- fetchTransformed<BlendTransformedTiled>, // RGB444
- fetchTransformed<BlendTransformedTiled>, // ARGB4444_Premultiplied
+ fetchTransformed<BlendTransformedTiled>, // Mono
+ fetchTransformed<BlendTransformedTiled>, // MonoLsb
+ fetchTransformed<BlendTransformedTiled>, // Indexed8
+ fetchTransformedARGB32PM<BlendTransformedTiled>, // RGB32
+ fetchTransformed<BlendTransformedTiled>, // ARGB32
+ fetchTransformedARGB32PM<BlendTransformedTiled>, // ARGB32_Premultiplied
+ fetchTransformed<BlendTransformedTiled>, // RGB16
+ fetchTransformed<BlendTransformedTiled>, // ARGB8565_Premultiplied
+ fetchTransformed<BlendTransformedTiled>, // RGB666
+ fetchTransformed<BlendTransformedTiled>, // ARGB6666_Premultiplied
+ fetchTransformed<BlendTransformedTiled>, // RGB555
+ fetchTransformed<BlendTransformedTiled>, // ARGB8555_Premultiplied
+ fetchTransformed<BlendTransformedTiled>, // RGB888
+ fetchTransformed<BlendTransformedTiled>, // RGB444
+ fetchTransformed<BlendTransformedTiled>, // ARGB4444_Premultiplied
},
{
0, // Bilinear
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // Mono
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // MonoLsb
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // Indexed8
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_ARGB32_Premultiplied>, // RGB32
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_ARGB32>, // ARGB32
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_ARGB32_Premultiplied>, // ARGB32_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // RGB16
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // ARGB8565_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // RGB666
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // ARGB6666_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // RGB555
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // ARGB8555_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // RGB888
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid>, // RGB444
- fetchTransformedBilinear<BlendTransformedBilinear, QImage::Format_Invalid> // ARGB4444_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinear>, // Mono
+ fetchTransformedBilinear<BlendTransformedBilinear>, // MonoLsb
+ fetchTransformedBilinear<BlendTransformedBilinear>, // Indexed8
+ fetchTransformedBilinearARGB32PM<BlendTransformedBilinear>, // RGB32
+ fetchTransformedBilinear<BlendTransformedBilinear>, // ARGB32
+ fetchTransformedBilinearARGB32PM<BlendTransformedBilinear>, // ARGB32_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinear>, // RGB16
+ fetchTransformedBilinear<BlendTransformedBilinear>, // ARGB8565_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinear>, // RGB666
+ fetchTransformedBilinear<BlendTransformedBilinear>, // ARGB6666_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinear>, // RGB555
+ fetchTransformedBilinear<BlendTransformedBilinear>, // ARGB8555_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinear>, // RGB888
+ fetchTransformedBilinear<BlendTransformedBilinear>, // RGB444
+ fetchTransformedBilinear<BlendTransformedBilinear> // ARGB4444_Premultiplied
},
{
0, // BilinearTiled
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // Mono
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // MonoLsb
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // Indexed8
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_ARGB32_Premultiplied>, // RGB32
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_ARGB32>, // ARGB32
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_ARGB32_Premultiplied>, // ARGB32_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // RGB16
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // ARGB8565_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // RGB666
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // ARGB6666_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // RGB555
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // ARGB8555_Premultiplied
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // RGB888
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid>, // RGB444
- fetchTransformedBilinear<BlendTransformedBilinearTiled, QImage::Format_Invalid> // ARGB4444_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // Mono
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // MonoLsb
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // Indexed8
+ fetchTransformedBilinearARGB32PM<BlendTransformedBilinearTiled>, // RGB32
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // ARGB32
+ fetchTransformedBilinearARGB32PM<BlendTransformedBilinearTiled>, // ARGB32_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB16
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // ARGB8565_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB666
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // ARGB6666_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB555
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // ARGB8555_Premultiplied
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB888
+ fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB444
+ fetchTransformedBilinear<BlendTransformedBilinearTiled> // ARGB4444_Premultiplied
},
};
@@ -3247,6 +3683,8 @@ static inline Operator getOperator(const QSpanData *data, const QSpan *spans, in
// don't clear dest_fetch as it sets up the pointer correctly to save one copy
break;
default: {
+ if (data->type == QSpanData::Texture && data->texture.const_alpha != 256)
+ break;
const QSpan *lastSpan = spans + spanCount;
bool alphaSpans = false;
while (spans < lastSpan) {
@@ -3274,26 +3712,6 @@ static inline Operator getOperator(const QSpanData *data, const QSpan *spans, in
// -------------------- blend methods ---------------------
-enum SpanMethod {
- RegularSpans,
- CallbackSpans
-};
-
-#if !defined(Q_CC_SUN)
-static
-#endif
-void drawBufferSpan(QSpanData *data, const uint *buffer, int bufsize,
- int x, int y, int length, uint const_alpha)
-{
- Q_UNUSED(data);
- Q_UNUSED(buffer);
- Q_UNUSED(bufsize);
- Q_UNUSED(x);
- Q_UNUSED(y);
- Q_UNUSED(length);
- Q_UNUSED(const_alpha);
-}
-
#if !defined(Q_CC_SUN)
static
#endif
@@ -3349,55 +3767,6 @@ static void blend_color_argb(int count, const QSpan *spans, void *userData)
}
}
-template <class T>
-Q_STATIC_TEMPLATE_FUNCTION void blendColor(int count, const QSpan *spans, void *userData)
-{
- QSpanData *data = reinterpret_cast<QSpanData *>(userData);
- Operator op = getOperator(data, spans, count);
-
- if (op.mode == QPainter::CompositionMode_Source) {
- const T c = qt_colorConvert<T, quint32p>(quint32p::fromRawData(data->solid.color), 0);
- while (count--) {
- T *target = ((T*)data->rasterBuffer->scanLine(spans->y))
- + spans->x;
- if (spans->coverage == 255) {
- qt_memfill(target, c, spans->len);
- } else {
- const quint8 alpha = T::alpha(spans->coverage);
- const T color = c.byte_mul(alpha);
- const int ialpha = T::ialpha(spans->coverage);
- const T *end = target + spans->len;
- while (target < end) {
- *target = color + target->byte_mul(ialpha);
- ++target;
- }
- }
- ++spans;
- }
- return;
- }
-
- if (op.mode == QPainter::CompositionMode_SourceOver) {
- while (count--) {
- const quint32 color = BYTE_MUL(data->solid.color, spans->coverage);
- const T c = qt_colorConvert<T, quint32p>(quint32p::fromRawData(color), 0);
- const quint8 ialpha = T::alpha(qAlpha(~color));
- T *target = ((T*)data->rasterBuffer->scanLine(spans->y)) + spans->x;
- const T *end = target + spans->len;
- while (target != end) {
- *target = c + target->byte_mul(ialpha);
- ++target;
- }
- ++spans;
- }
- return;
- }
-
- blend_color_generic(count, spans, userData);
-}
-
-#define SPANFUNC_POINTER_BLENDCOLOR(DST) blendColor<DST>
-
static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
@@ -3542,7 +3911,6 @@ struct QBlendBase
uint src_buffer[buffer_size];
};
-template <SpanMethod spanMethod>
class BlendSrcGeneric : public QBlendBase
{
public:
@@ -3553,38 +3921,30 @@ public:
const uint *fetch(int x, int y, int len)
{
- if (spanMethod == RegularSpans)
- dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, y, len) : buffer;
-
+ dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, y, len) : buffer;
return op.src_fetch(src_buffer, &op, data, y, x, len);
}
- void process(int x, int y, int len, int coverage, const uint *src, int offset)
+ void process(int, int, int len, int coverage, const uint *src, int offset)
{
- if (spanMethod == RegularSpans)
- op.func(dest + offset, src + offset, len, coverage);
- else
- drawBufferSpan(data, src + offset, len, x, y, len, coverage);
+ op.func(dest + offset, src + offset, len, coverage);
}
void store(int x, int y, int len)
{
- if (spanMethod == RegularSpans && op.dest_store) {
+ if (op.dest_store)
op.dest_store(data->rasterBuffer, x, y, dest, len);
- }
}
};
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_src_generic(int count, const QSpan *spans, void *userData)
+static void blend_src_generic(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
- BlendSrcGeneric<spanMethod> blend(data, getOperator(data, spans, count));
+ BlendSrcGeneric blend(data, getOperator(data, spans, count));
handleSpans(count, spans, data, blend);
}
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_untransformed_generic(int count, const QSpan *spans, void *userData)
+static void blend_untransformed_generic(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
@@ -3615,15 +3975,10 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_untransformed_generic(int count, const QSp
while (length) {
int l = qMin(buffer_size, length);
const uint *src = op.src_fetch(src_buffer, &op, data, sy, sx, l);
- if (spanMethod == RegularSpans) {
- uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer;
- op.func(dest, src, l, coverage);
- if (op.dest_store)
- op.dest_store(data->rasterBuffer, x, spans->y, dest, l);
- } else {
- drawBufferSpan(data, src, l, x, spans->y,
- l, coverage);
- }
+ uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer;
+ op.func(dest, src, l, coverage);
+ if (op.dest_store)
+ op.dest_store(data->rasterBuffer, x, spans->y, dest, l);
x += l;
sx += l;
length -= l;
@@ -3634,13 +3989,12 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_untransformed_generic(int count, const QSp
}
}
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_untransformed_argb(int count, const QSpan *spans, void *userData)
+static void blend_untransformed_argb(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
if (data->texture.format != QImage::Format_ARGB32_Premultiplied
&& data->texture.format != QImage::Format_RGB32) {
- blend_untransformed_generic<spanMethod>(count, spans, userData);
+ blend_untransformed_generic(count, spans, userData);
return;
}
@@ -3667,13 +4021,8 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_untransformed_argb(int count, const QSpan
if (length > 0) {
const int coverage = (spans->coverage * data->texture.const_alpha) >> 8;
const uint *src = (uint *)data->texture.scanLine(sy) + sx;
- if (spanMethod == RegularSpans) {
- uint *dest = ((uint *)data->rasterBuffer->scanLine(spans->y)) + x;
- op.func(dest, src, length, coverage);
- } else {
- drawBufferSpan(data, src, length, x,
- spans->y, length, coverage);
- }
+ uint *dest = ((uint *)data->rasterBuffer->scanLine(spans->y)) + x;
+ op.func(dest, src, length, coverage);
}
}
++spans;
@@ -3731,1167 +4080,19 @@ static inline void blend_sourceOver_rgb16_rgb16(quint16 *dest,
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void madd_2(DST *dest, const quint16 alpha, const SRC *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
- dest[0] = dest[0].byte_mul(alpha >> 8) + DST(src[0]);
- dest[1] = dest[1].byte_mul(alpha & 0xff) + DST(src[1]);
-}
-
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void madd_4(DST *dest, const quint32 alpha, const SRC *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
- dest[0] = dest[0].byte_mul(alpha >> 24) + DST(src[0]);
- dest[1] = dest[1].byte_mul((alpha >> 16) & 0xff) + DST(src[1]);
- dest[2] = dest[2].byte_mul((alpha >> 8) & 0xff) + DST(src[2]);
- dest[3] = dest[3].byte_mul(alpha & 0xff) + DST(src[3]);
-}
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void madd_4(qargb8565 *dest, const quint32 a, const qargb8565 *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 *src32 = reinterpret_cast<const quint32*>(src);
- quint32 *dest32 = reinterpret_cast<quint32*>(dest);
- quint32 x, y, t;
- quint8 a8;
-
- {
- x = dest32[0];
- y = src32[0];
-
- a8 = a >> 24;
-
- // a0,g0
- t = ((((x & 0x0007e0ff) * a8) >> 5) & 0x0007e0ff) + (y & 0x0007c0f8);
-
- // r0,b0
- t |= ((((x & 0x00f81f00) * a8) >> 5) & 0x00f81f00) + (y & 0x00f81f00);
-
- a8 = (a >> 16) & 0xff;
-
- // a1
- t |= ((((x & 0xff000000) >> 5) * a8) & 0xff000000) + (y & 0xf8000000);
-
- dest32[0] = t;
- }
- {
- x = dest32[1];
- y = src32[1];
-
- // r1,b1
- t = ((((x & 0x0000f81f) * a8) >> 5) & 0x0000f81f) + (y & 0x0000f81f);
-
- // g1
- t |= ((((x & 0x000007e0) * a8) >> 5) & 0x000007e0) + (y & 0x000007c0);
-
- a8 = (a >> 8) & 0xff;
-
- // a2
- t |= ((((x & 0x00ff0000) * a8) >> 5) & 0x00ff0000) + (y & 0x00f80000);
-
- {
- // rgb2
- quint16 x16 = (x >> 24) | ((dest32[2] & 0x000000ff) << 8);
- quint16 y16 = (y >> 24) | ((src32[2] & 0x000000ff) << 8);
- quint16 t16;
-
- t16 = ((((x16 & 0xf81f) * a8) >> 5) & 0xf81f) + (y16 & 0xf81f);
- t16 |= ((((x16 & 0x07e0) * a8) >> 5) & 0x07e0) + (y16 & 0x07c0);
-
- // rg2
- t |= ((t16 & 0x00ff) << 24);
-
- dest32[1] = t;
-
- x = dest32[2];
- y = src32[2];
-
- // gb2
- t = (t16 >> 8);
- }
- }
- {
- a8 = a & 0xff;
-
- // g3,a3
- t |= ((((x & 0x07e0ff00) * a8) >> 5) & 0x07e0ff00) + (y & 0x07c0f800);
-
- // r3,b3
- t |= ((((x & 0xf81f0000) >> 5) * a8) & 0xf81f0000)+ (y & 0xf81f0000);
-
- dest32[2] = t;
- }
-}
-#endif
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void madd_4(qargb8555 *dest, const quint32 a, const qargb8555 *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 *src32 = reinterpret_cast<const quint32*>(src);
- quint32 *dest32 = reinterpret_cast<quint32*>(dest);
- quint32 x, y, t;
- quint8 a8;
-
- {
- x = dest32[0];
- y = src32[0];
-
- a8 = a >> 24;
-
- // a0,g0
- t = ((((x & 0x0003e0ff) * a8) >> 5) & 0x0003e0ff) + (y & 0x0003e0f8);
-
- // r0,b0
- t |= ((((x & 0x007c1f00) * a8) >> 5) & 0x007c1f00) + (y & 0x007c1f00);
-
- a8 = (a >> 16) & 0xff;
-
- // a1
- t |= ((((x & 0xff000000) >> 5) * a8) & 0xff000000) + (y & 0xf8000000);
-
- dest32[0] = t;
- }
- {
- x = dest32[1];
- y = src32[1];
-
- // r1,b1
- t = ((((x & 0x00007c1f) * a8) >> 5) & 0x00007c1f) + (y & 0x00007c1f);
-
- // g1
- t |= ((((x & 0x000003e0) * a8) >> 5) & 0x000003e0) + (y & 0x000003e0);
-
- a8 = (a >> 8) & 0xff;
-
- // a2
- t |= ((((x & 0x00ff0000) * a8) >> 5) & 0x00ff0000) + (y & 0x00f80000);
-
- {
- // rgb2
- quint16 x16 = (x >> 24) | ((dest32[2] & 0x000000ff) << 8);
- quint16 y16 = (y >> 24) | ((src32[2] & 0x000000ff) << 8);
- quint16 t16;
-
- t16 = ((((x16 & 0x7c1f) * a8) >> 5) & 0x7c1f) + (y16 & 0x7c1f);
- t16 |= ((((x16 & 0x03e0) * a8) >> 5) & 0x03e0) + (y16 & 0x03e0);
-
- // rg2
- t |= ((t16 & 0x00ff) << 24);
-
- dest32[1] = t;
-
- x = dest32[2];
- y = src32[2];
-
- // gb2
- t = (t16 >> 8);
- }
- }
- {
- a8 = a & 0xff;
-
- // g3,a3
- t |= ((((x & 0x03e0ff00) * a8) >> 5) & 0x03e0ff00) + (y & 0x03e0f800);
-
- // r3,b3
- t |= ((((x & 0x7c1f0000) >> 5) * a8) & 0x7c1f0000)+ (y & 0x7c1f0000);
-
- dest32[2] = t;
- }
-}
-#endif
-
-template <class T>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 alpha_2(const T *src)
-{
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- if (T::hasAlpha())
- return (src[0].alpha() << 8) | src[1].alpha();
- else
- return 0xffff;
-}
-
-template <class T>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 alpha_4(const T *src)
-{
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- if (T::hasAlpha()) {
- return (src[0].alpha() << 24) | (src[1].alpha() << 16)
- | (src[2].alpha() << 8) | src[3].alpha();
- } else {
- return 0xffffffff;
- }
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 alpha_4(const qargb8565 *src)
-{
- const quint8 *src8 = reinterpret_cast<const quint8*>(src);
- return src8[0] << 24 | src8[3] << 16 | src8[6] << 8 | src8[9];
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 alpha_4(const qargb6666 *src)
-{
- const quint8 *src8 = reinterpret_cast<const quint8*>(src);
- return ((src8[2] & 0xfc) | (src8[2] >> 6)) << 24
- | ((src8[5] & 0xfc) | (src8[5] >> 6)) << 16
- | ((src8[8] & 0xfc) | (src8[8] >> 6)) << 8
- | ((src8[11] & 0xfc) | (src8[11] >> 6));
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 alpha_4(const qargb8555 *src)
-{
- Q_ASSERT((quintptr(src) & 0x3) == 0);
- const quint8 *src8 = reinterpret_cast<const quint8*>(src);
- return src8[0] << 24 | src8[3] << 16 | src8[6] << 8 | src8[9];
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 alpha_2(const qargb4444 *src)
-{
- const quint32 *src32 = reinterpret_cast<const quint32*>(src);
- const quint32 t = (*src32 & 0xf000f000) |
- ((*src32 & 0xf000f000) >> 4);
- return (t >> 24) | (t & 0xff00);
-}
-
-template <class T>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_alpha_2(quint16 alpha, const T*)
-{
- return (T::alpha((alpha >> 8) & 0xff) << 8)
- | T::alpha(alpha & 0xff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_alpha_2(quint16 a, const qrgb565*)
-{
- return ((((a & 0xff00) + 0x0100) >> 3) & 0xff00)
- | ((((a & 0x00ff) + 0x0001) >> 3) & 0x00ff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_alpha_2(quint16 a, const qrgb444*)
-{
- return (((a & 0x00ff) + 0x0001) >> 4)
- | ((((a & 0xff00) + 0x0100) >> 4) & 0xff00);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_alpha_2(quint16 a, const qargb4444*)
-{
- return (((a & 0x00ff) + 0x0001) >> 4)
- | ((((a & 0xff00) + 0x0100) >> 4) & 0xff00);
-}
-
-template <class T>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_ialpha_2(quint16 alpha, const T*)
-{
- return (T::ialpha((alpha >> 8) & 0xff) << 8)
- | T::ialpha(alpha & 0xff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_ialpha_2(quint16 a, const qrgb565 *dummy)
-{
- return 0x2020 - eff_alpha_2(a, dummy);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_ialpha_2(quint16 a, const qargb4444 *dummy)
-{
- return 0x1010 - eff_alpha_2(a, dummy);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint16 eff_ialpha_2(quint16 a, const qrgb444 *dummy)
-{
- return 0x1010 - eff_alpha_2(a, dummy);
-}
-
-template <class T>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_alpha_4(quint32 alpha, const T*)
-{
- return (T::alpha(alpha >> 24) << 24)
- | (T::alpha((alpha >> 16) & 0xff) << 16)
- | (T::alpha((alpha >> 8) & 0xff) << 8)
- | T::alpha(alpha & 0xff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_alpha_4(quint32 a, const qrgb888*)
-{
- return a;
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_alpha_4(quint32 a, const qargb8565*)
-{
- return ((((a & 0xff00ff00) + 0x01000100) >> 3) & 0xff00ff00)
- | ((((a & 0x00ff00ff) + 0x00010001) >> 3) & 0x00ff00ff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_alpha_4(quint32 a, const qargb6666*)
-{
- return ((((a & 0xff00ff00) >> 2) + 0x00400040) & 0xff00ff00)
- | ((((a & 0x00ff00ff) + 0x00010001) >> 2) & 0x00ff00ff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_alpha_4(quint32 a, const qrgb666*)
-{
- return ((((a & 0xff00ff00) >> 2) + 0x00400040) & 0xff00ff00)
- | ((((a & 0x00ff00ff) + 0x00010001) >> 2) & 0x00ff00ff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_alpha_4(quint32 a, const qargb8555*)
-{
- return ((((a & 0xff00ff00) + 0x01000100) >> 3) & 0xff00ff00)
- | ((((a & 0x00ff00ff) + 0x00010001) >> 3) & 0x00ff00ff);
-}
-
-template <class T>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_ialpha_4(quint32 alpha, const T*)
-{
- return (T::ialpha(alpha >> 24) << 24)
- | (T::ialpha((alpha >> 16) & 0xff) << 16)
- | (T::ialpha((alpha >> 8) & 0xff) << 8)
- | T::ialpha(alpha & 0xff);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_ialpha_4(quint32 a, const qrgb888*)
-{
- return ~a;
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_ialpha_4(quint32 a, const qargb8565 *dummy)
-{
- return 0x20202020 - eff_alpha_4(a, dummy);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_ialpha_4(quint32 a, const qargb6666 *dummy)
-{
- return 0x40404040 - eff_alpha_4(a, dummy);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_ialpha_4(quint32 a, const qrgb666 *dummy)
-{
- return 0x40404040 - eff_alpha_4(a, dummy);
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline quint32 eff_ialpha_4(quint32 a, const qargb8555 *dummy)
-{
- return 0x20202020 - eff_alpha_4(a, dummy);
-}
-
-template <class DST, class SRC>
-inline void interpolate_pixel_unaligned_2(DST *dest, const SRC *src,
- quint16 alpha)
-{
- const quint16 a = eff_alpha_2(alpha, dest);
- const quint16 ia = eff_ialpha_2(alpha, dest);
- dest[0] = DST(src[0]).byte_mul(a >> 8) + dest[0].byte_mul(ia >> 8);
- dest[1] = DST(src[1]).byte_mul(a & 0xff) + dest[1].byte_mul(ia & 0xff);
-}
-
-template <class DST, class SRC>
-inline void interpolate_pixel_2(DST *dest, const SRC *src, quint16 alpha)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint16 a = eff_alpha_2(alpha, dest);
- const quint16 ia = eff_ialpha_2(alpha, dest);
-
- dest[0] = DST(src[0]).byte_mul(a >> 8) + dest[0].byte_mul(ia >> 8);
- dest[1] = DST(src[1]).byte_mul(a & 0xff) + dest[1].byte_mul(ia & 0xff);
-}
-
-template <class DST, class SRC>
-inline void interpolate_pixel(DST &dest, quint8 a, const SRC &src, quint8 b)
-{
- if (SRC::hasAlpha() && !DST::hasAlpha())
- interpolate_pixel(dest, a, DST(src), b);
- else
- dest = dest.byte_mul(a) + DST(src).byte_mul(b);
-}
-
-template <>
-inline void interpolate_pixel(qargb8565 &dest, quint8 a,
- const qargb8565 &src, quint8 b)
-{
- quint8 *d = reinterpret_cast<quint8*>(&dest);
- const quint8 *s = reinterpret_cast<const quint8*>(&src);
- d[0] = (d[0] * a + s[0] * b) >> 5;
-
- const quint16 x = (d[2] << 8) | d[1];
- const quint16 y = (s[2] << 8) | s[1];
- quint16 t = (((x & 0x07e0) * a + (y & 0x07e0) * b) >> 5) & 0x07e0;
- t |= (((x & 0xf81f) * a + (y & 0xf81f) * b) >> 5) & 0xf81f;
-
- d[1] = t & 0xff;
- d[2] = t >> 8;
-}
-
-template <>
-inline void interpolate_pixel(qrgb565 &dest, quint8 a,
- const qrgb565 &src, quint8 b)
-{
- const quint16 x = dest.rawValue();
- const quint16 y = src.rawValue();
- quint16 t = (((x & 0x07e0) * a + (y & 0x07e0) * b) >> 5) & 0x07e0;
- t |= (((x & 0xf81f) * a + (y & 0xf81f) * b) >> 5) & 0xf81f;
- dest = t;
-}
-
-template <>
-inline void interpolate_pixel(qrgb555 &dest, quint8 a,
- const qrgb555 &src, quint8 b)
-{
- const quint16 x = dest.rawValue();
- const quint16 y = src.rawValue();
- quint16 t = (((x & 0x03e0) * a + (y & 0x03e0) * b) >> 5) & 0x03e0;
- t |= ((((x & 0x7c1f) * a) + ((y & 0x7c1f) * b)) >> 5) & 0x7c1f;
- dest = t;
-}
-
-template <>
-inline void interpolate_pixel(qrgb444 &dest, quint8 a,
- const qrgb444 &src, quint8 b)
-{
- const quint16 x = dest.rawValue();
- const quint16 y = src.rawValue();
- quint16 t = ((x & 0x00f0) * a + (y & 0x00f0) * b) & 0x0f00;
- t |= ((x & 0x0f0f) * a + (y & 0x0f0f) * b) & 0xf0f0;
- quint16 *d = reinterpret_cast<quint16*>(&dest);
- *d = (t >> 4);
-}
-
-template <class DST, class SRC>
-inline void interpolate_pixel_2(DST *dest, quint8 a,
- const SRC *src, quint8 b)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- Q_ASSERT(!SRC::hasAlpha());
-
- dest[0] = dest[0].byte_mul(a) + DST(src[0]).byte_mul(b);
- dest[1] = dest[1].byte_mul(a) + DST(src[1]).byte_mul(b);
-}
-
-template <>
-inline void interpolate_pixel_2(qrgb565 *dest, quint8 a,
- const qrgb565 *src, quint8 b)
-{
- quint32 *x = reinterpret_cast<quint32*>(dest);
- const quint32 *y = reinterpret_cast<const quint32*>(src);
- quint32 t = (((*x & 0xf81f07e0) >> 5) * a +
- ((*y & 0xf81f07e0) >> 5) * b) & 0xf81f07e0;
- t |= (((*x & 0x07e0f81f) * a
- + (*y & 0x07e0f81f) * b) >> 5) & 0x07e0f81f;
- *x = t;
-}
-
-template <>
-inline void interpolate_pixel_2(qrgb555 *dest, quint8 a,
- const qrgb555 *src, quint8 b)
-{
- quint32 *x = reinterpret_cast<quint32*>(dest);
- const quint32 *y = reinterpret_cast<const quint32*>(src);
- quint32 t = (((*x & 0x7c1f03e0) >> 5) * a +
- ((*y & 0x7c1f03e0) >> 5) * b) & 0x7c1f03e0;
- t |= (((*x & 0x03e07c1f) * a
- + (*y & 0x03e07c1f) * b) >> 5) & 0x03e07c1f;
- *x = t;
-}
-
-template <>
-inline void interpolate_pixel_2(qrgb444 *dest, quint8 a,
- const qrgb444 *src, quint8 b)
-{
- quint32 *x = reinterpret_cast<quint32*>(dest);
- const quint32 *y = reinterpret_cast<const quint32*>(src);
- quint32 t = ((*x & 0x0f0f0f0f) * a + (*y & 0x0f0f0f0f) * b) & 0xf0f0f0f0;
- t |= ((*x & 0x00f000f0) * a + (*y & 0x00f000f0) * b) & 0x0f000f00;
- *x = t >> 4;
-}
-
-template <class DST, class SRC>
-inline void interpolate_pixel_4(DST *dest, const SRC *src, quint32 alpha)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = eff_alpha_4(alpha, dest);
- const quint32 ia = eff_ialpha_4(alpha, dest);
- dest[0] = DST(src[0]).byte_mul(a >> 24)
- + dest[0].byte_mul(ia >> 24);
- dest[1] = DST(src[1]).byte_mul((a >> 16) & 0xff)
- + dest[1].byte_mul((ia >> 16) & 0xff);
- dest[2] = DST(src[2]).byte_mul((a >> 8) & 0xff)
- + dest[2].byte_mul((ia >> 8) & 0xff);
- dest[3] = DST(src[3]).byte_mul(a & 0xff)
- + dest[3].byte_mul(ia & 0xff);
-}
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-template <>
-inline void interpolate_pixel_4(qargb8565 *dest, const qargb8565 *src,
- quint32 alpha)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = eff_alpha_4(alpha, dest);
- const quint32 ia = eff_ialpha_4(alpha, dest);
- const quint32 *src32 = reinterpret_cast<const quint32*>(src);
- quint32 *dest32 = reinterpret_cast<quint32*>(dest);
-
- quint32 x, y, t;
- quint8 a8, ia8;
- {
- x = src32[0];
- y = dest32[0];
-
- a8 = a >> 24;
- ia8 = ia >> 24;
-
- // a0,g0
- t = (((x & 0x0007e0ff) * a8 + (y & 0x0007e0ff) * ia8) >> 5)
- & 0x0007e0ff;
-
- // r0,b0
- t |= (((x & 0x00f81f00) * a8 + (y & 0x00f81f00) * ia8) >> 5)
- & 0x00f81f00;
-
- a8 = (a >> 16) & 0xff;
- ia8 = (ia >> 16) & 0xff;
-
- // a1
- t |= (((x & 0xff000000) >> 5) * a8 + ((y & 0xff000000) >> 5) * ia8)
- & 0xff000000;
-
- dest32[0] = t;
- }
- {
- x = src32[1];
- y = dest32[1];
-
- // r1,b1
- t = (((x & 0x0000f81f) * a8 + (y & 0x0000f81f) * ia8) >> 5)
- & 0x0000f81f;
-
- // g1
- t |= (((x & 0x000007e0) * a8 + (y & 0x000007e0) * ia8) >> 5)
- & 0x000007e0;
-
- a8 = (a >> 8) & 0xff;
- ia8 = (ia >> 8) & 0xff;
-
- // a2
- t |= (((x & 0x00ff0000) * a8 + (y & 0x00ff0000) * ia8) >> 5)
- & 0x00ff0000;
-
- {
- // rgb2
- quint16 x16 = (x >> 24) | ((src32[2] & 0x000000ff) << 8);
- quint16 y16 = (y >> 24) | ((dest32[2] & 0x000000ff) << 8);
- quint16 t16;
-
- t16 = (((x16 & 0xf81f) * a8 + (y16 & 0xf81f) * ia8) >> 5) & 0xf81f;
- t16 |= (((x16 & 0x07e0) * a8 + (y16 & 0x07e0) * ia8) >> 5) & 0x07e0;
-
- // rg2
- t |= ((t16 & 0x00ff) << 24);
-
- dest32[1] = t;
-
- x = src32[2];
- y = dest32[2];
-
- // gb2
- t = (t16 >> 8);
- }
- }
- {
- a8 = a & 0xff;
- ia8 = ia & 0xff;
-
- // g3,a3
- t |= (((x & 0x07e0ff00) * a8 + (y & 0x07e0ff00) * ia8) >> 5)
- & 0x07e0ff00;
-
- // r3,b3
- t |= (((x & 0xf81f0000) >> 5) * a8 + ((y & 0xf81f0000) >> 5) * ia8)
- & 0xf81f0000;
-
- dest32[2] = t;
- }
-}
-#endif
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-template <>
-inline void interpolate_pixel_4(qargb8555 *dest, const qargb8555 *src,
- quint32 alpha)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
-
- const quint32 a = eff_alpha_4(alpha, dest);
- const quint32 ia = eff_ialpha_4(alpha, dest);
- const quint32 *src32 = reinterpret_cast<const quint32*>(src);
- quint32 *dest32 = reinterpret_cast<quint32*>(dest);
-
- quint32 x, y, t;
- quint8 a8, ia8;
- {
- x = src32[0];
- y = dest32[0];
-
- a8 = a >> 24;
- ia8 = ia >> 24;
-
- // a0,g0
- t = (((x & 0x0003e0ff) * a8 + (y & 0x0003e0ff) * ia8) >> 5)
- & 0x0003e0ff;
-
- // r0,b0
- t |= (((x & 0x007c1f00) * a8 + (y & 0x007c1f00) * ia8) >> 5)
- & 0x007c1f00;
-
- a8 = (a >> 16) & 0xff;
- ia8 = (ia >> 16) & 0xff;
-
- // a1
- t |= (((x & 0xff000000) >> 5) * a8 + ((y & 0xff000000) >> 5) * ia8)
- & 0xff000000;
-
- dest32[0] = t;
- }
- {
- x = src32[1];
- y = dest32[1];
-
- // r1,b1
- t = (((x & 0x00007c1f) * a8 + (y & 0x00007c1f) * ia8) >> 5)
- & 0x00007c1f;
-
- // g1
- t |= (((x & 0x000003e0) * a8 + (y & 0x000003e0) * ia8) >> 5)
- & 0x000003e0;
-
- a8 = (a >> 8) & 0xff;
- ia8 = (ia >> 8) & 0xff;
-
- // a2
- t |= (((x & 0x00ff0000) * a8 + (y & 0x00ff0000) * ia8) >> 5)
- & 0x00ff0000;
-
- {
- // rgb2
- quint16 x16 = (x >> 24) | ((src32[2] & 0x000000ff) << 8);
- quint16 y16 = (y >> 24) | ((dest32[2] & 0x000000ff) << 8);
- quint16 t16;
-
- t16 = (((x16 & 0x7c1f) * a8 + (y16 & 0x7c1f) * ia8) >> 5) & 0x7c1f;
- t16 |= (((x16 & 0x03e0) * a8 + (y16 & 0x03e0) * ia8) >> 5) & 0x03e0;
-
- // rg2
- t |= ((t16 & 0x00ff) << 24);
-
- dest32[1] = t;
-
- x = src32[2];
- y = dest32[2];
-
- // gb2
- t = (t16 >> 8);
- }
- }
- {
- a8 = a & 0xff;
- ia8 = ia & 0xff;
-
- // g3,a3
- t |= (((x & 0x03e0ff00) * a8 + (y & 0x03e0ff00) * ia8) >> 5)
- & 0x03e0ff00;
-
- // r3,b3
- t |= (((x & 0x7c1f0000) >> 5) * a8 + ((y & 0x7c1f0000) >> 5) * ia8)
- & 0x7c1f0000;
-
- dest32[2] = t;
- }
-}
-#endif
-
-template <>
-inline void interpolate_pixel_4(qrgb888 *dest, const qrgb888 *src,
- quint32 alpha)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = eff_alpha_4(alpha, dest);
- const quint32 ia = eff_ialpha_4(alpha, dest);
- const quint32 *src32 = reinterpret_cast<const quint32*>(src);
- quint32 *dest32 = reinterpret_cast<quint32*>(dest);
-
- {
- quint32 x = src32[0];
- quint32 y = dest32[0];
-
- quint32 t;
- t = ((x >> 8) & 0xff00ff) * (a >> 24)
- + ((y >> 8) & 0xff00ff) * (ia >> 24);
- t = (t + ((t >> 8) & 0xff00ff) + 0x800080);
- t &= 0xff00ff00;
-
- x = (x & 0xff0000) * (a >> 24)
- + (x & 0x0000ff) * ((a >> 16) & 0xff)
- + (y & 0xff0000) * (ia >> 24)
- + (y & 0x0000ff) * ((ia >> 16) & 0xff);
- x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8;
- x &= 0x00ff00ff;
-
- dest32[0] = x | t;
- }
- {
- quint32 x = src32[1];
- quint32 y = dest32[1];
-
- quint32 t;
- t = ((x >> 8) & 0xff0000) * ((a >> 16) & 0xff)
- + ((x >> 8) & 0x0000ff) * ((a >> 8) & 0xff)
- + ((y >> 8) & 0xff0000) * ((ia >> 16) & 0xff)
- + ((y >> 8) & 0x0000ff) * ((ia >> 8) & 0xff);
- t = (t + ((t >> 8) & 0xff00ff) + 0x800080);
- t &= 0xff00ff00;
-
- x = (x & 0xff0000) * ((a >> 16) & 0xff)
- + (x & 0x0000ff) * ((a >> 8) & 0xff)
- + (y & 0xff0000) * ((ia >> 16) & 0xff)
- + (y & 0x0000ff) * ((ia >> 8) & 0xff);
- x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8;
- x &= 0x00ff00ff;
-
- dest32[1] = x | t;
- }
- {
- quint32 x = src32[2];
- quint32 y = dest32[2];
-
- quint32 t;
- t = ((x >> 8) & 0xff0000) * ((a >> 8) & 0xff)
- + ((x >> 8) & 0x0000ff) * (a & 0xff)
- + ((y >> 8) & 0xff0000) * ((ia >> 8) & 0xff)
- + ((y >> 8) & 0x0000ff) * (ia & 0xff);
- t = (t + ((t >> 8) & 0xff00ff) + 0x800080);
- t &= 0xff00ff00;
-
- x = (x & 0xff00ff) * (a & 0xff)
- + (y & 0xff00ff) * (ia & 0xff);
- x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8;
- x &= 0x00ff00ff;
-
- dest32[2] = x | t;
- }
-}
-
-template <class DST, class SRC>
-inline void interpolate_pixel_4(DST *dest, quint8 a,
- const SRC *src, quint8 b)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- dest[0] = dest[0].byte_mul(a) + DST(src[0]).byte_mul(b);
- dest[1] = dest[1].byte_mul(a) + DST(src[1]).byte_mul(b);
- dest[2] = dest[2].byte_mul(a) + DST(src[2]).byte_mul(b);
- dest[3] = dest[3].byte_mul(a) + DST(src[3]).byte_mul(b);
-}
-
-template <class DST, class SRC>
-inline void blend_sourceOver_4(DST *dest, const SRC *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = alpha_4(src);
- if (a == 0xffffffff) {
- qt_memconvert(dest, src, 4);
- } else if (a > 0) {
- quint32 buf[3]; // array of quint32 to get correct alignment
- qt_memconvert((DST*)(void*)buf, src, 4);
- madd_4(dest, eff_ialpha_4(a, dest), (DST*)(void*)buf);
- }
-}
-
-template <>
-inline void blend_sourceOver_4(qargb8565 *dest, const qargb8565 *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = alpha_4(src);
- if (a == 0xffffffff) {
- qt_memconvert(dest, src, 4);
- } else if (a > 0) {
- madd_4(dest, eff_ialpha_4(a, dest), src);
- }
-}
-
-template <>
-inline void blend_sourceOver_4(qargb8555 *dest, const qargb8555 *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = alpha_4(src);
- if (a == 0xffffffff) {
- qt_memconvert(dest, src, 4);
- } else if (a > 0) {
- madd_4(dest, eff_ialpha_4(a, dest), src);
- }
-}
-
-template <>
-inline void blend_sourceOver_4(qargb6666 *dest, const qargb6666 *src)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == 0);
- Q_ASSERT((quintptr(src) & 0x3) == 0);
-
- const quint32 a = alpha_4(src);
- if (a == 0xffffffff) {
- qt_memconvert(dest, src, 4);
- } else if (a > 0) {
- madd_4(dest, eff_ialpha_4(a, dest), src);
- }
-}
-
-template <class DST, class SRC>
-void QT_FASTCALL blendUntransformed_unaligned(DST *dest, const SRC *src,
- quint8 coverage, int length)
-{
- Q_ASSERT(coverage > 0);
-
- if (coverage < 255) {
- if (SRC::hasAlpha()) {
- for (int i = 0; i < length; ++i) {
- if (src[i].alpha()) {
- const quint8 alpha = qt_div_255(int(src[i].alpha()) * int(coverage));
- interpolate_pixel(dest[i], DST::ialpha(alpha),
- src[i], DST::alpha(alpha));
- }
- }
- } else {
- const quint8 alpha = DST::alpha(coverage);
- const quint8 ialpha = DST::ialpha(coverage);
- if (alpha) {
- for (int i = 0; i < length; ++i)
- interpolate_pixel(dest[i], ialpha, src[i], alpha);
- }
- }
- return;
- }
-
- Q_ASSERT(coverage == 0xff);
- Q_ASSERT(SRC::hasAlpha());
-
- if (SRC::hasAlpha()) {
- for (int i = 0; i < length; ++i) {
- const quint8 a = src->alpha();
- if (a == 0xff)
- *dest = DST(*src);
- else if (a > 0) {
- if (DST::hasAlpha())
- *dest = DST(*src).truncedAlpha() + dest->byte_mul(DST::ialpha(a));
- else
- *dest = DST(SRC(*src).truncedAlpha()) + dest->byte_mul(DST::ialpha(a));
- }
- ++src;
- ++dest;
- }
- }
-}
-
-template <class DST, class SRC>
-void QT_FASTCALL blendUntransformed_dest16(DST *dest, const SRC *src,
- quint8 coverage, int length)
-{
- Q_ASSERT(sizeof(DST) == 2);
- Q_ASSERT(sizeof(SRC) == 2);
- Q_ASSERT((quintptr(dest) & 0x3) == (quintptr(src) & 0x3));
- Q_ASSERT(coverage > 0);
-
- const int align = quintptr(dest) & 0x3;
-
- if (coverage < 255) {
- // align
- if (align) {
- const quint8 alpha = SRC::hasAlpha()
- ? qt_div_255(int(src->alpha()) * int(coverage))
- : coverage;
- if (alpha) {
- interpolate_pixel(*dest, DST::ialpha(alpha),
- *src, DST::alpha(alpha));
- }
- ++dest;
- ++src;
- --length;
- }
-
- if (SRC::hasAlpha()) {
- while (length >= 2) {
- const quint16 alpha16 = BYTE_MUL(uint(alpha_2(src)), uint(coverage));
- interpolate_pixel_2(dest, src, alpha16);
- length -= 2;
- src += 2;
- dest += 2;
- }
- } else {
- const quint8 alpha = DST::alpha(coverage);
- const quint8 ialpha = DST::ialpha(coverage);
-
- while (length >= 2) {
- interpolate_pixel_2(dest, ialpha, src, alpha);
- length -= 2;
- src += 2;
- dest += 2;
- }
- }
-
- // tail
- if (length) {
- const quint8 alpha = SRC::hasAlpha()
- ? qt_div_255(int(src->alpha()) * int(coverage))
- : coverage;
- if (alpha) {
- interpolate_pixel(*dest, DST::ialpha(alpha),
- *src, DST::alpha(alpha));
- }
- }
-
- return;
- }
-
- Q_ASSERT(SRC::hasAlpha());
- if (SRC::hasAlpha()) {
- if (align) {
- const quint8 alpha = src->alpha();
- if (alpha == 0xff)
- *dest = DST(*src);
- else if (alpha > 0)
- *dest = DST(*src).truncedAlpha() + dest->byte_mul(DST::ialpha(alpha));
- ++dest;
- ++src;
- --length;
- }
-
- while (length >= 2) {
- Q_ASSERT((quintptr(dest) & 3) == 0);
- Q_ASSERT((quintptr(src) & 3) == 0);
-
- const quint16 a = alpha_2(src);
- if (a == 0xffff) {
- qt_memconvert(dest, src, 2);
- } else if (a > 0) {
- quint32 buf;
- if (sizeof(DST) == 2)
- qt_memconvert((DST*)(void*)&buf, src, 2);
- madd_2(dest, eff_ialpha_2(a, dest), (DST*)(void*)&buf);
- }
-
- length -= 2;
- src += 2;
- dest += 2;
- }
-
- if (length) {
- const quint8 alpha = src->alpha();
- if (alpha == 0xff)
- *dest = DST(*src);
- else if (alpha > 0)
- *dest = DST(*src).truncedAlpha() + dest->byte_mul(DST::ialpha(alpha));
- }
- }
-}
-
-template <class DST, class SRC>
-void QT_FASTCALL blendUntransformed_dest24(DST *dest, const SRC *src,
- quint8 coverage, int length)
-{
- Q_ASSERT((quintptr(dest) & 0x3) == (quintptr(src) & 0x3));
- Q_ASSERT(sizeof(DST) == 3);
- Q_ASSERT(coverage > 0);
-
- const int align = quintptr(dest) & 0x3;
-
- if (coverage < 255) {
- // align
- for (int i = 0; i < align; ++i) {
- if (SRC::hasAlpha()) {
- const quint8 alpha = qt_div_255(int(src->alpha()) * int(coverage));
- if (alpha)
- interpolate_pixel(*dest, DST::ialpha(alpha),
- *src, DST::alpha(alpha));
- } else {
- interpolate_pixel(*dest, DST::ialpha(coverage),
- *src, DST::alpha(coverage));
- }
- ++dest;
- ++src;
- --length;
- }
-
- if (SRC::hasAlpha()) {
- while (length >= 4) {
- const quint32 alpha = QT_PREPEND_NAMESPACE(BYTE_MUL)(uint(alpha_4(src)), uint(coverage));
- if (alpha)
- interpolate_pixel_4(dest, src, alpha);
- length -= 4;
- src += 4;
- dest += 4;
- }
- } else {
- const quint8 alpha = DST::alpha(coverage);
- const quint8 ialpha = DST::ialpha(coverage);
- while (length >= 4) {
- interpolate_pixel_4(dest, ialpha, src, alpha);
- length -= 4;
- src += 4;
- dest += 4;
- }
- }
-
- // tail
- while (length--) {
- if (SRC::hasAlpha()) {
- const quint8 alpha = qt_div_255(int(src->alpha()) * int(coverage));
- if (alpha)
- interpolate_pixel(*dest, DST::ialpha(alpha),
- *src, DST::alpha(alpha));
- } else {
- interpolate_pixel(*dest, DST::ialpha(coverage),
- *src, DST::alpha(coverage));
- }
- ++dest;
- ++src;
- }
-
- return;
- }
-
-
- Q_ASSERT(coverage == 255);
- Q_ASSERT(SRC::hasAlpha());
-
- if (SRC::hasAlpha()) {
- // align
- for (int i = 0; i < align; ++i) {
- const quint8 a = src->alpha();
- if (a == 0xff) {
- *dest = DST(*src);
- } else if (a > 0) {
- *dest = DST(*src).truncedAlpha() + dest->byte_mul(DST::ialpha(a));
- }
- ++dest;
- ++src;
- --length;
- }
-
- while (length >= 4) {
- blend_sourceOver_4(dest, src);
- length -= 4;
- src += 4;
- dest += 4;
- }
-
- // tail
- while (length--) {
- const quint8 a = src->alpha();
- if (a == 0xff) {
- *dest = DST(*src);
- } else if (a > 0) {
- *dest = DST(*src).truncedAlpha() + dest->byte_mul(DST::ialpha(a));
- }
- ++dest;
- ++src;
- }
- }
-}
-
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-void QT_FASTCALL blendUntransformed(int count, const QSpan *spans, void *userData)
+static void blend_untransformed_rgb565(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData*>(userData);
QPainter::CompositionMode mode = data->rasterBuffer->compositionMode;
- if (mode != QPainter::CompositionMode_SourceOver &&
- mode != QPainter::CompositionMode_Source)
+ if (data->texture.format != QImage::Format_RGB16
+ || (mode != QPainter::CompositionMode_SourceOver
+ && mode != QPainter::CompositionMode_Source))
{
- blend_src_generic<RegularSpans>(count, spans, userData);
+ blend_untransformed_generic(count, spans, userData);
return;
}
- const bool modeSource = !SRC::hasAlpha() ||
- mode == QPainter::CompositionMode_Source;
const int image_width = data->texture.width;
const int image_height = data->texture.height;
int xoff = -qRound(-data->dx);
@@ -4917,20 +4118,15 @@ void QT_FASTCALL blendUntransformed(int count, const QSpan *spans, void *userDat
if (sx + length > image_width)
length = image_width - sx;
if (length > 0) {
- DST *dest = ((DST*)data->rasterBuffer->scanLine(spans->y)) + x;
- const SRC *src = (SRC*)data->texture.scanLine(sy) + sx;
- if (modeSource && coverage == 255) {
- qt_memconvert<DST, SRC>(dest, src, length);
- } else if (sizeof(DST) == 3 && sizeof(SRC) == 3 && length >= 3 &&
- (quintptr(dest) & 3) == (quintptr(src) & 3))
- {
- blendUntransformed_dest24(dest, src, coverage, length);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && length >= 3 &&
- (quintptr(dest) & 3) == (quintptr(src) & 3))
- {
- blendUntransformed_dest16(dest, src, coverage, length);
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + x;
+ const quint16 *src = (quint16 *)data->texture.scanLine(sy) + sx;
+ if (coverage == 255) {
+ memcpy(dest, src, length * sizeof(quint16));
} else {
- blendUntransformed_unaligned(dest, src, coverage, length);
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha > 0)
+ blend_sourceOver_rgb16_rgb16(dest, src, length, alpha, ialpha);
}
}
}
@@ -4938,69 +4134,7 @@ void QT_FASTCALL blendUntransformed(int count, const QSpan *spans, void *userDat
}
}
-static void blend_untransformed_rgb888(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_argb6666(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_rgb666(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_argb8565(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_rgb565(int count, const QSpan *spans,
- void *userData)
-{
- QSpanData *data = reinterpret_cast<QSpanData *>(userData);
-
- if (data->texture.format == QImage::Format_ARGB8565_Premultiplied)
- blendUntransformed<qrgb565, qargb8565>(count, spans, userData);
- else if (data->texture.format == QImage::Format_RGB16)
- blendUntransformed<qrgb565, qrgb565>(count, spans, userData);
- else
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_argb8555(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_rgb555(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_argb4444(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_untransformed_rgb444(int count, const QSpan *spans,
- void *userData)
-{
- blend_untransformed_generic<RegularSpans>(count, spans, userData);
-}
-
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_tiled_generic(int count, const QSpan *spans, void *userData)
+static void blend_tiled_generic(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
@@ -5034,15 +4168,10 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_tiled_generic(int count, const QSpan *span
if (buffer_size < l)
l = buffer_size;
const uint *src = op.src_fetch(src_buffer, &op, data, sy, sx, l);
- if (spanMethod == RegularSpans) {
- uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer;
- op.func(dest, src, l, coverage);
- if (op.dest_store)
- op.dest_store(data->rasterBuffer, x, spans->y, dest, l);
- } else {
- drawBufferSpan(data, src, l, x, spans->y, l,
- coverage);
- }
+ uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer;
+ op.func(dest, src, l, coverage);
+ if (op.dest_store)
+ op.dest_store(data->rasterBuffer, x, spans->y, dest, l);
x += l;
sx += l;
length -= l;
@@ -5053,13 +4182,12 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_tiled_generic(int count, const QSpan *span
}
}
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_tiled_argb(int count, const QSpan *spans, void *userData)
+static void blend_tiled_argb(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
if (data->texture.format != QImage::Format_ARGB32_Premultiplied
&& data->texture.format != QImage::Format_RGB32) {
- blend_tiled_generic<spanMethod>(count, spans, userData);
+ blend_tiled_generic(count, spans, userData);
return;
}
@@ -5091,13 +4219,8 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_tiled_argb(int count, const QSpan *spans,
if (buffer_size < l)
l = buffer_size;
const uint *src = (uint *)data->texture.scanLine(sy) + sx;
- if (spanMethod == RegularSpans) {
- uint *dest = ((uint *)data->rasterBuffer->scanLine(spans->y)) + x;
- op.func(dest, src, l, coverage);
- } else {
- drawBufferSpan(data, src, buffer_size,
- x, spans->y, l, coverage);
- }
+ uint *dest = ((uint *)data->rasterBuffer->scanLine(spans->y)) + x;
+ op.func(dest, src, l, coverage);
x += l;
length -= l;
sx = 0;
@@ -5106,21 +4229,19 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_tiled_argb(int count, const QSpan *spans,
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION void blendTiled(int count, const QSpan *spans, void *userData)
+static void blend_tiled_rgb565(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData*>(userData);
QPainter::CompositionMode mode = data->rasterBuffer->compositionMode;
- if (mode != QPainter::CompositionMode_SourceOver &&
- mode != QPainter::CompositionMode_Source)
+ if (data->texture.format != QImage::Format_RGB16
+ || (mode != QPainter::CompositionMode_SourceOver
+ && mode != QPainter::CompositionMode_Source))
{
- blend_src_generic<RegularSpans>(count, spans, userData);
+ blend_tiled_generic(count, spans, userData);
return;
}
- const bool modeSource = !SRC::hasAlpha() ||
- mode == QPainter::CompositionMode_Source;
const int image_width = data->texture.width;
const int image_height = data->texture.height;
int xoff = -qRound(-data->dx) % image_width;
@@ -5147,7 +4268,7 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTiled(int count, const QSpan *spans, void *
if (sy < 0)
sy += image_height;
- if (modeSource && coverage == 255) {
+ if (coverage == 255) {
// Copy the first texture block
length = qMin(image_width,length);
int tx = x;
@@ -5155,10 +4276,9 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTiled(int count, const QSpan *spans, void *
int l = qMin(image_width - sx, length);
if (buffer_size < l)
l = buffer_size;
- DST *dest = ((DST*)data->rasterBuffer->scanLine(spans->y)) + tx;
- const SRC *src = (SRC*)data->texture.scanLine(sy) + sx;
-
- qt_memconvert<DST, SRC>(dest, src, l);
+ quint16 *dest = ((quint16 *)data->rasterBuffer->scanLine(spans->y)) + tx;
+ const quint16 *src = (quint16 *)data->texture.scanLine(sy) + sx;
+ memcpy(dest, src, l * sizeof(quint16));
length -= l;
tx += l;
sx = 0;
@@ -5172,110 +4292,51 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTiled(int count, const QSpan *spans, void *
// - can use memcpy
int copy_image_width = qMin(image_width, int(spans->len));
length = spans->len - copy_image_width;
- DST *src = ((DST*)data->rasterBuffer->scanLine(spans->y)) + x;
- DST *dest = src + copy_image_width;
+ quint16 *src = ((quint16 *)data->rasterBuffer->scanLine(spans->y)) + x;
+ quint16 *dest = src + copy_image_width;
while (copy_image_width < length) {
- qt_memconvert(dest, src, copy_image_width);
+ memcpy(dest, src, copy_image_width * sizeof(quint16));
dest += copy_image_width;
length -= copy_image_width;
copy_image_width *= 2;
}
if (length > 0)
- qt_memconvert(dest, src, length);
+ memcpy(dest, src, length * sizeof(quint16));
} else {
- while (length) {
- int l = qMin(image_width - sx, length);
- if (buffer_size < l)
- l = buffer_size;
- DST *dest = ((DST*)data->rasterBuffer->scanLine(spans->y)) + x;
- const SRC *src = (SRC*)data->texture.scanLine(sy) + sx;
- if (sizeof(DST) == 3 && sizeof(SRC) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(src) & 3))
- {
- blendUntransformed_dest24(dest, src, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(src) & 3))
- {
- blendUntransformed_dest16(dest, src, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, src, coverage, l);
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha > 0) {
+ while (length) {
+ int l = qMin(image_width - sx, length);
+ if (buffer_size < l)
+ l = buffer_size;
+ quint16 *dest = ((quint16 *)data->rasterBuffer->scanLine(spans->y)) + x;
+ const quint16 *src = (quint16 *)data->texture.scanLine(sy) + sx;
+ blend_sourceOver_rgb16_rgb16(dest, src, l, alpha, ialpha);
+ x += l;
+ length -= l;
+ sx = 0;
}
-
- x += l;
- length -= l;
- sx = 0;
}
}
++spans;
}
}
-static void blend_tiled_rgb888(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_argb6666(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_rgb666(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_argb8565(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_rgb565(int count, const QSpan *spans, void *userData)
-{
- QSpanData *data = reinterpret_cast<QSpanData *>(userData);
-
- if (data->texture.format == QImage::Format_ARGB8565_Premultiplied)
- blendTiled<qrgb565, qargb8565>(count, spans, userData);
- else if (data->texture.format == QImage::Format_RGB16)
- blendTiled<qrgb565, qrgb565>(count, spans, userData);
- else
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_argb8555(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_rgb555(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_argb4444(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_tiled_rgb444(int count, const QSpan *spans, void *userData)
-{
- blend_tiled_generic<RegularSpans>(count, spans, userData);
-}
-
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan *spans,
- void *userData)
+static void blend_transformed_bilinear_rgb565(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData*>(userData);
QPainter::CompositionMode mode = data->rasterBuffer->compositionMode;
-
- if (mode != QPainter::CompositionMode_SourceOver) {
- blend_src_generic<RegularSpans>(count, spans, userData);
+ if (data->texture.format != QImage::Format_RGB16
+ || (mode != QPainter::CompositionMode_SourceOver
+ && mode != QPainter::CompositionMode_Source))
+ {
+ blend_src_generic(count, spans, userData);
return;
}
- SRC buffer[buffer_size];
+ quint16 buffer[buffer_size];
const int src_minx = data->texture.x1;
const int src_miny = data->texture.y1;
@@ -5289,13 +4350,14 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan
while (count--) {
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
- if (coverage == 0) {
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha == 0) {
++spans;
continue;
}
- DST *dest = (DST*)data->rasterBuffer->scanLine(spans->y)
- + spans->x;
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + spans->x;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
int x = int((data->m21 * cy
@@ -5305,84 +4367,58 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan
int length = spans->len;
while (length) {
- const int l = qMin(length, buffer_size);
+ int l;
+ quint16 *b;
+ if (ialpha == 0) {
+ l = length;
+ b = dest;
+ } else {
+ l = qMin(length, buffer_size);
+ b = buffer;
+ }
+ const quint16 *end = b + l;
- const SRC *end = buffer + l;
- SRC *b = buffer;
while (b < end) {
int x1 = (x >> 16);
int x2;
int y1 = (y >> 16);
int y2;
- const int distx = (x & 0x0000ffff) >> 8;
- const int disty = (y & 0x0000ffff) >> 8;
+ fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(0, src_minx, src_maxx, x1, x2);
+ fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(0, src_miny, src_maxy, y1, y2);
+
+ const quint16 *src1 = (quint16*)data->texture.scanLine(y1);
+ const quint16 *src2 = (quint16*)data->texture.scanLine(y2);
+ quint16 tl = src1[x1];
+ const quint16 tr = src1[x2];
+ quint16 bl = src2[x1];
+ const quint16 br = src2[x2];
+
+ const uint distxsl8 = x & 0xff00;
+ const uint distysl8 = y & 0xff00;
+ const uint distx = distxsl8 >> 8;
+ const uint disty = distysl8 >> 8;
+ const uint distxy = distx * disty;
+
+ const uint tlw = 0x10000 - distxsl8 - distysl8 + distxy; // (256 - distx) * (256 - disty)
+ const uint trw = distxsl8 - distxy; // distx * (256 - disty)
+ const uint blw = distysl8 - distxy; // (256 - distx) * disty
+ const uint brw = distxy; // distx * disty
+ uint red = ((tl & 0xf800) * tlw + (tr & 0xf800) * trw
+ + (bl & 0xf800) * blw + (br & 0xf800) * brw) & 0xf8000000;
+ uint green = ((tl & 0x07e0) * tlw + (tr & 0x07e0) * trw
+ + (bl & 0x07e0) * blw + (br & 0x07e0) * brw) & 0x07e00000;
+ uint blue = ((tl & 0x001f) * tlw + (tr & 0x001f) * trw
+ + (bl & 0x001f) * blw + (br & 0x001f) * brw);
+ *b = quint16((red | green | blue) >> 16);
- if (x1 < src_minx) {
- x2 = x1 = src_minx;
- } else if (x1 >= src_maxx) {
- x2 = x1 = src_maxx;
- } else {
- x2 = x1 + 1;
- }
- if (y1 < src_miny) {
- y2 = y1 = src_miny;
- } else if (y1 >= src_maxy) {
- y2 = y1 = src_maxy;
- } else {
- y2 = y1 + 1;
- }
-#if 0
- if (x1 == x2) {
- if (y1 == y2) {
- *b = ((SRC*)data->texture.scanLine(y1))[x1];
- } else {
- *b = ((SRC*)data->texture.scanLine(y1))[x1];
- const SRC t = data->texture.scanLine(y2)[x1];
- interpolate_pixel(*b, SRC::ialpha(disty),
- t, SRC::alpha(disty));
- }
- } else if (y1 == y2) {
- *b = ((SRC*)data->texture.scanLine(y1))[x1];
- const SRC t = ((SRC*)data->texture.scanLine(y1))[x2];
- interpolate_pixel(*b, SRC::ialpha(distx),
- t, SRC::alpha(distx));
- } else
-#endif
- {
- const SRC *src1 = (SRC*)data->texture.scanLine(y1);
- const SRC *src2 = (SRC*)data->texture.scanLine(y2);
- SRC tl = src1[x1];
- const SRC tr = src1[x2];
- SRC bl = src2[x1];
- const SRC br = src2[x2];
- const quint8 ax = SRC::alpha(distx);
- const quint8 iax = SRC::ialpha(distx);
-
- interpolate_pixel(tl, iax, tr, ax);
- interpolate_pixel(bl, iax, br, ax);
- interpolate_pixel(tl, SRC::ialpha(disty),
- bl, SRC::alpha(disty));
- *b = tl;
- }
++b;
-
x += fdx;
y += fdy;
}
- if (!SRC::hasAlpha() && coverage == 255) {
- qt_memconvert(dest, buffer, l);
- } else if (sizeof(DST) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3))
- {
- blendUntransformed_dest24(dest, buffer, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3)) {
- blendUntransformed_dest16(dest, buffer, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, buffer, coverage, l);
- }
+ if (ialpha != 0)
+ blend_sourceOver_rgb16_rgb16(dest, buffer, l, alpha, ialpha);
dest += l;
length -= l;
@@ -5396,13 +4432,14 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan
while (count--) {
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
- if (coverage == 0) {
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha == 0) {
++spans;
continue;
}
- DST *dest = (DST*)data->rasterBuffer->scanLine(spans->y)
- + spans->x;
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + spans->x;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
@@ -5413,9 +4450,17 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan
int length = spans->len;
while (length) {
- const int l = qMin(length, buffer_size);
- const SRC *end = buffer + l;
- SRC *b = buffer;
+ int l;
+ quint16 *b;
+ if (ialpha == 0) {
+ l = length;
+ b = dest;
+ } else {
+ l = qMin(length, buffer_size);
+ b = buffer;
+ }
+ const quint16 *end = b + l;
+
while (b < end) {
const qreal iw = w == 0 ? 1 : 1 / w;
const qreal px = x * iw - qreal(0.5);
@@ -5426,56 +4471,42 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan
int y1 = int(py) - (py < 0);
int y2;
- const int distx = int((px - x1) * 256);
- const int disty = int((py - y1) * 256);
+ fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(0, src_minx, src_maxx, x1, x2);
+ fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(0, src_miny, src_maxy, y1, y2);
+
+ const quint16 *src1 = (quint16 *)data->texture.scanLine(y1);
+ const quint16 *src2 = (quint16 *)data->texture.scanLine(y2);
+ quint16 tl = src1[x1];
+ const quint16 tr = src1[x2];
+ quint16 bl = src2[x1];
+ const quint16 br = src2[x2];
+
+ const uint distx = uint((px - x1) * 256);
+ const uint disty = uint((py - y1) * 256);
+ const uint distxsl8 = distx << 8;
+ const uint distysl8 = disty << 8;
+ const uint distxy = distx * disty;
+
+ const uint tlw = 0x10000 - distxsl8 - distysl8 + distxy; // (256 - distx) * (256 - disty)
+ const uint trw = distxsl8 - distxy; // distx * (256 - disty)
+ const uint blw = distysl8 - distxy; // (256 - distx) * disty
+ const uint brw = distxy; // distx * disty
+ uint red = ((tl & 0xf800) * tlw + (tr & 0xf800) * trw
+ + (bl & 0xf800) * blw + (br & 0xf800) * brw) & 0xf8000000;
+ uint green = ((tl & 0x07e0) * tlw + (tr & 0x07e0) * trw
+ + (bl & 0x07e0) * blw + (br & 0x07e0) * brw) & 0x07e00000;
+ uint blue = ((tl & 0x001f) * tlw + (tr & 0x001f) * trw
+ + (bl & 0x001f) * blw + (br & 0x001f) * brw);
+ *b = quint16((red | green | blue) >> 16);
- if (x1 < src_minx) {
- x2 = x1 = src_minx;
- } else if (x1 >= src_maxx) {
- x2 = x1 = src_maxx;
- } else {
- x2 = x1 + 1;
- }
- if (y1 < src_miny) {
- y2 = y1 = src_miny;
- } else if (y1 >= src_maxy) {
- y2 = y1 = src_maxy;
- } else {
- y2 = y1 + 1;
- }
-
- const SRC *src1 = (SRC*)data->texture.scanLine(y1);
- const SRC *src2 = (SRC*)data->texture.scanLine(y2);
- SRC tl = src1[x1];
- const SRC tr = src1[x2];
- SRC bl = src2[x1];
- const SRC br = src2[x2];
- const quint8 ax = SRC::alpha(distx);
- const quint8 iax = SRC::ialpha(distx);
-
- interpolate_pixel(tl, iax, tr, ax);
- interpolate_pixel(bl, iax, br, ax);
- interpolate_pixel(tl, SRC::ialpha(disty),
- bl, SRC::alpha(disty));
- *b = tl;
++b;
-
x += fdx;
y += fdy;
w += fdw;
}
- if (!SRC::hasAlpha() && coverage == 255) {
- qt_memconvert(dest, buffer, l);
- } else if (sizeof(DST) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3))
- {
- blendUntransformed_dest24(dest, buffer, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3)) {
- blendUntransformed_dest16(dest, buffer, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, buffer, coverage, l);
- }
+
+ if (ialpha != 0)
+ blend_sourceOver_rgb16_rgb16(dest, buffer, l, alpha, ialpha);
dest += l;
length -= l;
@@ -5485,66 +4516,12 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedBilinear(int count, const QSpan
}
}
-static void blend_transformed_bilinear_rgb888(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_argb6666(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_rgb666(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_argb8565(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_rgb565(int count, const QSpan *spans,
- void *userData)
-{
- QSpanData *data = reinterpret_cast<QSpanData *>(userData);
-
- if (data->texture.format == QImage::Format_RGB16)
- blendTransformedBilinear<qrgb565, qrgb565>(count, spans, userData);
- else if (data->texture.format == QImage::Format_ARGB8565_Premultiplied)
- blendTransformedBilinear<qrgb565, qargb8565>(count, spans, userData);
- else
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_argb8555(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_rgb555(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_argb4444(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_bilinear_rgb444(int count, const QSpan *spans, void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *spans, void *userData)
+static void blend_transformed_argb(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
if (data->texture.format != QImage::Format_ARGB32_Premultiplied
&& data->texture.format != QImage::Format_RGB32) {
- blend_src_generic<spanMethod>(count, spans, userData);
+ blend_src_generic(count, spans, userData);
return;
}
@@ -5553,7 +4530,6 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *s
int image_width = data->texture.width;
int image_height = data->texture.height;
- const int scanline_offset = data->texture.bytesPerLine / 4;
if (data->fast_matrix) {
// The increment pr x in the scanline
@@ -5564,7 +4540,6 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *s
void *t = data->rasterBuffer->scanLine(spans->y);
uint *target = ((uint *)t) + spans->x;
- uint *image_bits = (uint *)data->texture.imageData;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
@@ -5581,24 +4556,15 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *s
const uint *end = buffer + l;
uint *b = buffer;
while (b < end) {
- int px = x >> 16;
- int py = y >> 16;
-
- bool out = (px < 0) || (px >= image_width)
- || (py < 0) || (py >= image_height);
+ int px = qBound(0, x >> 16, image_width - 1);
+ int py = qBound(0, y >> 16, image_height - 1);
+ *b = reinterpret_cast<const uint *>(data->texture.scanLine(py))[px];
- int y_offset = py * scanline_offset;
- *b = out ? uint(0) : image_bits[y_offset + px];
x += fdx;
y += fdy;
++b;
}
- if (spanMethod == RegularSpans)
- func(target, buffer, l, coverage);
- else
- drawBufferSpan(data, buffer, buffer_size,
- spans->x + spans->len - length,
- spans->y, l, coverage);
+ func(target, buffer, l, coverage);
target += l;
length -= l;
}
@@ -5612,7 +4578,6 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *s
void *t = data->rasterBuffer->scanLine(spans->y);
uint *target = ((uint *)t) + spans->x;
- uint *image_bits = (uint *)data->texture.imageData;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
@@ -5631,26 +4596,17 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *s
const qreal iw = w == 0 ? 1 : 1 / w;
const qreal tx = x * iw;
const qreal ty = y * iw;
- const int px = int(tx) - (tx < 0);
- const int py = int(ty) - (ty < 0);
+ const int px = qBound(0, int(tx) - (tx < 0), image_width - 1);
+ const int py = qBound(0, int(ty) - (ty < 0), image_height - 1);
- bool out = (px < 0) || (px >= image_width)
- || (py < 0) || (py >= image_height);
-
- int y_offset = py * scanline_offset;
- *b = out ? uint(0) : image_bits[y_offset + px];
+ *b = reinterpret_cast<const uint *>(data->texture.scanLine(py))[px];
x += fdx;
y += fdy;
w += fdw;
++b;
}
- if (spanMethod == RegularSpans)
- func(target, buffer, l, coverage);
- else
- drawBufferSpan(data, buffer, buffer_size,
- spans->x + spans->len - length,
- spans->y, l, coverage);
+ func(target, buffer, l, coverage);
target += l;
length -= l;
}
@@ -5659,18 +4615,20 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_argb(int count, const QSpan *s
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION void blendTransformed(int count, const QSpan *spans, void *userData)
+static void blend_transformed_rgb565(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData*>(userData);
QPainter::CompositionMode mode = data->rasterBuffer->compositionMode;
- if (mode != QPainter::CompositionMode_SourceOver) {
- blend_src_generic<RegularSpans>(count, spans, userData);
+ if (data->texture.format != QImage::Format_RGB16
+ || (mode != QPainter::CompositionMode_SourceOver
+ && mode != QPainter::CompositionMode_Source))
+ {
+ blend_src_generic(count, spans, userData);
return;
}
- SRC buffer[buffer_size];
+ quint16 buffer[buffer_size];
const int image_width = data->texture.width;
const int image_height = data->texture.height;
@@ -5681,13 +4639,14 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformed(int count, const QSpan *spans,
while (count--) {
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
- if (coverage == 0) {
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha == 0) {
++spans;
continue;
}
- DST *dest = (DST*)data->rasterBuffer->scanLine(spans->y)
- + spans->x;
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + spans->x;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
int x = int((data->m21 * cy
@@ -5697,39 +4656,30 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformed(int count, const QSpan *spans,
int length = spans->len;
while (length) {
- const int l = qMin(length, buffer_size);
+ int l;
+ quint16 *b;
+ if (ialpha == 0) {
+ l = length;
+ b = dest;
+ } else {
+ l = qMin(length, buffer_size);
+ b = buffer;
+ }
+ const quint16 *end = b + l;
- const SRC *end = buffer + l;
- SRC *b = buffer;
while (b < end) {
- const int px = (x >> 16);
- const int py = (y >> 16);
+ const int px = qBound(0, x >> 16, image_width - 1);
+ const int py = qBound(0, y >> 16, image_height - 1);
- if ((px < 0) || (px >= image_width) ||
- (py < 0) || (py >= image_height))
- {
- *b = 0;
- } else {
- *b = ((SRC*)data->texture.scanLine(py))[px];
- }
+ *b = ((quint16 *)data->texture.scanLine(py))[px];
++b;
x += fdx;
y += fdy;
}
- if (!SRC::hasAlpha() && coverage == 255) {
- qt_memconvert(dest, buffer, l);
- } else if (sizeof(DST) == 3 && sizeof(SRC) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3))
- {
- blendUntransformed_dest24(dest, buffer, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3)) {
- blendUntransformed_dest16(dest, buffer, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, buffer, coverage, l);
- }
+ if (ialpha != 0)
+ blend_sourceOver_rgb16_rgb16(dest, buffer, l, alpha, ialpha);
dest += l;
length -= l;
@@ -5743,13 +4693,14 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformed(int count, const QSpan *spans,
while (count--) {
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
- if (coverage == 0) {
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha == 0) {
++spans;
continue;
}
- DST *dest = (DST*)data->rasterBuffer->scanLine(spans->y)
- + spans->x;
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + spans->x;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
@@ -5760,42 +4711,35 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformed(int count, const QSpan *spans,
int length = spans->len;
while (length) {
- const int l = qMin(length, buffer_size);
- const SRC *end = buffer + l;
- SRC *b = buffer;
+ int l;
+ quint16 *b;
+ if (ialpha == 0) {
+ l = length;
+ b = dest;
+ } else {
+ l = qMin(length, buffer_size);
+ b = buffer;
+ }
+ const quint16 *end = b + l;
+
while (b < end) {
const qreal iw = w == 0 ? 1 : 1 / w;
const qreal tx = x * iw;
const qreal ty = y * iw;
- const int px = int(tx) - (tx < 0);
- const int py = int(ty) - (ty < 0);
+ const int px = qBound(0, int(tx) - (tx < 0), image_width - 1);
+ const int py = qBound(0, int(ty) - (ty < 0), image_height - 1);
- if ((px < 0) || (px >= image_width) ||
- (py < 0) || (py >= image_height))
- {
- *b = 0;
- } else {
- *b = ((SRC*)data->texture.scanLine(py))[px];
- }
+ *b = ((quint16 *)data->texture.scanLine(py))[px];
++b;
x += fdx;
y += fdy;
w += fdw;
}
- if (!SRC::hasAlpha() && coverage == 255) {
- qt_memconvert(dest, buffer, l);
- } else if (sizeof(DST) == 3 && sizeof(SRC) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3))
- {
- blendUntransformed_dest24(dest, buffer, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3)) {
- blendUntransformed_dest16(dest, buffer, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, buffer, coverage, l);
- }
+
+ if (ialpha != 0)
+ blend_sourceOver_rgb16_rgb16(dest, buffer, l, alpha, ialpha);
dest += l;
length -= l;
@@ -5805,74 +4749,12 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformed(int count, const QSpan *spans,
}
}
-static void blend_transformed_rgb888(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_argb6666(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_rgb666(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_argb8565(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_rgb565(int count, const QSpan *spans,
- void *userData)
-{
- QSpanData *data = reinterpret_cast<QSpanData *>(userData);
-
- if (data->texture.format == QImage::Format_ARGB8565_Premultiplied)
- blendTransformed<qrgb565, qargb8565>(count, spans, userData);
- else if (data->texture.format == QImage::Format_RGB16)
- blendTransformed<qrgb565, qrgb565>(count, spans, userData);
- else
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_argb8555(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_rgb555(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_argb4444(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_rgb444(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-template <SpanMethod spanMethod>
-Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_tiled_argb(int count, const QSpan *spans, void *userData)
+static void blend_transformed_tiled_argb(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
if (data->texture.format != QImage::Format_ARGB32_Premultiplied
&& data->texture.format != QImage::Format_RGB32) {
- blend_src_generic<spanMethod>(count, spans, userData);
+ blend_src_generic(count, spans, userData);
return;
}
@@ -5925,12 +4807,7 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_tiled_argb(int count, const QS
y += fdy;
++b;
}
- if (spanMethod == RegularSpans)
- func(target, buffer, l, coverage);
- else
- drawBufferSpan(data, buffer, buffer_size,
- spans->x + spans->len - length,
- spans->y, l, coverage);
+ func(target, buffer, l, coverage);
target += l;
length -= l;
}
@@ -5985,12 +4862,7 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_tiled_argb(int count, const QS
}
++b;
}
- if (spanMethod == RegularSpans)
- func(target, buffer, l, coverage);
- else
- drawBufferSpan(data, buffer, buffer_size,
- spans->x + spans->len - length,
- spans->y, l, coverage);
+ func(target, buffer, l, coverage);
target += l;
length -= l;
}
@@ -5999,18 +4871,20 @@ Q_STATIC_TEMPLATE_FUNCTION void blend_transformed_tiled_argb(int count, const QS
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *spans, void *userData)
+static void blend_transformed_tiled_rgb565(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData*>(userData);
QPainter::CompositionMode mode = data->rasterBuffer->compositionMode;
- if (mode != QPainter::CompositionMode_SourceOver) {
- blend_src_generic<RegularSpans>(count, spans, userData);
+ if (data->texture.format != QImage::Format_RGB16
+ || (mode != QPainter::CompositionMode_SourceOver
+ && mode != QPainter::CompositionMode_Source))
+ {
+ blend_src_generic(count, spans, userData);
return;
}
- SRC buffer[buffer_size];
+ quint16 buffer[buffer_size];
const int image_width = data->texture.width;
const int image_height = data->texture.height;
@@ -6021,13 +4895,14 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
while (count--) {
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
- if (coverage == 0) {
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha == 0) {
++spans;
continue;
}
- DST *dest = (DST*)data->rasterBuffer->scanLine(spans->y)
- + spans->x;
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + spans->x;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
int x = int((data->m21 * cy
@@ -6037,10 +4912,17 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
int length = spans->len;
while (length) {
- const int l = qMin(length, buffer_size);
+ int l;
+ quint16 *b;
+ if (ialpha == 0) {
+ l = length;
+ b = dest;
+ } else {
+ l = qMin(length, buffer_size);
+ b = buffer;
+ }
+ const quint16 *end = b + l;
- const SRC *end = buffer + l;
- SRC *b = buffer;
while (b < end) {
int px = (x >> 16) % image_width;
int py = (y >> 16) % image_height;
@@ -6050,25 +4932,15 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
if (py < 0)
py += image_height;
- *b = ((SRC*)data->texture.scanLine(py))[px];
+ *b = ((quint16 *)data->texture.scanLine(py))[px];
++b;
x += fdx;
y += fdy;
}
- if (!SRC::hasAlpha() && coverage == 255) {
- qt_memconvert(dest, buffer, l);
- } else if (sizeof(DST) == 3 && sizeof(SRC) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3))
- {
- blendUntransformed_dest24(dest, buffer, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3)) {
- blendUntransformed_dest16(dest, buffer, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, buffer, coverage, l);
- }
+ if (ialpha != 0)
+ blend_sourceOver_rgb16_rgb16(dest, buffer, l, alpha, ialpha);
dest += l;
length -= l;
@@ -6082,13 +4954,14 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
while (count--) {
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
- if (coverage == 0) {
+ const quint8 alpha = (coverage + 1) >> 3;
+ const quint8 ialpha = 0x20 - alpha;
+ if (alpha == 0) {
++spans;
continue;
}
- DST *dest = (DST*)data->rasterBuffer->scanLine(spans->y)
- + spans->x;
+ quint16 *dest = (quint16 *)data->rasterBuffer->scanLine(spans->y) + spans->x;
const qreal cx = spans->x + qreal(0.5);
const qreal cy = spans->y + qreal(0.5);
@@ -6099,9 +4972,17 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
int length = spans->len;
while (length) {
- const int l = qMin(length, buffer_size);
- const SRC *end = buffer + l;
- SRC *b = buffer;
+ int l;
+ quint16 *b;
+ if (ialpha == 0) {
+ l = length;
+ b = dest;
+ } else {
+ l = qMin(length, buffer_size);
+ b = buffer;
+ }
+ const quint16 *end = b + l;
+
while (b < end) {
const qreal iw = w == 0 ? 1 : 1 / w;
const qreal tx = x * iw;
@@ -6117,7 +4998,7 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
if (py < 0)
py += image_height;
- *b = ((SRC*)data->texture.scanLine(py))[px];
+ *b = ((quint16 *)data->texture.scanLine(py))[px];
++b;
x += fdx;
@@ -6127,18 +5008,9 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
if (!w)
w += fdw;
}
- if (!SRC::hasAlpha() && coverage == 255) {
- qt_memconvert(dest, buffer, l);
- } else if (sizeof(DST) == 3 && sizeof(SRC) == 3 && l >= 4 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3))
- {
- blendUntransformed_dest24(dest, buffer, coverage, l);
- } else if (sizeof(DST) == 2 && sizeof(SRC) == 2 && l >= 2 &&
- (quintptr(dest) & 3) == (quintptr(buffer) & 3)) {
- blendUntransformed_dest16(dest, buffer, coverage, l);
- } else {
- blendUntransformed_unaligned(dest, buffer, coverage, l);
- }
+
+ if (ialpha != 0)
+ blend_sourceOver_rgb16_rgb16(dest, buffer, l, alpha, ialpha);
dest += l;
length -= l;
@@ -6148,185 +5020,122 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
}
}
-static void blend_transformed_tiled_rgb888(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_argb6666(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_rgb666(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_argb8565(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_rgb565(int count, const QSpan *spans,
- void *userData)
-{
- QSpanData *data = reinterpret_cast<QSpanData *>(userData);
-
- if (data->texture.format == QImage::Format_ARGB8565_Premultiplied)
- blendTransformedTiled<qrgb565, qargb8565>(count, spans, userData);
- else if (data->texture.format == QImage::Format_RGB16)
- blendTransformedTiled<qrgb565, qrgb565>(count, spans, userData);
- else
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_argb8555(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_rgb555(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_argb4444(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-static void blend_transformed_tiled_rgb444(int count, const QSpan *spans,
- void *userData)
-{
- blend_src_generic<RegularSpans>(count, spans, userData);
-}
-
-# define SPANFUNC_POINTER(Name, Arg) Name<Arg>
-
/* Image formats here are target formats */
static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats] = {
// Untransformed
{
0, // Invalid
- SPANFUNC_POINTER(blend_untransformed_generic, RegularSpans), // Mono
- SPANFUNC_POINTER(blend_untransformed_generic, RegularSpans), // MonoLsb
- SPANFUNC_POINTER(blend_untransformed_generic, RegularSpans), // Indexed8
- SPANFUNC_POINTER(blend_untransformed_generic, RegularSpans), // RGB32
- SPANFUNC_POINTER(blend_untransformed_generic, RegularSpans), // ARGB32
- SPANFUNC_POINTER(blend_untransformed_argb, RegularSpans), // ARGB32_Premultiplied
+ blend_untransformed_generic, // Mono
+ blend_untransformed_generic, // MonoLsb
+ blend_untransformed_generic, // Indexed8
+ blend_untransformed_generic, // RGB32
+ blend_untransformed_generic, // ARGB32
+ blend_untransformed_argb, // ARGB32_Premultiplied
blend_untransformed_rgb565,
- blend_untransformed_argb8565,
- blend_untransformed_rgb666,
- blend_untransformed_argb6666,
- blend_untransformed_rgb555,
- blend_untransformed_argb8555,
- blend_untransformed_rgb888,
- blend_untransformed_rgb444,
- blend_untransformed_argb4444,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
+ blend_untransformed_generic,
},
// Tiled
{
0, // Invalid
- SPANFUNC_POINTER(blend_tiled_generic, RegularSpans), // Mono
- SPANFUNC_POINTER(blend_tiled_generic, RegularSpans), // MonoLsb
- SPANFUNC_POINTER(blend_tiled_generic, RegularSpans), // Indexed8
- SPANFUNC_POINTER(blend_tiled_generic, RegularSpans), // RGB32
- SPANFUNC_POINTER(blend_tiled_generic, RegularSpans), // ARGB32
- SPANFUNC_POINTER(blend_tiled_argb, RegularSpans), // ARGB32_Premultiplied
+ blend_tiled_generic, // Mono
+ blend_tiled_generic, // MonoLsb
+ blend_tiled_generic, // Indexed8
+ blend_tiled_generic, // RGB32
+ blend_tiled_generic, // ARGB32
+ blend_tiled_argb, // ARGB32_Premultiplied
blend_tiled_rgb565,
- blend_tiled_argb8565,
- blend_tiled_rgb666,
- blend_tiled_argb6666,
- blend_tiled_rgb555,
- blend_tiled_argb8555,
- blend_tiled_rgb888,
- blend_tiled_rgb444,
- blend_tiled_argb4444,
+ blend_tiled_generic,
+ blend_tiled_generic,
+ blend_tiled_generic,
+ blend_tiled_generic,
+ blend_tiled_generic,
+ blend_tiled_generic,
+ blend_tiled_generic,
+ blend_tiled_generic,
},
// Transformed
{
0, // Invalid
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Mono
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // MonoLsb
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Indexed8
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB32
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB32
- SPANFUNC_POINTER(blend_transformed_argb, RegularSpans), // ARGB32_Premultiplied
+ blend_src_generic, // Mono
+ blend_src_generic, // MonoLsb
+ blend_src_generic, // Indexed8
+ blend_src_generic, // RGB32
+ blend_src_generic, // ARGB32
+ blend_transformed_argb, // ARGB32_Premultiplied
blend_transformed_rgb565,
- blend_transformed_argb8565,
- blend_transformed_rgb666,
- blend_transformed_argb6666,
- blend_transformed_rgb555,
- blend_transformed_argb8555,
- blend_transformed_rgb888,
- blend_transformed_rgb444,
- blend_transformed_argb4444,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
},
// TransformedTiled
{
0,
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Mono
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // MonoLsb
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Indexed8
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB32
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB32
- SPANFUNC_POINTER(blend_transformed_tiled_argb, RegularSpans), // ARGB32_Premultiplied
+ blend_src_generic, // Mono
+ blend_src_generic, // MonoLsb
+ blend_src_generic, // Indexed8
+ blend_src_generic, // RGB32
+ blend_src_generic, // ARGB32
+ blend_transformed_tiled_argb, // ARGB32_Premultiplied
blend_transformed_tiled_rgb565,
- blend_transformed_tiled_argb8565,
- blend_transformed_tiled_rgb666,
- blend_transformed_tiled_argb6666,
- blend_transformed_tiled_rgb555,
- blend_transformed_tiled_argb8555,
- blend_transformed_tiled_rgb888,
- blend_transformed_tiled_rgb444,
- blend_transformed_tiled_argb4444
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic
},
// Bilinear
{
0,
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Mono
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // MonoLsb
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Indexed8
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB32
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB32
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB32_Premultiplied
+ blend_src_generic, // Mono
+ blend_src_generic, // MonoLsb
+ blend_src_generic, // Indexed8
+ blend_src_generic, // RGB32
+ blend_src_generic, // ARGB32
+ blend_src_generic, // ARGB32_Premultiplied
blend_transformed_bilinear_rgb565,
- blend_transformed_bilinear_argb8565,
- blend_transformed_bilinear_rgb666,
- blend_transformed_bilinear_argb6666,
- blend_transformed_bilinear_rgb555,
- blend_transformed_bilinear_argb8555,
- blend_transformed_bilinear_rgb888,
- blend_transformed_bilinear_rgb444,
- blend_transformed_bilinear_argb4444,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
+ blend_src_generic,
},
// BilinearTiled
{
0,
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Mono
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // MonoLsb
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // Indexed8
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB32
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB32
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB32_Premultiplied
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB16
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB8565_Premultiplied
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB666
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB6666_Premultiplied
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB555
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB8555_Premultiplied
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB888
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // RGB444
- SPANFUNC_POINTER(blend_src_generic, RegularSpans), // ARGB4444_Premultiplied
+ blend_src_generic, // Mono
+ blend_src_generic, // MonoLsb
+ blend_src_generic, // Indexed8
+ blend_src_generic, // RGB32
+ blend_src_generic, // ARGB32
+ blend_src_generic, // ARGB32_Premultiplied
+ blend_src_generic, // RGB16
+ blend_src_generic, // ARGB8565_Premultiplied
+ blend_src_generic, // RGB666
+ blend_src_generic, // ARGB6666_Premultiplied
+ blend_src_generic, // RGB555
+ blend_src_generic, // ARGB8555_Premultiplied
+ blend_src_generic, // RGB888
+ blend_src_generic, // RGB444
+ blend_src_generic, // ARGB4444_Premultiplied
}
};
@@ -6339,14 +5148,11 @@ void qBlendTexture(int count, const QSpan *spans, void *userData)
template <class DST>
inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
- int x, int y, quint32 color,
+ int x, int y, DST color,
const uchar *map,
- int mapWidth, int mapHeight, int mapStride,
- DST dummy = 0)
+ int mapWidth, int mapHeight, int mapStride)
{
- Q_UNUSED(dummy);
- const DST c = qt_colorConvert<DST, quint32>(color, 0);
- DST *dest = reinterpret_cast<DST*>(rasterBuffer->scanLine(y)) + x;
+ DST *dest = reinterpret_cast<DST *>(rasterBuffer->scanLine(y)) + x;
const int destStride = rasterBuffer->bytesPerLine() / sizeof(DST);
if (mapWidth > 8) {
@@ -6360,7 +5166,7 @@ inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
++n;
} else {
if (n) {
- qt_memfill(dest + x0, c, n);
+ qt_memfill(dest + x0, color, n);
x0 += n + 1;
n = 0;
} else {
@@ -6375,7 +5181,7 @@ inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
}
}
if (n)
- qt_memfill(dest + x0, c, n);
+ qt_memfill(dest + x0, color, n);
dest += destStride;
map += mapStride;
}
@@ -6387,7 +5193,7 @@ inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
if (s & 0x80) {
++n;
} else if (n) {
- qt_memfill(dest + x0, c, n);
+ qt_memfill(dest + x0, color, n);
x0 += n + 1;
n = 0;
} else {
@@ -6395,7 +5201,7 @@ inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
}
}
if (n)
- qt_memfill(dest + x0, c, n);
+ qt_memfill(dest + x0, color, n);
dest += destStride;
map += mapStride;
}
@@ -6448,7 +5254,7 @@ static void qt_gradient_quint32(int count, const QSpan *spans, void *userData)
}
} else {
- blend_src_generic<RegularSpans>(count, spans, userData);
+ blend_src_generic(count, spans, userData);
}
}
@@ -6496,7 +5302,7 @@ static void qt_gradient_quint16(int count, const QSpan *spans, void *userData)
data->solid.color = oldColor;
} else {
- blend_src_generic<RegularSpans>(count, spans, userData);
+ blend_src_generic(count, spans, userData);
}
}
@@ -6514,7 +5320,7 @@ inline static void qt_bitmapblit_quint16(QRasterBuffer *rasterBuffer,
const uchar *map,
int mapWidth, int mapHeight, int mapStride)
{
- qt_bitmapblit_template<quint16>(rasterBuffer, x, y, color,
+ qt_bitmapblit_template<quint16>(rasterBuffer, x, y, qConvertRgb32To16(color),
map, mapWidth, mapHeight, mapStride);
}
@@ -6572,7 +5378,7 @@ static void qt_alphamapblit_quint16(QRasterBuffer *rasterBuffer,
int mapWidth, int mapHeight, int mapStride,
const QClipData *)
{
- const quint16 c = qt_colorConvert<quint16, quint32>(color, 0);
+ const quint16 c = qConvertRgb32To16(color);
quint16 *dest = reinterpret_cast<quint16*>(rasterBuffer->scanLine(y)) + x;
const int destStride = rasterBuffer->bytesPerLine() / sizeof(quint16);
@@ -6838,41 +5644,25 @@ static void qt_alphargbblit_quint32(QRasterBuffer *rasterBuffer,
}
}
-template <class T>
-inline void qt_rectfill_template(QRasterBuffer *rasterBuffer,
- int x, int y, int width, int height,
- quint32 color, T dummy = 0)
+static void qt_rectfill_quint32(QRasterBuffer *rasterBuffer,
+ int x, int y, int width, int height,
+ quint32 color)
{
- Q_UNUSED(dummy);
-
- qt_rectfill<T>(reinterpret_cast<T*>(rasterBuffer->buffer()),
- qt_colorConvert<T, quint32p>(quint32p::fromRawData(color), 0),
- x, y, width, height, rasterBuffer->bytesPerLine());
+ qt_rectfill<quint32>(reinterpret_cast<quint32 *>(rasterBuffer->buffer()),
+ color, x, y, width, height, rasterBuffer->bytesPerLine());
}
-#define QT_RECTFILL(T) \
- inline static void qt_rectfill_##T(QRasterBuffer *rasterBuffer, \
- int x, int y, int width, int height, \
- quint32 color) \
- { \
- qt_rectfill_template<T>(rasterBuffer, x, y, width, height, color); \
- }
-
-QT_RECTFILL(quint32)
-QT_RECTFILL(quint16)
-QT_RECTFILL(qargb8565)
-QT_RECTFILL(qrgb666)
-QT_RECTFILL(qargb6666)
-QT_RECTFILL(qrgb555)
-QT_RECTFILL(qargb8555)
-QT_RECTFILL(qrgb888)
-QT_RECTFILL(qrgb444)
-QT_RECTFILL(qargb4444)
-#undef QT_RECTFILL
+static void qt_rectfill_quint16(QRasterBuffer *rasterBuffer,
+ int x, int y, int width, int height,
+ quint32 color)
+{
+ qt_rectfill<quint16>(reinterpret_cast<quint16 *>(rasterBuffer->buffer()),
+ qConvertRgb32To16(color), x, y, width, height, rasterBuffer->bytesPerLine());
+}
-inline static void qt_rectfill_nonpremul_quint32(QRasterBuffer *rasterBuffer,
- int x, int y, int width, int height,
- quint32 color)
+static void qt_rectfill_nonpremul_quint32(QRasterBuffer *rasterBuffer,
+ int x, int y, int width, int height,
+ quint32 color)
{
qt_rectfill<quint32>(reinterpret_cast<quint32 *>(rasterBuffer->buffer()),
INV_PREMUL(color), x, y, width, height, rasterBuffer->bytesPerLine());
@@ -6889,19 +5679,19 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_Mono,
{
blend_color_generic,
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
+ blend_src_generic,
0, 0, 0, 0
},
// Format_MonoLSB,
{
blend_color_generic,
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
+ blend_src_generic,
0, 0, 0, 0
},
// Format_Indexed8,
{
blend_color_generic,
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
+ blend_src_generic,
0, 0, 0, 0
},
// Format_RGB32,
@@ -6942,88 +5732,78 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
},
// Format_ARGB8565_Premultiplied
{
- SPANFUNC_POINTER_BLENDCOLOR(qargb8565),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qargb8565
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_RGB666
{
- SPANFUNC_POINTER_BLENDCOLOR(qrgb666),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qrgb666
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_ARGB6666_Premultiplied
{
- SPANFUNC_POINTER_BLENDCOLOR(qargb6666),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qargb6666
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_RGB555
{
- SPANFUNC_POINTER_BLENDCOLOR(qrgb555),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qrgb555
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_ARGB8555_Premultiplied
{
- SPANFUNC_POINTER_BLENDCOLOR(qargb8555),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qargb8555
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_RGB888
{
- SPANFUNC_POINTER_BLENDCOLOR(qrgb888),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qrgb888
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_RGB444
{
- SPANFUNC_POINTER_BLENDCOLOR(qrgb444),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qrgb444
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
},
// Format_ARGB4444_Premultiplied
{
- SPANFUNC_POINTER_BLENDCOLOR(qargb4444),
- SPANFUNC_POINTER(blend_src_generic, RegularSpans),
- 0, 0, 0,
- qt_rectfill_qargb4444
+ blend_color_generic,
+ blend_src_generic,
+ 0, 0, 0, 0
}
};
#if defined(Q_CC_MSVC) && !defined(_MIPS_)
-template <class DST, class SRC>
-inline void qt_memfill_template(DST *dest, SRC color, int count)
+template <class T>
+inline void qt_memfill_template(T *dest, T color, int count)
{
- const DST c = qt_colorConvert<DST, SRC>(color, 0);
while (count--)
- *dest++ = c;
+ *dest++ = color;
}
#else
-template <class DST, class SRC>
-inline void qt_memfill_template(DST *dest, SRC color, int count)
+template <class T>
+inline void qt_memfill_template(T *dest, T color, int count)
{
- const DST c = qt_colorConvert<DST, SRC>(color, 0);
int n = (count + 7) / 8;
switch (count & 0x07)
{
- case 0: do { *dest++ = c;
- case 7: *dest++ = c;
- case 6: *dest++ = c;
- case 5: *dest++ = c;
- case 4: *dest++ = c;
- case 3: *dest++ = c;
- case 2: *dest++ = c;
- case 1: *dest++ = c;
+ case 0: do { *dest++ = color;
+ case 7: *dest++ = color;
+ case 6: *dest++ = color;
+ case 5: *dest++ = color;
+ case 4: *dest++ = color;
+ case 3: *dest++ = color;
+ case 2: *dest++ = color;
+ case 1: *dest++ = color;
} while (--n > 0);
}
}
@@ -7053,7 +5833,7 @@ inline void qt_memfill_template(quint16 *dest, quint16 value, int count)
static void qt_memfill_quint16(quint16 *dest, quint16 color, int count)
{
- qt_memfill_template<quint16, quint16>(dest, color, count);
+ qt_memfill_template<quint16>(dest, color, count);
}
typedef void (*qt_memfill32_func)(quint32 *dest, quint32 value, int count);
@@ -7067,8 +5847,8 @@ qt_memfill16_func qt_memfill16 = qt_memfill16_setup;
void qInitDrawhelperAsm()
{
- qt_memfill32 = qt_memfill_template<quint32, quint32>;
- qt_memfill16 = qt_memfill_quint16; //qt_memfill_template<quint16, quint16>;
+ qt_memfill32 = qt_memfill_template<quint32>;
+ qt_memfill16 = qt_memfill_quint16; //qt_memfill_template<quint16>;
CompositionFunction *functionForModeAsm = 0;
CompositionFunctionSolid *functionForModeSolidAsm = 0;
diff --git a/src/gui/painting/qdrawhelper_neon.cpp b/src/gui/painting/qdrawhelper_neon.cpp
index c3dd4fb1ef..895b44dc17 100644
--- a/src/gui/painting/qdrawhelper_neon.cpp
+++ b/src/gui/painting/qdrawhelper_neon.cpp
@@ -198,7 +198,7 @@ void qt_blend_rgb16_on_argb32_neon(uchar *destPixels, int dbpl,
while (h--) {
for (int x=0; x<w; ++x)
- dst[x] = INTERPOLATE_PIXEL_255(qt_colorConvert(src[x], dst[x]), a, dst[x], ia);
+ dst[x] = INTERPOLATE_PIXEL_255(qConvertRgb16To32(src[x]), a, dst[x], ia);
dst += dbpl;
src += sbpl;
}
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
index bf8eadcc03..2e88fe718a 100644
--- a/src/gui/painting/qdrawhelper_p.h
+++ b/src/gui/painting/qdrawhelper_p.h
@@ -657,1059 +657,22 @@ Q_STATIC_INLINE_FUNCTION uint BYTE_MUL_RGB16_32(uint x, uint a) {
| (((255*qGreen(p)) / qAlpha(p)) << 8) \
| ((255*qBlue(p)) / qAlpha(p))))
-template <class DST, class SRC>
-inline DST qt_colorConvert(SRC color, DST dummy)
-{
- Q_UNUSED(dummy);
- return DST(color);
-}
-
-
-template <>
-inline quint32 qt_colorConvert(quint16 color, quint32 dummy)
-{
- Q_UNUSED(dummy);
- const int r = (color & 0xf800);
- const int g = (color & 0x07e0);
- const int b = (color & 0x001f);
- const int tr = (r >> 8) | (r >> 13);
- const int tg = (g >> 3) | (g >> 9);
- const int tb = (b << 3) | (b >> 2);
-
- return qRgb(tr, tg, tb);
-}
-
-template <>
-inline quint16 qt_colorConvert(quint32 color, quint16 dummy)
-{
- Q_UNUSED(dummy);
- const int r = qRed(color) << 8;
- const int g = qGreen(color) << 3;
- const int b = qBlue(color) >> 3;
-
- return (r & 0xf800) | (g & 0x07e0)| (b & 0x001f);
-}
-
-class quint32p
-{
-public:
- inline quint32p(quint32 v) : data(PREMUL(v)) {}
-
- inline operator quint32() const { return data; }
-
- inline operator quint16() const
- {
- return qt_colorConvert<quint16, quint32>(data, 0);
- }
-
- Q_STATIC_INLINE_FUNCTION quint32p fromRawData(quint32 v)
- {
- quint32p p;
- p.data = v;
- return p;
- }
-
-private:
- quint32p() {}
- quint32 data;
-} Q_PACKED;
-
-class qabgr8888
-{
-public:
- inline qabgr8888(quint32 v)
- {
- data = qRgba(qBlue(v), qGreen(v), qRed(v), qAlpha(v));
- }
-
- inline bool operator==(const qabgr8888 &v) const { return data == v.data; }
-
-private:
- quint32 data;
-} Q_PACKED;
-
-class qrgb565;
-
-class qargb8565
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return true; }
-
- inline qargb8565() {}
- inline qargb8565(quint32 v);
- inline explicit qargb8565(quint32p v);
- inline qargb8565(const qargb8565 &v);
- inline qargb8565(const qrgb565 &v);
-
- inline operator quint32() const;
- inline operator quint16() const;
-
- inline quint8 alpha() const { return data[0]; }
- inline qargb8565 truncedAlpha() {
- data[0] &= 0xf8;
- data[1] &= 0xdf;
- return *this;
- }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 3; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 0x20 - alpha(a); }
-
- inline qargb8565 byte_mul(quint8 a) const;
- inline qargb8565 operator+(qargb8565 v) const;
- inline bool operator==(const qargb8565 &v) const;
-
- inline quint32 rawValue() const;
- inline quint16 rawValue16() const;
-
-private:
- friend class qrgb565;
-
- quint8 data[3];
-} Q_PACKED;
-
-class qrgb565
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return false; }
-
- qrgb565(int v = 0) : data(v) {}
-
- inline explicit qrgb565(quint32p v);
- inline explicit qrgb565(quint32 v);
- inline explicit qrgb565(const qargb8565 &v);
-
- inline operator quint32() const;
- inline operator quint16() const;
-
- inline qrgb565 operator+(qrgb565 v) const;
-
- inline quint8 alpha() const { return 0xff; }
- inline qrgb565 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 3; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 0x20 - alpha(a); }
-
- inline qrgb565 byte_mul(quint8 a) const;
-
- inline bool operator==(const qrgb565 &v) const;
- inline quint16 rawValue() const { return data; }
-
-private:
- friend class qargb8565;
-
- quint16 data;
-} Q_PACKED;
-
-qargb8565::qargb8565(quint32 v)
-{
- *this = qargb8565(quint32p(v));
-}
-
-qargb8565::qargb8565(quint32p v)
-{
- data[0] = qAlpha(v);
- const int r = qRed(v);
- const int g = qGreen(v);
- const int b = qBlue(v);
- data[1] = ((g << 3) & 0xe0) | (b >> 3);
- data[2] = (r & 0xf8) | (g >> 5);
-}
-
-qargb8565::qargb8565(const qargb8565 &v)
-{
- data[0] = v.data[0];
- data[1] = v.data[1];
- data[2] = v.data[2];
-}
-
-qargb8565::qargb8565(const qrgb565 &v)
-{
- data[0] = 0xff;
- data[1] = v.data & 0xff;
- data[2] = v.data >> 8;
-}
-
-qargb8565::operator quint32() const
-{
- const quint16 rgb = (data[2] << 8) | data[1];
- const int a = data[0];
- const int r = (rgb & 0xf800);
- const int g = (rgb & 0x07e0);
- const int b = (rgb & 0x001f);
- const int tr = qMin(a, (r >> 8) | (r >> 13));
- const int tg = qMin(a, (g >> 3) | (g >> 9));
- const int tb = qMin(a, (b << 3) | (b >> 2));
- return qRgba(tr, tg, tb, data[0]);
-}
-
-qargb8565::operator quint16() const
-{
- return (data[2] << 8) | data[1];
-}
-
-qargb8565 qargb8565::operator+(qargb8565 v) const
-{
- qargb8565 t;
- t.data[0] = data[0] + v.data[0];
- const quint16 rgb = ((data[2] + v.data[2]) << 8)
- + (data[1] + v.data[1]);
- t.data[1] = rgb & 0xff;
- t.data[2] = rgb >> 8;
- return t;
-}
-
-qargb8565 qargb8565::byte_mul(quint8 a) const
-{
- qargb8565 result;
- result.data[0] = (data[0] * a) >> 5;
-
- const quint16 x = (data[2] << 8) | data[1];
- const quint16 t = ((((x & 0x07e0) >> 5) * a) & 0x07e0) |
- ((((x & 0xf81f) * a) >> 5) & 0xf81f);
- result.data[1] = t & 0xff;
- result.data[2] = t >> 8;
- return result;
-}
-
-bool qargb8565::operator==(const qargb8565 &v) const
-{
- return data[0] == v.data[0]
- && data[1] == v.data[1]
- && data[2] == v.data[2];
-}
-
-quint32 qargb8565::rawValue() const
-{
- return (data[2] << 16) | (data[1] << 8) | data[0];
-}
-
-quint16 qargb8565::rawValue16() const
-{
- return (data[2] << 8) | data[1];
-}
-
-qrgb565::qrgb565(quint32p v)
-{
- *this = qrgb565(quint32(v));
-}
-
-qrgb565::qrgb565(quint32 v)
-{
- const int r = qRed(v) << 8;
- const int g = qGreen(v) << 3;
- const int b = qBlue(v) >> 3;
-
- data = (r & 0xf800) | (g & 0x07e0)| (b & 0x001f);
-}
-
-qrgb565::qrgb565(const qargb8565 &v)
-{
- data = (v.data[2] << 8) | v.data[1];
-}
-
-qrgb565::operator quint32() const
-{
- const int r = (data & 0xf800);
- const int g = (data & 0x07e0);
- const int b = (data & 0x001f);
- const int tr = (r >> 8) | (r >> 13);
- const int tg = (g >> 3) | (g >> 9);
- const int tb = (b << 3) | (b >> 2);
- return qRgb(tr, tg, tb);
-}
-
-qrgb565::operator quint16() const
-{
- return data;
-}
-
-qrgb565 qrgb565::operator+(qrgb565 v) const
-{
- qrgb565 t;
- t.data = data + v.data;
- return t;
-}
-
-qrgb565 qrgb565::byte_mul(quint8 a) const
-{
- qrgb565 result;
- result.data = ((((data & 0x07e0) >> 5) * a) & 0x07e0) |
- ((((data & 0xf81f) * a) >> 5) & 0xf81f);
- return result;
-}
-
-bool qrgb565::operator==(const qrgb565 &v) const
-{
- return data == v.data;
-}
-
-class qbgr565
-{
-public:
- inline qbgr565(quint16 v)
- {
- data = ((v & 0x001f) << 11) |
- (v & 0x07e0) |
- ((v & 0xf800) >> 11);
- }
-
- inline bool operator==(const qbgr565 &v) const
- {
- return data == v.data;
- }
-
-private:
- quint16 data;
-} Q_PACKED;
-
-class qrgb555;
-
-class qargb8555
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return true; }
-
- qargb8555() {}
- inline qargb8555(quint32 v);
- inline explicit qargb8555(quint32p v);
- inline qargb8555(const qargb8555 &v);
- inline qargb8555(const qrgb555 &v);
-
- inline operator quint32() const;
-
- inline quint8 alpha() const { return data[0]; }
- inline qargb8555 truncedAlpha() { data[0] &= 0xf8; return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 3; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 0x20 - alpha(a); }
-
- inline qargb8555 operator+(qargb8555 v) const;
- inline qargb8555 byte_mul(quint8 a) const;
-
- inline bool operator==(const qargb8555 &v) const;
-
- inline quint32 rawValue() const;
-
-private:
- friend class qrgb555;
- quint8 data[3];
-} Q_PACKED;
-
-class qrgb555
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return false; }
-
- inline qrgb555(int v = 0) : data(v) {}
-
- inline explicit qrgb555(quint32p v) { *this = qrgb555(quint32(v)); }
-
- inline explicit qrgb555(quint32 v)
- {
- const int r = qRed(v) << 7;
- const int g = qGreen(v) << 2;
- const int b = qBlue(v) >> 3;
-
- data = (r & 0x7c00) | (g & 0x03e0) | (b & 0x001f);
- }
-
- inline explicit qrgb555(quint16 v)
- {
- data = ((v >> 1) & (0x7c00 | 0x03e0)) |
- (v & 0x001f);
- }
-
- inline explicit qrgb555(const qargb8555 &v);
-
- inline operator quint32() const
- {
- const int r = (data & 0x7c00);
- const int g = (data & 0x03e0);
- const int b = (data & 0x001f);
- const int tr = (r >> 7) | (r >> 12);
- const int tg = (g >> 2) | (g >> 7);
- const int tb = (b << 3) | (b >> 2);
-
- return qRgb(tr, tg, tb);
- }
-
- inline operator quint16() const
- {
- const int r = ((data & 0x7c00) << 1) & 0xf800;
- const int g = (((data & 0x03e0) << 1) | ((data >> 4) & 0x0020)) & 0x07e0;
- const int b = (data & 0x001f);
-
- return r | g | b;
- }
-
- inline qrgb555 operator+(qrgb555 v) const;
- inline qrgb555 byte_mul(quint8 a) const;
-
- inline quint8 alpha() const { return 0xff; }
- inline qrgb555 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 3; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 0x20 - alpha(a); }
-
- inline bool operator==(const qrgb555 &v) const { return v.data == data; }
- inline bool operator!=(const qrgb555 &v) const { return v.data != data; }
-
- inline quint16 rawValue() const { return data; }
-
-private:
- friend class qargb8555;
- friend class qbgr555;
- quint16 data;
-
-} Q_PACKED;
-
-qrgb555::qrgb555(const qargb8555 &v)
-{
- data = (v.data[2] << 8) | v.data[1];
-}
-
-qrgb555 qrgb555::operator+(qrgb555 v) const
-{
- qrgb555 t;
- t.data = data + v.data;
- return t;
-}
-
-qrgb555 qrgb555::byte_mul(quint8 a) const
-{
- quint16 t = (((data & 0x3e0) * a) >> 5) & 0x03e0;
- t |= (((data & 0x7c1f) * a) >> 5) & 0x7c1f;
-
- qrgb555 result;
- result.data = t;
- return result;
-}
-
-class qbgr555
-{
-public:
- inline qbgr555(quint32 v) { *this = qbgr555(qrgb555(v)); }
-
- inline qbgr555(qrgb555 v)
- {
- data = ((v.data & 0x001f) << 10) |
- (v.data & 0x03e0) |
- ((v.data & 0x7c00) >> 10);
- }
-
- inline bool operator==(const qbgr555 &v) const
- {
- return data == v.data;
- }
-
-private:
- quint16 data;
-} Q_PACKED;
-
-qargb8555::qargb8555(quint32 v)
-{
- v = quint32p(v);
- data[0] = qAlpha(v);
- const int r = qRed(v);
- const int g = qGreen(v);
- const int b = qBlue(v);
- data[1] = ((g << 2) & 0xe0) | (b >> 3);
- data[2] = ((r >> 1) & 0x7c) | (g >> 6);
-
-}
-
-qargb8555::qargb8555(quint32p v)
-{
- data[0] = qAlpha(v);
- const int r = qRed(v);
- const int g = qGreen(v);
- const int b = qBlue(v);
- data[1] = ((g << 2) & 0xe0) | (b >> 3);
- data[2] = ((r >> 1) & 0x7c) | (g >> 6);
-}
-
-qargb8555::qargb8555(const qargb8555 &v)
-{
- data[0] = v.data[0];
- data[1] = v.data[1];
- data[2] = v.data[2];
-}
-
-qargb8555::qargb8555(const qrgb555 &v)
-{
- data[0] = 0xff;
- data[1] = v.data & 0xff;
- data[2] = v.data >> 8;
-}
-
-qargb8555::operator quint32() const
-{
- const quint16 rgb = (data[2] << 8) | data[1];
- const int r = (rgb & 0x7c00);
- const int g = (rgb & 0x03e0);
- const int b = (rgb & 0x001f);
- const int tr = (r >> 7) | (r >> 12);
- const int tg = (g >> 2) | (g >> 7);
- const int tb = (b << 3) | (b >> 2);
-
- return qRgba(tr, tg, tb, data[0]);
-}
-
-bool qargb8555::operator==(const qargb8555 &v) const
-{
- return data[0] == v.data[0]
- && data[1] == v.data[1]
- && data[2] == v.data[2];
-}
-
-quint32 qargb8555::rawValue() const
-{
- return (data[2] << 16) | (data[1] << 8) | data[0];
-}
-
-qargb8555 qargb8555::operator+(qargb8555 v) const
-{
- qargb8555 t;
- t.data[0] = data[0] + v.data[0];
- const quint16 rgb = ((data[2] + v.data[2]) << 8)
- + (data[1] + v.data[1]);
- t.data[1] = rgb & 0xff;
- t.data[2] = rgb >> 8;
- return t;
-}
-
-qargb8555 qargb8555::byte_mul(quint8 a) const
-{
- qargb8555 result;
- result.data[0] = (data[0] * a) >> 5;
-
- const quint16 x = (data[2] << 8) | data[1];
- quint16 t = (((x & 0x3e0) * a) >> 5) & 0x03e0;
- t |= (((x & 0x7c1f) * a) >> 5) & 0x7c1f;
- result.data[1] = t & 0xff;
- result.data[2] = t >> 8;
- return result;
-
-}
-
-class qrgb666;
-
-class qargb6666
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return true; }
-
- inline qargb6666() {}
- inline qargb6666(quint32 v) { *this = qargb6666(quint32p(v)); }
- inline explicit qargb6666(quint32p v);
- inline qargb6666(const qargb6666 &v);
- inline qargb6666(const qrgb666 &v);
-
- inline operator quint32 () const;
-
- inline quint8 alpha() const;
- inline qargb6666 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 2; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return (255 - a + 1) >> 2; }
-
- inline qargb6666 byte_mul(quint8 a) const;
- inline qargb6666 operator+(qargb6666 v) const;
- inline bool operator==(const qargb6666 &v) const;
-
- inline quint32 rawValue() const;
-
-private:
- friend class qrgb666;
- quint8 data[3];
-
-} Q_PACKED;
-
-class qrgb666
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return false; }
-
- inline qrgb666() {}
- inline qrgb666(quint32 v);
- inline qrgb666(const qargb6666 &v);
-
- inline operator quint32 () const;
-
- inline quint8 alpha() const { return 0xff; }
- inline qrgb666 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 2; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return (255 - a + 1) >> 2; }
-
- inline qrgb666 operator+(qrgb666 v) const;
- inline qrgb666 byte_mul(quint8 a) const;
-
- inline bool operator==(const qrgb666 &v) const;
- inline bool operator!=(const qrgb666 &v) const { return !(*this == v); }
-
- inline quint32 rawValue() const
- {
- return (data[2] << 16) | (data[1] << 8) | data[0];
- }
-
-private:
- friend class qargb6666;
-
- quint8 data[3];
-} Q_PACKED;
-
-qrgb666::qrgb666(quint32 v)
-{
- const uchar b = qBlue(v);
- const uchar g = qGreen(v);
- const uchar r = qRed(v);
- const uint p = (b >> 2) | ((g >> 2) << 6) | ((r >> 2) << 12);
- data[0] = qBlue(p);
- data[1] = qGreen(p);
- data[2] = qRed(p);
-}
-
-qrgb666::qrgb666(const qargb6666 &v)
-{
- data[0] = v.data[0];
- data[1] = v.data[1];
- data[2] = v.data[2] & 0x03;
-}
-
-qrgb666::operator quint32 () const
-{
- const uchar r = (data[2] << 6) | ((data[1] & 0xf0) >> 2) | (data[2] & 0x3);
- const uchar g = (data[1] << 4) | ((data[0] & 0xc0) >> 4) | ((data[1] & 0x0f) >> 2);
- const uchar b = (data[0] << 2) | ((data[0] & 0x3f) >> 4);
- return qRgb(r, g, b);
-}
-
-qrgb666 qrgb666::operator+(qrgb666 v) const
-{
- const quint32 x1 = (data[2] << 16) | (data[1] << 8) | data[0];
- const quint32 x2 = (v.data[2] << 16) | (v.data[1] << 8) | v.data[0];
- const quint32 t = x1 + x2;
- qrgb666 r;
- r.data[0] = t & 0xff;
- r.data[1] = (t >> 8) & 0xff;
- r.data[2] = (t >> 16) & 0xff;
- return r;
-}
-
-qrgb666 qrgb666::byte_mul(quint8 a) const
-{
- const quint32 x = (data[2] << 16) | (data[1] << 8) | data[0];
- const quint32 t = ((((x & 0x03f03f) * a) >> 6) & 0x03f03f) |
- ((((x & 0x000fc0) * a) >> 6) & 0x000fc0);
-
- qrgb666 r;
- r.data[0] = t & 0xff;
- r.data[1] = (t >> 8) & 0xff;
- r.data[2] = (t >> 16) & 0xff;
- return r;
-}
-
-bool qrgb666::operator==(const qrgb666 &v) const
-{
- return (data[0] == v.data[0] &&
- data[1] == v.data[1] &&
- data[2] == v.data[2]);
-}
-
-qargb6666::qargb6666(quint32p v)
-{
- const quint8 b = qBlue(v) >> 2;
- const quint8 g = qGreen(v) >> 2;
- const quint8 r = qRed(v) >> 2;
- const quint8 a = qAlpha(v) >> 2;
- const uint p = (a << 18) | (r << 12) | (g << 6) | b;
- data[0] = qBlue(p);
- data[1] = qGreen(p);
- data[2] = qRed(p);
-}
-
-qargb6666::qargb6666(const qargb6666 &v)
-{
- data[0] = v.data[0];
- data[1] = v.data[1];
- data[2] = v.data[2];
-}
-
-qargb6666::qargb6666(const qrgb666 &v)
-{
- data[0] = v.data[0];
- data[1] = v.data[1];
- data[2] = (v.data[2] | 0xfc);
-}
-
-qargb6666::operator quint32 () const
-{
- const quint8 r = (data[2] << 6) | ((data[1] & 0xf0) >> 2) | (data[2] & 0x3);
- const quint8 g = (data[1] << 4) | ((data[0] & 0xc0) >> 4) | ((data[1] & 0x0f) >> 2);
- const quint8 b = (data[0] << 2) | ((data[0] & 0x3f) >> 4);
- const quint8 a = (data[2] & 0xfc) | (data[2] >> 6);
- return qRgba(r, g, b, a);
-}
-
-qargb6666 qargb6666::operator+(qargb6666 v) const
-{
- const quint32 x1 = (data[2] << 16) | (data[1] << 8) | data[0];
- const quint32 x2 = (v.data[2] << 16) | (v.data[1] << 8) | v.data[0];
- const quint32 t = x1 + x2;
- qargb6666 r;
- r.data[0] = t & 0xff;
- r.data[1] = (t >> 8) & 0xff;
- r.data[2] = (t >> 16) & 0xff;
- return r;
-}
-
-quint8 qargb6666::alpha() const
-{
- return (data[2] & 0xfc) | (data[2] >> 6);
-}
-
-inline qargb6666 qargb6666::byte_mul(quint8 a) const
-{
- const quint32 x = (data[2] << 16) | (data[1] << 8) | data[0];
- const quint32 t = ((((x & 0x03f03f) * a) >> 6) & 0x03f03f) |
- ((((x & 0xfc0fc0) * a) >> 6) & 0xfc0fc0);
-
- qargb6666 r;
- r.data[0] = t & 0xff;
- r.data[1] = (t >> 8) & 0xff;
- r.data[2] = (t >> 16) & 0xff;
- return r;
-}
-
-bool qargb6666::operator==(const qargb6666 &v) const
-{
- return data[0] == v.data[0]
- && data[1] == v.data[1]
- && data[2] == v.data[2];
-}
-
-quint32 qargb6666::rawValue() const
-{
- return (data[2] << 16) | (data[1] << 8) | data[0];
-}
-
-class qrgb888
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return false; }
-
- inline qrgb888() {}
- inline qrgb888(quint32 v);
-
- inline operator quint32() const;
-
- inline quint8 alpha() const { return 0xff; }
- inline qrgb888 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return a; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 255 - a; }
-
- inline qrgb888 byte_mul(quint8 a) const;
- inline qrgb888 operator+(qrgb888 v) const;
- inline bool operator==(qrgb888 v) const;
-
- inline quint32 rawValue() const;
-
-private:
+struct quint24 {
+ quint24(uint value);
+ operator uint() const;
uchar data[3];
-
} Q_PACKED;
-qrgb888::qrgb888(quint32 v)
+inline quint24::quint24(uint value)
{
- data[0] = qRed(v);
- data[1] = qGreen(v);
- data[2] = qBlue(v);
+ data[0] = uchar(value);
+ data[1] = uchar(value >> 8);
+ data[2] = uchar(value >> 16);
}
-qrgb888::operator quint32() const
+inline quint24::operator uint() const
{
- return qRgb(data[0], data[1], data[2]);
-}
-
-qrgb888 qrgb888::operator+(qrgb888 v) const
-{
- qrgb888 t = *this;
- t.data[0] += v.data[0];
- t.data[1] += v.data[1];
- t.data[2] += v.data[2];
- return t;
-}
-
-qrgb888 qrgb888::byte_mul(quint8 a) const
-{
- quint32 x(*this);
-
- quint32 t = (x & 0xff00ff) * a;
- t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;
- t &= 0xff00ff;
-
- x = ((x >> 8) & 0xff00ff) * a;
- x = (x + ((x >> 8) & 0xff00ff) + 0x800080);
- x &= 0xff00ff00;
- x |= t;
- return qrgb888(x);
-}
-
-bool qrgb888::operator==(qrgb888 v) const
-{
- return (data[0] == v.data[0] &&
- data[1] == v.data[1] &&
- data[2] == v.data[2]);
-}
-
-quint32 qrgb888::rawValue() const
-{
- return (data[2] << 16) | (data[1] << 8) | data[0];
-}
-
-template <>
-inline qrgb888 qt_colorConvert(quint32 color, qrgb888 dummy)
-{
- Q_UNUSED(dummy);
- return qrgb888(color);
-}
-
-template <>
-inline quint32 qt_colorConvert(qrgb888 color, quint32 dummy)
-{
- Q_UNUSED(dummy);
- return quint32(color);
-}
-
-// hw: endianess??
-class quint24
-{
-public:
- inline quint24(quint32 v)
- {
- data[0] = qBlue(v);
- data[1] = qGreen(v);
- data[2] = qRed(v);
- }
-
- inline operator quint32 ()
- {
- return qRgb(data[2], data[1], data[0]);
- }
-
- inline bool operator==(const quint24 &v) const
- {
- return data[0] == v.data[0]
- && data[1] == v.data[1]
- && data[2] == v.data[2];
- }
-
-private:
- uchar data[3];
-} Q_PACKED;
-
-template <>
-inline quint24 qt_colorConvert(quint32 color, quint24 dummy)
-{
- Q_UNUSED(dummy);
- return quint24(color);
-}
-
-// hw: endianess??
-class quint18
-{
-public:
- inline quint18(quint32 v)
- {
- uchar b = qBlue(v);
- uchar g = qGreen(v);
- uchar r = qRed(v);
- uint p = (b >> 2) | ((g >> 2) << 6) | ((r >> 2) << 12);
- data[0] = qBlue(p);
- data[1] = qGreen(p);
- data[2] = qRed(p);
- }
-
- inline operator quint32 ()
- {
- const uchar r = (data[2] << 6) | ((data[1] & 0xf0) >> 2) | (data[2] & 0x3);
- const uchar g = (data[1] << 4) | ((data[0] & 0xc0) >> 4) | ((data[1] & 0x0f) >> 2);
- const uchar b = (data[0] << 2) | ((data[0] & 0x3f) >> 4);
- return qRgb(r, g, b);
- }
-
-private:
- uchar data[3];
-} Q_PACKED;
-
-template <>
-inline quint18 qt_colorConvert(quint32 color, quint18 dummy)
-{
- Q_UNUSED(dummy);
- return quint18(color);
-}
-
-class qrgb444;
-
-class qargb4444
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return true; }
-
- inline qargb4444() {}
- inline qargb4444(quint32 v) { *this = qargb4444(quint32p(v)); }
- inline explicit qargb4444(quint32p v);
- inline qargb4444(const qrgb444 &v);
-
- inline operator quint32() const;
- inline operator quint8() const;
-
- inline qargb4444 operator+(qargb4444 v) const;
-
- inline quint8 alpha() const { return ((data & 0xf000) >> 8) | ((data & 0xf000) >> 12); }
- inline qargb4444 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 4; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 0x10 - alpha(a); }
- inline qargb4444 byte_mul(quint8 a) const;
-
- inline bool operator==(const qargb4444 &v) const { return data == v.data; }
-
- inline quint16 rawValue() const { return data; }
-
-private:
- friend class qrgb444;
- quint16 data;
-
-} Q_PACKED;
-
-class qrgb444
-{
-public:
- Q_STATIC_INLINE_FUNCTION bool hasAlpha() { return false; }
-
- inline qrgb444() {}
- inline qrgb444(quint32 v);
- inline explicit qrgb444(qargb4444 v);
-
- inline operator quint32() const;
- inline operator quint8() const;
-
- inline qrgb444 operator+(qrgb444 v) const;
- inline quint8 alpha() const { return 0xff; }
- inline qrgb444 truncedAlpha() { return *this; }
- Q_STATIC_INLINE_FUNCTION quint8 alpha(quint8 a) { return (a + 1) >> 4; }
- Q_STATIC_INLINE_FUNCTION quint8 ialpha(quint8 a) { return 0x10 - alpha(a); }
- inline qrgb444 byte_mul(quint8 a) const;
-
- inline bool operator==(const qrgb444 &v) const { return data == v.data; }
- inline bool operator!=(const qrgb444 &v) const { return data != v.data; }
-
- inline quint16 rawValue() const { return data; }
-
-private:
- friend class qargb4444;
- quint16 data;
-
-} Q_PACKED;
-
-
-qargb4444::qargb4444(quint32p color)
-{
- quint32 v = color;
- v &= 0xf0f0f0f0;
- const int a = qAlpha(v) << 8;
- const int r = qRed(v) << 4;
- const int g = qGreen(v);
- const int b = qBlue(v) >> 4;
-
- data = a | r | g | b;
-}
-
-qargb4444::qargb4444(const qrgb444 &v)
-{
- data = v.data | 0xf000;
-}
-
-qargb4444::operator quint32() const
-{
- const int a = (data & 0xf000);
- const int r = (data & 0x0f00);
- const int g = (data & 0x00f0);
- const int b = (data & 0x000f);
- const int ta = (a >> 8) | (a >> 12);
- const int tr = (r >> 4) | (r >> 8);
- const int tg = g | (g >> 4);
- const int tb = (b << 4) | b;
-
- return qRgba(tr, tg, tb, ta);
-}
-
-qargb4444::operator quint8() const
-{
- // hw: optimize!
- return qt_colorConvert<quint8, quint32>(operator quint32(), 0);
-}
-
-qargb4444 qargb4444::operator+(qargb4444 v) const
-{
- qargb4444 t;
- t.data = data + v.data;
- return t;
-}
-
-qargb4444 qargb4444::byte_mul(quint8 a) const
-{
- quint16 t = (((data & 0xf0f0) * a) >> 4) & 0xf0f0;
- t |= (((data & 0x0f0f) * a) >> 4) & 0x0f0f;
-
- qargb4444 result;
- result.data = t;
- return result;
-}
-
-qrgb444::qrgb444(quint32 v)
-{
- v &= 0xf0f0f0f0;
- const int r = qRed(v) << 4;
- const int g = qGreen(v);
- const int b = qBlue(v) >> 4;
-
- data = r | g | b;
-}
-
-qrgb444::qrgb444(qargb4444 v)
-{
- data = v.data & 0x0fff;
-}
-
-qrgb444::operator quint32() const
-{
- const int r = (data & 0x0f00);
- const int g = (data & 0x00f0);
- const int b = (data & 0x000f);
- const int tr = (r >> 4) | (r >> 8);
- const int tg = g | (g >> 4);
- const int tb = (b << 4) | b;
-
- return qRgb(tr, tg, tb);
-}
-
-qrgb444::operator quint8() const
-{
- // hw: optimize!
- return qt_colorConvert<quint8, quint32>(operator quint32(), 0);
-}
-
-qrgb444 qrgb444::operator+(qrgb444 v) const
-{
- qrgb444 t;
- t.data = data + v.data;
- return t;
-}
-
-qrgb444 qrgb444::byte_mul(quint8 a) const
-{
- quint16 t = (((data & 0xf0f0) * a) >> 4) & 0xf0f0;
- t |= (((data & 0x0f0f) * a) >> 4) & 0x0f0f;
-
- qrgb444 result;
- result.data = t;
- return result;
+ return data[0] | (data[1] << 8) | (data[2] << 16);
}
template <class T>
@@ -1769,156 +732,6 @@ inline void qt_rectfill(T *dest, T value,
}
}
-template <class DST, class SRC>
-inline void qt_memconvert(DST *dest, const SRC *src, int count)
-{
- if (sizeof(DST) == 1) {
- while (count) {
- int n = 1;
- const SRC color = *src++;
- const DST dstColor = qt_colorConvert<DST, SRC>(color, 0);
- while (--count && (*src == color || dstColor == qt_colorConvert<DST, SRC>(*src, 0))) {
- ++n;
- ++src;
- }
- qt_memfill(dest, dstColor, n);
- dest += n;
- }
- } else {
- /* Duff's device */
- int n = (count + 7) / 8;
- switch (count & 0x07)
- {
- case 0: do { *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 7: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 6: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 5: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 4: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 3: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 2: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- case 1: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0);
- } while (--n > 0);
- }
- }
-}
-
-#define QT_TRIVIAL_MEMCONVERT_IMPL(T) \
- template <> \
- inline void qt_memconvert(T *dest, const T *src, int count) \
- { \
- memcpy(dest, src, count * sizeof(T)); \
- }
-QT_TRIVIAL_MEMCONVERT_IMPL(quint32)
-QT_TRIVIAL_MEMCONVERT_IMPL(qrgb888)
-QT_TRIVIAL_MEMCONVERT_IMPL(qargb6666)
-QT_TRIVIAL_MEMCONVERT_IMPL(qrgb666)
-QT_TRIVIAL_MEMCONVERT_IMPL(quint16)
-QT_TRIVIAL_MEMCONVERT_IMPL(qrgb565)
-QT_TRIVIAL_MEMCONVERT_IMPL(qargb8565)
-QT_TRIVIAL_MEMCONVERT_IMPL(qargb8555)
-QT_TRIVIAL_MEMCONVERT_IMPL(qrgb555)
-QT_TRIVIAL_MEMCONVERT_IMPL(qargb4444)
-QT_TRIVIAL_MEMCONVERT_IMPL(qrgb444)
-#undef QT_TRIVIAL_MEMCONVERT_IMPL
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-template <>
-inline void qt_memconvert(qrgb666 *dest, const quint32 *src, int count)
-{
- if (count < 3) {
- switch (count) {
- case 2: *dest++ = qrgb666(*src++);
- case 1: *dest = qrgb666(*src);
- }
- return;
- }
-
- const int align = (quintptr(dest) & 3);
- switch (align) {
- case 1: *dest++ = qrgb666(*src++); --count;
- case 2: *dest++ = qrgb666(*src++); --count;
- case 3: *dest++ = qrgb666(*src++); --count;
- }
-
- quint32 *dest32 = reinterpret_cast<quint32*>(dest);
- int sourceCount = count >> 2;
- while (sourceCount--) {
- dest32[0] = ((src[1] & 0x00000c00) << 20)
- | ((src[1] & 0x000000fc) << 22)
- | ((src[0] & 0x00fc0000) >> 6)
- | ((src[0] & 0x0000fc00) >> 4)
- | ((src[0] & 0x000000fc) >> 2);
- dest32[1] = ((src[2] & 0x003c0000) << 10)
- | ((src[2] & 0x0000fc00) << 12)
- | ((src[2] & 0x000000fc) << 14)
- | ((src[1] & 0x00fc0000) >> 14)
- | ((src[1] & 0x0000f000) >> 12);
- dest32[2] = ((src[3] & 0x00fc0000) << 2)
- | ((src[3] & 0x0000fc00) << 4)
- | ((src[3] & 0x000000fc) << 6)
- | ((src[2] & 0x00c00000) >> 22);
- dest32 += 3;
- src += 4;
- }
-
- dest = reinterpret_cast<qrgb666*>(dest32);
- switch (count & 3) {
- case 3: *dest++ = qrgb666(*src++);
- case 2: *dest++ = qrgb666(*src++);
- case 1: *dest = qrgb666(*src);
- }
-}
-#endif // Q_BYTE_ORDER
-
-template <class T>
-inline void qt_rectcopy(T *dest, const T *src,
- int x, int y, int width, int height,
- int dstStride, int srcStride)
-{
- char *d = (char*)(dest + x) + y * dstStride;
- const char *s = (char*)(src);
- for (int i = 0; i < height; ++i) {
- ::memcpy(d, s, width * sizeof(T));
- d += dstStride;
- s += srcStride;
- }
-}
-
-template <class DST, class SRC>
-inline void qt_rectconvert(DST *dest, const SRC *src,
- int x, int y, int width, int height,
- int dstStride, int srcStride)
-{
- char *d = (char*)(dest + x) + y * dstStride;
- const char *s = (char*)(src);
- for (int i = 0; i < height; ++i) {
- qt_memconvert<DST,SRC>((DST*)d, (const SRC*)s, width);
- d += dstStride;
- s += srcStride;
- }
-}
-
-#define QT_RECTCONVERT_TRIVIAL_IMPL(T) \
- template <> \
- inline void qt_rectconvert(T *dest, const T *src, \
- int x, int y, int width, int height, \
- int dstStride, int srcStride) \
- { \
- qt_rectcopy(dest, src, x, y, width, height, dstStride, srcStride); \
- }
-QT_RECTCONVERT_TRIVIAL_IMPL(quint32)
-QT_RECTCONVERT_TRIVIAL_IMPL(qrgb888)
-QT_RECTCONVERT_TRIVIAL_IMPL(qargb6666)
-QT_RECTCONVERT_TRIVIAL_IMPL(qrgb666)
-QT_RECTCONVERT_TRIVIAL_IMPL(qrgb565)
-QT_RECTCONVERT_TRIVIAL_IMPL(qargb8565)
-QT_RECTCONVERT_TRIVIAL_IMPL(quint16)
-QT_RECTCONVERT_TRIVIAL_IMPL(qargb8555)
-QT_RECTCONVERT_TRIVIAL_IMPL(qrgb555)
-QT_RECTCONVERT_TRIVIAL_IMPL(qargb4444)
-QT_RECTCONVERT_TRIVIAL_IMPL(qrgb444)
-#undef QT_RECTCONVERT_TRIVIAL_IMPL
-
#define QT_MEMFILL_UINT(dest, length, color) \
qt_memfill<quint32>(dest, color, length);
@@ -2137,6 +950,162 @@ void QT_FASTCALL rasterop_solid_NotSource(uint *dest, int length, uint color, ui
void QT_FASTCALL rasterop_solid_NotSourceAndDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_SourceAndNotDestination(uint *dest, int length, uint color, uint const_alpha);
+
+struct QPixelLayout;
+typedef const uint *(QT_FASTCALL *ConvertFunc)(uint *buffer, const uint *src, int count,
+ const QPixelLayout *layout, const QRgb *clut);
+
+struct QPixelLayout
+{
+ // Bits per pixel
+ enum BPP {
+ BPPNone,
+ BPP1MSB,
+ BPP1LSB,
+ BPP8,
+ BPP16,
+ BPP24,
+ BPP32,
+ BPPCount
+ };
+
+ // All numbers in bits.
+ uchar redWidth;
+ uchar redShift;
+ uchar greenWidth;
+ uchar greenShift;
+ uchar blueWidth;
+ uchar blueShift;
+ uchar alphaWidth;
+ uchar alphaShift;
+ bool premultiplied;
+ BPP bpp;
+ ConvertFunc convertToARGB32PM;
+ ConvertFunc convertFromARGB32PM;
+};
+
+template <QPixelLayout::BPP bpp>
+uint fetchPixel(const uchar *src, int index);
+
+template <>
+inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP1LSB>(const uchar *src, int index)
+{
+ return (src[index >> 3] >> (index & 7)) & 1;
+}
+
+template <>
+inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP1MSB>(const uchar *src, int index)
+{
+ return (src[index >> 3] >> (~index & 7)) & 1;
+}
+
+template <>
+inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP8>(const uchar *src, int index)
+{
+ return src[index];
+}
+
+template <>
+inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP16>(const uchar *src, int index)
+{
+ return reinterpret_cast<const quint16 *>(src)[index];
+}
+
+template <>
+inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP24>(const uchar *src, int index)
+{
+ return reinterpret_cast<const quint24 *>(src)[index];
+}
+
+template <>
+inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP32>(const uchar *src, int index)
+{
+ return reinterpret_cast<const uint *>(src)[index];
+}
+
+template <QPixelLayout::BPP bpp>
+inline const uint *QT_FASTCALL fetchPixels(uint *buffer, const uchar *src, int index, int count)
+{
+ for (int i = 0; i < count; ++i)
+ buffer[i] = fetchPixel<bpp>(src, index + i);
+ return buffer;
+}
+
+template <>
+inline const uint *QT_FASTCALL fetchPixels<QPixelLayout::BPP32>(uint *, const uchar *src, int index, int)
+{
+ return reinterpret_cast<const uint *>(src) + index;
+}
+
+typedef const uint *(QT_FASTCALL *FetchPixelsFunc)(uint *buffer, const uchar *src, int index, int count);
+
+
+template <QPixelLayout::BPP width>
+void storePixel(uchar *dest, int index, uint pixel);
+
+template <>
+inline void QT_FASTCALL storePixel<QPixelLayout::BPP1LSB>(uchar *dest, int index, uint pixel)
+{
+ if (pixel)
+ dest[index >> 3] |= 1 << (index & 7);
+ else
+ dest[index >> 3] &= ~(1 << (index & 7));
+}
+
+template <>
+inline void QT_FASTCALL storePixel<QPixelLayout::BPP1MSB>(uchar *dest, int index, uint pixel)
+{
+ if (pixel)
+ dest[index >> 3] |= 1 << (~index & 7);
+ else
+ dest[index >> 3] &= ~(1 << (~index & 7));
+}
+
+template <>
+inline void QT_FASTCALL storePixel<QPixelLayout::BPP8>(uchar *dest, int index, uint pixel)
+{
+ dest[index] = uchar(pixel);
+}
+
+template <>
+inline void QT_FASTCALL storePixel<QPixelLayout::BPP16>(uchar *dest, int index, uint pixel)
+{
+ reinterpret_cast<quint16 *>(dest)[index] = quint16(pixel);
+}
+
+template <>
+inline void QT_FASTCALL storePixel<QPixelLayout::BPP24>(uchar *dest, int index, uint pixel)
+{
+ reinterpret_cast<quint24 *>(dest)[index] = quint24(pixel);
+}
+
+template <>
+inline void QT_FASTCALL storePixel<QPixelLayout::BPP32>(uchar *dest, int index, uint pixel)
+{
+ reinterpret_cast<uint *>(dest)[index] = pixel;
+}
+
+template <QPixelLayout::BPP width>
+inline void QT_FASTCALL storePixels(uchar *dest, const uint *src, int index, int count)
+{
+ for (int i = 0; i < count; ++i)
+ storePixel<width>(dest, index + i, src[i]);
+}
+
+template <>
+inline void QT_FASTCALL storePixels<QPixelLayout::BPP32>(uchar *dest, const uint *src, int index, int count)
+{
+ memcpy(reinterpret_cast<uint *>(dest) + index, src, count * sizeof(uint));
+}
+
+typedef void (QT_FASTCALL *StorePixelsFunc)(uchar *dest, const uint *src, int index, int count);
+
+extern QPixelLayout qPixelLayouts[QImage::NImageFormats];
+extern FetchPixelsFunc qFetchPixels[QPixelLayout::BPPCount];
+extern StorePixelsFunc qStorePixels[QPixelLayout::BPPCount];
+
+
+
QT_END_NAMESPACE
#endif // QDRAWHELPER_P_H
diff --git a/src/gui/painting/qdrawhelper_sse2.cpp b/src/gui/painting/qdrawhelper_sse2.cpp
index 17b249a235..7b57d5c5e2 100644
--- a/src/gui/painting/qdrawhelper_sse2.cpp
+++ b/src/gui/painting/qdrawhelper_sse2.cpp
@@ -459,7 +459,7 @@ void qt_bitmapblit16_sse2(QRasterBuffer *rasterBuffer, int x, int y,
quint32 color,
const uchar *src, int width, int height, int stride)
{
- const quint16 c = qt_colorConvert<quint16, quint32>(color, 0);
+ const quint16 c = qConvertRgb32To16(color);
quint16 *dest = reinterpret_cast<quint16*>(rasterBuffer->scanLine(y)) + x;
const int destStride = rasterBuffer->bytesPerLine() / sizeof(quint16);
@@ -629,8 +629,9 @@ void qt_scale_image_argb32_on_argb32_sse2(uchar *destPixels, int dbpl,
int x = 0;
ALIGNMENT_PROLOGUE_16BYTES(dst, x, w) {
- uint s = src[(srcx + x*ix) >> 16];
+ uint s = src[srcx >> 16];
dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s));
+ srcx += ix;
}
__m128i srcxVector = _mm_set_epi32(srcx, srcx + ix, srcx + ix + ix, srcx + ix + ix + ix);
@@ -646,7 +647,7 @@ void qt_scale_image_argb32_on_argb32_sse2(uchar *destPixels, int dbpl,
}
for (; x<w; x++) {
- uint s = src[(srcx + x*ix) >> 16];
+ uint s = src[(basex + x*ix) >> 16];
dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s));
}
dst = (quint32 *)(((uchar *) dst) + dbpl);
diff --git a/src/gui/painting/qdrawhelper_sse_p.h b/src/gui/painting/qdrawhelper_sse_p.h
index 81a5001fb3..494ee70fcb 100644
--- a/src/gui/painting/qdrawhelper_sse_p.h
+++ b/src/gui/painting/qdrawhelper_sse_p.h
@@ -127,7 +127,7 @@ inline void qt_bitmapblit16_sse_template(QRasterBuffer *rasterBuffer,
const uchar *src,
int width, int height, int stride)
{
- const quint16 c = qt_colorConvert<quint16, quint32>(color, 0);
+ const quint16 c = qConvertRgb32To16(color);
quint16 *dest = reinterpret_cast<quint16*>(rasterBuffer->scanLine(y)) + x;
const int destStride = rasterBuffer->bytesPerLine() / sizeof(quint16);
diff --git a/src/gui/painting/qmemrotate.cpp b/src/gui/painting/qmemrotate.cpp
index 5d027b669b..e6fcc3e5dd 100644
--- a/src/gui/painting/qmemrotate.cpp
+++ b/src/gui/painting/qmemrotate.cpp
@@ -53,36 +53,36 @@ static const int tileSize = 32;
#endif
#endif
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_cachedRead(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate90_cachedRead(const T *src, int w, int h, int sstride, T *dest,
+ int dstride)
{
const char *s = reinterpret_cast<const char*>(src);
char *d = reinterpret_cast<char*>(dest);
for (int y = 0; y < h; ++y) {
for (int x = w - 1; x >= 0; --x) {
- DST *destline = reinterpret_cast<DST*>(d + (w - x - 1) * dstride);
- destline[y] = qt_colorConvert<DST,SRC>(src[x], 0);
+ T *destline = reinterpret_cast<T *>(d + (w - x - 1) * dstride);
+ destline[y] = src[x];
}
s += sstride;
- src = reinterpret_cast<const SRC*>(s);
+ src = reinterpret_cast<const T*>(s);
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_cachedRead(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate270_cachedRead(const T *src, int w, int h, int sstride, T *dest,
+ int dstride)
{
const char *s = reinterpret_cast<const char*>(src);
char *d = reinterpret_cast<char*>(dest);
s += (h - 1) * sstride;
for (int y = h - 1; y >= 0; --y) {
- src = reinterpret_cast<const SRC*>(s);
+ src = reinterpret_cast<const T*>(s);
for (int x = 0; x < w; ++x) {
- DST *destline = reinterpret_cast<DST*>(d + x * dstride);
- destline[h - y - 1] = qt_colorConvert<DST,SRC>(src[x], 0);
+ T *destline = reinterpret_cast<T *>(d + x * dstride);
+ destline[h - y - 1] = src[x];
}
s -= sstride;
}
@@ -90,29 +90,29 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_cachedRead(const SRC *src
#if QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDWRITE
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_cachedWrite(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate90_cachedWrite(const T *src, int w, int h, int sstride, T *dest,
+ int dstride)
{
for (int x = w - 1; x >= 0; --x) {
- DST *d = dest + (w - x - 1) * dstride;
+ T *d = dest + (w - x - 1) * dstride;
for (int y = 0; y < h; ++y) {
- *d++ = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ *d++ = src[y * sstride + x];
}
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_cachedWrite(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate270_cachedWrite(const T *src, int w, int h, int sstride, T *dest,
+ int dstride)
{
for (int x = 0; x < w; ++x) {
- DST *d = dest + x * dstride;
+ T *d = dest + x * dstride;
for (int y = h - 1; y >= 0; --y) {
- *d++ = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ *d++ = src[y * sstride + x];
}
}
}
@@ -123,23 +123,21 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_cachedWrite(const SRC *sr
// TODO: packing algorithms should probably be modified on 64-bit architectures
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_packing(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate90_packing(const T *src, int w, int h, int sstride, T *dest, int dstride)
{
- sstride /= sizeof(SRC);
- dstride /= sizeof(DST);
+ sstride /= sizeof(T);
+ dstride /= sizeof(T);
- const int pack = sizeof(quint32) / sizeof(DST);
- const int unaligned = int((long(dest) & (sizeof(quint32)-1))) / sizeof(DST);
+ const int pack = sizeof(quint32) / sizeof(T);
+ const int unaligned = int((long(dest) & (sizeof(quint32)-1))) / sizeof(T);
for (int x = w - 1; x >= 0; --x) {
int y = 0;
for (int i = 0; i < unaligned; ++i) {
- dest[(w - x - 1) * dstride + y]
- = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ dest[(w - x - 1) * dstride + y] = src[y * sstride + x];
++y;
}
@@ -147,40 +145,36 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_packing(const SRC *src, in
+ unaligned);
const int rest = (h - unaligned) % pack;
while (y < h - rest) {
- quint32 c = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ quint32 c = src[y * sstride + x];
for (int i = 1; i < pack; ++i) {
- c |= qt_colorConvert<DST,SRC>(src[(y + i) * sstride + x], 0)
- << (sizeof(int) * 8 / pack * i);
+ c |= src[(y + i) * sstride + x] << (sizeof(int) * 8 / pack * i);
}
*d++ = c;
y += pack;
}
while (y < h) {
- dest[(w - x - 1) * dstride + y]
- = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ dest[(w - x - 1) * dstride + y] = src[y * sstride + x];
++y;
}
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_packing(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate270_packing(const T *src, int w, int h, int sstride, T *dest, int dstride)
{
- sstride /= sizeof(SRC);
- dstride /= sizeof(DST);
+ sstride /= sizeof(T);
+ dstride /= sizeof(T);
- const int pack = sizeof(quint32) / sizeof(DST);
- const int unaligned = int((long(dest) & (sizeof(quint32)-1))) / sizeof(DST);
+ const int pack = sizeof(quint32) / sizeof(T);
+ const int unaligned = int((long(dest) & (sizeof(quint32)-1))) / sizeof(T);
for (int x = 0; x < w; ++x) {
int y = h - 1;
for (int i = 0; i < unaligned; ++i) {
- dest[x * dstride + h - y - 1]
- = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ dest[x * dstride + h - y - 1] = src[y * sstride + x];
--y;
}
@@ -188,17 +182,15 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_packing(const SRC *src, i
+ unaligned);
const int rest = (h - unaligned) % pack;
while (y > rest) {
- quint32 c = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ quint32 c = src[y * sstride + x];
for (int i = 1; i < pack; ++i) {
- c |= qt_colorConvert<DST,SRC>(src[(y - i) * sstride + x], 0)
- << (sizeof(int) * 8 / pack * i);
+ c |= src[(y - i) * sstride + x] << (sizeof(int) * 8 / pack * i);
}
*d++ = c;
y -= pack;
}
while (y >= 0) {
- dest[x * dstride + h - y - 1]
- = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ dest[x * dstride + h - y - 1] = src[y * sstride + x];
--y;
}
}
@@ -207,17 +199,16 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_packing(const SRC *src, i
#endif // QT_ROTATION_PACKING
#if QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate90_tiled(const T *src, int w, int h, int sstride, T *dest, int dstride)
{
- sstride /= sizeof(SRC);
- dstride /= sizeof(DST);
+ sstride /= sizeof(T);
+ dstride /= sizeof(T);
- const int pack = sizeof(quint32) / sizeof(DST);
+ const int pack = sizeof(quint32) / sizeof(T);
const int unaligned =
- qMin(uint((quintptr(dest) & (sizeof(quint32)-1)) / sizeof(DST)), uint(h));
+ qMin(uint((quintptr(dest) & (sizeof(quint32)-1)) / sizeof(T)), uint(h));
const int restX = w % tileSize;
const int restY = (h - unaligned) % tileSize;
const int unoptimizedY = restY % pack;
@@ -230,9 +221,9 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled(const SRC *src, int
if (unaligned) {
for (int x = startx; x >= stopx; --x) {
- DST *d = dest + (w - x - 1) * dstride;
+ T *d = dest + (w - x - 1) * dstride;
for (int y = 0; y < unaligned; ++y) {
- *d++ = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ *d++ = src[y * sstride + x];
}
}
}
@@ -244,10 +235,10 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled(const SRC *src, int
for (int x = startx; x >= stopx; --x) {
quint32 *d = reinterpret_cast<quint32*>(dest + (w - x - 1) * dstride + starty);
for (int y = starty; y < stopy; y += pack) {
- quint32 c = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ quint32 c = src[y * sstride + x];
for (int i = 1; i < pack; ++i) {
const int shift = (sizeof(int) * 8 / pack * i);
- const DST color = qt_colorConvert<DST,SRC>(src[(y + i) * sstride + x], 0);
+ const T color = src[(y + i) * sstride + x];
c |= color << shift;
}
*d++ = c;
@@ -258,19 +249,19 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled(const SRC *src, int
if (unoptimizedY) {
const int starty = h - unoptimizedY;
for (int x = startx; x >= stopx; --x) {
- DST *d = dest + (w - x - 1) * dstride + starty;
+ T *d = dest + (w - x - 1) * dstride + starty;
for (int y = starty; y < h; ++y) {
- *d++ = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ *d++ = src[y * sstride + x];
}
}
}
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled_unpacked(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate90_tiled_unpacked(const T *src, int w, int h, int sstride, T *dest,
+ int dstride)
{
const int numTilesX = (w + tileSize - 1) / tileSize;
const int numTilesY = (h + tileSize - 1) / tileSize;
@@ -284,10 +275,10 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled_unpacked(const SRC *
const int stopy = qMin(starty + tileSize, h);
for (int x = startx; x >= stopx; --x) {
- DST *d = (DST*)((char*)dest + (w - x - 1) * dstride) + starty;
+ T *d = (T *)((char*)dest + (w - x - 1) * dstride) + starty;
const char *s = (const char*)(src + x) + starty * sstride;
for (int y = starty; y < stopy; ++y) {
- *d++ = qt_colorConvert<DST,SRC>(*(const SRC*)(s), 0);
+ *d++ = *(const T *)(s);
s += sstride;
}
}
@@ -295,17 +286,16 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_tiled_unpacked(const SRC *
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate270_tiled(const T *src, int w, int h, int sstride, T *dest, int dstride)
{
- sstride /= sizeof(SRC);
- dstride /= sizeof(DST);
+ sstride /= sizeof(T);
+ dstride /= sizeof(T);
- const int pack = sizeof(quint32) / sizeof(DST);
+ const int pack = sizeof(quint32) / sizeof(T);
const int unaligned =
- qMin(uint((long(dest) & (sizeof(quint32)-1)) / sizeof(DST)), uint(h));
+ qMin(uint((long(dest) & (sizeof(quint32)-1)) / sizeof(T)), uint(h));
const int restX = w % tileSize;
const int restY = (h - unaligned) % tileSize;
const int unoptimizedY = restY % pack;
@@ -318,9 +308,9 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled(const SRC *src, int
if (unaligned) {
for (int x = startx; x < stopx; ++x) {
- DST *d = dest + x * dstride;
+ T *d = dest + x * dstride;
for (int y = h - 1; y >= h - unaligned; --y) {
- *d++ = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ *d++ = src[y * sstride + x];
}
}
}
@@ -333,10 +323,10 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled(const SRC *src, int
quint32 *d = reinterpret_cast<quint32*>(dest + x * dstride
+ h - 1 - starty);
for (int y = starty; y > stopy; y -= pack) {
- quint32 c = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ quint32 c = src[y * sstride + x];
for (int i = 1; i < pack; ++i) {
const int shift = (sizeof(int) * 8 / pack * i);
- const DST color = qt_colorConvert<DST,SRC>(src[(y - i) * sstride + x], 0);
+ const T color = src[(y - i) * sstride + x];
c |= color << shift;
}
*d++ = c;
@@ -346,19 +336,19 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled(const SRC *src, int
if (unoptimizedY) {
const int starty = unoptimizedY - 1;
for (int x = startx; x < stopx; ++x) {
- DST *d = dest + x * dstride + h - 1 - starty;
+ T *d = dest + x * dstride + h - 1 - starty;
for (int y = starty; y >= 0; --y) {
- *d++ = qt_colorConvert<DST,SRC>(src[y * sstride + x], 0);
+ *d++ = src[y * sstride + x];
}
}
}
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled_unpacked(const SRC *src, int w, int h,
- int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate270_tiled_unpacked(const T *src, int w, int h, int sstride, T *dest,
+ int dstride)
{
const int numTilesX = (w + tileSize - 1) / tileSize;
const int numTilesY = (h + tileSize - 1) / tileSize;
@@ -372,10 +362,10 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled_unpacked(const SRC
const int stopy = qMax(starty - tileSize, 0);
for (int x = startx; x < stopx; ++x) {
- DST *d = (DST*)((char*)dest + x * dstride) + h - 1 - starty;
+ T *d = (T*)((char*)dest + x * dstride) + h - 1 - starty;
const char *s = (const char*)(src + x) + starty * sstride;
for (int y = starty; y >= stopy; --y) {
- *d++ = qt_colorConvert<DST,SRC>(*(const SRC*)s, 0);
+ *d++ = *(const T*)s;
s -= sstride;
}
}
@@ -385,214 +375,112 @@ Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_tiled_unpacked(const SRC
#endif // QT_ROTATION_ALGORITHM
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate90_template(const SRC *src,
- int srcWidth, int srcHeight, int srcStride,
- DST *dest, int dstStride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate90_template(const T *src, int srcWidth, int srcHeight, int srcStride,
+ T *dest, int dstStride)
{
#if QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDREAD
- qt_memrotate90_cachedRead<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate90_cachedRead<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDWRITE
- qt_memrotate90_cachedWrite<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate90_cachedWrite<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
- qt_memrotate90_packing<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate90_packing<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
- qt_memrotate90_tiled<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate90_tiled<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#endif
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate180_template(const SRC *src,
- int w, int h, int sstride,
- DST *dest, int dstride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate180_template(const T *src, int w, int h, int sstride, T *dest, int dstride)
{
const char *s = (const char*)(src) + (h - 1) * sstride;
for (int y = h - 1; y >= 0; --y) {
- DST *d = reinterpret_cast<DST*>((char *)(dest) + (h - y - 1) * dstride);
- src = reinterpret_cast<const SRC*>(s);
+ T *d = reinterpret_cast<T*>((char *)(dest) + (h - y - 1) * dstride);
+ src = reinterpret_cast<const T*>(s);
for (int x = w - 1; x >= 0; --x) {
- d[w - x - 1] = qt_colorConvert<DST,SRC>(src[x], 0);
+ d[w - x - 1] = src[x];
}
s -= sstride;
}
}
-template <class DST, class SRC>
-Q_STATIC_TEMPLATE_FUNCTION inline void qt_memrotate270_template(const SRC *src,
- int srcWidth, int srcHeight, int srcStride,
- DST *dest, int dstStride)
+template <class T>
+Q_STATIC_TEMPLATE_FUNCTION
+inline void qt_memrotate270_template(const T *src, int srcWidth, int srcHeight, int srcStride,
+ T *dest, int dstStride)
{
#if QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDREAD
- qt_memrotate270_cachedRead<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate270_cachedRead<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDWRITE
- qt_memrotate270_cachedWrite<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate270_cachedWrite<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
- qt_memrotate270_packing<DST,SRC>(src, srcWidth, srcHeight, srcStride,
- dest, dstStride);
+ qt_memrotate270_packing<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
- qt_memrotate270_tiled_unpacked<DST,SRC>(src, srcWidth, srcHeight,
- srcStride,
- dest, dstStride);
+ qt_memrotate270_tiled_unpacked<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#endif
}
template <>
Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void qt_memrotate90_template<quint24, quint24>(const quint24 *src,
- int srcWidth, int srcHeight, int srcStride,
- quint24 *dest, int dstStride)
+inline void qt_memrotate90_template<quint24>(const quint24 *src, int srcWidth, int srcHeight,
+ int srcStride, quint24 *dest, int dstStride)
{
#if QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDREAD
- qt_memrotate90_cachedRead<quint24,quint24>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
+ qt_memrotate90_cachedRead<quint24>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDWRITE
- qt_memrotate90_cachedWrite<quint24,quint24>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
+ qt_memrotate90_cachedWrite<quint24>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
// packed algorithm not implemented
- qt_memrotate90_cachedRead<quint24,quint24>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
+ qt_memrotate90_cachedRead<quint24>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
// packed algorithm not implemented
- qt_memrotate90_tiled_unpacked<quint24,quint24>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
+ qt_memrotate90_tiled_unpacked<quint24>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
#endif
}
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void qt_memrotate90_template<quint24, quint32>(const quint32 *src,
- int srcWidth, int srcHeight, int srcStride,
- quint24 *dest, int dstStride)
-{
-#if QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDREAD
- qt_memrotate90_cachedRead<quint24,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#elif QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDWRITE
- qt_memrotate90_cachedWrite<quint24,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#elif QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
- // packed algorithm not implemented
- qt_memrotate90_cachedRead<quint24,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
- // packed algorithm not implemented
- qt_memrotate90_tiled_unpacked<quint24,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#endif
-}
-
-template <>
-Q_STATIC_TEMPLATE_SPECIALIZATION
-inline void qt_memrotate90_template<quint18, quint32>(const quint32 *src,
- int srcWidth, int srcHeight, int srcStride,
- quint18 *dest, int dstStride)
-{
-#if QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDREAD
- qt_memrotate90_cachedRead<quint18,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#elif QT_ROTATION_ALGORITHM == QT_ROTATION_CACHEDWRITE
- qt_memrotate90_cachedWrite<quint18,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#elif QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
- // packed algorithm not implemented
- qt_memrotate90_cachedRead<quint18,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
- // packed algorithm not implemented
- qt_memrotate90_tiled_unpacked<quint18,quint32>(src, srcWidth, srcHeight,
- srcStride, dest, dstStride);
-#endif
-}
-
-#define QT_IMPL_MEMROTATE(srctype, desttype) \
-Q_GUI_EXPORT void qt_memrotate90(const srctype *src, int w, int h, int sstride, \
- desttype *dest, int dstride) \
+#define QT_IMPL_MEMROTATE(type) \
+Q_GUI_EXPORT void qt_memrotate90(const type *src, int w, int h, int sstride, \
+ type *dest, int dstride) \
{ \
qt_memrotate90_template(src, w, h, sstride, dest, dstride); \
} \
-Q_GUI_EXPORT void qt_memrotate180(const srctype *src, int w, int h, int sstride, \
- desttype *dest, int dstride) \
+Q_GUI_EXPORT void qt_memrotate180(const type *src, int w, int h, int sstride, \
+ type *dest, int dstride) \
{ \
qt_memrotate180_template(src, w, h, sstride, dest, dstride); \
} \
-Q_GUI_EXPORT void qt_memrotate270(const srctype *src, int w, int h, int sstride, \
- desttype *dest, int dstride) \
+Q_GUI_EXPORT void qt_memrotate270(const type *src, int w, int h, int sstride, \
+ type *dest, int dstride) \
{ \
qt_memrotate270_template(src, w, h, sstride, dest, dstride); \
}
-#define QT_IMPL_SIMPLE_MEMROTATE(srctype, desttype) \
-Q_GUI_EXPORT void qt_memrotate90(const srctype *src, int w, int h, int sstride, \
- desttype *dest, int dstride) \
+#define QT_IMPL_SIMPLE_MEMROTATE(type) \
+Q_GUI_EXPORT void qt_memrotate90(const type *src, int w, int h, int sstride, \
+ type *dest, int dstride) \
{ \
- qt_memrotate90_tiled_unpacked<desttype,srctype>(src, w, h, sstride, dest, dstride); \
+ qt_memrotate90_tiled_unpacked<type>(src, w, h, sstride, dest, dstride); \
} \
-Q_GUI_EXPORT void qt_memrotate180(const srctype *src, int w, int h, int sstride, \
- desttype *dest, int dstride) \
+Q_GUI_EXPORT void qt_memrotate180(const type *src, int w, int h, int sstride, \
+ type *dest, int dstride) \
{ \
qt_memrotate180_template(src, w, h, sstride, dest, dstride); \
} \
-Q_GUI_EXPORT void qt_memrotate270(const srctype *src, int w, int h, int sstride, \
- desttype *dest, int dstride) \
+Q_GUI_EXPORT void qt_memrotate270(const type *src, int w, int h, int sstride, \
+ type *dest, int dstride) \
{ \
- qt_memrotate270_tiled_unpacked<desttype,srctype>(src, w, h, sstride, dest, dstride); \
+ qt_memrotate270_tiled_unpacked<type>(src, w, h, sstride, dest, dstride); \
}
-QT_IMPL_MEMROTATE(quint32, quint32)
-QT_IMPL_MEMROTATE(quint32, quint16)
-QT_IMPL_MEMROTATE(quint16, quint32)
-QT_IMPL_MEMROTATE(quint16, quint16)
-QT_IMPL_MEMROTATE(quint24, quint24)
-QT_IMPL_MEMROTATE(quint32, quint24)
-QT_IMPL_MEMROTATE(quint32, quint18)
-QT_IMPL_MEMROTATE(quint32, quint8)
-QT_IMPL_MEMROTATE(quint16, quint8)
-QT_IMPL_MEMROTATE(qrgb444, quint8)
-QT_IMPL_MEMROTATE(quint8, quint8)
-
-#if defined(QT_QWS_ROTATE_BGR)
-QT_IMPL_SIMPLE_MEMROTATE(quint16, qbgr565)
-QT_IMPL_SIMPLE_MEMROTATE(quint32, qbgr565)
-QT_IMPL_SIMPLE_MEMROTATE(qrgb555, qbgr555)
-QT_IMPL_SIMPLE_MEMROTATE(quint32, qbgr555)
-#endif
-
-#ifdef QT_QWS_DEPTH_GENERIC
-QT_IMPL_MEMROTATE(quint32, qrgb_generic16)
-QT_IMPL_MEMROTATE(quint16, qrgb_generic16)
-#endif
-
-struct qrgb_gl_rgba
-{
-public:
- inline qrgb_gl_rgba(quint32 v) {
- if (QSysInfo::ByteOrder == QSysInfo::LittleEndian)
- data = ((v << 16) & 0xff0000) | ((v >> 16) & 0xff) | (v & 0xff00ff00);
- else
- data = (v << 8) | ((v >> 24) & 0xff);
- }
-
- inline operator quint32() const { return data; }
-
-private:
- quint32 data;
-} Q_PACKED;
-
-void Q_GUI_EXPORT qt_memrotate90_gl(const quint32 *src, int srcWidth, int srcHeight, int srcStride,
- quint32 *dest, int dstStride)
-{
- qt_memrotate90_template(src, srcWidth, srcHeight, srcStride, reinterpret_cast<qrgb_gl_rgba *>(dest), dstStride);
-}
+QT_IMPL_MEMROTATE(quint32)
+QT_IMPL_MEMROTATE(quint16)
+QT_IMPL_MEMROTATE(quint24)
+QT_IMPL_MEMROTATE(quint8)
void qt_memrotate90_16(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
{
diff --git a/src/gui/painting/qmemrotate_p.h b/src/gui/painting/qmemrotate_p.h
index 4c4bc94767..a72310e330 100644
--- a/src/gui/painting/qmemrotate_p.h
+++ b/src/gui/painting/qmemrotate_p.h
@@ -70,37 +70,15 @@ QT_BEGIN_NAMESPACE
#endif
#endif
-#define QT_DECL_MEMROTATE(srctype, desttype) \
- void Q_GUI_EXPORT qt_memrotate90(const srctype*, int, int, int, desttype*, int); \
- void Q_GUI_EXPORT qt_memrotate180(const srctype*, int, int, int, desttype*, int); \
- void Q_GUI_EXPORT qt_memrotate270(const srctype*, int, int, int, desttype*, int)
+#define QT_DECL_MEMROTATE(type) \
+ void Q_GUI_EXPORT qt_memrotate90(const type*, int, int, int, type*, int); \
+ void Q_GUI_EXPORT qt_memrotate180(const type*, int, int, int, type*, int); \
+ void Q_GUI_EXPORT qt_memrotate270(const type*, int, int, int, type*, int)
-void Q_GUI_EXPORT qt_memrotate90(const quint32*, int, int, int, quint32*, int);
-void Q_GUI_EXPORT qt_memrotate180(const quint32*, int, int, int, quint32*, int);
-void Q_GUI_EXPORT qt_memrotate270(const quint32*, int, int, int, quint32*, int);
-
-QT_DECL_MEMROTATE(quint32, quint16);
-QT_DECL_MEMROTATE(quint16, quint32);
-QT_DECL_MEMROTATE(quint16, quint16);
-QT_DECL_MEMROTATE(quint24, quint24);
-QT_DECL_MEMROTATE(quint32, quint24);
-QT_DECL_MEMROTATE(quint32, quint18);
-QT_DECL_MEMROTATE(quint32, quint8);
-QT_DECL_MEMROTATE(quint16, quint8);
-QT_DECL_MEMROTATE(qrgb444, quint8);
-QT_DECL_MEMROTATE(quint8, quint8);
-
-#ifdef QT_QWS_ROTATE_BGR
-QT_DECL_MEMROTATE(quint16, qbgr565);
-QT_DECL_MEMROTATE(quint32, qbgr565);
-QT_DECL_MEMROTATE(qrgb555, qbgr555);
-QT_DECL_MEMROTATE(quint32, qbgr555);
-#endif
-
-#ifdef QT_QWS_DEPTH_GENERIC
-QT_DECL_MEMROTATE(quint32, qrgb_generic16);
-QT_DECL_MEMROTATE(quint16, qrgb_generic16);
-#endif
+QT_DECL_MEMROTATE(quint32);
+QT_DECL_MEMROTATE(quint16);
+QT_DECL_MEMROTATE(quint24);
+QT_DECL_MEMROTATE(quint8);
#undef QT_DECL_MEMROTATE
diff --git a/src/gui/painting/qpathsimplifier.cpp b/src/gui/painting/qpathsimplifier.cpp
new file mode 100644
index 0000000000..fc3ce6361b
--- /dev/null
+++ b/src/gui/painting/qpathsimplifier.cpp
@@ -0,0 +1,1673 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qpathsimplifier_p.h"
+
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qglobal.h>
+#include <QtCore/qpoint.h>
+#include <QtCore/qalgorithms.h>
+
+#include <math.h>
+
+#include <private/qopengl_p.h>
+#include <private/qrbtree_p.h>
+
+QT_BEGIN_NAMESPACE
+
+#define Q_FIXED_POINT_SCALE 256
+#define Q_TRIANGULATE_END_OF_POLYGON quint32(-1)
+
+
+namespace {
+
+//============================================================================//
+// QPoint //
+//============================================================================//
+
+inline bool operator < (const QPoint &a, const QPoint &b)
+{
+ return a.y() < b.y() || (a.y() == b.y() && a.x() < b.x());
+}
+
+inline bool operator > (const QPoint &a, const QPoint &b)
+{
+ return b < a;
+}
+
+inline bool operator <= (const QPoint &a, const QPoint &b)
+{
+ return !(a > b);
+}
+
+inline bool operator >= (const QPoint &a, const QPoint &b)
+{
+ return !(a < b);
+}
+
+inline int cross(const QPoint &u, const QPoint &v)
+{
+ return u.x() * v.y() - u.y() * v.x();
+}
+
+inline int dot(const QPoint &u, const QPoint &v)
+{
+ return u.x() * v.x() + u.y() * v.y();
+}
+
+//============================================================================//
+// Fraction //
+//============================================================================//
+
+// Fraction must be in the range [0, 1)
+struct Fraction
+{
+ bool isValid() const { return denominator != 0; }
+
+ // numerator and denominator must not have common denominators.
+ unsigned int numerator, denominator;
+};
+
+inline unsigned int gcd(unsigned int x, unsigned int y)
+{
+ while (y != 0) {
+ unsigned int z = y;
+ y = x % y;
+ x = z;
+ }
+ return x;
+}
+
+// Fraction must be in the range [0, 1)
+// Assume input is valid.
+Fraction fraction(unsigned int n, unsigned int d) {
+ Fraction result;
+ if (n == 0) {
+ result.numerator = 0;
+ result.denominator = 1;
+ } else {
+ unsigned int g = gcd(n, d);
+ result.numerator = n / g;
+ result.denominator = d / g;
+ }
+ return result;
+}
+
+//============================================================================//
+// Rational //
+//============================================================================//
+
+struct Rational
+{
+ bool isValid() const { return fraction.isValid(); }
+ int integer;
+ Fraction fraction;
+};
+
+//============================================================================//
+// IntersectionPoint //
+//============================================================================//
+
+struct IntersectionPoint
+{
+ bool isValid() const { return x.fraction.isValid() && y.fraction.isValid(); }
+ QPoint round() const;
+ bool isAccurate() const { return x.fraction.numerator == 0 && y.fraction.numerator == 0; }
+
+ Rational x; // 8:8 signed, 32/32
+ Rational y; // 8:8 signed, 32/32
+};
+
+QPoint IntersectionPoint::round() const
+{
+ QPoint result(x.integer, y.integer);
+ if (2 * x.fraction.numerator >= x.fraction.denominator)
+ ++result.rx();
+ if (2 * y.fraction.numerator >= y.fraction.denominator)
+ ++result.ry();
+ return result;
+}
+
+// Return positive value if 'p' is to the right of the line 'v1'->'v2', negative if left of the
+// line and zero if exactly on the line.
+// The returned value is the z-component of the qCross product between 'v2-v1' and 'p-v1',
+// which is twice the signed area of the triangle 'p'->'v1'->'v2' (positive for CW order).
+inline int pointDistanceFromLine(const QPoint &p, const QPoint &v1, const QPoint &v2)
+{
+ return cross(v2 - v1, p - v1);
+}
+
+IntersectionPoint intersectionPoint(const QPoint &u1, const QPoint &u2,
+ const QPoint &v1, const QPoint &v2)
+{
+ IntersectionPoint result = {{0, {0, 0}}, {0, {0, 0}}};
+
+ QPoint u = u2 - u1;
+ QPoint v = v2 - v1;
+ int d1 = cross(u, v1 - u1);
+ int d2 = cross(u, v2 - u1);
+ int det = d2 - d1;
+ int d3 = cross(v, u1 - v1);
+ int d4 = d3 - det; //qCross(v, u2 - v1);
+
+ // Check that the math is correct.
+ Q_ASSERT(d4 == cross(v, u2 - v1));
+
+ // The intersection point can be expressed as:
+ // v1 - v * d1/det
+ // v2 - v * d2/det
+ // u1 + u * d3/det
+ // u2 + u * d4/det
+
+ // I'm only interested in lines that are crossing, so ignore parallel lines even if they overlap.
+ if (det == 0)
+ return result;
+
+ if (det < 0) {
+ det = -det;
+ d1 = -d1;
+ d2 = -d2;
+ d3 = -d3;
+ d4 = -d4;
+ }
+
+ // I'm only interested in lines intersecting at their interior, not at their end points.
+ // The lines intersect at their interior if and only if 'd1 < 0', 'd2 > 0', 'd3 < 0' and 'd4 > 0'.
+ if (d1 >= 0 || d2 <= 0 || d3 <= 0 || d4 >= 0)
+ return result;
+
+ // Calculate the intersection point as follows:
+ // v1 - v * d1/det | v1 <= v2 (component-wise)
+ // v2 - v * d2/det | v2 < v1 (component-wise)
+
+ // Assuming 16 bits per vector component.
+ if (v.x() >= 0) {
+ result.x.integer = v1.x() + int(qint64(-v.x()) * d1 / det);
+ result.x.fraction = fraction((unsigned int)(qint64(-v.x()) * d1 % det), (unsigned int)det);
+ } else {
+ result.x.integer = v2.x() + int(qint64(-v.x()) * d2 / det);
+ result.x.fraction = fraction((unsigned int)(qint64(-v.x()) * d2 % det), (unsigned int)det);
+ }
+
+ if (v.y() >= 0) {
+ result.y.integer = v1.y() + int(qint64(-v.y()) * d1 / det);
+ result.y.fraction = fraction((unsigned int)(qint64(-v.y()) * d1 % det), (unsigned int)det);
+ } else {
+ result.y.integer = v2.y() + int(qint64(-v.y()) * d2 / det);
+ result.y.fraction = fraction((unsigned int)(qint64(-v.y()) * d2 % det), (unsigned int)det);
+ }
+
+ Q_ASSERT(result.x.fraction.isValid());
+ Q_ASSERT(result.y.fraction.isValid());
+ return result;
+}
+
+//============================================================================//
+// PathSimplifier //
+//============================================================================//
+
+class PathSimplifier
+{
+public:
+ PathSimplifier(const QVectorPath &path, QDataBuffer<QPoint> &vertices,
+ QDataBuffer<quint32> &indices, const QTransform &matrix);
+
+private:
+ struct Element;
+
+ class BoundingVolumeHierarchy
+ {
+ public:
+ struct Node
+ {
+ enum Type
+ {
+ Leaf,
+ Split
+ };
+ Type type;
+ QPoint minimum;
+ QPoint maximum;
+ union {
+ Element *element; // type == Leaf
+ Node *left; // type == Split
+ };
+ Node *right;
+ };
+
+ BoundingVolumeHierarchy();
+ ~BoundingVolumeHierarchy();
+ void allocate(int nodeCount);
+ void free();
+ Node *newNode();
+
+ Node *root;
+ private:
+ void freeNode(Node *n);
+
+ Node *nodeBlock;
+ int blockSize;
+ int firstFree;
+ };
+
+ struct Element
+ {
+ enum Degree
+ {
+ Line = 1,
+ Quadratic = 2,
+ Cubic = 3
+ };
+
+ quint32 &upperIndex() { return indices[pointingUp ? degree : 0]; }
+ quint32 &lowerIndex() { return indices[pointingUp ? 0 : degree]; }
+ quint32 upperIndex() const { return indices[pointingUp ? degree : 0]; }
+ quint32 lowerIndex() const { return indices[pointingUp ? 0 : degree]; }
+ void flip();
+
+ QPoint middle;
+ quint32 indices[4]; // index to points
+ Element *next, *previous; // used in connectElements()
+ int winding; // used in connectElements()
+ union {
+ QRBTree<Element *>::Node *edgeNode; // used in connectElements()
+ BoundingVolumeHierarchy::Node *bvhNode;
+ };
+ Degree degree : 8;
+ uint processed : 1; // initially false, true when the element has been checked for intersections.
+ uint pointingUp : 1; // used in connectElements()
+ uint originallyPointingUp : 1; // used in connectElements()
+ };
+
+ class ElementAllocator
+ {
+ public:
+ ElementAllocator();
+ ~ElementAllocator();
+ void allocate(int count);
+ Element *newElement();
+ private:
+ struct ElementBlock
+ {
+ ElementBlock *next;
+ int blockSize;
+ int firstFree;
+ Element elements[1];
+ } *blocks;
+ };
+
+ struct Event
+ {
+ enum Type { Upper, Lower };
+ bool operator < (const Event &other) const;
+
+ QPoint point;
+ Type type;
+ Element *element;
+ };
+
+ typedef QRBTree<Element *>::Node RBNode;
+ typedef BoundingVolumeHierarchy::Node BVHNode;
+
+ void initElements(const QVectorPath &path, const QTransform &matrix);
+ void removeIntersections();
+ void connectElements();
+ void fillIndices();
+ BVHNode *buildTree(Element **elements, int elementCount);
+ bool intersectNodes(QDataBuffer<Element *> &elements, BVHNode *elementNode, BVHNode *treeNode);
+ bool equalElements(const Element *e1, const Element *e2);
+ bool splitLineAt(QDataBuffer<Element *> &elements, BVHNode *node, quint32 pointIndex, bool processAgain);
+ void appendSeparatingAxes(QVarLengthArray<QPoint, 12> &axes, Element *element);
+ QPair<int, int> calculateSeparatingAxisRange(const QPoint &axis, Element *element);
+ void splitCurve(QDataBuffer<Element *> &elements, BVHNode *node);
+ bool setElementToQuadratic(Element *element, quint32 pointIndex1, const QPoint &ctrl, quint32 pointIndex2);
+ bool setElementToCubic(Element *element, quint32 pointIndex1, const QPoint &ctrl1, const QPoint &ctrl2, quint32 pointIndex2);
+ void setElementToCubicAndSimplify(Element *element, quint32 pointIndex1, const QPoint &ctrl1, const QPoint &ctrl2, quint32 pointIndex2);
+ RBNode *findElementLeftOf(const Element *element, const QPair<RBNode *, RBNode *> &bounds);
+ bool elementIsLeftOf(const Element *left, const Element *right);
+ QPair<RBNode *, RBNode *> outerBounds(const QPoint &point);
+ static bool flattenQuadratic(const QPoint &u, const QPoint &v, const QPoint &w);
+ static bool flattenCubic(const QPoint &u, const QPoint &v, const QPoint &w, const QPoint &q);
+ static bool splitQuadratic(const QPoint &u, const QPoint &v, const QPoint &w, QPoint *result);
+ static bool splitCubic(const QPoint &u, const QPoint &v, const QPoint &w, const QPoint &q, QPoint *result);
+ void subDivQuadratic(const QPoint &u, const QPoint &v, const QPoint &w);
+ void subDivCubic(const QPoint &u, const QPoint &v, const QPoint &w, const QPoint &q);
+ static void sortEvents(Event *events, int count);
+
+ ElementAllocator m_elementAllocator;
+ QDataBuffer<Element *> m_elements;
+ QDataBuffer<QPoint> *m_points;
+ BoundingVolumeHierarchy m_bvh;
+ QDataBuffer<quint32> *m_indices;
+ QRBTree<Element *> m_elementList;
+ uint m_hints;
+};
+
+inline PathSimplifier::BoundingVolumeHierarchy::BoundingVolumeHierarchy()
+ : root(0)
+ , nodeBlock(0)
+ , blockSize(0)
+ , firstFree(0)
+{
+}
+
+inline PathSimplifier::BoundingVolumeHierarchy::~BoundingVolumeHierarchy()
+{
+ free();
+}
+
+inline void PathSimplifier::BoundingVolumeHierarchy::allocate(int nodeCount)
+{
+ Q_ASSERT(nodeBlock == 0);
+ Q_ASSERT(firstFree == 0);
+ nodeBlock = new Node[blockSize = nodeCount];
+}
+
+inline void PathSimplifier::BoundingVolumeHierarchy::free()
+{
+ freeNode(root);
+ delete[] nodeBlock;
+ nodeBlock = 0;
+ firstFree = blockSize = 0;
+ root = 0;
+}
+
+inline PathSimplifier::BVHNode *PathSimplifier::BoundingVolumeHierarchy::newNode()
+{
+ if (firstFree < blockSize)
+ return &nodeBlock[firstFree++];
+ return new Node;
+}
+
+inline void PathSimplifier::BoundingVolumeHierarchy::freeNode(Node *n)
+{
+ if (!n)
+ return;
+ Q_ASSERT(n->type == Node::Split || n->type == Node::Leaf);
+ if (n->type == Node::Split) {
+ freeNode(n->left);
+ freeNode(n->right);
+ }
+ if (!(n >= nodeBlock && n < nodeBlock + blockSize))
+ delete n;
+}
+
+inline PathSimplifier::ElementAllocator::ElementAllocator()
+ : blocks(0)
+{
+}
+
+inline PathSimplifier::ElementAllocator::~ElementAllocator()
+{
+ while (blocks) {
+ ElementBlock *block = blocks;
+ blocks = blocks->next;
+ free(block);
+ }
+}
+
+inline void PathSimplifier::ElementAllocator::allocate(int count)
+{
+ Q_ASSERT(blocks == 0);
+ Q_ASSERT(count > 0);
+ blocks = (ElementBlock *)malloc(sizeof(ElementBlock) + (count - 1) * sizeof(Element));
+ blocks->blockSize = count;
+ blocks->next = 0;
+ blocks->firstFree = 0;
+}
+
+inline PathSimplifier::Element *PathSimplifier::ElementAllocator::newElement()
+{
+ Q_ASSERT(blocks);
+ if (blocks->firstFree < blocks->blockSize)
+ return &blocks->elements[blocks->firstFree++];
+ ElementBlock *oldBlock = blocks;
+ blocks = (ElementBlock *)malloc(sizeof(ElementBlock) + (oldBlock->blockSize - 1) * sizeof(Element));
+ blocks->blockSize = oldBlock->blockSize;
+ blocks->next = oldBlock;
+ blocks->firstFree = 0;
+ return &blocks->elements[blocks->firstFree++];
+}
+
+
+inline bool PathSimplifier::Event::operator < (const Event &other) const
+{
+ if (point == other.point)
+ return type < other.type;
+ return other.point < point;
+}
+
+inline void PathSimplifier::Element::flip()
+{
+ for (int i = 0; i < (degree + 1) >> 1; ++i) {
+ Q_ASSERT(degree >= Line && degree <= Cubic);
+ Q_ASSERT(i >= 0 && i < degree);
+ qSwap(indices[i], indices[degree - i]);
+ }
+ pointingUp = !pointingUp;
+ Q_ASSERT(next == 0 && previous == 0);
+}
+
+PathSimplifier::PathSimplifier(const QVectorPath &path, QDataBuffer<QPoint> &vertices,
+ QDataBuffer<quint32> &indices, const QTransform &matrix)
+ : m_elements(0)
+ , m_points(&vertices)
+ , m_indices(&indices)
+{
+ m_points->reset();
+ m_indices->reset();
+ initElements(path, matrix);
+ if (!m_elements.isEmpty()) {
+ removeIntersections();
+ connectElements();
+ fillIndices();
+ }
+}
+
+void PathSimplifier::initElements(const QVectorPath &path, const QTransform &matrix)
+{
+ m_hints = path.hints();
+ int pathElementCount = path.elementCount();
+ if (pathElementCount == 0)
+ return;
+ m_elements.reserve(2 * pathElementCount);
+ m_elementAllocator.allocate(2 * pathElementCount);
+ m_points->reserve(2 * pathElementCount);
+ const QPainterPath::ElementType *e = path.elements();
+ const qreal *p = path.points();
+ if (e) {
+ qreal x, y;
+ quint32 moveToIndex = 0;
+ quint32 previousIndex = 0;
+ for (int i = 0; i < pathElementCount; ++i, ++e, p += 2) {
+ switch (*e) {
+ case QPainterPath::MoveToElement:
+ {
+ if (!m_points->isEmpty()) {
+ const QPoint &from = m_points->at(previousIndex);
+ const QPoint &to = m_points->at(moveToIndex);
+ if (from != to) {
+ Element *element = m_elementAllocator.newElement();
+ element->degree = Element::Line;
+ element->indices[0] = previousIndex;
+ element->indices[1] = moveToIndex;
+ element->middle.rx() = (from.x() + to.x()) >> 1;
+ element->middle.ry() = (from.y() + to.y()) >> 1;
+ m_elements.add(element);
+ }
+ }
+ previousIndex = moveToIndex = m_points->size();
+ matrix.map(p[0], p[1], &x, &y);
+ QPoint to(qRound(x * Q_FIXED_POINT_SCALE), qRound(y * Q_FIXED_POINT_SCALE));
+ m_points->add(to);
+ }
+ break;
+ case QPainterPath::LineToElement:
+ Q_ASSERT(!m_points->isEmpty());
+ {
+ matrix.map(p[0], p[1], &x, &y);
+ QPoint to(qRound(x * Q_FIXED_POINT_SCALE), qRound(y * Q_FIXED_POINT_SCALE));
+ const QPoint &from = m_points->last();
+ if (to != from) {
+ Element *element = m_elementAllocator.newElement();
+ element->degree = Element::Line;
+ element->indices[0] = previousIndex;
+ element->indices[1] = quint32(m_points->size());
+ element->middle.rx() = (from.x() + to.x()) >> 1;
+ element->middle.ry() = (from.y() + to.y()) >> 1;
+ m_elements.add(element);
+ previousIndex = m_points->size();
+ m_points->add(to);
+ }
+ }
+ break;
+ case QPainterPath::CurveToElement:
+ Q_ASSERT(i + 2 < pathElementCount);
+ Q_ASSERT(!m_points->isEmpty());
+ Q_ASSERT(e[1] == QPainterPath::CurveToDataElement);
+ Q_ASSERT(e[2] == QPainterPath::CurveToDataElement);
+ {
+ quint32 startPointIndex = previousIndex;
+ matrix.map(p[4], p[5], &x, &y);
+ QPoint end(qRound(x * Q_FIXED_POINT_SCALE), qRound(y * Q_FIXED_POINT_SCALE));
+ previousIndex = m_points->size();
+ m_points->add(end);
+
+ // See if this cubic bezier is really quadratic.
+ qreal x1 = p[-2] + qreal(1.5) * (p[0] - p[-2]);
+ qreal y1 = p[-1] + qreal(1.5) * (p[1] - p[-1]);
+ qreal x2 = p[4] + qreal(1.5) * (p[2] - p[4]);
+ qreal y2 = p[5] + qreal(1.5) * (p[3] - p[5]);
+
+ Element *element = m_elementAllocator.newElement();
+ if (qAbs(x1 - x2) < qreal(1e-3) && qAbs(y1 - y2) < qreal(1e-3)) {
+ // The bezier curve is quadratic.
+ matrix.map(x1, y1, &x, &y);
+ QPoint ctrl(qRound(x * Q_FIXED_POINT_SCALE),
+ qRound(y * Q_FIXED_POINT_SCALE));
+ setElementToQuadratic(element, startPointIndex, ctrl, previousIndex);
+ } else {
+ // The bezier curve is cubic.
+ matrix.map(p[0], p[1], &x, &y);
+ QPoint ctrl1(qRound(x * Q_FIXED_POINT_SCALE),
+ qRound(y * Q_FIXED_POINT_SCALE));
+ matrix.map(p[2], p[3], &x, &y);
+ QPoint ctrl2(qRound(x * Q_FIXED_POINT_SCALE),
+ qRound(y * Q_FIXED_POINT_SCALE));
+ setElementToCubicAndSimplify(element, startPointIndex, ctrl1, ctrl2,
+ previousIndex);
+ }
+ m_elements.add(element);
+ }
+ i += 2;
+ e += 2;
+ p += 4;
+
+ break;
+ default:
+ Q_ASSERT_X(0, "QSGPathSimplifier::initialize", "Unexpected element type.");
+ break;
+ }
+ }
+ if (!m_points->isEmpty()) {
+ const QPoint &from = m_points->at(previousIndex);
+ const QPoint &to = m_points->at(moveToIndex);
+ if (from != to) {
+ Element *element = m_elementAllocator.newElement();
+ element->degree = Element::Line;
+ element->indices[0] = previousIndex;
+ element->indices[1] = moveToIndex;
+ element->middle.rx() = (from.x() + to.x()) >> 1;
+ element->middle.ry() = (from.y() + to.y()) >> 1;
+ m_elements.add(element);
+ }
+ }
+ } else {
+ qreal x, y;
+
+ for (int i = 0; i < pathElementCount; ++i, p += 2) {
+ matrix.map(p[0], p[1], &x, &y);
+ QPoint to(qRound(x * Q_FIXED_POINT_SCALE), qRound(y * Q_FIXED_POINT_SCALE));
+ if (to != m_points->last())
+ m_points->add(to);
+ }
+
+ while (!m_points->isEmpty() && m_points->last() == m_points->first())
+ m_points->pop_back();
+
+ if (m_points->isEmpty())
+ return;
+
+ quint32 prev = quint32(m_points->size() - 1);
+ for (int i = 0; i < m_points->size(); ++i) {
+ QPoint &to = m_points->at(i);
+ QPoint &from = m_points->at(prev);
+ Element *element = m_elementAllocator.newElement();
+ element->degree = Element::Line;
+ element->indices[0] = prev;
+ element->indices[1] = quint32(i);
+ element->middle.rx() = (from.x() + to.x()) >> 1;
+ element->middle.ry() = (from.y() + to.y()) >> 1;
+ m_elements.add(element);
+ prev = i;
+ }
+ }
+
+ for (int i = 0; i < m_elements.size(); ++i)
+ m_elements.at(i)->processed = false;
+}
+
+void PathSimplifier::removeIntersections()
+{
+ Q_ASSERT(!m_elements.isEmpty());
+ QDataBuffer<Element *> elements(m_elements.size());
+ for (int i = 0; i < m_elements.size(); ++i)
+ elements.add(m_elements.at(i));
+ m_bvh.allocate(2 * m_elements.size());
+ m_bvh.root = buildTree(elements.data(), elements.size());
+
+ elements.reset();
+ for (int i = 0; i < m_elements.size(); ++i)
+ elements.add(m_elements.at(i));
+
+ while (!elements.isEmpty()) {
+ Element *element = elements.last();
+ elements.pop_back();
+ BVHNode *node = element->bvhNode;
+ Q_ASSERT(node->type == BVHNode::Leaf);
+ Q_ASSERT(node->element == element);
+ if (!element->processed) {
+ if (!intersectNodes(elements, node, m_bvh.root))
+ element->processed = true;
+ }
+ }
+
+ m_bvh.free(); // The bounding volume hierarchy is not needed anymore.
+}
+
+void PathSimplifier::connectElements()
+{
+ Q_ASSERT(!m_elements.isEmpty());
+ QDataBuffer<Event> events(m_elements.size() * 2);
+ for (int i = 0; i < m_elements.size(); ++i) {
+ Element *element = m_elements.at(i);
+ element->next = element->previous = 0;
+ element->winding = 0;
+ element->edgeNode = 0;
+ const QPoint &u = m_points->at(element->indices[0]);
+ const QPoint &v = m_points->at(element->indices[element->degree]);
+ if (u != v) {
+ element->pointingUp = element->originallyPointingUp = v < u;
+
+ Event event;
+ event.element = element;
+ event.point = u;
+ event.type = element->pointingUp ? Event::Lower : Event::Upper;
+ events.add(event);
+ event.point = v;
+ event.type = element->pointingUp ? Event::Upper : Event::Lower;
+ events.add(event);
+ }
+ }
+ QVarLengthArray<Element *, 8> orderedElements;
+ if (!events.isEmpty())
+ sortEvents(events.data(), events.size());
+ while (!events.isEmpty()) {
+ const Event *event = &events.last();
+ QPoint eventPoint = event->point;
+
+ // Find all elements passing through the event point.
+ QPair<RBNode *, RBNode *> bounds = outerBounds(eventPoint);
+
+ // Special case: single element above and single element below event point.
+ int eventCount = events.size();
+ if (event->type == Event::Lower && eventCount > 2) {
+ QPair<RBNode *, RBNode *> range;
+ range.first = bounds.first ? m_elementList.next(bounds.first)
+ : m_elementList.front(m_elementList.root);
+ range.second = bounds.second ? m_elementList.previous(bounds.second)
+ : m_elementList.back(m_elementList.root);
+
+ const Event *event2 = &events.at(eventCount - 2);
+ const Event *event3 = &events.at(eventCount - 3);
+ Q_ASSERT(event2->point == eventPoint); // There are always at least two events at a point.
+ if (range.first == range.second && event2->type == Event::Upper && event3->point != eventPoint) {
+ Element *element = event->element;
+ Element *element2 = event2->element;
+ element->edgeNode->data = event2->element;
+ element2->edgeNode = element->edgeNode;
+ element->edgeNode = 0;
+
+ events.pop_back();
+ events.pop_back();
+
+ if (element2->pointingUp != element->pointingUp)
+ element2->flip();
+ element2->winding = element->winding;
+ int winding = element->winding;
+ if (element->originallyPointingUp)
+ ++winding;
+ if (winding == 0 || winding == 1) {
+ if (element->pointingUp) {
+ element->previous = event2->element;
+ element2->next = event->element;
+ } else {
+ element->next = event2->element;
+ element2->previous = event->element;
+ }
+ }
+ continue;
+ }
+ }
+ orderedElements.clear();
+
+ // First, find the ones above the event point.
+ if (m_elementList.root) {
+ RBNode *current = bounds.first ? m_elementList.next(bounds.first)
+ : m_elementList.front(m_elementList.root);
+ while (current != bounds.second) {
+ Element *element = current->data;
+ Q_ASSERT(element->edgeNode == current);
+ int winding = element->winding;
+ if (element->originallyPointingUp)
+ ++winding;
+ const QPoint &lower = m_points->at(element->lowerIndex());
+ if (lower == eventPoint) {
+ if (winding == 0 || winding == 1)
+ orderedElements.append(current->data);
+ } else {
+ // The element is passing through 'event.point'.
+ Q_ASSERT(m_points->at(element->upperIndex()) != eventPoint);
+ Q_ASSERT(element->degree == Element::Line);
+ // Split the line.
+ Element *eventElement = event->element;
+ int indexIndex = (event->type == Event::Upper) == eventElement->pointingUp
+ ? eventElement->degree : 0;
+ quint32 pointIndex = eventElement->indices[indexIndex];
+ Q_ASSERT(eventPoint == m_points->at(pointIndex));
+
+ Element *upperElement = m_elementAllocator.newElement();
+ *upperElement = *element;
+ upperElement->lowerIndex() = element->upperIndex() = pointIndex;
+ upperElement->edgeNode = 0;
+ element->next = element->previous = 0;
+ if (upperElement->next)
+ upperElement->next->previous = upperElement;
+ else if (upperElement->previous)
+ upperElement->previous->next = upperElement;
+ if (element->pointingUp != element->originallyPointingUp)
+ element->flip();
+ if (winding == 0 || winding == 1)
+ orderedElements.append(upperElement);
+ m_elements.add(upperElement);
+ }
+ current = m_elementList.next(current);
+ }
+ }
+ while (!events.isEmpty() && events.last().point == eventPoint) {
+ event = &events.last();
+ if (event->type == Event::Upper) {
+ Q_ASSERT(event->point == m_points->at(event->element->upperIndex()));
+ RBNode *left = findElementLeftOf(event->element, bounds);
+ RBNode *node = m_elementList.newNode();
+ node->data = event->element;
+ Q_ASSERT(event->element->edgeNode == 0);
+ event->element->edgeNode = node;
+ m_elementList.attachAfter(left, node);
+ } else {
+ Q_ASSERT(event->type == Event::Lower);
+ Q_ASSERT(event->point == m_points->at(event->element->lowerIndex()));
+ Element *element = event->element;
+ Q_ASSERT(element->edgeNode);
+ m_elementList.deleteNode(element->edgeNode);
+ Q_ASSERT(element->edgeNode == 0);
+ }
+ events.pop_back();
+ }
+
+ if (m_elementList.root) {
+ RBNode *current = bounds.first ? m_elementList.next(bounds.first)
+ : m_elementList.front(m_elementList.root);
+ int winding = bounds.first ? bounds.first->data->winding : 0;
+
+ // Calculate winding numbers and flip elements if necessary.
+ while (current != bounds.second) {
+ Element *element = current->data;
+ Q_ASSERT(element->edgeNode == current);
+ int ccw = winding & 1;
+ Q_ASSERT(element->pointingUp == element->originallyPointingUp);
+ if (element->originallyPointingUp) {
+ --winding;
+ } else {
+ ++winding;
+ ccw ^= 1;
+ }
+ element->winding = winding;
+ if (ccw == 0)
+ element->flip();
+ current = m_elementList.next(current);
+ }
+
+ // Pick elements with correct winding number.
+ current = bounds.second ? m_elementList.previous(bounds.second)
+ : m_elementList.back(m_elementList.root);
+ while (current != bounds.first) {
+ Element *element = current->data;
+ Q_ASSERT(element->edgeNode == current);
+ Q_ASSERT(m_points->at(element->upperIndex()) == eventPoint);
+ int winding = element->winding;
+ if (element->originallyPointingUp)
+ ++winding;
+ if (winding == 0 || winding == 1)
+ orderedElements.append(current->data);
+ current = m_elementList.previous(current);
+ }
+ }
+
+ if (!orderedElements.isEmpty()) {
+ Q_ASSERT((orderedElements.size() & 1) == 0);
+ int i = 0;
+ Element *firstElement = orderedElements.at(0);
+ if (m_points->at(firstElement->indices[0]) != eventPoint) {
+ orderedElements.append(firstElement);
+ i = 1;
+ }
+ for (; i < orderedElements.size(); i += 2) {
+ Q_ASSERT(i + 1 < orderedElements.size());
+ Element *next = orderedElements.at(i);
+ Element *previous = orderedElements.at(i + 1);
+ Q_ASSERT(next->previous == 0);
+ Q_ASSERT(previous->next == 0);
+ next->previous = previous;
+ previous->next = next;
+ }
+ }
+ }
+#ifndef QT_NO_DEBUG
+ for (int i = 0; i < m_elements.size(); ++i) {
+ const Element *element = m_elements.at(i);
+ Q_ASSERT(element->next == 0 || element->next->previous == element);
+ Q_ASSERT(element->previous == 0 || element->previous->next == element);
+ Q_ASSERT((element->next == 0) == (element->previous == 0));
+ }
+#endif
+}
+
+void PathSimplifier::fillIndices()
+{
+ for (int i = 0; i < m_elements.size(); ++i)
+ m_elements.at(i)->processed = false;
+ for (int i = 0; i < m_elements.size(); ++i) {
+ Element *element = m_elements.at(i);
+ if (element->processed || element->next == 0)
+ continue;
+ do {
+ m_indices->add(element->indices[0]);
+ switch (element->degree) {
+ case Element::Quadratic:
+ {
+ QPoint pts[] = {
+ m_points->at(element->indices[0]),
+ m_points->at(element->indices[1]),
+ m_points->at(element->indices[2])
+ };
+ subDivQuadratic(pts[0], pts[1], pts[2]);
+ }
+ break;
+ case Element::Cubic:
+ {
+ QPoint pts[] = {
+ m_points->at(element->indices[0]),
+ m_points->at(element->indices[1]),
+ m_points->at(element->indices[2]),
+ m_points->at(element->indices[3])
+ };
+ subDivCubic(pts[0], pts[1], pts[2], pts[3]);
+ }
+ break;
+ default:
+ break;
+ }
+ Q_ASSERT(element->next);
+ element->processed = true;
+ element = element->next;
+ } while (element != m_elements.at(i));
+ m_indices->add(Q_TRIANGULATE_END_OF_POLYGON);
+ }
+}
+
+PathSimplifier::BVHNode *PathSimplifier::buildTree(Element **elements, int elementCount)
+{
+ Q_ASSERT(elementCount > 0);
+ BVHNode *node = m_bvh.newNode();
+ if (elementCount == 1) {
+ Element *element = *elements;
+ element->bvhNode = node;
+ node->type = BVHNode::Leaf;
+ node->element = element;
+ node->minimum = node->maximum = m_points->at(element->indices[0]);
+ for (int i = 1; i <= element->degree; ++i) {
+ const QPoint &p = m_points->at(element->indices[i]);
+ node->minimum.rx() = qMin(node->minimum.x(), p.x());
+ node->minimum.ry() = qMin(node->minimum.y(), p.y());
+ node->maximum.rx() = qMax(node->maximum.x(), p.x());
+ node->maximum.ry() = qMax(node->maximum.y(), p.y());
+ }
+ return node;
+ }
+
+ node->type = BVHNode::Split;
+
+ QPoint minimum, maximum;
+ minimum = maximum = elements[0]->middle;
+
+ for (int i = 1; i < elementCount; ++i) {
+ const QPoint &p = elements[i]->middle;
+ minimum.rx() = qMin(minimum.x(), p.x());
+ minimum.ry() = qMin(minimum.y(), p.y());
+ maximum.rx() = qMax(maximum.x(), p.x());
+ maximum.ry() = qMax(maximum.y(), p.y());
+ }
+
+ int comp, pivot;
+ if (maximum.x() - minimum.x() > maximum.y() - minimum.y()) {
+ comp = 0;
+ pivot = (maximum.x() + minimum.x()) >> 1;
+ } else {
+ comp = 1;
+ pivot = (maximum.y() + minimum.y()) >> 1;
+ }
+
+ int lo = 0;
+ int hi = elementCount - 1;
+ while (lo < hi) {
+ while (lo < hi && (&elements[lo]->middle.rx())[comp] <= pivot)
+ ++lo;
+ while (lo < hi && (&elements[hi]->middle.rx())[comp] > pivot)
+ --hi;
+ if (lo < hi)
+ qSwap(elements[lo], elements[hi]);
+ }
+
+ if (lo == elementCount) {
+ // All points are the same.
+ Q_ASSERT(minimum.x() == maximum.x() && minimum.y() == maximum.y());
+ lo = elementCount >> 1;
+ }
+
+ node->left = buildTree(elements, lo);
+ node->right = buildTree(elements + lo, elementCount - lo);
+
+ const BVHNode *left = node->left;
+ const BVHNode *right = node->right;
+ node->minimum.rx() = qMin(left->minimum.x(), right->minimum.x());
+ node->minimum.ry() = qMin(left->minimum.y(), right->minimum.y());
+ node->maximum.rx() = qMax(left->maximum.x(), right->maximum.x());
+ node->maximum.ry() = qMax(left->maximum.y(), right->maximum.y());
+
+ return node;
+}
+
+bool PathSimplifier::intersectNodes(QDataBuffer<Element *> &elements, BVHNode *elementNode,
+ BVHNode *treeNode)
+{
+ if (elementNode->minimum.x() >= treeNode->maximum.x()
+ || elementNode->minimum.y() >= treeNode->maximum.y()
+ || elementNode->maximum.x() <= treeNode->minimum.x()
+ || elementNode->maximum.y() <= treeNode->minimum.y())
+ {
+ return false;
+ }
+
+ Q_ASSERT(elementNode->type == BVHNode::Leaf);
+ Element *element = elementNode->element;
+ Q_ASSERT(!element->processed);
+
+ if (treeNode->type == BVHNode::Leaf) {
+ Element *nodeElement = treeNode->element;
+ if (!nodeElement->processed)
+ return false;
+
+ if (treeNode->element == elementNode->element)
+ return false;
+
+ if (equalElements(treeNode->element, elementNode->element))
+ return false; // element doesn't split itself.
+
+ if (element->degree == Element::Line && nodeElement->degree == Element::Line) {
+ const QPoint &u1 = m_points->at(element->indices[0]);
+ const QPoint &u2 = m_points->at(element->indices[1]);
+ const QPoint &v1 = m_points->at(nodeElement->indices[0]);
+ const QPoint &v2 = m_points->at(nodeElement->indices[1]);
+ IntersectionPoint intersection = intersectionPoint(u1, u2, v1, v2);
+ if (!intersection.isValid())
+ return false;
+
+ Q_ASSERT(intersection.x.integer >= qMin(u1.x(), u2.x()));
+ Q_ASSERT(intersection.y.integer >= qMin(u1.y(), u2.y()));
+ Q_ASSERT(intersection.x.integer >= qMin(v1.x(), v2.x()));
+ Q_ASSERT(intersection.y.integer >= qMin(v1.y(), v2.y()));
+
+ Q_ASSERT(intersection.x.integer <= qMax(u1.x(), u2.x()));
+ Q_ASSERT(intersection.y.integer <= qMax(u1.y(), u2.y()));
+ Q_ASSERT(intersection.x.integer <= qMax(v1.x(), v2.x()));
+ Q_ASSERT(intersection.y.integer <= qMax(v1.y(), v2.y()));
+
+ m_points->add(intersection.round());
+ splitLineAt(elements, treeNode, m_points->size() - 1, !intersection.isAccurate());
+ return splitLineAt(elements, elementNode, m_points->size() - 1, false);
+ } else {
+ QVarLengthArray<QPoint, 12> axes;
+ appendSeparatingAxes(axes, elementNode->element);
+ appendSeparatingAxes(axes, treeNode->element);
+ for (int i = 0; i < axes.size(); ++i) {
+ QPair<int, int> range1 = calculateSeparatingAxisRange(axes.at(i), elementNode->element);
+ QPair<int, int> range2 = calculateSeparatingAxisRange(axes.at(i), treeNode->element);
+ if (range1.first >= range2.second || range1.second <= range2.first) {
+ return false; // Separating axis found.
+ }
+ }
+ // Bounding areas overlap.
+ if (nodeElement->degree > Element::Line)
+ splitCurve(elements, treeNode);
+ if (element->degree > Element::Line) {
+ splitCurve(elements, elementNode);
+ } else {
+ // The element was not split, so it can be processed further.
+ if (intersectNodes(elements, elementNode, treeNode->left))
+ return true;
+ if (intersectNodes(elements, elementNode, treeNode->right))
+ return true;
+ return false;
+ }
+ return true;
+ }
+ } else {
+ if (intersectNodes(elements, elementNode, treeNode->left))
+ return true;
+ if (intersectNodes(elements, elementNode, treeNode->right))
+ return true;
+ return false;
+ }
+}
+
+bool PathSimplifier::equalElements(const Element *e1, const Element *e2)
+{
+ Q_ASSERT(e1 != e2);
+ if (e1->degree != e2->degree)
+ return false;
+
+ // Possibly equal and in the same direction.
+ bool equalSame = true;
+ for (int i = 0; i <= e1->degree; ++i)
+ equalSame &= m_points->at(e1->indices[i]) == m_points->at(e2->indices[i]);
+
+ // Possibly equal and in opposite directions.
+ bool equalOpposite = true;
+ for (int i = 0; i <= e1->degree; ++i)
+ equalOpposite &= m_points->at(e1->indices[e1->degree - i]) == m_points->at(e2->indices[i]);
+
+ return equalSame || equalOpposite;
+}
+
+bool PathSimplifier::splitLineAt(QDataBuffer<Element *> &elements, BVHNode *node,
+ quint32 pointIndex, bool processAgain)
+{
+ Q_ASSERT(node->type == BVHNode::Leaf);
+ Element *element = node->element;
+ Q_ASSERT(element->degree == Element::Line);
+ const QPoint &u = m_points->at(element->indices[0]);
+ const QPoint &v = m_points->at(element->indices[1]);
+ const QPoint &p = m_points->at(pointIndex);
+ if (u == p || v == p)
+ return false; // No split needed.
+
+ if (processAgain)
+ element->processed = false; // Needs to be processed again.
+
+ Element *first = node->element;
+ Element *second = m_elementAllocator.newElement();
+ *second = *first;
+ first->indices[1] = second->indices[0] = pointIndex;
+ first->middle.rx() = (u.x() + p.x()) >> 1;
+ first->middle.ry() = (u.y() + p.y()) >> 1;
+ second->middle.rx() = (v.x() + p.x()) >> 1;
+ second->middle.ry() = (v.y() + p.y()) >> 1;
+ m_elements.add(second);
+
+ BVHNode *left = m_bvh.newNode();
+ BVHNode *right = m_bvh.newNode();
+ left->type = right->type = BVHNode::Leaf;
+ left->element = first;
+ right->element = second;
+ left->minimum = right->minimum = node->minimum;
+ left->maximum = right->maximum = node->maximum;
+ if (u.x() < v.x())
+ left->maximum.rx() = right->minimum.rx() = p.x();
+ else
+ left->minimum.rx() = right->maximum.rx() = p.x();
+ if (u.y() < v.y())
+ left->maximum.ry() = right->minimum.ry() = p.y();
+ else
+ left->minimum.ry() = right->maximum.ry() = p.y();
+ left->element->bvhNode = left;
+ right->element->bvhNode = right;
+
+ node->type = BVHNode::Split;
+ node->left = left;
+ node->right = right;
+
+ if (!first->processed) {
+ elements.add(left->element);
+ elements.add(right->element);
+ }
+ return true;
+}
+
+void PathSimplifier::appendSeparatingAxes(QVarLengthArray<QPoint, 12> &axes, Element *element)
+{
+ switch (element->degree) {
+ case Element::Cubic:
+ {
+ const QPoint &u = m_points->at(element->indices[0]);
+ const QPoint &v = m_points->at(element->indices[1]);
+ const QPoint &w = m_points->at(element->indices[2]);
+ const QPoint &q = m_points->at(element->indices[3]);
+ QPoint ns[] = {
+ QPoint(u.y() - v.y(), v.x() - u.x()),
+ QPoint(v.y() - w.y(), w.x() - v.x()),
+ QPoint(w.y() - q.y(), q.x() - w.x()),
+ QPoint(q.y() - u.y(), u.x() - q.x()),
+ QPoint(u.y() - w.y(), w.x() - u.x()),
+ QPoint(v.y() - q.y(), q.x() - v.x())
+ };
+ for (int i = 0; i < 6; ++i) {
+ if (ns[i].x() || ns[i].y())
+ axes.append(ns[i]);
+ }
+ }
+ break;
+ case Element::Quadratic:
+ {
+ const QPoint &u = m_points->at(element->indices[0]);
+ const QPoint &v = m_points->at(element->indices[1]);
+ const QPoint &w = m_points->at(element->indices[2]);
+ QPoint ns[] = {
+ QPoint(u.y() - v.y(), v.x() - u.x()),
+ QPoint(v.y() - w.y(), w.x() - v.x()),
+ QPoint(w.y() - u.y(), u.x() - w.x())
+ };
+ for (int i = 0; i < 3; ++i) {
+ if (ns[i].x() || ns[i].y())
+ axes.append(ns[i]);
+ }
+ }
+ break;
+ case Element::Line:
+ {
+ const QPoint &u = m_points->at(element->indices[0]);
+ const QPoint &v = m_points->at(element->indices[1]);
+ QPoint n(u.y() - v.y(), v.x() - u.x());
+ if (n.x() || n.y())
+ axes.append(n);
+ }
+ break;
+ default:
+ Q_ASSERT_X(0, "QSGPathSimplifier::appendSeparatingAxes", "Unexpected element type.");
+ break;
+ }
+}
+
+QPair<int, int> PathSimplifier::calculateSeparatingAxisRange(const QPoint &axis, Element *element)
+{
+ QPair<int, int> range(0x7fffffff, -0x7fffffff);
+ for (int i = 0; i <= element->degree; ++i) {
+ const QPoint &p = m_points->at(element->indices[i]);
+ int dist = dot(axis, p);
+ range.first = qMin(range.first, dist);
+ range.second = qMax(range.second, dist);
+ }
+ return range;
+}
+
+void PathSimplifier::splitCurve(QDataBuffer<Element *> &elements, BVHNode *node)
+{
+ Q_ASSERT(node->type == BVHNode::Leaf);
+
+ Element *first = node->element;
+ Element *second = m_elementAllocator.newElement();
+ *second = *first;
+ m_elements.add(second);
+ Q_ASSERT(first->degree > Element::Line);
+
+ bool accurate = true;
+ const QPoint &u = m_points->at(first->indices[0]);
+ const QPoint &v = m_points->at(first->indices[1]);
+ const QPoint &w = m_points->at(first->indices[2]);
+
+ if (first->degree == Element::Quadratic) {
+ QPoint pts[3];
+ accurate = splitQuadratic(u, v, w, pts);
+ int pointIndex = m_points->size();
+ m_points->add(pts[1]);
+ accurate &= setElementToQuadratic(first, first->indices[0], pts[0], pointIndex);
+ accurate &= setElementToQuadratic(second, pointIndex, pts[2], second->indices[2]);
+ } else {
+ Q_ASSERT(first->degree == Element::Cubic);
+ const QPoint &q = m_points->at(first->indices[3]);
+ QPoint pts[5];
+ accurate = splitCubic(u, v, w, q, pts);
+ int pointIndex = m_points->size();
+ m_points->add(pts[2]);
+ accurate &= setElementToCubic(first, first->indices[0], pts[0], pts[1], pointIndex);
+ accurate &= setElementToCubic(second, pointIndex, pts[3], pts[4], second->indices[3]);
+ }
+
+ if (!accurate)
+ first->processed = second->processed = false; // Needs to be processed again.
+
+ BVHNode *left = m_bvh.newNode();
+ BVHNode *right = m_bvh.newNode();
+ left->type = right->type = BVHNode::Leaf;
+ left->element = first;
+ right->element = second;
+
+ left->minimum.rx() = left->minimum.ry() = right->minimum.rx() = right->minimum.ry() = INT_MAX;
+ left->maximum.rx() = left->maximum.ry() = right->maximum.rx() = right->maximum.ry() = INT_MIN;
+
+ for (int i = 0; i <= first->degree; ++i) {
+ QPoint &p = m_points->at(first->indices[i]);
+ left->minimum.rx() = qMin(left->minimum.x(), p.x());
+ left->minimum.ry() = qMin(left->minimum.y(), p.y());
+ left->maximum.rx() = qMax(left->maximum.x(), p.x());
+ left->maximum.ry() = qMax(left->maximum.y(), p.y());
+ }
+ for (int i = 0; i <= second->degree; ++i) {
+ QPoint &p = m_points->at(second->indices[i]);
+ right->minimum.rx() = qMin(right->minimum.x(), p.x());
+ right->minimum.ry() = qMin(right->minimum.y(), p.y());
+ right->maximum.rx() = qMax(right->maximum.x(), p.x());
+ right->maximum.ry() = qMax(right->maximum.y(), p.y());
+ }
+ left->element->bvhNode = left;
+ right->element->bvhNode = right;
+
+ node->type = BVHNode::Split;
+ node->left = left;
+ node->right = right;
+
+ if (!first->processed) {
+ elements.add(left->element);
+ elements.add(right->element);
+ }
+}
+
+bool PathSimplifier::setElementToQuadratic(Element *element, quint32 pointIndex1,
+ const QPoint &ctrl, quint32 pointIndex2)
+{
+ const QPoint &p1 = m_points->at(pointIndex1);
+ const QPoint &p2 = m_points->at(pointIndex2);
+ if (flattenQuadratic(p1, ctrl, p2)) {
+ // Insert line.
+ element->degree = Element::Line;
+ element->indices[0] = pointIndex1;
+ element->indices[1] = pointIndex2;
+ element->middle.rx() = (p1.x() + p2.x()) >> 1;
+ element->middle.ry() = (p1.y() + p2.y()) >> 1;
+ return false;
+ } else {
+ // Insert bezier.
+ element->degree = Element::Quadratic;
+ element->indices[0] = pointIndex1;
+ element->indices[1] = m_points->size();
+ element->indices[2] = pointIndex2;
+ element->middle.rx() = (p1.x() + ctrl.x() + p2.x()) / 3;
+ element->middle.ry() = (p1.y() + ctrl.y() + p2.y()) / 3;
+ m_points->add(ctrl);
+ return true;
+ }
+}
+
+bool PathSimplifier::setElementToCubic(Element *element, quint32 pointIndex1, const QPoint &v,
+ const QPoint &w, quint32 pointIndex2)
+{
+ const QPoint &u = m_points->at(pointIndex1);
+ const QPoint &q = m_points->at(pointIndex2);
+ if (flattenCubic(u, v, w, q)) {
+ // Insert line.
+ element->degree = Element::Line;
+ element->indices[0] = pointIndex1;
+ element->indices[1] = pointIndex2;
+ element->middle.rx() = (u.x() + q.x()) >> 1;
+ element->middle.ry() = (u.y() + q.y()) >> 1;
+ return false;
+ } else {
+ // Insert bezier.
+ element->degree = Element::Cubic;
+ element->indices[0] = pointIndex1;
+ element->indices[1] = m_points->size();
+ element->indices[2] = m_points->size() + 1;
+ element->indices[3] = pointIndex2;
+ element->middle.rx() = (u.x() + v.x() + w.x() + q.x()) >> 2;
+ element->middle.ry() = (u.y() + v.y() + w.y() + q.y()) >> 2;
+ m_points->add(v);
+ m_points->add(w);
+ return true;
+ }
+}
+
+void PathSimplifier::setElementToCubicAndSimplify(Element *element, quint32 pointIndex1,
+ const QPoint &v, const QPoint &w,
+ quint32 pointIndex2)
+{
+ const QPoint &u = m_points->at(pointIndex1);
+ const QPoint &q = m_points->at(pointIndex2);
+ if (flattenCubic(u, v, w, q)) {
+ // Insert line.
+ element->degree = Element::Line;
+ element->indices[0] = pointIndex1;
+ element->indices[1] = pointIndex2;
+ element->middle.rx() = (u.x() + q.x()) >> 1;
+ element->middle.ry() = (u.y() + q.y()) >> 1;
+ return;
+ }
+
+ bool intersecting = (u == q) || intersectionPoint(u, v, w, q).isValid();
+ if (!intersecting) {
+ // Insert bezier.
+ element->degree = Element::Cubic;
+ element->indices[0] = pointIndex1;
+ element->indices[1] = m_points->size();
+ element->indices[2] = m_points->size() + 1;
+ element->indices[3] = pointIndex2;
+ element->middle.rx() = (u.x() + v.x() + w.x() + q.x()) >> 2;
+ element->middle.ry() = (u.y() + v.y() + w.y() + q.y()) >> 2;
+ m_points->add(v);
+ m_points->add(w);
+ return;
+ }
+
+ QPoint pts[5];
+ splitCubic(u, v, w, q, pts);
+ int pointIndex = m_points->size();
+ m_points->add(pts[2]);
+ Element *element2 = m_elementAllocator.newElement();
+ m_elements.add(element2);
+ setElementToCubicAndSimplify(element, pointIndex1, pts[0], pts[1], pointIndex);
+ setElementToCubicAndSimplify(element2, pointIndex, pts[3], pts[4], pointIndex2);
+}
+
+PathSimplifier::RBNode *PathSimplifier::findElementLeftOf(const Element *element,
+ const QPair<RBNode *, RBNode *> &bounds)
+{
+ if (!m_elementList.root)
+ return 0;
+ RBNode *current = bounds.first;
+ Q_ASSERT(!current || !elementIsLeftOf(element, current->data));
+ if (!current)
+ current = m_elementList.front(m_elementList.root);
+ Q_ASSERT(current);
+ RBNode *result = 0;
+ while (current != bounds.second && !elementIsLeftOf(element, current->data)) {
+ result = current;
+ current = m_elementList.next(current);
+ }
+ return result;
+}
+
+bool PathSimplifier::elementIsLeftOf(const Element *left, const Element *right)
+{
+ const QPoint &leftU = m_points->at(left->upperIndex());
+ const QPoint &leftL = m_points->at(left->lowerIndex());
+ const QPoint &rightU = m_points->at(right->upperIndex());
+ const QPoint &rightL = m_points->at(right->lowerIndex());
+ Q_ASSERT(leftL >= rightU && rightL >= leftU);
+ if (leftU.x() < qMin(rightL.x(), rightU.x()))
+ return true;
+ if (leftU.x() > qMax(rightL.x(), rightU.x()))
+ return false;
+ int d = pointDistanceFromLine(leftU, rightL, rightU);
+ // d < 0: left, d > 0: right, d == 0: on top
+ if (d == 0) {
+ d = pointDistanceFromLine(leftL, rightL, rightU);
+ if (d == 0) {
+ if (right->degree > Element::Line) {
+ d = pointDistanceFromLine(leftL, rightL, m_points->at(right->indices[1]));
+ if (d == 0)
+ d = pointDistanceFromLine(leftL, rightL, m_points->at(right->indices[2]));
+ } else if (left->degree > Element::Line) {
+ d = pointDistanceFromLine(m_points->at(left->indices[1]), rightL, rightU);
+ if (d == 0)
+ d = pointDistanceFromLine(m_points->at(left->indices[2]), rightL, rightU);
+ }
+ }
+ }
+ return d < 0;
+}
+
+QPair<PathSimplifier::RBNode *, PathSimplifier::RBNode *> PathSimplifier::outerBounds(const QPoint &point)
+{
+ RBNode *current = m_elementList.root;
+ QPair<RBNode *, RBNode *> result(0, 0);
+
+ while (current) {
+ const Element *element = current->data;
+ Q_ASSERT(element->edgeNode == current);
+ const QPoint &v1 = m_points->at(element->lowerIndex());
+ const QPoint &v2 = m_points->at(element->upperIndex());
+ Q_ASSERT(point >= v2 && point <= v1);
+ if (point == v1 || point == v2)
+ break;
+ int d = pointDistanceFromLine(point, v1, v2);
+ if (d == 0) {
+ if (element->degree == Element::Line)
+ break;
+ d = pointDistanceFromLine(point, v1, m_points->at(element->indices[1]));
+ if (d == 0)
+ d = pointDistanceFromLine(point, v1, m_points->at(element->indices[2]));
+ Q_ASSERT(d != 0);
+ }
+ if (d < 0) {
+ result.second = current;
+ current = current->left;
+ } else {
+ result.first = current;
+ current = current->right;
+ }
+ }
+
+ if (!current)
+ return result;
+
+ RBNode *mid = current;
+
+ current = mid->left;
+ while (current) {
+ const Element *element = current->data;
+ Q_ASSERT(element->edgeNode == current);
+ const QPoint &v1 = m_points->at(element->lowerIndex());
+ const QPoint &v2 = m_points->at(element->upperIndex());
+ Q_ASSERT(point >= v2 && point <= v1);
+ bool equal = (point == v1 || point == v2);
+ if (!equal) {
+ int d = pointDistanceFromLine(point, v1, v2);
+ Q_ASSERT(d >= 0);
+ equal = (d == 0 && element->degree == Element::Line);
+ }
+ if (equal) {
+ current = current->left;
+ } else {
+ result.first = current;
+ current = current->right;
+ }
+ }
+
+ current = mid->right;
+ while (current) {
+ const Element *element = current->data;
+ Q_ASSERT(element->edgeNode == current);
+ const QPoint &v1 = m_points->at(element->lowerIndex());
+ const QPoint &v2 = m_points->at(element->upperIndex());
+ Q_ASSERT(point >= v2 && point <= v1);
+ bool equal = (point == v1 || point == v2);
+ if (!equal) {
+ int d = pointDistanceFromLine(point, v1, v2);
+ Q_ASSERT(d <= 0);
+ equal = (d == 0 && element->degree == Element::Line);
+ }
+ if (equal) {
+ current = current->right;
+ } else {
+ result.second = current;
+ current = current->left;
+ }
+ }
+
+ return result;
+}
+
+inline bool PathSimplifier::flattenQuadratic(const QPoint &u, const QPoint &v, const QPoint &w)
+{
+ QPoint deltas[2] = { v - u, w - v };
+ int d = qAbs(cross(deltas[0], deltas[1]));
+ int l = qAbs(deltas[0].x()) + qAbs(deltas[0].y()) + qAbs(deltas[1].x()) + qAbs(deltas[1].y());
+ return d < (Q_FIXED_POINT_SCALE * Q_FIXED_POINT_SCALE * 3 / 2) || l <= Q_FIXED_POINT_SCALE * 2;
+}
+
+inline bool PathSimplifier::flattenCubic(const QPoint &u, const QPoint &v,
+ const QPoint &w, const QPoint &q)
+{
+ QPoint deltas[] = { v - u, w - v, q - w, q - u };
+ int d = qAbs(cross(deltas[0], deltas[1])) + qAbs(cross(deltas[1], deltas[2]))
+ + qAbs(cross(deltas[0], deltas[3])) + qAbs(cross(deltas[3], deltas[2]));
+ int l = qAbs(deltas[0].x()) + qAbs(deltas[0].y()) + qAbs(deltas[1].x()) + qAbs(deltas[1].y())
+ + qAbs(deltas[2].x()) + qAbs(deltas[2].y());
+ return d < (Q_FIXED_POINT_SCALE * Q_FIXED_POINT_SCALE * 3) || l <= Q_FIXED_POINT_SCALE * 2;
+}
+
+inline bool PathSimplifier::splitQuadratic(const QPoint &u, const QPoint &v,
+ const QPoint &w, QPoint *result)
+{
+ result[0] = u + v;
+ result[2] = v + w;
+ result[1] = result[0] + result[2];
+ bool accurate = ((result[0].x() | result[0].y() | result[2].x() | result[2].y()) & 1) == 0
+ && ((result[1].x() | result[1].y()) & 3) == 0;
+ result[0].rx() >>= 1;
+ result[0].ry() >>= 1;
+ result[1].rx() >>= 2;
+ result[1].ry() >>= 2;
+ result[2].rx() >>= 1;
+ result[2].ry() >>= 1;
+ return accurate;
+}
+
+inline bool PathSimplifier::splitCubic(const QPoint &u, const QPoint &v,
+ const QPoint &w, const QPoint &q, QPoint *result)
+{
+ result[0] = u + v;
+ result[2] = v + w;
+ result[4] = w + q;
+ result[1] = result[0] + result[2];
+ result[3] = result[2] + result[4];
+ result[2] = result[1] + result[3];
+ bool accurate = ((result[0].x() | result[0].y() | result[4].x() | result[4].y()) & 1) == 0
+ && ((result[1].x() | result[1].y() | result[3].x() | result[3].y()) & 3) == 0
+ && ((result[2].x() | result[2].y()) & 7) == 0;
+ result[0].rx() >>= 1;
+ result[0].ry() >>= 1;
+ result[1].rx() >>= 2;
+ result[1].ry() >>= 2;
+ result[2].rx() >>= 3;
+ result[2].ry() >>= 3;
+ result[3].rx() >>= 2;
+ result[3].ry() >>= 2;
+ result[4].rx() >>= 1;
+ result[4].ry() >>= 1;
+ return accurate;
+}
+
+inline void PathSimplifier::subDivQuadratic(const QPoint &u, const QPoint &v, const QPoint &w)
+{
+ if (flattenQuadratic(u, v, w))
+ return;
+ QPoint pts[3];
+ splitQuadratic(u, v, w, pts);
+ subDivQuadratic(u, pts[0], pts[1]);
+ m_indices->add(m_points->size());
+ m_points->add(pts[1]);
+ subDivQuadratic(pts[1], pts[2], w);
+}
+
+inline void PathSimplifier::subDivCubic(const QPoint &u, const QPoint &v,
+ const QPoint &w, const QPoint &q)
+{
+ if (flattenCubic(u, v, w, q))
+ return;
+ QPoint pts[5];
+ splitCubic(u, v, w, q, pts);
+ subDivCubic(u, pts[0], pts[1], pts[2]);
+ m_indices->add(m_points->size());
+ m_points->add(pts[2]);
+ subDivCubic(pts[2], pts[3], pts[4], q);
+}
+
+void PathSimplifier::sortEvents(Event *events, int count)
+{
+ // Bucket sort + insertion sort.
+ Q_ASSERT(count > 0);
+ QDataBuffer<Event> buffer(count);
+ buffer.resize(count);
+ QScopedArrayPointer<int> bins(new int[count]);
+ int counts[0x101];
+ memset(counts, 0, sizeof(counts));
+
+ int minimum, maximum;
+ minimum = maximum = events[0].point.y();
+ for (int i = 1; i < count; ++i) {
+ minimum = qMin(minimum, events[i].point.y());
+ maximum = qMax(maximum, events[i].point.y());
+ }
+
+ for (int i = 0; i < count; ++i) {
+ bins[i] = ((maximum - events[i].point.y()) << 8) / (maximum - minimum + 1);
+ Q_ASSERT(bins[i] >= 0 && bins[i] < 0x100);
+ ++counts[bins[i]];
+ }
+
+ for (int i = 1; i < 0x100; ++i)
+ counts[i] += counts[i - 1];
+ counts[0x100] = counts[0xff];
+ Q_ASSERT(counts[0x100] == count);
+
+ for (int i = 0; i < count; ++i)
+ buffer.at(--counts[bins[i]]) = events[i];
+
+ int j = 0;
+ for (int i = 0; i < 0x100; ++i) {
+ for (; j < counts[i + 1]; ++j) {
+ int k = j;
+ while (k > 0 && (buffer.at(j) < events[k - 1])) {
+ events[k] = events[k - 1];
+ --k;
+ }
+ events[k] = buffer.at(j);
+ }
+ }
+}
+
+} // end anonymous namespace
+
+
+void qSimplifyPath(const QVectorPath &path, QDataBuffer<QPoint> &vertices,
+ QDataBuffer<quint32> &indices, const QTransform &matrix)
+{
+ PathSimplifier(path, vertices, indices, matrix);
+}
+
+void qSimplifyPath(const QPainterPath &path, QDataBuffer<QPoint> &vertices,
+ QDataBuffer<quint32> &indices, const QTransform &matrix)
+{
+ qSimplifyPath(qtVectorPathForPath(path), vertices, indices, matrix);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/gui/painting/qpathsimplifier_p.h b/src/gui/painting/qpathsimplifier_p.h
new file mode 100644
index 0000000000..9941bd21f2
--- /dev/null
+++ b/src/gui/painting/qpathsimplifier_p.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPATHSIMPLIFIER_P_H
+#define QPATHSIMPLIFIER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/qpainterpath.h>
+#include <QtGui/private/qdatabuffer_p.h>
+#include <QtGui/private/qvectorpath_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// The returned vertices are in 8:8 fixed point format. The path is assumed to be in the range (-128, 128)x(-128, 128).
+void qSimplifyPath(const QVectorPath &path, QDataBuffer<QPoint> &vertices, QDataBuffer<quint32> &indices, const QTransform &matrix = QTransform());
+void qSimplifyPath(const QPainterPath &path, QDataBuffer<QPoint> &vertices, QDataBuffer<quint32> &indices, const QTransform &matrix = QTransform());
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp
index ddf828982a..1201a481b6 100644
--- a/src/gui/painting/qstroker.cpp
+++ b/src/gui/painting/qstroker.cpp
@@ -756,7 +756,9 @@ template <class Iterator> bool qt_stroke_side(Iterator *it,
#ifdef QPP_STROKE_DEBUG
qDebug("\n ---> (side) closed subpath");
#endif
- stroker->joinPoints(prev.x, prev.y, *startTangent, stroker->joinStyleMode());
+ // don't join empty subpaths
+ if (!first)
+ stroker->joinPoints(prev.x, prev.y, *startTangent, stroker->joinStyleMode());
return true;
} else {
#ifdef QPP_STROKE_DEBUG
diff --git a/src/gui/text/qabstracttextdocumentlayout.cpp b/src/gui/text/qabstracttextdocumentlayout.cpp
index 2c22b72846..7bf2a631ea 100644
--- a/src/gui/text/qabstracttextdocumentlayout.cpp
+++ b/src/gui/text/qabstracttextdocumentlayout.cpp
@@ -469,7 +469,7 @@ void QAbstractTextDocumentLayout::resizeInlineObject(QTextInlineObject item, int
QSizeF s = handler.iface->intrinsicSize(document(), posInDocument, format);
item.setWidth(s.width());
- item.setAscent(s.height() - 1);
+ item.setAscent(s.height());
item.setDescent(0);
}
diff --git a/src/gui/text/qdistancefield.cpp b/src/gui/text/qdistancefield.cpp
new file mode 100644
index 0000000000..fb06a26c8f
--- /dev/null
+++ b/src/gui/text/qdistancefield.cpp
@@ -0,0 +1,762 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdistancefield_p.h"
+#include <qmath.h>
+#include <private/qdatabuffer_p.h>
+#include <private/qpathsimplifier_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace
+{
+ enum FillHDir
+ {
+ LeftToRight,
+ RightToLeft
+ };
+
+ enum FillVDir
+ {
+ TopDown,
+ BottomUp
+ };
+
+ enum FillClip
+ {
+ NoClip,
+ Clip
+ };
+}
+
+template <FillClip clip, FillHDir dir>
+inline void fillLine(qint32 *, int, int, int, qint32, qint32)
+{
+}
+
+template <>
+inline void fillLine<Clip, LeftToRight>(qint32 *line, int width, int lx, int rx, qint32 d, qint32 dd)
+{
+ int fromX = qMax(0, lx >> 8);
+ int toX = qMin(width, rx >> 8);
+ int x = toX - fromX;
+ if (x <= 0)
+ return;
+ qint32 val = d + (((fromX << 8) + 0xff - lx) * dd >> 8);
+ line += fromX;
+ do {
+ *line = abs(val) < abs(*line) ? val : *line;
+ val += dd;
+ ++line;
+ } while (--x);
+}
+
+template <>
+inline void fillLine<Clip, RightToLeft>(qint32 *line, int width, int lx, int rx, qint32 d, qint32 dd)
+{
+ int fromX = qMax(0, lx >> 8);
+ int toX = qMin(width, rx >> 8);
+ int x = toX - fromX;
+ if (x <= 0)
+ return;
+ qint32 val = d + (((toX << 8) + 0xff - rx) * dd >> 8);
+ line += toX;
+ do {
+ val -= dd;
+ --line;
+ *line = abs(val) < abs(*line) ? val : *line;
+ } while (--x);
+}
+
+template <>
+inline void fillLine<NoClip, LeftToRight>(qint32 *line, int, int lx, int rx, qint32 d, qint32 dd)
+{
+ int fromX = lx >> 8;
+ int toX = rx >> 8;
+ int x = toX - fromX;
+ if (x <= 0)
+ return;
+ qint32 val = d + ((~lx & 0xff) * dd >> 8);
+ line += fromX;
+ do {
+ *line = abs(val) < abs(*line) ? val : *line;
+ val += dd;
+ ++line;
+ } while (--x);
+}
+
+template <>
+inline void fillLine<NoClip, RightToLeft>(qint32 *line, int, int lx, int rx, qint32 d, qint32 dd)
+{
+ int fromX = lx >> 8;
+ int toX = rx >> 8;
+ int x = toX - fromX;
+ if (x <= 0)
+ return;
+ qint32 val = d + ((~rx & 0xff) * dd >> 8);
+ line += toX;
+ do {
+ val -= dd;
+ --line;
+ *line = abs(val) < abs(*line) ? val : *line;
+ } while (--x);
+}
+
+template <FillClip clip, FillVDir vDir, FillHDir hDir>
+inline void fillLines(qint32 *bits, int width, int height, int upperY, int lowerY,
+ int &lx, int ldx, int &rx, int rdx, qint32 &d, qint32 ddy, qint32 ddx)
+{
+ Q_UNUSED(height);
+ Q_ASSERT(upperY < lowerY);
+ int y = lowerY - upperY;
+ if (vDir == TopDown) {
+ qint32 *line = bits + upperY * width;
+ do {
+ fillLine<clip, hDir>(line, width, lx, rx, d, ddx);
+ lx += ldx;
+ d += ddy;
+ rx += rdx;
+ line += width;
+ } while (--y);
+ } else {
+ qint32 *line = bits + lowerY * width;
+ do {
+ lx -= ldx;
+ d -= ddy;
+ rx -= rdx;
+ line -= width;
+ fillLine<clip, hDir>(line, width, lx, rx, d, ddx);
+ } while (--y);
+ }
+}
+
+template <FillClip clip>
+void drawTriangle(qint32 *bits, int width, int height, const QPoint *center,
+ const QPoint *v1, const QPoint *v2, qint32 value)
+{
+ const int y1 = clip == Clip ? qBound(0, v1->y() >> 8, height) : v1->y() >> 8;
+ const int y2 = clip == Clip ? qBound(0, v2->y() >> 8, height) : v2->y() >> 8;
+ const int yC = clip == Clip ? qBound(0, center->y() >> 8, height) : center->y() >> 8;
+
+ const int v1Frac = clip == Clip ? (y1 << 8) + 0xff - v1->y() : ~v2->y() & 0xff;
+ const int v2Frac = clip == Clip ? (y2 << 8) + 0xff - v2->y() : ~v1->y() & 0xff;
+ const int centerFrac = clip == Clip ? (yC << 8) + 0xff - center->y() : ~center->y() & 0xff;
+
+ int dx1 = 0, x1 = 0, dx2 = 0, x2 = 0;
+ qint32 dd1, d1, dd2, d2;
+ if (v1->y() != center->y()) {
+ dx1 = ((v1->x() - center->x()) << 8) / (v1->y() - center->y());
+ x1 = center->x() + centerFrac * (v1->x() - center->x()) / (v1->y() - center->y());
+ }
+ if (v2->y() != center->y()) {
+ dx2 = ((v2->x() - center->x()) << 8) / (v2->y() - center->y());
+ x2 = center->x() + centerFrac * (v2->x() - center->x()) / (v2->y() - center->y());
+ }
+
+ const qint32 div = (v2->x() - center->x()) * (v1->y() - center->y())
+ - (v2->y() - center->y()) * (v1->x() - center->x());
+ const qint32 dd = div ? qint32((qint64(value * (v1->y() - v2->y())) << 8) / div) : 0;
+
+ if (y2 < yC) {
+ if (y1 < yC) {
+ // Center at the bottom.
+ if (y2 < y1) {
+ // y2 < y1 < yC
+ // Long right edge.
+ d1 = centerFrac * value / (v1->y() - center->y());
+ dd1 = ((value << 8) / (v1->y() - center->y()));
+ fillLines<clip, BottomUp, LeftToRight>(bits, width, height, y1, yC, x1, dx1,
+ x2, dx2, d1, dd1, dd);
+ dx1 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y());
+ x1 = v1->x() + v1Frac * (v1->x() - v2->x()) / (v1->y() - v2->y());
+ fillLines<clip, BottomUp, LeftToRight>(bits, width, height, y2, y1, x1, dx1,
+ x2, dx2, value, 0, dd);
+ } else {
+ // y1 <= y2 < yC
+ // Long left edge.
+ d2 = centerFrac * value / (v2->y() - center->y());
+ dd2 = ((value << 8) / (v2->y() - center->y()));
+ fillLines<clip, BottomUp, RightToLeft>(bits, width, height, y2, yC, x1, dx1,
+ x2, dx2, d2, dd2, dd);
+ if (y1 != y2) {
+ dx2 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y());
+ x2 = v2->x() + v2Frac * (v1->x() - v2->x()) / (v1->y() - v2->y());
+ fillLines<clip, BottomUp, RightToLeft>(bits, width, height, y1, y2, x1, dx1,
+ x2, dx2, value, 0, dd);
+ }
+ }
+ } else {
+ // y2 < yC <= y1
+ // Center to the right.
+ int dx = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y());
+ int xUp, xDn;
+ xUp = xDn = v2->x() + (clip == Clip ? (yC << 8) + 0xff - v2->y()
+ : (center->y() | 0xff) - v2->y())
+ * (v1->x() - v2->x()) / (v1->y() - v2->y());
+ fillLines<clip, BottomUp, LeftToRight>(bits, width, height, y2, yC, xUp, dx,
+ x2, dx2, value, 0, dd);
+ if (yC != y1)
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, yC, y1, xDn, dx,
+ x1, dx1, value, 0, dd);
+ }
+ } else {
+ if (y1 < yC) {
+ // y1 < yC <= y2
+ // Center to the left.
+ int dx = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y());
+ int xUp, xDn;
+ xUp = xDn = v1->x() + (clip == Clip ? (yC << 8) + 0xff - v1->y()
+ : (center->y() | 0xff) - v1->y())
+ * (v1->x() - v2->x()) / (v1->y() - v2->y());
+ fillLines<clip, BottomUp, RightToLeft>(bits, width, height, y1, yC, x1, dx1,
+ xUp, dx, value, 0, dd);
+ if (yC != y2)
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, yC, y2, x2, dx2,
+ xDn, dx, value, 0, dd);
+ } else {
+ // Center at the top.
+ if (y2 < y1) {
+ // yC <= y2 < y1
+ // Long right edge.
+ if (yC != y2) {
+ d2 = centerFrac * value / (v2->y() - center->y());
+ dd2 = ((value << 8) / (v2->y() - center->y()));
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, yC, y2, x2, dx2,
+ x1, dx1, d2, dd2, dd);
+ }
+ dx2 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y());
+ x2 = v2->x() + v2Frac * (v1->x() - v2->x()) / (v1->y() - v2->y());
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, y2, y1, x2, dx2,
+ x1, dx1, value, 0, dd);
+ } else {
+ // Long left edge.
+ // yC <= y1 <= y2
+ if (yC != y1) {
+ d1 = centerFrac * value / (v1->y() - center->y());
+ dd1 = ((value << 8) / (v1->y() - center->y()));
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, yC, y1, x2, dx2,
+ x1, dx1, d1, dd1, dd);
+ }
+ if (y1 != y2) {
+ dx1 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y());
+ x1 = v1->x() + v1Frac * (v1->x() - v2->x()) / (v1->y() - v2->y());
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, y1, y2, x2, dx2,
+ x1, dx1, value, 0, dd);
+ }
+ }
+ }
+ }
+}
+
+template <FillClip clip>
+void drawRectangle(qint32 *bits, int width, int height,
+ const QPoint *int1, const QPoint *center1, const QPoint *ext1,
+ const QPoint *int2, const QPoint *center2, const QPoint *ext2,
+ qint32 extValue)
+{
+ if (center1->y() > center2->y()) {
+ qSwap(center1, center2);
+ qSwap(int1, ext2);
+ qSwap(ext1, int2);
+ extValue = -extValue;
+ }
+
+ Q_ASSERT(ext1->x() - center1->x() == center1->x() - int1->x());
+ Q_ASSERT(ext1->y() - center1->y() == center1->y() - int1->y());
+ Q_ASSERT(ext2->x() - center2->x() == center2->x() - int2->x());
+ Q_ASSERT(ext2->y() - center2->y() == center2->y() - int2->y());
+
+ const int yc1 = clip == Clip ? qBound(0, center1->y() >> 8, height) : center1->y() >> 8;
+ const int yc2 = clip == Clip ? qBound(0, center2->y() >> 8, height) : center2->y() >> 8;
+ const int yi1 = clip == Clip ? qBound(0, int1->y() >> 8, height) : int1->y() >> 8;
+ const int yi2 = clip == Clip ? qBound(0, int2->y() >> 8, height) : int2->y() >> 8;
+ const int ye1 = clip == Clip ? qBound(0, ext1->y() >> 8, height) : ext1->y() >> 8;
+ const int ye2 = clip == Clip ? qBound(0, ext2->y() >> 8, height) : ext2->y() >> 8;
+
+ const int center1Frac = clip == Clip ? (yc1 << 8) + 0xff - center1->y() : ~center1->y() & 0xff;
+ const int center2Frac = clip == Clip ? (yc2 << 8) + 0xff - center2->y() : ~center2->y() & 0xff;
+ const int int1Frac = clip == Clip ? (yi1 << 8) + 0xff - int1->y() : ~int1->y() & 0xff;
+ const int ext1Frac = clip == Clip ? (ye1 << 8) + 0xff - ext1->y() : ~ext1->y() & 0xff;
+
+ int dxC = 0, dxE = 0; // cap slope, edge slope
+ qint32 ddC = 0;
+ if (ext1->y() != int1->y()) {
+ dxC = ((ext1->x() - int1->x()) << 8) / (ext1->y() - int1->y());
+ ddC = (extValue << 9) / (ext1->y() - int1->y());
+ }
+ if (ext1->y() != ext2->y())
+ dxE = ((ext1->x() - ext2->x()) << 8) / (ext1->y() - ext2->y());
+
+ const qint32 div = (ext1->x() - int1->x()) * (ext2->y() - int1->y())
+ - (ext1->y() - int1->y()) * (ext2->x() - int1->x());
+ const qint32 dd = div ? qint32((qint64(extValue * (ext2->y() - ext1->y())) << 9) / div) : 0;
+
+ int xe1, xe2, xc1, xc2;
+ qint32 d;
+
+ qint32 intValue = -extValue;
+
+ if (center2->x() < center1->x()) {
+ // Leaning to the right. '/'
+ if (int1->y() < ext2->y()) {
+ // Mostly vertical.
+ Q_ASSERT(ext1->y() != ext2->y());
+ xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ if (ye1 != yi1) {
+ xc2 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc2 += (ye1 - yc1) * dxC;
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye1, yi1, xe1, dxE,
+ xc2, dxC, extValue, 0, dd);
+ }
+ if (yi1 != ye2)
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, yi1, ye2, xe1, dxE,
+ xe2, dxE, extValue, 0, dd);
+ if (ye2 != yi2) {
+ xc1 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc1 += (ye2 - yc2) * dxC;
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, ye2, yi2, xc1, dxC,
+ xe2, dxE, intValue, 0, dd);
+ }
+ } else {
+ // Mostly horizontal.
+ Q_ASSERT(ext1->y() != int1->y());
+ xc1 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc2 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc1 += (ye2 - yc2) * dxC;
+ xc2 += (ye1 - yc1) * dxC;
+ if (ye1 != ye2) {
+ xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye1, ye2, xe1, dxE,
+ xc2, dxC, extValue, 0, dd);
+ }
+ if (ye2 != yi1) {
+ d = (clip == Clip ? (ye2 << 8) + 0xff - center2->y()
+ : (ext2->y() | 0xff) - center2->y())
+ * 2 * extValue / (ext1->y() - int1->y());
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye2, yi1, xc1, dxC,
+ xc2, dxC, d, ddC, dd);
+ }
+ if (yi1 != yi2) {
+ xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi1, yi2, xc1, dxC,
+ xe2, dxE, intValue, 0, dd);
+ }
+ }
+ } else {
+ // Leaning to the left. '\'
+ if (ext1->y() < int2->y()) {
+ // Mostly vertical.
+ Q_ASSERT(ext1->y() != ext2->y());
+ xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ if (yi1 != ye1) {
+ xc1 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc1 += (yi1 - yc1) * dxC;
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi1, ye1, xc1, dxC,
+ xe2, dxE, intValue, 0, dd);
+ }
+ if (ye1 != yi2)
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, ye1, yi2, xe1, dxE,
+ xe2, dxE, intValue, 0, dd);
+ if (yi2 != ye2) {
+ xc2 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc2 += (yi2 - yc2) * dxC;
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, yi2, ye2, xe1, dxE,
+ xc2, dxC, extValue, 0, dd);
+ }
+ } else {
+ // Mostly horizontal.
+ Q_ASSERT(ext1->y() != int1->y());
+ xc1 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc2 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y());
+ xc1 += (yi1 - yc1) * dxC;
+ xc2 += (yi2 - yc2) * dxC;
+ if (yi1 != yi2) {
+ xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi1, yi2, xc1, dxC,
+ xe2, dxE, intValue, 0, dd);
+ }
+ if (yi2 != ye1) {
+ d = (clip == Clip ? (yi2 << 8) + 0xff - center2->y()
+ : (int2->y() | 0xff) - center2->y())
+ * 2 * extValue / (ext1->y() - int1->y());
+ fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi2, ye1, xc1, dxC,
+ xc2, dxC, d, ddC, dd);
+ }
+ if (ye1 != ye2) {
+ xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y());
+ fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye1, ye2, xe1, dxE,
+ xc2, dxC, extValue, 0, dd);
+ }
+ }
+ }
+}
+
+static void drawPolygons(qint32 *bits, int width, int height, const QPoint *vertices,
+ const quint32 *indices, int indexCount, qint32 value)
+{
+ Q_ASSERT(indexCount != 0);
+ Q_ASSERT(height <= 128);
+ QVarLengthArray<quint8, 16> scans[128];
+ int first = 0;
+ for (int i = 1; i < indexCount; ++i) {
+ quint32 idx1 = indices[i - 1];
+ quint32 idx2 = indices[i];
+ Q_ASSERT(idx1 != quint32(-1));
+ if (idx2 == quint32(-1)) {
+ idx2 = indices[first];
+ Q_ASSERT(idx2 != quint32(-1));
+ first = ++i;
+ }
+ const QPoint *v1 = &vertices[idx1];
+ const QPoint *v2 = &vertices[idx2];
+ if (v2->y() < v1->y())
+ qSwap(v1, v2);
+ int fromY = qMax(0, v1->y() >> 8);
+ int toY = qMin(height, v2->y() >> 8);
+ if (fromY >= toY)
+ continue;
+ int dx = ((v2->x() - v1->x()) << 8) / (v2->y() - v1->y());
+ int x = v1->x() + ((fromY << 8) + 0xff - v1->y()) * (v2->x() - v1->x()) / (v2->y() - v1->y());
+ for (int y = fromY; y < toY; ++y) {
+ quint32 c = quint32(x >> 8);
+ if (c < quint32(width))
+ scans[y].append(quint8(c));
+ x += dx;
+ }
+ }
+ for (int i = 0; i < height; ++i) {
+ quint8 *scanline = scans[i].data();
+ int size = scans[i].size();
+ for (int j = 1; j < size; ++j) {
+ int k = j;
+ quint8 value = scanline[k];
+ for (; k != 0 && value < scanline[k - 1]; --k)
+ scanline[k] = scanline[k - 1];
+ scanline[k] = value;
+ }
+ qint32 *line = bits + i * width;
+ int j = 0;
+ for (; j + 1 < size; j += 2) {
+ for (quint8 x = scanline[j]; x < scanline[j + 1]; ++x)
+ line[x] = value;
+ }
+ if (j < size) {
+ for (int x = scanline[j]; x < width; ++x)
+ line[x] = value;
+ }
+ }
+}
+
+static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfScale, int offs)
+{
+ QImage image(imgSize, imgSize, QImage::Format_Indexed8);
+
+ if (path.isEmpty()) {
+ image.fill(0);
+ return image;
+ }
+
+ QTransform transform;
+ transform.translate(offs, offs);
+ transform.scale(qreal(1) / dfScale, qreal(1) / dfScale);
+
+ QDataBuffer<quint32> pathIndices(0);
+ QDataBuffer<QPoint> pathVertices(0);
+ qSimplifyPath(path, pathVertices, pathIndices, transform);
+
+ const qint32 interiorColor = -0x7f80; // 8:8 signed format, -127.5
+ const qint32 exteriorColor = 0x7f80; // 8:8 signed format, 127.5
+
+ QScopedArrayPointer<qint32> bits(new qint32[imgSize * imgSize]);
+ for (int i = 0; i < imgSize * imgSize; ++i)
+ bits[i] = exteriorColor;
+
+ const qreal angleStep = qreal(15 * 3.141592653589793238 / 180);
+ const QPoint rotation(qRound(cos(angleStep) * 0x4000),
+ qRound(sin(angleStep) * 0x4000)); // 2:14 signed
+
+ const quint32 *indices = pathIndices.data();
+ QVarLengthArray<QPoint> normals;
+ QVarLengthArray<QPoint> vertices;
+ QVarLengthArray<bool> isConvex;
+ QVarLengthArray<bool> needsClipping;
+
+ drawPolygons(bits.data(), imgSize, imgSize, pathVertices.data(), indices, pathIndices.size(),
+ interiorColor);
+
+ int index = 0;
+
+ while (index < pathIndices.size()) {
+ normals.clear();
+ vertices.clear();
+ needsClipping.clear();
+
+ // Find end of polygon.
+ int end = index;
+ while (indices[end] != quint32(-1))
+ ++end;
+
+ // Calculate vertex normals.
+ for (int next = index, prev = end - 1; next < end; prev = next++) {
+ quint32 fromVertexIndex = indices[prev];
+ quint32 toVertexIndex = indices[next];
+
+ const QPoint &from = pathVertices.at(fromVertexIndex);
+ const QPoint &to = pathVertices.at(toVertexIndex);
+
+ QPoint n(to.y() - from.y(), from.x() - to.x());
+ if (n.x() == 0 && n.y() == 0)
+ continue;
+ int scale = qRound((offs << 16) / sqrt(qreal(n.x() * n.x() + n.y() * n.y()))); // 8:16
+ n.rx() = n.x() * scale >> 8;
+ n.ry() = n.y() * scale >> 8;
+ normals.append(n);
+ QPoint v(to.x() + 0x7f, to.y() + 0x7f);
+ vertices.append(v);
+ needsClipping.append((to.x() < offs << 8) || (to.x() >= (imgSize - offs) << 8)
+ || (to.y() < offs << 8) || (to.y() >= (imgSize - offs) << 8));
+ }
+
+ isConvex.resize(normals.count());
+ for (int next = 0, prev = normals.count() - 1; next < normals.count(); prev = next++) {
+ isConvex[prev] = normals.at(prev).x() * normals.at(next).y()
+ - normals.at(prev).y() * normals.at(next).x() < 0;
+ }
+
+ // Draw quads.
+ for (int next = 0, prev = normals.count() - 1; next < normals.count(); prev = next++) {
+ QPoint n = normals.at(next);
+ QPoint intPrev = vertices.at(prev);
+ QPoint extPrev = vertices.at(prev);
+ QPoint intNext = vertices.at(next);
+ QPoint extNext = vertices.at(next);
+
+ extPrev.rx() -= n.x();
+ extPrev.ry() -= n.y();
+ intPrev.rx() += n.x();
+ intPrev.ry() += n.y();
+ extNext.rx() -= n.x();
+ extNext.ry() -= n.y();
+ intNext.rx() += n.x();
+ intNext.ry() += n.y();
+
+ if (needsClipping[prev] || needsClipping[next]) {
+ drawRectangle<Clip>(bits.data(), imgSize, imgSize,
+ &intPrev, &vertices.at(prev), &extPrev,
+ &intNext, &vertices.at(next), &extNext,
+ exteriorColor);
+ } else {
+ drawRectangle<NoClip>(bits.data(), imgSize, imgSize,
+ &intPrev, &vertices.at(prev), &extPrev,
+ &intNext, &vertices.at(next), &extNext,
+ exteriorColor);
+ }
+
+ if (isConvex.at(prev)) {
+ QPoint p = extPrev;
+ if (needsClipping[prev]) {
+ for (;;) {
+ QPoint rn((n.x() * rotation.x() - n.y() * rotation.y()) >> 14,
+ (n.y() * rotation.x() + n.x() * rotation.y()) >> 14);
+ n = rn;
+ if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) {
+ p.rx() = vertices.at(prev).x() - normals.at(prev).x();
+ p.ry() = vertices.at(prev).y() - normals.at(prev).y();
+ drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &extPrev, &p, exteriorColor);
+ break;
+ }
+
+ p.rx() = vertices.at(prev).x() - n.x();
+ p.ry() = vertices.at(prev).y() - n.y();
+ drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &extPrev, &p, exteriorColor);
+ extPrev = p;
+ }
+ } else {
+ for (;;) {
+ QPoint rn((n.x() * rotation.x() - n.y() * rotation.y()) >> 14,
+ (n.y() * rotation.x() + n.x() * rotation.y()) >> 14);
+ n = rn;
+ if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) {
+ p.rx() = vertices.at(prev).x() - normals.at(prev).x();
+ p.ry() = vertices.at(prev).y() - normals.at(prev).y();
+ drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &extPrev, &p, exteriorColor);
+ break;
+ }
+
+ p.rx() = vertices.at(prev).x() - n.x();
+ p.ry() = vertices.at(prev).y() - n.y();
+ drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &extPrev, &p, exteriorColor);
+ extPrev = p;
+ }
+ }
+ } else {
+ QPoint p = intPrev;
+ if (needsClipping[prev]) {
+ for (;;) {
+ QPoint rn((n.x() * rotation.x() + n.y() * rotation.y()) >> 14,
+ (n.y() * rotation.x() - n.x() * rotation.y()) >> 14);
+ n = rn;
+ if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) {
+ p.rx() = vertices.at(prev).x() + normals.at(prev).x();
+ p.ry() = vertices.at(prev).y() + normals.at(prev).y();
+ drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &p, &intPrev, interiorColor);
+ break;
+ }
+
+ p.rx() = vertices.at(prev).x() + n.x();
+ p.ry() = vertices.at(prev).y() + n.y();
+ drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &p, &intPrev, interiorColor);
+ intPrev = p;
+ }
+ } else {
+ for (;;) {
+ QPoint rn((n.x() * rotation.x() + n.y() * rotation.y()) >> 14,
+ (n.y() * rotation.x() - n.x() * rotation.y()) >> 14);
+ n = rn;
+ if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) {
+ p.rx() = vertices.at(prev).x() + normals.at(prev).x();
+ p.ry() = vertices.at(prev).y() + normals.at(prev).y();
+ drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &p, &intPrev, interiorColor);
+ break;
+ }
+
+ p.rx() = vertices.at(prev).x() + n.x();
+ p.ry() = vertices.at(prev).y() + n.y();
+ drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev),
+ &p, &intPrev, interiorColor);
+ intPrev = p;
+ }
+ }
+ }
+ }
+
+ index = end + 1;
+ }
+
+ const qint32 *inLine = bits.data();
+ uchar *outLine = image.bits();
+ int padding = image.bytesPerLine() - image.width();
+ for (int y = 0; y < imgSize; ++y) {
+ for (int x = 0; x < imgSize; ++x, ++inLine, ++outLine)
+ *outLine = uchar((0x7f80 - *inLine) >> 8);
+ outLine += padding;
+ }
+
+ return image;
+}
+
+bool qt_fontHasNarrowOutlines(const QRawFont &f)
+{
+ QRawFont font = f;
+ font.setPixelSize(QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE);
+ Q_ASSERT(font.isValid());
+
+ QVector<quint32> glyphIndices = font.glyphIndexesForString(QLatin1String("O"));
+ if (glyphIndices.size() < 1)
+ return false;
+
+ QImage im = font.alphaMapForGlyph(glyphIndices.at(0), QRawFont::PixelAntialiasing);
+ if (im.isNull())
+ return false;
+
+ int minHThick = 999;
+ int minVThick = 999;
+
+ int thick = 0;
+ bool in = false;
+ int y = (im.height() + 1) / 2;
+ for (int x = 0; x < im.width(); ++x) {
+ int a = qAlpha(im.pixel(x, y));
+ if (a > 127) {
+ in = true;
+ ++thick;
+ } else if (in) {
+ in = false;
+ minHThick = qMin(minHThick, thick);
+ thick = 0;
+ }
+ }
+
+ thick = 0;
+ in = false;
+ int x = (im.width() + 1) / 2;
+ for (int y = 0; y < im.height(); ++y) {
+ int a = qAlpha(im.pixel(x, y));
+ if (a > 127) {
+ in = true;
+ ++thick;
+ } else if (in) {
+ in = false;
+ minVThick = qMin(minVThick, thick);
+ thick = 0;
+ }
+ }
+
+ return minHThick == 1 || minVThick == 1;
+}
+
+QImage qt_renderDistanceFieldGlyph(const QRawFont &font, glyph_t glyph, bool doubleResolution)
+{
+ QRawFont renderFont = font;
+ renderFont.setPixelSize(QT_DISTANCEFIELD_BASEFONTSIZE(doubleResolution) * QT_DISTANCEFIELD_SCALE(doubleResolution));
+
+ QPainterPath path = renderFont.pathForGlyph(glyph);
+ path.translate(-path.boundingRect().topLeft());
+ path.setFillRule(Qt::WindingFill);
+
+ QImage im = makeDistanceField(QT_DISTANCEFIELD_TILESIZE(doubleResolution),
+ path,
+ QT_DISTANCEFIELD_SCALE(doubleResolution),
+ QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution));
+ return im;
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/widgets/kernel/qguiplatformplugin_p.h b/src/gui/text/qdistancefield_p.h
index 09b6564061..486d291b78 100644
--- a/src/widgets/kernel/qguiplatformplugin_p.h
+++ b/src/gui/text/qdistancefield_p.h
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the QtGui module of the Qt Toolkit.
+** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,8 +39,8 @@
**
****************************************************************************/
-#ifndef QGUIPLATFORM_P_H
-#define QGUIPLATFORM_P_H
+#ifndef QDISTANCEFIELD_H
+#define QDISTANCEFIELD_H
//
// W A R N I N G
@@ -53,56 +53,33 @@
// We mean it.
//
-#include <QtCore/qplugin.h>
-#include <QtCore/qfactoryinterface.h>
-#include <QtWidgets/qdialog.h>
-
-QT_BEGIN_HEADER
+#include <qrawfont.h>
+#include <private/qfontengine_p.h>
QT_BEGIN_NAMESPACE
-
-class QStyle;
-class QPalette;
-class QIcon;
-class QFileDialog;
-class QColorDialog;
-class QFileInfo;
-
-struct Q_WIDGETS_EXPORT QGuiPlatformPluginInterface : public QFactoryInterface
-{
-};
-
-#define QGuiPlatformPluginInterface_iid "com.nokia.qt.QGuiPlatformPluginInterface"
-
-Q_DECLARE_INTERFACE(QGuiPlatformPluginInterface, QGuiPlatformPluginInterface_iid)
-
-class Q_WIDGETS_EXPORT QGuiPlatformPlugin : public QObject, public QGuiPlatformPluginInterface
-{
- Q_OBJECT
- Q_INTERFACES(QGuiPlatformPluginInterface:QFactoryInterface)
- public:
- explicit QGuiPlatformPlugin(QObject *parent = 0);
- ~QGuiPlatformPlugin();
-
- virtual QStringList keys() const { return QStringList(QStringLiteral("default")); }
-
- virtual QString styleName();
- virtual QPalette palette();
- virtual QString systemIconThemeName();
- virtual QStringList iconThemeSearchPaths();
- virtual QIcon fileSystemIcon(const QFileInfo &);
-
- enum PlatformHint { PH_ToolButtonStyle, PH_ToolBarIconSize, PH_ItemView_ActivateItemOnSingleClick };
- virtual int platformHint(PlatformHint hint);
-};
-
-//internal
-QGuiPlatformPlugin *qt_guiPlatformPlugin();
+#define QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE 54
+#define QT_DISTANCEFIELD_DEFAULT_TILESIZE 64
+#define QT_DISTANCEFIELD_DEFAULT_SCALE 16
+#define QT_DISTANCEFIELD_DEFAULT_RADIUS 80
+#define QT_DISTANCEFIELD_HIGHGLYPHCOUNT 2000
+
+#define QT_DISTANCEFIELD_BASEFONTSIZE(NarrowOutlineFont) \
+ (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE * 2 : \
+ QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE)
+#define QT_DISTANCEFIELD_TILESIZE(NarrowOutlineFont) \
+ (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_TILESIZE * 2 : \
+ QT_DISTANCEFIELD_DEFAULT_TILESIZE)
+#define QT_DISTANCEFIELD_SCALE(NarrowOutlineFont) \
+ (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_SCALE / 2 : \
+ QT_DISTANCEFIELD_DEFAULT_SCALE)
+#define QT_DISTANCEFIELD_RADIUS(NarrowOutlineFont) \
+ (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_RADIUS / 2 : \
+ QT_DISTANCEFIELD_DEFAULT_RADIUS)
+
+bool Q_GUI_EXPORT qt_fontHasNarrowOutlines(const QRawFont &f);
+QImage Q_GUI_EXPORT qt_renderDistanceFieldGlyph(const QRawFont &font, glyph_t glyph, bool doubleResolution);
QT_END_NAMESPACE
-QT_END_HEADER
-
-
-#endif // QGUIPLATFORMPLUGIN_H
+#endif // QDISTANCEFIELD_H
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index a347c62629..ee833a06cf 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -2729,6 +2729,20 @@ QFontEngine *QFontCache::findEngine(const Key &key)
return it.value().data;
}
+void QFontCache::removeEngine(QFontEngine *engine)
+{
+ EngineCache::iterator it = engineCache.begin();
+ while (it != engineCache.end()) {
+ if (it.value().data == engine) {
+ it = engineCache.erase(it);
+ if (--engine->cache_count == 0)
+ decreaseCost(engine->cache_cost);
+ } else {
+ ++it;
+ }
+ }
+}
+
void QFontCache::insertEngine(const Key &key, QFontEngine *engine)
{
FC_DEBUG("QFontCache: inserting new engine %p", engine);
diff --git a/src/gui/text/qfont_p.h b/src/gui/text/qfont_p.h
index e26a98aaf2..d10249201a 100644
--- a/src/gui/text/qfont_p.h
+++ b/src/gui/text/qfont_p.h
@@ -243,6 +243,7 @@ public:
QFontEngine *findEngine(const Key &key);
void insertEngine(const Key &key, QFontEngine *engine);
+ void removeEngine(QFontEngine *engine);
private:
diff --git a/src/gui/text/qfont_qpa.cpp b/src/gui/text/qfont_qpa.cpp
index 7fcbe98b6f..29ba7767bc 100644
--- a/src/gui/text/qfont_qpa.cpp
+++ b/src/gui/text/qfont_qpa.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/QPlatformIntegration>
#include <QtGui/QPlatformFontDatabase>
QT_BEGIN_NAMESPACE
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 3ef28b8e50..7fa486e1ee 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -39,7 +39,6 @@
**
****************************************************************************/
-#include <qdir.h>
#include "qfontdatabase.h"
#include "qdebug.h"
#include "qalgorithms.h"
@@ -47,12 +46,14 @@
#include "qvarlengtharray.h" // here or earlier - workaround for VC++6
#include "qthread.h"
#include "qmutex.h"
+#include "qfile.h"
+#include "qfileinfo.h"
#include "private/qunicodetables_p.h"
#include "qfontengine_p.h"
+#include "qplatformintegration_qpa.h"
#include <QtGui/private/qguiapplication_p.h>
#include <QtGui/qplatformfontdatabase_qpa.h>
-#include "qabstractfileengine.h"
#include <stdlib.h>
#include <limits.h>
@@ -196,7 +197,7 @@ struct QtFontStyle
// bitfield count-- in while condition does not work correctly in mwccsym2
count--;
QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration();
- if (integration) { //on shut down there will be some that we don't release.
+ if (integration) {
integration->fontDatabase()->releaseHandle(pixelSizes[count].handle);
}
}
@@ -349,6 +350,7 @@ struct QtFontFamily
#endif
QString name;
+ QStringList aliases;
int count;
QtFontFoundry **foundries;
@@ -724,7 +726,7 @@ static void match(int script, const QFontDef &request,
const QString &family_name, const QString &foundry_name, int force_encoding_id,
QtFontDesc *desc, const QList<int> &blacklistedFamilies = QList<int>(), bool forceXLFD=false);
-static void initFontDef(const QtFontDesc &desc, const QFontDef &request, QFontDef *fontDef)
+static void initFontDef(const QtFontDesc &desc, const QFontDef &request, QFontDef *fontDef, bool multi)
{
fontDef->family = desc.family->name;
if (! desc.foundry->name.isEmpty() && desc.family->count > 1) {
@@ -743,8 +745,10 @@ static void initFontDef(const QtFontDesc &desc, const QFontDef &request, QFontDe
fontDef->styleHint = request.styleHint;
fontDef->styleStrategy = request.styleStrategy;
- fontDef->weight = desc.style->key.weight;
- fontDef->style = desc.style->key.style;
+ if (!multi)
+ fontDef->weight = desc.style->key.weight;
+ if (!multi)
+ fontDef->style = desc.style->key.style;
fontDef->fixedPitch = desc.family->fixedPitch;
fontDef->stretch = desc.style->key.stretch;
fontDef->ignorePitch = false;
@@ -794,6 +798,14 @@ static QStringList familyList(const QFontDef &req)
Q_GLOBAL_STATIC(QFontDatabasePrivate, privateDb)
Q_GLOBAL_STATIC_WITH_ARGS(QMutex, fontDatabaseMutex, (QMutex::Recursive))
+// used in qguiapplication.cpp
+void qt_cleanupFontDatabase()
+{
+ QFontDatabasePrivate *db = privateDb();
+ if (db)
+ db->free();
+}
+
// used in qfontengine_x11.cpp
QMutex *qt_fontdatabase_mutex()
{
@@ -986,6 +998,25 @@ unsigned int bestFoundry(int script, unsigned int score, int styleStrategy,
return score;
}
+static bool matchFamilyName(const QString &familyName, QtFontFamily *f)
+{
+ if (familyName.isEmpty())
+ return true;
+
+ if (f->name.compare(familyName, Qt::CaseInsensitive) == 0)
+ return true;
+
+ QStringList::const_iterator it = f->aliases.constBegin();
+ while (it != f->aliases.constEnd()) {
+ if ((*it).compare(familyName, Qt::CaseInsensitive) == 0)
+ return true;
+
+ ++it;
+ }
+
+ return false;
+}
+
/*!
\internal
@@ -1035,9 +1066,7 @@ static void match(int script, const QFontDef &request,
test.family = db->families[x];
test.familyIndex = x;
- if (!family_name.isEmpty()
- && test.family->name.compare(family_name, Qt::CaseInsensitive) != 0
- )
+ if (!matchFamilyName(family_name, test.family))
continue;
if (family_name.isEmpty())
@@ -2193,8 +2222,8 @@ bool QFontDatabasePrivate::isApplicationFont(const QString &fileName)
int QFontDatabase::addApplicationFont(const QString &fileName)
{
QByteArray data;
- QFile f(fileName);
- if (!(f.fileEngine()->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::LocalDiskFlag)) {
+ if (!QFileInfo(fileName).isNativePath()) {
+ QFile f(fileName);
if (!f.open(QIODevice::ReadOnly))
return -1;
data = f.readAll();
diff --git a/src/gui/text/qfontdatabase_qpa.cpp b/src/gui/text/qfontdatabase_qpa.cpp
index 16777d593c..1a1f08f73d 100644
--- a/src/gui/text/qfontdatabase_qpa.cpp
+++ b/src/gui/text/qfontdatabase_qpa.cpp
@@ -58,28 +58,49 @@ Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &fou
const QSupportedWritingSystems &writingSystems, void *handle)
{
QFontDatabasePrivate *d = privateDb();
- // qDebug() << "Adding font" << familyName << weight << style << pixelSize << antialiased;
- QtFontStyle::Key styleKey;
- styleKey.style = style;
- styleKey.weight = weight;
- styleKey.stretch = stretch;
- QtFontFamily *f = d->family(familyName, true);
- f->fixedPitch = fixedPitch;
-
- for (int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
- if (writingSystems.supported(QFontDatabase::WritingSystem(i))) {
- f->writingSystems[i] = QtFontFamily::Supported;
- } else {
- f->writingSystems[i] = QtFontFamily::Unsupported;
- }
+// qDebug() << "Adding font" << familyName << weight << style << pixelSize << antialiased;
+ QtFontStyle::Key styleKey;
+ styleKey.style = style;
+ styleKey.weight = weight;
+ styleKey.stretch = stretch;
+ QtFontFamily *f = d->family(familyName, true);
+ f->fixedPitch = fixedPitch;
+
+ for (int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
+ if (writingSystems.supported(QFontDatabase::WritingSystem(i))) {
+ f->writingSystems[i] = QtFontFamily::Supported;
+ } else {
+ f->writingSystems[i] = QtFontFamily::Unsupported;
}
+ }
+
+ QtFontFoundry *foundry = f->foundry(foundryname, true);
+ QtFontStyle *fontStyle = foundry->style(styleKey, QString(), true);
+ fontStyle->smoothScalable = scalable;
+ fontStyle->antialiased = antialiased;
+ QtFontSize *size = fontStyle->pixelSize(pixelSize ? pixelSize : SMOOTH_SCALABLE, true);
+ if (size->handle) {
+ QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration();
+ if (integration)
+ integration->fontDatabase()->releaseHandle(size->handle);
+ }
+ size->handle = handle;
+}
+
+Q_GUI_EXPORT void qt_registerAliasToFontFamily(const QString &familyName, const QString &alias)
+{
+ if (alias.isEmpty())
+ return;
- QtFontFoundry *foundry = f->foundry(foundryname, true);
- QtFontStyle *fontStyle = foundry->style(styleKey, QString(), true);
- fontStyle->smoothScalable = scalable;
- fontStyle->antialiased = antialiased;
- QtFontSize *size = fontStyle->pixelSize(pixelSize?pixelSize:SMOOTH_SCALABLE, true);
- size->handle = handle;
+ QFontDatabasePrivate *d = privateDb();
+ QtFontFamily *f = d->family(familyName, false);
+ if (!f)
+ return;
+
+ if (f->aliases.contains(alias, Qt::CaseInsensitive))
+ return;
+
+ f->aliases.push_back(alias);
}
static QStringList fallbackFamilies(const QString &family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script)
@@ -185,7 +206,8 @@ QFontEngine *loadEngine(int script, const QFontDef &request,
if (family && !family->fallbackFamilies.isEmpty())
fallbacks = family->fallbackFamilies;
- engine = new QFontEngineMultiQPA(engine, script, fallbacks);
+ QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase();
+ engine = pfdb->fontEngineMulti(engine, QUnicodeTables::Script(script), fallbacks);
// Cache Multi font engine as well in case we got the FT single
// font engine when we are actually looking for a Multi one
@@ -278,7 +300,7 @@ QFontDatabase::findFont(int script, const QFontPrivate *fp,
}
if (engine && engine->type() != QFontEngine::TestFontEngine) {
- initFontDef(desc, request, &engine->fontDef);
+ initFontDef(desc, request, &engine->fontDef, engine->type() == QFontEngine::Multi);
if (fp) {
QFontDef def = request;
@@ -305,7 +327,7 @@ QFontDatabase::findFont(int script, const QFontPrivate *fp,
}
engine = loadEngine(script, def, desc.family, desc.foundry, desc.style, desc.size);
if (engine) {
- initFontDef(desc, def, &engine->fontDef);
+ initFontDef(desc, def, &engine->fontDef, engine->type() == QFontEngine::Multi);
}
}
}
@@ -377,8 +399,12 @@ void QFontDatabase::load(const QFontPrivate *d, int script)
req.family = *it;
fe = QFontDatabase::findFont(script, d, req, multi);
- if (fe && (fe->type()==QFontEngine::Box) && !req.family.isEmpty())
+ if (fe && (fe->type()==QFontEngine::Box) && !req.family.isEmpty()) {
+ if (fe->ref.load() == 0)
+ delete fe;
+
fe = 0;
+ }
}
if (fe->symbol || (d->request.styleStrategy & QFont::NoFontMerging)) {
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index 156a4a1e59..a084a3dd8c 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -1379,18 +1379,24 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
int glyph_pos = 0;
for (int i = 0; i < len; ++i) {
bool surrogate = (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate());
-
+ uint ucs4 = surrogate ? QChar::surrogateToUcs4(str[i], str[i+1]) : str[i].unicode();
if (glyphs->glyphs[glyph_pos] == 0 && str[i].category() != QChar::Separator_Line) {
QGlyphLayoutInstance tmp = glyphs->instance(glyph_pos);
- for (int x = 1; x < engines.size(); ++x) {
+ for (int x=1; x < engines.size(); ++x) {
+ if (!shouldLoadFontEngineForCharacter(x, ucs4))
+ continue;
+
QFontEngine *engine = engines.at(x);
+ bool deleteThisEngine = false;
if (!engine) {
const_cast<QFontEngineMulti *>(this)->loadEngine(x);
engine = engines.at(x);
+ deleteThisEngine = true;
}
Q_ASSERT(engine != 0);
if (engine->type() == Box)
continue;
+
glyphs->advances_x[glyph_pos] = glyphs->advances_y[glyph_pos] = 0;
glyphs->offsets[glyph_pos] = QFixedPoint();
int num = 2;
@@ -1401,13 +1407,17 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
// set the high byte to indicate which engine the glyph came from
glyphs->glyphs[glyph_pos] |= (x << 24);
break;
+ } else if (deleteThisEngine) {
+ const_cast<QFontEngineMulti *>(this)->unloadEngine(x);
}
}
+
// ensure we use metrics from the 1st font when we use the fallback image.
if (!glyphs->glyphs[glyph_pos]) {
glyphs->setInstance(glyph_pos, tmp);
}
}
+
if (surrogate)
++i;
++glyph_pos;
@@ -1418,6 +1428,29 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
return true;
}
+bool QFontEngineMulti::shouldLoadFontEngineForCharacter(int at, uint ucs4) const
+{
+ Q_UNUSED(at);
+ Q_UNUSED(ucs4);
+ return true;
+}
+
+void QFontEngineMulti::unloadEngine(int at)
+{
+ QFontEngine *fontEngine = engines.at(at);
+ if (fontEngine == 0)
+ return;
+
+ // If there are other references to the engine, keep it around and keep the reference
+ if (fontEngine->ref.load() == 1) {
+ QFontCache::instance()->removeEngine(fontEngine);
+ if (fontEngine->cache_count == 0) {
+ delete fontEngine;
+ engines[at] = 0;
+ }
+ }
+}
+
glyph_metrics_t QFontEngineMulti::boundingBox(const QGlyphLayout &glyphs)
{
if (glyphs.numGlyphs <= 0)
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index cecf9d1feb..14e2dba364 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -49,7 +49,7 @@
#ifndef QT_NO_FREETYPE
#include "qfile.h"
-#include "qabstractfileengine.h"
+#include "qfileinfo.h"
#include "qthreadstorage.h"
#include <qmath.h>
@@ -231,7 +231,7 @@ QFreetypeFace *QFreetypeFace::getFace(const QFontEngine::FaceId &face_id,
QScopedPointer<QFreetypeFace> newFreetype(new QFreetypeFace);
FT_Face face;
if (!face_id.filename.isEmpty()) {
- QFile file(QString::fromUtf8(face_id.filename));
+ QString fileName = QString::fromUtf8(face_id.filename);
if (face_id.filename.startsWith(":qmemoryfonts/")) {
// from qfontdatabase.cpp
QByteArray idx = face_id.filename;
@@ -240,7 +240,8 @@ QFreetypeFace *QFreetypeFace::getFace(const QFontEngine::FaceId &face_id,
newFreetype->fontData = qt_fontdata_from_index(idx.toInt(&ok));
if (!ok)
newFreetype->fontData = QByteArray();
- } else if (!(file.fileEngine()->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::LocalDiskFlag)) {
+ } else if (!QFileInfo(fileName).isNativePath()) {
+ QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
return 0;
}
@@ -876,7 +877,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
if (err != FT_Err_Ok)
qWarning("load glyph failed err=%x face=%p, glyph=%d", err, face, glyph);
- if ((!set || set->outline_drawing) && fetchMetricsOnly)
+ if (!set || set->outline_drawing || fetchMetricsOnly)
return 0;
FT_GlyphSlot slot = face->glyph;
@@ -1172,8 +1173,7 @@ QFixed QFontEngineFT::ascent() const
QFixed QFontEngineFT::descent() const
{
- // subtract a pixel to work around QFontMetrics's built-in + 1
- return QFixed::fromFixed(-metrics.descender - 64);
+ return QFixed::fromFixed(-metrics.descender);
}
QFixed QFontEngineFT::leading() const
@@ -1588,7 +1588,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(const QGlyphLayout &glyphs)
glyph_metrics_t overall;
// initialize with line height, we get the same behaviour on all platforms
overall.y = -ascent();
- overall.height = ascent() + descent() + 1;
+ overall.height = ascent() + descent();
QFixed ymax = 0;
QFixed xmax = 0;
diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h
index a9e67c10e8..83b51685c0 100644
--- a/src/gui/text/qfontengine_ft_p.h
+++ b/src/gui/text/qfontengine_ft_p.h
@@ -328,6 +328,7 @@ protected:
private:
friend class QFontEngineFTRawFont;
friend class QFontconfigDatabase;
+ friend class QFontEngineMultiFontConfig;
int loadFlags(QGlyphSet *set, GlyphFormat format, int flags, bool &hsubpixel, int &vfactor) const;
diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h
index c0bd1afb80..023882d560 100644
--- a/src/gui/text/qfontengine_p.h
+++ b/src/gui/text/qfontengine_p.h
@@ -392,11 +392,14 @@ public:
loadEngine(at);
}
+ virtual bool shouldLoadFontEngineForCharacter(int at, uint ucs4) const;
+
protected:
friend class QPSPrintEnginePrivate;
friend class QPSPrintEngineFontMulti;
friend class QRawFont;
virtual void loadEngine(int at) = 0;
+ virtual void unloadEngine(int at);
QVector<QFontEngine *> engines;
};
diff --git a/src/gui/text/qfontengine_qpa_p.h b/src/gui/text/qfontengine_qpa_p.h
index 6a73b9d309..ed2e071ac2 100644
--- a/src/gui/text/qfontengine_qpa_p.h
+++ b/src/gui/text/qfontengine_qpa_p.h
@@ -243,13 +243,16 @@ struct QPAGenerator
QFontEngine *fe;
};
-class QFontEngineMultiQPA : public QFontEngineMulti
+class Q_GUI_EXPORT QFontEngineMultiQPA : public QFontEngineMulti
{
public:
QFontEngineMultiQPA(QFontEngine *fe, int script, const QStringList &fallbacks);
void loadEngine(int at);
+ int fallbackFamilyCount() const { return fallbackFamilies.size(); }
+ QString fallbackFamilyAt(int at) const { return fallbackFamilies.at(at); }
+
private:
QStringList fallbackFamilies;
int script;
diff --git a/src/gui/text/qfontenginedirectwrite.cpp b/src/gui/text/qfontenginedirectwrite.cpp
index afbc41daeb..0f21ae8a1e 100644
--- a/src/gui/text/qfontenginedirectwrite.cpp
+++ b/src/gui/text/qfontenginedirectwrite.cpp
@@ -484,8 +484,8 @@ QFixed QFontEngineDirectWrite::ascent() const
QFixed QFontEngineDirectWrite::descent() const
{
return fontDef.styleStrategy & QFont::ForceIntegerMetrics
- ? (m_descent - 1).round()
- : (m_descent - 1);
+ ? (m_descent).round()
+ : (m_descent);
}
QFixed QFontEngineDirectWrite::leading() const
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp
index a2f0dd724a..283494e316 100644
--- a/src/gui/text/qfontmetrics.cpp
+++ b/src/gui/text/qfontmetrics.cpp
@@ -288,7 +288,7 @@ int QFontMetrics::height() const
{
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
- return qRound(engine->ascent()) + qRound(engine->descent()) + 1;
+ return qRound(engine->ascent()) + qRound(engine->descent());
}
/*!
@@ -316,7 +316,7 @@ int QFontMetrics::lineSpacing() const
{
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
- return qRound(engine->leading()) + qRound(engine->ascent()) + qRound(engine->descent()) + 1;
+ return qRound(engine->leading()) + qRound(engine->ascent()) + qRound(engine->descent());
}
/*!
@@ -1147,7 +1147,7 @@ qreal QFontMetricsF::height() const
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
- return (engine->ascent() + engine->descent() + 1).toReal();
+ return (engine->ascent() + engine->descent()).toReal();
}
/*!
@@ -1175,7 +1175,7 @@ qreal QFontMetricsF::lineSpacing() const
{
QFontEngine *engine = d->engineForScript(QUnicodeTables::Common);
Q_ASSERT(engine != 0);
- return (engine->leading() + engine->ascent() + engine->descent() + 1).toReal();
+ return (engine->leading() + engine->ascent() + engine->descent()).toReal();
}
/*!
diff --git a/src/gui/text/qplatformfontdatabase_qpa.cpp b/src/gui/text/qplatformfontdatabase_qpa.cpp
index f9cc97cbc7..8fcf421330 100644
--- a/src/gui/text/qplatformfontdatabase_qpa.cpp
+++ b/src/gui/text/qplatformfontdatabase_qpa.cpp
@@ -271,6 +271,18 @@ void QPlatformFontDatabase::populateFontDatabase()
}
/*!
+ Returns a multi font engine in the specified \a script to encapsulate \a fontEngine with the
+ option to fall back to to the fonts given by \a fallbacks if \a fontEngine does not support
+ a certain character.
+*/
+QFontEngineMulti *QPlatformFontDatabase::fontEngineMulti(QFontEngine *fontEngine,
+ QUnicodeTables::Script script,
+ const QStringList &fallbacks)
+{
+ return new QFontEngineMultiQPA(fontEngine, script, fallbacks);
+}
+
+/*!
Returns the font engine that can be used to render the font described by
the font definition, \a fontDef, in the specified \a script.
*/
diff --git a/src/gui/text/qplatformfontdatabase_qpa.h b/src/gui/text/qplatformfontdatabase_qpa.h
index 151442c5e1..6a58a3106c 100644
--- a/src/gui/text/qplatformfontdatabase_qpa.h
+++ b/src/gui/text/qplatformfontdatabase_qpa.h
@@ -82,12 +82,14 @@ Q_GUI_EXPORT bool operator==(const QSupportedWritingSystems &, const QSupportedW
Q_GUI_EXPORT bool operator!=(const QSupportedWritingSystems &, const QSupportedWritingSystems &);
class QFontRequestPrivate;
+class QFontEngineMulti;
class Q_GUI_EXPORT QPlatformFontDatabase
{
public:
virtual ~QPlatformFontDatabase();
virtual void populateFontDatabase();
+ virtual QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QUnicodeTables::Script script, const QStringList &fallbacks);
virtual QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
virtual QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const;
virtual QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
diff --git a/src/gui/text/qrawfont_qpa.cpp b/src/gui/text/qrawfont_qpa.cpp
index e9515fdf97..d037d5902d 100644
--- a/src/gui/text/qrawfont_qpa.cpp
+++ b/src/gui/text/qrawfont_qpa.cpp
@@ -44,6 +44,7 @@
#if !defined(QT_NO_RAWFONT)
#include "qrawfont_p.h"
+#include "qplatformintegration_qpa.h"
#include <QtGui/qplatformfontdatabase_qpa.h>
#include <private/qguiapplication_p.h>
diff --git a/src/gui/text/qtextcursor.cpp b/src/gui/text/qtextcursor.cpp
index 25ec09d9db..ddf2fb080e 100644
--- a/src/gui/text/qtextcursor.cpp
+++ b/src/gui/text/qtextcursor.cpp
@@ -414,11 +414,18 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
break;
}
case QTextCursor::PreviousCharacter:
- newPosition = priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
+ if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+ newPosition = qMin(position, adjusted_anchor);
+ else
+ newPosition = priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
break;
case QTextCursor::Left:
- newPosition = visualMovement ? priv->leftCursorPosition(position)
- : priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
+ if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+ newPosition = visualMovement ? qMax(position, adjusted_anchor)
+ : qMin(position, adjusted_anchor);
+ else
+ newPosition = visualMovement ? priv->leftCursorPosition(position)
+ : priv->previousCursorPosition(position, QTextLayout::SkipCharacters);
break;
case QTextCursor::StartOfWord: {
if (relativePos == 0)
@@ -530,11 +537,18 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
break;
}
case QTextCursor::NextCharacter:
- newPosition = priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
+ if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+ newPosition = qMax(position, adjusted_anchor);
+ else
+ newPosition = priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
break;
case QTextCursor::Right:
- newPosition = visualMovement ? priv->rightCursorPosition(position)
- : priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
+ if (mode == QTextCursor::MoveAnchor && position != adjusted_anchor)
+ newPosition = visualMovement ? qMin(position, adjusted_anchor)
+ : qMax(position, adjusted_anchor);
+ else
+ newPosition = visualMovement ? priv->rightCursorPosition(position)
+ : priv->nextCursorPosition(position, QTextLayout::SkipCharacters);
break;
case QTextCursor::NextWord:
case QTextCursor::WordRight:
diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp
index cc3372d6e8..2aedfe9133 100644
--- a/src/gui/text/qtextdocumentlayout.cpp
+++ b/src/gui/text/qtextdocumentlayout.cpp
@@ -3002,15 +3002,15 @@ void QTextDocumentLayout::resizeInlineObject(QTextInlineObject item, int posInDo
{
case QTextCharFormat::AlignMiddle:
item.setDescent(inlineSize.height() / 2);
- item.setAscent(inlineSize.height() / 2 - 1);
+ item.setAscent(inlineSize.height() / 2);
break;
case QTextCharFormat::AlignBaseline:
item.setDescent(m.descent());
- item.setAscent(inlineSize.height() - m.descent() - 1);
+ item.setAscent(inlineSize.height() - m.descent());
break;
default:
item.setDescent(0);
- item.setAscent(inlineSize.height() - 1);
+ item.setAscent(inlineSize.height());
}
}
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 5e5354a980..bc7f4f7ad6 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -2237,7 +2237,7 @@ static inline bool prevCharJoins(const QString &string, int pos)
return (joining == QChar::Dual || joining == QChar::Center);
}
-QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int flags) const
+QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int flags, int from, int count) const
{
// qDebug() << "elidedText; available width" << width.toReal() << "text width:" << this->width(0, layoutData->string.length()).toReal();
@@ -2271,10 +2271,14 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
validate();
+ const int to = count >= 0 && count <= layoutData->string.length() - from
+ ? from + count
+ : layoutData->string.length();
+
if (mode == Qt::ElideNone
- || this->width(0, layoutData->string.length()) <= width
- || layoutData->string.length() <= 1)
- return layoutData->string;
+ || this->width(from, layoutData->string.length()) <= width
+ || to - from <= 1)
+ return layoutData->string.mid(from, from - to);
QFixed ellipsisWidth;
QString ellipsisText;
@@ -2328,7 +2332,7 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
if (mode == Qt::ElideRight) {
QFixed currentWidth;
int pos;
- int nextBreak = 0;
+ int nextBreak = from;
do {
pos = nextBreak;
@@ -2338,17 +2342,17 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
++nextBreak;
currentWidth += this->width(pos, nextBreak - pos);
- } while (nextBreak < layoutData->string.length()
+ } while (nextBreak < to
&& currentWidth < availableWidth);
if (nextCharJoins(layoutData->string, pos))
ellipsisText.prepend(QChar(0x200d) /* ZWJ */);
- return layoutData->string.left(pos) + ellipsisText;
+ return layoutData->string.mid(from, pos - from) + ellipsisText;
} else if (mode == Qt::ElideLeft) {
QFixed currentWidth;
int pos;
- int nextBreak = layoutData->string.length();
+ int nextBreak = to;
do {
pos = nextBreak;
@@ -2358,22 +2362,22 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
--nextBreak;
currentWidth += this->width(nextBreak, pos - nextBreak);
- } while (nextBreak > 0
+ } while (nextBreak > from
&& currentWidth < availableWidth);
if (prevCharJoins(layoutData->string, pos))
ellipsisText.append(QChar(0x200d) /* ZWJ */);
- return ellipsisText + layoutData->string.mid(pos);
+ return ellipsisText + layoutData->string.mid(pos, to - pos);
} else if (mode == Qt::ElideMiddle) {
QFixed leftWidth;
QFixed rightWidth;
- int leftPos = 0;
- int nextLeftBreak = 0;
+ int leftPos = from;
+ int nextLeftBreak = from;
- int rightPos = layoutData->string.length();
- int nextRightBreak = layoutData->string.length();
+ int rightPos = to;
+ int nextRightBreak = to;
do {
leftPos = nextLeftBreak;
@@ -2384,13 +2388,13 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
++nextLeftBreak;
--nextRightBreak;
- while (nextRightBreak > 0 && !attributes[nextRightBreak].charStop)
+ while (nextRightBreak > from && !attributes[nextRightBreak].charStop)
--nextRightBreak;
leftWidth += this->width(leftPos, nextLeftBreak - leftPos);
rightWidth += this->width(nextRightBreak, rightPos - nextRightBreak);
- } while (nextLeftBreak < layoutData->string.length()
- && nextRightBreak > 0
+ } while (nextLeftBreak < to
+ && nextRightBreak > from
&& leftWidth + rightWidth < availableWidth);
if (nextCharJoins(layoutData->string, leftPos))
@@ -2398,10 +2402,10 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
if (prevCharJoins(layoutData->string, rightPos))
ellipsisText.append(QChar(0x200d) /* ZWJ */);
- return layoutData->string.left(leftPos) + ellipsisText + layoutData->string.mid(rightPos);
+ return layoutData->string.mid(from, leftPos - from) + ellipsisText + layoutData->string.mid(rightPos, to - rightPos);
}
- return layoutData->string;
+ return layoutData->string.mid(from, to - from);
}
void QTextEngine::setBoundary(int strPos) const
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
index 641d946aa9..b29f626b68 100644
--- a/src/gui/text/qtextengine_p.h
+++ b/src/gui/text/qtextengine_p.h
@@ -366,7 +366,7 @@ struct Q_AUTOTEST_EXPORT QScriptItem
QFixed leading;
QFixed width;
int glyph_data_offset;
- QFixed height() const { return ascent + descent + 1; }
+ QFixed height() const { return ascent + descent; }
};
@@ -396,7 +396,7 @@ struct Q_AUTOTEST_EXPORT QScriptLine
mutable uint gridfitted : 1;
uint hasTrailingSpaces : 1;
uint leadingIncluded : 1;
- QFixed height() const { return (ascent + descent).ceil() + 1
+ QFixed height() const { return (ascent + descent).ceil()
+ (leadingIncluded? qMax(QFixed(),leading) : QFixed()); }
QFixed base() const { return ascent
+ (leadingIncluded ? qMax(QFixed(),leading) : QFixed()); }
@@ -619,7 +619,7 @@ public:
bool atSpace(int position) const;
void indexAdditionalFormats();
- QString elidedText(Qt::TextElideMode mode, const QFixed &width, int flags = 0) const;
+ QString elidedText(Qt::TextElideMode mode, const QFixed &width, int flags = 0, int from = 0, int count = -1) const;
void shapeLine(const QScriptLine &line);
QFixed leadingSpaceWidth(const QScriptLine &line);
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index ac92c4dd51..943caea644 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -1429,9 +1429,9 @@ qreal QTextLine::descent() const
}
/*!
- Returns the line's height. This is equal to ascent() + descent() + 1
+ Returns the line's height. This is equal to ascent() + descent()
if leading is not included. If leading is included, this equals to
- ascent() + descent() + leading() + 1.
+ ascent() + descent() + leading().
\sa ascent(), descent(), leading(), setLeadingIncluded()
*/
@@ -2124,8 +2124,8 @@ static QGlyphRun glyphRunWithInfo(QFontEngine *fontEngine, const QGlyphLayout &g
Q_ASSERT(glyphsArray.size() == positionsArray.size());
qreal fontHeight = font.ascent() + font.descent();
- qreal minY;
- qreal maxY;
+ qreal minY = 0;
+ qreal maxY = 0;
QVector<quint32> glyphs;
QVector<QPointF> positions;
for (int i=0; i<glyphsArray.size(); ++i) {
diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri
index 63a731f116..6587769712 100644
--- a/src/gui/text/text.pri
+++ b/src/gui/text/text.pri
@@ -42,7 +42,8 @@ HEADERS += \
text/qrawfont_p.h \
text/qglyphrun.h \
text/qglyphrun_p.h \
- text/qharfbuzz_copy_p.h
+ text/qharfbuzz_copy_p.h \
+ text/qdistancefield_p.h
SOURCES += \
text/qfont.cpp \
@@ -73,7 +74,8 @@ SOURCES += \
text/qtextodfwriter.cpp \
text/qstatictext.cpp \
text/qrawfont.cpp \
- text/qglyphrun.cpp
+ text/qglyphrun.cpp \
+ text/qdistancefield.cpp
contains(QT_CONFIG, directwrite) {
LIBS_PRIVATE += -ldwrite
diff --git a/src/gui/util/qdesktopservices.cpp b/src/gui/util/qdesktopservices.cpp
index 0f1312e02d..25fb08f532 100644
--- a/src/gui/util/qdesktopservices.cpp
+++ b/src/gui/util/qdesktopservices.cpp
@@ -45,14 +45,15 @@
#include <qdebug.h>
-#include "qdesktopservices_qpa.cpp"
-
#include <qstandardpaths.h>
#include <qhash.h>
#include <qobject.h>
#include <qcoreapplication.h>
+#include <private/qguiapplication_p.h>
#include <qurl.h>
#include <qmutex.h>
+#include <qplatformservices_qpa.h>
+#include <qplatformintegration_qpa.h>
QT_BEGIN_NAMESPACE
@@ -185,14 +186,15 @@ bool QDesktopServices::openUrl(const QUrl &url)
return result; // ### support bool slot return type
}
}
-
- bool result;
- if (url.scheme() == QLatin1String("file"))
- result = openDocument(url);
- else
- result = launchWebBrowser(url);
-
- return result;
+ if (!url.isValid())
+ return false;
+ QPlatformServices *platformServices = QGuiApplicationPrivate::platformIntegration()->services();
+ if (!platformServices) {
+ qWarning("%s: The platform plugin does not support services.", Q_FUNC_INFO);
+ return false;
+ }
+ return url.scheme() == QStringLiteral("file") ?
+ platformServices->openDocument(url) : platformServices->openUrl(url);
}
/*!
diff --git a/src/gui/util/qdesktopservices_mac.cpp b/src/gui/util/qdesktopservices_mac.cpp
deleted file mode 100644
index 84c7156ef3..0000000000
--- a/src/gui/util/qdesktopservices_mac.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QT_NO_DESKTOPSERVICES
-
-#include <qprocess.h>
-#include <qstringlist.h>
-#include <qdir.h>
-#include <qurl.h>
-#include <private/qcore_mac_p.h>
-#include <qcoreapplication.h>
-
-#include <ApplicationServices/ApplicationServices.h>
-
-QT_BEGIN_NAMESPACE
-
-/*
- Translates a QDesktopServices::StandardLocation into the mac equivalent.
-*/
-OSType translateLocation(QDesktopServices::StandardLocation type)
-{
- switch (type) {
- case QDesktopServices::DesktopLocation:
- return kDesktopFolderType; break;
-
- case QDesktopServices::DocumentsLocation:
- return kDocumentsFolderType; break;
-
- case QDesktopServices::FontsLocation:
- // There are at least two different font directories on the mac: /Library/Fonts and ~/Library/Fonts.
- // To select a specific one we have to specify a different first parameter when calling FSFindFolder.
- return kFontsFolderType; break;
-
- case QDesktopServices::ApplicationsLocation:
- return kApplicationsFolderType; break;
-
- case QDesktopServices::MusicLocation:
- return kMusicDocumentsFolderType; break;
-
- case QDesktopServices::MoviesLocation:
- return kMovieDocumentsFolderType; break;
-
- case QDesktopServices::PicturesLocation:
- return kPictureDocumentsFolderType; break;
-
- case QDesktopServices::TempLocation:
- return kTemporaryFolderType; break;
-
- case QDesktopServices::DataLocation:
- return kApplicationSupportFolderType; break;
-
- case QDesktopServices::CacheLocation:
- return kCachedDataFolderType; break;
-
- default:
- return kDesktopFolderType; break;
- }
-}
-
-static bool lsOpen(const QUrl &url)
-{
- if (!url.isValid() || url.scheme().isEmpty())
- return false;
-
- QCFType<CFURLRef> cfUrl = CFURLCreateWithString(0, QCFString(QString::fromLatin1(url.toEncoded())), 0);
- if (cfUrl == 0)
- return false;
-
- const OSStatus err = LSOpenCFURLRef(cfUrl, 0);
- return (err == noErr);
-}
-
-static bool launchWebBrowser(const QUrl &url)
-{
- return lsOpen(url);
-}
-
-static bool openDocument(const QUrl &file)
-{
- if (!file.isValid())
- return false;
-
- // LSOpen does not work in this case, use QProcess open instead.
- return QProcess::startDetached(QLatin1String("open"), QStringList() << file.toLocalFile());
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DESKTOPSERVICES
diff --git a/src/gui/util/qdesktopservices_win.cpp b/src/gui/util/qdesktopservices_win.cpp
deleted file mode 100644
index 88f245d6f6..0000000000
--- a/src/gui/util/qdesktopservices_win.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qsettings.h>
-#include <qdir.h>
-#include <private/qsystemlibrary_p.h>
-#include <qurl.h>
-#include <qstringlist.h>
-#include <qprocess.h>
-#include <qtemporaryfile.h>
-#include <qcoreapplication.h>
-
-#include <qt_windows.h>
-#include <shlobj.h>
-#if !defined(Q_OS_WINCE)
-# include <intshcut.h>
-#else
-# include <qguifunctions_wince.h>
-# if !defined(STANDARDSHELL_UI_MODEL)
-# include <winx.h>
-# endif
-#endif
-
-#ifndef CSIDL_MYMUSIC
-#define CSIDL_MYMUSIC 13
-#define CSIDL_MYVIDEO 14
-#endif
-
-#ifndef QT_NO_DESKTOPSERVICES
-
-QT_BEGIN_NAMESPACE
-
-static bool openDocument(const QUrl &file)
-{
- if (!file.isValid())
- return false;
- QString filePath = file.toLocalFile();
- if (filePath.isEmpty())
- filePath = file.toString();
- quintptr returnValue = (quintptr)ShellExecute(0, 0, (wchar_t*)filePath.utf16(), 0, 0, SW_SHOWNORMAL);
- return (returnValue > 32); //ShellExecute returns a value greater than 32 if successful
-}
-
-static QString expandEnvStrings(const QString &command)
-{
-#if defined(Q_OS_WINCE)
- return command;
-#else
- wchar_t buffer[MAX_PATH];
- if (ExpandEnvironmentStrings((wchar_t*)command.utf16(), buffer, MAX_PATH))
- return QString::fromWCharArray(buffer);
- else
- return command;
-#endif
-}
-
-static bool launchWebBrowser(const QUrl &url)
-{
- if (url.scheme() == QLatin1String("mailto")) {
- //Retrieve the commandline for the default mail client
- //the default key used below is the command line for the mailto: shell command
- DWORD bufferSize = sizeof(wchar_t) * MAX_PATH;
- long returnValue = -1;
- QString command;
-
- HKEY handle;
- LONG res;
- wchar_t keyValue[MAX_PATH] = {0};
- QString keyName(QLatin1String("mailto"));
-
- //Check if user has set preference, otherwise use default.
- res = RegOpenKeyEx(HKEY_CURRENT_USER,
- L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\mailto\\UserChoice",
- 0, KEY_READ, &handle);
- if (res == ERROR_SUCCESS) {
- returnValue = RegQueryValueEx(handle, L"Progid", 0, 0, reinterpret_cast<unsigned char*>(keyValue), &bufferSize);
- if (!returnValue)
- keyName = QString::fromUtf16((const ushort*)keyValue);
- RegCloseKey(handle);
- }
- keyName += QLatin1String("\\Shell\\Open\\Command");
- res = RegOpenKeyExW(HKEY_CLASSES_ROOT, (const wchar_t*)keyName.utf16(), 0, KEY_READ, &handle);
- if (res != ERROR_SUCCESS)
- return false;
-
- bufferSize = sizeof(wchar_t) * MAX_PATH;
- returnValue = RegQueryValueEx(handle, L"", 0, 0, reinterpret_cast<unsigned char*>(keyValue), &bufferSize);
- if (!returnValue)
- command = QString::fromRawData((QChar*)keyValue, bufferSize);
- RegCloseKey(handle);
-
- if (returnValue)
- return false;
-
- command = expandEnvStrings(command);
- command = command.trimmed();
- //Make sure the path for the process is in quotes
- int index = -1 ;
- if (command[0]!= QLatin1Char('\"')) {
- index = command.indexOf(QLatin1String(".exe "), 0, Qt::CaseInsensitive);
- command.insert(index+4, QLatin1Char('\"'));
- command.insert(0, QLatin1Char('\"'));
- }
- //pass the url as the parameter
- index = command.lastIndexOf(QLatin1String("%1"));
- if (index != -1){
- command.replace(index, 2, url.toString());
- }
- //start the process
- PROCESS_INFORMATION pi;
- ZeroMemory(&pi, sizeof(pi));
- STARTUPINFO si;
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
-
- returnValue = CreateProcess(NULL, (wchar_t*)command.utf16(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
-
- if (!returnValue)
- return false;
-
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- return true;
- }
-
- if (!url.isValid())
- return false;
-
- if (url.scheme().isEmpty())
- return openDocument(url);
-
- quintptr returnValue = (quintptr)ShellExecute(0, 0, (wchar_t *)QString::fromUtf8(url.toEncoded().constData()).utf16(),
- 0, 0, SW_SHOWNORMAL);
- return (returnValue > 32);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DESKTOPSERVICES
diff --git a/src/gui/util/qdesktopservices_x11.cpp b/src/gui/util/qdesktopservices_x11.cpp
deleted file mode 100644
index 73cf47a1db..0000000000
--- a/src/gui/util/qdesktopservices_x11.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdesktopservices.h"
-
-#ifndef QT_NO_DESKTOPSERVICES
-
-#include <qprocess.h>
-#include <qurl.h>
-#include <qdir.h>
-#include <qfile.h>
-#include <qtextstream.h>
-#include <private/qt_x11_p.h>
-#include <qcoreapplication.h>
-#include <stdlib.h>
-
-QT_BEGIN_NAMESPACE
-
-inline static bool launch(const QUrl &url, const QString &client)
-{
-#if !defined(QT_NO_PROCESS)
- return (QProcess::startDetached(client + QLatin1Char(' ') + QString::fromLatin1(url.toEncoded().constData())));
-#else
- return (::system((client + QLatin1Char(' ') + QString::fromLatin1(url.toEncoded().constData())).toLocal8Bit().constData()) != -1);
-#endif
-}
-
-static bool openDocument(const QUrl &url)
-{
- if (!url.isValid())
- return false;
-
- if (launch(url, QLatin1String("xdg-open")))
- return true;
-
- // Use the X11->desktopEnvironment value if X11 is non-NULL,
- // otherwise just attempt to launch command regardless of the desktop environment
- if ((!X11 || (X11 && X11->desktopEnvironment == DE_GNOME)) && launch(url, QLatin1String("gnome-open"))) {
- return true;
- } else {
- if ((!X11 || (X11 && X11->desktopEnvironment == DE_KDE)) && launch(url, QLatin1String("kfmclient exec")))
- return true;
- }
-
- if (launch(url, QLatin1String("firefox")))
- return true;
- if (launch(url, QLatin1String("mozilla")))
- return true;
- if (launch(url, QLatin1String("netscape")))
- return true;
- if (launch(url, QLatin1String("opera")))
- return true;
-
- return false;
-}
-
-static bool launchWebBrowser(const QUrl &url)
-{
- if (!url.isValid())
- return false;
- if (url.scheme() == QLatin1String("mailto"))
- return openDocument(url);
-
- if (launch(url, QLatin1String("xdg-open")))
- return true;
- if (launch(url, QString::fromLocal8Bit(getenv("DEFAULT_BROWSER"))))
- return true;
- if (launch(url, QString::fromLocal8Bit(getenv("BROWSER"))))
- return true;
-
- // Use the X11->desktopEnvironment value if X11 is non-NULL,
- // otherwise just attempt to launch command regardless of the desktop environment
- if ((!X11 || (X11 && X11->desktopEnvironment == DE_GNOME)) && launch(url, QLatin1String("gnome-open"))) {
- return true;
- } else {
- if ((!X11 || (X11 && X11->desktopEnvironment == DE_KDE)) && launch(url, QLatin1String("kfmclient openURL")))
- return true;
- }
-
- if (launch(url, QLatin1String("firefox")))
- return true;
- if (launch(url, QLatin1String("mozilla")))
- return true;
- if (launch(url, QLatin1String("netscape")))
- return true;
- if (launch(url, QLatin1String("opera")))
- return true;
- return false;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DESKTOPSERVICES
diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index 5cf153325b..3901635ca0 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -560,7 +560,8 @@ void QHttpThreadDelegate::synchronousAuthenticationRequiredSlot(const QHttpNetwo
}
// Disconnect this connection now since we only want to ask the authentication cache once.
- QObject::disconnect(this, SLOT(synchronousAuthenticationRequiredSlot(QHttpNetworkRequest,QAuthenticator*)));
+ QObject::disconnect(httpReply, SIGNAL(authenticationRequired(QHttpNetworkRequest,QAuthenticator*)),
+ this, SLOT(synchronousAuthenticationRequiredSlot(QHttpNetworkRequest,QAuthenticator*)));
}
#ifndef QT_NO_NETWORKPROXY
@@ -577,7 +578,8 @@ void QHttpThreadDelegate::synchronousProxyAuthenticationRequiredSlot(const QNet
}
// Disconnect this connection now since we only want to ask the authentication cache once.
- QObject::disconnect(this, SLOT(synchronousProxyAuthenticationRequiredSlot(QNetworkProxy,QAuthenticator*)));
+ QObject::disconnect(httpReply, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
+ this, SLOT(synchronousProxyAuthenticationRequiredSlot(QNetworkProxy,QAuthenticator*)));
}
#endif
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index 98967e730e..42201aa9a3 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -179,11 +179,7 @@ void QNetworkAccessFtpBackend::closeDownstreamChannel()
{
state = Disconnecting;
if (operation() == QNetworkAccessManager::GetOperation)
-#ifndef Q_OS_WINCE
- abort();
-#else
- exit(3);
-#endif
+ ftp->abort();
}
void QNetworkAccessFtpBackend::downstreamReadyWrite()
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 8537502116..7be9d278f7 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1094,6 +1094,16 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QAuthenticator *authen
// also called when last URL is empty, e.g. on first call
if (urlForLastAuthentication->isEmpty()
|| url != *urlForLastAuthentication) {
+ // if credentials are included in the url, then use them
+ if (!url.userName().isEmpty()
+ && !url.password().isEmpty()) {
+ authenticator->setUser(url.userName());
+ authenticator->setPassword(url.password());
+ *urlForLastAuthentication = url;
+ authenticationManager->cacheCredentials(url, authenticator);
+ return;
+ }
+
QNetworkAuthenticationCredential cred = authenticationManager->fetchCachedCredentials(url, authenticator);
if (!cred.isNull()) {
authenticator->setUser(cred.user);
diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp
index c987c50017..88b021d780 100644
--- a/src/network/access/qnetworkcookie.cpp
+++ b/src/network/access/qnetworkcookie.cpp
@@ -58,6 +58,8 @@ QT_BEGIN_NAMESPACE
/*!
\class QNetworkCookie
\since 4.4
+ \inmodule QtNetwork
+
\brief The QNetworkCookie class holds one network cookie.
Cookies are small bits of information that stateless protocols
diff --git a/src/network/access/qnetworkcookiejar.cpp b/src/network/access/qnetworkcookiejar.cpp
index 4136043e2e..a7436cb38c 100644
--- a/src/network/access/qnetworkcookiejar.cpp
+++ b/src/network/access/qnetworkcookiejar.cpp
@@ -51,8 +51,10 @@ QT_BEGIN_NAMESPACE
/*!
\class QNetworkCookieJar
- \brief The QNetworkCookieJar class implements a simple jar of QNetworkCookie objects
\since 4.4
+ \inmodule QtNetwork
+
+ \brief The QNetworkCookieJar class implements a simple jar of QNetworkCookie objects
Cookies are small bits of information that stateless protocols
like HTTP use to maintain some persistent information across
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index b9c149e5d8..ef81b6081d 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -57,12 +57,12 @@ QT_BEGIN_NAMESPACE
/*!
\class QNetworkRequest
- \brief The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
\since 4.4
-
\ingroup network
\inmodule QtNetwork
+ \brief The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
+
QNetworkRequest is part of the Network Access API and is the class
holding the information necessary to send a request over the
network. It contains a URL and some ancillary information that can
@@ -115,7 +115,7 @@ QT_BEGIN_NAMESPACE
/*!
\enum QNetworkRequest::Attribute
\since 4.7
-
+
Attribute codes for the QNetworkRequest and QNetworkReply.
Attributes are extra meta-data that are used to control the
@@ -606,7 +606,7 @@ QNetworkRequest::Priority QNetworkRequest::priority() const
/*! \enum QNetworkRequest::Priority
\since 4.7
-
+
This enum lists the possible network request priorities.
\value HighPriority High priority
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index ea937da518..adc72bbcbb 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -8,10 +8,12 @@ HEADERS += kernel/qauthenticator.h \
kernel/qdnslookup.h \
kernel/qdnslookup_p.h \
kernel/qhostaddress.h \
+ kernel/qhostaddress_p.h \
kernel/qhostinfo.h \
kernel/qhostinfo_p.h \
kernel/qurlinfo.h \
kernel/qnetworkproxy.h \
+ kernel/qnetworkproxy_p.h \
kernel/qnetworkinterface.h \
kernel/qnetworkinterface_p.h
@@ -24,7 +26,10 @@ SOURCES += kernel/qauthenticator.cpp \
kernel/qnetworkinterface.cpp
unix:SOURCES += kernel/qdnslookup_unix.cpp kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
-win32:SOURCES += kernel/qdnslookup_win.cpp kernel/qhostinfo_win.cpp kernel/qnetworkinterface_win.cpp
+win32: {
+ HEADERS += kernel/qnetworkinterface_win_p.h
+ SOURCES += kernel/qdnslookup_win.cpp kernel/qhostinfo_win.cpp kernel/qnetworkinterface_win.cpp
+}
integrity:SOURCES += kernel/qdnslookup_unix.cpp kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
mac:LIBS_PRIVATE += -framework SystemConfiguration -framework CoreFoundation
diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp
index 36f47eb5b4..b14fbf8c30 100644
--- a/src/network/kernel/qauthenticator.cpp
+++ b/src/network/kernel/qauthenticator.cpp
@@ -81,12 +81,10 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas
QAuthenticator supports the following authentication methods:
\list
\o Basic
- \o NTLM version 1
+ \o NTLM version 2
\o Digest-MD5
\endlist
- Note that, in particular, NTLM version 2 is not supported.
-
\section1 Options
In addition to the username and password required for authentication, a
@@ -112,7 +110,7 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas
The Basic authentication mechanism supports no outgoing options.
- \section2 NTLM version 1
+ \section2 NTLM version 2
The NTLM authentication mechanism currently supports no incoming or outgoing options.
diff --git a/src/network/kernel/qdnslookup_win.cpp b/src/network/kernel/qdnslookup_win.cpp
index ba97e64942..9b2c088ee2 100644
--- a/src/network/kernel/qdnslookup_win.cpp
+++ b/src/network/kernel/qdnslookup_win.cpp
@@ -39,6 +39,7 @@
**
****************************************************************************/
+#include <winsock2.h>
#include "qdnslookup_p.h"
#include <qurl.h>
diff --git a/src/network/kernel/qhostaddress.cpp b/src/network/kernel/qhostaddress.cpp
index b68335314f..dd46b8126b 100644
--- a/src/network/kernel/qhostaddress.cpp
+++ b/src/network/kernel/qhostaddress.cpp
@@ -38,6 +38,7 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+
#include "qhostaddress.h"
#include "qhostaddress_p.h"
#include "qdebug.h"
diff --git a/src/network/kernel/qhostaddress_p.h b/src/network/kernel/qhostaddress_p.h
index 26dbf861f2..0471d4414a 100644
--- a/src/network/kernel/qhostaddress_p.h
+++ b/src/network/kernel/qhostaddress_p.h
@@ -53,11 +53,11 @@
// We mean it.
//
-QT_BEGIN_NAMESPACE
-
#include "qhostaddress.h"
#include "qabstractsocket.h"
+QT_BEGIN_NAMESPACE
+
class QNetmaskAddress: public QHostAddress
{
int length;
diff --git a/src/network/kernel/qhostinfo_win.cpp b/src/network/kernel/qhostinfo_win.cpp
index a00389e3ed..8ace68d961 100644
--- a/src/network/kernel/qhostinfo_win.cpp
+++ b/src/network/kernel/qhostinfo_win.cpp
@@ -95,6 +95,22 @@ static void resolveLibrary()
#endif
}
+static void translateWSAError(int error, QHostInfo *results)
+{
+ switch (error) {
+ case WSAHOST_NOT_FOUND: //authoritative not found
+ case WSATRY_AGAIN: //non authoritative not found
+ case WSANO_DATA: //valid name, no associated address
+ results->setError(QHostInfo::HostNotFound);
+ results->setErrorString(QHostInfoAgent::tr("Host not found"));
+ return;
+ default:
+ results->setError(QHostInfo::UnknownError);
+ results->setErrorString(QHostInfoAgent::tr("Unknown error (%1)").arg(error));
+ return;
+ }
+}
+
QHostInfo QHostInfoAgent::fromName(const QString &hostName)
{
#if defined(Q_OS_WINCE)
@@ -200,12 +216,8 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
}
results.setAddresses(addresses);
local_freeaddrinfo(res);
- } else if (WSAGetLastError() == WSAHOST_NOT_FOUND || WSAGetLastError() == WSANO_DATA) {
- results.setError(QHostInfo::HostNotFound);
- results.setErrorString(tr("Host not found"));
} else {
- results.setError(QHostInfo::UnknownError);
- results.setErrorString(tr("Unknown error"));
+ translateWSAError(WSAGetLastError(), &results);
}
} else {
// Fall back to gethostbyname, which only supports IPv4.
@@ -228,12 +240,8 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
break;
}
results.setAddresses(addresses);
- } else if (WSAGetLastError() == 11001) {
- results.setErrorString(tr("Host not found"));
- results.setError(QHostInfo::HostNotFound);
} else {
- results.setErrorString(tr("Unknown error"));
- results.setError(QHostInfo::UnknownError);
+ translateWSAError(WSAGetLastError(), &results);
}
}
diff --git a/src/network/kernel/qnetworkinterface.cpp b/src/network/kernel/qnetworkinterface.cpp
index 7b68ed6c12..947b2ab0d9 100644
--- a/src/network/kernel/qnetworkinterface.cpp
+++ b/src/network/kernel/qnetworkinterface.cpp
@@ -149,6 +149,7 @@ QString QNetworkInterfacePrivate::makeHwAddress(int len, uchar *data)
\since 4.2
\reentrant
\ingroup network
+ \inmodule QtNetwork
Each network interface can contain zero or more IP addresses, which
in turn can be associated with a netmask and/or a broadcast
@@ -333,6 +334,7 @@ void QNetworkAddressEntry::setBroadcast(const QHostAddress &newBroadcast)
\since 4.2
\reentrant
\ingroup network
+ \inmodule QtNetwork
QNetworkInterface represents one network interface attached to the
host where the program is being run. Each network interface may
diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp
index 4070c8f014..0238d22eb6 100644
--- a/src/network/kernel/qnetworkproxy.cpp
+++ b/src/network/kernel/qnetworkproxy.cpp
@@ -247,6 +247,12 @@ public:
, socks5SocketEngineHandler(0)
, httpSocketEngineHandler(0)
{
+#ifndef QT_NO_SOCKS5
+ socks5SocketEngineHandler = new QSocks5SocketEngineHandler();
+#endif
+#ifndef QT_NO_HTTP
+ httpSocketEngineHandler = new QHttpSocketEngineHandler();
+#endif
}
~QGlobalNetworkProxy()
@@ -257,19 +263,6 @@ public:
delete httpSocketEngineHandler;
}
- void init()
- {
- QMutexLocker lock(&mutex);
-#ifndef QT_NO_SOCKS5
- if (!socks5SocketEngineHandler)
- socks5SocketEngineHandler = new QSocks5SocketEngineHandler();
-#endif
-#ifndef QT_NO_HTTP
- if (!httpSocketEngineHandler)
- httpSocketEngineHandler = new QHttpSocketEngineHandler();
-#endif
- }
-
void setApplicationProxy(const QNetworkProxy &proxy)
{
QMutexLocker lock(&mutex);
@@ -431,8 +424,6 @@ template<> void QSharedDataPointer<QNetworkProxyPrivate>::detach()
QNetworkProxy::QNetworkProxy()
: d(0)
{
- if (QGlobalNetworkProxy *globalProxy = globalNetworkProxy())
- globalProxy->init();
}
/*!
@@ -447,8 +438,6 @@ QNetworkProxy::QNetworkProxy(ProxyType type, const QString &hostName, quint16 po
const QString &user, const QString &password)
: d(new QNetworkProxyPrivate(type, hostName, port, user, password))
{
- if (QGlobalNetworkProxy *globalProxy = globalNetworkProxy())
- globalProxy->init();
}
/*!
@@ -853,7 +842,7 @@ template<> void QSharedDataPointer<QNetworkProxyQueryPrivate>::detach()
\since 4.5
\inmodule QtNetwork
\brief The QNetworkProxyQuery class is used to query the proxy
- settings for a socket
+ settings for a socket.
QNetworkProxyQuery holds the details of a socket being created or
request being made. It is used by QNetworkProxy and
@@ -1440,7 +1429,7 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
/*!
\fn QList<QNetworkProxy> QNetworkProxyFactory::queryProxy(const QNetworkProxyQuery &query)
- This function examines takes the query request, \a query,
+ This function takes the query request, \a query,
examines the details of the type of socket or request and returns
a list of QNetworkProxy objects that indicate the proxy servers to
be used, in order of preference.
@@ -1461,7 +1450,7 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
/*!
\fn QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &query)
- This function examines takes the query request, \a query,
+ This function takes the query request, \a query,
examines the details of the type of socket or request and returns
a list of QNetworkProxy objects that indicate the proxy servers to
be used, in order of preference.
@@ -1507,7 +1496,7 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
*/
/*!
- This function examines takes the query request, \a query,
+ This function takes the query request, \a query,
examines the details of the type of socket or request and returns
a list of QNetworkProxy objects that indicate the proxy servers to
be used, in order of preference.
diff --git a/src/network/kernel/qurlinfo.cpp b/src/network/kernel/qurlinfo.cpp
index a446f03b85..9f571b9e8c 100644
--- a/src/network/kernel/qurlinfo.cpp
+++ b/src/network/kernel/qurlinfo.cpp
@@ -86,6 +86,7 @@ public:
\ingroup io
\ingroup network
+ \inmodule QtNetwork
The information about a URL that can be retrieved includes name(),
permissions(), owner(), group(), size(), lastModified(),
diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp
index b3fe4ac448..e9848213d8 100644
--- a/src/network/socket/qlocalserver.cpp
+++ b/src/network/socket/qlocalserver.cpp
@@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QLocalServer
\since 4.4
+ \inmodule QtNetwork
\brief The QLocalServer class provides a local socket based server.
@@ -82,6 +83,27 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \enum QLocalServer::SocketOption
+
+ This enum describes the possible options that can be used to create the
+ socket. This changes the access permissions on platforms (Linux, Windows)
+ that support access permissions on the socket. Both GroupAccess and OtherAccess
+ may vary slightly in meanings depending on the platform.
+
+ \value UserAccess
+ Access is restricted to the same user as the process that created the socket.
+ \value GroupAccess
+ Access is restricted to the same group but not the user that created the socket on Linux.
+ \value OtherAccess
+ Access is available to everyone but the user and group that created the socket on Linux.
+ \value WorldAccess
+ No access restrictions.
+
+ \sa SocketOptions
+*/
+
+
+/*!
Create a new local socket server with the given \a parent.
\sa listen()
@@ -109,6 +131,48 @@ QLocalServer::~QLocalServer()
}
/*!
+ \property QLocalServer::socketOptions
+ \since 5.0
+
+ The setSocketOptions method controls how the socket operates.
+ For example the socket may restrict access to what user ids can
+ connect to the socket.
+
+ These options must be set before listen() is called.
+
+ In some cases, such as with Unix domain sockets on Linux, the
+ access to the socket will be determined by file system permissions,
+ and are created based on the umask. Setting the access flags will
+ overide this and will restrict or permit access as specified.
+
+ Other Unix-based operating systems, such as Mac OS X, do not
+ honor file permissions for Unix domain sockets and by default
+ have WorldAccess and these permission flags will have no effect.
+
+ By default none of the flags are set, access permissions
+ are the platform default.
+
+ \sa listen()
+*/
+void QLocalServer::setSocketOptions(SocketOptions options)
+{
+ Q_D(QLocalServer);
+
+ d->socketOptions = options;
+}
+
+/*!
+ Returns the socket options set on the socket.
+
+ \sa setSocketOptions()
+ */
+QLocalServer::SocketOptions QLocalServer::socketOptions() const
+{
+ Q_D(const QLocalServer);
+ return d->socketOptions;
+}
+
+/*!
Stop listening for incoming connections. Existing connections are not
effected, but any new connections will be refused.
@@ -236,6 +300,40 @@ bool QLocalServer::listen(const QString &name)
}
/*!
+ \since 5.0
+
+ Instructs the server to listen for incoming connections on
+ \a socketDescriptor. The property returns \c false if the server is
+ currently listening. It returns \c true on success; otherwise,
+ it returns \c false. The socket must be ready to accept
+ new connections with no extra platform-specific functions
+ called. The socket is set into non-blocking mode.
+
+ serverName(), fullServerName() may return a string with
+ a name if this option is supported by the platform;
+ otherwise, they return an empty QString.
+
+ \sa isListening(), close()
+ */
+bool QLocalServer::listen(qintptr socketDescriptor)
+{
+ Q_D(QLocalServer);
+ if (isListening()) {
+ qWarning("QLocalServer::listen() called when already listening");
+ return false;
+ }
+
+ d->serverName.clear();
+ d->fullServerName.clear();
+
+ if (!d->listen(socketDescriptor)) {
+ return false;
+ }
+
+ return true;
+}
+
+/*!
Returns the maximum number of pending accepted connections.
The default is 30.
diff --git a/src/network/socket/qlocalserver.h b/src/network/socket/qlocalserver.h
index f694131953..291122e10d 100644
--- a/src/network/socket/qlocalserver.h
+++ b/src/network/socket/qlocalserver.h
@@ -58,11 +58,22 @@ class Q_NETWORK_EXPORT QLocalServer : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QLocalServer)
+ Q_PROPERTY(SocketOptions socketOptions READ socketOptions WRITE setSocketOptions)
+ Q_FLAGS(SocketOption SocketOptions)
Q_SIGNALS:
void newConnection();
public:
+ enum SocketOption {
+ NoOptions = 0x0,
+ UserAccessOption = 0x01,
+ GroupAccessOption = 0x2,
+ OtherAccessOption = 0x4,
+ WorldAccessOption = 0x7
+ };
+ Q_DECLARE_FLAGS(SocketOptions, SocketOption)
+
QLocalServer(QObject *parent = 0);
~QLocalServer();
@@ -71,6 +82,7 @@ public:
virtual bool hasPendingConnections() const;
bool isListening() const;
bool listen(const QString &name);
+ bool listen(qintptr socketDescriptor);
int maxPendingConnections() const;
virtual QLocalSocket *nextPendingConnection();
QString serverName() const;
@@ -80,6 +92,9 @@ public:
void setMaxPendingConnections(int numConnections);
bool waitForNewConnection(int msec = 0, bool *timedOut = 0);
+ void setSocketOptions(SocketOptions options);
+ SocketOptions socketOptions() const;
+
protected:
virtual void incomingConnection(quintptr socketDescriptor);
@@ -88,6 +103,8 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_onNewConnection())
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QLocalServer::SocketOptions)
+
#endif // QT_NO_LOCALSERVER
QT_END_NAMESPACE
diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h
index 6e39136dd4..84081159c7 100644
--- a/src/network/socket/qlocalserver_p.h
+++ b/src/network/socket/qlocalserver_p.h
@@ -80,12 +80,14 @@ public:
#if !defined(QT_LOCALSOCKET_TCP) && !defined(Q_OS_WIN)
listenSocket(-1), socketNotifier(0),
#endif
- maxPendingConnections(30), error(QAbstractSocket::UnknownSocketError)
+ maxPendingConnections(30), error(QAbstractSocket::UnknownSocketError),
+ socketOptions(QLocalServer::NoOptions)
{
}
void init();
bool listen(const QString &name);
+ bool listen(qintptr socketDescriptor);
static bool removeServer(const QString &name);
void closeServer();
void waitForNewConnection(int msec, bool *timedOut);
@@ -121,6 +123,7 @@ public:
QQueue<QLocalSocket*> pendingConnections;
QString errorString;
QAbstractSocket::SocketError error;
+ QLocalServer::SocketOptions socketOptions;
};
QT_END_NAMESPACE
diff --git a/src/network/socket/qlocalserver_tcp.cpp b/src/network/socket/qlocalserver_tcp.cpp
index d6c6a1af92..9ac1bfaf0e 100644
--- a/src/network/socket/qlocalserver_tcp.cpp
+++ b/src/network/socket/qlocalserver_tcp.cpp
@@ -78,6 +78,13 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
return true;
}
+bool QLocalServerPrivate::listen(qintptr socketDescriptor)
+{
+ Q_Q(QLocalServer);
+
+ return tcpServer.setSocketDescriptor(socketDescriptor);
+}
+
void QLocalServerPrivate::closeServer()
{
QSettings settings(QLatin1String("Trolltech"), QLatin1String("Qt"));
diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp
index c4482dadfc..0c2edef578 100644
--- a/src/network/socket/qlocalserver_unix.cpp
+++ b/src/network/socket/qlocalserver_unix.cpp
@@ -44,6 +44,7 @@
#include "qlocalsocket.h"
#include "qlocalsocket_p.h"
#include "qnet_unix_p.h"
+#include "qtemporarydir.h"
#ifndef QT_NO_LOCALSERVER
@@ -92,6 +93,20 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
}
serverName = requestedServerName;
+ QString tempPath;
+ QScopedPointer<QTemporaryDir> tempDir;
+
+ // Check any of the flags
+ if (socketOptions & QLocalServer::WorldAccessOption) {
+ tempDir.reset(new QTemporaryDir(fullServerName));
+ if (!tempDir->isValid()) {
+ setError(QLatin1String("QLocalServer::listen"));
+ return false;
+ }
+ tempPath = tempDir->path();
+ tempPath += QLatin1Char('/') + requestedServerName;
+ }
+
// create the unix socket
listenSocket = qt_safe_socket(PF_UNIX, SOCK_STREAM, 0);
if (-1 == listenSocket) {
@@ -108,8 +123,26 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
closeServer();
return false;
}
- ::memcpy(addr.sun_path, fullServerName.toLatin1().data(),
- fullServerName.toLatin1().size() + 1);
+
+ if (socketOptions & QLocalServer::WorldAccessOption) {
+ if (sizeof(addr.sun_path) < (uint)tempPath.toLatin1().size() + 1) {
+ setError(QLatin1String("QLocalServer::listen"));
+ closeServer();
+ return false;
+ }
+ ::memcpy(addr.sun_path, tempPath.toLatin1().data(),
+ tempPath.toLatin1().size() + 1);
+
+ if (-1 == ::fchmod(listenSocket, 0)) {
+ setError(QLatin1String("QLocalServer::listen"));
+ closeServer();
+ return false;
+ }
+
+ } else {
+ ::memcpy(addr.sun_path, fullServerName.toLatin1().data(),
+ fullServerName.toLatin1().size() + 1);
+ }
// bind
if(-1 == QT_SOCKET_BIND(listenSocket, (sockaddr *)&addr, sizeof(sockaddr_un))) {
@@ -133,6 +166,76 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
QFile::remove(fullServerName);
return false;
}
+
+ if (socketOptions & QLocalServer::WorldAccessOption) {
+ mode_t mode = 000;
+
+ if (socketOptions & QLocalServer::UserAccessOption) {
+ mode |= S_IRWXU;
+ }
+ if (socketOptions & QLocalServer::GroupAccessOption) {
+ mode |= S_IRWXG;
+ }
+ if (socketOptions & QLocalServer::OtherAccessOption) {
+ mode |= S_IRWXO;
+ }
+
+ if (mode) {
+ if (-1 == ::chmod(tempPath.toLatin1(), mode)) {
+ setError(QLatin1String("QLocalServer::listen"));
+ closeServer();
+ return false;
+ }
+ }
+ if (-1 == ::rename(tempPath.toLatin1(), fullServerName.toLatin1())){
+ setError(QLatin1String("QLocalServer::listen"));
+ closeServer();
+ return false;
+ }
+ }
+
+ Q_ASSERT(!socketNotifier);
+ socketNotifier = new QSocketNotifier(listenSocket,
+ QSocketNotifier::Read, q);
+ q->connect(socketNotifier, SIGNAL(activated(int)),
+ q, SLOT(_q_onNewConnection()));
+ socketNotifier->setEnabled(maxPendingConnections > 0);
+ return true;
+}
+
+bool QLocalServerPrivate::listen(qintptr socketDescriptor)
+{
+ Q_Q(QLocalServer);
+
+ // Attach to the localsocket
+ listenSocket = socketDescriptor;
+
+ ::fcntl(listenSocket, F_SETFD, FD_CLOEXEC);
+ ::fcntl(listenSocket, F_SETFL, ::fcntl(listenSocket, F_GETFL) | O_NONBLOCK);
+
+#ifdef Q_OS_LINUX
+ struct ::sockaddr_un addr;
+ socklen_t len;
+ memset(&addr, 0, sizeof(addr));
+ if (0 == ::getsockname(listenSocket, (sockaddr *)&addr, &len)) {
+ // check for absract sockets
+ if (addr.sun_family == PF_UNIX && addr.sun_path[0] == 0) {
+ addr.sun_path[0] = '@';
+ }
+ QString name = QString::fromLatin1(addr.sun_path);
+ if (!name.isEmpty()) {
+ fullServerName = name;
+ serverName = fullServerName.mid(fullServerName.lastIndexOf(QLatin1String("/"))+1);
+ if (serverName.isEmpty()) {
+ serverName = fullServerName;
+ }
+ }
+ }
+#else
+ serverName.clear();
+ fullServerName.clear();
+#endif
+
Q_ASSERT(!socketNotifier);
socketNotifier = new QSocketNotifier(listenSocket,
QSocketNotifier::Read, q);
diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp
index 67e319cdbb..07357e5789 100644
--- a/src/network/socket/qlocalserver_win.cpp
+++ b/src/network/socket/qlocalserver_win.cpp
@@ -144,6 +144,12 @@ bool QLocalServerPrivate::listen(const QString &name)
return true;
}
+bool QLocalServerPrivate::listen(qintptr)
+{
+ qWarning("QLocalServer::listen(qintptr) is not supported on Windows QTBUG-24230");
+ return false;
+}
+
void QLocalServerPrivate::_q_onNewConnection()
{
Q_Q(QLocalServer);
diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp
index 3097eaa96c..ced7bba09b 100644
--- a/src/network/socket/qlocalsocket.cpp
+++ b/src/network/socket/qlocalsocket.cpp
@@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QLocalSocket
\since 4.4
+ \inmodule QtNetwork
\brief The QLocalSocket class provides a local socket.
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index e57bfcb52b..d7bbe7eb86 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -615,6 +615,16 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &address, quin
setPortAndAddress(&sockAddrIPv4, &sockAddrIPv6, port, address, &sockAddrPtr, &sockAddrSize);
+#if defined (IPV6_V6ONLY)
+ if (socketProtocol == QAbstractSocket::IPv6Protocol && address.toIPv4Address()) {
+ //IPV6_V6ONLY option must be cleared to connect to a V4 mapped address
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_6_0) {
+ DWORD ipv6only = 0;
+ ipv6only = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) );
+ }
+ }
+#endif
+
forever {
int connectResult = ::WSAConnect(socketDescriptor, sockAddrPtr, sockAddrSize, 0,0,0,0);
if (connectResult == SOCKET_ERROR) {
diff --git a/src/network/ssl/qsslcertificateextension.cpp b/src/network/ssl/qsslcertificateextension.cpp
index 2b5c57e3f0..eef27d7c2e 100644
--- a/src/network/ssl/qsslcertificateextension.cpp
+++ b/src/network/ssl/qsslcertificateextension.cpp
@@ -41,10 +41,11 @@
/*!
\class QSslCertificateExtension
- \brief The QSslCertificateExtension provides an API for accessing the extensions of an X509 certificate.
+ \brief The QSslCertificateExtension class provides an API for accessing the
+ extensions of an X509 certificate.
\since 5.0
- \rentrant
+ \reentrant
\ingroup network
\ingroup ssl
\inmodule QtNetwork
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index ffc9f3f9fe..311ac5fe86 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -2345,6 +2345,4 @@ QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories()
QT_END_NAMESPACE
-// For private slots
-#define d d_ptr
#include "moc_qsslsocket.cpp"
diff --git a/src/opengl/qgl.h b/src/opengl/qgl.h
index be1651ea2f..caa5b96cdc 100644
--- a/src/opengl/qgl.h
+++ b/src/opengl/qgl.h
@@ -42,6 +42,8 @@
#ifndef QGL_H
#define QGL_H
+#ifndef QT_NO_OPENGL
+
#include <QtWidgets/qwidget.h>
#include <QtGui/qpaintengine.h>
#include <QtOpenGL/qglcolormap.h>
@@ -551,4 +553,5 @@ QT_END_NAMESPACE
QT_END_HEADER
+#endif // QT_NO_OPENGL
#endif // QGL_H
diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp
index 96479e189e..21b3abfdd8 100644
--- a/src/opengl/qglframebufferobject.cpp
+++ b/src/opengl/qglframebufferobject.cpp
@@ -459,8 +459,8 @@ void QGLFramebufferObjectPrivate::init(QGLFramebufferObject *q, const QSize &sz,
int height = size.height();
int level = 0;
while (width > 1 || height > 1) {
- width = (width + 1) >> 1;
- height = (height + 1) >> 1;
+ width = qMax(1, width >> 1);
+ height = qMax(1, height >> 1);
++level;
glTexImage2D(target, level, internal_format, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
diff --git a/src/platformsupport/eglconvenience/qeglconvenience.cpp b/src/platformsupport/eglconvenience/qeglconvenience.cpp
index f9ccde6b52..4ba9c1f5ac 100644
--- a/src/platformsupport/eglconvenience/qeglconvenience.cpp
+++ b/src/platformsupport/eglconvenience/qeglconvenience.cpp
@@ -152,13 +152,19 @@ bool q_reduceConfigAttributes(QVector<EGLint> *configAttributes)
}
}
+ i = configAttributes->indexOf(EGL_SAMPLES);
+ if (i >= 0) {
+ EGLint value = configAttributes->value(i+1, 0);
+ if (value > 1)
+ configAttributes->replace(i+1, qMin(EGLint(16), value / 2));
+ else
+ configAttributes->remove(i, 2);
+ return true;
+ }
+
i = configAttributes->indexOf(EGL_SAMPLE_BUFFERS);
if (i >= 0) {
configAttributes->remove(i,2);
- i = configAttributes->indexOf(EGL_SAMPLES);
- if (i >= 0) {
- configAttributes->remove(i,2);
- }
return true;
}
diff --git a/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri b/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri
index 7ea1c64e33..2c896ef2cc 100644
--- a/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri
+++ b/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri
@@ -1,3 +1,5 @@
-HEADERS += $$PWD/qfontconfigdatabase_p.h
-SOURCES += $$PWD/qfontconfigdatabase.cpp
+HEADERS += $$PWD/qfontconfigdatabase_p.h \
+ fontdatabases/fontconfig/qfontenginemultifontconfig_p.h
+SOURCES += $$PWD/qfontconfigdatabase.cpp \
+ fontdatabases/fontconfig/qfontenginemultifontconfig.cpp
DEFINES -= QT_NO_FONTCONFIG
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index f048ed91de..8a9670118f 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qfontconfigdatabase_p.h"
+#include "qfontenginemultifontconfig_p.h"
#include <QtCore/QList>
#include <QtGui/private/qfont_p.h>
@@ -50,8 +51,7 @@
#include <QtGui/private/qfontengine_ft_p.h>
#include <QtGui/private/qfontengine_p.h>
-
-
+#include <QtGui/private/qfontengine_qpa_p.h>
#include <ft2build.h>
#include FT_TRUETYPE_TABLES_H
@@ -471,6 +471,13 @@ void QFontconfigDatabase::populateFontDatabase()
// QApplication::setFont(font);
}
+QFontEngineMulti *QFontconfigDatabase::fontEngineMulti(QFontEngine *fontEngine,
+ QUnicodeTables::Script script,
+ const QStringList &fallbacks)
+{
+ return new QFontEngineMultiFontConfig(fontEngine, script, fallbacks);
+}
+
QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, QUnicodeTables::Script script, void *usrPtr)
{
if (!usrPtr)
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
index 77509f76e5..d4742167e9 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
@@ -51,6 +51,7 @@ class QFontconfigDatabase : public QBasicFontDatabase
{
public:
void populateFontDatabase();
+ QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QUnicodeTables::Script script, const QStringList &fallbacks);
QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const;
QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp
new file mode 100644
index 0000000000..7b28b20bcb
--- /dev/null
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qfontenginemultifontconfig_p.h"
+
+#include <QtGui/private/qfontengine_ft_p.h>
+#include <fontconfig/fontconfig.h>
+#include <QtGui/private/qfontengine_ft_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QFontEngineMultiFontConfig::QFontEngineMultiFontConfig(QFontEngine *fe, int script,
+ const QStringList &fallbacks)
+ : QFontEngineMultiQPA(fe, script, fallbacks)
+{
+}
+
+bool QFontEngineMultiFontConfig::shouldLoadFontEngineForCharacter(int at, uint ucs4) const
+{
+ QFontEngineFT *fontEngine = static_cast<QFontEngineFT *>(engines.at(at));
+ bool charSetHasChar = true;
+ if (fontEngine != 0) {
+ FcCharSet *charSet = fontEngine->freetype->charset;
+ charSetHasChar = FcCharSetHasChar(charSet, ucs4);
+ } else {
+ FcPattern *requestPattern = FcPatternCreate();
+
+ FcValue value;
+ value.type = FcTypeString;
+ QByteArray cs = fallbackFamilyAt(at-1).toUtf8();
+ value.u.s = reinterpret_cast<const FcChar8 *>(cs.data());
+ FcPatternAdd(requestPattern, FC_FAMILY, value, true);
+
+ FcResult result;
+ FcPattern *matchPattern = FcFontMatch(0, requestPattern, &result);
+ if (matchPattern != 0) {
+ FcCharSet *charSet;
+ FcPatternGetCharSet(matchPattern, FC_CHARSET, 0, &charSet);
+ charSetHasChar = FcCharSetHasChar(charSet, ucs4);
+ FcPatternDestroy(matchPattern);
+ }
+
+ FcPatternDestroy(requestPattern);
+ }
+
+ return charSetHasChar;
+}
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h
new file mode 100644
index 0000000000..4323cb7d2e
--- /dev/null
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFONTENGINEMULTIFONTCONFIG_H
+#define QFONTENGINEMULTIFONTCONFIG_H
+
+#include <QtGui/private/qfontengine_qpa_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QFontEngineMultiFontConfig : public QFontEngineMultiQPA
+{
+ Q_OBJECT
+public:
+ explicit QFontEngineMultiFontConfig(QFontEngine *fe, int script, const QStringList &fallbacks);
+
+ bool shouldLoadFontEngineForCharacter(int at, uint ucs4) const;
+};
+
+QT_END_NAMESPACE
+
+#endif // QFONTENGINEMULTIFONTCONFIG_H
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
index 489138abae..a51ffb77ea 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
@@ -255,9 +255,7 @@ QFixed QCoreTextFontEngine::descent() const
if (fontDef.styleStrategy & QFont::ForceIntegerMetrics)
d = d.round();
- // subtract a pixel to even out the historical +1 in QFontMetrics::height().
- // Fix in Qt 5.
- return d - 1;
+ return d;
}
QFixed QCoreTextFontEngine::leading() const
{
diff --git a/src/platformsupport/glxconvenience/qglxconvenience.cpp b/src/platformsupport/glxconvenience/qglxconvenience.cpp
index 5acb2d0b65..f619bf53b8 100644
--- a/src/platformsupport/glxconvenience/qglxconvenience.cpp
+++ b/src/platformsupport/glxconvenience/qglxconvenience.cpp
@@ -153,23 +153,28 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , const QSurfaceFormat
XFree(configs);
}
- reducedFormat = qglx_reduceSurfaceFormat(reducedFormat,&reduced);
+ if (!chosenConfig)
+ reducedFormat = qglx_reduceSurfaceFormat(reducedFormat,&reduced);
}
return chosenConfig;
}
-XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QSurfaceFormat &format)
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, QSurfaceFormat *format)
{
+ Q_ASSERT(format);
+
XVisualInfo *visualInfo = 0;
- GLXFBConfig config = qglx_findConfig(display,screen,format);
- if (config)
+ GLXFBConfig config = qglx_findConfig(display,screen,*format);
+ if (config) {
visualInfo = glXGetVisualFromFBConfig(display, config);
+ *format = qglx_surfaceFormatFromGLXFBConfig(display, config);
+ }
// attempt to fall back to glXChooseVisual
bool reduced = true;
- QSurfaceFormat reducedFormat = format;
+ QSurfaceFormat reducedFormat = *format;
while (!visualInfo && reduced) {
QVarLengthArray<int, 13> attribs;
attribs.append(GLX_RGBA);
@@ -264,7 +269,7 @@ QSurfaceFormat qglx_reduceSurfaceFormat(const QSurfaceFormat &format, bool *redu
} else if (retFormat.blueBufferSize() > 1) {
retFormat.setBlueBufferSize(1);
} else if (retFormat.samples() > 1) {
- retFormat.setSamples(0);
+ retFormat.setSamples(qMin(retFormat.samples() / 2, 16));
} else if (retFormat.stereo()) {
retFormat.setStereo(false);
}else if (retFormat.stencilBufferSize() > 0) {
diff --git a/src/platformsupport/glxconvenience/qglxconvenience_p.h b/src/platformsupport/glxconvenience/qglxconvenience_p.h
index 6d4cecfbe6..a60f789a85 100644
--- a/src/platformsupport/glxconvenience/qglxconvenience_p.h
+++ b/src/platformsupport/glxconvenience/qglxconvenience_p.h
@@ -48,9 +48,9 @@
#include <X11/Xlib.h>
#include <GL/glx.h>
-XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QSurfaceFormat &format);
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, QSurfaceFormat *format);
GLXFBConfig qglx_findConfig(Display *display, int screen, const QSurfaceFormat &format, int drawableBit = GLX_WINDOW_BIT);
-QSurfaceFormat qglx_surfaceFormatFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
+QSurfaceFormat qglx_surfaceFormatFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context = 0);
QVector<int> qglx_buildSpec(const QSurfaceFormat &format, int drawableBit = GLX_WINDOW_BIT);
QSurfaceFormat qglx_reduceSurfaceFormat(const QSurfaceFormat &format, bool *reduced);
diff --git a/src/platformsupport/inputcontext/qplatforminputcontextfactory_qpa.cpp b/src/platformsupport/inputcontext/qplatforminputcontextfactory_qpa.cpp
index e7fdf4385f..ca3673f670 100644
--- a/src/platformsupport/inputcontext/qplatforminputcontextfactory_qpa.cpp
+++ b/src/platformsupport/inputcontext/qplatforminputcontextfactory_qpa.cpp
@@ -82,9 +82,12 @@ QPlatformInputContext *QPlatformInputContextFactory::create()
{
QPlatformInputContext *ic = 0;
- QString icString = QString::fromLatin1(getenv("QT_IM_MODULE"));
- ic = create(icString);
+ QString icString = QString::fromLatin1(qgetenv("QT_IM_MODULE"));
+
+ if (icString == QStringLiteral("none"))
+ return 0;
+ ic = create(icString);
if (ic && ic->isValid())
return ic;
diff --git a/src/platformsupport/platformsupport.pro b/src/platformsupport/platformsupport.pro
index 36323d9766..8322d4c70f 100644
--- a/src/platformsupport/platformsupport.pro
+++ b/src/platformsupport/platformsupport.pro
@@ -33,3 +33,6 @@ include(fontdatabases/fontdatabases.pri)
include(glxconvenience/glxconvenience.pri)
#include(printersupport/printersupport.pri)
include(inputcontext/inputcontext.pri)
+include(udev/udev.pri)
+include(services/services.pri)
+include(themes/themes.pri)
diff --git a/src/platformsupport/services/genericunix/genericunix.pri b/src/platformsupport/services/genericunix/genericunix.pri
new file mode 100644
index 0000000000..6afafa31d0
--- /dev/null
+++ b/src/platformsupport/services/genericunix/genericunix.pri
@@ -0,0 +1,2 @@
+HEADERS += $$PWD/qgenericunixservices_p.h
+SOURCES += $$PWD/qgenericunixservices.cpp
diff --git a/src/platformsupport/services/genericunix/qgenericunixservices.cpp b/src/platformsupport/services/genericunix/qgenericunixservices.cpp
new file mode 100644
index 0000000000..34f46e4e6e
--- /dev/null
+++ b/src/platformsupport/services/genericunix/qgenericunixservices.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgenericunixservices_p.h"
+
+#include <QtCore/QStandardPaths>
+#include <QtCore/QProcess>
+#include <QtCore/QUrl>
+#include <QtCore/QDebug>
+
+#include <stdlib.h>
+
+QT_BEGIN_NAMESPACE
+
+enum { debug = 0 };
+
+static inline QGenericUnixServices::DesktopEnvironment detectDesktopEnvironment()
+{
+ if (!qgetenv("KDE_FULL_SESSION").isEmpty())
+ return QGenericUnixServices::DE_KDE;
+ // GNOME_DESKTOP_SESSION_ID is deprecated for some reason, but still check it
+ if (qgetenv("DESKTOP_SESSION") == "gnome" || !qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty())
+ return QGenericUnixServices::DE_GNOME;
+ return QGenericUnixServices::DE_UNKNOWN;
+}
+
+static inline bool checkExecutable(const QString &candidate, QString *result)
+{
+ *result = QStandardPaths::findExecutable(candidate);
+ return !result->isEmpty();
+}
+
+static inline bool detectWebBrowser(QGenericUnixServices::DesktopEnvironment desktop,
+ bool checkBrowserVariable,
+ QString *browser)
+{
+ const char *browsers[] = {"google-chrome", "firefox", "mozilla", "opera"};
+
+ browser->clear();
+ if (checkExecutable(QStringLiteral("xdg-open"), browser))
+ return true;
+
+ if (checkBrowserVariable) {
+ QByteArray browserVariable = qgetenv("DEFAULT_BROWSER");
+ if (browserVariable.isEmpty())
+ browserVariable = qgetenv("BROWSER");
+ if (!browserVariable.isEmpty() && checkExecutable(QString::fromLocal8Bit(browserVariable), browser))
+ return true;
+ }
+
+ switch (desktop) {
+ case QGenericUnixServices::DE_UNKNOWN:
+ break;
+ case QGenericUnixServices::DE_KDE:
+ // Konqueror launcher
+ if (checkExecutable(QStringLiteral("kfmclient"), browser)) {
+ browser->append(QStringLiteral(" exec"));
+ return true;
+ }
+ case QGenericUnixServices::DE_GNOME:
+ if (checkExecutable(QStringLiteral("gnome-open"), browser))
+ return true;
+ break;
+ }
+
+ for (size_t i = 0; i < sizeof(browsers)/sizeof(char *); ++i)
+ if (checkExecutable(QLatin1String(browsers[i]), browser))
+ return true;
+ return false;
+}
+
+static inline bool launch(const QString &launcher, const QUrl &url)
+{
+ const QString command = launcher + QLatin1Char(' ') + QLatin1String(url.toEncoded());
+ if (debug)
+ qDebug("Launching %s", qPrintable(command));
+#if defined(QT_NO_PROCESS)
+ const bool ok = ::system(qPrintable(command + QStringLiteral(" &")));
+#else
+ const bool ok = QProcess::startDetached(command);
+#endif
+ if (!ok)
+ qWarning("Launch failed (%s)", qPrintable(command));
+ return ok;
+}
+
+QGenericUnixServices::DesktopEnvironment QGenericUnixServices::desktopEnvironment()
+{
+ static const DesktopEnvironment result = detectDesktopEnvironment();
+ return result;
+}
+
+bool QGenericUnixServices::openUrl(const QUrl &url)
+{
+ if (url.scheme() == QStringLiteral("mailto"))
+ return openDocument(url);
+
+ if (m_webBrowser.isEmpty() && !detectWebBrowser(desktopEnvironment(), true, &m_webBrowser)) {
+ qWarning("%s: Unable to detect a web browser to launch '%s'", Q_FUNC_INFO, qPrintable(url.toString()));
+ return false;
+ }
+ return launch(m_webBrowser, url);
+}
+
+bool QGenericUnixServices::openDocument(const QUrl &url)
+{
+ if (m_documentLauncher.isEmpty() && !detectWebBrowser(desktopEnvironment(), false, &m_documentLauncher)) {
+ qWarning("%s: Unable to detect a launcher for '%s'", Q_FUNC_INFO, qPrintable(url.toString()));
+ return false;
+ }
+ return launch(m_documentLauncher, url);
+}
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/services/genericunix/qgenericunixservices_p.h b/src/platformsupport/services/genericunix/qgenericunixservices_p.h
new file mode 100644
index 0000000000..3923a45f89
--- /dev/null
+++ b/src/platformsupport/services/genericunix/qgenericunixservices_p.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGENERICUNIXDESKTOPSERVICES_H
+#define QGENERICUNIXDESKTOPSERVICES_H
+
+#include <QtGui/qplatformservices_qpa.h>
+#include <QtCore/QString>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QGenericUnixServices : public QPlatformServices
+{
+public:
+ enum DesktopEnvironment {
+ DE_UNKNOWN,
+ DE_KDE,
+ DE_GNOME
+ };
+
+ QGenericUnixServices() {}
+
+ static DesktopEnvironment desktopEnvironment();
+
+ virtual bool openUrl(const QUrl &url);
+ virtual bool openDocument(const QUrl &url);
+
+private:
+ QString m_webBrowser;
+ QString m_documentLauncher;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QGENERICUNIXDESKTOPSERVICES_H
diff --git a/src/platformsupport/services/services.pri b/src/platformsupport/services/services.pri
new file mode 100644
index 0000000000..adee852626
--- /dev/null
+++ b/src/platformsupport/services/services.pri
@@ -0,0 +1,3 @@
+unix:!mac {
+ include($$PWD/genericunix/genericunix.pri)
+}
diff --git a/src/platformsupport/themes/genericunix/genericunix.pri b/src/platformsupport/themes/genericunix/genericunix.pri
new file mode 100644
index 0000000000..eed48257d0
--- /dev/null
+++ b/src/platformsupport/themes/genericunix/genericunix.pri
@@ -0,0 +1,2 @@
+HEADERS += $$PWD/qgenericunixthemes_p.h
+SOURCES += $$PWD/qgenericunixthemes.cpp
diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
new file mode 100644
index 0000000000..a9f05f6084
--- /dev/null
+++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
@@ -0,0 +1,325 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgenericunixthemes_p.h"
+#include "../../services/genericunix/qgenericunixservices_p.h"
+
+#include <QtGui/QPalette>
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtCore/QFile>
+#include <QtCore/QDebug>
+#include <QtCore/QSettings>
+#include <QtCore/QVariant>
+#include <QtCore/QStringList>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QGenericX11ThemeQKdeTheme
+ \brief QGenericX11Theme is a generic theme implementation for X11.
+ \since 5.0
+ \internal
+ \ingroup qpa
+*/
+
+// Helper to return the icon theme paths from XDG.
+QStringList QGenericUnixTheme::xdgIconThemePaths()
+{
+ QStringList paths;
+ // Add home directory first in search path
+ const QFileInfo homeIconDir(QDir::homePath() + QStringLiteral("/.icons"));
+ if (homeIconDir.isDir())
+ paths.prepend(homeIconDir.absoluteFilePath());
+
+ QString xdgDirString = QFile::decodeName(qgetenv("XDG_DATA_DIRS"));
+ if (xdgDirString.isEmpty())
+ xdgDirString = QLatin1String("/usr/local/share/:/usr/share/");
+ foreach (const QString &xdgDir, xdgDirString.split(QLatin1Char(':'))) {
+ const QFileInfo xdgIconsDir(xdgDir + QStringLiteral("/icons"));
+ if (xdgIconsDir.isDir())
+ paths.append(xdgIconsDir.absoluteFilePath());
+ }
+ return paths;
+}
+
+QVariant QGenericUnixTheme::themeHint(ThemeHint hint) const
+{
+ switch (hint) {
+ case QPlatformTheme::SystemIconFallbackThemeName:
+ return QVariant(QString(QStringLiteral("hicolor")));
+ case QPlatformTheme::IconThemeSearchPaths:
+ return xdgIconThemePaths();
+ case QPlatformTheme::StyleNames: {
+ QStringList styleNames;
+ styleNames << QStringLiteral("Plastique") << QStringLiteral("Windows");
+ return QVariant(styleNames);
+ }
+ break;
+ default:
+ break;
+ }
+ return QPlatformTheme::themeHint(hint);
+}
+
+// Reads the color from the KDE configuration, and store it in the
+// palette with the given color role if found.
+static inline bool kdeColor(QPalette *pal, QPalette::ColorRole role,
+ const QSettings &kdeSettings, const QString &key)
+{
+ const QVariant value = kdeSettings.value(key);
+ if (!value.isValid())
+ return false;
+ const QStringList values = value.toStringList();
+ if (values.size() != 3)
+ return false;
+ pal->setBrush(role, QColor(values.at(0).toInt(), values.at(1).toInt(), values.at(2).toInt()));
+ return true;
+}
+
+// Reads the KDE system palette
+static inline bool readKdeSystemPalette(const QSettings &kdeSettings, QPalette *pal)
+{
+ // Setup KDE palette
+ return kdeColor(pal, QPalette::Button, kdeSettings, QStringLiteral("Colors:Button/BackgroundNormal"))
+ || kdeColor(pal, QPalette::Window, kdeSettings, QStringLiteral("Colors:Window/BackgroundNormal"))
+ || kdeColor(pal, QPalette::Text, kdeSettings, QStringLiteral("Colors:View/ForegroundNormal"))
+ || kdeColor(pal, QPalette::WindowText, kdeSettings, QStringLiteral("Colors:Window/ForegroundNormal"))
+ || kdeColor(pal, QPalette::Base, kdeSettings, QStringLiteral("Colors:View/BackgroundNormal"))
+ || kdeColor(pal, QPalette::Highlight, kdeSettings, QStringLiteral("Colors:Selection/BackgroundNormal"))
+ || kdeColor(pal, QPalette::HighlightedText, kdeSettings, QStringLiteral("Colors:Selection/ForegroundNormal"))
+ || kdeColor(pal, QPalette::AlternateBase, kdeSettings, QStringLiteral("Colors:View/BackgroundAlternate"))
+ || kdeColor(pal, QPalette::ButtonText, kdeSettings, QStringLiteral("Colors:Button/ForegroundNormal"))
+ || kdeColor(pal, QPalette::Link, kdeSettings, QStringLiteral("Colors:View/ForegroundLink"))
+ || kdeColor(pal, QPalette::LinkVisited, kdeSettings, QStringLiteral("Colors:View/ForegroundVisited"));
+}
+
+/*!
+ \class QKdeTheme
+ \brief QKdeTheme is a theme implementation for the KDE desktop (version 4 or higher).
+ \since 5.0
+ \internal
+ \ingroup qpa
+*/
+
+QKdeTheme::QKdeTheme(const QString &kdeHome, int kdeVersion) :
+ m_kdeHome(kdeHome), m_kdeVersion(kdeVersion),
+ m_toolButtonStyle(Qt::ToolButtonTextBesideIcon), m_toolBarIconSize(0)
+{
+ qFill(m_palettes, m_palettes + NPalettes, static_cast<QPalette *>(0));
+ refresh();
+}
+
+void QKdeTheme::clearPalettes()
+{
+ qDeleteAll(m_palettes, m_palettes + NPalettes);
+ qFill(m_palettes, m_palettes + NPalettes, static_cast<QPalette *>(0));
+}
+
+void QKdeTheme::refresh()
+{
+ clearPalettes();
+
+ m_toolButtonStyle = Qt::ToolButtonTextBesideIcon;
+ m_toolBarIconSize = 0;
+ m_styleNames.clear();
+ m_styleNames << QStringLiteral("Oxygen") << QStringLiteral("plastique") << QStringLiteral("windows");
+ m_iconFallbackThemeName = m_iconThemeName = QStringLiteral("oxygen");
+
+ // Read settings file.
+ const QString settingsFile = globalSettingsFile();
+ if (!QFileInfo(settingsFile).isReadable())
+ return;
+
+ const QSettings kdeSettings(settingsFile, QSettings::IniFormat);
+
+ QPalette systemPalette;
+ if (readKdeSystemPalette(kdeSettings, &systemPalette))
+ m_palettes[SystemPalette] = new QPalette(systemPalette);
+ //## TODO tooltip color
+
+ const QVariant styleValue = kdeSettings.value(QStringLiteral("widgetStyle"));
+ if (styleValue.isValid()) {
+ const QString style = styleValue.toString();
+ if (style != m_styleNames.front())
+ m_styleNames.push_front(style);
+ }
+
+ const QVariant themeValue = kdeSettings.value(QStringLiteral("Icons/Theme"));
+ if (themeValue.isValid())
+ m_iconThemeName = themeValue.toString();
+
+ const QVariant toolBarIconSizeValue = kdeSettings.value(QStringLiteral("ToolbarIcons/Size"));
+ if (toolBarIconSizeValue.isValid())
+ m_toolBarIconSize = toolBarIconSizeValue.toInt();
+
+ const QVariant toolbarStyleValue = kdeSettings.value(QStringLiteral("ToolButtonStyle"));
+ if (toolbarStyleValue.isValid()) {
+ const QString toolBarStyle = toolbarStyleValue.toString();
+ if (toolBarStyle == QStringLiteral("TextBesideIcon"))
+ m_toolButtonStyle = Qt::ToolButtonTextBesideIcon;
+ else if (toolBarStyle == QStringLiteral("TextOnly"))
+ m_toolButtonStyle = Qt::ToolButtonTextOnly;
+ else if (toolBarStyle == QStringLiteral("TextUnderIcon"))
+ m_toolButtonStyle = Qt::ToolButtonTextUnderIcon;
+ }
+}
+
+QString QKdeTheme::globalSettingsFile() const
+{
+ return m_kdeHome + QStringLiteral("/share/config/kdeglobals");
+}
+
+static QStringList kdeIconThemeSearchPaths(const QString &kdeHome)
+{
+ QStringList candidates = QStringList(kdeHome);
+ const QString kdeDirs = QFile::decodeName(qgetenv("KDEDIRS"));
+ if (!kdeDirs.isEmpty())
+ candidates.append(kdeDirs.split(QLatin1Char(':')));
+
+ QStringList paths = QGenericUnixTheme::xdgIconThemePaths();
+ const QString iconPath = QStringLiteral("/share/icons");
+ foreach (const QString &candidate, candidates) {
+ const QFileInfo fi(candidate + iconPath);
+ if (fi.isDir())
+ paths.append(fi.absoluteFilePath());
+ }
+ return paths;
+}
+
+QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
+{
+ switch (hint) {
+ case QPlatformTheme::ToolButtonStyle:
+ return QVariant(m_toolButtonStyle);
+ case QPlatformTheme::ToolBarIconSize:
+ return QVariant(m_toolBarIconSize);
+ case QPlatformTheme::SystemIconThemeName:
+ return QVariant(m_iconThemeName);
+ case QPlatformTheme::SystemIconFallbackThemeName:
+ return QVariant(m_iconFallbackThemeName);
+ case QPlatformTheme::IconThemeSearchPaths:
+ return QVariant(kdeIconThemeSearchPaths(m_kdeHome));
+ case QPlatformTheme::StyleNames:
+ return QVariant(m_styleNames);
+ default:
+ break;
+ }
+ return QPlatformTheme::themeHint(hint);
+}
+
+QPlatformTheme *QKdeTheme::createKdeTheme()
+{
+ // Check for version >= 4 and determine home folder from environment,
+ // defaulting to ~/.kde<version>, ~/.kde
+ const QByteArray kdeVersionBA = qgetenv("KDE_SESSION_VERSION");
+ const int kdeVersion = kdeVersionBA.toInt();
+ if (kdeVersion < 4)
+ return 0;
+ const QString kdeHomePathVar = QString::fromLocal8Bit(qgetenv("KDEHOME"));
+ if (!kdeHomePathVar.isEmpty())
+ return new QKdeTheme(kdeHomePathVar, kdeVersion);
+
+ const QString kdeVersionHomePath = QDir::homePath() + QStringLiteral("/.kde") + QLatin1String(kdeVersionBA);
+ if (QFileInfo(kdeVersionHomePath).isDir())
+ return new QKdeTheme(kdeVersionHomePath, kdeVersion);
+
+ const QString kdeHomePath = QDir::homePath() + QStringLiteral("/.kde");
+ if (QFileInfo(kdeHomePath).isDir())
+ return new QKdeTheme(kdeHomePath, kdeVersion);
+
+ qWarning("%s: Unable to determine KDEHOME", Q_FUNC_INFO);
+ return 0;
+}
+
+/*!
+ \class QGnomeTheme
+ \brief QGnomeTheme is a theme implementation for the Gnome desktop.
+ \since 5.0
+ \internal
+ \ingroup qpa
+*/
+
+QVariant QGnomeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
+{
+ switch (hint) {
+ case QPlatformTheme::SystemIconThemeName:
+ case QPlatformTheme::SystemIconFallbackThemeName:
+ return QVariant(QString(QStringLiteral("gnome")));
+ case QPlatformTheme::IconThemeSearchPaths:
+ return QVariant(QGenericUnixTheme::xdgIconThemePaths());
+ case QPlatformTheme::StyleNames: {
+ QStringList styleNames;
+ styleNames << QStringLiteral("GTK+") << QStringLiteral("cleanlooks") << QStringLiteral("windows");
+ return QVariant(styleNames);
+ }
+ default:
+ break;
+ }
+ return QPlatformTheme::themeHint(hint);
+}
+
+/*!
+ \brief Creates a UNIX theme according to the detected desktop environment.
+*/
+
+QPlatformTheme *QGenericUnixTheme::createUnixTheme()
+{
+ QPlatformTheme *result = 0;
+ if (QGuiApplication::desktopSettingsAware()) {
+ switch (QGenericUnixServices::desktopEnvironment()) {
+ case QGenericUnixServices::DE_UNKNOWN:
+ break;
+ case QGenericUnixServices::DE_KDE:
+ result = QKdeTheme::createKdeTheme();
+ break;
+ case QGenericUnixServices::DE_GNOME:
+ result = new QGnomeTheme;
+ break;
+ }
+ }
+ if (!result)
+ result = new QGenericUnixTheme;
+ return result;
+}
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h
new file mode 100644
index 0000000000..12937a205f
--- /dev/null
+++ b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGENERICUNIXTHEMES_H
+#define QGENERICUNIXTHEMES_H
+
+#include <QtGui/QPlatformTheme>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QGenericUnixTheme : public QPlatformTheme
+{
+public:
+ QGenericUnixTheme() {}
+
+ static QPlatformTheme *createUnixTheme();
+
+ virtual QVariant themeHint(ThemeHint hint) const;
+
+ static QStringList xdgIconThemePaths();
+};
+
+class QKdeTheme : public QPlatformTheme
+{
+ QKdeTheme(const QString &kdeHome, int kdeVersion);
+public:
+ ~QKdeTheme() { clearPalettes(); }
+
+ static QPlatformTheme *createKdeTheme();
+ virtual QVariant themeHint(ThemeHint hint) const;
+ virtual const QPalette *palette(Palette type = SystemPalette) const
+ { return m_palettes[type]; }
+
+private:
+ QString globalSettingsFile() const;
+ void clearPalettes();
+ void refresh();
+
+ const QString m_kdeHome;
+ const int m_kdeVersion;
+ QPalette *m_palettes[NPalettes];
+ QString m_iconThemeName;
+ QString m_iconFallbackThemeName;
+ QStringList m_styleNames;
+ int m_toolButtonStyle;
+ int m_toolBarIconSize;
+};
+
+class QGnomeTheme : public QPlatformTheme
+{
+public:
+ QGnomeTheme() {}
+ virtual QVariant themeHint(ThemeHint hint) const;
+
+private:
+};
+
+QPlatformTheme *qt_createUnixTheme();
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QGENERICUNIXTHEMES_H
diff --git a/src/platformsupport/themes/themes.pri b/src/platformsupport/themes/themes.pri
new file mode 100644
index 0000000000..adee852626
--- /dev/null
+++ b/src/platformsupport/themes/themes.pri
@@ -0,0 +1,3 @@
+unix:!mac {
+ include($$PWD/genericunix/genericunix.pri)
+}
diff --git a/src/platformsupport/udev/qudevhelper.cpp b/src/platformsupport/udev/qudevhelper.cpp
new file mode 100644
index 0000000000..b63ef64ed8
--- /dev/null
+++ b/src/platformsupport/udev/qudevhelper.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qudevhelper_p.h"
+#include <libudev.h>
+
+QT_BEGIN_NAMESPACE
+
+void q_udev_devicePath(int type, QString *path)
+{
+ *path = QString();
+ udev *u = udev_new();
+ udev_enumerate *ue = udev_enumerate_new(u);
+ udev_enumerate_add_match_subsystem(ue, "input");
+ if (type & UDev_Mouse)
+ udev_enumerate_add_match_property(ue, "ID_INPUT_MOUSE", "1");
+ if (type & UDev_Touchpad)
+ udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHPAD", "1");
+ if (type & UDev_Touchscreen)
+ udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHSCREEN", "1");
+ udev_enumerate_scan_devices(ue);
+ udev_list_entry *entry;
+ udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(ue)) {
+ const char *syspath = udev_list_entry_get_name(entry);
+ udev_device *udevice = udev_device_new_from_syspath(u, syspath);
+ QString candidate = QString::fromLocal8Bit(udev_device_get_devnode(udevice));
+ udev_device_unref(udevice);
+ if (path->isEmpty() && candidate.startsWith(QLatin1String("/dev/input/event")))
+ *path = candidate;
+ }
+ udev_enumerate_unref(ue);
+ udev_unref(u);
+}
+
+QT_END_NAMESPACE
diff --git a/src/gui/image/qpixmap_qpa.cpp b/src/platformsupport/udev/qudevhelper_p.h
index 162c5f5286..e6046ca085 100644
--- a/src/gui/image/qpixmap_qpa.cpp
+++ b/src/platformsupport/udev/qudevhelper_p.h
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the QtGui module of the Qt Toolkit.
+** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,15 +39,21 @@
**
****************************************************************************/
-#include <qpixmap.h>
-#include <qscreen.h>
-#include <private/qguiapplication_p.h>
+#ifndef QUDEVHELPER_P_H
+#define QUDEVHELPER_P_H
+
+#include <QString>
QT_BEGIN_NAMESPACE
-QPixmap QPixmap::grabWindow(WId window, int x, int y, int w, int h)
-{
- return QGuiApplication::primaryScreen()->handle()->grabWindow(window, x, y, w, h);
-}
+enum QUDeviceType {
+ UDev_Mouse = 0x01,
+ UDev_Touchpad = 0x02,
+ UDev_Touchscreen = 0x04
+};
+
+void q_udev_devicePath(int type, QString *path);
QT_END_NAMESPACE
+
+#endif // QUDEVHELPER_P_H
diff --git a/src/platformsupport/udev/udev.pri b/src/platformsupport/udev/udev.pri
new file mode 100644
index 0000000000..ac3f7df40a
--- /dev/null
+++ b/src/platformsupport/udev/udev.pri
@@ -0,0 +1,5 @@
+contains(QT_CONFIG, libudev) {
+ HEADERS += $$PWD/qudevhelper_p.h
+ SOURCES += $$PWD/qudevhelper.cpp
+ LIBS += -ludev
+}
diff --git a/src/plugins/accessible/widgets/complexwidgets.cpp b/src/plugins/accessible/widgets/complexwidgets.cpp
index 50e0cd7b65..e4b10670ae 100644
--- a/src/plugins/accessible/widgets/complexwidgets.cpp
+++ b/src/plugins/accessible/widgets/complexwidgets.cpp
@@ -122,13 +122,6 @@ public:
return QAccessible::queryAccessibleInterface(m_parent);
}
QAccessibleInterface *child(int) const { return 0; }
- int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const
- {
- Q_UNUSED(relation);
- Q_UNUSED(index);
- Q_UNUSED(iface);
- return -1;
- }
// action interface
QStringList actionNames() const
{
diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp
index a85c79918f..a9f3a858d2 100644
--- a/src/plugins/accessible/widgets/itemviews.cpp
+++ b/src/plugins/accessible/widgets/itemviews.cpp
@@ -442,14 +442,6 @@ QAccessibleInterface *QAccessibleTable::child(int index) const
return childFromLogical(index + 1);
}
-int QAccessibleTable::navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const
-{
- Q_UNUSED(relation);
- Q_UNUSED(index);
- *iface = 0;
- return -1;
-}
-
void *QAccessibleTable::interface_cast(QAccessible::InterfaceType t)
{
if (t == QAccessible::TableInterface)
@@ -780,41 +772,6 @@ QAccessibleInterface *QAccessibleTableCell::child(int) const
return 0;
}
-int QAccessibleTableCell::navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const
-{
- Q_UNUSED(index);
- Q_UNUSED(relation);
-
-// switch (relation) {
-// From table1 implementation:
-// case Up:
-// case Down:
-// case Left:
-// case Right: {
-// // This is in the "not so nice" category. In order to find out which item
-// // is geometrically around, we have to set the current index, navigate
-// // and restore the index as well as the old selection
-// view->setUpdatesEnabled(false);
-// const QModelIndex oldIdx = view->currentIndex();
-// QList<QModelIndex> kids = children();
-// const QModelIndex currentIndex = index ? kids.at(index - 1) : QModelIndex(row);
-// const QItemSelection oldSelection = view->selectionModel()->selection();
-// view->setCurrentIndex(currentIndex);
-// const QModelIndex idx = view->moveCursor(toCursorAction(relation), Qt::NoModifier);
-// view->setCurrentIndex(oldIdx);
-// view->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect);
-// view->setUpdatesEnabled(true);
-// if (!idx.isValid())
-// return -1;
-
-// if (idx.parent() != row.parent() || idx.row() != row.row())
-// *iface = cell(idx);
-// return index ? kids.indexOf(idx) + 1 : 0; }
-// }
- *iface = 0;
- return -1;
-}
-
QAccessibleTableHeaderCell::QAccessibleTableHeaderCell(QAbstractItemView *view_, int index_, Qt::Orientation orientation_)
: view(view_), index(index_), orientation(orientation_)
{
@@ -905,15 +862,6 @@ QAccessibleInterface *QAccessibleTableHeaderCell::child(int) const
return 0;
}
-int QAccessibleTableHeaderCell::navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const
-{
- Q_UNUSED(relation);
- Q_UNUSED(index);
- Q_UNUSED(iface);
-
- return -1;
-}
-
#endif // QT_NO_ITEMVIEWS
QT_END_NAMESPACE
diff --git a/src/plugins/accessible/widgets/itemviews.h b/src/plugins/accessible/widgets/itemviews.h
index 35a9f83a9e..3d852a2377 100644
--- a/src/plugins/accessible/widgets/itemviews.h
+++ b/src/plugins/accessible/widgets/itemviews.h
@@ -77,7 +77,6 @@ public:
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const;
void *interface_cast(QAccessible::InterfaceType t);
@@ -190,7 +189,6 @@ public:
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int) const;
- int navigate(QAccessible::RelationFlag relation, int m_index, QAccessibleInterface **iface) const;
// cell interface
virtual int columnExtent() const;
@@ -236,7 +234,6 @@ public:
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const;
private:
QAbstractItemView *view;
@@ -276,13 +273,6 @@ public:
QAccessibleInterface *child(int) const {
return 0;
}
- int navigate(QAccessible::RelationFlag relation, int, QAccessibleInterface **iface) const
- {
- Q_UNUSED(relation);
- Q_UNUSED(iface);
- return -1;
- }
-
private:
QAbstractItemView *view;
};
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
index 49cf550b76..d3ca1629bd 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
@@ -204,14 +204,6 @@ QAccessibleInterface *QAccessibleMenuItem::child(int index) const
return 0;
}
-int QAccessibleMenuItem::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const
-{
- Q_UNUSED(relation);
- Q_UNUSED(entry);
- *target = 0;
- return -1;
-}
-
void *QAccessibleMenuItem::interface_cast(QAccessible::InterfaceType t)
{
if (t == QAccessible::ActionInterface)
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.h b/src/plugins/accessible/widgets/qaccessiblemenu.h
index e926dc708a..af934e2de7 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.h
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.h
@@ -103,7 +103,6 @@ public:
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface ** target) const;
QObject * object() const;
QRect rect() const;
QAccessible::Role role() const;
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
index 12a415a5b1..140848a559 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
@@ -87,7 +87,7 @@ QList<QWidget*> childWidgets(const QWidget *widget, bool includeTopLevel)
if (!w)
continue;
QString objectName = w->objectName();
- if ((includeTopLevel || !w->isWindow())
+ if ((includeTopLevel || !w->isWindow())
&& !qobject_cast<QFocusFrame*>(w)
&& !qobject_cast<QMenu*>(w)
&& objectName != QLatin1String("qt_rubberband")
@@ -106,30 +106,6 @@ QList<QWidget*> childWidgets(const QWidget *widget, bool includeTopLevel)
\internal
*/
-static QTextBlock qTextBlockAt(const QTextDocument *doc, int pos)
-{
- Q_ASSERT(pos >= 0);
-
- QTextBlock block = doc->begin();
- int i = 0;
- while (block.isValid() && i < pos) {
- block = block.next();
- ++i;
- }
- return block;
-}
-
-static int qTextBlockPosition(QTextBlock block)
-{
- int child = 0;
- while (block.isValid()) {
- block = block.previous();
- ++child;
- }
-
- return child;
-}
-
/*!
\fn QAccessibleTextEdit::QAccessibleTextEdit(QWidget* widget)
@@ -507,12 +483,17 @@ static QTextCursor cursorForRange(QTextEdit *textEdit, int startOffset, int endO
void QAccessibleTextEdit::copyText(int startOffset, int endOffset) const
{
+#ifndef QT_NO_CLIPBOARD
+ QTextCursor previousCursor = textEdit()->textCursor();
QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
if (!cursor.hasSelection())
return;
-// QApplication::clipboard()->setMimeData(new QTextEditMimeData(cursor.selection()));
+ textEdit()->setTextCursor(cursor);
+ textEdit()->copy();
+ textEdit()->setTextCursor(previousCursor);
+#endif
}
void QAccessibleTextEdit::deleteText(int startOffset, int endOffset)
@@ -532,13 +513,15 @@ void QAccessibleTextEdit::insertText(int offset, const QString &text)
void QAccessibleTextEdit::cutText(int startOffset, int endOffset)
{
+#ifndef QT_NO_CLIPBOARD
QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
if (!cursor.hasSelection())
return;
-// QApplication::clipboard()->setMimeData(new QTextEditMimeData(cursor.selection()));
- cursor.removeSelectedText();
+ textEdit()->setTextCursor(cursor);
+ textEdit()->cut();
+#endif
}
void QAccessibleTextEdit::pasteText(int offset)
@@ -965,34 +948,6 @@ QAccessibleInterface *QAccessibleTitleBar::child(int index) const
return 0;
}
-int QAccessibleTitleBar::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **iface) const
-{
- switch (relation) {
- case QAccessible::FocusChild:
- // ###
- if (entry >= 1) {
- QDockWidgetLayout *layout = dockWidgetLayout();
- int index = 1;
- int role;
- for (role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
- QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
- if (!w->isVisible())
- continue;
- if (index == entry)
- break;
- ++index;
- }
- *iface = 0;
- return role > QDockWidgetLayout::FloatButton ? -1 : index;
- }
- break;
- default:
- break;
- }
- *iface = 0;
- return -1;
-}
-
int QAccessibleTitleBar::indexOfChild(const QAccessibleInterface * /*child*/) const
{
return -1;
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h
index c19f1f49fd..147ea91a41 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.h
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h
@@ -248,7 +248,6 @@ public:
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **iface) const;
int indexOfChild(const QAccessibleInterface *child) const;
int childCount() const;
QAccessibleInterface *childAt(int x, int y) const;
diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp
index 652150f392..0fdd4490f7 100644
--- a/src/plugins/accessible/widgets/simplewidgets.cpp
+++ b/src/plugins/accessible/widgets/simplewidgets.cpp
@@ -54,6 +54,7 @@
#include <qlineedit.h>
#include <qstyle.h>
#include <qstyleoption.h>
+#include <QtCore/qvarlengtharray.h>
#ifdef Q_OS_MAC
#include <qfocusframe.h>
@@ -427,52 +428,36 @@ QString QAccessibleDisplay::text(QAccessible::Text t) const
return qt_accStripAmp(str);
}
-QAccessible::Relation QAccessibleDisplay::relationTo(const QAccessibleInterface *other) const
+/*! \reimp */
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >
+QAccessibleDisplay::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const
{
- QAccessible::Relation relation = QAccessibleWidget::relationTo(other);
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > rels = QAccessibleWidget::relations(match);
+ if (match & QAccessible::Labelled) {
+ QVarLengthArray<QObject *, 4> relatedObjects;
- QObject *o = other->object();
- QLabel *label = qobject_cast<QLabel*>(object());
- if (label) {
#ifndef QT_NO_SHORTCUT
- if (o == label->buddy())
- relation |= QAccessible::Label;
+ if (QLabel *label = qobject_cast<QLabel*>(object())) {
+ relatedObjects.append(label->buddy());
#endif
#ifndef QT_NO_GROUPBOX
- } else {
- QGroupBox *groupbox = qobject_cast<QGroupBox*>(object());
- if (groupbox && !groupbox->title().isEmpty())
- if (groupbox->children().contains(o))
- relation |= QAccessible::Label;
-#endif
- }
- return relation;
-}
-
-int QAccessibleDisplay::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
-{
- *target = 0;
- if (rel == QAccessible::Labelled) {
- QObject *targetObject = 0;
- QLabel *label = qobject_cast<QLabel*>(object());
- if (label) {
-#ifndef QT_NO_SHORTCUT
- if (entry == 1)
- targetObject = label->buddy();
-#endif
-#ifndef QT_NO_GROUPBOX
- } else {
- QGroupBox *groupbox = qobject_cast<QGroupBox*>(object());
- if (groupbox && !groupbox->title().isEmpty())
- *target = child(entry - 1);
+ } else if (QGroupBox *groupbox = qobject_cast<QGroupBox*>(object())) {
+ if (!groupbox->title().isEmpty()) {
+ const QList<QWidget*> kids = childWidgets(widget());
+ for (int i = 0; i < kids.count(); ++i) {
+ relatedObjects.append(kids.at(i));
+ }
+ }
#endif
}
- if (targetObject)
- *target = QAccessible::queryAccessibleInterface(targetObject);
- if (*target)
- return 0;
+ for (int i = 0; i < relatedObjects.count(); ++i) {
+ const QAccessible::Relation rel = QAccessible::Labelled;
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(relatedObjects.at(i));
+ if (iface)
+ rels.append(qMakePair(iface, rel));
+ }
}
- return QAccessibleWidget::navigate(rel, entry, target);
+ return rels;
}
void *QAccessibleDisplay::interface_cast(QAccessible::InterfaceType t)
diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h
index bbdececadf..c228775421 100644
--- a/src/plugins/accessible/widgets/simplewidgets.h
+++ b/src/plugins/accessible/widgets/simplewidgets.h
@@ -104,8 +104,7 @@ public:
QString text(QAccessible::Text t) const;
QAccessible::Role role() const;
- QAccessible::Relation relationTo(const QAccessibleInterface *other) const;
- int navigate(QAccessible::RelationFlag, int entry, QAccessibleInterface **target) const;
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >relations(QAccessible::Relation match = QAccessible::AllRelations) const;
void *interface_cast(QAccessible::InterfaceType t);
// QAccessibleImageInterface
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
index 1a874a92b7..0e54668394 100644
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -255,7 +255,7 @@ quint64 QConnmanEngine::bytesWritten(const QString &id)
quint64 result = 0;
QString devFile = getInterfaceFromId(id);
QFile tx("/sys/class/net/"+devFile+"/statistics/tx_bytes");
- if(tx.exists() && tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ if (tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&tx);
in >> result;
tx.close();
@@ -270,7 +270,7 @@ quint64 QConnmanEngine::bytesReceived(const QString &id)
quint64 result = 0;
QString devFile = getInterfaceFromId(id);
QFile rx("/sys/class/net/"+devFile+"/statistics/rx_bytes");
- if(rx.exists() && rx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ if (rx.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&rx);
in >> result;
rx.close();
diff --git a/src/plugins/bearer/generic/qgenericengine.cpp b/src/plugins/bearer/generic/qgenericengine.cpp
index a90d066ad6..7b30b5d64c 100644
--- a/src/plugins/bearer/generic/qgenericengine.cpp
+++ b/src/plugins/bearer/generic/qgenericengine.cpp
@@ -232,7 +232,7 @@ void QGenericEngine::doRequestUpdate()
name = interface.name();
QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Defined;
- if((interface.flags() & QNetworkInterface::IsUp) && !interface.addressEntries().isEmpty())
+ if ((interface.flags() & QNetworkInterface::IsRunning) && !interface.addressEntries().isEmpty())
state |= QNetworkConfiguration::Active;
if (accessPointConfigurations.contains(id)) {
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
index fd79cff484..a71a241ea6 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -837,7 +837,7 @@ quint64 QNetworkManagerEngine::bytesWritten(const QString &id)
quint64 result = Q_UINT64_C(0);
QFile tx(devFile);
- if (tx.exists() && tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ if (tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&tx);
in >> result;
tx.close();
@@ -865,7 +865,7 @@ quint64 QNetworkManagerEngine::bytesReceived(const QString &id)
quint64 result = Q_UINT64_C(0);
QFile tx(devFile);
- if (tx.exists() && tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ if (tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&tx);
in >> result;
tx.close();
diff --git a/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro b/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro
new file mode 100644
index 0000000000..997a58ef6e
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro
@@ -0,0 +1,19 @@
+TARGET = qevdevkeyboardplugin
+load(qt_plugin)
+
+DESTDIR = $$QT.gui.plugins/generic
+target.path = $$[QT_INSTALL_PLUGINS]/generic
+INSTALLS += target
+
+HEADERS = \
+ qevdevkeyboard_defaultmap.h \
+ qevdevkeyboardhandler.h \
+ qevdevkeyboardmanager.h
+
+QT += core-private
+
+LIBS += -ludev
+
+SOURCES = main.cpp \
+ qevdevkeyboardhandler.cpp \
+ qevdevkeyboardmanager.cpp
diff --git a/src/plugins/generic/linuxinput/main.cpp b/src/plugins/generic/evdevkeyboard/main.cpp
index 04fc00f528..6df4e29fcb 100644
--- a/src/plugins/generic/linuxinput/main.cpp
+++ b/src/plugins/generic/evdevkeyboard/main.cpp
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -40,38 +40,38 @@
****************************************************************************/
#include <qgenericplugin_qpa.h>
-#include "qlinuxinput.h"
+#include "qevdevkeyboardmanager.h"
QT_BEGIN_NAMESPACE
-class QLinuxInputPlugin : public QGenericPlugin
+class QEvdevKeyboardPlugin : public QGenericPlugin
{
public:
- QLinuxInputPlugin();
+ QEvdevKeyboardPlugin();
QStringList keys() const;
QObject* create(const QString &key, const QString &specification);
};
-QLinuxInputPlugin::QLinuxInputPlugin()
+QEvdevKeyboardPlugin::QEvdevKeyboardPlugin()
: QGenericPlugin()
{
}
-QStringList QLinuxInputPlugin::keys() const
+QStringList QEvdevKeyboardPlugin::keys() const
{
return (QStringList()
- << QLatin1String("LinuxInputMouse"));
+ << QLatin1String("EvdevKeyboard"));
}
-QObject* QLinuxInputPlugin::create(const QString &key,
+QObject* QEvdevKeyboardPlugin::create(const QString &key,
const QString &specification)
{
- if (!key.compare(QLatin1String("LinuxInputMouse"), Qt::CaseInsensitive))
- return new QLinuxInputMouseHandler(key, specification);
+ if (!key.compare(QLatin1String("EvdevKeyboard"), Qt::CaseInsensitive))
+ return new QEvdevKeyboardManager(key, specification);
return 0;
- }
+}
-Q_EXPORT_PLUGIN2(qlinuxinputplugin, QLinuxInputPlugin)
+Q_EXPORT_PLUGIN2(qevdevkeyboardplugin, QEvdevKeyboardPlugin)
QT_END_NAMESPACE
diff --git a/src/plugins/generic/evdevkeyboard/qevdevkeyboard_defaultmap.h b/src/plugins/generic/evdevkeyboard/qevdevkeyboard_defaultmap.h
new file mode 100644
index 0000000000..49b07efff9
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/qevdevkeyboard_defaultmap.h
@@ -0,0 +1,787 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEVDEVKEYBOARDHANDLER_DEFAULTMAP_H
+#define QEVDEVKEYBOARDHANDLER_DEFAULTMAP_H
+
+// no QT_BEGIN_NAMESPACE, since we include it internally...
+
+const QEvdevKeyboardMap::Mapping QEvdevKeyboardHandler::s_keymap_default[] = {
+ { 1, 0xffff, 0x01000000, 0x00, 0x00, 0x0000 },
+ { 2, 0x0031, 0x00000031, 0x00, 0x00, 0x0000 },
+ { 2, 0x0021, 0x00000021, 0x01, 0x00, 0x0000 },
+ { 3, 0x0032, 0x00000032, 0x00, 0x00, 0x0000 },
+ { 3, 0x0040, 0x00000040, 0x01, 0x00, 0x0000 },
+ { 3, 0x0040, 0x00000040, 0x02, 0x00, 0x0000 },
+ { 4, 0x0033, 0x00000033, 0x00, 0x00, 0x0000 },
+ { 4, 0x0023, 0x00000023, 0x01, 0x00, 0x0000 },
+ { 4, 0xffff, 0x01000000, 0x04, 0x00, 0x0000 },
+ { 5, 0x0034, 0x00000034, 0x00, 0x00, 0x0000 },
+ { 5, 0x0024, 0x00000024, 0x01, 0x00, 0x0000 },
+ { 5, 0x0024, 0x00000024, 0x02, 0x00, 0x0000 },
+ { 5, 0x005c, 0x0400005c, 0x04, 0x00, 0x0000 },
+ { 6, 0x0035, 0x00000035, 0x00, 0x00, 0x0000 },
+ { 6, 0x0025, 0x00000025, 0x01, 0x00, 0x0000 },
+ { 6, 0x005d, 0x0400005d, 0x04, 0x00, 0x0000 },
+ { 7, 0x0036, 0x00000036, 0x00, 0x00, 0x0000 },
+ { 7, 0x005e, 0x0000005e, 0x01, 0x00, 0x0000 },
+ { 7, 0x005e, 0x01001252, 0x02, 0x01, 0x0000 },
+ { 7, 0x005e, 0x0400005e, 0x04, 0x00, 0x0000 },
+ { 8, 0x0037, 0x00000037, 0x00, 0x00, 0x0000 },
+ { 8, 0x0026, 0x00000026, 0x01, 0x00, 0x0000 },
+ { 8, 0x007b, 0x0000007b, 0x02, 0x00, 0x0000 },
+ { 8, 0x005f, 0x0400005f, 0x04, 0x00, 0x0000 },
+ { 9, 0x0038, 0x00000038, 0x00, 0x00, 0x0000 },
+ { 9, 0x002a, 0x0000002a, 0x01, 0x00, 0x0000 },
+ { 9, 0x005b, 0x0000005b, 0x02, 0x00, 0x0000 },
+ { 9, 0xffff, 0x01000003, 0x04, 0x00, 0x0000 },
+ { 10, 0x0039, 0x00000039, 0x00, 0x00, 0x0000 },
+ { 10, 0x0028, 0x00000028, 0x01, 0x00, 0x0000 },
+ { 10, 0x005d, 0x0000005d, 0x02, 0x00, 0x0000 },
+ { 11, 0x0030, 0x00000030, 0x00, 0x00, 0x0000 },
+ { 11, 0x0029, 0x00000029, 0x01, 0x00, 0x0000 },
+ { 11, 0x007d, 0x0000007d, 0x02, 0x00, 0x0000 },
+ { 12, 0x002d, 0x0000002d, 0x00, 0x00, 0x0000 },
+ { 12, 0x005f, 0x0000005f, 0x01, 0x00, 0x0000 },
+ { 12, 0x005c, 0x0000005c, 0x02, 0x00, 0x0000 },
+ { 12, 0x005f, 0x0400005f, 0x04, 0x00, 0x0000 },
+ { 12, 0x005f, 0x0400005f, 0x05, 0x00, 0x0000 },
+ { 13, 0x003d, 0x0000003d, 0x00, 0x00, 0x0000 },
+ { 13, 0x002b, 0x0000002b, 0x01, 0x00, 0x0000 },
+ { 14, 0xffff, 0x01000003, 0x00, 0x00, 0x0000 },
+ { 14, 0xffff, 0x01000000, 0x0c, 0x08, 0x0300 },
+ { 15, 0xffff, 0x01000001, 0x00, 0x00, 0x0000 },
+ { 16, 0x0071, 0x00000051, 0x00, 0x00, 0x0000 },
+ { 16, 0x0051, 0x00000051, 0x01, 0x00, 0x0000 },
+ { 16, 0x0071, 0x00000051, 0x02, 0x00, 0x0000 },
+ { 16, 0x0051, 0x00000051, 0x03, 0x00, 0x0000 },
+ { 16, 0x0071, 0x04000051, 0x04, 0x00, 0x0000 },
+ { 16, 0x0071, 0x04000051, 0x05, 0x00, 0x0000 },
+ { 16, 0x0071, 0x04000051, 0x06, 0x00, 0x0000 },
+ { 16, 0x0071, 0x04000051, 0x07, 0x00, 0x0000 },
+ { 16, 0x0071, 0x08000051, 0x08, 0x00, 0x0000 },
+ { 16, 0x0071, 0x08000051, 0x09, 0x00, 0x0000 },
+ { 16, 0x0071, 0x08000051, 0x0a, 0x00, 0x0000 },
+ { 16, 0x0071, 0x08000051, 0x0b, 0x00, 0x0000 },
+ { 16, 0x0071, 0x0c000051, 0x0c, 0x00, 0x0000 },
+ { 16, 0x0071, 0x0c000051, 0x0d, 0x00, 0x0000 },
+ { 16, 0x0071, 0x0c000051, 0x0e, 0x00, 0x0000 },
+ { 16, 0x0071, 0x0c000051, 0x0f, 0x00, 0x0000 },
+ { 17, 0x0077, 0x00000057, 0x00, 0x00, 0x0000 },
+ { 17, 0x0057, 0x00000057, 0x01, 0x00, 0x0000 },
+ { 17, 0x0077, 0x00000057, 0x02, 0x00, 0x0000 },
+ { 17, 0x0057, 0x00000057, 0x03, 0x00, 0x0000 },
+ { 17, 0x0077, 0x04000057, 0x04, 0x00, 0x0000 },
+ { 17, 0x0077, 0x04000057, 0x05, 0x00, 0x0000 },
+ { 17, 0x0077, 0x04000057, 0x06, 0x00, 0x0000 },
+ { 17, 0x0077, 0x04000057, 0x07, 0x00, 0x0000 },
+ { 17, 0x0077, 0x08000057, 0x08, 0x00, 0x0000 },
+ { 17, 0x0077, 0x08000057, 0x09, 0x00, 0x0000 },
+ { 17, 0x0077, 0x08000057, 0x0a, 0x00, 0x0000 },
+ { 17, 0x0077, 0x08000057, 0x0b, 0x00, 0x0000 },
+ { 17, 0x0077, 0x0c000057, 0x0c, 0x00, 0x0000 },
+ { 17, 0x0077, 0x0c000057, 0x0d, 0x00, 0x0000 },
+ { 17, 0x0077, 0x0c000057, 0x0e, 0x00, 0x0000 },
+ { 17, 0x0077, 0x0c000057, 0x0f, 0x00, 0x0000 },
+ { 18, 0x0065, 0x00000045, 0x00, 0x00, 0x0000 },
+ { 18, 0x0045, 0x00000045, 0x01, 0x00, 0x0000 },
+ { 18, 0x0065, 0x00000045, 0x02, 0x00, 0x0000 },
+ { 18, 0x0045, 0x00000045, 0x03, 0x00, 0x0000 },
+ { 18, 0x0065, 0x04000045, 0x04, 0x00, 0x0000 },
+ { 18, 0x0065, 0x04000045, 0x05, 0x00, 0x0000 },
+ { 18, 0x0065, 0x04000045, 0x06, 0x00, 0x0000 },
+ { 18, 0x0065, 0x04000045, 0x07, 0x00, 0x0000 },
+ { 18, 0x0065, 0x08000045, 0x08, 0x00, 0x0000 },
+ { 18, 0x0065, 0x08000045, 0x09, 0x00, 0x0000 },
+ { 18, 0x0065, 0x08000045, 0x0a, 0x00, 0x0000 },
+ { 18, 0x0065, 0x08000045, 0x0b, 0x00, 0x0000 },
+ { 18, 0x0065, 0x0c000045, 0x0c, 0x00, 0x0000 },
+ { 18, 0x0065, 0x0c000045, 0x0d, 0x00, 0x0000 },
+ { 18, 0x0065, 0x0c000045, 0x0e, 0x00, 0x0000 },
+ { 18, 0x0065, 0x0c000045, 0x0f, 0x00, 0x0000 },
+ { 19, 0x0072, 0x00000052, 0x00, 0x00, 0x0000 },
+ { 19, 0x0052, 0x00000052, 0x01, 0x00, 0x0000 },
+ { 19, 0x0072, 0x00000052, 0x02, 0x00, 0x0000 },
+ { 19, 0x0052, 0x00000052, 0x03, 0x00, 0x0000 },
+ { 19, 0x0072, 0x04000052, 0x04, 0x00, 0x0000 },
+ { 19, 0x0072, 0x04000052, 0x05, 0x00, 0x0000 },
+ { 19, 0x0072, 0x04000052, 0x06, 0x00, 0x0000 },
+ { 19, 0x0072, 0x04000052, 0x07, 0x00, 0x0000 },
+ { 19, 0x0072, 0x08000052, 0x08, 0x00, 0x0000 },
+ { 19, 0x0072, 0x08000052, 0x09, 0x00, 0x0000 },
+ { 19, 0x0072, 0x08000052, 0x0a, 0x00, 0x0000 },
+ { 19, 0x0072, 0x08000052, 0x0b, 0x00, 0x0000 },
+ { 19, 0x0072, 0x0c000052, 0x0c, 0x00, 0x0000 },
+ { 19, 0x0072, 0x0c000052, 0x0d, 0x00, 0x0000 },
+ { 19, 0x0072, 0x0c000052, 0x0e, 0x00, 0x0000 },
+ { 19, 0x0072, 0x0c000052, 0x0f, 0x00, 0x0000 },
+ { 20, 0x0074, 0x00000054, 0x00, 0x00, 0x0000 },
+ { 20, 0x0054, 0x00000054, 0x01, 0x00, 0x0000 },
+ { 20, 0x0074, 0x00000054, 0x02, 0x00, 0x0000 },
+ { 20, 0x0054, 0x00000054, 0x03, 0x00, 0x0000 },
+ { 20, 0x0074, 0x04000054, 0x04, 0x00, 0x0000 },
+ { 20, 0x0074, 0x04000054, 0x05, 0x00, 0x0000 },
+ { 20, 0x0074, 0x04000054, 0x06, 0x00, 0x0000 },
+ { 20, 0x0074, 0x04000054, 0x07, 0x00, 0x0000 },
+ { 20, 0x0074, 0x08000054, 0x08, 0x00, 0x0000 },
+ { 20, 0x0074, 0x08000054, 0x09, 0x00, 0x0000 },
+ { 20, 0x0074, 0x08000054, 0x0a, 0x00, 0x0000 },
+ { 20, 0x0074, 0x08000054, 0x0b, 0x00, 0x0000 },
+ { 20, 0x0074, 0x0c000054, 0x0c, 0x00, 0x0000 },
+ { 20, 0x0074, 0x0c000054, 0x0d, 0x00, 0x0000 },
+ { 20, 0x0074, 0x0c000054, 0x0e, 0x00, 0x0000 },
+ { 20, 0x0074, 0x0c000054, 0x0f, 0x00, 0x0000 },
+ { 21, 0x0079, 0x00000059, 0x00, 0x00, 0x0000 },
+ { 21, 0x0059, 0x00000059, 0x01, 0x00, 0x0000 },
+ { 21, 0x0079, 0x00000059, 0x02, 0x00, 0x0000 },
+ { 21, 0x0059, 0x00000059, 0x03, 0x00, 0x0000 },
+ { 21, 0x0079, 0x04000059, 0x04, 0x00, 0x0000 },
+ { 21, 0x0079, 0x04000059, 0x05, 0x00, 0x0000 },
+ { 21, 0x0079, 0x04000059, 0x06, 0x00, 0x0000 },
+ { 21, 0x0079, 0x04000059, 0x07, 0x00, 0x0000 },
+ { 21, 0x0079, 0x08000059, 0x08, 0x00, 0x0000 },
+ { 21, 0x0079, 0x08000059, 0x09, 0x00, 0x0000 },
+ { 21, 0x0079, 0x08000059, 0x0a, 0x00, 0x0000 },
+ { 21, 0x0079, 0x08000059, 0x0b, 0x00, 0x0000 },
+ { 21, 0x0079, 0x0c000059, 0x0c, 0x00, 0x0000 },
+ { 21, 0x0079, 0x0c000059, 0x0d, 0x00, 0x0000 },
+ { 21, 0x0079, 0x0c000059, 0x0e, 0x00, 0x0000 },
+ { 21, 0x0079, 0x0c000059, 0x0f, 0x00, 0x0000 },
+ { 22, 0x0075, 0x00000055, 0x00, 0x00, 0x0000 },
+ { 22, 0x0055, 0x00000055, 0x01, 0x00, 0x0000 },
+ { 22, 0x0075, 0x00000055, 0x02, 0x00, 0x0000 },
+ { 22, 0x0055, 0x00000055, 0x03, 0x00, 0x0000 },
+ { 22, 0x0075, 0x04000055, 0x04, 0x00, 0x0000 },
+ { 22, 0x0075, 0x04000055, 0x05, 0x00, 0x0000 },
+ { 22, 0x0075, 0x04000055, 0x06, 0x00, 0x0000 },
+ { 22, 0x0075, 0x04000055, 0x07, 0x00, 0x0000 },
+ { 22, 0x0075, 0x08000055, 0x08, 0x00, 0x0000 },
+ { 22, 0x0075, 0x08000055, 0x09, 0x00, 0x0000 },
+ { 22, 0x0075, 0x08000055, 0x0a, 0x00, 0x0000 },
+ { 22, 0x0075, 0x08000055, 0x0b, 0x00, 0x0000 },
+ { 22, 0x0075, 0x0c000055, 0x0c, 0x00, 0x0000 },
+ { 22, 0x0075, 0x0c000055, 0x0d, 0x00, 0x0000 },
+ { 22, 0x0075, 0x0c000055, 0x0e, 0x00, 0x0000 },
+ { 22, 0x0075, 0x0c000055, 0x0f, 0x00, 0x0000 },
+ { 23, 0x0069, 0x00000049, 0x00, 0x00, 0x0000 },
+ { 23, 0x0049, 0x00000049, 0x01, 0x00, 0x0000 },
+ { 23, 0x0069, 0x00000049, 0x02, 0x00, 0x0000 },
+ { 23, 0x0049, 0x00000049, 0x03, 0x00, 0x0000 },
+ { 23, 0x0069, 0x04000049, 0x04, 0x00, 0x0000 },
+ { 23, 0x0069, 0x04000049, 0x05, 0x00, 0x0000 },
+ { 23, 0x0069, 0x04000049, 0x06, 0x00, 0x0000 },
+ { 23, 0x0069, 0x04000049, 0x07, 0x00, 0x0000 },
+ { 23, 0x0069, 0x08000049, 0x08, 0x00, 0x0000 },
+ { 23, 0x0069, 0x08000049, 0x09, 0x00, 0x0000 },
+ { 23, 0x0069, 0x08000049, 0x0a, 0x00, 0x0000 },
+ { 23, 0x0069, 0x08000049, 0x0b, 0x00, 0x0000 },
+ { 23, 0x0069, 0x0c000049, 0x0c, 0x00, 0x0000 },
+ { 23, 0x0069, 0x0c000049, 0x0d, 0x00, 0x0000 },
+ { 23, 0x0069, 0x0c000049, 0x0e, 0x00, 0x0000 },
+ { 23, 0x0069, 0x0c000049, 0x0f, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0000004f, 0x00, 0x00, 0x0000 },
+ { 24, 0x004f, 0x0000004f, 0x01, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0000004f, 0x02, 0x00, 0x0000 },
+ { 24, 0x004f, 0x0000004f, 0x03, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0400004f, 0x04, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0400004f, 0x05, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0400004f, 0x06, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0400004f, 0x07, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0800004f, 0x08, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0800004f, 0x09, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0800004f, 0x0a, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0800004f, 0x0b, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0c00004f, 0x0c, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0c00004f, 0x0d, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0c00004f, 0x0e, 0x00, 0x0000 },
+ { 24, 0x006f, 0x0c00004f, 0x0f, 0x00, 0x0000 },
+ { 25, 0x0070, 0x00000050, 0x00, 0x00, 0x0000 },
+ { 25, 0x0050, 0x00000050, 0x01, 0x00, 0x0000 },
+ { 25, 0x0070, 0x00000050, 0x02, 0x00, 0x0000 },
+ { 25, 0x0050, 0x00000050, 0x03, 0x00, 0x0000 },
+ { 25, 0x0070, 0x04000050, 0x04, 0x00, 0x0000 },
+ { 25, 0x0070, 0x04000050, 0x05, 0x00, 0x0000 },
+ { 25, 0x0070, 0x04000050, 0x06, 0x00, 0x0000 },
+ { 25, 0x0070, 0x04000050, 0x07, 0x00, 0x0000 },
+ { 25, 0x0070, 0x08000050, 0x08, 0x00, 0x0000 },
+ { 25, 0x0070, 0x08000050, 0x09, 0x00, 0x0000 },
+ { 25, 0x0070, 0x08000050, 0x0a, 0x00, 0x0000 },
+ { 25, 0x0070, 0x08000050, 0x0b, 0x00, 0x0000 },
+ { 25, 0x0070, 0x0c000050, 0x0c, 0x00, 0x0000 },
+ { 25, 0x0070, 0x0c000050, 0x0d, 0x00, 0x0000 },
+ { 25, 0x0070, 0x0c000050, 0x0e, 0x00, 0x0000 },
+ { 25, 0x0070, 0x0c000050, 0x0f, 0x00, 0x0000 },
+ { 26, 0x005b, 0x0000005b, 0x00, 0x00, 0x0000 },
+ { 26, 0x007b, 0x0000007b, 0x01, 0x00, 0x0000 },
+ { 26, 0xffff, 0x01000000, 0x04, 0x00, 0x0000 },
+ { 27, 0x005d, 0x0000005d, 0x00, 0x00, 0x0000 },
+ { 27, 0x007d, 0x0000007d, 0x01, 0x00, 0x0000 },
+ { 27, 0x007e, 0x0000007e, 0x02, 0x00, 0x0000 },
+ { 27, 0x005d, 0x0400005d, 0x04, 0x00, 0x0000 },
+ { 28, 0xffff, 0x01000004, 0x00, 0x00, 0x0000 },
+ { 28, 0x006d, 0x0c00004d, 0x08, 0x00, 0x0000 },
+ { 29, 0xffff, 0x01000021, 0x00, 0x04, 0x0004 },
+ { 30, 0x0061, 0x00000041, 0x00, 0x00, 0x0000 },
+ { 30, 0x0041, 0x00000041, 0x01, 0x00, 0x0000 },
+ { 30, 0x0061, 0x00000041, 0x02, 0x00, 0x0000 },
+ { 30, 0x0041, 0x00000041, 0x03, 0x00, 0x0000 },
+ { 30, 0x0061, 0x04000041, 0x04, 0x00, 0x0000 },
+ { 30, 0x0061, 0x04000041, 0x05, 0x00, 0x0000 },
+ { 30, 0x0061, 0x04000041, 0x06, 0x00, 0x0000 },
+ { 30, 0x0061, 0x04000041, 0x07, 0x00, 0x0000 },
+ { 30, 0x0061, 0x08000041, 0x08, 0x00, 0x0000 },
+ { 30, 0x0061, 0x08000041, 0x09, 0x00, 0x0000 },
+ { 30, 0x0061, 0x08000041, 0x0a, 0x00, 0x0000 },
+ { 30, 0x0061, 0x08000041, 0x0b, 0x00, 0x0000 },
+ { 30, 0x0061, 0x0c000041, 0x0c, 0x00, 0x0000 },
+ { 30, 0x0061, 0x0c000041, 0x0d, 0x00, 0x0000 },
+ { 30, 0x0061, 0x0c000041, 0x0e, 0x00, 0x0000 },
+ { 30, 0x0061, 0x0c000041, 0x0f, 0x00, 0x0000 },
+ { 31, 0x0073, 0x00000053, 0x00, 0x00, 0x0000 },
+ { 31, 0x0053, 0x00000053, 0x01, 0x00, 0x0000 },
+ { 31, 0x0073, 0x00000053, 0x02, 0x00, 0x0000 },
+ { 31, 0x0053, 0x00000053, 0x03, 0x00, 0x0000 },
+ { 31, 0x0073, 0x04000053, 0x04, 0x00, 0x0000 },
+ { 31, 0x0073, 0x04000053, 0x05, 0x00, 0x0000 },
+ { 31, 0x0073, 0x04000053, 0x06, 0x00, 0x0000 },
+ { 31, 0x0073, 0x04000053, 0x07, 0x00, 0x0000 },
+ { 31, 0x0073, 0x08000053, 0x08, 0x00, 0x0000 },
+ { 31, 0x0073, 0x08000053, 0x09, 0x00, 0x0000 },
+ { 31, 0x0073, 0x08000053, 0x0a, 0x00, 0x0000 },
+ { 31, 0x0073, 0x08000053, 0x0b, 0x00, 0x0000 },
+ { 31, 0x0073, 0x0c000053, 0x0c, 0x00, 0x0000 },
+ { 31, 0x0073, 0x0c000053, 0x0d, 0x00, 0x0000 },
+ { 31, 0x0073, 0x0c000053, 0x0e, 0x00, 0x0000 },
+ { 31, 0x0073, 0x0c000053, 0x0f, 0x00, 0x0000 },
+ { 32, 0x0064, 0x00000044, 0x00, 0x00, 0x0000 },
+ { 32, 0x0044, 0x00000044, 0x01, 0x00, 0x0000 },
+ { 32, 0x0064, 0x00000044, 0x02, 0x00, 0x0000 },
+ { 32, 0x0044, 0x00000044, 0x03, 0x00, 0x0000 },
+ { 32, 0x0064, 0x04000044, 0x04, 0x00, 0x0000 },
+ { 32, 0x0064, 0x04000044, 0x05, 0x00, 0x0000 },
+ { 32, 0x0064, 0x04000044, 0x06, 0x00, 0x0000 },
+ { 32, 0x0064, 0x04000044, 0x07, 0x00, 0x0000 },
+ { 32, 0x0064, 0x08000044, 0x08, 0x00, 0x0000 },
+ { 32, 0x0064, 0x08000044, 0x09, 0x00, 0x0000 },
+ { 32, 0x0064, 0x08000044, 0x0a, 0x00, 0x0000 },
+ { 32, 0x0064, 0x08000044, 0x0b, 0x00, 0x0000 },
+ { 32, 0x0064, 0x0c000044, 0x0c, 0x00, 0x0000 },
+ { 32, 0x0064, 0x0c000044, 0x0d, 0x00, 0x0000 },
+ { 32, 0x0064, 0x0c000044, 0x0e, 0x00, 0x0000 },
+ { 32, 0x0064, 0x0c000044, 0x0f, 0x00, 0x0000 },
+ { 33, 0x0066, 0x00000046, 0x00, 0x00, 0x0000 },
+ { 33, 0x0046, 0x00000046, 0x01, 0x00, 0x0000 },
+ { 33, 0x0066, 0x00000046, 0x02, 0x00, 0x0000 },
+ { 33, 0x0046, 0x00000046, 0x03, 0x00, 0x0000 },
+ { 33, 0x0066, 0x04000046, 0x04, 0x00, 0x0000 },
+ { 33, 0x0066, 0x04000046, 0x05, 0x00, 0x0000 },
+ { 33, 0x0066, 0x04000046, 0x06, 0x00, 0x0000 },
+ { 33, 0x0066, 0x04000046, 0x07, 0x00, 0x0000 },
+ { 33, 0x0066, 0x08000046, 0x08, 0x00, 0x0000 },
+ { 33, 0x0066, 0x08000046, 0x09, 0x00, 0x0000 },
+ { 33, 0x0066, 0x08000046, 0x0a, 0x00, 0x0000 },
+ { 33, 0x0066, 0x08000046, 0x0b, 0x00, 0x0000 },
+ { 33, 0x0066, 0x0c000046, 0x0c, 0x00, 0x0000 },
+ { 33, 0x0066, 0x0c000046, 0x0d, 0x00, 0x0000 },
+ { 33, 0x0066, 0x0c000046, 0x0e, 0x00, 0x0000 },
+ { 33, 0x0066, 0x0c000046, 0x0f, 0x00, 0x0000 },
+ { 34, 0x0067, 0x00000047, 0x00, 0x00, 0x0000 },
+ { 34, 0x0047, 0x00000047, 0x01, 0x00, 0x0000 },
+ { 34, 0x0067, 0x00000047, 0x02, 0x00, 0x0000 },
+ { 34, 0x0047, 0x00000047, 0x03, 0x00, 0x0000 },
+ { 34, 0x0067, 0x04000047, 0x04, 0x00, 0x0000 },
+ { 34, 0x0067, 0x04000047, 0x05, 0x00, 0x0000 },
+ { 34, 0x0067, 0x04000047, 0x06, 0x00, 0x0000 },
+ { 34, 0x0067, 0x04000047, 0x07, 0x00, 0x0000 },
+ { 34, 0x0067, 0x08000047, 0x08, 0x00, 0x0000 },
+ { 34, 0x0067, 0x08000047, 0x09, 0x00, 0x0000 },
+ { 34, 0x0067, 0x08000047, 0x0a, 0x00, 0x0000 },
+ { 34, 0x0067, 0x08000047, 0x0b, 0x00, 0x0000 },
+ { 34, 0x0067, 0x0c000047, 0x0c, 0x00, 0x0000 },
+ { 34, 0x0067, 0x0c000047, 0x0d, 0x00, 0x0000 },
+ { 34, 0x0067, 0x0c000047, 0x0e, 0x00, 0x0000 },
+ { 34, 0x0067, 0x0c000047, 0x0f, 0x00, 0x0000 },
+ { 35, 0x0068, 0x00000048, 0x00, 0x00, 0x0000 },
+ { 35, 0x0048, 0x00000048, 0x01, 0x00, 0x0000 },
+ { 35, 0x0068, 0x00000048, 0x02, 0x00, 0x0000 },
+ { 35, 0x0048, 0x00000048, 0x03, 0x00, 0x0000 },
+ { 35, 0x0068, 0x04000048, 0x04, 0x00, 0x0000 },
+ { 35, 0x0068, 0x04000048, 0x05, 0x00, 0x0000 },
+ { 35, 0x0068, 0x04000048, 0x06, 0x00, 0x0000 },
+ { 35, 0x0068, 0x04000048, 0x07, 0x00, 0x0000 },
+ { 35, 0x0068, 0x08000048, 0x08, 0x00, 0x0000 },
+ { 35, 0x0068, 0x08000048, 0x09, 0x00, 0x0000 },
+ { 35, 0x0068, 0x08000048, 0x0a, 0x00, 0x0000 },
+ { 35, 0x0068, 0x08000048, 0x0b, 0x00, 0x0000 },
+ { 35, 0x0068, 0x0c000048, 0x0c, 0x00, 0x0000 },
+ { 35, 0x0068, 0x0c000048, 0x0d, 0x00, 0x0000 },
+ { 35, 0x0068, 0x0c000048, 0x0e, 0x00, 0x0000 },
+ { 35, 0x0068, 0x0c000048, 0x0f, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0000004a, 0x00, 0x00, 0x0000 },
+ { 36, 0x004a, 0x0000004a, 0x01, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0000004a, 0x02, 0x00, 0x0000 },
+ { 36, 0x004a, 0x0000004a, 0x03, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0400004a, 0x04, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0400004a, 0x05, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0400004a, 0x06, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0400004a, 0x07, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0800004a, 0x08, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0800004a, 0x09, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0800004a, 0x0a, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0800004a, 0x0b, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0c00004a, 0x0c, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0c00004a, 0x0d, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0c00004a, 0x0e, 0x00, 0x0000 },
+ { 36, 0x006a, 0x0c00004a, 0x0f, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0000004b, 0x00, 0x00, 0x0000 },
+ { 37, 0x004b, 0x0000004b, 0x01, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0000004b, 0x02, 0x00, 0x0000 },
+ { 37, 0x004b, 0x0000004b, 0x03, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0400004b, 0x04, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0400004b, 0x05, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0400004b, 0x06, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0400004b, 0x07, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0800004b, 0x08, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0800004b, 0x09, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0800004b, 0x0a, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0800004b, 0x0b, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0c00004b, 0x0c, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0c00004b, 0x0d, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0c00004b, 0x0e, 0x00, 0x0000 },
+ { 37, 0x006b, 0x0c00004b, 0x0f, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0000004c, 0x00, 0x00, 0x0000 },
+ { 38, 0x004c, 0x0000004c, 0x01, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0000004c, 0x02, 0x00, 0x0000 },
+ { 38, 0x004c, 0x0000004c, 0x03, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0400004c, 0x04, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0400004c, 0x05, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0400004c, 0x06, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0400004c, 0x07, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0800004c, 0x08, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0800004c, 0x09, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0800004c, 0x0a, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0800004c, 0x0b, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0c00004c, 0x0c, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0c00004c, 0x0d, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0c00004c, 0x0e, 0x00, 0x0000 },
+ { 38, 0x006c, 0x0c00004c, 0x0f, 0x00, 0x0000 },
+ { 39, 0x003b, 0x0000003b, 0x00, 0x00, 0x0000 },
+ { 39, 0x003a, 0x0000003a, 0x01, 0x00, 0x0000 },
+ { 40, 0x0027, 0x00000027, 0x00, 0x00, 0x0000 },
+ { 40, 0x0022, 0x00000022, 0x01, 0x00, 0x0000 },
+ { 40, 0x0027, 0x01001251, 0x02, 0x01, 0x0000 },
+ { 40, 0x0022, 0x01001257, 0x03, 0x01, 0x0000 },
+ { 40, 0x0067, 0x04000047, 0x04, 0x00, 0x0000 },
+ { 41, 0x0060, 0x00000060, 0x00, 0x00, 0x0000 },
+ { 41, 0x007e, 0x0000007e, 0x01, 0x00, 0x0000 },
+ { 41, 0x0060, 0x01001250, 0x02, 0x01, 0x0000 },
+ { 41, 0x007e, 0x01001253, 0x03, 0x01, 0x0000 },
+ { 42, 0xffff, 0x01000020, 0x00, 0x04, 0x0001 },
+ { 43, 0x005c, 0x0000005c, 0x00, 0x00, 0x0000 },
+ { 43, 0x007c, 0x0000007c, 0x01, 0x00, 0x0000 },
+ { 43, 0x005c, 0x0400005c, 0x04, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0000005a, 0x00, 0x00, 0x0000 },
+ { 44, 0x005a, 0x0000005a, 0x01, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0000005a, 0x02, 0x00, 0x0000 },
+ { 44, 0x005a, 0x0000005a, 0x03, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0400005a, 0x04, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0400005a, 0x05, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0400005a, 0x06, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0400005a, 0x07, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0800005a, 0x08, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0800005a, 0x09, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0800005a, 0x0a, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0800005a, 0x0b, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0c00005a, 0x0c, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0c00005a, 0x0d, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0c00005a, 0x0e, 0x00, 0x0000 },
+ { 44, 0x007a, 0x0c00005a, 0x0f, 0x00, 0x0000 },
+ { 45, 0x0078, 0x00000058, 0x00, 0x00, 0x0000 },
+ { 45, 0x0058, 0x00000058, 0x01, 0x00, 0x0000 },
+ { 45, 0x0078, 0x00000058, 0x02, 0x00, 0x0000 },
+ { 45, 0x0058, 0x00000058, 0x03, 0x00, 0x0000 },
+ { 45, 0x0078, 0x04000058, 0x04, 0x00, 0x0000 },
+ { 45, 0x0078, 0x04000058, 0x05, 0x00, 0x0000 },
+ { 45, 0x0078, 0x04000058, 0x06, 0x00, 0x0000 },
+ { 45, 0x0078, 0x04000058, 0x07, 0x00, 0x0000 },
+ { 45, 0x0078, 0x08000058, 0x08, 0x00, 0x0000 },
+ { 45, 0x0078, 0x08000058, 0x09, 0x00, 0x0000 },
+ { 45, 0x0078, 0x08000058, 0x0a, 0x00, 0x0000 },
+ { 45, 0x0078, 0x08000058, 0x0b, 0x00, 0x0000 },
+ { 45, 0x0078, 0x0c000058, 0x0c, 0x00, 0x0000 },
+ { 45, 0x0078, 0x0c000058, 0x0d, 0x00, 0x0000 },
+ { 45, 0x0078, 0x0c000058, 0x0e, 0x00, 0x0000 },
+ { 45, 0x0078, 0x0c000058, 0x0f, 0x00, 0x0000 },
+ { 46, 0x0063, 0x00000043, 0x00, 0x00, 0x0000 },
+ { 46, 0x0043, 0x00000043, 0x01, 0x00, 0x0000 },
+ { 46, 0x0063, 0x00000043, 0x02, 0x00, 0x0000 },
+ { 46, 0x0043, 0x00000043, 0x03, 0x00, 0x0000 },
+ { 46, 0x0063, 0x04000043, 0x04, 0x00, 0x0000 },
+ { 46, 0x0063, 0x04000043, 0x05, 0x00, 0x0000 },
+ { 46, 0x0063, 0x04000043, 0x06, 0x00, 0x0000 },
+ { 46, 0x0063, 0x04000043, 0x07, 0x00, 0x0000 },
+ { 46, 0x0063, 0x08000043, 0x08, 0x00, 0x0000 },
+ { 46, 0x0063, 0x08000043, 0x09, 0x00, 0x0000 },
+ { 46, 0x0063, 0x08000043, 0x0a, 0x00, 0x0000 },
+ { 46, 0x0063, 0x08000043, 0x0b, 0x00, 0x0000 },
+ { 46, 0x0063, 0x0c000043, 0x0c, 0x00, 0x0000 },
+ { 46, 0x0063, 0x0c000043, 0x0d, 0x00, 0x0000 },
+ { 46, 0x0063, 0x0c000043, 0x0e, 0x00, 0x0000 },
+ { 46, 0x0063, 0x0c000043, 0x0f, 0x00, 0x0000 },
+ { 47, 0x0076, 0x00000056, 0x00, 0x00, 0x0000 },
+ { 47, 0x0056, 0x00000056, 0x01, 0x00, 0x0000 },
+ { 47, 0x0076, 0x00000056, 0x02, 0x00, 0x0000 },
+ { 47, 0x0056, 0x00000056, 0x03, 0x00, 0x0000 },
+ { 47, 0x0076, 0x04000056, 0x04, 0x00, 0x0000 },
+ { 47, 0x0076, 0x04000056, 0x05, 0x00, 0x0000 },
+ { 47, 0x0076, 0x04000056, 0x06, 0x00, 0x0000 },
+ { 47, 0x0076, 0x04000056, 0x07, 0x00, 0x0000 },
+ { 47, 0x0076, 0x08000056, 0x08, 0x00, 0x0000 },
+ { 47, 0x0076, 0x08000056, 0x09, 0x00, 0x0000 },
+ { 47, 0x0076, 0x08000056, 0x0a, 0x00, 0x0000 },
+ { 47, 0x0076, 0x08000056, 0x0b, 0x00, 0x0000 },
+ { 47, 0x0076, 0x0c000056, 0x0c, 0x00, 0x0000 },
+ { 47, 0x0076, 0x0c000056, 0x0d, 0x00, 0x0000 },
+ { 47, 0x0076, 0x0c000056, 0x0e, 0x00, 0x0000 },
+ { 47, 0x0076, 0x0c000056, 0x0f, 0x00, 0x0000 },
+ { 48, 0x0062, 0x00000042, 0x00, 0x00, 0x0000 },
+ { 48, 0x0042, 0x00000042, 0x01, 0x00, 0x0000 },
+ { 48, 0x0062, 0x00000042, 0x02, 0x00, 0x0000 },
+ { 48, 0x0042, 0x00000042, 0x03, 0x00, 0x0000 },
+ { 48, 0x0062, 0x04000042, 0x04, 0x00, 0x0000 },
+ { 48, 0x0062, 0x04000042, 0x05, 0x00, 0x0000 },
+ { 48, 0x0062, 0x04000042, 0x06, 0x00, 0x0000 },
+ { 48, 0x0062, 0x04000042, 0x07, 0x00, 0x0000 },
+ { 48, 0x0062, 0x08000042, 0x08, 0x00, 0x0000 },
+ { 48, 0x0062, 0x08000042, 0x09, 0x00, 0x0000 },
+ { 48, 0x0062, 0x08000042, 0x0a, 0x00, 0x0000 },
+ { 48, 0x0062, 0x08000042, 0x0b, 0x00, 0x0000 },
+ { 48, 0x0062, 0x0c000042, 0x0c, 0x00, 0x0000 },
+ { 48, 0x0062, 0x0c000042, 0x0d, 0x00, 0x0000 },
+ { 48, 0x0062, 0x0c000042, 0x0e, 0x00, 0x0000 },
+ { 48, 0x0062, 0x0c000042, 0x0f, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0000004e, 0x00, 0x00, 0x0000 },
+ { 49, 0x004e, 0x0000004e, 0x01, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0000004e, 0x02, 0x00, 0x0000 },
+ { 49, 0x004e, 0x0000004e, 0x03, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0400004e, 0x04, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0400004e, 0x05, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0400004e, 0x06, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0400004e, 0x07, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0800004e, 0x08, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0800004e, 0x09, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0800004e, 0x0a, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0800004e, 0x0b, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0c00004e, 0x0c, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0c00004e, 0x0d, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0c00004e, 0x0e, 0x00, 0x0000 },
+ { 49, 0x006e, 0x0c00004e, 0x0f, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0000004d, 0x00, 0x00, 0x0000 },
+ { 50, 0x004d, 0x0000004d, 0x01, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0000004d, 0x02, 0x00, 0x0000 },
+ { 50, 0x004d, 0x0000004d, 0x03, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0400004d, 0x04, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0400004d, 0x05, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0400004d, 0x06, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0400004d, 0x07, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0800004d, 0x08, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0800004d, 0x09, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0800004d, 0x0a, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0800004d, 0x0b, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0c00004d, 0x0c, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0c00004d, 0x0d, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0c00004d, 0x0e, 0x00, 0x0000 },
+ { 50, 0x006d, 0x0c00004d, 0x0f, 0x00, 0x0000 },
+ { 51, 0x002c, 0x0000002c, 0x00, 0x00, 0x0000 },
+ { 51, 0x003c, 0x0000003c, 0x01, 0x00, 0x0000 },
+ { 51, 0x002c, 0x0100125b, 0x02, 0x01, 0x0000 },
+ { 52, 0x002e, 0x0000002e, 0x00, 0x00, 0x0000 },
+ { 52, 0x003e, 0x0000003e, 0x01, 0x00, 0x0000 },
+ { 52, 0xffff, 0x01001120, 0x02, 0x00, 0x0000 },
+ { 53, 0x002f, 0x0000002f, 0x00, 0x00, 0x0000 },
+ { 53, 0x003f, 0x0000003f, 0x01, 0x00, 0x0000 },
+ { 53, 0xffff, 0x01000003, 0x04, 0x00, 0x0000 },
+ { 54, 0xffff, 0x01000020, 0x00, 0x04, 0x0001 },
+ { 55, 0x002a, 0x2000002a, 0x00, 0x00, 0x0000 },
+ { 56, 0xffff, 0x01000023, 0x00, 0x04, 0x0008 },
+ { 57, 0x0020, 0x00000020, 0x00, 0x00, 0x0000 },
+ { 58, 0xffff, 0x01000024, 0x00, 0x00, 0x0000 },
+ { 59, 0xffff, 0x01000030, 0x00, 0x00, 0x0000 },
+ { 59, 0xffff, 0x0100003c, 0x01, 0x00, 0x0000 },
+ { 59, 0xffff, 0x01000048, 0x04, 0x00, 0x0000 },
+ { 59, 0xffff, 0x01000000, 0x0c, 0x08, 0x0100 },
+ { 60, 0xffff, 0x01000031, 0x00, 0x00, 0x0000 },
+ { 60, 0xffff, 0x0100003d, 0x01, 0x00, 0x0000 },
+ { 60, 0xffff, 0x01000049, 0x04, 0x00, 0x0000 },
+ { 60, 0xffff, 0x01000000, 0x0c, 0x08, 0x0101 },
+ { 61, 0xffff, 0x01000032, 0x00, 0x00, 0x0000 },
+ { 61, 0xffff, 0x0100003e, 0x01, 0x00, 0x0000 },
+ { 61, 0xffff, 0x0100004a, 0x04, 0x00, 0x0000 },
+ { 61, 0xffff, 0x01000000, 0x0c, 0x08, 0x0102 },
+ { 62, 0xffff, 0x01000033, 0x00, 0x00, 0x0000 },
+ { 62, 0xffff, 0x0100003f, 0x01, 0x00, 0x0000 },
+ { 62, 0xffff, 0x0100004b, 0x04, 0x00, 0x0000 },
+ { 62, 0xffff, 0x01000000, 0x0c, 0x08, 0x0103 },
+ { 63, 0xffff, 0x01000034, 0x00, 0x00, 0x0000 },
+ { 63, 0xffff, 0x01000040, 0x01, 0x00, 0x0000 },
+ { 63, 0xffff, 0x0100004c, 0x04, 0x00, 0x0000 },
+ { 63, 0xffff, 0x01000000, 0x0c, 0x08, 0x0104 },
+ { 64, 0xffff, 0x01000035, 0x00, 0x00, 0x0000 },
+ { 64, 0xffff, 0x01000041, 0x01, 0x00, 0x0000 },
+ { 64, 0xffff, 0x0100004d, 0x04, 0x00, 0x0000 },
+ { 64, 0xffff, 0x01000000, 0x0c, 0x08, 0x0105 },
+ { 65, 0xffff, 0x01000036, 0x00, 0x00, 0x0000 },
+ { 65, 0xffff, 0x01000042, 0x01, 0x00, 0x0000 },
+ { 65, 0xffff, 0x0100004e, 0x04, 0x00, 0x0000 },
+ { 65, 0xffff, 0x01000000, 0x0c, 0x08, 0x0106 },
+ { 66, 0xffff, 0x01000037, 0x00, 0x00, 0x0000 },
+ { 66, 0xffff, 0x01000043, 0x01, 0x00, 0x0000 },
+ { 66, 0xffff, 0x0100004f, 0x04, 0x00, 0x0000 },
+ { 66, 0xffff, 0x01000000, 0x0c, 0x08, 0x0107 },
+ { 67, 0xffff, 0x01000038, 0x00, 0x00, 0x0000 },
+ { 67, 0xffff, 0x01000044, 0x01, 0x00, 0x0000 },
+ { 67, 0xffff, 0x01000050, 0x04, 0x00, 0x0000 },
+ { 67, 0xffff, 0x01000000, 0x0c, 0x08, 0x0108 },
+ { 68, 0xffff, 0x01000039, 0x00, 0x00, 0x0000 },
+ { 68, 0xffff, 0x01000045, 0x01, 0x00, 0x0000 },
+ { 68, 0xffff, 0x01000051, 0x04, 0x00, 0x0000 },
+ { 68, 0xffff, 0x01000000, 0x0c, 0x08, 0x0109 },
+ { 69, 0xffff, 0x01000025, 0x00, 0x00, 0x0000 },
+ { 70, 0xffff, 0x01000026, 0x00, 0x00, 0x0000 },
+ { 70, 0xffff, 0x01000026, 0x08, 0x00, 0x0000 },
+ { 71, 0x0037, 0x20000037, 0x00, 0x00, 0x0000 },
+ { 72, 0x0038, 0x20000038, 0x00, 0x00, 0x0000 },
+ { 73, 0x0039, 0x20000039, 0x00, 0x00, 0x0000 },
+ { 74, 0x002d, 0x2000002d, 0x00, 0x00, 0x0000 },
+ { 75, 0x0034, 0x20000034, 0x00, 0x00, 0x0000 },
+ { 76, 0x0035, 0x20000035, 0x00, 0x00, 0x0000 },
+ { 77, 0x0036, 0x20000036, 0x00, 0x00, 0x0000 },
+ { 78, 0x002b, 0x2000002b, 0x00, 0x00, 0x0000 },
+ { 79, 0x0031, 0x20000031, 0x00, 0x00, 0x0000 },
+ { 80, 0x0032, 0x20000032, 0x00, 0x00, 0x0000 },
+ { 81, 0x0033, 0x20000033, 0x00, 0x00, 0x0000 },
+ { 82, 0x0030, 0x20000030, 0x00, 0x00, 0x0000 },
+ { 83, 0x002e, 0x2000002e, 0x00, 0x00, 0x0000 },
+ { 83, 0xffff, 0x01000000, 0x06, 0x08, 0x0200 },
+ { 83, 0xffff, 0x01000000, 0x0c, 0x08, 0x0200 },
+ { 86, 0x003c, 0x0000003c, 0x00, 0x00, 0x0000 },
+ { 86, 0x003e, 0x0000003e, 0x01, 0x00, 0x0000 },
+ { 86, 0x007c, 0x0000007c, 0x02, 0x00, 0x0000 },
+ { 87, 0xffff, 0x0100003a, 0x00, 0x00, 0x0000 },
+ { 87, 0xffff, 0x01000046, 0x01, 0x00, 0x0000 },
+ { 87, 0xffff, 0x01000052, 0x04, 0x00, 0x0000 },
+ { 87, 0xffff, 0x01000000, 0x0c, 0x08, 0x010a },
+ { 88, 0xffff, 0x0100003b, 0x00, 0x00, 0x0000 },
+ { 88, 0xffff, 0x01000047, 0x01, 0x00, 0x0000 },
+ { 88, 0xffff, 0x01000000, 0x0c, 0x08, 0x010b },
+ { 96, 0xffff, 0x21000005, 0x00, 0x00, 0x0000 },
+ { 97, 0xffff, 0x01000021, 0x00, 0x04, 0x0004 },
+ { 98, 0x002f, 0x2000002f, 0x00, 0x00, 0x0000 },
+ { 99, 0x005c, 0x0400005c, 0x00, 0x00, 0x0000 },
+ { 100, 0xffff, 0x01001103, 0x00, 0x04, 0x0002 },
+ { 102, 0xffff, 0x01000010, 0x00, 0x00, 0x0000 },
+ { 103, 0xffff, 0x01000013, 0x00, 0x00, 0x0000 },
+ { 104, 0xffff, 0x01000016, 0x00, 0x00, 0x0000 },
+ { 105, 0xffff, 0x01000012, 0x00, 0x00, 0x0000 },
+ { 105, 0xffff, 0x01000000, 0x0c, 0x08, 0x0180 },
+ { 106, 0xffff, 0x01000014, 0x00, 0x00, 0x0000 },
+ { 106, 0xffff, 0x01000000, 0x0c, 0x08, 0x0181 },
+ { 107, 0xffff, 0x01000011, 0x00, 0x00, 0x0000 },
+ { 108, 0xffff, 0x01000015, 0x00, 0x00, 0x0000 },
+ { 109, 0xffff, 0x01000017, 0x00, 0x00, 0x0000 },
+ { 110, 0xffff, 0x01000006, 0x00, 0x00, 0x0000 },
+ { 111, 0xffff, 0x01000007, 0x00, 0x00, 0x0000 },
+ { 111, 0xffff, 0x01000000, 0x06, 0x08, 0x0200 },
+ { 111, 0xffff, 0x01000000, 0x0c, 0x08, 0x0200 },
+ { 119, 0xffff, 0x01000008, 0x00, 0x00, 0x0000 },
+};
+
+const QEvdevKeyboardMap::Composing QEvdevKeyboardHandler::s_keycompose_default[] = {
+ { 0x0060, 0x0041, 0x00c0 },
+ { 0x0060, 0x0061, 0x00e0 },
+ { 0x0027, 0x0041, 0x00c1 },
+ { 0x0027, 0x0061, 0x00e1 },
+ { 0x005e, 0x0041, 0x00c2 },
+ { 0x005e, 0x0061, 0x00e2 },
+ { 0x007e, 0x0041, 0x00c3 },
+ { 0x007e, 0x0061, 0x00e3 },
+ { 0x0022, 0x0041, 0x00c4 },
+ { 0x0022, 0x0061, 0x00e4 },
+ { 0x002d, 0x0061, 0x00aa },
+ { 0x002d, 0x0041, 0x00aa },
+ { 0x004f, 0x0041, 0x00c5 },
+ { 0x006f, 0x0061, 0x00e5 },
+ { 0x0030, 0x0041, 0x00c5 },
+ { 0x0030, 0x0061, 0x00e5 },
+ { 0x0041, 0x0041, 0x00c5 },
+ { 0x0061, 0x0061, 0x00e5 },
+ { 0x00b0, 0x0041, 0x00c5 },
+ { 0x00b0, 0x0061, 0x00e5 },
+ { 0x0041, 0x0045, 0x00c6 },
+ { 0x0061, 0x0065, 0x00e6 },
+ { 0x002c, 0x0043, 0x00c7 },
+ { 0x002c, 0x0063, 0x00e7 },
+ { 0x005e, 0x0043, 0x00c7 },
+ { 0x005e, 0x0063, 0x00e7 },
+ { 0x0060, 0x0045, 0x00c8 },
+ { 0x0060, 0x0065, 0x00e8 },
+ { 0x0027, 0x0045, 0x00c9 },
+ { 0x0027, 0x0065, 0x00e9 },
+ { 0x005e, 0x0045, 0x00ca },
+ { 0x005e, 0x0065, 0x00ea },
+ { 0x0022, 0x0045, 0x00cb },
+ { 0x0022, 0x0065, 0x00eb },
+ { 0x0060, 0x0049, 0x00cc },
+ { 0x0060, 0x0069, 0x00ec },
+ { 0x0027, 0x0049, 0x00cd },
+ { 0x0027, 0x0069, 0x00ed },
+ { 0x005e, 0x0049, 0x00ce },
+ { 0x005e, 0x0069, 0x00ee },
+ { 0x0022, 0x0049, 0x00cf },
+ { 0x0022, 0x0069, 0x00ef },
+ { 0x002d, 0x0044, 0x00d0 },
+ { 0x002d, 0x0064, 0x00f0 },
+ { 0x005e, 0x0044, 0x00d0 },
+ { 0x005e, 0x0064, 0x00f0 },
+ { 0x007e, 0x004e, 0x00d1 },
+ { 0x007e, 0x006e, 0x00f1 },
+ { 0x005e, 0x004e, 0x00d1 },
+ { 0x005e, 0x006e, 0x00f1 },
+ { 0x0060, 0x004f, 0x00d2 },
+ { 0x0060, 0x006f, 0x00f2 },
+ { 0x0027, 0x004f, 0x00d3 },
+ { 0x0027, 0x006f, 0x00f3 },
+ { 0x005e, 0x004f, 0x00d4 },
+ { 0x005e, 0x006f, 0x00f4 },
+ { 0x007e, 0x004f, 0x00d5 },
+ { 0x007e, 0x006f, 0x00f5 },
+ { 0x0022, 0x004f, 0x00d6 },
+ { 0x0022, 0x006f, 0x00f6 },
+ { 0x002f, 0x004f, 0x00d8 },
+ { 0x002f, 0x006f, 0x00f8 },
+ { 0x002d, 0x006f, 0x00ba },
+ { 0x002d, 0x004f, 0x00ba },
+ { 0x0060, 0x0055, 0x00d9 },
+ { 0x0060, 0x0075, 0x00f9 },
+ { 0x0027, 0x0055, 0x00da },
+ { 0x0027, 0x0075, 0x00fa },
+ { 0x005e, 0x0055, 0x00db },
+ { 0x005e, 0x0075, 0x00fb },
+ { 0x0022, 0x0055, 0x00dc },
+ { 0x0022, 0x0075, 0x00fc },
+ { 0x0027, 0x0059, 0x00dd },
+ { 0x0027, 0x0079, 0x00fd },
+ { 0x0054, 0x0048, 0x00de },
+ { 0x0074, 0x0068, 0x00fe },
+ { 0x0073, 0x0073, 0x00df },
+ { 0x0022, 0x0079, 0x00ff },
+ { 0x0073, 0x007a, 0x00df },
+ { 0x006e, 0x006e, 0x00f1 },
+ { 0x006e, 0x0068, 0x00f1 },
+ { 0x004e, 0x0059, 0x00d1 },
+ { 0x004e, 0x004e, 0x00d1 },
+ { 0x004e, 0x0048, 0x00d1 },
+ { 0x004e, 0x0079, 0x00d1 },
+ { 0x004e, 0x006e, 0x00d1 },
+ { 0x004e, 0x0068, 0x00d1 },
+ { 0x002d, 0x004c, 0x00a3 },
+ { 0x003c, 0x003c, 0x00ab },
+ { 0x003e, 0x003e, 0x00bb },
+ { 0x003f, 0x003f, 0x00bf },
+ { 0x005e, 0x003f, 0x00bf },
+ { 0x0021, 0x0021, 0x00a1 },
+ { 0x005e, 0x0021, 0x00a1 },
+ { 0x005e, 0x0031, 0x00b9 },
+ { 0x005e, 0x0032, 0x00b2 },
+ { 0x005e, 0x0033, 0x00b3 },
+ { 0x002b, 0x002d, 0x00b1 },
+ { 0x0063, 0x003d, 0x00a2 },
+ { 0x0063, 0x002f, 0x00a2 },
+ { 0x002f, 0x0063, 0x00a2 },
+ { 0x002d, 0x0063, 0x00a2 },
+ { 0x002d, 0x0043, 0x00a2 },
+ { 0x004c, 0x003d, 0x00a3 },
+ { 0x002d, 0x004c, 0x00a3 },
+ { 0x002d, 0x006c, 0x00a3 },
+ { 0x005e, 0x002a, 0x00d7 },
+ { 0x005e, 0x0078, 0x00d7 },
+ { 0x0078, 0x0078, 0x00d7 },
+ { 0x005e, 0x002e, 0x00b7 },
+ { 0x002e, 0x002e, 0x00b7 },
+ { 0x005e, 0x002f, 0x00f7 },
+ { 0x005e, 0x003a, 0x00f7 },
+ { 0x002d, 0x003a, 0x00f7 },
+ { 0x003a, 0x002d, 0x00f7 },
+ { 0x0059, 0x003d, 0x00a5 },
+ { 0x002d, 0x0059, 0x00a5 },
+ { 0x002d, 0x006c, 0x00a5 },
+ { 0x0028, 0x0063, 0x00a9 },
+ { 0x0022, 0x0063, 0x00a9 },
+ { 0x002d, 0x0061, 0x00aa },
+ { 0x002d, 0x0041, 0x00aa },
+ { 0x002d, 0x006f, 0x00ba },
+ { 0x002d, 0x004f, 0x00ba },
+ { 0x0028, 0x0072, 0x00ae },
+ { 0x0022, 0x0072, 0x00ae },
+ { 0x006d, 0x0075, 0x00b5 },
+ { 0x0031, 0x0034, 0x0152 },
+ { 0x0031, 0x0032, 0x0153 },
+ { 0x0033, 0x0034, 0x0178 },
+ { 0x0065, 0x003d, 0x20ac },
+ { 0x002d, 0x0065, 0x20ac },
+ { 0x002d, 0x0045, 0x20ac },
+ { 0x0076, 0x0053, 0x0160 },
+ { 0x005e, 0x0053, 0x0160 },
+ { 0x0076, 0x0073, 0x0161 },
+ { 0x005e, 0x0073, 0x0161 },
+ { 0x0076, 0x005a, 0x017d },
+ { 0x005e, 0x005a, 0x017d },
+ { 0x0076, 0x007a, 0x017e },
+ { 0x005e, 0x007a, 0x017e },
+ { 0x004f, 0x0045, 0x0152 },
+ { 0x004f, 0x0065, 0x0152 },
+ { 0x006f, 0x0065, 0x0153 },
+ { 0x0022, 0x0059, 0x0178 },
+ { 0x0069, 0x006a, 0x00ff },
+ { 0x0049, 0x004a, 0x0178 },
+};
+
+#endif // QEVDEVKEYBOARDHANDLER_DEFAULTMAP_H
diff --git a/src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.cpp b/src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.cpp
new file mode 100644
index 0000000000..f9237e3325
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.cpp
@@ -0,0 +1,490 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qevdevkeyboardhandler.h"
+
+#include <qplatformdefs.h>
+
+#include <QSocketNotifier>
+#include <QStringList>
+#include <QWindowSystemInterface>
+#include <QCoreApplication>
+#include <private/qcore_unix_p.h>
+
+#include <linux/input.h>
+
+//#define QT_QPA_KEYMAP_DEBUG
+
+#ifdef QT_QPA_KEYMAP_DEBUG
+#include <qdebug.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// simple builtin US keymap
+#include "qevdevkeyboard_defaultmap.h"
+
+QEvdevKeyboardHandler::QEvdevKeyboardHandler(int deviceDescriptor, const QString &device, bool disableZap, bool enableCompose, const QString &keymapFile)
+ : m_fd(deviceDescriptor), m_device(device),
+ m_modifiers(0), m_composing(0), m_dead_unicode(0xffff),
+ m_no_zap(disableZap), m_do_compose(enableCompose),
+ m_keymap(0), m_keymap_size(0), m_keycompose(0), m_keycompose_size(0)
+{
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Create keyboard handler with for device" << device;
+#endif
+
+ setObjectName(QLatin1String("LinuxInput Keyboard Handler"));
+
+ memset(m_locks, 0, sizeof(m_locks));
+
+ if (keymapFile.isEmpty() || !loadKeymap(keymapFile))
+ unloadKeymap();
+
+ // socket notifier for events on the keyboard device
+ QSocketNotifier *notifier;
+ notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
+ connect(notifier, SIGNAL(activated(int)), this, SLOT(readKeycode()));
+}
+
+QEvdevKeyboardHandler::~QEvdevKeyboardHandler()
+{
+ unloadKeymap();
+
+ if (m_fd >= 0)
+ qt_safe_close(m_fd);
+}
+
+QEvdevKeyboardHandler *QEvdevKeyboardHandler::createLinuxInputKeyboardHandler(const QString &key, const QString &specification)
+{
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Try to create keyboard handler with" << key << specification;
+#else
+ Q_UNUSED(key)
+#endif
+
+ QString keymapFile;
+ QString device = "/dev/input/event0";
+ int repeatDelay = 400;
+ int repeatRate = 80;
+ bool disableZap = false;
+ bool enableCompose = false;
+
+ QStringList args = specification.split(QLatin1Char(':'));
+ foreach (const QString &arg, args) {
+ if (arg.startsWith(QLatin1String("keymap=")))
+ keymapFile = arg.mid(7);
+ else if (arg == QLatin1String("disable-zap"))
+ disableZap = true;
+ else if (arg == QLatin1String("enable-compose"))
+ enableCompose = true;
+ else if (arg.startsWith(QLatin1String("repeat-delay=")))
+ repeatDelay = arg.mid(13).toInt();
+ else if (arg.startsWith(QLatin1String("repeat-rate=")))
+ repeatRate = arg.mid(12).toInt();
+ else if (arg.startsWith(QLatin1String("/dev/")))
+ device = arg;
+ }
+
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Opening keyboard at" << device;
+#endif
+
+ int fd;
+ fd = qt_safe_open(device.toLocal8Bit().constData(), O_RDWR, 0);
+ if (fd >= 0) {
+ if (repeatDelay > 0 && repeatRate > 0) {
+ int kbdrep[2] = { repeatDelay, repeatRate };
+ ::ioctl(fd, EVIOCSREP, kbdrep);
+ }
+
+ return new QEvdevKeyboardHandler(fd, device, disableZap, enableCompose, keymapFile);
+ } else {
+ qWarning("Cannot open keyboard input device '%s': %s", qPrintable(device), strerror(errno));
+ return 0;
+ }
+}
+
+void QEvdevKeyboardHandler::switchLed(int led, bool state)
+{
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "switchLed" << led << state;
+#endif
+
+ struct ::input_event led_ie;
+ ::gettimeofday(&led_ie.time, 0);
+ led_ie.type = EV_LED;
+ led_ie.code = led;
+ led_ie.value = state;
+
+ qt_safe_write(m_fd, &led_ie, sizeof(led_ie));
+}
+
+void QEvdevKeyboardHandler::readKeycode()
+{
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Read new keycode on" << m_device;
+#endif
+
+ struct ::input_event buffer[32];
+ int n = 0;
+
+ forever {
+ n = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
+
+ if (n == 0) {
+ qWarning("Got EOF from the input device.");
+ return;
+ } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
+ qWarning("Could not read from input device: %s", strerror(errno));
+ return;
+ } else if (n % sizeof(buffer[0]) == 0) {
+ break;
+ }
+ }
+
+ n /= sizeof(buffer[0]);
+
+ for (int i = 0; i < n; ++i) {
+ if (buffer[i].type != EV_KEY)
+ continue;
+
+ quint16 code = buffer[i].code;
+ qint32 value = buffer[i].value;
+
+ QEvdevKeyboardHandler::KeycodeAction ka;
+ ka = processKeycode(code, value != 0, value == 2);
+
+ switch (ka) {
+ case QEvdevKeyboardHandler::CapsLockOn:
+ case QEvdevKeyboardHandler::CapsLockOff:
+ switchLed(LED_CAPSL, ka == QEvdevKeyboardHandler::CapsLockOn);
+ break;
+
+ case QEvdevKeyboardHandler::NumLockOn:
+ case QEvdevKeyboardHandler::NumLockOff:
+ switchLed(LED_NUML, ka == QEvdevKeyboardHandler::NumLockOn);
+ break;
+
+ case QEvdevKeyboardHandler::ScrollLockOn:
+ case QEvdevKeyboardHandler::ScrollLockOff:
+ switchLed(LED_SCROLLL, ka == QEvdevKeyboardHandler::ScrollLockOn);
+ break;
+
+ default:
+ // ignore console switching and reboot
+ break;
+ }
+ }
+}
+
+void QEvdevKeyboardHandler::processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers, bool isPress, bool autoRepeat)
+{
+ QWindowSystemInterface::handleKeyEvent(0, ( isPress ? QEvent::KeyPress : QEvent::KeyRelease ), keycode, modifiers, QString( unicode ), autoRepeat );
+}
+
+QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint16 keycode, bool pressed, bool autorepeat)
+{
+ KeycodeAction result = None;
+ bool first_press = pressed && !autorepeat;
+
+ const QEvdevKeyboardMap::Mapping *map_plain = 0;
+ const QEvdevKeyboardMap::Mapping *map_withmod = 0;
+
+ // get a specific and plain mapping for the keycode and the current modifiers
+ for (int i = 0; i < m_keymap_size && !(map_plain && map_withmod); ++i) {
+ const QEvdevKeyboardMap::Mapping *m = m_keymap + i;
+ if (m->keycode == keycode) {
+ if (m->modifiers == 0)
+ map_plain = m;
+
+ quint8 testmods = m_modifiers;
+ if (m_locks[0] /*CapsLock*/ && (m->flags & QEvdevKeyboardMap::IsLetter))
+ testmods ^= QEvdevKeyboardMap::ModShift;
+ if (m->modifiers == testmods)
+ map_withmod = m;
+ }
+ }
+
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning("Processing key event: keycode=%3d, modifiers=%02x pressed=%d, autorepeat=%d | plain=%d, withmod=%d, size=%d", \
+ keycode, m_modifiers, pressed ? 1 : 0, autorepeat ? 1 : 0, \
+ map_plain ? map_plain - m_keymap : -1, \
+ map_withmod ? map_withmod - m_keymap : -1, \
+ m_keymap_size);
+#endif
+
+ const QEvdevKeyboardMap::Mapping *it = map_withmod ? map_withmod : map_plain;
+
+ if (!it) {
+#ifdef QT_QPA_KEYMAP_DEBUG
+ // we couldn't even find a plain mapping
+ qWarning("Could not find a suitable mapping for keycode: %3d, modifiers: %02x", keycode, m_modifiers);
+#endif
+ return result;
+ }
+
+ bool skip = false;
+ quint16 unicode = it->unicode;
+ quint32 qtcode = it->qtcode;
+
+ if ((it->flags & QEvdevKeyboardMap::IsModifier) && it->special) {
+ // this is a modifier, i.e. Shift, Alt, ...
+ if (pressed)
+ m_modifiers |= quint8(it->special);
+ else
+ m_modifiers &= ~quint8(it->special);
+ } else if (qtcode >= Qt::Key_CapsLock && qtcode <= Qt::Key_ScrollLock) {
+ // (Caps|Num|Scroll)Lock
+ if (first_press) {
+ quint8 &lock = m_locks[qtcode - Qt::Key_CapsLock];
+ lock ^= 1;
+
+ switch (qtcode) {
+ case Qt::Key_CapsLock : result = lock ? CapsLockOn : CapsLockOff; m_modifiers ^= QEvdevKeyboardMap::ModShift; break;
+ case Qt::Key_NumLock : result = lock ? NumLockOn : NumLockOff; break;
+ case Qt::Key_ScrollLock: result = lock ? ScrollLockOn : ScrollLockOff; break;
+ default : break;
+ }
+ }
+ } else if ((it->flags & QEvdevKeyboardMap::IsSystem) && it->special && first_press) {
+ switch (it->special) {
+ case QEvdevKeyboardMap::SystemReboot:
+ result = Reboot;
+ break;
+
+ case QEvdevKeyboardMap::SystemZap:
+ if (!m_no_zap)
+ qApp->quit();
+ break;
+
+ case QEvdevKeyboardMap::SystemConsolePrevious:
+ result = PreviousConsole;
+ break;
+
+ case QEvdevKeyboardMap::SystemConsoleNext:
+ result = NextConsole;
+ break;
+
+ default:
+ if (it->special >= QEvdevKeyboardMap::SystemConsoleFirst &&
+ it->special <= QEvdevKeyboardMap::SystemConsoleLast) {
+ result = KeycodeAction(SwitchConsoleFirst + ((it->special & QEvdevKeyboardMap::SystemConsoleMask) & SwitchConsoleMask));
+ }
+ break;
+ }
+
+ skip = true; // no need to tell Qt about it
+ } else if ((qtcode == Qt::Key_Multi_key) && m_do_compose) {
+ // the Compose key was pressed
+ if (first_press)
+ m_composing = 2;
+ skip = true;
+ } else if ((it->flags & QEvdevKeyboardMap::IsDead) && m_do_compose) {
+ // a Dead key was pressed
+ if (first_press && m_composing == 1 && m_dead_unicode == unicode) { // twice
+ m_composing = 0;
+ qtcode = Qt::Key_unknown; // otherwise it would be Qt::Key_Dead...
+ } else if (first_press && unicode != 0xffff) {
+ m_dead_unicode = unicode;
+ m_composing = 1;
+ skip = true;
+ } else {
+ skip = true;
+ }
+ }
+
+ if (!skip) {
+ // a normal key was pressed
+ const int modmask = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier | Qt::KeypadModifier;
+
+ // we couldn't find a specific mapping for the current modifiers,
+ // or that mapping didn't have special modifiers:
+ // so just report the plain mapping with additional modifiers.
+ if ((it == map_plain && it != map_withmod) ||
+ (map_withmod && !(map_withmod->qtcode & modmask))) {
+ qtcode |= QEvdevKeyboardHandler::toQtModifiers(m_modifiers);
+ }
+
+ if (m_composing == 2 && first_press && !(it->flags & QEvdevKeyboardMap::IsModifier)) {
+ // the last key press was the Compose key
+ if (unicode != 0xffff) {
+ int idx = 0;
+ // check if this code is in the compose table at all
+ for ( ; idx < m_keycompose_size; ++idx) {
+ if (m_keycompose[idx].first == unicode)
+ break;
+ }
+ if (idx < m_keycompose_size) {
+ // found it -> simulate a Dead key press
+ m_dead_unicode = unicode;
+ unicode = 0xffff;
+ m_composing = 1;
+ skip = true;
+ } else {
+ m_composing = 0;
+ }
+ } else {
+ m_composing = 0;
+ }
+ } else if (m_composing == 1 && first_press && !(it->flags & QEvdevKeyboardMap::IsModifier)) {
+ // the last key press was a Dead key
+ bool valid = false;
+ if (unicode != 0xffff) {
+ int idx = 0;
+ // check if this code is in the compose table at all
+ for ( ; idx < m_keycompose_size; ++idx) {
+ if (m_keycompose[idx].first == m_dead_unicode && m_keycompose[idx].second == unicode)
+ break;
+ }
+ if (idx < m_keycompose_size) {
+ quint16 composed = m_keycompose[idx].result;
+ if (composed != 0xffff) {
+ unicode = composed;
+ qtcode = Qt::Key_unknown;
+ valid = true;
+ }
+ }
+ }
+ if (!valid) {
+ unicode = m_dead_unicode;
+ qtcode = Qt::Key_unknown;
+ }
+ m_composing = 0;
+ }
+
+ if (!skip) {
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning("Processing: uni=%04x, qt=%08x, qtmod=%08x", unicode, qtcode & ~modmask, (qtcode & modmask));
+#endif
+
+ // send the result to the server
+ processKeyEvent(unicode, qtcode & ~modmask, Qt::KeyboardModifiers(qtcode & modmask), pressed, autorepeat);
+ }
+ }
+ return result;
+}
+
+void QEvdevKeyboardHandler::unloadKeymap()
+{
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Unload current keymap and restore built-in";
+#endif
+
+ if (m_keymap && m_keymap != s_keymap_default)
+ delete [] m_keymap;
+ if (m_keycompose && m_keycompose != s_keycompose_default)
+ delete [] m_keycompose;
+
+ m_keymap = s_keymap_default;
+ m_keymap_size = sizeof(s_keymap_default) / sizeof(s_keymap_default[0]);
+ m_keycompose = s_keycompose_default;
+ m_keycompose_size = sizeof(s_keycompose_default) / sizeof(s_keycompose_default[0]);
+
+ // reset state, so we could switch keymaps at runtime
+ m_modifiers = 0;
+ memset(m_locks, 0, sizeof(m_locks));
+ m_composing = 0;
+ m_dead_unicode = 0xffff;
+}
+
+bool QEvdevKeyboardHandler::loadKeymap(const QString &file)
+{
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Load keymap" << file;
+#endif
+
+ QFile f(file);
+
+ if (!f.open(QIODevice::ReadOnly)) {
+ qWarning("Could not open keymap file '%s'", qPrintable(file));
+ return false;
+ }
+
+ // .qmap files have a very simple structure:
+ // quint32 magic (QKeyboard::FileMagic)
+ // quint32 version (1)
+ // quint32 keymap_size (# of struct QKeyboard::Mappings)
+ // quint32 keycompose_size (# of struct QKeyboard::Composings)
+ // all QKeyboard::Mappings via QDataStream::operator(<<|>>)
+ // all QKeyboard::Composings via QDataStream::operator(<<|>>)
+
+ quint32 qmap_magic, qmap_version, qmap_keymap_size, qmap_keycompose_size;
+
+ QDataStream ds(&f);
+
+ ds >> qmap_magic >> qmap_version >> qmap_keymap_size >> qmap_keycompose_size;
+
+ if (ds.status() != QDataStream::Ok || qmap_magic != QEvdevKeyboardMap::FileMagic || qmap_version != 1 || qmap_keymap_size == 0) {
+ qWarning("'%s' is ot a valid.qmap keymap file.", qPrintable(file));
+ return false;
+ }
+
+ QEvdevKeyboardMap::Mapping *qmap_keymap = new QEvdevKeyboardMap::Mapping[qmap_keymap_size];
+ QEvdevKeyboardMap::Composing *qmap_keycompose = qmap_keycompose_size ? new QEvdevKeyboardMap::Composing[qmap_keycompose_size] : 0;
+
+ for (quint32 i = 0; i < qmap_keymap_size; ++i)
+ ds >> qmap_keymap[i];
+ for (quint32 i = 0; i < qmap_keycompose_size; ++i)
+ ds >> qmap_keycompose[i];
+
+ if (ds.status() != QDataStream::Ok) {
+ delete [] qmap_keymap;
+ delete [] qmap_keycompose;
+
+ qWarning("Keymap file '%s' can not be loaded.", qPrintable(file));
+ return false;
+ }
+
+ // unload currently active and clear state
+ unloadKeymap();
+
+ m_keymap = qmap_keymap;
+ m_keymap_size = qmap_keymap_size;
+ m_keycompose = qmap_keycompose;
+ m_keycompose_size = qmap_keycompose_size;
+
+ m_do_compose = true;
+
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.h b/src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.h
new file mode 100644
index 0000000000..76b5c5703b
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/qevdevkeyboardhandler.h
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEVDEVKEYBOARDHANDLER_H
+#define QEVDEVKEYBOARDHANDLER_H
+
+#include <qobject.h>
+#include <QTimer>
+#include <QDataStream>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+namespace QEvdevKeyboardMap {
+ const quint32 FileMagic = 0x514d4150; // 'QMAP'
+
+ struct Mapping {
+ quint16 keycode;
+ quint16 unicode;
+ quint32 qtcode;
+ quint8 modifiers;
+ quint8 flags;
+ quint16 special;
+
+ };
+
+ enum Flags {
+ IsDead = 0x01,
+ IsLetter = 0x02,
+ IsModifier = 0x04,
+ IsSystem = 0x08
+ };
+
+ enum System {
+ SystemConsoleFirst = 0x0100,
+ SystemConsoleMask = 0x007f,
+ SystemConsoleLast = 0x017f,
+ SystemConsolePrevious = 0x0180,
+ SystemConsoleNext = 0x0181,
+ SystemReboot = 0x0200,
+ SystemZap = 0x0300
+ };
+
+ struct Composing {
+ quint16 first;
+ quint16 second;
+ quint16 result;
+ };
+
+ enum Modifiers {
+ ModPlain = 0x00,
+ ModShift = 0x01,
+ ModAltGr = 0x02,
+ ModControl = 0x04,
+ ModAlt = 0x08,
+ ModShiftL = 0x10,
+ ModShiftR = 0x20,
+ ModCtrlL = 0x40,
+ ModCtrlR = 0x80
+ // ModCapsShift = 0x100, // not supported!
+ };
+}
+
+inline QDataStream &operator>>(QDataStream &ds, QEvdevKeyboardMap::Mapping &m)
+{
+ return ds >> m.keycode >> m.unicode >> m.qtcode >> m.modifiers >> m.flags >> m.special;
+}
+
+inline QDataStream &operator<<(QDataStream &ds, const QEvdevKeyboardMap::Mapping &m)
+{
+ return ds << m.keycode << m.unicode << m.qtcode << m.modifiers << m.flags << m.special;
+}
+
+inline QDataStream &operator>>(QDataStream &ds, QEvdevKeyboardMap::Composing &c)
+{
+ return ds >> c.first >> c.second >> c.result;
+}
+
+inline QDataStream &operator<<(QDataStream &ds, const QEvdevKeyboardMap::Composing &c)
+{
+ return ds << c.first << c.second << c.result;
+}
+
+
+class QEvdevKeyboardHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QEvdevKeyboardHandler(int deviceDescriptor, const QString &device, bool disableZap, bool enableCompose, const QString &keymapFile);
+ ~QEvdevKeyboardHandler();
+
+ enum KeycodeAction {
+ None = 0,
+
+ CapsLockOff = 0x01000000,
+ CapsLockOn = 0x01000001,
+ NumLockOff = 0x02000000,
+ NumLockOn = 0x02000001,
+ ScrollLockOff = 0x03000000,
+ ScrollLockOn = 0x03000001,
+
+ Reboot = 0x04000000,
+
+ PreviousConsole = 0x05000000,
+ NextConsole = 0x05000001,
+ SwitchConsoleFirst = 0x06000000,
+ SwitchConsoleLast = 0x0600007f,
+ SwitchConsoleMask = 0x0000007f
+ };
+
+ static QEvdevKeyboardHandler *createLinuxInputKeyboardHandler(const QString &key, const QString &specification);
+
+ static Qt::KeyboardModifiers toQtModifiers(quint8 mod)
+ {
+ Qt::KeyboardModifiers qtmod = Qt::NoModifier;
+
+ if (mod & (QEvdevKeyboardMap::ModShift | QEvdevKeyboardMap::ModShiftL | QEvdevKeyboardMap::ModShiftR))
+ qtmod |= Qt::ShiftModifier;
+ if (mod & (QEvdevKeyboardMap::ModControl | QEvdevKeyboardMap::ModCtrlL | QEvdevKeyboardMap::ModCtrlR))
+ qtmod |= Qt::ControlModifier;
+ if (mod & QEvdevKeyboardMap::ModAlt)
+ qtmod |= Qt::AltModifier;
+
+ return qtmod;
+ }
+
+private slots:
+ void readKeycode();
+ KeycodeAction processKeycode(quint16 keycode, bool pressed, bool autorepeat);
+
+private:
+ void unloadKeymap();
+ bool loadKeymap(const QString &file);
+ void processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers, bool isPress, bool autoRepeat);
+ void switchLed(int, bool);
+
+ int m_fd;
+ QString m_device;
+
+ // keymap handling
+ quint8 m_modifiers;
+ quint8 m_locks[3];
+ int m_composing;
+ quint16 m_dead_unicode;
+
+ bool m_no_zap;
+ bool m_do_compose;
+
+ const QEvdevKeyboardMap::Mapping *m_keymap;
+ int m_keymap_size;
+ const QEvdevKeyboardMap::Composing *m_keycompose;
+ int m_keycompose_size;
+
+ static const QEvdevKeyboardMap::Mapping s_keymap_default[];
+ static const QEvdevKeyboardMap::Composing s_keycompose_default[];
+};
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QEVDEVKEYBOARDHANDLER_H
diff --git a/src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.cpp b/src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.cpp
new file mode 100644
index 0000000000..cb23d3a49c
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.cpp
@@ -0,0 +1,252 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qevdevkeyboardmanager.h"
+
+#include <QStringList>
+#include <QDebug>
+#include <QCoreApplication>
+
+#include <linux/input.h>
+#include <linux/kd.h>
+
+//#define QT_QPA_KEYMAP_DEBUG
+
+QT_BEGIN_NAMESPACE
+
+QEvdevKeyboardManager::QEvdevKeyboardManager(const QString &key, const QString &specification)
+ : m_udev(0), m_udevMonitor(0), m_udevMonitorFileDescriptor(-1), m_udevSocketNotifier(0)
+{
+ Q_UNUSED(key);
+
+ bool useUDev = false;
+ QStringList args = specification.split(QLatin1Char(':'));
+ QStringList devices;
+
+ foreach (const QString &arg, args) {
+ if (arg.startsWith("udev") && !arg.contains("no")) {
+ useUDev = true;
+ } else if (arg.startsWith("/dev/")) {
+ // if device is specified try to use it
+ devices.append(arg);
+ args.removeAll(arg);
+ }
+ }
+
+ m_spec = args.join(":");
+
+ // add all keyboards for devices specified in the argument list
+ foreach (const QString &device, devices)
+ addKeyboard(device);
+
+ // no udev and no devices specified, try a fallback
+ if (!useUDev && devices.isEmpty()) {
+ addKeyboard();
+ return;
+ }
+
+ m_udev = udev_new();
+ if (!m_udev) {
+ qWarning() << "Failed to read udev configuration. Try to open a keyboard without it";
+ addKeyboard();
+ } else {
+ // Look for already attached devices:
+ parseConnectedDevices();
+ // Watch for device add/remove
+ startWatching();
+ }
+}
+
+QEvdevKeyboardManager::~QEvdevKeyboardManager()
+{
+ // cleanup udev related resources
+ stopWatching();
+ if (m_udev)
+ udev_unref(m_udev);
+
+ // cleanup all resources of connected keyboards
+ qDeleteAll(m_keyboards);
+ m_keyboards.clear();
+}
+
+void QEvdevKeyboardManager::addKeyboard(const QString &devnode)
+{
+ QString specification = m_spec;
+ QString deviceString = devnode;
+
+ if (!deviceString.isEmpty()) {
+ specification.append(":");
+ specification.append(deviceString);
+ } else {
+ deviceString = "default";
+ }
+
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Adding keyboard at" << deviceString;
+#endif
+
+ QEvdevKeyboardHandler *keyboard;
+ keyboard = QEvdevKeyboardHandler::createLinuxInputKeyboardHandler("EvdevKeyboard", specification);
+ if (keyboard)
+ m_keyboards.insert(deviceString, keyboard);
+ else
+ qWarning() << "Failed to open keyboard";
+}
+
+void QEvdevKeyboardManager::removeKeyboard(const QString &devnode)
+{
+ if (m_keyboards.contains(devnode)) {
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning() << "Removing keyboard at" << devnode;
+#endif
+ QEvdevKeyboardHandler *keyboard = m_keyboards.value(devnode);
+ m_keyboards.remove(devnode);
+ delete keyboard;
+ }
+}
+
+void QEvdevKeyboardManager::startWatching()
+{
+ m_udevMonitor = udev_monitor_new_from_netlink(m_udev, "udev");
+ if (!m_udevMonitor) {
+#ifdef QT_QPA_KEYMAP_DEBUG
+ qWarning("Unable to create an Udev monitor. No devices can be detected.");
+#endif
+ return;
+ }
+
+ udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "input", NULL);
+ udev_monitor_enable_receiving(m_udevMonitor);
+ m_udevMonitorFileDescriptor = udev_monitor_get_fd(m_udevMonitor);
+
+ m_udevSocketNotifier = new QSocketNotifier(m_udevMonitorFileDescriptor, QSocketNotifier::Read, this);
+ connect(m_udevSocketNotifier, SIGNAL(activated(int)), this, SLOT(deviceDetected()));
+}
+
+void QEvdevKeyboardManager::stopWatching()
+{
+ if (m_udevSocketNotifier)
+ delete m_udevSocketNotifier;
+
+ if (m_udevMonitor)
+ udev_monitor_unref(m_udevMonitor);
+
+ m_udevSocketNotifier = 0;
+ m_udevMonitor = 0;
+ m_udevMonitorFileDescriptor = 0;
+}
+
+void QEvdevKeyboardManager::deviceDetected()
+{
+ if (!m_udevMonitor)
+ return;
+
+ struct udev_device *dev;
+ dev = udev_monitor_receive_device(m_udevMonitor);
+ if (!dev)
+ return;
+
+ if (qstrcmp(udev_device_get_action(dev), "add") == 0) {
+ checkDevice(dev);
+ } else {
+ // We can't determine what the device was, so we handle false positives outside of this class
+ QString str = udev_device_get_devnode(dev);
+ if (!str.isEmpty())
+ removeKeyboard(str);
+ }
+
+ udev_device_unref(dev);
+}
+
+void QEvdevKeyboardManager::parseConnectedDevices()
+{
+ struct udev_enumerate *enumerate;
+ struct udev_list_entry *devices;
+ struct udev_list_entry *dev_list_entry;
+ struct udev_device *dev;
+ const char *str;
+
+ enumerate = udev_enumerate_new(m_udev);
+ udev_enumerate_add_match_subsystem(enumerate, "input");
+ udev_enumerate_scan_devices(enumerate);
+ devices = udev_enumerate_get_list_entry(enumerate);
+
+ udev_list_entry_foreach(dev_list_entry, devices) {
+ str = udev_list_entry_get_name(dev_list_entry);
+ dev = udev_device_new_from_syspath(m_udev, str);
+ checkDevice(dev);
+ }
+
+ udev_enumerate_unref(enumerate);
+}
+
+void QEvdevKeyboardManager::checkDevice(udev_device *dev)
+{
+ const char *str;
+ QString devnode;
+
+ str = udev_device_get_devnode(dev);
+ if (!str)
+ return;
+
+ devnode = str;
+
+ dev = udev_device_get_parent_with_subsystem_devtype(dev, "input", NULL);
+ if (!dev)
+ return;
+
+ str = udev_device_get_sysattr_value(dev, "capabilities/key");
+ QStringList val = QString(str).split(' ', QString::SkipEmptyParts);
+
+ bool ok;
+ unsigned long long keys = val.last().toULongLong(&ok, 16);
+ if (!ok)
+ return;
+
+ // Tests if the letter Q is valid for the device. We may want to alter this test, but it seems mostly reliable.
+ bool test = (keys >> KEY_Q) & 1;
+ if (test) {
+ addKeyboard(devnode);
+ return;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.h b/src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.h
new file mode 100644
index 0000000000..3caed6ff43
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/qevdevkeyboardmanager.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEVDEVKEYBOARDMANAGER_H
+#define QEVDEVKEYBOARDMANAGER_H
+
+#include "qevdevkeyboardhandler.h"
+
+#include <QObject>
+#include <QHash>
+#include <QSocketNotifier>
+
+#include <libudev.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QEvdevKeyboardManager : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QEvdevKeyboardManager(const QString &key, const QString &specification);
+ ~QEvdevKeyboardManager();
+
+private slots:
+ void deviceDetected();
+
+private:
+ void startWatching();
+ void stopWatching();
+ void parseConnectedDevices();
+ void checkDevice(struct udev_device *dev);
+
+ void addKeyboard(const QString &devnode = QString());
+ void removeKeyboard(const QString &devnode);
+
+ QString m_spec;
+ QHash<QString,QEvdevKeyboardHandler*> m_keyboards;
+
+ struct udev *m_udev;
+ struct udev_monitor *m_udevMonitor;
+ int m_udevMonitorFileDescriptor;
+ QSocketNotifier *m_udevSocketNotifier;
+};
+
+QT_END_HEADER
+
+QT_END_NAMESPACE
+
+#endif // QEVDEVKEYBOARDMANAGER_H
diff --git a/src/plugins/generic/evdevmouse/README b/src/plugins/generic/evdevmouse/README
new file mode 100644
index 0000000000..b89c0a7066
--- /dev/null
+++ b/src/plugins/generic/evdevmouse/README
@@ -0,0 +1,11 @@
+Generic plug-in for absolute & relative evdev pointer events.
+
+To use it, launch apps with -plugin EvdevMouse
+
+The plug-in will try to pick a mouse or touchpad device from udev.
+If automatic detection does not work, use -plugin
+EvdevMouse:/dev/input/eventN to explicitly set the device node.
+
+The initial cursor position is assumed to be (0, 0). Relative events
+will generate Qt mouse events with screen positions relative to this
+initial position.
diff --git a/src/plugins/generic/evdevmouse/evdevmouse.pro b/src/plugins/generic/evdevmouse/evdevmouse.pro
new file mode 100644
index 0000000000..f25199161b
--- /dev/null
+++ b/src/plugins/generic/evdevmouse/evdevmouse.pro
@@ -0,0 +1,13 @@
+TARGET = qevdevmouseplugin
+load(qt_plugin)
+
+DESTDIR = $$QT.gui.plugins/generic
+target.path = $$[QT_INSTALL_PLUGINS]/generic
+INSTALLS += target
+
+HEADERS = qevdevmouse.h
+
+QT += core-private platformsupport-private
+
+SOURCES = main.cpp \
+ qevdevmouse.cpp
diff --git a/src/plugins/generic/evdevmouse/main.cpp b/src/plugins/generic/evdevmouse/main.cpp
new file mode 100644
index 0000000000..34ca62f960
--- /dev/null
+++ b/src/plugins/generic/evdevmouse/main.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qgenericplugin_qpa.h>
+#include "qevdevmouse.h"
+
+QT_BEGIN_NAMESPACE
+
+class QEvdevMousePlugin : public QGenericPlugin
+{
+public:
+ QEvdevMousePlugin();
+
+ QStringList keys() const;
+ QObject* create(const QString &key, const QString &specification);
+};
+
+QEvdevMousePlugin::QEvdevMousePlugin()
+ : QGenericPlugin()
+{
+}
+
+QStringList QEvdevMousePlugin::keys() const
+{
+ return (QStringList()
+ << QLatin1String("EvdevMouse"));
+}
+
+QObject* QEvdevMousePlugin::create(const QString &key,
+ const QString &specification)
+{
+ if (!key.compare(QLatin1String("EvdevMouse"), Qt::CaseInsensitive))
+ return new QEvdevMouseHandler(key, specification);
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(qevdevmouseplugin, QEvdevMousePlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/evdevmouse/qevdevmouse.cpp b/src/plugins/generic/evdevmouse/qevdevmouse.cpp
new file mode 100644
index 0000000000..0b72123c02
--- /dev/null
+++ b/src/plugins/generic/evdevmouse/qevdevmouse.cpp
@@ -0,0 +1,214 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qevdevmouse.h"
+
+#include <QSocketNotifier>
+#include <QStringList>
+#include <QPoint>
+#include <QWindowSystemInterface>
+
+#include <qplatformdefs.h>
+#include <private/qcore_unix_p.h> // overrides QT_OPEN
+#include <QtPlatformSupport/private/qudevhelper_p.h>
+
+#include <errno.h>
+
+#include <linux/kd.h>
+#include <linux/input.h>
+
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+QEvdevMouseHandler::QEvdevMouseHandler(const QString &key,
+ const QString &specification)
+ : m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0),
+ m_xoffset(0), m_yoffset(0), m_buttons(0)
+{
+ Q_UNUSED(key);
+ setObjectName(QLatin1String("Evdev Mouse Handler"));
+
+ QString dev;
+ q_udev_devicePath(UDev_Mouse | UDev_Touchpad, &dev);
+ if (dev.isEmpty())
+ dev = QLatin1String("/dev/input/event0");
+
+ m_compression = true;
+ m_smooth = false;
+ int jitterLimit = 0;
+
+ QStringList args = specification.split(QLatin1Char(':'));
+ foreach (const QString &arg, args) {
+ if (arg == "nocompress")
+ m_compression = false;
+ else if (arg.startsWith("dejitter="))
+ jitterLimit = arg.mid(9).toInt();
+ else if (arg.startsWith("xoffset="))
+ m_xoffset = arg.mid(8).toInt();
+ else if (arg.startsWith("yoffset="))
+ m_yoffset = arg.mid(8).toInt();
+ else if (arg.startsWith(QLatin1String("/dev/")))
+ dev = arg;
+ }
+ m_jitterLimitSquared = jitterLimit*jitterLimit;
+
+ qDebug("evdevmouse: Using device %s", qPrintable(dev));
+ m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
+ if (m_fd >= 0) {
+ m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
+ connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
+ } else {
+ qWarning("Cannot open mouse input device '%s': %s", qPrintable(dev), strerror(errno));
+ return;
+ }
+}
+
+QEvdevMouseHandler::~QEvdevMouseHandler()
+{
+ if (m_fd >= 0)
+ QT_CLOSE(m_fd);
+}
+
+void QEvdevMouseHandler::sendMouseEvent()
+{
+ QPoint pos(m_x + m_xoffset, m_y + m_yoffset);
+ //qDebug("mouse event %d %d %d", pos.x(), pos.y(), int(m_buttons));
+ QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons);
+ m_prevx = m_x;
+ m_prevy = m_y;
+}
+
+void QEvdevMouseHandler::readMouseData()
+{
+ struct ::input_event buffer[32];
+ int n = 0;
+ bool posChanged = false;
+ bool pendingMouseEvent = false;
+ int eventCompressCount = 0;
+ forever {
+ n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
+
+ if (n == 0) {
+ qWarning("Got EOF from the input device.");
+ return;
+ } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
+ qWarning("Could not read from input device: %s", strerror(errno));
+ return;
+ } else if (n % sizeof(buffer[0]) == 0) {
+ break;
+ }
+ }
+
+ n /= sizeof(buffer[0]);
+
+ for (int i = 0; i < n; ++i) {
+ struct ::input_event *data = &buffer[i];
+ //qDebug() << ">>" << hex << data->type << data->code << dec << data->value;
+ if (data->type == EV_ABS) {
+ if (data->code == ABS_X && m_x != data->value) {
+ m_x = data->value;
+ posChanged = true;
+ } else if (data->code == ABS_Y && m_y != data->value) {
+ m_y = data->value;
+ posChanged = true;
+ }
+ } else if (data->type == EV_REL) {
+ if (data->code == REL_X) {
+ m_x += data->value;
+ posChanged = true;
+ } else if (data->code == REL_Y) {
+ m_y += data->value;
+ posChanged = true;
+ } else if (data->code == ABS_WHEEL) { // vertical scroll
+ // data->value: 1 == up, -1 == down
+ int delta = 120 * data->value;
+ QWindowSystemInterface::handleWheelEvent(0, QPoint(m_x, m_y),
+ QPoint(m_x, m_y),
+ delta, Qt::Vertical);
+ } else if (data->code == ABS_THROTTLE) { // horizontal scroll
+ // data->value: 1 == right, -1 == left
+ int delta = 120 * -data->value;
+ QWindowSystemInterface::handleWheelEvent(0, QPoint(m_x, m_y),
+ QPoint(m_x, m_y),
+ delta, Qt::Horizontal);
+ }
+ } else if (data->type == EV_KEY && data->code == BTN_TOUCH) {
+ m_buttons = data->value ? Qt::LeftButton : Qt::NoButton;
+
+ sendMouseEvent();
+ pendingMouseEvent = false;
+ } else if (data->type == EV_KEY && data->code >= BTN_LEFT && data->code <= BTN_MIDDLE) {
+ Qt::MouseButton button = Qt::NoButton;
+ switch (data->code) {
+ case BTN_LEFT: button = Qt::LeftButton; break;
+ case BTN_MIDDLE: button = Qt::MidButton; break;
+ case BTN_RIGHT: button = Qt::RightButton; break;
+ }
+ if (data->value)
+ m_buttons |= button;
+ else
+ m_buttons &= ~button;
+ sendMouseEvent();
+ pendingMouseEvent = false;
+ } else if (data->type == EV_SYN && data->code == SYN_REPORT) {
+ if (posChanged) {
+ posChanged = false;
+ if (m_compression) {
+ pendingMouseEvent = true;
+ eventCompressCount++;
+ } else {
+ sendMouseEvent();
+ }
+ }
+ } else if (data->type == EV_MSC && data->code == MSC_SCAN) {
+ // kernel encountered an unmapped key - just ignore it
+ continue;
+ }
+ }
+ if (m_compression && pendingMouseEvent) {
+ int distanceSquared = (m_x - m_prevx)*(m_x - m_prevx) + (m_y - m_prevy)*(m_y - m_prevy);
+ if (distanceSquared > m_jitterLimitSquared)
+ sendMouseEvent();
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/linuxinput/qlinuxinput.h b/src/plugins/generic/evdevmouse/qevdevmouse.h
index a512ad959a..9542d133f2 100644
--- a/src/plugins/generic/linuxinput/qlinuxinput.h
+++ b/src/plugins/generic/evdevmouse/qevdevmouse.h
@@ -39,12 +39,11 @@
**
****************************************************************************/
-#ifndef QLINUXINPUT_H
-#define QLINUXINPUT_H
+#ifndef QEVDEVMOUSE_H
+#define QEVDEVMOUSE_H
-#include <qobject.h>
-#include <Qt>
-#include <termios.h>
+#include <QObject>
+#include <QString>
QT_BEGIN_HEADER
@@ -52,35 +51,34 @@ QT_BEGIN_NAMESPACE
class QSocketNotifier;
-class QLinuxInputMouseHandlerData;
-
-class QLinuxInputMouseHandler : public QObject
+class QEvdevMouseHandler : public QObject
{
Q_OBJECT
public:
- QLinuxInputMouseHandler(const QString &key, const QString &specification);
- ~QLinuxInputMouseHandler();
+ QEvdevMouseHandler(const QString &key, const QString &specification);
+ ~QEvdevMouseHandler();
private slots:
void readMouseData();
private:
- void sendMouseEvent(int x, int y, Qt::MouseButtons buttons);
- QSocketNotifier * m_notify;
- int m_fd;
- int m_x, m_y;
+ void sendMouseEvent();
+ void pathFromUdev(QString *path);
+
+ QSocketNotifier *m_notify;
+ int m_fd;
+ int m_x, m_y;
int m_prevx, m_prevy;
int m_xoffset, m_yoffset;
int m_smoothx, m_smoothy;
- Qt::MouseButtons m_buttons;
+ Qt::MouseButtons m_buttons;
bool m_compression;
bool m_smooth;
int m_jitterLimitSquared;
- QLinuxInputMouseHandlerData *d;
};
QT_END_NAMESPACE
QT_END_HEADER
-#endif // QLINUXINPUT_H
+#endif // QEVDEVMOUSE_H
diff --git a/src/plugins/generic/touchscreen/70-qtouchscreen.rules b/src/plugins/generic/evdevtouch/70-qtouchscreen.rules
index 2afde8f8a3..2afde8f8a3 100644
--- a/src/plugins/generic/touchscreen/70-qtouchscreen.rules
+++ b/src/plugins/generic/evdevtouch/70-qtouchscreen.rules
diff --git a/src/plugins/generic/evdevtouch/README b/src/plugins/generic/evdevtouch/README
new file mode 100644
index 0000000000..4764ef8f70
--- /dev/null
+++ b/src/plugins/generic/evdevtouch/README
@@ -0,0 +1,36 @@
+Generic plug-in for evdev touch events. (protocol type A)
+
+Tested with the following drivers: bcm5974, hid_magicmouse.
+
+To use it, pass -plugin EvdevTouch on the command line.
+
+If automatic detection does not work, use -plugin
+EvdevTouch:/dev/input/eventN to explicitly set the device file
+name.
+
+By default the surface of the touch device is mapped to the entire
+screen. If this is not desired, pass force_window in the plugin
+specification as shown in the example above. This will cause mapping
+the touch surface to the active window instead. For example:
+./fingerpaint -plugin EvdevTouch:force_window
+
+Only touch events are generated, mouse events are not. Be aware however
+that ignored touch events will generate a mouse event from the first
+touch point by default. See AA_SynthesizeMouseForUnhandledTouchEvents.
+
+If no evdev events are read, disable the synaptics driver from X or
+temporarily disable the device by running
+xinput set-prop <device> <device enabled property> 0.
+Use xinput list and xinput list-props to figure out the values.
+
+When not running on a windowing system (eglfs, kms, etc.) and having a
+touchpad, the evdevmouse and touch plugins can be combined to get both
+mouse and touch events:
+./app -platform kms -plugin EvdevTouch -plugin EvdevMouse
+
+If the input device cannot be accessed, set up a udev rule.
+For example:
+ sudo cp 70-qtouchscreen.rules /etc/udev/rules.d
+ sudo udevadm trigger --subsystem-match=input
+The udev rule matches any touchpad or touchscreen device. If there are
+multiple ones, specify the device manually as described above.
diff --git a/src/plugins/generic/evdevtouch/evdevtouch.pro b/src/plugins/generic/evdevtouch/evdevtouch.pro
new file mode 100644
index 0000000000..78fe551aa2
--- /dev/null
+++ b/src/plugins/generic/evdevtouch/evdevtouch.pro
@@ -0,0 +1,14 @@
+TARGET = qevdevtouchplugin
+load(qt_plugin)
+
+DESTDIR = $$QT.gui.plugins/generic
+target.path = $$[QT_INSTALL_PLUGINS]/generic
+INSTALLS += target
+
+HEADERS = \
+ qevdevtouch.h
+
+SOURCES = main.cpp \
+ qevdevtouch.cpp
+
+QT += core-private platformsupport-private
diff --git a/src/plugins/generic/touchscreen/main.cpp b/src/plugins/generic/evdevtouch/main.cpp
index 1f438ef1e7..526e336fd8 100644
--- a/src/plugins/generic/touchscreen/main.cpp
+++ b/src/plugins/generic/evdevtouch/main.cpp
@@ -40,8 +40,7 @@
****************************************************************************/
#include <qgenericplugin_qpa.h>
-#include "qtouchscreen.h"
-#include "qtoucheventsenderqpa.h"
+#include "qevdevtouch.h"
QT_BEGIN_NAMESPACE
@@ -60,21 +59,18 @@ QTouchScreenPlugin::QTouchScreenPlugin()
QStringList QTouchScreenPlugin::keys() const
{
- return QStringList() << "LinuxTouchScreen";
+ return QStringList() << "EvdevTouch";
}
QObject* QTouchScreenPlugin::create(const QString &key,
- const QString &spec)
+ const QString &spec)
{
- if (!key.compare(QLatin1String("LinuxTouchScreen"), Qt::CaseInsensitive)) {
- QTouchScreenObserver *obs = new QTouchEventSenderQPA(spec);
- QTouchScreenHandlerThread *h = new QTouchScreenHandlerThread(spec, obs);
- return h;
- }
+ if (!key.compare(QLatin1String("EvdevTouch"), Qt::CaseInsensitive))
+ return new QTouchScreenHandlerThread(spec);
return 0;
- }
+}
-Q_EXPORT_PLUGIN2(qtouchscreenplugin, QTouchScreenPlugin)
+Q_EXPORT_PLUGIN2(qevdevtouchplugin, QTouchScreenPlugin)
QT_END_NAMESPACE
diff --git a/src/plugins/generic/touchscreen/qtouchscreen.cpp b/src/plugins/generic/evdevtouch/qevdevtouch.cpp
index 8e04c10b9f..d508c4a12a 100644
--- a/src/plugins/generic/touchscreen/qtouchscreen.cpp
+++ b/src/plugins/generic/evdevtouch/qevdevtouch.cpp
@@ -39,13 +39,15 @@
**
****************************************************************************/
-#include "qtouchscreen.h"
+#include "qevdevtouch.h"
#include <QStringList>
#include <QHash>
#include <QSocketNotifier>
+#include <QGuiApplication>
+#include <QDebug>
#include <QtCore/private/qcore_unix_p.h>
+#include <QtPlatformSupport/private/qudevhelper_p.h>
#include <linux/input.h>
-#include <libudev.h>
QT_BEGIN_NAMESPACE
@@ -77,6 +79,8 @@ public:
Contact m_currentData;
int findClosestContact(const QHash<int, Contact> &contacts, int x, int y, int *dist);
+ void reportPoints();
+ void registerDevice();
int hw_range_x_min;
int hw_range_x_max;
@@ -85,8 +89,8 @@ public:
int hw_pressure_min;
int hw_pressure_max;
QString hw_name;
-
- QList<QTouchScreenObserver *> m_observers;
+ bool m_forceToActiveWindow;
+ QTouchDevice *m_device;
};
QTouchScreenData::QTouchScreenData(QTouchScreenHandler *q_ptr, const QStringList &args)
@@ -96,23 +100,37 @@ QTouchScreenData::QTouchScreenData(QTouchScreenHandler *q_ptr, const QStringList
hw_range_y_min(0), hw_range_y_max(0),
hw_pressure_min(0), hw_pressure_max(0)
{
- Q_UNUSED(args);
+ m_forceToActiveWindow = args.contains(QLatin1String("force_window"));
+}
+
+void QTouchScreenData::registerDevice()
+{
+ m_device = new QTouchDevice;
+ m_device->setName(hw_name);
+ m_device->setType(QTouchDevice::TouchScreen);
+ m_device->setCapabilities(QTouchDevice::Position | QTouchDevice::Area);
+ if (hw_pressure_max > hw_pressure_min)
+ m_device->setCapabilities(m_device->capabilities() | QTouchDevice::Pressure);
+
+ QWindowSystemInterface::registerTouchDevice(m_device);
}
QTouchScreenHandler::QTouchScreenHandler(const QString &spec)
: m_notify(0), m_fd(-1), d(0)
{
- setObjectName(QLatin1String("Linux Touch Handler"));
+ setObjectName(QLatin1String("Evdev Touch Handler"));
- QString dev = QLatin1String("/dev/input/event5");
- try_udev(&dev);
+ QString dev;
+ q_udev_devicePath(UDev_Touchpad | UDev_Touchscreen, &dev);
+ if (dev.isEmpty())
+ dev = QLatin1String("/dev/input/event0");
QStringList args = spec.split(QLatin1Char(':'));
for (int i = 0; i < args.count(); ++i)
if (args.at(i).startsWith(QLatin1String("/dev/")))
dev = args.at(i);
- qDebug("Using device '%s'", qPrintable(dev));
+ qDebug("evdevtouch: Using device %s", qPrintable(dev));
m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if (m_fd >= 0) {
@@ -149,6 +167,8 @@ QTouchScreenHandler::QTouchScreenHandler(const QString &spec)
d->hw_name = QString::fromLocal8Bit(name);
qDebug("device name: %s", name);
}
+
+ d->registerDevice();
}
QTouchScreenHandler::~QTouchScreenHandler()
@@ -159,38 +179,6 @@ QTouchScreenHandler::~QTouchScreenHandler()
delete d;
}
-void QTouchScreenHandler::addObserver(QTouchScreenObserver *observer)
-{
- if (!d || !observer)
- return;
- d->m_observers.append(observer);
- observer->touch_configure(d->hw_range_x_min, d->hw_range_x_max,
- d->hw_range_y_min, d->hw_range_y_max,
- d->hw_pressure_min, d->hw_pressure_max,
- d->hw_name);
-}
-
-void QTouchScreenHandler::try_udev(QString *path)
-{
- *path = QString();
- udev *u = udev_new();
- udev_enumerate *ue = udev_enumerate_new(u);
- udev_enumerate_add_match_subsystem(ue, "input");
- udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHPAD", "1");
- udev_enumerate_scan_devices(ue);
- udev_list_entry *entry;
- udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(ue)) {
- const char *syspath = udev_list_entry_get_name(entry);
- udev_device *udevice = udev_device_new_from_syspath(u, syspath);
- QString candidate = QString::fromLocal8Bit(udev_device_get_devnode(udevice));
- udev_device_unref(udevice);
- if (path->isEmpty() && candidate.startsWith("/dev/input/event"))
- *path = candidate;
- }
- udev_enumerate_unref(ue);
- udev_unref(u);
-}
-
void QTouchScreenHandler::readData()
{
::input_event buffer[32];
@@ -289,7 +277,7 @@ void QTouchScreenData::processInputEvent(input_event *data)
tp.state = contact.state;
combinedStates |= tp.state;
- // Store the HW coordinates. Observers can then map it to screen space or something else.
+ // Store the HW coordinates for now, will be updated later.
tp.area = QRectF(0, 0, contact.maj, contact.maj);
tp.area.moveCenter(QPoint(contact.x, contact.y));
tp.pressure = contact.pressure;
@@ -307,10 +295,8 @@ void QTouchScreenData::processInputEvent(input_event *data)
m_lastContacts = m_contacts;
m_contacts.clear();
- if (!m_touchPoints.isEmpty() && combinedStates != Qt::TouchPointStationary) {
- for (int i = 0; i < m_observers.count(); ++i)
- m_observers.at(i)->touch_point(m_touchPoints);
- }
+ if (!m_touchPoints.isEmpty() && combinedStates != Qt::TouchPointStationary)
+ reportPoints();
}
m_lastEventType = data->type;
@@ -369,10 +355,48 @@ void QTouchScreenData::assignIds()
m_contacts = newContacts;
}
+void QTouchScreenData::reportPoints()
+{
+ QRect winRect;
+ if (m_forceToActiveWindow) {
+ QWindow *win = QGuiApplication::activeWindow();
+ if (!win)
+ return;
+ winRect = win->geometry();
+ } else {
+ winRect = QGuiApplication::primaryScreen()->geometry();
+ }
+
+ const int hw_w = hw_range_x_max - hw_range_x_min;
+ const int hw_h = hw_range_y_max - hw_range_y_min;
+
+ // Map the coordinates based on the normalized position. QPA expects 'area'
+ // to be in screen coordinates.
+ const int pointCount = m_touchPoints.count();
+ for (int i = 0; i < pointCount; ++i) {
+ QWindowSystemInterface::TouchPoint &tp(m_touchPoints[i]);
+
+ // Generate a screen position that is always inside the active window
+ // or the primary screen.
+ const int wx = winRect.left() + int(tp.normalPosition.x() * winRect.width());
+ const int wy = winRect.top() + int(tp.normalPosition.y() * winRect.height());
+ const qreal sizeRatio = (winRect.width() + winRect.height()) / qreal(hw_w + hw_h);
+ tp.area = QRect(0, 0, tp.area.width() * sizeRatio, tp.area.height() * sizeRatio);
+ tp.area.moveCenter(QPoint(wx, wy));
+
+ // Calculate normalized pressure.
+ if (!hw_pressure_min && !hw_pressure_max)
+ tp.pressure = tp.state == Qt::TouchPointReleased ? 0 : 1;
+ else
+ tp.pressure = (tp.pressure - hw_pressure_min) / qreal(hw_pressure_max - hw_pressure_min);
+ }
+
+ QWindowSystemInterface::handleTouchEvent(0, m_device, m_touchPoints);
+}
+
-QTouchScreenHandlerThread::QTouchScreenHandlerThread(const QString &spec,
- QTouchScreenObserver *observer)
- : m_spec(spec), m_handler(0), m_observer(observer)
+QTouchScreenHandlerThread::QTouchScreenHandlerThread(const QString &spec)
+ : m_spec(spec), m_handler(0)
{
start();
}
@@ -386,7 +410,6 @@ QTouchScreenHandlerThread::~QTouchScreenHandlerThread()
void QTouchScreenHandlerThread::run()
{
m_handler = new QTouchScreenHandler(m_spec);
- m_handler->addObserver(m_observer);
exec();
delete m_handler;
m_handler = 0;
diff --git a/src/plugins/generic/touchscreen/qtouchscreen.h b/src/plugins/generic/evdevtouch/qevdevtouch.h
index 33a1b0ad2f..343f638526 100644
--- a/src/plugins/generic/touchscreen/qtouchscreen.h
+++ b/src/plugins/generic/evdevtouch/qevdevtouch.h
@@ -39,8 +39,8 @@
**
****************************************************************************/
-#ifndef QTOUCHSCREEN_H
-#define QTOUCHSCREEN_H
+#ifndef QEVDEVTOUCH_H
+#define QEVDEVTOUCH_H
#include <QObject>
#include <QString>
@@ -55,14 +55,6 @@ QT_BEGIN_NAMESPACE
class QSocketNotifier;
class QTouchScreenData;
-class QTouchScreenObserver
-{
-public:
- virtual void touch_configure(int x_min, int x_max, int y_min, int y_max,
- int pressure_min, int pressure_max, const QString &dev_name) = 0;
- virtual void touch_point(const QList<QWindowSystemInterface::TouchPoint> &points) = 0;
-};
-
class QTouchScreenHandler : public QObject
{
Q_OBJECT
@@ -70,13 +62,12 @@ class QTouchScreenHandler : public QObject
public:
QTouchScreenHandler(const QString &spec = QString());
~QTouchScreenHandler();
- void addObserver(QTouchScreenObserver *observer);
private slots:
void readData();
private:
- void try_udev(QString *path);
+ void pathFromUdev(QString *path);
QSocketNotifier *m_notify;
int m_fd;
@@ -86,7 +77,7 @@ private:
class QTouchScreenHandlerThread : public QThread
{
public:
- QTouchScreenHandlerThread(const QString &spec, QTouchScreenObserver *observer);
+ QTouchScreenHandlerThread(const QString &spec);
~QTouchScreenHandlerThread();
void run();
QTouchScreenHandler *handler() { return m_handler; }
@@ -94,11 +85,10 @@ public:
private:
QString m_spec;
QTouchScreenHandler *m_handler;
- QTouchScreenObserver *m_observer;
};
QT_END_NAMESPACE
QT_END_HEADER
-#endif // QTOUCHSCREEN_H
+#endif // QEVDEVTOUCH_H
diff --git a/src/plugins/generic/generic.pro b/src/plugins/generic/generic.pro
index 68c7636940..06bc0091f4 100644
--- a/src/plugins/generic/generic.pro
+++ b/src/plugins/generic/generic.pro
@@ -1,3 +1,9 @@
TEMPLATE = subdirs
linux-g++-maemo: SUBDIRS += meego
+
+contains(QT_CONFIG, evdev) {
+ contains(QT_CONFIG, libudev) {
+ SUBDIRS += evdevmouse evdevtouch evdevkeyboard
+ }
+}
diff --git a/src/plugins/generic/linuxinput/linuxinput.pro b/src/plugins/generic/linuxinput/linuxinput.pro
deleted file mode 100644
index 6ef5f0fb3a..0000000000
--- a/src/plugins/generic/linuxinput/linuxinput.pro
+++ /dev/null
@@ -1,14 +0,0 @@
-TARGET = qlinuxinputplugin
-load(qt_plugin)
-
-DESTDIR = $$QT.gui.plugins/generic
-target.path = $$[QT_INSTALL_PLUGINS]/generic
-INSTALLS += target
-
-HEADERS = qlinuxinput.h
-
-QT += core-private
-
-SOURCES = main.cpp \
- qlinuxinput.cpp
-
diff --git a/src/plugins/generic/linuxinput/qlinuxinput.cpp b/src/plugins/generic/linuxinput/qlinuxinput.cpp
deleted file mode 100644
index 04633845cb..0000000000
--- a/src/plugins/generic/linuxinput/qlinuxinput.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "qlinuxinput.h"
-
-
-#include <QSocketNotifier>
-#include <QStringList>
-#include <QPoint>
-#include <QWindowSystemInterface>
-
-#include <qplatformdefs.h>
-#include <private/qcore_unix_p.h> // overrides QT_OPEN
-
-#include <errno.h>
-#include <termios.h>
-
-#include <linux/kd.h>
-#include <linux/input.h>
-
-#include <qdebug.h>
-
-QT_BEGIN_NAMESPACE
-
-
-//#define QT_QPA_EXPERIMENTAL_TOUCHEVENT
-
-#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
-class QLinuxInputMouseHandlerData
-{
-public:
- QLinuxInputMouseHandlerData() :seenMT(false), state(QEvent::TouchBegin), currentIdx(0) {}
-
- void ensureCurrentPoint() {
- if (currentIdx >= touchPoints.size()) {
- Q_ASSERT(currentIdx == touchPoints.size());
- QWindowSystemInterface::TouchPoint tp;
- tp.id = currentIdx;
- tp.isPrimary = (currentIdx == 0);
- tp.pressure = 1;
- tp.area = QRectF(0,0,1,1);
- tp.state = Qt::TouchPointReleased; // init in neutral state
- touchPoints.append(tp);
- }
- }
- void setCurrentPoint(int i) {
- currentIdx = i;
- if (currentIdx < touchPoints.size()) {
- currentX = int(touchPoints[currentIdx].area.left());
- currentY = int(touchPoints[currentIdx].area.top());
- } else {
- currentY = currentX = -999;
- }
- }
- void advanceCurrentPoint() {
- setCurrentPoint(currentIdx + 1);
- }
- int currentPoint() { return currentIdx; }
- void setCurrentX(int value) {
- ensureCurrentPoint();
- touchPoints[currentIdx].area.moveLeft(value);
- }
- bool currentMoved() {
- return currentX != touchPoints[currentIdx].area.left() || currentY != touchPoints[currentIdx].area.top();
- }
- void updateCurrentPos() {
- ensureCurrentPoint();
- touchPoints[currentIdx].area.moveTopLeft(QPointF(currentX, currentY));
- }
- void setCurrentState(Qt::TouchPointState state) {
- ensureCurrentPoint();
- touchPoints[currentIdx].state = state;
- }
- Qt::TouchPointState currentState() const {
- if (currentIdx < touchPoints.size())
- return touchPoints[currentIdx].state;
- return Qt::TouchPointReleased;
- }
- QList<QWindowSystemInterface::TouchPoint> touchPoints;
- int currentX;
- int currentY;
- bool seenMT;
- QEvent::Type state;
-private:
- int currentIdx;
-};
-#endif
-
-
-QLinuxInputMouseHandler::QLinuxInputMouseHandler(const QString &key,
- const QString &specification)
- : m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0), m_xoffset(0), m_yoffset(0), m_buttons(0), d(0)
-{
- qDebug() << "QLinuxInputMouseHandler" << key << specification;
-
-
- setObjectName(QLatin1String("LinuxInputSubsystem Mouse Handler"));
-
- QString dev = QLatin1String("/dev/input/event0");
- m_compression = true;
- m_smooth = false;
- int jitterLimit = 0;
-
- QStringList args = specification.split(QLatin1Char(':'));
- foreach (const QString &arg, args) {
- if (arg == "nocompress")
- m_compression = false;
- else if (arg.startsWith("dejitter="))
- jitterLimit = arg.mid(9).toInt();
- else if (arg.startsWith("xoffset="))
- m_xoffset = arg.mid(8).toInt();
- else if (arg.startsWith("yoffset="))
- m_yoffset = arg.mid(8).toInt();
- else if (arg.startsWith(QLatin1String("/dev/")))
- dev = arg;
- }
- m_jitterLimitSquared = jitterLimit*jitterLimit;
-
- m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
- if (m_fd >= 0) {
- m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
- connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
- } else {
- qWarning("Cannot open mouse input device '%s': %s", qPrintable(dev), strerror(errno));
- return;
- }
-#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
- d = new QLinuxInputMouseHandlerData;
-#endif
-}
-
-
-QLinuxInputMouseHandler::~QLinuxInputMouseHandler()
-{
- if (m_fd >= 0)
- QT_CLOSE(m_fd);
-#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
- delete d;
-#endif
-}
-
-void QLinuxInputMouseHandler::sendMouseEvent(int x, int y, Qt::MouseButtons buttons)
-{
- QPoint pos(x+m_xoffset, y+m_yoffset);
- QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons);
- m_prevx = x;
- m_prevy = y;
-}
-
-void QLinuxInputMouseHandler::readMouseData()
-{
- struct ::input_event buffer[32];
- int n = 0;
- bool posChanged = false;
- bool pendingMouseEvent = false;
- int eventCompressCount = 0;
- forever {
- n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
-
- if (n == 0) {
- qWarning("Got EOF from the input device.");
- return;
- } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
- qWarning("Could not read from input device: %s", strerror(errno));
- return;
- } else if (n % sizeof(buffer[0]) == 0) {
- break;
- }
- }
-
- n /= sizeof(buffer[0]);
-
- for (int i = 0; i < n; ++i) {
- struct ::input_event *data = &buffer[i];
- //qDebug() << ">>" << hex << data->type << data->code << dec << data->value;
- bool unknown = false;
- if (data->type == EV_ABS) {
- if (data->code == ABS_X && m_x != data->value) {
- m_x = data->value;
- posChanged = true;
- } else if (data->code == ABS_Y && m_y != data->value) {
- m_y = data->value;
- posChanged = true;
- } else if (data->code == ABS_PRESSURE) {
- //ignore for now...
- } else if (data->code == ABS_TOOL_WIDTH) {
- //ignore for now...
- } else if (data->code == ABS_HAT0X) {
- //ignore for now...
- } else if (data->code == ABS_HAT0Y) {
- //ignore for now...
-#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
- } else if (data->code == ABS_MT_POSITION_X) {
- d->currentX = data->value;
- d->seenMT = true;
- } else if (data->code == ABS_MT_POSITION_Y) {
- d->currentY = data->value;
- d->seenMT = true;
- } else if (data->code == ABS_MT_TOUCH_MAJOR) {
- if (data->value == 0)
- d->setCurrentState(Qt::TouchPointReleased);
- //otherwise, ignore for now...
- } else if (data->code == ABS_MT_TOUCH_MINOR) {
- //ignore for now...
-#endif
- } else {
- unknown = true;
- }
- } else if (data->type == EV_REL) {
- if (data->code == REL_X) {
- m_x += data->value;
- posChanged = true;
- } else if (data->code == REL_Y) {
- m_y += data->value;
- posChanged = true;
- } else if (data->code == ABS_WHEEL) { // vertical scroll
- // data->value: 1 == up, -1 == down
- int delta = 120 * data->value;
- QWindowSystemInterface::handleWheelEvent(0, QPoint(m_x, m_y),
- QPoint(m_x, m_y),
- delta, Qt::Vertical);
- } else if (data->code == ABS_THROTTLE) { // horizontal scroll
- // data->value: 1 == right, -1 == left
- int delta = 120 * -data->value;
- QWindowSystemInterface::handleWheelEvent(0, QPoint(m_x, m_y),
- QPoint(m_x, m_y),
- delta, Qt::Horizontal);
- } else {
- unknown = true;
- }
- } else if (data->type == EV_KEY && data->code == BTN_TOUCH) {
- m_buttons = data->value ? Qt::LeftButton : Qt::NoButton;
-
- sendMouseEvent(m_x, m_y, m_buttons);
- pendingMouseEvent = false;
- } else if (data->type == EV_KEY && data->code >= BTN_LEFT && data->code <= BTN_MIDDLE) {
- Qt::MouseButton button = Qt::NoButton;
- switch (data->code) {
- case BTN_LEFT: button = Qt::LeftButton; break;
- case BTN_MIDDLE: button = Qt::MidButton; break;
- case BTN_RIGHT: button = Qt::RightButton; break;
- }
- if (data->value)
- m_buttons |= button;
- else
- m_buttons &= ~button;
- sendMouseEvent(m_x, m_y, m_buttons);
- pendingMouseEvent = false;
- } else if (data->type == EV_SYN && data->code == SYN_REPORT) {
- if (posChanged) {
- posChanged = false;
- if (m_compression) {
- pendingMouseEvent = true;
- eventCompressCount++;
- } else {
- sendMouseEvent(m_x, m_y, m_buttons);
- }
- }
-#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
- if (d->state == QEvent::TouchBegin && !d->seenMT) {
- //no multipoint-touch events to send
- } else {
- if (!d->seenMT)
- d->state = QEvent::TouchEnd;
-
- for (int i = d->currentPoint(); i < d->touchPoints.size(); ++i) {
- d->touchPoints[i].pressure = 0;
- d->touchPoints[i].state = Qt::TouchPointReleased;
- }
- //qDebug() << "handleTouchEvent" << d->state << d->touchPoints.size() << d->touchPoints[0].state;
- QWindowSystemInterface::handleTouchEvent(0, d->state, QTouchEvent::TouchScreen, d->touchPoints);
- if (d->seenMT) {
- d->state = QEvent::TouchUpdate;
- } else {
- d->state = QEvent::TouchBegin;
- d->touchPoints.clear();
- }
- d->setCurrentPoint(0);
- d->seenMT = false;
- }
- } else if (data->type == EV_SYN && data->code == SYN_MT_REPORT) {
- //store data for this touch point
-
- if (!d->seenMT) {
- d->setCurrentState(Qt::TouchPointReleased);
- } else if (d->currentState() == Qt::TouchPointReleased) {
- d->updateCurrentPos();
- d->setCurrentState(Qt::TouchPointPressed);
- } else if (d->currentMoved()) {
- d->updateCurrentPos();
- d->setCurrentState(Qt::TouchPointMoved);
- } else {
- d->setCurrentState(Qt::TouchPointStationary);
- }
- //qDebug() << "end of point" << d->currentPoint() << d->currentX << d->currentY << d->currentState();
-
- //advance to next tp:
- d->advanceCurrentPoint();
-#endif
- } else if (data->type == EV_MSC && data->code == MSC_SCAN) {
- // kernel encountered an unmapped key - just ignore it
- continue;
- } else {
- unknown = true;
- }
-#ifdef QLINUXINPUT_EXTRA_DEBUG
- if (unknown) {
- qWarning("unknown mouse event type=%x, code=%x, value=%x", data->type, data->code, data->value);
- }
-#endif
- }
- if (m_compression && pendingMouseEvent) {
- int distanceSquared = (m_x - m_prevx)*(m_x - m_prevx) + (m_y - m_prevy)*(m_y - m_prevy);
- if (distanceSquared > m_jitterLimitSquared)
- sendMouseEvent(m_x, m_y, m_buttons);
- }
-}
-
-
-
-
-
-
-
-QT_END_NAMESPACE
-
diff --git a/src/plugins/generic/touchscreen/README b/src/plugins/generic/touchscreen/README
deleted file mode 100644
index ac73f5f147..0000000000
--- a/src/plugins/generic/touchscreen/README
+++ /dev/null
@@ -1,45 +0,0 @@
-Generic plug-in for evdev touch events.
-
-Tested with the following drivers: bcm5974, hid_magicmouse.
-
-(1) Using as a QPA generic plug-in
-
-1. set up and connect the touch device
-2. install libudev-dev or similar
-3. build this plug-in (qmake && make)
-4. sudo cp 70-qtouchscreen.rules /etc/udev/rules.d
-5. sudo udevadm trigger --subsystem-match=input
-6. ./fingerpaint -plugin LinuxTouchScreen:force_window
-
-If automatic detection does not work, use -plugin
-LinuxTouchScreen:/dev/input/eventN to explicitly set the device file
-name.
-
-By default the surface of the touch device is mapped to the entire
-screen. If this is not desired, pass force_window in the plugin
-specification as shown in the example above. This will cause mapping
-the touch surface to the active window instead.
-
-Only touch events are generated, mouse events are not. Be aware however
-that ignored touch events will generate a mouse event from the first
-touch point by default. See AA_SynthesizeMouseForUnhandledTouchEvents.
-
-(2) Using in a compositor
-
-The classes (QTouchScreenHandler, QTouchScreenHandlerThread) are also
-suitable for direct inclusion into an application, e.g. a Wayland
-compositor. The compositor may then register its own
-QTouchScreenObserver because relying on the QTouchEvents generated by
-the QPA event sender may not always be satisfactory as some low-level
-details get lost, and due to performance reasons.
-
-(3) Possible issues and solutions
-
-The udev rule matches any touchpad device. If there are multiple ones,
-specify the device as described above.
-
-If no evdev events are read, remove 50-synaptics.conf (or similar)
-from /usr/share/X11/xorg.conf.d and restart X. Or at least temporarily
-disable the device by running xinput set-prop <device> <device enabled
-property> 0. Use xinput list and xinput list-props to figure out the
-values.
diff --git a/src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp b/src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp
deleted file mode 100644
index ac4a12c09a..0000000000
--- a/src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtoucheventsenderqpa.h"
-#include <QGuiApplication>
-#include <QScreen>
-#include <QStringList>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-QTouchEventSenderQPA::QTouchEventSenderQPA(const QString &spec)
-{
- m_forceToActiveWindow = spec.split(QLatin1Char(':')).contains(QLatin1String("force_window"));
- m_device = new QTouchDevice;
- m_device->setType(QTouchDevice::TouchScreen);
- m_device->setCapabilities(QTouchDevice::Position | QTouchDevice::Area);
- QWindowSystemInterface::registerTouchDevice(m_device);
-}
-
-void QTouchEventSenderQPA::touch_configure(int x_min, int x_max, int y_min, int y_max,
- int pressure_min, int pressure_max,
- const QString &dev_name)
-{
- hw_range_x_min = x_min;
- hw_range_x_max = x_max;
- hw_range_y_min = y_min;
- hw_range_y_max = y_max;
-
- hw_pressure_min = pressure_min;
- hw_pressure_max = pressure_max;
-
- m_device->setName(dev_name);
-
- if (hw_pressure_max > hw_pressure_min)
- m_device->setCapabilities(m_device->capabilities() | QTouchDevice::Pressure);
-}
-
-void QTouchEventSenderQPA::touch_point(const QList<QWindowSystemInterface::TouchPoint> &points)
-{
- QRect winRect;
- if (m_forceToActiveWindow) {
- QWindow *win = QGuiApplication::activeWindow();
- if (!win)
- return;
- winRect = win->geometry();
- } else {
- winRect = QGuiApplication::primaryScreen()->geometry();
- }
-
- const int hw_w = hw_range_x_max - hw_range_x_min;
- const int hw_h = hw_range_y_max - hw_range_y_min;
-
- QList<QWindowSystemInterface::TouchPoint> touchPoints = points;
- // Map the coordinates based on the normalized position. QPA expects 'area'
- // to be in screen coordinates.
- for (int i = 0; i < touchPoints.size(); ++i) {
- QWindowSystemInterface::TouchPoint &tp(touchPoints[i]);
-
- // Generate a screen position that is always inside the active window
- // or the primary screen.
- const int wx = winRect.left() + int(tp.normalPosition.x() * winRect.width());
- const int wy = winRect.top() + int(tp.normalPosition.y() * winRect.height());
- const qreal sizeRatio = (winRect.width() + winRect.height()) / qreal(hw_w + hw_h);
- tp.area = QRect(0, 0, tp.area.width() * sizeRatio, tp.area.height() * sizeRatio);
- tp.area.moveCenter(QPoint(wx, wy));
-
- // Calculate normalized pressure.
- if (!hw_pressure_min && !hw_pressure_max)
- tp.pressure = tp.state == Qt::TouchPointReleased ? 0 : 1;
- else
- tp.pressure = (tp.pressure - hw_pressure_min) / qreal(hw_pressure_max - hw_pressure_min);
- }
-
- QWindowSystemInterface::handleTouchEvent(0, m_device, touchPoints);
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/generic/touchscreen/touchscreen.pro b/src/plugins/generic/touchscreen/touchscreen.pro
deleted file mode 100644
index 60aa29c5ec..0000000000
--- a/src/plugins/generic/touchscreen/touchscreen.pro
+++ /dev/null
@@ -1,18 +0,0 @@
-TARGET = qtouchscreenplugin
-load(qt_plugin)
-
-DESTDIR = $$QT.gui.plugins/generic
-target.path = $$[QT_INSTALL_PLUGINS]/generic
-INSTALLS += target
-
-HEADERS = \
- qtouchscreen.h \
- qtoucheventsenderqpa.h
-
-SOURCES = main.cpp \
- qtouchscreen.cpp \
- qtoucheventsenderqpa.cpp
-
-QT += core-private gui-private
-
-LIBS += -ludev
diff --git a/src/plugins/imageformats/gif/gif.json b/src/plugins/imageformats/gif/gif.json
new file mode 100644
index 0000000000..b599b40ffe
--- /dev/null
+++ b/src/plugins/imageformats/gif/gif.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "gif" ]
+}
diff --git a/src/plugins/imageformats/gif/gif.pro b/src/plugins/imageformats/gif/gif.pro
index a4cde20c6f..b85ee984ac 100644
--- a/src/plugins/imageformats/gif/gif.pro
+++ b/src/plugins/imageformats/gif/gif.pro
@@ -3,6 +3,8 @@ load(qt_plugin)
include(../../../gui/image/qgifhandler.pri)
SOURCES += $$PWD/main.cpp
+HEADERS += $$PWD/main.h
+OTHER_FILES += gif.json
DESTDIR = $$QT.gui.plugins/imageformats
target.path += $$[QT_INSTALL_PLUGINS]/imageformats
diff --git a/src/plugins/imageformats/gif/main.cpp b/src/plugins/imageformats/gif/main.cpp
index 0b6c99a9e4..9dd61c4499 100644
--- a/src/plugins/imageformats/gif/main.cpp
+++ b/src/plugins/imageformats/gif/main.cpp
@@ -44,6 +44,8 @@
#ifndef QT_NO_IMAGEFORMATPLUGIN
+#include "main.h"
+
#ifdef QT_NO_IMAGEFORMAT_GIF
#undef QT_NO_IMAGEFORMAT_GIF
#endif
@@ -51,16 +53,6 @@
QT_BEGIN_NAMESPACE
-class QGifPlugin : public QImageIOPlugin
-{
-public:
- QGifPlugin();
- ~QGifPlugin();
-
- QStringList keys() const;
- Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
- QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
-};
QGifPlugin::QGifPlugin()
{
@@ -90,9 +82,6 @@ QImageIOHandler *QGifPlugin::create(QIODevice *device, const QByteArray &format)
return handler;
}
-Q_EXPORT_STATIC_PLUGIN(QGifPlugin)
-Q_EXPORT_PLUGIN2(qgif, QGifPlugin)
-
#endif // QT_NO_IMAGEFORMATPLUGIN
QT_END_NAMESPACE
diff --git a/src/plugins/imageformats/gif/main.h b/src/plugins/imageformats/gif/main.h
new file mode 100644
index 0000000000..97335b1968
--- /dev/null
+++ b/src/plugins/imageformats/gif/main.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qstringlist.h>
+
+#ifdef QT_NO_IMAGEFORMAT_GIF
+#undef QT_NO_IMAGEFORMAT_GIF
+#endif
+#include <qgifhandler_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QGifPlugin : public QImageIOPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "gif.json")
+public:
+ QGifPlugin();
+ ~QGifPlugin();
+
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QT_END_NAMESPACE
diff --git a/src/plugins/imageformats/ico/ico.json b/src/plugins/imageformats/ico/ico.json
new file mode 100644
index 0000000000..d22cb739a1
--- /dev/null
+++ b/src/plugins/imageformats/ico/ico.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "ico" ]
+}
diff --git a/src/plugins/imageformats/ico/ico.pro b/src/plugins/imageformats/ico/ico.pro
index c0972fe189..242e42b869 100644
--- a/src/plugins/imageformats/ico/ico.pro
+++ b/src/plugins/imageformats/ico/ico.pro
@@ -3,9 +3,10 @@ load(qt_plugin)
QTDIR_build:REQUIRES = "!contains(QT_CONFIG, no-ico)"
-HEADERS += qicohandler.h
+HEADERS += qicohandler.h main.h
SOURCES += main.cpp \
qicohandler.cpp
+OTHER_FILES += ico.json
DESTDIR = $$QT.gui.plugins/imageformats
target.path += $$[QT_INSTALL_PLUGINS]/imageformats
diff --git a/src/plugins/imageformats/ico/main.cpp b/src/plugins/imageformats/ico/main.cpp
index 5ebb24d06e..9c9525f48f 100644
--- a/src/plugins/imageformats/ico/main.cpp
+++ b/src/plugins/imageformats/ico/main.cpp
@@ -39,26 +39,12 @@
**
****************************************************************************/
-#include <qimageiohandler.h>
-#include <qdebug.h>
+#include "main.h"
#ifndef QT_NO_IMAGEFORMATPLUGIN
-#ifdef QT_NO_IMAGEFORMAT_ICO
-#undef QT_NO_IMAGEFORMAT_ICO
-#endif
-#include "qicohandler.h"
-
QT_BEGIN_NAMESPACE
-class QICOPlugin : public QImageIOPlugin
-{
-public:
- QStringList keys() const;
- Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
- QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
-};
-
QStringList QICOPlugin::keys() const
{
return QStringList() << QLatin1String("ico");
@@ -89,8 +75,6 @@ QImageIOHandler *QICOPlugin::create(QIODevice *device, const QByteArray &format)
return handler;
}
-Q_EXPORT_PLUGIN2(qico, QICOPlugin)
-
QT_END_NAMESPACE
#endif /* QT_NO_IMAGEFORMATPLUGIN */
diff --git a/src/plugins/imageformats/ico/main.h b/src/plugins/imageformats/ico/main.h
new file mode 100644
index 0000000000..6c7634002a
--- /dev/null
+++ b/src/plugins/imageformats/ico/main.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qdebug.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_ICO
+#undef QT_NO_IMAGEFORMAT_ICO
+#endif
+#include "qicohandler.h"
+
+QT_BEGIN_NAMESPACE
+
+class QICOPlugin : public QImageIOPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "ico.json")
+public:
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/imageformats/jpeg/jpeg.json b/src/plugins/imageformats/jpeg/jpeg.json
new file mode 100644
index 0000000000..132c642c05
--- /dev/null
+++ b/src/plugins/imageformats/jpeg/jpeg.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "jpg", "jpeg" ]
+}
diff --git a/src/plugins/imageformats/jpeg/jpeg.pro b/src/plugins/imageformats/jpeg/jpeg.pro
index aa489729a1..f2a41129d5 100644
--- a/src/plugins/imageformats/jpeg/jpeg.pro
+++ b/src/plugins/imageformats/jpeg/jpeg.pro
@@ -7,6 +7,8 @@ QTDIR_build:REQUIRES = "!contains(QT_CONFIG, no-jpeg)"
include(../../../gui/image/qjpeghandler.pri)
SOURCES += main.cpp
+HEADERS += main.h
+OTHER_FILES += jpeg.json
DESTDIR = $$QT.gui.plugins/imageformats
target.path += $$[QT_INSTALL_PLUGINS]/imageformats
diff --git a/src/plugins/imageformats/jpeg/main.cpp b/src/plugins/imageformats/jpeg/main.cpp
index beb3970af1..ecda04864b 100644
--- a/src/plugins/imageformats/jpeg/main.cpp
+++ b/src/plugins/imageformats/jpeg/main.cpp
@@ -39,8 +39,7 @@
**
****************************************************************************/
-#include <qimageiohandler.h>
-#include <qstringlist.h>
+#include "main.h"
#ifndef QT_NO_IMAGEFORMATPLUGIN
@@ -51,14 +50,6 @@
QT_BEGIN_NAMESPACE
-class QJpegPlugin : public QImageIOPlugin
-{
-public:
- QStringList keys() const;
- Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
- QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
-};
-
QStringList QJpegPlugin::keys() const
{
return QStringList() << QLatin1String("jpeg") << QLatin1String("jpg");
@@ -89,9 +80,6 @@ QImageIOHandler *QJpegPlugin::create(QIODevice *device, const QByteArray &format
return handler;
}
-Q_EXPORT_STATIC_PLUGIN(QJpegPlugin)
-Q_EXPORT_PLUGIN2(qjpeg, QJpegPlugin)
-
QT_END_NAMESPACE
#endif // QT_NO_IMAGEFORMATPLUGIN
diff --git a/src/plugins/imageformats/jpeg/main.h b/src/plugins/imageformats/jpeg/main.h
new file mode 100644
index 0000000000..8606eabdd9
--- /dev/null
+++ b/src/plugins/imageformats/jpeg/main.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_JPEG
+#undef QT_NO_IMAGEFORMAT_JPEG
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QJpegPlugin : public QImageIOPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "jpeg.json")
+public:
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
index 5840415ded..5579b4cd26 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
@@ -103,7 +103,7 @@ bool QIBusPlatformInputContext::isValid() const
return d->valid;
}
-void QIBusPlatformInputContext::invokeAction(QInputMethod::Action a, int x)
+void QIBusPlatformInputContext::invokeAction(QInputMethod::Action a, int)
{
if (!d->valid)
return;
diff --git a/src/plugins/platforminputcontexts/maliit/qmaliitplatforminputcontext.cpp b/src/plugins/platforminputcontexts/maliit/qmaliitplatforminputcontext.cpp
index bd3b914f15..dbb4e6e650 100644
--- a/src/plugins/platforminputcontexts/maliit/qmaliitplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/maliit/qmaliitplatforminputcontext.cpp
@@ -287,7 +287,7 @@ void QMaliitPlatformInputContext::activationLostEvent()
d->visibility = InputPanelHidden;
}
-void QMaliitPlatformInputContext::commitString(const QString &string, int replacementStart, int replacementLength, int cursorPos)
+void QMaliitPlatformInputContext::commitString(const QString &string, int replacementStart, int replacementLength, int /* cursorPos */)
{
QObject *input = qApp->inputMethod()->inputItem();
if (!input)
diff --git a/src/plugins/platforms/cocoa/cocoa.json b/src/plugins/platforms/cocoa/cocoa.json
new file mode 100644
index 0000000000..520c4f5a50
--- /dev/null
+++ b/src/plugins/platforms/cocoa/cocoa.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "cocoa" ]
+}
diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro
index 09b708d9a1..45dd3525d5 100644
--- a/src/plugins/platforms/cocoa/cocoa.pro
+++ b/src/plugins/platforms/cocoa/cocoa.pro
@@ -23,7 +23,9 @@ OBJECTIVE_SOURCES += main.mm \
qmultitouch_mac.mm \
qcocoaaccessibilityelement.mm \
qcocoaaccessibility.mm \
+ qcocoacolordialoghelper.mm \
qcocoafiledialoghelper.mm \
+ qcocoafontdialoghelper.mm \
qcocoacursor.mm \
HEADERS += qcocoaintegration.h \
@@ -45,7 +47,9 @@ HEADERS += qcocoaintegration.h \
qmultitouch_mac_p.h \
qcocoaaccessibilityelement.h \
qcocoaaccessibility.h \
+ qcocoacolordialoghelper.h \
qcocoafiledialoghelper.h \
+ qcocoafontdialoghelper.h \
qcocoacursor.h \
FORMS += $$PWD/../../../widgets/dialogs/qfiledialog.ui
@@ -55,6 +59,7 @@ LIBS += -framework Cocoa
QT += core-private gui-private widgets-private platformsupport-private
+OTHER_FILES += cocoa.json
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/cocoa/main.mm b/src/plugins/platforms/cocoa/main.mm
index 334a1fefc3..9857a4e177 100644
--- a/src/plugins/platforms/cocoa/main.mm
+++ b/src/plugins/platforms/cocoa/main.mm
@@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE
class QCocoaIntegrationPlugin : public QPlatformIntegrationPlugin
{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPlatformIntegrationFactoryInterface" FILE "cocoa.json")
public:
QStringList keys() const;
QPlatformIntegration *create(const QString&, const QStringList&);
@@ -71,6 +73,6 @@ QPlatformIntegration * QCocoaIntegrationPlugin::create(const QString& system, co
return 0;
}
-Q_EXPORT_PLUGIN2(CocoaIntegration, QCocoaIntegrationPlugin)
-
QT_END_NAMESPACE
+
+#include "main.moc"
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h
new file mode 100644
index 0000000000..505fd4f111
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOCOACOLORDIALOGHELPER_H
+#define QCOCOACOLORDIALOGHELPER_H
+
+#include <QObject>
+#include <qplatformdialoghelper_qpa.h>
+
+QT_BEGIN_NAMESPACE
+
+class QCocoaColorDialogHelper : public QPlatformColorDialogHelper
+{
+public:
+ QCocoaColorDialogHelper();
+ virtual ~QCocoaColorDialogHelper();
+
+ void platformNativeDialogModalHelp();
+ void _q_platformRunNativeAppModalPanel();
+ void deleteNativeDialog_sys();
+ bool show_sys(QFlags<QPlatformDialogHelper::ShowFlag>, Qt::WindowFlags, QWindow*);
+ void hide_sys();
+
+ DialogCode dialogResultCode_sys();
+ void setCurrentColor_sys(const QColor&);
+ QColor currentColor_sys() const;
+
+public:
+ bool showCocoaColorPanel(QWindow *parent);
+ bool hideCocoaColorPanel();
+
+ void createNSColorPanelDelegate();
+
+private:
+ void *mDelegate;
+};
+
+QT_END_NAMESPACE
+
+#endif // QCOCOACOLORDIALOGHELPER_H
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
new file mode 100644
index 0000000000..bfc626fdba
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
@@ -0,0 +1,464 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcocoacolordialoghelper.h"
+
+#ifndef QT_NO_COLORDIALOG
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qtimer.h>
+#include <QtWidgets/qdialogbuttonbox.h>
+#include <QtWidgets/qcolordialog.h>
+
+#include "qcocoahelpers.h"
+
+#import <AppKit/AppKit.h>
+
+QT_USE_NAMESPACE
+
+static NSButton *macCreateButton(const char *text, NSView *superview)
+{
+ static const NSRect buttonFrameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
+
+ NSButton *button = [[NSButton alloc] initWithFrame:buttonFrameRect];
+ [button setButtonType:NSMomentaryLightButton];
+ [button setBezelStyle:NSRoundedBezelStyle];
+ [button setTitle:(NSString*)(CFStringRef)QCFString(QDialogButtonBox::tr(text)
+ .remove(QLatin1Char('&')))];
+ [[button cell] setFont:[NSFont systemFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
+ [superview addSubview:button];
+ return button;
+}
+
+@class QT_MANGLE_NAMESPACE(QNSColorPanelDelegate);
+
+@interface QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) : NSObject<NSWindowDelegate>
+{
+ @public
+ NSColorPanel *mColorPanel;
+ QCocoaColorDialogHelper *mHelper;
+ NSView *mStolenContentView;
+ NSButton *mOkButton;
+ NSButton *mCancelButton;
+ QColor mQtColor;
+ NSInteger mResultCode;
+ BOOL mDialogIsExecuting;
+ BOOL mResultSet;
+};
+- (void)relayout;
+- (void)updateQtColor;
+- (void)finishOffWithCode:(NSInteger)code;
+@end
+
+@implementation QT_MANGLE_NAMESPACE(QNSColorPanelDelegate)
+
+- (id)initWithDialogHelper:(QCocoaColorDialogHelper *)helper
+{
+ self = [super init];
+ mColorPanel = [NSColorPanel sharedColorPanel];
+ mHelper = helper;
+ mResultCode = NSCancelButton;
+ mDialogIsExecuting = false;
+ mResultSet = false;
+
+ if (mHelper->options()->testOption(QColorDialogOptions::NoButtons)) {
+ mStolenContentView = 0;
+ mOkButton = 0;
+ mCancelButton = 0;
+ } else {
+ // steal the color panel's contents view
+ mStolenContentView = [mColorPanel contentView];
+ [mStolenContentView retain];
+ [mColorPanel setContentView:0];
+
+ // create a new content view and add the stolen one as a subview
+ NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
+ NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect];
+ [ourContentView addSubview:mStolenContentView];
+
+ // create OK and Cancel buttons and add these as subviews
+ mOkButton = macCreateButton("&OK", ourContentView);
+ mCancelButton = macCreateButton("Cancel", ourContentView);
+
+ [mColorPanel setContentView:ourContentView];
+ [mColorPanel setDefaultButtonCell:[mOkButton cell]];
+ [self relayout];
+
+ [mOkButton setAction:@selector(onOkClicked)];
+ [mOkButton setTarget:self];
+
+ [mCancelButton setAction:@selector(onCancelClicked)];
+ [mCancelButton setTarget:self];
+ }
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(colorChanged:)
+ name:NSColorPanelColorDidChangeNotification
+ object:mColorPanel];
+
+ [mColorPanel retain];
+ return self;
+}
+
+- (void)dealloc
+{
+ if (mOkButton) {
+ NSView *ourContentView = [mColorPanel contentView];
+
+ // return stolen stuff to its rightful owner
+ [mStolenContentView removeFromSuperview];
+ [mColorPanel setContentView:mStolenContentView];
+ [mOkButton release];
+ [mCancelButton release];
+ [ourContentView release];
+ }
+
+ [mColorPanel setDelegate:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [super dealloc];
+}
+
+- (void)closePanel
+{
+ [mColorPanel close];
+}
+
+- (void)windowDidResize:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ [self relayout];
+}
+
+- (void)colorChanged:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ [self updateQtColor];
+ emit mHelper->colorSelected(mQtColor);
+}
+
+- (void)relayout
+{
+ if (!mOkButton)
+ return;
+
+ NSRect rect = [[mStolenContentView superview] frame];
+
+ // should a priori be kept in sync with qfontdialog_mac.mm
+ const CGFloat ButtonMinWidth = 78.0; // 84.0 for Carbon
+ const CGFloat ButtonMinHeight = 32.0;
+ const CGFloat ButtonSpacing = 0.0;
+ const CGFloat ButtonTopMargin = 0.0;
+ const CGFloat ButtonBottomMargin = 7.0;
+ const CGFloat ButtonSideMargin = 9.0;
+
+ [mOkButton sizeToFit];
+ NSSize okSizeHint = [mOkButton frame].size;
+
+ [mCancelButton sizeToFit];
+ NSSize cancelSizeHint = [mCancelButton frame].size;
+
+ const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth,
+ qMax(okSizeHint.width, cancelSizeHint.width)),
+ CGFloat((rect.size.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5));
+ const CGFloat ButtonHeight = qMax(ButtonMinHeight,
+ qMax(okSizeHint.height, cancelSizeHint.height));
+
+ NSRect okRect = { { rect.size.width - ButtonSideMargin - ButtonWidth,
+ ButtonBottomMargin },
+ { ButtonWidth, ButtonHeight } };
+ [mOkButton setFrame:okRect];
+ [mOkButton setNeedsDisplay:YES];
+
+ NSRect cancelRect = { { okRect.origin.x - ButtonSpacing - ButtonWidth,
+ ButtonBottomMargin },
+ { ButtonWidth, ButtonHeight } };
+ [mCancelButton setFrame:cancelRect];
+ [mCancelButton setNeedsDisplay:YES];
+
+ const CGFloat Y = ButtonBottomMargin + ButtonHeight + ButtonTopMargin;
+ NSRect stolenCVRect = { { 0.0, Y },
+ { rect.size.width, rect.size.height - Y } };
+ [mStolenContentView setFrame:stolenCVRect];
+ [mStolenContentView setNeedsDisplay:YES];
+
+ [[mStolenContentView superview] setNeedsDisplay:YES];
+}
+
+- (void)onOkClicked
+{
+ [mColorPanel close];
+ [self updateQtColor];
+ [self finishOffWithCode:NSOKButton];
+}
+
+- (void)onCancelClicked
+{
+ if (mOkButton) {
+ [mColorPanel close];
+ mQtColor = QColor();
+ [self finishOffWithCode:NSCancelButton];
+ }
+}
+
+- (void)updateQtColor
+{
+ NSColor *color = [mColorPanel color];
+ NSString *colorSpaceName = [color colorSpaceName];
+ if (colorSpaceName == NSDeviceCMYKColorSpace) {
+ CGFloat cyan = 0, magenta = 0, yellow = 0, black = 0, alpha = 0;
+ [color getCyan:&cyan magenta:&magenta yellow:&yellow black:&black alpha:&alpha];
+ mQtColor.setCmykF(cyan, magenta, yellow, black, alpha);
+ } else if (colorSpaceName == NSCalibratedRGBColorSpace || colorSpaceName == NSDeviceRGBColorSpace) {
+ CGFloat red = 0, green = 0, blue = 0, alpha = 0;
+ [color getRed:&red green:&green blue:&blue alpha:&alpha];
+ mQtColor.setRgbF(red, green, blue, alpha);
+ } else if (colorSpaceName == NSNamedColorSpace) {
+ NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
+ CGFloat red = 0, green = 0, blue = 0, alpha = 0;
+ [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
+ mQtColor.setRgbF(red, green, blue, alpha);
+ } else {
+ NSColorSpace *colorSpace = [color colorSpace];
+ if ([colorSpace colorSpaceModel] == NSCMYKColorSpaceModel && [color numberOfComponents] == 5){
+ CGFloat components[5];
+ [color getComponents:components];
+ mQtColor.setCmykF(components[0], components[1], components[2], components[3], components[4]);
+ } else {
+ NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
+ CGFloat red = 0, green = 0, blue = 0, alpha = 0;
+ [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
+ mQtColor.setRgbF(red, green, blue, alpha);
+ }
+ }
+ emit mHelper->currentColorChanged(mQtColor);
+}
+
+- (void)showModelessPanel
+{
+ mDialogIsExecuting = false;
+ [mColorPanel makeKeyAndOrderFront:mColorPanel];
+}
+
+- (BOOL)runApplicationModalPanel
+{
+ mDialogIsExecuting = true;
+ [mColorPanel setDelegate:self];
+ [mColorPanel setContinuous:YES];
+ [NSApp runModalForWindow:mColorPanel];
+ return (mResultCode == NSOKButton);
+}
+
+- (QT_PREPEND_NAMESPACE(QPlatformDialogHelper::DialogCode))dialogResultCode
+{
+ return (mResultCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Accepted) : QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Rejected);
+}
+
+- (BOOL)windowShouldClose:(id)window
+{
+ Q_UNUSED(window);
+ if (!mOkButton)
+ [self updateQtColor];
+ if (mDialogIsExecuting) {
+ [self finishOffWithCode:NSCancelButton];
+ } else {
+ mResultSet = true;
+ emit mHelper->reject();
+ }
+ return true;
+}
+
+- (void)finishOffWithCode:(NSInteger)code
+{
+ mResultCode = code;
+ if (mDialogIsExecuting) {
+ // We stop the current modal event loop. The control
+ // will then return inside -(void)exec below.
+ // It's important that the modal event loop is stopped before
+ // we accept/reject QColorDialog, since QColorDialog has its
+ // own event loop that needs to be stopped last.
+ [NSApp stopModalWithCode:code];
+ } else {
+ // Since we are not in a modal event loop, we can safely close
+ // down QColorDialog
+ // Calling accept() or reject() can in turn call closeCocoaColorPanel.
+ // This check will prevent any such recursion.
+ if (!mResultSet) {
+ mResultSet = true;
+ if (mResultCode == NSCancelButton) {
+ emit mHelper->reject();
+ } else {
+ emit mHelper->accept();
+ }
+ }
+ }
+}
+
+@end
+
+QT_BEGIN_NAMESPACE
+
+QCocoaColorDialogHelper::QCocoaColorDialogHelper() :
+ mDelegate(0)
+{
+}
+
+QCocoaColorDialogHelper::~QCocoaColorDialogHelper()
+{
+ deleteNativeDialog_sys();
+}
+
+void QCocoaColorDialogHelper::platformNativeDialogModalHelp()
+{
+ // Do a queued meta-call to open the native modal dialog so it opens after the new
+ // event loop has started to execute (in QDialog::exec). Using a timer rather than
+ // a queued meta call is intentional to ensure that the call is only delivered when
+ // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
+ // running (which is the case if e.g a top-most QEventLoop has been
+ // interrupted, and the second-most event loop has not yet been reactivated (regardless
+ // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
+ QTimer::singleShot(1, this, SIGNAL(launchNativeAppModalPanel()));
+}
+
+void QCocoaColorDialogHelper::_q_platformRunNativeAppModalPanel()
+{
+ // TODO:
+#if 0
+ QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
+#endif
+ QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate);
+ [delegate runApplicationModalPanel];
+ if (dialogResultCode_sys() == QPlatformDialogHelper::Accepted)
+ emit accept();
+ else
+ emit reject();
+}
+
+void QCocoaColorDialogHelper::deleteNativeDialog_sys()
+{
+ if (!mDelegate)
+ return;
+ [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate) release];
+ mDelegate = 0;
+}
+
+bool QCocoaColorDialogHelper::show_sys(QFlags<QPlatformDialogHelper::ShowFlag>, Qt::WindowFlags, QWindow *parent)
+{
+ return showCocoaColorPanel(parent);
+}
+
+void QCocoaColorDialogHelper::hide_sys()
+{
+ if (!mDelegate)
+ return;
+ [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate)->mColorPanel close];
+}
+
+QCocoaColorDialogHelper::DialogCode QCocoaColorDialogHelper::dialogResultCode_sys()
+{
+ QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate);
+ return [delegate dialogResultCode];
+}
+
+void QCocoaColorDialogHelper::setCurrentColor_sys(const QColor &color)
+{
+ if (!mDelegate)
+ createNSColorPanelDelegate();
+ QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate);
+ NSColor *nsColor;
+ const QColor::Spec spec = color.spec();
+ if (spec == QColor::Cmyk) {
+ nsColor = [NSColor colorWithDeviceCyan:color.cyanF()
+ magenta:color.magentaF()
+ yellow:color.yellowF()
+ black:color.blackF()
+ alpha:color.alphaF()];
+ } else {
+ nsColor = [NSColor colorWithCalibratedRed:color.redF()
+ green:color.greenF()
+ blue:color.blueF()
+ alpha:color.alphaF()];
+ }
+ delegate->mQtColor = color;
+ [delegate->mColorPanel setColor:nsColor];
+}
+
+QColor QCocoaColorDialogHelper::currentColor_sys() const
+{
+ return reinterpret_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate)->mQtColor;
+}
+
+void QCocoaColorDialogHelper::createNSColorPanelDelegate()
+{
+ if (mDelegate)
+ return;
+
+ QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) alloc]
+ initWithDialogHelper:this];
+
+ mDelegate = delegate;
+}
+
+bool QCocoaColorDialogHelper::showCocoaColorPanel(QWindow *parent)
+{
+ Q_UNUSED(parent);
+ createNSColorPanelDelegate();
+ QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate);
+ [delegate->mColorPanel setShowsAlpha:options()->testOption(QColorDialogOptions::ShowAlphaChannel)];
+ [delegate showModelessPanel];
+ return true;
+}
+
+bool QCocoaColorDialogHelper::hideCocoaColorPanel()
+{
+ if (!mDelegate){
+ return false;
+ } else {
+ QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate);
+ [delegate closePanel];
+ return true;
+ }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_COLORDIALOG
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 6de22cf58c..305a8ddc95 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -569,6 +569,7 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
}
retVal = true;
} else {
+ int lastSerialCopy = d->lastSerial;
bool hadModalSession = d->currentModalSessionCached != 0;
// We cannot block the thread (and run in a tight loop).
// Instead we will process all current pending events and return.
@@ -631,6 +632,14 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
}
} while (!d->interrupt && event != nil);
+ if ((flags & QEventLoop::WaitForMoreEvents) == 0) {
+ // when called "manually", always send posted events
+ d->processPostedEvents();
+ }
+
+ // be sure to return true if the posted event source fired
+ retVal = retVal || lastSerialCopy != d->lastSerial;
+
// Since the window that holds modality might have changed while processing
// events, we we need to interrupt when we return back the previous process
// event recursion to ensure that we spin the correct modal session.
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h
new file mode 100644
index 0000000000..8a914bf632
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOCOAFONTDIALOGHELPER_H
+#define QCOCOAFONTDIALOGHELPER_H
+
+#include <QObject>
+#include <qplatformdialoghelper_qpa.h>
+
+QT_BEGIN_NAMESPACE
+
+class QFontDialog;
+class QFontDialogPrivate;
+
+class QCocoaFontDialogHelper : public QPlatformFontDialogHelper
+{
+public:
+ QCocoaFontDialogHelper();
+ virtual ~QCocoaFontDialogHelper();
+
+ void platformNativeDialogModalHelp();
+ void _q_platformRunNativeAppModalPanel();
+ void deleteNativeDialog_sys();
+
+ bool show_sys(ShowFlags showFlags, Qt::WindowFlags windowFlags, QWindow *parent);
+ void hide_sys();
+
+ QPlatformDialogHelper::DialogCode dialogResultCode_sys();
+
+ void setCurrentFont_sys(const QFont &);
+ QFont currentFont_sys() const;
+
+protected:
+ void createNSFontPanelDelegate();
+ bool showCocoaFontPanel(QWindow *parent);
+ bool hideCocoaFontPanel();
+
+private:
+ void *mDelegate;
+};
+
+QT_END_NAMESPACE
+
+#endif // QCOCOAFONTDIALOGHELPER_H
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
new file mode 100644
index 0000000000..d05a0156b1
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
@@ -0,0 +1,487 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcocoafontdialoghelper.h"
+
+#ifndef QT_NO_FONTDIALOG
+
+#include <QtCore/qtimer.h>
+#include <QtGui/qfontdatabase.h>
+#include <QtWidgets/qdialogbuttonbox.h>
+#include <QtWidgets/qfontdialog.h>
+
+#include <private/qfont_p.h>
+#include <private/qfontengine_p.h>
+#include <private/qfontengine_coretext_p.h>
+
+#include "qcocoahelpers.h"
+
+#import <AppKit/AppKit.h>
+
+#if !CGFLOAT_DEFINED
+typedef float CGFloat; // Should only not be defined on 32-bit platforms
+#endif
+
+QT_USE_NAMESPACE
+
+// should a priori be kept in sync with qcolordialog_mac.mm
+const CGFloat ButtonMinWidth = 78.0;
+const CGFloat ButtonMinHeight = 32.0;
+const CGFloat ButtonSpacing = 0.0;
+const CGFloat ButtonTopMargin = 0.0;
+const CGFloat ButtonBottomMargin = 7.0;
+const CGFloat ButtonSideMargin = 9.0;
+
+// looks better with some margins
+const CGFloat DialogTopMargin = 7.0;
+const CGFloat DialogSideMargin = 9.0;
+
+static NSButton *macCreateButton(const char *text, NSView *superview)
+{
+ static const NSRect buttonFrameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
+
+ NSButton *button = [[NSButton alloc] initWithFrame:buttonFrameRect];
+ [button setButtonType:NSMomentaryLightButton];
+ [button setBezelStyle:NSRoundedBezelStyle];
+ [button setTitle:(NSString*)(CFStringRef)QCFString(QDialogButtonBox::tr(text)
+ .remove(QLatin1Char('&')))];
+ [[button cell] setFont:[NSFont systemFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
+ [superview addSubview:button];
+ return button;
+}
+
+static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont)
+{
+ QFont newFont;
+ if (cocoaFont) {
+ int pSize = qRound([cocoaFont pointSize]);
+ QString family(QCFString::toQString([cocoaFont familyName]));
+ QString typeface(QCFString::toQString([cocoaFont fontName]));
+
+ int hyphenPos = typeface.indexOf(QLatin1Char('-'));
+ if (hyphenPos != -1) {
+ typeface.remove(0, hyphenPos + 1);
+ } else {
+ typeface = QLatin1String("Normal");
+ }
+
+ newFont = QFontDatabase().font(family, typeface, pSize);
+ newFont.setUnderline(resolveFont.underline());
+ newFont.setStrikeOut(resolveFont.strikeOut());
+
+ }
+ return newFont;
+}
+
+@class QT_MANGLE_NAMESPACE(QNSFontPanelDelegate);
+
+@interface QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) : NSObject<NSWindowDelegate>
+{
+ @public
+ NSFontPanel *mFontPanel;
+ QCocoaFontDialogHelper *mHelper;
+ NSView *mStolenContentView;
+ NSButton *mOkButton;
+ NSButton *mCancelButton;
+ QFont mQtFont;
+ NSInteger mResultCode;
+ BOOL mDialogIsExecuting;
+ BOOL mResultSet;
+};
+- (void)relayout;
+- (void)relayoutToContentSize:(NSSize)frameSize;
+- (void)updateQtFont;
+- (void)changeFont:(id)sender;
+- (void)finishOffWithCode:(NSInteger)code;
+@end
+
+@implementation QT_MANGLE_NAMESPACE(QNSFontPanelDelegate)
+
+- (id)initWithDialogHelper:
+ (QCocoaFontDialogHelper *)helper
+{
+ self = [super init];
+ mFontPanel = [NSFontPanel sharedFontPanel];
+ mHelper = helper;
+ mResultCode = NSCancelButton;
+ mDialogIsExecuting = false;
+ mResultSet = false;
+
+ [mFontPanel setTitle:QCFString::toNSString(helper->options()->windowTitle())];
+
+ if (mHelper->options()->testOption(QFontDialogOptions::NoButtons)) {
+ mStolenContentView = 0;
+ mOkButton = 0;
+ mCancelButton = 0;
+ } else {
+ // steal the font panel's contents view
+ mStolenContentView = [mFontPanel contentView];
+ [mStolenContentView retain];
+ [mFontPanel setContentView:0];
+
+ // create a new content view and add the stolen one as a subview
+ NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
+ NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect];
+ [ourContentView addSubview:mStolenContentView];
+
+ // create OK and Cancel buttons and add these as subviews
+ mOkButton = macCreateButton("&OK", ourContentView);
+ mCancelButton = macCreateButton("Cancel", ourContentView);
+
+ [mFontPanel setContentView:ourContentView];
+ [mFontPanel setDefaultButtonCell:[mOkButton cell]];
+ [self relayoutToContentSize:[[mStolenContentView superview] frame].size];
+
+ [mOkButton setAction:@selector(onOkClicked)];
+ [mOkButton setTarget:self];
+
+ [mCancelButton setAction:@selector(onCancelClicked)];
+ [mCancelButton setTarget:self];
+ }
+
+ [mFontPanel retain];
+ return self;
+}
+
+- (void)dealloc
+{
+ if (mOkButton) {
+ NSView *ourContentView = [mFontPanel contentView];
+
+ // return stolen stuff to its rightful owner
+ [mStolenContentView removeFromSuperview];
+ [mFontPanel setContentView:mStolenContentView];
+ [mOkButton release];
+ [mCancelButton release];
+ [ourContentView release];
+ }
+
+ [mFontPanel setDelegate:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [super dealloc];
+}
+
+- (void)closePanel
+{
+ [mFontPanel close];
+}
+
+- (void)windowDidResize:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ if (mOkButton)
+ [self relayout];
+}
+
+- (void)relayout
+{
+ [self relayoutToContentSize:[[mStolenContentView superview] frame].size];
+}
+
+- (void)relayoutToContentSize:(NSSize)frameSize
+{
+ Q_ASSERT(mOkButton);
+
+ [mOkButton sizeToFit];
+ NSSize okSizeHint = [mOkButton frame].size;
+
+ [mCancelButton sizeToFit];
+ NSSize cancelSizeHint = [mCancelButton frame].size;
+
+ const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth,
+ qMax(okSizeHint.width, cancelSizeHint.width)),
+ CGFloat((frameSize.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5));
+ const CGFloat ButtonHeight = qMax(ButtonMinHeight,
+ qMax(okSizeHint.height, cancelSizeHint.height));
+
+ const CGFloat X = DialogSideMargin;
+ const CGFloat Y = ButtonBottomMargin + ButtonHeight + ButtonTopMargin;
+
+ NSRect okRect = { { frameSize.width - ButtonSideMargin - ButtonWidth,
+ ButtonBottomMargin },
+ { ButtonWidth, ButtonHeight } };
+ [mOkButton setFrame:okRect];
+ [mOkButton setNeedsDisplay:YES];
+
+ NSRect cancelRect = { { okRect.origin.x - ButtonSpacing - ButtonWidth,
+ ButtonBottomMargin },
+ { ButtonWidth, ButtonHeight } };
+ [mCancelButton setFrame:cancelRect];
+ [mCancelButton setNeedsDisplay:YES];
+
+ NSRect stolenCVRect = { { X, Y },
+ { frameSize.width - X - X, frameSize.height - Y - DialogTopMargin } };
+ [mStolenContentView setFrame:stolenCVRect];
+ [mStolenContentView setNeedsDisplay:YES];
+
+ [[mStolenContentView superview] setNeedsDisplay:YES];
+}
+
+
+- (void)onOkClicked
+{
+ [mFontPanel close];
+ [self finishOffWithCode:NSOKButton];
+}
+
+- (void)onCancelClicked
+{
+ if (mOkButton) {
+ [mFontPanel close];
+ mQtFont = QFont();
+ [self finishOffWithCode:NSCancelButton];
+ }
+}
+
+- (void)changeFont:(id)sender
+{
+ Q_UNUSED(sender);
+ [self updateQtFont];
+}
+
+- (void)updateQtFont
+{
+ // Get selected font
+ NSFontManager *fontManager = [NSFontManager sharedFontManager];
+ NSFont *selectedFont = [fontManager selectedFont];
+ if (selectedFont == nil) {
+ selectedFont = [NSFont systemFontOfSize:[NSFont systemFontSize]];
+ }
+ NSFont *panelFont = [fontManager convertFont:selectedFont];
+ mQtFont = qfontForCocoaFont(panelFont, mQtFont);
+
+ emit mHelper->currentFontChanged(mQtFont);
+}
+
+- (void)showModelessPanel
+{
+ mDialogIsExecuting = false;
+ [mFontPanel makeKeyAndOrderFront:mFontPanel];
+}
+
+- (BOOL)runApplicationModalPanel
+{
+ mDialogIsExecuting = true;
+ [mFontPanel setDelegate:self];
+ [NSApp runModalForWindow:mFontPanel];
+ return (mResultCode == NSOKButton);
+}
+
+- (QT_PREPEND_NAMESPACE(QPlatformDialogHelper::DialogCode))dialogResultCode
+{
+ return (mResultCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Accepted) : QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Rejected);
+}
+
+- (BOOL)windowShouldClose:(id)window
+{
+ Q_UNUSED(window);
+ if (!mOkButton)
+ [self updateQtFont];
+ if (mDialogIsExecuting) {
+ [self finishOffWithCode:NSCancelButton];
+ } else {
+ mResultSet = true;
+ emit mHelper->reject();
+ }
+ return true;
+}
+
+- (void)finishOffWithCode:(NSInteger)code
+{
+ mResultCode = code;
+ if (mDialogIsExecuting) {
+ // We stop the current modal event loop. The control
+ // will then return inside -(void)exec below.
+ // It's important that the modal event loop is stopped before
+ // we accept/reject QFontDialog, since QFontDialog has its
+ // own event loop that needs to be stopped last.
+ [NSApp stopModalWithCode:code];
+ } else {
+ // Since we are not in a modal event loop, we can safely close
+ // down QFontDialog
+ // Calling accept() or reject() can in turn call closeCocoaFontPanel.
+ // This check will prevent any such recursion.
+ if (!mResultSet) {
+ mResultSet = true;
+ if (mResultCode == NSCancelButton) {
+ emit mHelper->reject();
+ } else {
+ emit mHelper->accept();
+ }
+ }
+ }
+}
+
+@end
+
+QT_BEGIN_NAMESPACE
+
+QCocoaFontDialogHelper::QCocoaFontDialogHelper() :
+ mDelegate(0)
+{
+}
+
+QCocoaFontDialogHelper::~QCocoaFontDialogHelper()
+{
+ deleteNativeDialog_sys();
+}
+
+void QCocoaFontDialogHelper::platformNativeDialogModalHelp()
+{
+ // Do a queued meta-call to open the native modal dialog so it opens after the new
+ // event loop has started to execute (in QDialog::exec). Using a timer rather than
+ // a queued meta call is intentional to ensure that the call is only delivered when
+ // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
+ // running (which is the case if e.g a top-most QEventLoop has been
+ // interrupted, and the second-most event loop has not yet been reactivated (regardless
+ // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
+ QTimer::singleShot(1, this, SIGNAL(launchNativeAppModalPanel()));
+}
+
+void QCocoaFontDialogHelper::_q_platformRunNativeAppModalPanel()
+{
+ // TODO:
+#if 0
+ QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
+#endif
+ QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate);
+ [delegate runApplicationModalPanel];
+ if (dialogResultCode_sys() == QPlatformDialogHelper::Accepted)
+ emit accept();
+ else
+ emit reject();
+}
+
+void QCocoaFontDialogHelper::deleteNativeDialog_sys()
+{
+ if (!mDelegate)
+ return;
+ [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate) release];
+ mDelegate = 0;
+}
+
+bool QCocoaFontDialogHelper::show_sys(QFlags<QPlatformDialogHelper::ShowFlag>, Qt::WindowFlags, QWindow *parent)
+{
+ return showCocoaFontPanel(parent);
+}
+
+void QCocoaFontDialogHelper::hide_sys()
+{
+ if (!mDelegate)
+ return;
+ [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate)->mFontPanel close];
+}
+
+QCocoaFontDialogHelper::DialogCode QCocoaFontDialogHelper::dialogResultCode_sys()
+{
+ QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate);
+ return [delegate dialogResultCode];
+}
+
+void QCocoaFontDialogHelper::setCurrentFont_sys(const QFont &font)
+{
+ NSFontManager *mgr = [NSFontManager sharedFontManager];
+ const NSFont *nsFont = 0;
+
+ int weight = 5;
+ NSFontTraitMask mask = 0;
+ if (font.style() == QFont::StyleItalic) {
+ mask |= NSItalicFontMask;
+ }
+ if (font.weight() == QFont::Bold) {
+ weight = 9;
+ mask |= NSBoldFontMask;
+ }
+
+ QFontInfo fontInfo(font);
+ nsFont = [mgr fontWithFamily:QCFString::toNSString(fontInfo.family())
+ traits:mask
+ weight:weight
+ size:fontInfo.pointSize()];
+
+ if (!mDelegate)
+ createNSFontPanelDelegate();
+
+ [mgr setSelectedFont:const_cast<NSFont *>(nsFont) isMultiple:NO];
+ static_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate)->mQtFont = font;
+}
+
+QFont QCocoaFontDialogHelper::currentFont_sys() const
+{
+ return reinterpret_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate)->mQtFont;
+}
+
+void QCocoaFontDialogHelper::createNSFontPanelDelegate()
+{
+ if (mDelegate)
+ return;
+
+ QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) alloc]
+ initWithDialogHelper:this];
+
+ mDelegate = delegate;
+}
+
+bool QCocoaFontDialogHelper::showCocoaFontPanel(QWindow *parent)
+{
+ Q_UNUSED(parent);
+ createNSFontPanelDelegate();
+ QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate);
+ [delegate showModelessPanel];
+ return true;
+}
+
+bool QCocoaFontDialogHelper::hideCocoaFontPanel()
+{
+ if (!mDelegate){
+ return false;
+ } else {
+ QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate);
+ [delegate closePanel];
+ return true;
+ }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_FONTDIALOG
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm
index f9b62c7a71..29c505e1ab 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.mm
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm
@@ -45,6 +45,7 @@
#include <QtCore>
#include <QtGui>
+#include <qplatformscreen_qpa.h>
#include <private/qguiapplication_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.h b/src/plugins/platforms/cocoa/qcocoatheme.h
index 08f813b906..a7dc973937 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.h
+++ b/src/plugins/platforms/cocoa/qcocoatheme.h
@@ -59,6 +59,8 @@ public:
bool usePlatformNativeDialog(DialogType dialogType) const;
QPlatformDialogHelper *createPlatformDialogHelper(DialogType dialogType) const;
+
+ QVariant themeHint(ThemeHint hint) const;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index f0e58abebd..ad20c2fb27 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -42,8 +42,9 @@
#include "qcocoatheme.h"
#include "qmenu_mac.h"
+#include "qcocoacolordialoghelper.h"
#include "qcocoafiledialoghelper.h"
-#include <QtWidgets/QFileDialog>
+#include "qcocoafontdialoghelper.h"
QT_BEGIN_NAMESPACE
@@ -72,15 +73,45 @@ bool QCocoaTheme::usePlatformNativeDialog(DialogType dialogType) const
{
if (dialogType == QPlatformTheme::FileDialog)
return true;
+#ifndef QT_NO_COLORDIALOG
+ if (dialogType == QPlatformTheme::ColorDialog)
+ return true;
+#endif
+#ifndef QT_NO_FONTDIALOG
+ if (dialogType == QPlatformTheme::FontDialog)
+ return true;
+#endif
return false;
}
QPlatformDialogHelper * QCocoaTheme::createPlatformDialogHelper(DialogType dialogType) const
{
- if (dialogType == QPlatformTheme::FileDialog) {
+ switch (dialogType) {
+ case QPlatformTheme::FileDialog:
return new QCocoaFileDialogHelper();
+#ifndef QT_NO_COLORDIALOG
+ case QPlatformTheme::ColorDialog:
+ return new QCocoaColorDialogHelper();
+#endif
+#ifndef QT_NO_FONTDIALOG
+ case QPlatformTheme::FontDialog:
+ return new QCocoaFontDialogHelper();
+#endif
+ default:
+ return 0;
+ }
+}
+
+QVariant QCocoaTheme::themeHint(ThemeHint hint) const
+{
+ switch (hint) {
+ case QPlatformTheme::StyleNames:
+ return QStringList() << QLatin1Literal("macintosh");
+ break;
+ default:
+ return QPlatformTheme::themeHint(hint);
+ break;
}
- return 0;
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qt_mac_p.h b/src/plugins/platforms/cocoa/qt_mac_p.h
index 947097294a..8e94880c5a 100644
--- a/src/plugins/platforms/cocoa/qt_mac_p.h
+++ b/src/plugins/platforms/cocoa/qt_mac_p.h
@@ -80,16 +80,6 @@ class QDragMoveEvent;
/* Event masks */
// internal Qt types
- // Event class for our own Carbon events.
-#if defined(QT_NAMESPACE) && defined(QT_NAMESPACE_MAC_CRC)
-// Take the CRC we generated at configure time. This *may* result in a
-// collision with another value If that is the case, please change the value
-// here to something other than 'Cute'.
-const UInt32 kEventClassQt = QT_NAMESPACE_MAC_CRC;
-#else
-const UInt32 kEventClassQt = 'Cute';
-#endif
-
enum {
//AE types
typeAEClipboardChanged = 1,
diff --git a/src/plugins/platforms/minimal/main.cpp b/src/plugins/platforms/minimal/main.cpp
index 4d3b3a1362..8a6e8fb4b0 100644
--- a/src/plugins/platforms/minimal/main.cpp
+++ b/src/plugins/platforms/minimal/main.cpp
@@ -47,6 +47,8 @@ QT_BEGIN_NAMESPACE
class QMinimalIntegrationPlugin : public QPlatformIntegrationPlugin
{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPlatformIntegrationFactoryInterface" FILE "minimal.json")
public:
QStringList keys() const;
QPlatformIntegration *create(const QString&, const QStringList&);
@@ -68,6 +70,6 @@ QPlatformIntegration *QMinimalIntegrationPlugin::create(const QString& system, c
return 0;
}
-Q_EXPORT_PLUGIN2(minimal, QMinimalIntegrationPlugin)
-
QT_END_NAMESPACE
+
+#include "main.moc"
diff --git a/src/plugins/platforms/minimal/minimal.json b/src/plugins/platforms/minimal/minimal.json
new file mode 100644
index 0000000000..d3cf684b62
--- /dev/null
+++ b/src/plugins/platforms/minimal/minimal.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "minimal" ]
+}
diff --git a/src/plugins/platforms/minimal/minimal.pro b/src/plugins/platforms/minimal/minimal.pro
index 392d12d19a..6430ccde75 100644
--- a/src/plugins/platforms/minimal/minimal.pro
+++ b/src/plugins/platforms/minimal/minimal.pro
@@ -10,5 +10,7 @@ SOURCES = main.cpp \
HEADERS = qminimalintegration.h \
qminimalbackingstore.h
+OTHER_FILES += minimal.json
+
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/minimal/qminimalbackingstore.cpp b/src/plugins/platforms/minimal/qminimalbackingstore.cpp
index b6b9c0e979..5336dbf3bd 100644
--- a/src/plugins/platforms/minimal/qminimalbackingstore.cpp
+++ b/src/plugins/platforms/minimal/qminimalbackingstore.cpp
@@ -43,6 +43,7 @@
#include "qminimalbackingstore.h"
#include "qscreen.h"
#include <QtCore/qdebug.h>
+#include <QtGui/QPlatformScreen>
#include <private/qguiapplication_p.h>
QT_BEGIN_NAMESPACE
@@ -53,7 +54,7 @@ QMinimalBackingStore::QMinimalBackingStore(QWindow *window)
if (QT_PREPEND_NAMESPACE(qgetenv)("QT_DEBUG_BACKINGSTORE").toInt() > 0)
mDebug = true;
if (mDebug)
- qDebug() << "QMinimalBackingStore::QMinimalBackingStore:" << (long)this;
+ qDebug() << "QMinimalBackingStore::QMinimalBackingStore:" << (quintptr)this;
}
QMinimalBackingStore::~QMinimalBackingStore()
diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp
index d54a1dbb89..f16eff5449 100644
--- a/src/plugins/platforms/windows/main.cpp
+++ b/src/plugins/platforms/windows/main.cpp
@@ -100,6 +100,8 @@ QT_BEGIN_NAMESPACE
class QWindowsIntegrationPlugin : public QPlatformIntegrationPlugin
{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPlatformIntegrationFactoryInterface" FILE "windows.json")
public:
QStringList keys() const;
QPlatformIntegration *create(const QString&, const QStringList&);
@@ -118,6 +120,6 @@ QPlatformIntegration *QWindowsIntegrationPlugin::create(const QString& system, c
return 0;
}
-Q_EXPORT_PLUGIN2(windows, QWindowsIntegrationPlugin)
-
QT_END_NAMESPACE
+
+#include "main.moc"
diff --git a/src/plugins/platforms/windows/qtwindows_additional.h b/src/plugins/platforms/windows/qtwindows_additional.h
index 864107e392..d82240255e 100644
--- a/src/plugins/platforms/windows/qtwindows_additional.h
+++ b/src/plugins/platforms/windows/qtwindows_additional.h
@@ -45,6 +45,10 @@
#include <QtCore/QtGlobal> // get compiler define
#include <QtCore/qt_windows.h>
+#ifndef WM_THEMECHANGED
+# define WM_THEMECHANGED 0x031A
+#endif
+
/* Complement the definitions and declarations missing
* when using MinGW or older Windows SDKs. */
@@ -66,6 +70,11 @@
#define IFACEMETHODIMP STDMETHODIMP
#define IFACEMETHODIMP_(type) STDMETHODIMP_(type)
+#if !defined(__MINGW64_VERSION_MAJOR)
+
+#define STATE_SYSTEM_HASPOPUP 0x40000000
+#define STATE_SYSTEM_PROTECTED 0x20000000
+
typedef struct tagUPDATELAYEREDWINDOWINFO {
DWORD cbSize;
HDC hdcDst;
@@ -79,6 +88,8 @@ typedef struct tagUPDATELAYEREDWINDOWINFO {
const RECT *prcDirty;
} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;
+#endif // if !defined(__MINGW64_VERSION_MAJOR)
+
// OpenGL Pixelformat flags.
#define PFD_SUPPORT_DIRECTDRAW 0x00002000
#define PFD_DIRECT3D_ACCELERATED 0x00004000
diff --git a/src/plugins/platforms/windows/qtwindowsglobal.h b/src/plugins/platforms/windows/qtwindowsglobal.h
index f044362299..27cfbdc662 100644
--- a/src/plugins/platforms/windows/qtwindowsglobal.h
+++ b/src/plugins/platforms/windows/qtwindowsglobal.h
@@ -60,7 +60,8 @@ enum
KeyDownEventFlag = 0x200000,
TouchEventFlag = 0x400000,
ClipboardEventFlag = 0x800000,
- ApplicationEventFlag = 0x1000000
+ ApplicationEventFlag = 0x1000000,
+ ThemingEventFlag = 0x2000000
};
enum WindowsEventType // Simplify event types
@@ -77,6 +78,8 @@ enum WindowsEventType // Simplify event types
ResizeEvent = WindowEventFlag + 12,
QuerySizeHints = WindowEventFlag + 15,
CalculateSize = WindowEventFlag + 16,
+ FocusInEvent = WindowEventFlag + 17,
+ FocusOutEvent = WindowEventFlag + 18,
MouseEvent = MouseEventFlag + 1,
MouseWheelEvent = MouseEventFlag + 2,
TouchEvent = TouchEventFlag + 1,
@@ -95,6 +98,7 @@ enum WindowsEventType // Simplify event types
InputMethodOpenCandidateWindowEvent = InputMethodEventFlag + 4,
InputMethodCloseCandidateWindowEvent = InputMethodEventFlag + 5,
InputMethodRequest = InputMethodEventFlag + 6,
+ ThemeChanged = ThemingEventFlag + 1,
DisplayChangedEvent = 437,
UnknownEvent = 542
};
@@ -170,8 +174,14 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI
}
case WM_GETOBJECT:
return QtWindows::AccessibleObjectFromWindowRequest;
+ case WM_SETFOCUS:
+ return QtWindows::FocusInEvent;
+ case WM_KILLFOCUS:
+ return QtWindows::FocusOutEvent;
case WM_DISPLAYCHANGE:
return QtWindows::DisplayChangedEvent;
+ case WM_THEMECHANGED:
+ return QtWindows::ThemeChanged;
default:
break;
}
diff --git a/src/plugins/platforms/windows/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/qwindowsaccessibility.cpp
index 2678fd7f23..3ef21fa0b7 100644
--- a/src/plugins/platforms/windows/qwindowsaccessibility.cpp
+++ b/src/plugins/platforms/windows/qwindowsaccessibility.cpp
@@ -69,7 +69,7 @@
#include <winuser.h>
#if !defined(WINABLEAPI)
-# if defined(Q_WS_WINCE)
+# if defined(Q_OS_WINCE)
# include <bldver.h>
# endif
# include <winable.h>
@@ -80,10 +80,12 @@
#include <comdef.h>
#endif
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
#include "qguifunctions_wince.h"
#endif
+#include "qtwindows_additional.h"
+
QT_BEGIN_NAMESPACE
//#define DEBUG_SHOW_ATCLIENT_COMMANDS
@@ -988,6 +990,17 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accKeyboardShortcut(VARIANT va
return *pszKeyboardShortcut ? S_OK : S_FALSE;
}
+static QAccessibleInterface *relatedInterface(QAccessibleInterface *iface, QAccessible::RelationFlag flag)
+{
+ typedef QPair<QAccessibleInterface *, QAccessible::Relation> RelationPair;
+ QVector<RelationPair> rels = iface->relations(flag);
+
+ for (int i = 1; i < rels.count(); ++i)
+ delete rels.at(i).first;
+
+ return rels.value(0).first;
+}
+
// moz: [important]
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* pszName)
{
@@ -1001,8 +1014,20 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* p
if (!child)
return E_FAIL;
name = child->text(QAccessible::Name);
+ if (name.isEmpty()) {
+ if (QAccessibleInterface *labelInterface = relatedInterface(child.data(), QAccessible::Label)) {
+ name = labelInterface->text(QAccessible::Name);
+ delete labelInterface;
+ }
+ }
} else {
name = accessible->text(QAccessible::Name);
+ if (name.isEmpty()) {
+ if (QAccessibleInterface *labelInterface = relatedInterface(accessible, QAccessible::Label)) {
+ name = labelInterface->text(QAccessible::Name);
+ delete labelInterface;
+ }
+ }
}
if (name.size()) {
*pszName = QStringToBSTR(name);
@@ -1189,29 +1214,18 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accFocus(VARIANT *pvarID)
if (!accessible->isValid())
return E_FAIL;
- QAccessibleInterface *acc = 0;
- int control = accessible->navigate(QAccessible::FocusChild, 1, &acc);
- if (control == -1) {
- (*pvarID).vt = VT_EMPTY;
- return S_FALSE;
- }
- if (!acc || control == 0) {
- (*pvarID).vt = VT_I4;
- (*pvarID).lVal = control ? control : CHILDID_SELF;
- return S_OK;
- }
-
- QWindowsAccessible* wacc = new QWindowsAccessible(acc);
- IDispatch *iface = 0;
- wacc->QueryInterface(IID_IDispatch, (void**)&iface);
- if (iface) {
- (*pvarID).vt = VT_DISPATCH;
- (*pvarID).pdispVal = iface;
- return S_OK;
- } else {
- delete wacc;
+ if (QAccessibleInterface *acc = accessible->focusChild()) {
+ QWindowsAccessible* wacc = new QWindowsAccessible(acc);
+ IDispatch *iface = 0;
+ wacc->QueryInterface(IID_IDispatch, (void**)&iface);
+ if (iface) {
+ (*pvarID).vt = VT_DISPATCH;
+ (*pvarID).pdispVal = iface;
+ return S_OK;
+ } else {
+ delete wacc;
+ }
}
-
(*pvarID).vt = VT_EMPTY;
return S_FALSE;
}
@@ -1355,7 +1369,7 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(const QAccessibleEvent &ev
typedef void (WINAPI *PtrNotifyWinEvent)(DWORD, HWND, LONG, LONG);
-#if defined(Q_WS_WINCE) // ### TODO: check for NotifyWinEvent in CE 6.0
+#if defined(Q_OS_WINCE) // ### TODO: check for NotifyWinEvent in CE 6.0
// There is no user32.lib nor NotifyWinEvent for CE
return;
#else
@@ -1393,7 +1407,7 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(const QAccessibleEvent &ev
++eventNum;
}
-#endif // Q_WS_WINCE
+#endif // Q_OS_WINCE
}
/*
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp
index 521ca3dc07..4f083e93d2 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.cpp
+++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp
@@ -283,14 +283,17 @@ bool QWindowsClipboard::clipboardViewerWndProc(HWND hwnd, UINT message, WPARAM w
}
}
return true;
- case WM_DRAWCLIPBOARD:
+ case WM_DRAWCLIPBOARD: {
+ const bool owned = ownsClipboard();
if (QWindowsContext::verboseOLE)
- qDebug("Clipboard changed");
- emitChanged(QClipboard::Clipboard);
+ qDebug("Clipboard changed owned %d", owned);
+ if (!owned) // changed is emitted by QClipboard in that case.
+ emitChanged(QClipboard::Clipboard);
// clean up the clipboard object if we no longer own the clipboard
- if (!ownsClipboard() && m_data)
+ if (!owned && m_data)
releaseIData();
propagateClipboardMessage(message, wParam, lParam);
+ }
return true;
case WM_DESTROY:
// Recommended shutdown
@@ -326,13 +329,16 @@ void QWindowsClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
const bool newData = !m_data || m_data->mimeData() != mimeData;
if (newData) {
releaseIData();
- m_data = new QWindowsOleDataObject(mimeData);
+ if (mimeData)
+ m_data = new QWindowsOleDataObject(mimeData);
}
const HRESULT src = OleSetClipboard(m_data);
if (src != S_OK) {
+ QString mimeDataFormats = mimeData ?
+ mimeData->formats().join(QStringLiteral(", ")) : QString(QStringLiteral("NULL"));
qErrnoWarning("OleSetClipboard: Failed to set mime data (%s) on clipboard: %s",
- qPrintable(mimeData->formats().join(QStringLiteral(", "))),
+ qPrintable(mimeDataFormats),
QWindowsContext::comErrorString(src).constData());
releaseIData();
return;
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 5f7dfb1b10..2706e02cf8 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -49,6 +49,7 @@
#include "qwindowsinputcontext.h"
#include "qwindowsaccessibility.h"
#include "qwindowsscreen.h"
+#include "qwindowstheme.h"
#include <QtGui/QWindow>
#include <QtGui/QWindowSystemInterface>
@@ -78,6 +79,7 @@ int QWindowsContext::verboseGL = 0;
int QWindowsContext::verboseOLE = 0;
int QWindowsContext::verboseInputMethods = 0;
int QWindowsContext::verboseDialogs = 0;
+int QWindowsContext::verboseTheming = 0;
// Get verbosity of components from "foo:2,bar:3"
static inline int componentVerbose(const char *v, const char *keyWord)
@@ -284,6 +286,7 @@ QWindowsContext::QWindowsContext() :
QWindowsContext::verboseOLE = componentVerbose(v, "ole");
QWindowsContext::verboseInputMethods = componentVerbose(v, "im");
QWindowsContext::verboseDialogs = componentVerbose(v, "dialogs");
+ QWindowsContext::verboseTheming = componentVerbose(v, "theming");
}
}
@@ -676,10 +679,6 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
}
// Events without an associated QWindow or events we are not interested in.
switch (et) {
- case QtWindows::DeactivateApplicationEvent:
- case QtWindows::DeactivateWindowEvent:
- QWindowSystemInterface::handleWindowActivated(0);
- return true;
case QtWindows::InputMethodStartCompositionEvent:
return QWindowsInputContext::instance()->startComposition(hwnd);
case QtWindows::InputMethodCompositionEvent:
@@ -773,9 +772,12 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
return d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result);
case QtWindows::TouchEvent:
return d->m_mouseHandler.translateTouchEvent(platformWindow->window(), hwnd, et, msg, result);
- case QtWindows::ActivateWindowEvent:
+ case QtWindows::FocusInEvent: // see QWindowsWindow::requestActivateWindow().
QWindowSystemInterface::handleWindowActivated(platformWindow->window());
return true;
+ case QtWindows::FocusOutEvent:
+ QWindowSystemInterface::handleWindowActivated(0);
+ return true;
case QtWindows::ShowEvent:
platformWindow->handleShown();
return true;
@@ -785,6 +787,9 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
case QtWindows::CloseEvent:
QWindowSystemInterface::handleCloseEvent(platformWindow->window());
return true;
+ case QtWindows::ThemeChanged: // ### fixme: Compress these events?
+ QWindowsTheme::instance()->windowsThemeChanged(platformWindow->window());
+ return true;
default:
break;
}
diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h
index b5a36c3fe9..9f16ed232b 100644
--- a/src/plugins/platforms/windows/qwindowscontext.h
+++ b/src/plugins/platforms/windows/qwindowscontext.h
@@ -121,6 +121,7 @@ public:
static int verboseOLE;
static int verboseInputMethods;
static int verboseDialogs;
+ static int verboseTheming;
explicit QWindowsContext();
~QWindowsContext();
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
index f7863ae427..25b9336361 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
@@ -43,6 +43,7 @@
#include "qwindowscontext.h"
#include "qwindowswindow.h"
+#include "qwindowstheme.h" // Color conversion helpers
#include <QtWidgets/QColorDialog>
#include <QtWidgets/QFontDialog>
@@ -76,7 +77,12 @@
static const IID IID_IFileOpenDialog = {0xd57c7288, 0xd4ad, 0x4768, {0xbe, 0x02, 0x9d, 0x96, 0x95, 0x32, 0xd9, 0x60}};
static const IID IID_IFileSaveDialog = {0x84bccd23, 0x5fde, 0x4cdb,{0xae, 0xa4, 0xaf, 0x64, 0xb8, 0x3d, 0x78, 0xab}};
+#ifdef __MINGW64_VERSION_MAJOR
+static const IID q_IID_IShellItem = {0x43826d1e, 0xe718, 0x42ee, {0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe}};
+#define IID_IShellItem q_IID_IShellItem
+#else
static const IID IID_IShellItem = {0x43826d1e, 0xe718, 0x42ee, {0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe}};
+#endif
static const IID IID_IFileDialogEvents = {0x973510db, 0x7d7f, 0x452b,{0x89, 0x75, 0x74, 0xa8, 0x58, 0x28, 0xd3, 0x54}};
static const CLSID CLSID_FileOpenDialog = {0xdc1c5a9c, 0xe88a, 0x4dde, {0xa5, 0xa1, 0x60, 0xf8, 0x2a, 0x20, 0xae, 0xf7}};
static const CLSID CLSID_FileSaveDialog = {0xc0b4e2f3, 0xba21, 0x4773,{0x8d, 0xba, 0x33, 0x5e, 0xc9, 0x46, 0xeb, 0x8b}};
@@ -141,6 +147,7 @@ typedef enum {
SIATTRIBFLAGS_APPCOMPAT = 0x3,
SIATTRIBFLAGS_MASK = 0x3
} SIATTRIBFLAGS;
+#ifndef __MINGW64_VERSION_MAJOR
typedef enum {
SIGDN_NORMALDISPLAY = 0x00000000,
SIGDN_PARENTRELATIVEPARSING = 0x80018001,
@@ -151,6 +158,7 @@ typedef enum {
SIGDN_FILESYSPATH = 0x80058000,
SIGDN_URL = 0x80068000
} SIGDN;
+#endif
typedef enum {
FDAP_BOTTOM = 0x00000000,
FDAP_TOP = 0x00000001
@@ -193,6 +201,7 @@ typedef struct {
DECLARE_INTERFACE(IFileDialogEvents);
+#ifndef __MINGW64_VERSION_MAJOR
DECLARE_INTERFACE_(IShellItem, IUnknown)
{
STDMETHOD(BindToHandler)(THIS_ IBindCtx *pbc, REFGUID bhid, REFIID riid, void **ppv) PURE;
@@ -201,6 +210,7 @@ DECLARE_INTERFACE_(IShellItem, IUnknown)
STDMETHOD(GetAttributes)(THIS_ ULONG sfgaoMask, ULONG *psfgaoAttribs) PURE;
STDMETHOD(Compare)(THIS_ IShellItem *psi, DWORD hint, int *piOrder) PURE;
};
+#endif
DECLARE_INTERFACE_(IShellItemFilter, IUnknown)
{
@@ -227,10 +237,12 @@ DECLARE_INTERFACE_(IShellItemArray, IUnknown)
STDMETHOD(EnumItems)(THIS_ IEnumShellItems **ppenumShellItems) PURE;
};
+#ifndef __MINGW64_VERSION_MAJOR
DECLARE_INTERFACE_(IModalWindow, IUnknown)
{
STDMETHOD(Show)(THIS_ HWND hwndParent) PURE;
};
+#endif
DECLARE_INTERFACE_(IFileDialog, IModalWindow)
{
@@ -754,7 +766,7 @@ void QWindowsNativeFileDialogBase::setDirectory(const QString &directory)
QString QWindowsNativeFileDialogBase::directory() const
{
IShellItem *item = 0;
- return (SUCCEEDED(m_fileDialog) && item) ?
+ return (m_fileDialog && item) ?
QWindowsNativeFileDialogBase::itemPath(item) : QString();
}
@@ -1257,12 +1269,6 @@ QWindowsNativeColorDialog::QWindowsNativeColorDialog(const SharedPointerColor &c
qFill(m_customColors, m_customColors + 16, COLORREF(0));
}
-static inline COLORREF qColorToCOLORREF(const QColor &color)
-{ return RGB(color.red(), color.green(), color.blue()); }
-
-static inline QColor COLORREFToQColor(COLORREF cr)
-{ return QColor(GetRValue(cr), GetGValue(cr), GetBValue(cr)); }
-
void QWindowsNativeColorDialog::exec(HWND owner)
{
typedef BOOL (WINAPI *ChooseColorWType)(LPCHOOSECOLORW);
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index fa95f4f529..1df985c8a7 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -329,6 +329,11 @@ static inline QFontDatabase::WritingSystem writingSystemFromScript(const QString
return QFontDatabase::Any;
}
+extern bool localizedName(const QString &name);
+extern QString getEnglishName(const QString &familyName);
+
+Q_GUI_EXPORT void qt_registerAliasToFontFamily(const QString &familyName, const QString &alias);
+
static bool addFontToDatabase(QString familyName, const QString &scriptName,
const TEXTMETRIC *textmetric,
const FONTSIGNATURE *signature,
@@ -365,10 +370,10 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
<< " stretch=" << stretch;
}
-/* Fixme: omitted for the moment
- if(ttf && localizedName(familyName) && family->english_name.isEmpty())
- family->english_name = getEnglishName(familyName);
-*/
+ QString englishName;
+ if (ttf && localizedName(familyName))
+ englishName = getEnglishName(familyName);
+
QSupportedWritingSystems writingSystems;
if (type & TRUETYPE_FONTTYPE) {
quint32 unicodeRange[4] = {
@@ -405,6 +410,10 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
if (weight <= QFont::DemiBold && style != QFont::StyleItalic)
QPlatformFontDatabase::registerFont(familyName, foundryName, QFont::Bold,
QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
+
+ if (!englishName.isEmpty())
+ qt_registerAliasToFontFamily(familyName, englishName);
+
return true;
}
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
index f397e9cb92..031d6ad1a6 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
@@ -53,6 +53,8 @@
#include <wchar.h>
+QT_BEGIN_NAMESPACE
+
static inline QFontDatabase::WritingSystem writingSystemFromScript(const QString &scriptName)
{
if (scriptName == QStringLiteral("Western")
@@ -100,6 +102,194 @@ static inline QFont::Weight weightFromInteger(long weight)
return QFont::Black;
}
+#ifdef MAKE_TAG
+#undef MAKE_TAG
+#endif
+// GetFontData expects the tags in little endian ;(
+#define MAKE_TAG(ch1, ch2, ch3, ch4) (\
+ (((quint32)(ch4)) << 24) | \
+ (((quint32)(ch3)) << 16) | \
+ (((quint32)(ch2)) << 8) | \
+ ((quint32)(ch1)) \
+ )
+
+bool localizedName(const QString &name)
+{
+ const QChar *c = name.unicode();
+ for (int i = 0; i < name.length(); ++i) {
+ if (c[i].unicode() >= 0x100)
+ return true;
+ }
+ return false;
+}
+
+static inline quint16 getUShort(const unsigned char *p)
+{
+ quint16 val;
+ val = *p++ << 8;
+ val |= *p;
+
+ return val;
+}
+
+static QString getEnglishName(const uchar *table, quint32 bytes)
+{
+ QString i18n_name;
+ enum {
+ NameRecordSize = 12,
+ FamilyId = 1,
+ MS_LangIdEnglish = 0x009
+ };
+
+ // get the name table
+ quint16 count;
+ quint16 string_offset;
+ const unsigned char *names;
+
+ int microsoft_id = -1;
+ int apple_id = -1;
+ int unicode_id = -1;
+
+ if (getUShort(table) != 0)
+ goto error;
+
+ count = getUShort(table+2);
+ string_offset = getUShort(table+4);
+ names = table + 6;
+
+ if (string_offset >= bytes || 6 + count*NameRecordSize > string_offset)
+ goto error;
+
+ for (int i = 0; i < count; ++i) {
+ // search for the correct name entry
+
+ quint16 platform_id = getUShort(names + i*NameRecordSize);
+ quint16 encoding_id = getUShort(names + 2 + i*NameRecordSize);
+ quint16 language_id = getUShort(names + 4 + i*NameRecordSize);
+ quint16 name_id = getUShort(names + 6 + i*NameRecordSize);
+
+ if (name_id != FamilyId)
+ continue;
+
+ enum {
+ PlatformId_Unicode = 0,
+ PlatformId_Apple = 1,
+ PlatformId_Microsoft = 3
+ };
+
+ quint16 length = getUShort(names + 8 + i*NameRecordSize);
+ quint16 offset = getUShort(names + 10 + i*NameRecordSize);
+ if (DWORD(string_offset + offset + length) >= bytes)
+ continue;
+
+ if ((platform_id == PlatformId_Microsoft
+ && (encoding_id == 0 || encoding_id == 1))
+ && (language_id & 0x3ff) == MS_LangIdEnglish
+ && microsoft_id == -1)
+ microsoft_id = i;
+ // not sure if encoding id 4 for Unicode is utf16 or ucs4...
+ else if (platform_id == PlatformId_Unicode && encoding_id < 4 && unicode_id == -1)
+ unicode_id = i;
+ else if (platform_id == PlatformId_Apple && encoding_id == 0 && language_id == 0)
+ apple_id = i;
+ }
+ {
+ bool unicode = false;
+ int id = -1;
+ if (microsoft_id != -1) {
+ id = microsoft_id;
+ unicode = true;
+ } else if (apple_id != -1) {
+ id = apple_id;
+ unicode = false;
+ } else if (unicode_id != -1) {
+ id = unicode_id;
+ unicode = true;
+ }
+ if (id != -1) {
+ quint16 length = getUShort(names + 8 + id*NameRecordSize);
+ quint16 offset = getUShort(names + 10 + id*NameRecordSize);
+ if (unicode) {
+ // utf16
+
+ length /= 2;
+ i18n_name.resize(length);
+ QChar *uc = (QChar *) i18n_name.unicode();
+ const unsigned char *string = table + string_offset + offset;
+ for (int i = 0; i < length; ++i)
+ uc[i] = getUShort(string + 2*i);
+ } else {
+ // Apple Roman
+
+ i18n_name.resize(length);
+ QChar *uc = (QChar *) i18n_name.unicode();
+ const unsigned char *string = table + string_offset + offset;
+ for (int i = 0; i < length; ++i)
+ uc[i] = QLatin1Char(string[i]);
+ }
+ }
+ }
+error:
+ //qDebug("got i18n name of '%s' for font '%s'", i18n_name.latin1(), familyName.toLocal8Bit().data());
+ return i18n_name;
+}
+
+QString getEnglishName(const QString &familyName)
+{
+ QString i18n_name;
+
+ HDC hdc = GetDC( 0 );
+ LOGFONT lf;
+ memset(&lf, 0, sizeof(LOGFONT));
+ memcpy(lf.lfFaceName, familyName.utf16(), qMin(LF_FACESIZE, familyName.length()) * sizeof(wchar_t));
+ lf.lfCharSet = DEFAULT_CHARSET;
+ HFONT hfont = CreateFontIndirect(&lf);
+
+ if (!hfont) {
+ ReleaseDC(0, hdc);
+ return QString();
+ }
+
+ HGDIOBJ oldobj = SelectObject( hdc, hfont );
+
+ const DWORD name_tag = MAKE_TAG( 'n', 'a', 'm', 'e' );
+
+ // get the name table
+ unsigned char *table = 0;
+
+ DWORD bytes = GetFontData( hdc, name_tag, 0, 0, 0 );
+ if ( bytes == GDI_ERROR ) {
+ // ### Unused variable
+ // int err = GetLastError();
+ goto error;
+ }
+
+ table = new unsigned char[bytes];
+ GetFontData(hdc, name_tag, 0, table, bytes);
+ if ( bytes == GDI_ERROR )
+ goto error;
+
+ i18n_name = getEnglishName(table, bytes);
+error:
+ delete [] table;
+ SelectObject( hdc, oldobj );
+ DeleteObject( hfont );
+ ReleaseDC( 0, hdc );
+
+ //qDebug("got i18n name of '%s' for font '%s'", i18n_name.latin1(), familyName.toLocal8Bit().data());
+ return i18n_name;
+}
+
+static FontFile * createFontFile(const QString &fileName, int index)
+{
+ FontFile *fontFile = new FontFile;
+ fontFile->fileName = fileName;
+ fontFile->indexValue = index;
+ return fontFile;
+}
+
+Q_GUI_EXPORT void qt_registerAliasToFontFamily(const QString &familyName, const QString &alias);
+
static bool addFontToDatabase(QString familyName, const QString &scriptName,
const TEXTMETRIC *textmetric,
const FONTSIGNATURE *signature,
@@ -143,10 +333,10 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
<< " stretch=" << stretch;
}
-/* Fixme: omitted for the moment
- if(ttf && localizedName(faceName) && family->english_name.isEmpty())
- family->english_name = getEnglishName(faceName);
-*/
+ QString englishName;
+ if (ttf && localizedName(faceName))
+ englishName = getEnglishName(faceName);
+
QSupportedWritingSystems writingSystems;
if (type & TRUETYPE_FONTTYPE) {
quint32 unicodeRange[4] = {
@@ -196,7 +386,7 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
const FontKey &fontKey = allFonts.at(k);
for (int i = 0; i < fontKey.second.length(); ++i) {
const QString &font = fontKey.second.at(i);
- if (font == faceName || (faceName != fullName && fullName == font)) {
+ if (font == faceName || fullName == font || englishName == font) {
value = fontRegistry.value(fontKey.first).toString();
index = i;
break;
@@ -212,23 +402,25 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
if (!QDir::isAbsolutePath(value))
value.prepend(QString::fromLocal8Bit(qgetenv("windir") + "\\Fonts\\"));
- // Pointer is deleted in QBasicFontDatabase::releaseHandle(void *handle)
- FontFile *fontFile = new FontFile;
- fontFile->fileName = value;
- fontFile->indexValue = index;
+ QPlatformFontDatabase::registerFont(faceName, foundryName, weight, style, stretch,
+ antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
- QPlatformFontDatabase::registerFont(faceName, foundryName, weight,
- style, stretch, antialias, scalable, size, fixed, writingSystems, fontFile);
// add fonts windows can generate for us:
if (weight <= QFont::DemiBold)
- QPlatformFontDatabase::registerFont(faceName, foundryName, QFont::Bold,
- style, stretch, antialias, scalable, size, fixed, writingSystems, fontFile);
+ QPlatformFontDatabase::registerFont(faceName, foundryName, QFont::Bold, style, stretch,
+ antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
+
if (style != QFont::StyleItalic)
- QPlatformFontDatabase::registerFont(faceName, foundryName, weight,
- QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, fontFile);
+ QPlatformFontDatabase::registerFont(faceName, foundryName, weight, QFont::StyleItalic, stretch,
+ antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
+
if (weight <= QFont::DemiBold && style != QFont::StyleItalic)
- QPlatformFontDatabase::registerFont(faceName, foundryName, QFont::Bold,
- QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, fontFile);
+ QPlatformFontDatabase::registerFont(faceName, foundryName, QFont::Bold, QFont::StyleItalic, stretch,
+ antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
+
+ if (!englishName.isEmpty())
+ qt_registerAliasToFontFamily(faceName, englishName);
+
return true;
}
@@ -509,3 +701,5 @@ QFont QWindowsFontDatabaseFT::LOGFONT_to_QFont(const LOGFONT& logFont, int verti
qFont.setStrikeOut(logFont.lfStrikeOut);
return qFont;
}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h
index b12c1067fd..5a0c4c6377 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h
@@ -46,6 +46,8 @@
#include <QtCore/QSharedPointer>
#include "qtwindows_additional.h"
+QT_BEGIN_NAMESPACE
+
class QWindowsFontDatabaseFT : public QBasicFontDatabase
{
public:
@@ -68,4 +70,6 @@ private:
QSet<QString> m_families;
};
+QT_END_NAMESPACE
+
#endif // QWINDOWSFONTDATABASEFT_H
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp
index ffa57ad58f..007f6d597a 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp
@@ -517,9 +517,7 @@ QFixed QWindowsFontEngine::ascent() const
QFixed QWindowsFontEngine::descent() const
{
- // ### we subtract 1 to even out the historical +1 in QFontMetrics'
- // ### height=asc+desc+1 equation. Fix in Qt5.
- return tm.tmDescent - 1;
+ return tm.tmDescent;
}
QFixed QWindowsFontEngine::leading() const
diff --git a/src/plugins/platforms/windows/qwindowsguieventdispatcher.cpp b/src/plugins/platforms/windows/qwindowsguieventdispatcher.cpp
index 34ab1665d8..49158dce48 100644
--- a/src/plugins/platforms/windows/qwindowsguieventdispatcher.cpp
+++ b/src/plugins/platforms/windows/qwindowsguieventdispatcher.cpp
@@ -203,7 +203,8 @@ messageDebugEntries[] = {
{WM_IME_ENDCOMPOSITION, "WM_IME_ENDCOMPOSITION"},
{WM_IME_NOTIFY, "WM_IME_NOTIFY"},
{WM_IME_REQUEST, "WM_IME_REQUEST"},
- {WM_DISPLAYCHANGE, "WM_DISPLAYCHANGE"}
+ {WM_DISPLAYCHANGE, "WM_DISPLAYCHANGE"},
+ {WM_THEMECHANGED , "WM_THEMECHANGED"}
};
static inline const MessageDebugEntry *messageDebugEntry(UINT msg)
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 2771ec7e8a..3e98be4741 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -46,6 +46,7 @@
#include "qwindowsglcontext.h"
#include "qwindowsscreen.h"
#include "qwindowstheme.h"
+#include "qwindowsservices.h"
#ifndef QT_NO_FREETYPE
#include "qwindowsfontdatabase_ft.h"
#endif
@@ -162,6 +163,7 @@ struct QWindowsIntegrationPrivate
QWindowsInputContext m_inputContext;
QWindowsAccessibility m_accessibility;
QWindowsTheme m_theme;
+ QWindowsServices m_services;
};
QWindowsIntegrationPrivate::QWindowsIntegrationPrivate()
@@ -339,4 +341,9 @@ QPlatformTheme *QWindowsIntegration::platformTheme() const
return &d->m_theme;
}
+QPlatformServices *QWindowsIntegration::services() const
+{
+ return &d->m_services;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h
index a96605f259..ba5fafbbb5 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.h
+++ b/src/plugins/platforms/windows/qwindowsintegration.h
@@ -70,6 +70,7 @@ public:
virtual QPlatformNativeInterface *nativeInterface() const;
virtual QPlatformFontDatabase *fontDatabase() const;
virtual QPlatformTheme *platformTheme() const;
+ QPlatformServices *services() const;
virtual QVariant styleHint(StyleHint hint) const;
static QWindowsIntegration *instance();
diff --git a/src/plugins/platforms/windows/qwindowsservices.cpp b/src/plugins/platforms/windows/qwindowsservices.cpp
new file mode 100644
index 0000000000..905a1bd12c
--- /dev/null
+++ b/src/plugins/platforms/windows/qwindowsservices.cpp
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwindowsservices.h"
+#include "qtwindows_additional.h"
+
+#include <QtCore/QUrl>
+#include <QtCore/QDebug>
+
+#include <shlobj.h>
+#include <intshcut.h>
+
+QT_BEGIN_NAMESPACE
+
+enum { debug = 0 };
+
+static inline bool shellExecute(const QString &file)
+{
+ const quintptr result = (quintptr)ShellExecute(0, 0, (wchar_t*)file.utf16(), 0, 0, SW_SHOWNORMAL);
+ // ShellExecute returns a value greater than 32 if successful
+ if (result <= 32) {
+ qWarning("ShellExecute '%s' failed (error %s).", qPrintable(file), qPrintable(QString::number(result)));
+ return false;
+ }
+ return true;
+}
+
+// Retrieve the commandline for the default mail client. It contains a
+// placeholder %1 for the URL. The default key used below is the
+// command line for the mailto: shell command.
+static inline QString mailCommand()
+{
+ enum { BufferSize = sizeof(wchar_t) * MAX_PATH };
+
+ const wchar_t mailUserKey[] = L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\mailto\\UserChoice";
+
+ wchar_t command[MAX_PATH] = {0};
+ // Check if user has set preference, otherwise use default.
+ HKEY handle;
+ QString keyName;
+ if (!RegOpenKeyEx(HKEY_CURRENT_USER, mailUserKey, 0, KEY_READ, &handle)) {
+ DWORD bufferSize = BufferSize;
+ if (!RegQueryValueEx(handle, L"Progid", 0, 0, reinterpret_cast<unsigned char*>(command), &bufferSize))
+ keyName = QString::fromWCharArray(command);
+ RegCloseKey(handle);
+ }
+ if (keyName.isEmpty())
+ keyName = QStringLiteral("mailto");
+ keyName += QStringLiteral("\\Shell\\Open\\Command");
+ if (debug)
+ qDebug() << __FUNCTION__ << "keyName=" << keyName;
+ command[0] = 0;
+ if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, (const wchar_t*)keyName.utf16(), 0, KEY_READ, &handle)) {
+ DWORD bufferSize = BufferSize;
+ RegQueryValueEx(handle, L"", 0, 0, reinterpret_cast<unsigned char*>(command), &bufferSize);
+ RegCloseKey(handle);
+ }
+ if (!command[0])
+ return QString();
+ wchar_t expandedCommand[MAX_PATH] = {0};
+ return ExpandEnvironmentStrings(command, expandedCommand, MAX_PATH) ?
+ QString::fromWCharArray(expandedCommand) : QString::fromWCharArray(command);
+}
+
+static inline bool launchMail(const QUrl &url)
+{
+ QString command = mailCommand();
+ if (command.isEmpty()) {
+ qWarning("Cannot launch '%s': There is no mail program installed.", qPrintable(url.toString()));
+ return false;
+ }
+ //Make sure the path for the process is in quotes
+ const QChar doubleQuote = QLatin1Char('"');
+ if (!command.startsWith(doubleQuote)) {
+ const int exeIndex = command.indexOf(QStringLiteral(".exe "), 0, Qt::CaseInsensitive);
+ if (exeIndex != -1) {
+ command.insert(exeIndex + 4, doubleQuote);
+ command.prepend(doubleQuote);
+ }
+ }
+ // Pass the url as the parameter. Should use QProcess::startDetached(),
+ // but that cannot handle a Windows command line [yet].
+ command.replace(QStringLiteral("%1"), url.toString());
+ if (debug)
+ qDebug() << __FUNCTION__ << "Launching" << command;
+ //start the process
+ PROCESS_INFORMATION pi;
+ ZeroMemory(&pi, sizeof(pi));
+ STARTUPINFO si;
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+ if (!CreateProcess(NULL, (wchar_t*)command.utf16(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
+ qErrnoWarning("Unable to launch '%s'", qPrintable(command));
+ return false;
+ }
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ return true;
+}
+
+bool QWindowsServices::openUrl(const QUrl &url)
+{
+ const QString scheme = url.scheme();
+ if (scheme.isEmpty())
+ return openDocument(url);
+ if (scheme == QStringLiteral("mailto") && launchMail(url))
+ return true;
+ return shellExecute(QLatin1String(url.toEncoded()));
+}
+
+bool QWindowsServices::openDocument(const QUrl &url)
+{
+ return shellExecute(url.isLocalFile() ? url.toLocalFile() : url.toString());
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsservices.h b/src/plugins/platforms/windows/qwindowsservices.h
new file mode 100644
index 0000000000..d979ed1af1
--- /dev/null
+++ b/src/plugins/platforms/windows/qwindowsservices.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSDESKTOPSERVICES_H
+#define QWINDOWSDESKTOPSERVICES_H
+
+#include <QtGui/qplatformservices_qpa.h>
+
+QT_BEGIN_NAMESPACE
+
+class QWindowsServices : public QPlatformServices
+{
+public:
+ bool openUrl(const QUrl &url);
+ bool openDocument(const QUrl &url);
+};
+
+QT_END_NAMESPACE
+
+#endif // QWINDOWSDESKTOPSERVICES_H
diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp
index 73cff3c9ce..a59b74cef3 100644
--- a/src/plugins/platforms/windows/qwindowstheme.cpp
+++ b/src/plugins/platforms/windows/qwindowstheme.cpp
@@ -42,12 +42,126 @@
#include "qwindowstheme.h"
#include "qwindowsdialoghelpers.h"
#include "qwindowscontext.h"
+#include "qwindowsintegration.h"
#include "qt_windows.h"
#include <QtCore/QVariant>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+#include <QtCore/QTextStream>
+#include <QtCore/QSysInfo>
+#include <QtGui/QPalette>
+#include <QtGui/QGuiApplication>
QT_BEGIN_NAMESPACE
+static inline QTextStream& operator<<(QTextStream &str, const QColor &c)
+{
+ str.setIntegerBase(16);
+ str.setFieldWidth(2);
+ str.setPadChar(QLatin1Char('0'));
+ str << " rgb: #" << c.red() << c.green() << c.blue();
+ str.setIntegerBase(10);
+ str.setFieldWidth(0);
+ return str;
+}
+
+static inline QString paletteToString(const QPalette &palette)
+{
+ QString result;
+ QTextStream str(&result);
+ str << "text=" << palette.color(QPalette::WindowText)
+ << " background=" << palette.color(QPalette::Window);
+ return result;
+}
+
+static inline QColor mixColors(const QColor &c1, const QColor &c2)
+{
+ return QColor ((c1.red() + c2.red()) / 2,
+ (c1.green() + c2.green()) / 2,
+ (c1.blue() + c2.blue()) / 2);
+}
+
+static inline QColor getSysColor(int index)
+{
+ return qColorToCOLORREF(GetSysColor(index));
+}
+
+static inline QPalette systemPalette()
+{
+ QPalette result;
+ result.setColor(QPalette::WindowText, getSysColor(COLOR_WINDOWTEXT));
+ result.setColor(QPalette::Button, getSysColor(COLOR_BTNFACE));
+ result.setColor(QPalette::Light, getSysColor(COLOR_BTNHIGHLIGHT));
+ result.setColor(QPalette::Dark, getSysColor(COLOR_BTNSHADOW));
+ result.setColor(QPalette::Mid, result.button().color().darker(150));
+ result.setColor(QPalette::Text, getSysColor(COLOR_WINDOWTEXT));
+ result.setColor(QPalette::BrightText, getSysColor(COLOR_BTNHIGHLIGHT));
+ result.setColor(QPalette::Base, getSysColor(COLOR_WINDOW));
+ result.setColor(QPalette::Window, getSysColor(COLOR_BTNFACE));
+ result.setColor(QPalette::ButtonText, getSysColor(COLOR_BTNTEXT));
+ result.setColor(QPalette::Midlight, getSysColor(COLOR_3DLIGHT));
+ result.setColor(QPalette::Shadow, getSysColor(COLOR_3DDKSHADOW));
+ result.setColor(QPalette::Highlight, getSysColor(COLOR_HIGHLIGHT));
+ result.setColor(QPalette::HighlightedText, getSysColor(COLOR_HIGHLIGHTTEXT));
+ result.setColor(QPalette::Link, Qt::blue);
+ result.setColor(QPalette::LinkVisited, Qt::magenta);
+ result.setColor(QPalette::Inactive, QPalette::Button, result.button().color());
+ result.setColor(QPalette::Inactive, QPalette::Window, result.background().color());
+ result.setColor(QPalette::Inactive, QPalette::Light, result.light().color());
+ result.setColor(QPalette::Inactive, QPalette::Dark, result.dark().color());
+
+ if (result.midlight() == result.button())
+ result.setColor(QPalette::Midlight, result.button().color().lighter(110));
+ if (result.background() != result.base()) {
+ result.setColor(QPalette::Inactive, QPalette::Highlight, result.color(QPalette::Inactive, QPalette::Window));
+ result.setColor(QPalette::Inactive, QPalette::HighlightedText, result.color(QPalette::Inactive, QPalette::Text));
+ }
+
+ const QColor disabled =
+ mixColors(result.foreground().color(), result.button().color());
+
+ result.setColorGroup(QPalette::Disabled, result.foreground(), result.button(),
+ result.light(), result.dark(), result.mid(),
+ result.text(), result.brightText(), result.base(),
+ result.background());
+ result.setColor(QPalette::Disabled, QPalette::WindowText, disabled);
+ result.setColor(QPalette::Disabled, QPalette::Text, disabled);
+ result.setColor(QPalette::Disabled, QPalette::ButtonText, disabled);
+ result.setColor(QPalette::Disabled, QPalette::Highlight,
+ getSysColor(COLOR_HIGHLIGHT));
+ result.setColor(QPalette::Disabled, QPalette::HighlightedText,
+ getSysColor(COLOR_HIGHLIGHTTEXT));
+ result.setColor(QPalette::Disabled, QPalette::Base,
+ result.background().color());
+ return result;
+}
+
+QPalette toolTipPalette(const QPalette &systemPalette)
+{
+ QPalette result(systemPalette);
+ const QColor tipBgColor(getSysColor(COLOR_INFOBK));
+ const QColor tipTextColor(getSysColor(COLOR_INFOTEXT));
+
+ result.setColor(QPalette::All, QPalette::Button, tipBgColor);
+ result.setColor(QPalette::All, QPalette::Window, tipBgColor);
+ result.setColor(QPalette::All, QPalette::Text, tipTextColor);
+ result.setColor(QPalette::All, QPalette::WindowText, tipTextColor);
+ result.setColor(QPalette::All, QPalette::ButtonText, tipTextColor);
+ result.setColor(QPalette::All, QPalette::Button, tipBgColor);
+ result.setColor(QPalette::All, QPalette::Window, tipBgColor);
+ result.setColor(QPalette::All, QPalette::Text, tipTextColor);
+ result.setColor(QPalette::All, QPalette::WindowText, tipTextColor);
+ result.setColor(QPalette::All, QPalette::ButtonText, tipTextColor);
+ const QColor disabled =
+ mixColors(result.foreground().color(), result.button().color());
+ result.setColor(QPalette::Disabled, QPalette::WindowText, disabled);
+ result.setColor(QPalette::Disabled, QPalette::Text, disabled);
+ result.setColor(QPalette::Disabled, QPalette::Base, Qt::white);
+ result.setColor(QPalette::Disabled, QPalette::BrightText, Qt::white);
+ return result;
+}
+
static inline bool booleanSystemParametersInfo(UINT what, bool defaultValue)
{
BOOL result;
@@ -66,11 +180,53 @@ static inline bool dWordSystemParametersInfo(UINT what, DWORD defaultValue)
QWindowsTheme::QWindowsTheme()
{
+ qFill(m_palettes, m_palettes + NPalettes, static_cast<QPalette *>(0));
+ refresh();
+}
+
+QWindowsTheme::~QWindowsTheme()
+{
+ clearPalettes();
+}
+
+void QWindowsTheme::clearPalettes()
+{
+ qDeleteAll(m_palettes, m_palettes + NPalettes);
+ qFill(m_palettes, m_palettes + NPalettes, static_cast<QPalette *>(0));
+}
+
+QWindowsTheme *QWindowsTheme::instance()
+{
+ return static_cast<QWindowsTheme *>(QWindowsIntegration::instance()->platformTheme());
+}
+
+static inline QStringList iconThemeSearchPaths()
+{
+ const QFileInfo appDir(QCoreApplication::applicationDirPath() + QStringLiteral("/icons"));
+ return appDir.isDir() ? QStringList(appDir.absoluteFilePath()) : QStringList();
+}
+
+static inline QStringList styleNames()
+{
+ QStringList result;
+ if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA)
+ result.append(QStringLiteral("WindowsVista"));
+ if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP)
+ result.append(QStringLiteral("WindowsXP"));
+ result.append(QStringLiteral("Windows"));
+ return result;
}
QVariant QWindowsTheme::themeHint(ThemeHint hint) const
{
switch (hint) {
+ case SystemIconThemeName:
+ break;
+ case IconThemeSearchPaths:
+ return QVariant(iconThemeSearchPaths());
+ break;
+ case StyleNames:
+ return QVariant(styleNames());
case TextCursorWidth:
return QVariant(int(dWordSystemParametersInfo(SPI_GETCARETWIDTH, 1u)));
case DropShadow:
@@ -81,6 +237,19 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const
return QVariant();
}
+void QWindowsTheme::refresh()
+{
+ clearPalettes();
+ if (QGuiApplication::desktopSettingsAware()) {
+ m_palettes[SystemPalette] = new QPalette(systemPalette());
+ m_palettes[ToolTipPalette] = new QPalette(toolTipPalette(*m_palettes[SystemPalette]));
+ if (QWindowsContext::verboseTheming)
+ qDebug() << __FUNCTION__ << '\n'
+ << " system=" << paletteToString(*m_palettes[SystemPalette])
+ << " tooltip=" << paletteToString(*m_palettes[ToolTipPalette]);
+ }
+}
+
bool QWindowsTheme::usePlatformNativeDialog(DialogType type) const
{
return QWindowsDialogs::useHelper(type);
@@ -91,4 +260,10 @@ QPlatformDialogHelper *QWindowsTheme::createPlatformDialogHelper(DialogType type
return QWindowsDialogs::createHelper(type);
}
+void QWindowsTheme::windowsThemeChanged(QWindow * /* window */)
+{
+ refresh();
+ // QWindowSystemInterface::handleThemeChange(window);
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowstheme.h b/src/plugins/platforms/windows/qwindowstheme.h
index 77c85b2d6e..950c380737 100644
--- a/src/plugins/platforms/windows/qwindowstheme.h
+++ b/src/plugins/platforms/windows/qwindowstheme.h
@@ -43,19 +43,43 @@
#define QWINDOWSTHEME_H
#include <QtGui/QPlatformTheme>
+#include <QtGui/QColor>
+
+#include "qtwindows_additional.h"
QT_BEGIN_NAMESPACE
+class QWindow;
+
class QWindowsTheme : public QPlatformTheme
{
public:
QWindowsTheme();
+ ~QWindowsTheme();
+
+ static QWindowsTheme *instance();
virtual bool usePlatformNativeDialog(DialogType type) const;
virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;
virtual QVariant themeHint(ThemeHint) const;
+ virtual const QPalette *palette(Palette type = SystemPalette) const
+ { return m_palettes[type]; }
+
+ void windowsThemeChanged(QWindow *window);
+
+private:
+ void refresh();
+ void clearPalettes();
+
+ QPalette *m_palettes[NPalettes];
};
+static inline COLORREF qColorToCOLORREF(const QColor &color)
+{ return RGB(color.red(), color.green(), color.blue()); }
+
+static inline QColor COLORREFToQColor(COLORREF cr)
+{ return QColor(GetRValue(cr), GetGValue(cr), GetBValue(cr)); }
+
QT_END_NAMESPACE
#endif // QWINDOWSTHEME_H
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 5d8de2e01d..3e0bec8d46 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -49,6 +49,7 @@
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
#include <QtGui/QWindow>
+#include <private/qwindow_p.h>
#include <QtGui/QWindowSystemInterface>
#include <QtCore/QDebug>
@@ -618,7 +619,8 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const WindowData &data) :
m_opacity(1.0),
m_mouseGrab(false),
m_cursor(QWindowsScreen::screenOf(aWindow)->cursor().standardWindowCursor()),
- m_dropTarget(0)
+ m_dropTarget(0),
+ m_savedStyle(0)
{
if (aWindow->surfaceType() == QWindow::OpenGLSurface)
setFlag(OpenGLSurface);
@@ -706,6 +708,7 @@ void QWindowsWindow::setVisible(bool visible)
hide_sys();
}
}
+ QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size()));
}
bool QWindowsWindow::isVisible() const
@@ -809,8 +812,15 @@ void QWindowsWindow::handleHidden()
QWindowSystemInterface::handleUnmapEvent(window());
}
-void QWindowsWindow::setGeometry(const QRect &rect)
+void QWindowsWindow::setGeometry(const QRect &rectIn)
{
+ QRect rect = rectIn;
+ // This means it is a call from QWindow::setFramePos() and
+ // the coordinates include the frame (size is still the contents rectangle).
+ if (qt_window_private(window())->positionPolicy == QWindowPrivate::WindowFrameInclusive) {
+ const QMargins margins = frameMargins();
+ rect.moveTopLeft(rect.topLeft() + QPoint(margins.left(), margins.top()));
+ }
const QSize oldSize = m_data.geometry.size();
m_data.geometry = rect;
const QSize newSize = rect.size();
@@ -904,11 +914,15 @@ void QWindowsWindow::setGeometry_sys(const QRect &rect) const
<< " \n resulting " << rc << geometry_sys();
}
-QRect QWindowsWindow::geometry_sys() const
+QRect QWindowsWindow::frameGeometry_sys() const
{
// Warning: Returns bogus values when minimized.
- QRect result = frameGeometry(m_data.hwnd, window()->isTopLevel()) - frameMargins();
- return result;
+ return frameGeometry(m_data.hwnd, window()->isTopLevel());
+}
+
+QRect QWindowsWindow::geometry_sys() const
+{
+ return frameGeometry_sys() - frameMargins();
}
/*!
@@ -1098,7 +1112,12 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
#else
UINT newStyle = WS_POPUP;
#endif
- if (style() & WS_SYSMENU)
+ // Save geometry and style to be restored when fullscreen
+ // is turned off again, since on Windows, it is not a real
+ // Window state but emulated by changing geometry and style.
+ m_savedStyle = style();
+ m_savedFrameGeometry = frameGeometry_sys();
+ if (m_savedStyle & WS_SYSMENU)
newStyle |= WS_SYSMENU;
if (visible)
newStyle |= WS_VISIBLE;
@@ -1108,19 +1127,26 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
UINT swpf = SWP_FRAMECHANGED;
if (newStates & Qt::WindowActive)
swpf |= SWP_NOACTIVATE;
-
SetWindowPos(m_data.hwnd, HWND_TOP, r.left(), r.top(), r.width(), r.height(), swpf);
} else {
+ // Restore saved state.
+ unsigned newStyle = m_savedStyle ? m_savedStyle : style();
if (visible)
- setStyle(style() | WS_VISIBLE);
- UINT swpf = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE;
+ newStyle |= WS_VISIBLE;
+ setStyle(newStyle);
+
+ UINT swpf = SWP_FRAMECHANGED | SWP_NOZORDER;
if (newStates & Qt::WindowActive)
swpf |= SWP_NOACTIVATE;
- SetWindowPos(m_data.hwnd, 0, 0, 0, 0, 0, swpf);
-
+ if (!m_savedFrameGeometry.isValid())
+ swpf |= SWP_NOSIZE | SWP_NOMOVE;
+ SetWindowPos(m_data.hwnd, 0, m_savedFrameGeometry.x(), m_savedFrameGeometry.y(),
+ m_savedFrameGeometry.width(), m_savedFrameGeometry.height(), swpf);
// preserve maximized state
if (visible)
ShowWindow(m_data.hwnd, (newStates & Qt::WindowMaximized) ? max : normal);
+ m_savedStyle = 0;
+ m_savedFrameGeometry = QRect();
}
}
@@ -1220,8 +1246,12 @@ void QWindowsWindow::requestActivateWindow()
{
if (QWindowsContext::verboseWindows)
qDebug() << __FUNCTION__ << this << window();
- if (m_data.hwnd)
+ // 'Active' state handling is based in focus since it needs to work for
+ // child windows as well.
+ if (m_data.hwnd) {
SetForegroundWindow(m_data.hwnd);
+ SetFocus(m_data.hwnd);
+ }
}
bool QWindowsWindow::setKeyboardGrabEnabled(bool grab)
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
index 1d5f3c29d6..e3336d1c3a 100644
--- a/src/plugins/platforms/windows/qwindowswindow.h
+++ b/src/plugins/platforms/windows/qwindowswindow.h
@@ -193,6 +193,7 @@ private:
inline void show_sys() const;
inline void hide_sys() const;
inline void setGeometry_sys(const QRect &rect) const;
+ inline QRect frameGeometry_sys() const;
inline QRect geometry_sys() const;
inline WindowData setWindowFlags_sys(Qt::WindowFlags wt, unsigned flags = 0) const;
inline void setWindowState_sys(Qt::WindowState newState);
@@ -213,6 +214,8 @@ private:
bool m_mouseGrab;
QWindowsWindowCursor m_cursor;
QWindowsOleDropTarget *m_dropTarget;
+ unsigned m_savedStyle;
+ QRect m_savedFrameGeometry;
};
// Conveniences for window frames.
diff --git a/src/plugins/platforms/windows/windows.json b/src/plugins/platforms/windows/windows.json
new file mode 100644
index 0000000000..05032c1b72
--- /dev/null
+++ b/src/plugins/platforms/windows/windows.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "windows" ]
+}
diff --git a/src/plugins/platforms/windows/windows.pro b/src/plugins/platforms/windows/windows.pro
index 453265405a..bb41fe87fc 100644
--- a/src/plugins/platforms/windows/windows.pro
+++ b/src/plugins/platforms/windows/windows.pro
@@ -13,6 +13,7 @@ LIBS *= -lOpenGL32 -lGdi32 -lUser32 -lOle32 -lWinspool -lImm32 -lWinmm -lOleaut
win32-g++: LIBS *= -luuid
# For the dialog helpers:
LIBS *= -lshlwapi -lShell32
+LIBS *= -lAdvapi32
DEFINES *= QT_NO_CAST_FROM_ASCII
@@ -46,7 +47,8 @@ SOURCES += \
qwindowsinputcontext.cpp \
qwindowsaccessibility.cpp \
qwindowstheme.cpp \
- qwindowsdialoghelpers.cpp
+ qwindowsdialoghelpers.cpp \
+ qwindowsservices.cpp
HEADERS += \
qwindowsnativeimage.h \
@@ -73,7 +75,11 @@ HEADERS += \
qwindowsinputcontext.h \
qwindowsaccessibility.h \
qwindowstheme.h \
- qwindowsdialoghelpers.h
+ qwindowsdialoghelpers.h \
+ qwindowsservices.h
+
+# Enable access to HB_Face in harfbuzz includes included by qfontengine_p.h.
+DEFINES *= QT_COMPILES_IN_HARFBUZZ
contains(QT_CONFIG, freetype) {
DEFINES *= QT_NO_FONTCONFIG
@@ -143,5 +149,7 @@ contains(QT_CONFIG, freetype) {
}
}
+OTHER_FILES += windows.json
+
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/xcb/main.cpp b/src/plugins/platforms/xcb/main.cpp
index 5aa3e921f3..50c5a1a017 100644
--- a/src/plugins/platforms/xcb/main.cpp
+++ b/src/plugins/platforms/xcb/main.cpp
@@ -46,6 +46,8 @@ QT_BEGIN_NAMESPACE
class QXcbIntegrationPlugin : public QPlatformIntegrationPlugin
{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPlatformIntegrationFactoryInterface" FILE "xcb.json")
public:
QStringList keys() const;
QPlatformIntegration *create(const QString&, const QStringList&);
@@ -66,6 +68,6 @@ QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const
return 0;
}
-Q_EXPORT_PLUGIN2(xcb, QXcbIntegrationPlugin)
-
QT_END_NAMESPACE
+
+#include "main.moc"
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index 6ada127beb..0144caae3d 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -64,6 +64,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
: QPlatformOpenGLContext()
, m_screen(screen)
, m_context(0)
+ , m_format(format)
{
m_shareContext = 0;
if (share)
@@ -82,7 +83,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
if (m_context)
m_format = qglx_surfaceFormatFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
} else {
- XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), screen->screenNumber(), format);
+ XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), screen->screenNumber(), &m_format);
if (!visualInfo)
qFatal("Could not initialize GLX");
m_context = glXCreateContext(DISPLAY_FROM_XCB(screen), visualInfo, m_shareContext, true);
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
index a05fc780bc..e928fe2d0a 100644
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
@@ -234,6 +234,7 @@ xcb_window_t QXcbDrag::findRealWindow(const QPoint & pos, xcb_window_t w, int md
xcb_get_geometry_cookie_t gcookie = xcb_get_geometry(xcb_connection(), w);
xcb_get_geometry_reply_t *greply = xcb_get_geometry_reply(xcb_connection(), gcookie, 0);
if (reply && QRect(greply->x, greply->y, greply->width, greply->height).contains(pos)) {
+ bool windowContainsMouse = true;
{
xcb_get_property_cookie_t cookie =
Q_XCB_CALL(xcb_get_property(xcb_connection(), false, w, connection()->atom(QXcbAtom::XdndAware),
@@ -242,8 +243,26 @@ xcb_window_t QXcbDrag::findRealWindow(const QPoint & pos, xcb_window_t w, int md
bool isAware = reply && reply->type != XCB_NONE;
free(reply);
- if (isAware)
- return w;
+ if (isAware) {
+ xcb_xfixes_region_t region = xcb_generate_id(xcb_connection());
+ xcb_xfixes_create_region_from_window(xcb_connection(), region, w, XCB_SHAPE_SK_BOUNDING);
+ xcb_xfixes_fetch_region_reply_t *reply = xcb_xfixes_fetch_region_reply(xcb_connection(), xcb_xfixes_fetch_region(xcb_connection(), region), NULL);
+ if (reply) {
+ xcb_rectangle_t *rectangles = xcb_xfixes_fetch_region_rectangles(reply);
+ if (rectangles) {
+ windowContainsMouse = false;
+ const int nRectangles = xcb_xfixes_fetch_region_rectangles_length(reply);
+ for (int i = 0; !windowContainsMouse && i < nRectangles; ++i) {
+ windowContainsMouse = QRect(rectangles[i].x, rectangles[i].y, rectangles[i].width, rectangles[i].height).contains(pos);
+ }
+ }
+ free(reply);
+ }
+ xcb_xfixes_destroy_region(xcb_connection(), region);
+
+ if (windowContainsMouse)
+ return w;
+ }
}
xcb_query_tree_cookie_t cookie = xcb_query_tree (xcb_connection(), w);
@@ -266,7 +285,10 @@ xcb_window_t QXcbDrag::findRealWindow(const QPoint & pos, xcb_window_t w, int md
// innermost window.
// No children!
- return w;
+ if (!windowContainsMouse)
+ return 0;
+ else
+ return w;
}
}
return 0;
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 40359169ca..e7cdef4da9 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -53,6 +53,8 @@
#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h>
+#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h>
+#include <QtPlatformSupport/private/qgenericunixservices_p.h>
#include <stdio.h>
@@ -68,6 +70,7 @@
#endif
#include <private/qplatforminputcontextfactory_qpa_p.h>
+#include <private/qgenericunixthemes_p.h>
#include <qplatforminputcontext_qpa.h>
#if defined(XCB_USE_GLX)
@@ -84,7 +87,9 @@
QT_BEGIN_NAMESPACE
QXcbIntegration::QXcbIntegration(const QStringList &parameters)
- : m_eventDispatcher(createUnixEventDispatcher())
+ : m_eventDispatcher(createUnixEventDispatcher()),
+ m_services(new QGenericUnixServices),
+ m_theme(QGenericUnixTheme::createUnixTheme())
{
QGuiApplicationPrivate::instance()->setEventDispatcher(m_eventDispatcher);
@@ -168,6 +173,7 @@ private:
};
#endif
+#ifndef QT_NO_OPENGL
QPlatformOpenGLContext *QXcbIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
{
QXcbScreen *screen = static_cast<QXcbScreen *>(context->screen()->handle());
@@ -182,6 +188,7 @@ QPlatformOpenGLContext *QXcbIntegration::createPlatformOpenGLContext(QOpenGLCont
qWarning("Cannot create platform GL context, none of GLX, EGL, DRI2 is enabled");
return 0;
}
+#endif
QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *window) const
{
@@ -268,4 +275,14 @@ QPlatformSharedGraphicsCache *QXcbIntegration::createPlatformSharedGraphicsCache
}
#endif
+QPlatformServices *QXcbIntegration::services() const
+{
+ return m_services.data();
+}
+
+QPlatformTheme *QXcbIntegration::platformTheme() const
+{
+ return m_theme.data();
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h
index eefecd509b..457f90d6e0 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.h
+++ b/src/plugins/platforms/xcb/qxcbintegration.h
@@ -58,7 +58,9 @@ public:
~QXcbIntegration();
QPlatformWindow *createPlatformWindow(QWindow *window) const;
+#ifndef QT_NO_OPENGL
QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
+#endif
QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
bool hasCapability(Capability cap) const;
@@ -81,6 +83,10 @@ public:
QPlatformSharedGraphicsCache *createPlatformSharedGraphicsCache(const char *cacheId) const;
#endif
+ QPlatformServices *services() const;
+
+ QPlatformTheme *platformTheme() const;
+
private:
QList<QXcbConnection *> m_connections;
@@ -95,6 +101,9 @@ private:
#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
QScopedPointer<QPlatformSharedGraphicsCache> m_sharedGraphicsCache;
#endif
+
+ QScopedPointer<QPlatformServices> m_services;
+ QScopedPointer<QPlatformTheme> m_theme;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index 8c86d43f17..b682b87bc3 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -50,6 +50,7 @@
#include <stdio.h>
#include <qplatforminputcontext_qpa.h>
+#include <qplatformintegration_qpa.h>
#ifndef XK_ISO_Left_Tab
#define XK_ISO_Left_Tab 0xFE20
@@ -939,38 +940,35 @@ void QXcbKeyboard::setupModifiers()
return;
}
- // Figure out the modifier mapping, ICCCM 6.6
- typedef QPair<uint, xcb_keycode_t *> SymCodes;
- QList<SymCodes> modKeyCodes;
-
// for Alt and Meta L and R are the same
- modKeyCodes << SymCodes(XK_Alt_L, xcb_key_symbols_get_keycode(m_key_symbols, XK_Alt_L));
- modKeyCodes << SymCodes(XK_Meta_L, xcb_key_symbols_get_keycode(m_key_symbols, XK_Meta_L));
- modKeyCodes << SymCodes(XK_Super_L, xcb_key_symbols_get_keycode(m_key_symbols, XK_Super_L));
- modKeyCodes << SymCodes(XK_Super_R, xcb_key_symbols_get_keycode(m_key_symbols, XK_Super_R));
- modKeyCodes << SymCodes(XK_Hyper_L, xcb_key_symbols_get_keycode(m_key_symbols, XK_Hyper_L));
- modKeyCodes << SymCodes(XK_Hyper_R, xcb_key_symbols_get_keycode(m_key_symbols, XK_Hyper_R));
- modKeyCodes << SymCodes(XK_Num_Lock, xcb_key_symbols_get_keycode(m_key_symbols, XK_Num_Lock));
- modKeyCodes << SymCodes(XK_Mode_switch, xcb_key_symbols_get_keycode(m_key_symbols, XK_Mode_switch));
- modKeyCodes << SymCodes(XK_Caps_Lock, xcb_key_symbols_get_keycode(m_key_symbols, XK_Caps_Lock));
+ static const xcb_keysym_t symbols[] = {
+ XK_Alt_L, XK_Meta_L, XK_Super_L, XK_Super_R,
+ XK_Hyper_L, XK_Hyper_R, XK_Num_Lock, XK_Mode_switch, XK_Caps_Lock,
+ };
+ static const size_t numSymbols = sizeof symbols / sizeof *symbols;
+
+ // Figure out the modifier mapping, ICCCM 6.6
+ xcb_keycode_t* modKeyCodes[numSymbols];
+ for (size_t i = 0; i < numSymbols; ++i)
+ modKeyCodes[i] = xcb_key_symbols_get_keycode(m_key_symbols, symbols[i]);
xcb_keycode_t *modMap = xcb_get_modifier_mapping_keycodes(modMapReply);
const int w = modMapReply->keycodes_per_modifier;
- for (int i = 0; i < modKeyCodes.count(); ++i) {
+ for (size_t i = 0; i < numSymbols; ++i) {
for (int bit = 0; bit < 8; ++bit) {
uint mask = 1 << bit;
for (int x = 0; x < w; ++x) {
xcb_keycode_t keyCode = modMap[x + bit * w];
- xcb_keycode_t *itk = modKeyCodes.at(i).second;
+ xcb_keycode_t *itk = modKeyCodes[i];
while (itk && *itk != XCB_NO_SYMBOL)
if (*itk++ == keyCode)
- setMask(modKeyCodes.at(i).first, mask);
+ setMask(symbols[i], mask);
}
}
}
- for (int i = 0; i < modKeyCodes.count(); ++i)
- free(modKeyCodes.at(i).second);
+ for (size_t i = 0; i < numSymbols; ++i)
+ free(modKeyCodes[i]);
free(modMapReply);
}
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index b7403cfdce..406f9c24bd 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -84,6 +84,9 @@ QXcbNativeInterface::QXcbNativeInterface()
void *QXcbNativeInterface::nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context)
{
QByteArray lowerCaseResource = resourceString.toLower();
+ if (!qXcbResourceMap()->contains(lowerCaseResource))
+ return 0;
+
ResourceType resource = qXcbResourceMap()->value(lowerCaseResource);
void *result = 0;
switch(resource) {
@@ -91,14 +94,18 @@ void *QXcbNativeInterface::nativeResourceForContext(const QByteArray &resourceSt
result = eglContextForContext(context);
break;
default:
- result = 0;
+ break;
}
+
return result;
}
void *QXcbNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window)
{
QByteArray lowerCaseResource = resourceString.toLower();
+ if (!qXcbResourceMap()->contains(lowerCaseResource))
+ return 0;
+
ResourceType resource = qXcbResourceMap()->value(lowerCaseResource);
void *result = 0;
switch(resource) {
@@ -118,8 +125,9 @@ void *QXcbNativeInterface::nativeResourceForWindow(const QByteArray &resourceStr
result = graphicsDeviceForWindow(window);
break;
default:
- result = 0;
+ break;
}
+
return result;
}
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 959209dd33..be3d527cfc 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -50,6 +50,8 @@
#include "qxcbkeyboard.h"
#include "qxcbwmsupport.h"
+#include <qplatformintegration_qpa.h>
+
#ifdef XCB_USE_DRI2
#include "qdri2context.h"
#endif
@@ -201,19 +203,21 @@ void QXcbWindow::create()
if (parent())
xcb_parent_id = static_cast<QXcbWindow *>(parent())->xcb_window();
- m_requestedFormat = window()->format();
+ m_format = window()->requestedFormat();
#if (defined(XCB_USE_GLX) || defined(XCB_USE_EGL)) && defined(XCB_USE_XLIB)
if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)
- || window()->format().hasAlpha())
+ || m_format.hasAlpha())
{
#if defined(XCB_USE_GLX)
- XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), window()->format());
+ XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber(), &m_format);
if (!visualInfo)
qFatal("Could not initialize GLX");
#elif defined(XCB_USE_EGL)
EGLDisplay eglDisplay = connection()->egl_display();
- EGLConfig eglConfig = q_configFromGLFormat(eglDisplay, window()->format(), true);
+ EGLConfig eglConfig = q_configFromGLFormat(eglDisplay, m_format, true);
+ m_format = q_glFormatFromConfig(eglDisplay, eglConfig);
+
VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this), eglDisplay, eglConfig);
XVisualInfo visualInfoTemplate;
@@ -1167,7 +1171,7 @@ void QXcbWindow::setOrientation(Qt::ScreenOrientation orientation)
QSurfaceFormat QXcbWindow::format() const
{
// ### return actual format
- return m_requestedFormat;
+ return m_format;
}
#if defined(XCB_USE_EGL)
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 3cbf9e7e0d..365c8b0549 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -155,7 +155,7 @@ private:
bool m_transparent;
xcb_window_t m_netWmUserTimeWindow;
- QSurfaceFormat m_requestedFormat;
+ QSurfaceFormat m_format;
mutable bool m_dirtyFrameMargins;
mutable QMargins m_frameMargins;
diff --git a/src/plugins/platforms/xcb/xcb.json b/src/plugins/platforms/xcb/xcb.json
new file mode 100644
index 0000000000..dc09d7b54f
--- /dev/null
+++ b/src/plugins/platforms/xcb/xcb.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "xcb" ]
+}
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index d80a6df0b6..7bad2b4dad 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -78,7 +78,7 @@ contains(DEFINES, XCB_USE_DRI2) {
HEADERS += qdri2context.h
SOURCES += qdri2context.cpp
-} else {
+} else:contains(QT_CONFIG, opengl) {
contains(QT_CONFIG, opengles2) {
DEFINES += XCB_USE_EGL
LIBS += -lEGL
@@ -108,5 +108,7 @@ QT += dbus
LIBS += -ldbus-1
}
+OTHER_FILES += xcb.json
+
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/xlib/qglxintegration.cpp b/src/plugins/platforms/xlib/qglxintegration.cpp
index e78689374a..51621408b9 100644
--- a/src/plugins/platforms/xlib/qglxintegration.cpp
+++ b/src/plugins/platforms/xlib/qglxintegration.cpp
@@ -65,6 +65,7 @@ QGLXContext::QGLXContext(QXlibScreen *screen, const QSurfaceFormat &format, QPla
: QPlatformOpenGLContext()
, m_screen(screen)
, m_context(0)
+ , m_windowFormat(format)
{
GLXContext shareGlxContext = 0;
if (share)
@@ -77,7 +78,7 @@ QGLXContext::QGLXContext(QXlibScreen *screen, const QSurfaceFormat &format, QPla
m_context = glXCreateNewContext(xDisplay,config,GLX_RGBA_TYPE,shareGlxContext,TRUE);
m_windowFormat = qglx_surfaceFormatFromGLXFBConfig(xDisplay,config,m_context);
} else {
- XVisualInfo *visualInfo = qglx_findVisualInfo(xDisplay, screen->xScreenNumber(), format);
+ XVisualInfo *visualInfo = qglx_findVisualInfo(xDisplay, screen->xScreenNumber(), &m_windowFormat);
if (!visualInfo)
qFatal("Could not initialize GLX");
m_context = glXCreateContext(xDisplay, visualInfo, shareGlxContext, true);
diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp
index 965f6ffcc5..65d4d231c8 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.cpp
+++ b/src/plugins/platforms/xlib/qxlibintegration.cpp
@@ -68,7 +68,7 @@ QXlibIntegration::QXlibIntegration()
XInitThreads();
- mPrimaryScreen = new QXlibScreen();
+ mPrimaryScreen = new QXlibScreen(mNativeInterface);
mScreens.append(mPrimaryScreen);
screenAdded(mPrimaryScreen);
}
diff --git a/src/plugins/platforms/xlib/qxlibintegration.h b/src/plugins/platforms/xlib/qxlibintegration.h
index b76c6e85d8..76c3f13ff6 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.h
+++ b/src/plugins/platforms/xlib/qxlibintegration.h
@@ -54,6 +54,7 @@
QT_BEGIN_NAMESPACE
class QXlibScreen;
+class QXlibNativeInterface;
class QXlibIntegration : public QPlatformIntegration
{
@@ -82,7 +83,7 @@ private:
QList<QPlatformScreen *> mScreens;
QPlatformFontDatabase *mFontDb;
QPlatformClipboard *mClipboard;
- QPlatformNativeInterface *mNativeInterface;
+ QXlibNativeInterface *mNativeInterface;
QAbstractEventDispatcher *mEventDispatcher;
};
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.cpp b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
index 06f11773bb..0519a365cf 100644
--- a/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
@@ -92,6 +92,17 @@ void * QXlibNativeInterface::nativeResourceForWindow(const QByteArray &resourceS
}
return result;
}
+QPlatformNativeInterface::EventFilter QXlibNativeInterface::setEventFilter(const QByteArray &eventType, QPlatformNativeInterface::EventFilter filter)
+{
+ EventFilter oldFilter = m_eventFilters.value(eventType);
+ m_eventFilters.insert(eventType, filter);
+ return oldFilter;
+}
+
+QPlatformNativeInterface::EventFilter QXlibNativeInterface::eventFilterForEventType(const QByteArray& eventType) const
+{
+ return m_eventFilters.value(eventType);
+}
void * QXlibNativeInterface::displayForWindow(QWindow *window)
{
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.h b/src/plugins/platforms/xlib/qxlibnativeinterface.h
index 8f68e61caf..9ec4ab51c8 100644
--- a/src/plugins/platforms/xlib/qxlibnativeinterface.h
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.h
@@ -60,6 +60,9 @@ public:
void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window);
+ EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter);
+ EventFilter eventFilterForEventType(const QByteArray& eventType) const;
+
void *displayForWindow(QWindow *window);
void *eglDisplayForWindow(QWindow *window);
void *connectionForWindow(QWindow *window);
@@ -68,6 +71,7 @@ public:
void *eglContextForWindow(QWindow *window);
private:
+ QHash<QByteArray, EventFilter> m_eventFilters;
static QXlibScreen *qPlatformScreenForWindow(QWindow *window);
};
diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp
index ed6f77d830..fc903708b3 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.cpp
+++ b/src/plugins/platforms/xlib/qxlibscreen.cpp
@@ -50,6 +50,7 @@
#include "qxlibstatic.h"
#include "qxlibclipboard.h"
#include "qxlibdisplay.h"
+#include "qxlibnativeinterface.h"
#include <QtCore/QDebug>
#include <QtCore/QSocketNotifier>
@@ -190,8 +191,9 @@ qDebug() << "qt_x_errhandler" << err->error_code;
return 0;
}
-QXlibScreen::QXlibScreen()
- : mFormat(QImage::Format_RGB32)
+QXlibScreen::QXlibScreen(QXlibNativeInterface *nativeInterface)
+ : mNativeInterface(nativeInterface)
+ , mFormat(QImage::Format_RGB32)
#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
, mEGLDisplay(0)
#endif
@@ -263,6 +265,11 @@ unsigned long QXlibScreen::whitePixel()
bool QXlibScreen::handleEvent(XEvent *xe)
{
+ if (QPlatformNativeInterface::EventFilter filter = mNativeInterface->eventFilterForEventType(QByteArrayLiteral("XEvent"))) {
+ if (filter(xe, 0))
+ return true;
+ }
+
int quit = false;
QXlibWindow *platformWindow = QXlibWindow::platformWindowForXWindow(xe->xany.window);
if (!platformWindow)
diff --git a/src/plugins/platforms/xlib/qxlibscreen.h b/src/plugins/platforms/xlib/qxlibscreen.h
index 3404243c2c..c6672c3540 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.h
+++ b/src/plugins/platforms/xlib/qxlibscreen.h
@@ -55,7 +55,7 @@ class QXlibScreen : public QObject, public QPlatformScreen
{
Q_OBJECT
public:
- QXlibScreen();
+ QXlibScreen(QXlibNativeInterface *nativeInterface);
~QXlibScreen();
@@ -93,6 +93,7 @@ public slots:
private:
void handleSelectionRequest(XEvent *event);
+ QXlibNativeInterface *mNativeInterface;
QRect mGeometry;
QSizeF mPhysicalSize;
int mDepth;
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index 635caf81f8..94c4332e65 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -82,11 +82,12 @@ QXlibWindow::QXlibWindow(QWindow *window)
int w = window->width();
int h = window->height();
+ mSurfaceFormat = window->requestedFormat();
+
#if !defined(QT_NO_OPENGL)
if(window->surfaceType() == QWindow::OpenGLSurface) {
#if !defined(QT_OPENGL_ES_2)
- XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber(),
- window->format());
+ XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber(), &mSurfaceFormat);
if (!visualInfo)
qFatal("Could not initialize GLX");
#else
@@ -694,7 +695,7 @@ void QXlibWindow::setCursor(const Cursor &cursor)
QSurfaceFormat QXlibWindow::format() const
{
- return window()->format();
+ return mSurfaceFormat;
}
diff --git a/src/plugins/platforms/xlib/qxlibwindow.h b/src/plugins/platforms/xlib/qxlibwindow.h
index 8287f3a8a2..6b9e2d63bd 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.h
+++ b/src/plugins/platforms/xlib/qxlibwindow.h
@@ -143,6 +143,8 @@ private:
QImage::Format mFormat;
Visual* mVisual;
+ QSurfaceFormat mSurfaceFormat;
+
GC createGC();
QPlatformOpenGLContext *mGLContext;
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index b92ccff985..177f64c71b 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -4,4 +4,6 @@ SUBDIRS *= sqldrivers bearer
!contains(QT_CONFIG, no-gui): SUBDIRS *= imageformats
!isEmpty(QT.widgets.name): SUBDIRS += accessible
-SUBDIRS += platforms platforminputcontexts printsupport generic
+SUBDIRS += platforms platforminputcontexts generic
+
+!wince*:SUBDIRS += printsupport
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index e3533581ba..ec31d54f0f 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -107,18 +107,10 @@
template <typename T>
inline void PQfreemem(T *t, int = 0) { free(t); }
-QT_BEGIN_NAMESPACE namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<PGconn*> {
- enum { Value = false };
-};
-} QT_END_NAMESPACE
+Q_DECLARE_OPAQUE_POINTER(PGconn*)
Q_DECLARE_METATYPE(PGconn*)
-QT_BEGIN_NAMESPACE namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<PGresult*> {
- enum { Value = false };
-};
-} QT_END_NAMESPACE
+Q_DECLARE_OPAQUE_POINTER(PGresult*)
Q_DECLARE_METATYPE(PGresult*)
QT_BEGIN_NAMESPACE
diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp
index 962fc97dfc..d2dc5af070 100644
--- a/src/sql/drivers/sqlite/qsql_sqlite.cpp
+++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp
@@ -59,18 +59,10 @@
#include <sqlite3.h>
-QT_BEGIN_NAMESPACE namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<sqlite3*> {
- enum { Value = false };
-};
-} QT_END_NAMESPACE
+Q_DECLARE_OPAQUE_POINTER(sqlite3*)
Q_DECLARE_METATYPE(sqlite3*)
-QT_BEGIN_NAMESPACE namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<sqlite3_stmt*> {
- enum { Value = false };
-};
-} QT_END_NAMESPACE
+Q_DECLARE_OPAQUE_POINTER(sqlite3_stmt*)
Q_DECLARE_METATYPE(sqlite3_stmt*)
QT_BEGIN_NAMESPACE
diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
index 46127923bf..b42f82e800 100644
--- a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
+++ b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
@@ -60,15 +60,10 @@
typedef struct sqlite_vm sqlite_vm;
-QT_BEGIN_NAMESPACE namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<sqlite_vm*> {
- enum { Value = false };
-};
-template <> struct IsPointerToTypeDerivedFromQObject<sqlite*> {
- enum { Value = false };
-};
-} QT_END_NAMESPACE
+Q_DECLARE_OPAQUE_POINTER(sqlite_vm*)
Q_DECLARE_METATYPE(sqlite_vm*)
+
+Q_DECLARE_OPAQUE_POINTER(sqlite*)
Q_DECLARE_METATYPE(sqlite*)
QT_BEGIN_NAMESPACE
diff --git a/src/sql/drivers/tds/qsql_tds.cpp b/src/sql/drivers/tds/qsql_tds.cpp
index 2a97a3c392..b9414499d8 100644
--- a/src/sql/drivers/tds/qsql_tds.cpp
+++ b/src/sql/drivers/tds/qsql_tds.cpp
@@ -63,6 +63,9 @@
#include <stdlib.h>
+Q_DECLARE_OPAQUE_POINTER(LOGINREC*)
+Q_DECLARE_OPAQUE_POINTER(DBPROCESS*)
+
QT_BEGIN_NAMESPACE
#ifdef DBNTWIN32
@@ -127,18 +130,6 @@ QT_BEGIN_NAMESPACE
#define CS_PUBLIC
#endif
-namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<LOGINREC*> {
- enum { Value = false };
-};
-}
-
-namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<DBPROCESS*> {
- enum { Value = false };
-};
-}
-
QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, int errNo = -1)
{
return QSqlError(QLatin1String("QTDS: ") + err, QString(), type, errNo);
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index d260588dd5..7b6a2b8c12 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -138,10 +138,7 @@ public:
driver(dr),
port(-1)
{
- if(driver)
- precisionPolicy = driver->numericalPrecisionPolicy();
- else
- precisionPolicy= QSql::LowPrecisionDouble;
+ precisionPolicy = QSql::LowPrecisionDouble;
}
QSqlDatabasePrivate(const QSqlDatabasePrivate &other);
~QSqlDatabasePrivate();
diff --git a/src/sql/models/qsqlquerymodel.h b/src/sql/models/qsqlquerymodel.h
index 7db973b0d4..b5e1a7a746 100644
--- a/src/sql/models/qsqlquerymodel.h
+++ b/src/sql/models/qsqlquerymodel.h
@@ -92,7 +92,7 @@ public:
protected:
virtual void queryChange();
- QModelIndex indexInQuery(const QModelIndex &item) const;
+ virtual QModelIndex indexInQuery(const QModelIndex &item) const;
void setLastError(const QSqlError &error);
QSqlQueryModel(QSqlQueryModelPrivate &dd, QObject *parent = 0);
};
diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp
index e12976ef24..8dd18ca1d0 100644
--- a/src/sql/models/qsqlrelationaltablemodel.cpp
+++ b/src/sql/models/qsqlrelationaltablemodel.cpp
@@ -268,7 +268,7 @@ public:
void clearCache();
void revertCachedRow(int row);
- void translateFieldNames(int row, QSqlRecord &values) const;
+ void translateFieldNames(QSqlRecord &values) const;
QSqlRelationalTableModel::JoinMode joinMode;
};
@@ -299,9 +299,7 @@ void QSqlRelationalTableModelPrivate::revertCachedRow(int row)
int QSqlRelationalTableModelPrivate::nameToIndex(const QString &name) const
{
- QString fieldname = name;
- if (db.driver()->isIdentifierEscaped(fieldname, QSqlDriver::FieldName))
- fieldname = db.driver()->stripDelimiters(fieldname, QSqlDriver::FieldName);
+ QString fieldname = strippedFieldName(name);
int idx = baseRec.indexOf(fieldname);
if (idx == -1) {
// If the name is an alias we can find it here.
@@ -440,9 +438,9 @@ QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role) cons
//already have the correct display value.
if (d->strategy != OnFieldChange) {
const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
- if (row.op != QSqlTableModelPrivate::None && row.rec.isGenerated(index.column())) {
- if (d->strategy == OnManualSubmit || row.op != QSqlTableModelPrivate::Delete) {
- QVariant v = row.rec.value(index.column());
+ if (row.op() != QSqlTableModelPrivate::None && row.rec().isGenerated(index.column())) {
+ if (d->strategy == OnManualSubmit || row.op() != QSqlTableModelPrivate::Delete) {
+ QVariant v = row.rec().value(index.column());
if (v.isValid())
return relation.dictionary[v.toString()];
}
@@ -746,16 +744,13 @@ void QSqlRelationalTableModel::setTable(const QString &table)
/*! \internal
*/
-void QSqlRelationalTableModelPrivate::translateFieldNames(int row, QSqlRecord &values) const
+void QSqlRelationalTableModelPrivate::translateFieldNames(QSqlRecord &values) const
{
- Q_Q(const QSqlRelationalTableModel);
-
for (int i = 0; i < values.count(); ++i) {
- int realCol = q->indexInQuery(q->createIndex(row, i)).column();
- if (realCol != -1 && relations.value(realCol).isValid()) {
+ if (relations.value(i).isValid()) {
QVariant v = values.value(i);
bool gen = values.isGenerated(i);
- values.replace(i, baseRec.field(realCol));
+ values.replace(i, baseRec.field(i));
values.setValue(i, v);
values.setGenerated(i, gen);
}
@@ -770,7 +765,7 @@ bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &value
Q_D(QSqlRelationalTableModel);
QSqlRecord rec = values;
- d->translateFieldNames(row, rec);
+ d->translateFieldNames(rec);
return QSqlTableModel::updateRowInTable(row, rec);
}
@@ -783,7 +778,7 @@ bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
Q_D(QSqlRelationalTableModel);
QSqlRecord rec = values;
- d->translateFieldNames(0, rec);
+ d->translateFieldNames(rec);
return QSqlTableModel::insertRowIntoTable(rec);
}
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index ff32533440..932bbbfd6b 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -68,10 +68,30 @@ QSqlRecord QSqlTableModelPrivate::record(const QVector<QVariant> &values) const
int QSqlTableModelPrivate::nameToIndex(const QString &name) const
{
+ return rec.indexOf(strippedFieldName(name));
+}
+
+QString QSqlTableModelPrivate::strippedFieldName(const QString &name) const
+{
QString fieldname = name;
if (db.driver()->isIdentifierEscaped(fieldname, QSqlDriver::FieldName))
fieldname = db.driver()->stripDelimiters(fieldname, QSqlDriver::FieldName);
- return rec.indexOf(fieldname);
+ return fieldname;
+}
+
+int QSqlTableModelPrivate::insertCount(int maxRow) const
+{
+ int cnt = 0;
+ CacheMap::ConstIterator i = cache.constBegin();
+ const CacheMap::ConstIterator e = cache.constEnd();
+ for (;
+ i != e && (maxRow < 0 || i.key() <= maxRow);
+ ++i) {
+ if (i.value().op() == Insert)
+ ++cnt;
+ }
+
+ return cnt;
}
void QSqlTableModelPrivate::initRecordAndPrimaryIndex()
@@ -101,7 +121,12 @@ void QSqlTableModelPrivate::revertCachedRow(int row)
{
Q_Q(QSqlTableModel);
ModifiedRow r = cache.value(row);
- switch (r.op) {
+
+ // cannot revert a committed change
+ if (r.submitted())
+ return;
+
+ switch (r.op()) {
case QSqlTableModelPrivate::None:
Q_ASSERT_X(false, "QSqlTableModelPrivate::revertCachedRow()", "Invalid entry in cache map");
return;
@@ -174,23 +199,18 @@ bool QSqlTableModelPrivate::exec(const QString &stmt, bool prepStatement,
return true;
}
-QSqlRecord QSqlTableModelPrivate::primaryValues(int row)
+QSqlRecord QSqlTableModelPrivate::primaryValues(int row) const
{
- QSqlRecord record;
- if (!query.seek(row)) {
- error = query.lastError();
- return record;
- }
- if (primaryIndex.isEmpty()) {
- record = rec;
- for (int i = 0; i < record.count(); ++i)
- record.setValue(i, query.value(i));
- } else {
- record = primaryIndex;
- for (int i = 0; i < record.count(); ++i)
- record.setValue(i, query.value(rec.indexOf(record.fieldName(i))));
- }
- return record;
+ Q_Q(const QSqlTableModel);
+ if (cache.value(row).op() == Insert)
+ return QSqlRecord();
+
+ QSqlRecord values(primaryIndex.isEmpty() ? rec : primaryIndex);
+
+ for (int i = 0; i < values.count(); ++i)
+ values.setValue(i, q->QSqlQueryModel::data(createIndex(row, rec.indexOf(values.fieldName(i))), Qt::EditRole));
+
+ return values;
}
/*!
@@ -251,7 +271,9 @@ QSqlRecord QSqlTableModelPrivate::primaryValues(int row)
initiated in the given \a row of the currently active database
table. The \a record parameter can be written to (since it is a
reference), for example to populate some fields with default
- values.
+ values and set the generated flags of the fields. Do not try to
+ edit the record via other means such as setData() or setRecord()
+ while handling this signal.
*/
/*!
@@ -356,6 +378,12 @@ bool QSqlTableModel::select()
if (query.isEmpty())
return false;
+ // clear the submitted flags so revertAll can do its job
+ for (QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.begin();
+ it != d->cache.constEnd();
+ ++it)
+ it.value().setSubmitted(false);
+
revertAll();
QSqlQuery qu(query, d->db);
setQuery(qu);
@@ -377,38 +405,31 @@ QVariant QSqlTableModel::data(const QModelIndex &index, int role) const
if (!index.isValid() || (role != Qt::DisplayRole && role != Qt::EditRole))
return QVariant();
- // Problem.. we need to use QSQM::indexInQuery to handle inserted columns
- // but inserted rows we need to handle
- // and indexInQuery is not virtual (grrr) so any values we pass to QSQM need
- // to handle the insertedRows
- QModelIndex item = indexInQuery(index);
-
if (d->cache.contains(index.row())) {
const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
switch (d->strategy) {
case OnFieldChange:
case OnRowChange:
- if (row.op == QSqlTableModelPrivate::Insert) {
- if (item.column() < 0 || item.column() >= row.rec.count())
+ if (row.op() == QSqlTableModelPrivate::Insert) {
+ if (index.column() < 0 || index.column() >= row.rec().count())
return QVariant();
- return row.rec.value(item.column());
- } else if (row.op == QSqlTableModelPrivate::Update) {
- if (row.rec.isGenerated(item.column()))
- return row.rec.value(item.column());
+ return row.rec().value(index.column());
+ } else if (row.op() == QSqlTableModelPrivate::Update) {
+ if (row.rec().isGenerated(index.column()))
+ return row.rec().value(index.column());
}
break;
case OnManualSubmit:
- if (row.op == QSqlTableModelPrivate::Insert
- || (row.op != QSqlTableModelPrivate::None
- && row.rec.isGenerated(item.column())))
- return row.rec.value(item.column());
+ if (row.op() == QSqlTableModelPrivate::Insert
+ || (row.op() != QSqlTableModelPrivate::None
+ && row.rec().isGenerated(index.column())))
+ return row.rec().value(index.column());
break;
}
}
- // We need to handle row mapping here, but not column mapping
- return QSqlQueryModel::data(index.sibling(item.row(), index.column()), role);
+ return QSqlQueryModel::data(index, role);
}
/*!
@@ -419,7 +440,7 @@ QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, in
Q_D(const QSqlTableModel);
if (orientation == Qt::Vertical && role == Qt::DisplayRole) {
if (d->cache.contains(section)) {
- const QSqlTableModelPrivate::Op op = d->cache.value(section).op;
+ const QSqlTableModelPrivate::Op op = d->cache.value(section).op();
if (op == QSqlTableModelPrivate::Insert)
return QLatin1String("*");
else if (op == QSqlTableModelPrivate::Delete)
@@ -447,15 +468,15 @@ bool QSqlTableModel::isDirty(const QModelIndex &index) const
return false;
case OnRowChange: {
const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
- return row.op == QSqlTableModelPrivate::Update
- && row.rec.isGenerated(index.column());
+ return row.op() == QSqlTableModelPrivate::Update
+ && row.rec().isGenerated(index.column());
}
case OnManualSubmit: {
const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
- return row.op == QSqlTableModelPrivate::Insert
- || row.op == QSqlTableModelPrivate::Delete
- || (row.op == QSqlTableModelPrivate::Update
- && row.rec.isGenerated(index.column()));
+ return row.op() == QSqlTableModelPrivate::Insert
+ || row.op() == QSqlTableModelPrivate::Delete
+ || (row.op() == QSqlTableModelPrivate::Update
+ && row.rec().isGenerated(index.column()));
}
}
return false;
@@ -474,13 +495,16 @@ bool QSqlTableModel::isDirty(const QModelIndex &index) const
bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
Q_D(QSqlTableModel);
+ if (d->busyInsertingRows)
+ return false;
+
if (role != Qt::EditRole)
return QSqlQueryModel::setData(index, value, role);
if (!index.isValid() || index.column() >= d->rec.count() || index.row() >= rowCount())
return false;
- if (d->strategy == OnFieldChange && d->cache.value(index.row()).op != QSqlTableModelPrivate::Insert) {
+ if (d->strategy == OnFieldChange && d->cache.value(index.row()).op() != QSqlTableModelPrivate::Insert) {
d->cache.clear();
} else if (d->strategy == OnRowChange && !d->cache.isEmpty() && !d->cache.contains(index.row())) {
submit();
@@ -489,39 +513,18 @@ bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, in
QSqlTableModelPrivate::ModifiedRow &row = d->cache[index.row()];
- if (row.op == QSqlTableModelPrivate::None) {
+ if (row.op() == QSqlTableModelPrivate::None) {
row = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Update,
- d->rec,
- d->primaryValues(indexInQuery(index).row()));
+ d->rec);
}
row.setValue(index.column(), value);
+ emit dataChanged(index, index);
- bool isOk = true;
- if (d->strategy == OnFieldChange && row.op != QSqlTableModelPrivate::Insert) {
- // historical bug: bad style to call updateRowInTable.
- // Should call submit(), but maybe the author wanted to avoid
- // clearing the cache on failure.
- isOk = updateRowInTable(index.row(), row.rec);
- if (isOk)
- select();
- }
+ if (d->strategy == OnFieldChange && row.op() != QSqlTableModelPrivate::Insert)
+ return submit();
- // historical bug: dataChanged() is suppressed for OnFieldChange and OnRowChange
- // when operating on an "insert" record. This is to accomodate
- // applications that call setData() while handling primeInsert().
- // Otherwise dataChanged() would be emitted between beginInsert()
- // and endInsert().
- // The price of this workaround is that, although the view making
- // the change will already display the new value, other views connected
- // to the model probably will not.
- // It's not clear why OnManualSubmit is excluded from this workaround.
- // Calling setData() while handling primeInsert() is arguably very wrong anyway.
- // primeInsert() provides a ref to the record for settings values.
- if (d->strategy == OnManualSubmit || row.op != QSqlTableModelPrivate::Insert)
- emit dataChanged(index, index);
-
- return isOk;
+ return true;
}
/*!
@@ -558,7 +561,7 @@ bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
QSqlRecord rec(values);
emit beforeUpdate(row, rec);
- const QSqlRecord whereValues = d->strategy == OnManualSubmit ? d->cache[row].primaryValues : d->primaryValues(row);
+ const QSqlRecord whereValues = d->primaryValues(row);
bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries);
QString stmt = d->db.driver()->sqlStatement(QSqlDriver::UpdateStatement, d->tableName,
rec, prepStatement);
@@ -625,7 +628,7 @@ bool QSqlTableModel::deleteRowFromTable(int row)
Q_D(QSqlTableModel);
emit beforeDelete(row);
- const QSqlRecord whereValues = d->strategy == OnManualSubmit ? d->cache[row].primaryValues : d->primaryValues(row);
+ const QSqlRecord whereValues = d->primaryValues(row);
bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries);
QString stmt = d->db.driver()->sqlStatement(QSqlDriver::DeleteStatement,
d->tableName,
@@ -665,16 +668,18 @@ bool QSqlTableModel::submitAll()
{
Q_D(QSqlTableModel);
- for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
+ for (QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.begin();
it != d->cache.constEnd(); ++it) {
- switch (it.value().op) {
+ if (it.value().submitted())
+ continue;
+
+ switch (it.value().op()) {
case QSqlTableModelPrivate::Insert:
- if (!insertRowIntoTable(it.value().rec))
+ if (!insertRowIntoTable(it.value().rec()))
return false;
- d->bottom = d->bottom.sibling(d->bottom.row() + 1, d->bottom.column());
break;
case QSqlTableModelPrivate::Update:
- if (!updateRowInTable(it.key(), it.value().rec))
+ if (!updateRowInTable(it.key(), it.value().rec()))
return false;
break;
case QSqlTableModelPrivate::Delete:
@@ -685,6 +690,20 @@ bool QSqlTableModel::submitAll()
Q_ASSERT_X(false, "QSqlTableModel::submitAll()", "Invalid cache operation");
break;
}
+ it.value().setSubmitted(true);
+ }
+
+ // all changes have been committed
+
+ // clean up inserted rows
+ QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.end();
+ while (it != d->cache.constBegin()) {
+ --it;
+ if (it.value().op() == QSqlTableModelPrivate::Insert) {
+ beginRemoveRows(QModelIndex(), it.key(), it.key());
+ it = d->cache.erase(it);
+ endRemoveRows();
+ }
}
d->clearCache();
return select();
@@ -969,13 +988,20 @@ bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &par
does not support hierarchical structures, \a parent must be
an invalid model index.
- Emits the beforeDelete() signal before a row is deleted. When
- the edit strategy is OnManualSubmit signal emission is delayed
- until submitAll() is called.
+ When the edit strategy is OnManualSubmit, deletion of rows from
+ the database is delayed until submitAll() is called; otherwise,
+ deletions are immediate.
+
+ Inserted but not yet submitted rows in the range to be removed
+ are immediately removed from the model.
- Returns true if all rows could be removed; otherwise returns
- false. Detailed error information can be retrieved using
- lastError().
+ Before a row is deleted from the database, the beforeDelete()
+ signal is emitted.
+
+ If row < 0 or row + count > rowCount(), no action is taken and
+ false is returned. Returns true if all rows could be removed;
+ otherwise returns false. Detailed database error information
+ can be retrieved using lastError().
\sa removeColumns(), insertRows()
*/
@@ -984,37 +1010,27 @@ bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent)
Q_D(QSqlTableModel);
if (parent.isValid() || row < 0 || count <= 0)
return false;
+ else if (row + count > rowCount())
+ return false;
+ else if (!count)
+ return true;
- int initialRowCount = rowCount();
-
- int i;
- for (i = 0; i < count && row + i < rowCount(); ++i) {
+ for (int i = 0; i < count; ++i) {
int idx = row + i;
- if (d->cache.value(idx).op == QSqlTableModelPrivate::Insert) {
+ if (d->cache.value(idx).op() == QSqlTableModelPrivate::Insert) {
revertRow(idx);
// Reverting a row means all the other cache entries have been adjusted downwards
// so fake this by adjusting row
--row;
} else {
- d->cache[idx] = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Delete,
- QSqlRecord(),
- d->primaryValues(indexInQuery(createIndex(idx, 0)).row()));
+ d->cache[idx] = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Delete);
if (d->strategy == OnManualSubmit)
emit headerDataChanged(Qt::Vertical, idx, idx);
}
}
- if (d->strategy != OnManualSubmit && i > 0)
- submit();
-
- // historical bug: emit beforeDelete for 1st row beyond end
- if (d->strategy != OnManualSubmit) {
- if (row + count > initialRowCount)
- emit beforeDelete(qMax(initialRowCount, row));
- }
-
- if (i < count)
- return false;
+ if (d->strategy != OnManualSubmit)
+ return submit();
return true;
}
@@ -1045,6 +1061,7 @@ bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent)
if (d->strategy != OnManualSubmit && count != 1)
return false;
+ d->busyInsertingRows = true;
beginInsertRows(parent, row, row + count - 1);
if (d->strategy != OnManualSubmit)
@@ -1063,19 +1080,22 @@ bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent)
for (int i = 0; i < count; ++i) {
d->cache[row + i] = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Insert,
d->rec);
- emit primeInsert(row + i, d->cache[row + i].rec);
+ emit primeInsert(row + i, d->cache[row + i].recRef());
}
endInsertRows();
+ d->busyInsertingRows = false;
return true;
}
/*!
- Inserts the \a record after \a row. If \a row is negative, the
- record will be appended to the end. Calls insertRows() and
+ Inserts the \a record at position \a row. If \a row is negative,
+ the record will be appended to the end. Calls insertRows() and
setRecord() internally.
- Returns true if the row could be inserted, otherwise false.
+ Only fields where the generated flag is true will be included.
+
+ Returns true if the record could be inserted, otherwise false.
\sa insertRows(), removeRows()
*/
@@ -1086,8 +1106,11 @@ bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
row = rowCount();
if (!insertRow(row, QModelIndex()))
return false;
- if (!setRecord(row, record))
+ if (!setRecord(row, record)) {
+ if (d->strategy == OnManualSubmit)
+ revertRow(row);
return false;
+ }
if (d->strategy == OnFieldChange || d->strategy == OnRowChange)
return submit();
return true;
@@ -1102,13 +1125,7 @@ int QSqlTableModel::rowCount(const QModelIndex &parent) const
if (parent.isValid())
return 0;
- int rc = QSqlQueryModel::rowCount();
- for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
- it != d->cache.constEnd(); ++it) {
- if (it.value().op == QSqlTableModelPrivate::Insert)
- ++rc;
- }
- return rc;
+ return QSqlQueryModel::rowCount() + d->insertCount();
}
/*!
@@ -1126,15 +1143,11 @@ int QSqlTableModel::rowCount(const QModelIndex &parent) const
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
{
Q_D(const QSqlTableModel);
- const QModelIndex it = QSqlQueryModel::indexInQuery(item); // this adjusts columns only
- int rowOffset = 0;
- QSqlTableModelPrivate::CacheMap::ConstIterator i = d->cache.constBegin();
- while (i != d->cache.constEnd() && i.key() <= it.row()) {
- if (i.value().op == QSqlTableModelPrivate::Insert)
- ++rowOffset;
- ++i;
- }
- return createIndex(it.row() - rowOffset, it.column(), it.internalPointer());
+ if (d->cache.value(item.row()).op() == QSqlTableModelPrivate::Insert)
+ return QModelIndex();
+
+ const int rowOffset = d->insertCount(item.row());
+ return QSqlQueryModel::indexInQuery(createIndex(item.row() - rowOffset, item.column(), item.internalPointer()));
}
/*!
@@ -1192,8 +1205,10 @@ Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
/*!
Sets the values at the specified \a row to the values of \a
- record. Returns true if all the values could be set; otherwise
- returns false.
+ record for fields where generated flag is true.
+
+ Returns true if all the values could be set; otherwise returns
+ false.
\sa record()
*/
@@ -1201,50 +1216,44 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record)
{
Q_D(QSqlTableModel);
Q_ASSERT_X(row >= 0, "QSqlTableModel::setRecord()", "Cannot set a record to a row less than 0");
+ if (d->busyInsertingRows)
+ return false;
+
if (row >= rowCount())
return false;
- if (d->strategy == OnFieldChange && d->cache.value(row).op != QSqlTableModelPrivate::Insert)
+ if (d->strategy == OnFieldChange && d->cache.value(row).op() != QSqlTableModelPrivate::Insert)
d->cache.clear();
else if (d->strategy == OnRowChange && !d->cache.isEmpty() && !d->cache.contains(row))
submit();
- QSqlTableModelPrivate::ModifiedRow &mrow = d->cache[row];
- if (mrow.op == QSqlTableModelPrivate::None)
- mrow = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Update,
- d->rec,
- d->primaryValues(indexInQuery(createIndex(row, 0)).row()));
-
- bool isOk = true;
+ // Check field names and remember mapping
+ typedef QMap<int, int> Map;
+ Map map;
for (int i = 0; i < record.count(); ++i) {
- int idx = d->nameToIndex(record.fieldName(i));
- if (idx == -1) {
- isOk = false;
- } else if (d->strategy != OnManualSubmit) {
- // historical bug: this could all be simple like OnManualSubmit, but isn't
- const QModelIndex cIndex = createIndex(row, idx);
- // historical bug: comparing EditRole with DisplayRole values here
- const QVariant oldValue = data(cIndex);
- const QVariant value = record.value(i);
- // historical bug: it's a bad idea to check for change here
- // historical bug: should test oldValue.isNull() != value.isNull()
- if (oldValue.isNull() || oldValue != value) {
- // historical bug: dataChanged() is suppressed for Insert. See also setData().
- mrow.setValue(idx, record.value(i));
- if (mrow.op != QSqlTableModelPrivate::Insert)
- emit dataChanged(cIndex, cIndex);
- }
- } else {
- mrow.setValue(idx, record.value(i));
+ if (record.isGenerated(i)) {
+ int idx = d->nameToIndex(record.fieldName(i));
+ if (idx == -1)
+ return false;
+ map[i] = idx;
}
}
- if (d->strategy == OnManualSubmit && isOk)
+ QSqlTableModelPrivate::ModifiedRow &mrow = d->cache[row];
+ if (mrow.op() == QSqlTableModelPrivate::None)
+ mrow = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Update,
+ d->rec);
+
+ Map::const_iterator i = map.constBegin();
+ const Map::const_iterator e = map.constEnd();
+ for ( ; i != e; ++i)
+ mrow.setValue(i.value(), record.value(i.key()));
+
+ if (columnCount())
emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1));
- else if (d->strategy == OnFieldChange)
- return submitAll();
- else if (d->strategy == OnManualSubmit)
- return isOk;
+
+ if (d->strategy == OnFieldChange)
+ return submit();
return true;
}
diff --git a/src/sql/models/qsqltablemodel_p.h b/src/sql/models/qsqltablemodel_p.h
index 56fd839a0c..0ae6b53742 100644
--- a/src/sql/models/qsqltablemodel_p.h
+++ b/src/sql/models/qsqltablemodel_p.h
@@ -66,10 +66,11 @@ public:
QSqlTableModelPrivate()
: sortColumn(-1),
sortOrder(Qt::AscendingOrder),
- strategy(QSqlTableModel::OnRowChange)
+ strategy(QSqlTableModel::OnRowChange),
+ busyInsertingRows(false)
{}
void clear();
- QSqlRecord primaryValues(int index);
+ QSqlRecord primaryValues(int index) const;
virtual void clearCache();
QSqlRecord record(const QVector<QVariant> &values) const;
@@ -77,6 +78,8 @@ public:
const QSqlRecord &rec, const QSqlRecord &whereValues);
virtual void revertCachedRow(int row);
virtual int nameToIndex(const QString &name) const;
+ QString strippedFieldName(const QString &name) const;
+ int insertCount(int maxRow = -1) const;
void initRecordAndPrimaryIndex();
QSqlDatabase db;
@@ -85,6 +88,7 @@ public:
Qt::SortOrder sortOrder;
QSqlTableModel::EditStrategy strategy;
+ bool busyInsertingRows;
QSqlQuery editQuery;
QSqlIndex primaryIndex;
@@ -93,22 +97,29 @@ public:
enum Op { None, Insert, Update, Delete };
- struct ModifiedRow
+ class ModifiedRow
{
- inline ModifiedRow(Op o = None, const QSqlRecord &r = QSqlRecord(), const QSqlRecord &pVals = QSqlRecord())
- : op(o), rec(r), primaryValues(pVals)
+ public:
+ inline ModifiedRow(Op o = None, const QSqlRecord &r = QSqlRecord())
+ : m_op(o), m_rec(r), m_submitted(false)
{
- for (int i = rec.count() - 1; i >= 0; --i)
- rec.setGenerated(i, false);
+ for (int i = m_rec.count() - 1; i >= 0; --i)
+ m_rec.setGenerated(i, false);
}
+ inline Op op() const { return m_op; }
+ inline QSqlRecord rec() const { return m_rec; }
+ inline QSqlRecord& recRef() { return m_rec; }
inline void setValue(int c, const QVariant &v)
{
- rec.setValue(c, v);
- rec.setGenerated(c, true);
+ m_rec.setValue(c, v);
+ m_rec.setGenerated(c, true);
}
- Op op;
- QSqlRecord rec;
- QSqlRecord primaryValues;
+ inline bool submitted() const { return m_submitted; }
+ inline void setSubmitted(bool b) { m_submitted = b; }
+ private:
+ Op m_op;
+ QSqlRecord m_rec;
+ bool m_submitted;
};
typedef QMap<int, ModifiedRow> CacheMap;
diff --git a/src/src.pro b/src/src.pro
index 9ef8bf4362..f3f6937c50 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -5,7 +5,8 @@ unset(SRC_SUBDIRS)
win32:SRC_SUBDIRS += src_winmain
!wince*:include(tools/tools.pro)
SRC_SUBDIRS += src_corelib
-SRC_SUBDIRS += src_network src_sql src_gui src_xml src_widgets src_printsupport src_testlib src_platformsupport
+SRC_SUBDIRS += src_network src_sql src_gui src_xml src_widgets src_testlib src_platformsupport
+!wince*:SRC_SUBDIRS += src_printsupport
nacl: SRC_SUBDIRS -= src_network src_testlib
contains(QT_CONFIG, dbus):SRC_SUBDIRS += src_dbus
contains(QT_CONFIG, concurrent):SRC_SUBDIRS += src_concurrent
@@ -35,8 +36,10 @@ src_plugins.subdir = $$QT_SOURCE_TREE/src/plugins
src_plugins.target = sub-plugins
src_widgets.subdir = $$QT_SOURCE_TREE/src/widgets
src_widgets.target = sub-widgets
-src_printsupport.subdir = $$QT_SOURCE_TREE/src/printsupport
-src_printsupport.target = sub-printsupport
+!wince*: {
+ src_printsupport.subdir = $$QT_SOURCE_TREE/src/printsupport
+ src_printsupport.target = sub-printsupport
+}
src_testlib.subdir = $$QT_SOURCE_TREE/src/testlib
src_testlib.target = sub-testlib
src_platformsupport.subdir = $$QT_SOURCE_TREE/src/platformsupport
diff --git a/src/testlib/qsignaldumper.cpp b/src/testlib/qsignaldumper.cpp
index d0a3af6764..4fd870b644 100644
--- a/src/testlib/qsignaldumper.cpp
+++ b/src/testlib/qsignaldumper.cpp
@@ -76,7 +76,7 @@ static void qSignalDumperCallback(QObject *caller, int method_index, void **argv
const QMetaObject *mo = caller->metaObject();
Q_ASSERT(mo);
QMetaMethod member = mo->method(method_index);
- Q_ASSERT(member.signature());
+ Q_ASSERT(member.isValid());
if (QTest::ignoreClasses() && QTest::ignoreClasses()->contains(mo->className())) {
++QTest::ignoreLevel;
@@ -132,7 +132,7 @@ static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void **
const QMetaObject *mo = caller->metaObject();
Q_ASSERT(mo);
QMetaMethod member = mo->method(method_index);
- if (!member.signature())
+ if (!member.isValid())
return;
if (QTest::ignoreLevel ||
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 8a1d4bf44a..56959ba62d 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -69,6 +69,11 @@
#include <stdlib.h>
#ifdef Q_OS_WIN
+#ifndef Q_OS_WINCE
+# if !defined(Q_CC_MINGW) || (defined(Q_CC_MINGW) && defined(__MINGW64_VERSION_MAJOR))
+# include <crtdbg.h>
+# endif
+#endif
#include <windows.h> // for Sleep
#endif
#ifdef Q_OS_UNIX
@@ -934,32 +939,24 @@ QT_BEGIN_NAMESPACE
QTouchEventSequence is called (ie when the object returned runs out of scope).
*/
-static void installCoverageTool(const char * appname, const char * testname)
+static bool installCoverageTool(const char * appname, const char * testname)
{
#ifdef __COVERAGESCANNER__
+ if (!qgetenv("QT_TESTCOCOON_ACTIVE").isEmpty())
+ return false;
+ // Set environment variable QT_TESTCOCOON_ACTIVE to prevent an eventual subtest from
+ // being considered as a stand-alone test regarding the coverage analysis.
+ qputenv("QT_TESTCOCOON_ACTIVE", "1");
+
// Install Coverage Tool
__coveragescanner_install(appname);
__coveragescanner_testname(testname);
__coveragescanner_clear();
+ return true;
#else
Q_UNUSED(appname);
Q_UNUSED(testname);
-#endif
-}
-
-static void saveCoverageTool(const char * appname, bool testfailed)
-{
-#ifdef __COVERAGESCANNER__
- // install again to make sure the filename is correct.
- // without this, a plugin or similar may have changed the filename.
- __coveragescanner_install(appname);
- __coveragescanner_teststate(testfailed ? "FAILED" : "PASSED");
- __coveragescanner_save();
- __coveragescanner_testname("");
- __coveragescanner_clear();
-#else
- Q_UNUSED(appname);
- Q_UNUSED(testfailed);
+ return false;
#endif
}
@@ -1493,6 +1490,7 @@ static void qInvokeTestMethodDataEntry(char *slot)
{
/* Benchmarking: for each median iteration*/
+ bool isBenchmark = false;
int i = (QBenchmarkGlobalData::current->measurer->needsWarmupIteration()) ? -1 : 0;
QList<QBenchmarkResult> results;
@@ -1502,13 +1500,10 @@ static void qInvokeTestMethodDataEntry(char *slot)
/* Benchmarking: for each accumulation iteration*/
bool invokeOk;
do {
- QTestResult::setCurrentTestLocation(QTestResult::InitFunc);
invokeMethod(QTest::currentTestObject, "init()");
- if (QTestResult::skipCurrentTest())
+ if (QTestResult::skipCurrentTest() || QTestResult::currentTestFailed())
break;
- QTestResult::setCurrentTestLocation(QTestResult::Func);
-
QBenchmarkTestMethodData::current->result = QBenchmarkResult();
QBenchmarkTestMethodData::current->resultAccepted = false;
@@ -1522,24 +1517,30 @@ static void qInvokeTestMethodDataEntry(char *slot)
if (!invokeOk)
QTestResult::addFailure("Unable to execute slot", __FILE__, __LINE__);
- QTestResult::setCurrentTestLocation(QTestResult::CleanupFunc);
+ isBenchmark = QBenchmarkTestMethodData::current->isBenchmark();
+
+ QTestResult::finishedCurrentTestData();
+
invokeMethod(QTest::currentTestObject, "cleanup()");
- QTestResult::setCurrentTestLocation(QTestResult::NoWhere);
+
+ // If the test isn't a benchmark, finalize the result after cleanup() has finished.
+ if (!isBenchmark)
+ QTestResult::finishedCurrentTestDataCleanup();
// If this test method has a benchmark, repeat until all measurements are
// acceptable.
// The QBENCHMARK macro increases the number of iterations for each run until
// this happens.
- } while (invokeOk
- && QBenchmarkTestMethodData::current->isBenchmark()
- && QBenchmarkTestMethodData::current->resultsAccepted() == false);
+ } while (invokeOk && isBenchmark
+ && QBenchmarkTestMethodData::current->resultsAccepted() == false
+ && !QTestResult::skipCurrentTest() && !QTestResult::currentTestFailed());
QBenchmarkTestMethodData::current->endDataRun();
- if (i > -1) // iteration -1 is the warmup iteration.
- results.append(QBenchmarkTestMethodData::current->result);
+ if (!QTestResult::skipCurrentTest() && !QTestResult::currentTestFailed()) {
+ if (i > -1) // iteration -1 is the warmup iteration.
+ results.append(QBenchmarkTestMethodData::current->result);
- if (QBenchmarkTestMethodData::current->isBenchmark() &&
- QBenchmarkGlobalData::current->verboseOutput) {
+ if (isBenchmark && QBenchmarkGlobalData::current->verboseOutput) {
if (i == -1) {
QTestLog::info(qPrintable(
QString::fromLatin1("warmup stage result : %1")
@@ -1550,12 +1551,19 @@ static void qInvokeTestMethodDataEntry(char *slot)
.arg(QBenchmarkTestMethodData::current->result.value)), 0, 0);
}
}
- } while (QBenchmarkTestMethodData::current->isBenchmark()
- && (++i < QBenchmarkGlobalData::current->adjustMedianIterationCount()));
-
- if (QBenchmarkTestMethodData::current->isBenchmark()
- && QBenchmarkTestMethodData::current->resultsAccepted())
- QTestLog::addBenchmarkResult(qMedian(results));
+ }
+ } while (isBenchmark
+ && (++i < QBenchmarkGlobalData::current->adjustMedianIterationCount())
+ && !QTestResult::skipCurrentTest() && !QTestResult::currentTestFailed());
+
+ // If the test is a benchmark, finalize the result after all iterations have finished.
+ if (isBenchmark) {
+ bool testPassed = !QTestResult::skipCurrentTest() && !QTestResult::currentTestFailed();
+ QTestResult::finishedCurrentTestDataCleanup();
+ // Only report benchmark figures if the test passed
+ if (testPassed && QBenchmarkTestMethodData::current->resultsAccepted())
+ QTestLog::addBenchmarkResult(qMedian(results));
+ }
}
/*!
@@ -1593,7 +1601,6 @@ static bool qInvokeTestMethod(const char *slotName, const char *data=0)
QTestResult::setCurrentGlobalTestData(gTable->testData(curGlobalDataIndex));
if (curGlobalDataIndex == 0) {
- QTestResult::setCurrentTestLocation(QTestResult::DataFunc);
qsnprintf(member, 512, "%s_data()", slot);
invokeMethod(QTest::currentTestObject, member);
}
@@ -1747,16 +1754,16 @@ static void qInvokeTestMethods(QObject *testObject)
QTEST_ASSERT(metaObject);
QTestLog::startLogging();
QTestResult::setCurrentTestFunction("initTestCase");
- QTestResult::setCurrentTestLocation(QTestResult::DataFunc);
QTestTable::globalTestTable();
invokeMethod(testObject, "initTestCase_data()");
if (!QTestResult::skipCurrentTest() && !QTest::currentTestFailed()) {
- QTestResult::setCurrentTestLocation(QTestResult::InitFunc);
invokeMethod(testObject, "initTestCase()");
- // finishedCurrentTestFunction() resets QTestResult::testFailed(), so use a local copy.
- const bool previousFailed = QTestResult::testFailed();
+ // finishedCurrentTestDataCleanup() resets QTestResult::currentTestFailed(), so use a local copy.
+ const bool previousFailed = QTestResult::currentTestFailed();
+ QTestResult::finishedCurrentTestData();
+ QTestResult::finishedCurrentTestDataCleanup();
QTestResult::finishedCurrentTestFunction();
if (!QTestResult::skipCurrentTest() && !previousFailed) {
@@ -1788,6 +1795,8 @@ static void qInvokeTestMethods(QObject *testObject)
QTestResult::setSkipCurrentTest(false);
QTestResult::setCurrentTestFunction("cleanupTestCase");
invokeMethod(testObject, "cleanupTestCase()");
+ QTestResult::finishedCurrentTestData();
+ QTestResult::finishedCurrentTestDataCleanup();
}
QTestResult::finishedCurrentTestFunction();
QTestResult::setCurrentTestFunction(0);
@@ -1945,6 +1954,9 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
#endif
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+# if !defined(Q_CC_MINGW) || (defined(Q_CC_MINGW) && defined(__MINGW64_VERSION_MAJOR))
+ _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
+# endif
SetErrorMode(SetErrorMode(0) | SEM_NOGPFAULTERRORBOX);
#endif
@@ -1970,10 +1982,14 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
const QMetaObject *metaObject = testObject->metaObject();
QTEST_ASSERT(metaObject);
- installCoverageTool(argv[0], metaObject->className());
-
QTestResult::setCurrentTestObject(metaObject->className());
+ QTestResult::setCurrentAppname(argv[0]);
+
qtest_qParseArgs(argc, argv, false);
+
+ bool installedTestCoverage = installCoverageTool(argv[0], metaObject->className());
+ QTestLog::setInstalledTestCoverage(installedTestCoverage);
+
#ifdef QTESTLIB_USE_VALGRIND
if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess) {
const QStringList origAppArgs(QCoreApplication::arguments());
@@ -2025,8 +2041,6 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
}
#endif
- saveCoverageTool(argv[0], QTestLog::failCount());
-
#ifdef QTESTLIB_USE_VALGRIND
if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess)
return callgrindChildExitCode;
diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h
index c721dfd0d9..e4f4020461 100644
--- a/src/testlib/qtestcase.h
+++ b/src/testlib/qtestcase.h
@@ -117,22 +117,11 @@ do { \
#define QTRY_COMPARE(__expr, __expected) QTRY_COMPARE_WITH_TIMEOUT(__expr, __expected, 5000)
-#ifdef Q_CC_MSVC
#define QSKIP(statement) \
do {\
QTest::qSkip(statement, __FILE__, __LINE__);\
return;\
} while (0)
-#else
-#define QSKIP(statement, ...) \
-do {\
- if (strcmp(#__VA_ARGS__, "") != 0)\
- QTest::qFail("The two argument version of QSKIP is no longer available. "\
- "Please update this test by removing the second argument in each QSKIP.", __FILE__, __LINE__);\
- QTest::qSkip(statement, __FILE__, __LINE__);\
- return;\
-} while (0)
-#endif
#define QEXPECT_FAIL(dataIndex, comment, mode)\
do {\
@@ -275,7 +264,7 @@ namespace QTest
template <typename T1, typename T2>
bool qCompare(T1 const &, T2 const &, const char *, const char *, const char *, int);
-#if defined(QT_COORD_TYPE) && (defined(QT_ARCH_ARM) || defined(QT_NO_FPU) || defined(QT_ARCH_WINDOWSCE))
+#if defined(QT_COORD_TYPE) && (defined(Q_PROCESSOR_ARM) || defined(QT_NO_FPU) || defined(Q_OS_WINCE))
template <>
inline bool qCompare<qreal, float>(qreal const &t1, float const &t2, const char *actual,
const char *expected, const char *file, int line)
@@ -290,7 +279,7 @@ namespace QTest
return qCompare<qreal>(qreal(t1), t2, actual, expected, file, line);
}
-#elif defined(QT_COORD_TYPE) || defined(QT_ARCH_ARM) || defined(QT_NO_FPU) || defined(QT_ARCH_WINDOWSCE)
+#elif defined(QT_COORD_TYPE) || defined(Q_PROCESSOR_ARM) || defined(QT_NO_FPU) || defined(Q_OS_WINCE)
template <>
inline bool qCompare<qreal, double>(qreal const &t1, double const &t2, const char *actual,
const char *expected, const char *file, int line)
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index 7a4358a393..c8487a2c54 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -56,6 +56,26 @@
QT_BEGIN_NAMESPACE
+static void saveCoverageTool(const char * appname, bool testfailed, bool installedTestCoverage)
+{
+#ifdef __COVERAGESCANNER__
+ if (!installedTestCoverage)
+ return;
+ // install again to make sure the filename is correct.
+ // without this, a plugin or similar may have changed the filename.
+ __coveragescanner_install(appname);
+ __coveragescanner_teststate(testfailed ? "FAILED" : "PASSED");
+ __coveragescanner_save();
+ __coveragescanner_testname("");
+ __coveragescanner_clear();
+ unsetenv("QT_TESTCOCOON_ACTIVE");
+#else
+ Q_UNUSED(appname);
+ Q_UNUSED(testfailed);
+ Q_UNUSED(installedTestCoverage);
+#endif
+}
+
namespace QTest {
int fails = 0;
@@ -182,6 +202,7 @@ namespace QTest {
static int verbosity = 0;
static int maxWarnings = 2002;
+ static bool installedTestCoverage = true;
static QtMsgHandler oldMessageHandler;
@@ -286,7 +307,6 @@ void QTestLog::leaveTestFunction()
if (printAvailableTags)
return;
- QTest::IgnoreResultList::clearList(QTest::ignoreResultList);
QTest::TestLoggers::leaveTestFunction();
}
@@ -302,6 +322,11 @@ void QTestLog::printUnhandledIgnoreMessages()
}
}
+void QTestLog::clearIgnoreMessages()
+{
+ QTest::IgnoreResultList::clearList(QTest::ignoreResultList);
+}
+
void QTestLog::addPass(const char *msg)
{
if (printAvailableTags)
@@ -368,6 +393,7 @@ void QTestLog::stopLogging()
QTest::TestLoggers::stopLogging();
QTest::TestLoggers::destroyLoggers();
QTest::loggerUsingStdout = false;
+ saveCoverageTool(QTestResult::currentAppname(), failCount() != 0, QTestLog::installedTestCoverage());
}
void QTestLog::addLogger(LogMode mode, const char *filename)
@@ -481,4 +507,14 @@ void QTestLog::resetCounters()
QTest::skips = 0;
}
+void QTestLog::setInstalledTestCoverage(bool installed)
+{
+ QTest::installedTestCoverage = installed;
+}
+
+bool QTestLog::installedTestCoverage()
+{
+ return QTest::installedTestCoverage;
+}
+
QT_END_NAMESPACE
diff --git a/src/testlib/qtestlog_p.h b/src/testlib/qtestlog_p.h
index e45d9c9626..1a9754e460 100644
--- a/src/testlib/qtestlog_p.h
+++ b/src/testlib/qtestlog_p.h
@@ -77,6 +77,7 @@ public:
static void ignoreMessage(QtMsgType type, const char *msg);
static int unhandledIgnoreMessages();
static void printUnhandledIgnoreMessages();
+ static void clearIgnoreMessages();
static void warn(const char *msg, const char *file, int line);
static void info(const char *msg, const char *file, int line);
@@ -102,6 +103,9 @@ public:
static void resetCounters();
+ static void setInstalledTestCoverage(bool installed);
+ static bool installedTestCoverage();
+
private:
QTestLog();
~QTestLog();
diff --git a/src/testlib/qtestresult.cpp b/src/testlib/qtestresult.cpp
index 1fb5bddcbb..14ab29af2b 100644
--- a/src/testlib/qtestresult.cpp
+++ b/src/testlib/qtestresult.cpp
@@ -58,12 +58,12 @@ namespace QTest
static const char *currentTestFunc = 0;
static const char *currentTestObjectName = 0;
static bool failed = false;
- static bool dataFailed = false;
static bool skipCurrentTest = false;
- static QTestResult::TestLocation location = QTestResult::NoWhere;
static const char *expectFailComment = 0;
static int expectFailMode = 0;
+
+ static const char *currentAppname = 0;
}
void QTestResult::reset()
@@ -73,8 +73,6 @@ void QTestResult::reset()
QTest::currentTestFunc = 0;
QTest::currentTestObjectName = 0;
QTest::failed = false;
- QTest::dataFailed = false;
- QTest::location = QTestResult::NoWhere;
QTest::expectFailComment = 0;
QTest::expectFailMode = 0;
@@ -84,7 +82,7 @@ void QTestResult::reset()
bool QTestResult::currentTestFailed()
{
- return QTest::dataFailed;
+ return QTest::failed;
}
QTestData *QTestResult::currentGlobalTestData()
@@ -105,15 +103,13 @@ void QTestResult::setCurrentGlobalTestData(QTestData *data)
void QTestResult::setCurrentTestData(QTestData *data)
{
QTest::currentTestData = data;
- QTest::dataFailed = false;
+ QTest::failed = false;
}
void QTestResult::setCurrentTestFunction(const char *func)
{
QTest::currentTestFunc = func;
QTest::failed = false;
- if (!func)
- QTest::location = NoWhere;
if (func)
QTestLog::enterTestFunction(func);
}
@@ -125,24 +121,35 @@ static void clearExpectFail()
QTest::expectFailComment = 0;
}
-void QTestResult::finishedCurrentTestFunction()
+void QTestResult::finishedCurrentTestData()
{
+ if (QTest::expectFailMode)
+ addFailure("QEXPECT_FAIL was called without any subsequent verification statements", 0, 0);
+ clearExpectFail();
+
if (!QTest::failed && QTestLog::unhandledIgnoreMessages()) {
QTestLog::printUnhandledIgnoreMessages();
addFailure("Not all expected messages were received", 0, 0);
}
+ QTestLog::clearIgnoreMessages();
+}
+void QTestResult::finishedCurrentTestDataCleanup()
+{
+ // If the current test hasn't failed or been skipped, then it passes.
if (!QTest::failed && !QTest::skipCurrentTest) {
QTestLog::addPass("");
}
+
+ QTest::failed = false;
+}
+
+void QTestResult::finishedCurrentTestFunction()
+{
QTest::currentTestFunc = 0;
QTest::failed = false;
- QTest::dataFailed = false;
- QTest::location = NoWhere;
QTestLog::leaveTestFunction();
-
- clearExpectFail();
}
const char *QTestResult::currentTestFunction()
@@ -230,7 +237,10 @@ bool QTestResult::verify(bool statement, const char *statementStr,
QTestLog::info(msg, file, line);
}
- qsnprintf(msg, 1024, "'%s' returned FALSE. (%s)", statementStr, description);
+ const char * format = QTest::expectFailMode
+ ? "'%s' returned TRUE unexpectedly. (%s)"
+ : "'%s' returned FALSE. (%s)";
+ qsnprintf(msg, 1024, format, statementStr, description);
return checkStatement(statement, msg, file, line);
}
@@ -268,7 +278,6 @@ void QTestResult::addFailure(const char *message, const char *file, int line)
QTestLog::addFail(message, file, line);
QTest::failed = true;
- QTest::dataFailed = true;
}
void QTestResult::addSkip(const char *message, const char *file, int line)
@@ -278,16 +287,6 @@ void QTestResult::addSkip(const char *message, const char *file, int line)
QTestLog::addSkip(message, file, line);
}
-QTestResult::TestLocation QTestResult::currentTestLocation()
-{
- return QTest::location;
-}
-
-void QTestResult::setCurrentTestLocation(TestLocation loc)
-{
- QTest::location = loc;
-}
-
void QTestResult::setCurrentTestObject(const char *name)
{
QTest::currentTestObjectName = name;
@@ -298,11 +297,6 @@ const char *QTestResult::currentTestObjectName()
return QTest::currentTestObjectName ? QTest::currentTestObjectName : "";
}
-bool QTestResult::testFailed()
-{
- return QTest::failed;
-}
-
void QTestResult::setSkipCurrentTest(bool value)
{
QTest::skipCurrentTest = value;
@@ -313,4 +307,14 @@ bool QTestResult::skipCurrentTest()
return QTest::skipCurrentTest;
}
+void QTestResult::setCurrentAppname(const char *appname)
+{
+ QTest::currentAppname = appname;
+}
+
+const char *QTestResult::currentAppname()
+{
+ return QTest::currentAppname;
+}
+
QT_END_NAMESPACE
diff --git a/src/testlib/qtestresult_p.h b/src/testlib/qtestresult_p.h
index fc7f834756..b060926f2a 100644
--- a/src/testlib/qtestresult_p.h
+++ b/src/testlib/qtestresult_p.h
@@ -63,16 +63,15 @@ class QTestData;
class Q_TESTLIB_EXPORT QTestResult
{
public:
- enum TestLocation { NoWhere = 0, DataFunc = 1, InitFunc = 2, Func = 3, CleanupFunc = 4 };
-
static const char *currentTestObjectName();
static bool currentTestFailed();
static QTestData *currentTestData();
static QTestData *currentGlobalTestData();
static const char *currentTestFunction();
- static TestLocation currentTestLocation();
static const char *currentDataTag();
static const char *currentGlobalDataTag();
+ static void finishedCurrentTestData();
+ static void finishedCurrentTestDataCleanup();
static void finishedCurrentTestFunction();
static void reset();
@@ -84,17 +83,18 @@ public:
static void setCurrentGlobalTestData(QTestData *data);
static void setCurrentTestData(QTestData *data);
static void setCurrentTestFunction(const char *func);
- static void setCurrentTestLocation(TestLocation loc);
static void setCurrentTestObject(const char *name);
static void addSkip(const char *message, const char *file, int line);
static bool expectFail(const char *dataIndex, const char *comment,
QTest::TestFailMode mode, const char *file, int line);
static bool verify(bool statement, const char *statementStr, const char *extraInfo,
const char *file, int line);
- static bool testFailed();
static void setSkipCurrentTest(bool value);
static bool skipCurrentTest();
+ static void setCurrentAppname(const char *appname);
+ static const char *currentAppname();
+
private:
Q_DISABLE_COPY(QTestResult)
};
diff --git a/src/testlib/qxmltestlogger.cpp b/src/testlib/qxmltestlogger.cpp
index 28ae6ff095..7e5da20680 100644
--- a/src/testlib/qxmltestlogger.cpp
+++ b/src/testlib/qxmltestlogger.cpp
@@ -118,7 +118,7 @@ void QXmlTestLogger::startLogging()
QTest::qt_asprintf(&buf,
"<Environment>\n"
" <QtVersion>%s</QtVersion>\n"
- " <QTestVersion>"QTEST_VERSION_STR"</QTestVersion>\n"
+ " <QTestVersion>" QTEST_VERSION_STR "</QTestVersion>\n"
"</Environment>\n", qVersion());
outputString(buf.constData());
}
diff --git a/src/tools/bootstrap/bootstrap.pri b/src/tools/bootstrap/bootstrap.pri
index 8a368cb228..e34cc5c033 100644
--- a/src/tools/bootstrap/bootstrap.pri
+++ b/src/tools/bootstrap/bootstrap.pri
@@ -60,7 +60,7 @@ hpux-acc*|hpuxi-acc* {
else:if(unix|win32-g++*):LIBS_PRIVATE += -lz
else:LIBS += zdll.lib
}
-win32:LIBS += -luser32
+win32:LIBS += -luser32 -lole32
mac {
CONFIG -= incremental
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro
index fdf41c55c2..1d641d2301 100644
--- a/src/tools/bootstrap/bootstrap.pro
+++ b/src/tools/bootstrap/bootstrap.pro
@@ -43,6 +43,7 @@ DEPENDPATH += $$INCLUDEPATH \
../../corelib/tools \
../../corelib/io \
../../corelib/codecs \
+ ../../corelib/json \
../../xml
SOURCES += \
@@ -72,6 +73,7 @@ SOURCES += \
../../corelib/kernel/qmetatype.cpp \
../../corelib/kernel/qvariant.cpp \
../../corelib/kernel/qsystemerror.cpp \
+ ../../corelib/plugin/quuid.cpp \
../../corelib/tools/qbitarray.cpp \
../../corelib/tools/qbytearray.cpp \
../../corelib/tools/qbytearraymatcher.cpp \
@@ -88,6 +90,13 @@ SOURCES += \
../../corelib/tools/qvsnprintf.cpp \
../../corelib/xml/qxmlutils.cpp \
../../corelib/xml/qxmlstream.cpp \
+ ../../corelib/json/qjson.cpp \
+ ../../corelib/json/qjsondocument.cpp \
+ ../../corelib/json/qjsonobject.cpp \
+ ../../corelib/json/qjsonarray.cpp \
+ ../../corelib/json/qjsonvalue.cpp \
+ ../../corelib/json/qjsonparser.cpp \
+ ../../corelib/json/qjsonwriter.cpp \
../../xml/dom/qdom.cpp \
../../xml/sax/qxml.cpp
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index b4f3d23f4e..3362a1abc1 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -43,25 +43,30 @@
#include "outputrevision.h"
#include "utils.h"
#include <QtCore/qmetatype.h>
+#include <QtCore/qjsondocument.h>
+#include <QtCore/qjsonobject.h>
+#include <QtCore/qjsonvalue.h>
+#include <QtCore/qjsonarray.h>
+#include <QtCore/qplugin.h>
#include <stdio.h>
#include <private/qmetaobject_p.h> //for the flags.
QT_BEGIN_NAMESPACE
-uint qvariant_nameToType(const char* name)
+uint qvariant_nameToType(const QByteArray &name)
{
- if (!name)
+ if (name.isEmpty())
return 0;
- uint tp = QMetaType::type(name);
+ uint tp = QMetaType::type(name.constData());
return tp < QMetaType::User ? tp : 0;
}
/*
Returns true if the type is a QVariant types.
*/
-bool isVariantType(const char* type)
+bool isVariantType(const QByteArray &type)
{
return qvariant_nameToType(type) != 0;
}
@@ -69,9 +74,9 @@ bool isVariantType(const char* type)
/*!
Returns true if the type is qreal.
*/
-static bool isQRealType(const char *type)
+static bool isQRealType(const QByteArray &type)
{
- return strcmp(type, "qreal") == 0;
+ return (type == "qreal");
}
Generator::Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, FILE *outfile)
@@ -104,11 +109,9 @@ static inline int lengthOfEscapeSequence(const QByteArray &s, int i)
return i - startPos;
}
-int Generator::strreg(const char *s)
+int Generator::strreg(const QByteArray &s)
{
int idx = 0;
- if (!s)
- s = "";
for (int i = 0; i < strings.size(); ++i) {
const QByteArray &str = strings.at(i);
if (str == s)
@@ -135,13 +138,11 @@ void Generator::generateCode()
//
// build the data array
//
- int i = 0;
-
// filter out undeclared enumerators and sets
{
QList<EnumDef> enumList;
- for (i = 0; i < cdef->enumList.count(); ++i) {
+ for (int i = 0; i < cdef->enumList.count(); ++i) {
EnumDef def = cdef->enumList.at(i);
if (cdef->enumDeclarations.contains(def.name)) {
enumList += def;
@@ -159,7 +160,7 @@ void Generator::generateCode()
QByteArray qualifiedClassNameIdentifier = cdef->qualified;
qualifiedClassNameIdentifier.replace(':', '_');
- int index = 14;
+ int index = MetaObjectPrivateFieldCount;
fprintf(out, "static const uint qt_meta_data_%s[] = {\n", qualifiedClassNameIdentifier.constData());
fprintf(out, "\n // content:\n");
fprintf(out, " %4d, // revision\n", int(QMetaObjectPrivate::OutputRevision));
@@ -181,7 +182,7 @@ void Generator::generateCode()
fprintf(out, " %4d, %4d, // enums/sets\n", cdef->enumList.count(), cdef->enumList.count() ? index : 0);
int enumsIndex = index;
- for (i = 0; i < cdef->enumList.count(); ++i)
+ for (int i = 0; i < cdef->enumList.count(); ++i)
index += 4 + (cdef->enumList.at(i).values.count() * 2);
fprintf(out, " %4d, %4d, // constructors\n", isConstructible ? cdef->constructorList.count() : 0,
isConstructible ? index : 0);
@@ -247,7 +248,7 @@ void Generator::generateCode()
fprintf(out, " \"");
int col = 0;
int len = 0;
- for (i = 0; i < strings.size(); ++i) {
+ for (int i = 0; i < strings.size(); ++i) {
QByteArray s = strings.at(i);
len = s.length();
if (col && col + len >= 72) {
@@ -384,7 +385,7 @@ void Generator::generateCode()
for (int i = 1; i < cdef->superclassList.size(); ++i) { // for all superclasses but the first one
if (cdef->superclassList.at(i).second == FunctionDef::Private)
continue;
- const char *cname = cdef->superclassList.at(i).first;
+ const char *cname = cdef->superclassList.at(i).first.constData();
fprintf(out, " if (!strcmp(_clname, \"%s\"))\n return static_cast< %s*>(const_cast< %s*>(this));\n",
cname, cname, cdef->classname.constData());
}
@@ -421,6 +422,11 @@ void Generator::generateCode()
//
for (int signalindex = 0; signalindex < cdef->signalList.size(); ++signalindex)
generateSignal(&cdef->signalList[signalindex], signalindex);
+
+//
+// Generate plugin meta data
+//
+ generatePluginMetaData();
}
@@ -437,7 +443,7 @@ void Generator::generateClassInfos()
}
}
-void Generator::generateFunctions(QList<FunctionDef>& list, const char *functype, int type)
+void Generator::generateFunctions(const QList<FunctionDef>& list, const char *functype, int type)
{
if (list.isEmpty())
return;
@@ -486,7 +492,7 @@ void Generator::generateFunctions(QList<FunctionDef>& list, const char *functype
}
}
-void Generator::generateFunctionRevisions(QList<FunctionDef>& list, const char *functype)
+void Generator::generateFunctionRevisions(const QList<FunctionDef>& list, const char *functype)
{
if (list.count())
fprintf(out, "\n // %ss: revision\n", functype);
@@ -1051,4 +1057,46 @@ void Generator::generateSignal(FunctionDef *def,int index)
fprintf(out, "}\n");
}
+void Generator::generatePluginMetaData()
+{
+ if (cdef->pluginData.iid.isEmpty())
+ return;
+
+ QJsonObject data;
+ data.insert(QLatin1String("IID"), QLatin1String(cdef->pluginData.iid.constData()));
+ data.insert(QLatin1String("className"), QLatin1String(cdef->classname.constData()));
+ data.insert(QLatin1String("version"), (int)QT_VERSION);
+ data.insert(QLatin1String("debug"),
+#ifdef QT_NO_DEBUG
+ false
+#else
+ true
+#endif
+ );
+ data.insert(QLatin1String("MetaData"), cdef->pluginData.metaData.object());
+ QJsonDocument doc(data);
+
+ fprintf(out, "\nQT_PLUGIN_METADATA_SECTION const uint qt_section_alignment_dummy = 42;\n");
+ fprintf(out,
+ "\nQT_PLUGIN_METADATA_SECTION\n"
+ "static const unsigned char qt_pluginMetaData[] = {\n"
+ " 'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', ' ',\n ");
+#if 0
+ fprintf(out, "\"%s\";\n", doc.toJson().constData());
+#else
+ QByteArray binary = doc.toBinaryData();
+ for (int i = 0; i < binary.size() - 1; ++i) {
+ fprintf(out, " 0x%02x,", (uchar)binary.at(i));
+ if (!((i + 1) % 8))
+ fprintf(out, "\n ");
+ }
+ fprintf(out, " 0x%02x\n};\n", (uchar)binary.at(binary.size() - 1));
+#endif
+ // 'Use' all namespaces.
+ int pos = cdef->qualified.indexOf("::");
+ for ( ; pos != -1 ; pos = cdef->qualified.indexOf("::", pos + 2) )
+ fprintf(out, "using namespace %s;\n", cdef->qualified.left(pos).constData());
+ fprintf(out, "QT_MOC_EXPORT_PLUGIN(%s)\n\n", cdef->classname.constData());
+}
+
QT_END_NAMESPACE
diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h
index a3dc3d0041..46eee4ca06 100644
--- a/src/tools/moc/generator.h
+++ b/src/tools/moc/generator.h
@@ -56,15 +56,16 @@ public:
void generateCode();
private:
void generateClassInfos();
- void generateFunctions(QList<FunctionDef> &list, const char *functype, int type);
- void generateFunctionRevisions(QList<FunctionDef>& list, const char *functype);
+ void generateFunctions(const QList<FunctionDef> &list, const char *functype, int type);
+ void generateFunctionRevisions(const QList<FunctionDef>& list, const char *functype);
void generateEnums(int index);
void generateProperties();
void generateMetacall();
void generateStaticMetacall();
void generateSignal(FunctionDef *def, int index);
+ void generatePluginMetaData();
- int strreg(const char *); // registers a string and returns its id
+ int strreg(const QByteArray &); // registers a string and returns its id
QList<QByteArray> strings;
QByteArray purestSuperClass;
QList<QByteArray> metaTypes;
diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp
index 7a6b44074b..f6151bdbf5 100644
--- a/src/tools/moc/keywords.cpp
+++ b/src/tools/moc/keywords.cpp
@@ -43,12 +43,12 @@
// DO NOT EDIT.
static const short keyword_trans[][128] = {
- {0,0,0,0,0,0,0,0,0,532,529,0,0,0,0,0,
+ {0,0,0,0,0,0,0,0,0,546,543,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 532,252,530,533,0,38,239,531,25,26,236,234,30,235,27,237,
+ 546,252,544,547,0,38,239,545,25,26,236,234,30,235,27,237,
22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43,
0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,21,8,8,8,8,8,8,8,8,8,31,534,32,238,8,
+ 8,21,8,8,8,8,8,8,8,8,8,31,548,32,238,8,
0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13,
14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -129,7 +129,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,290,222,0,0,461,0,0,0,
+ 0,0,0,0,0,0,0,0,290,222,0,0,475,0,0,0,
0,0,0,0,55,0,0,330,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -168,7 +168,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,485,0,0,0,0,0,0,0,0,0,0,357,
+ 0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,357,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -190,7 +190,7 @@ static const short keyword_trans[][128] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0,
- 537,537,537,537,537,537,537,537,537,537,0,0,0,0,0,0,
+ 551,551,551,551,551,551,551,551,551,551,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -349,7 +349,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,536,0,0,0,0,535,
+ 0,0,0,0,0,0,0,0,0,0,550,0,0,0,0,549,
0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -385,21 +385,29 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,458,0,0,0,300,0,0,0,0,0,0,0,0,0,0,
+ 0,472,0,0,0,300,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,439,388,378,383,364,0,448,0,0,0,0,0,358,
- 370,0,521,436,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,453,402,392,397,364,0,462,0,0,0,0,0,358,
+ 370,0,535,450,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,475,0,0,0,0,0,372,
+ 0,0,0,0,0,0,0,0,0,0,0,0,378,0,0,0,
+ 0,0,371,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,489,0,0,0,0,0,372,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@@ -407,7 +415,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,418,396,0,0,401,0,0,0,410,0,0,
+ 0,0,0,0,0,432,410,0,0,415,0,0,0,424,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@@ -415,7 +423,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,504,0,437,0,0,0,465,0,0,471,0,0,0,
+ 0,0,0,518,0,451,0,0,0,479,0,0,485,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@@ -424,7 +432,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,450,0,497,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,464,0,511,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -432,7 +440,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 513,0,0,481,0,0,0,0,0,0,0,0,0,0,0,0,
+ 527,0,0,495,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
@@ -815,164 +823,178 @@ static const struct
{CHARACTER, 0, 69, 368, CHARACTER},
{CHARACTER, 0, 84, 369, CHARACTER},
{Q_GADGET_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 82, 371, CHARACTER},
{CHARACTER, 44, 0, 0, CHARACTER},
+ {CHARACTER, 45, 0, 0, CHARACTER},
{CHARACTER, 0, 80, 373, CHARACTER},
{CHARACTER, 0, 69, 374, CHARACTER},
{CHARACTER, 0, 82, 375, CHARACTER},
{CHARACTER, 0, 84, 376, CHARACTER},
{CHARACTER, 0, 89, 377, CHARACTER},
{Q_PROPERTY_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 78, 379, CHARACTER},
- {CHARACTER, 0, 85, 380, CHARACTER},
- {CHARACTER, 0, 77, 381, CHARACTER},
- {CHARACTER, 0, 83, 382, CHARACTER},
+ {CHARACTER, 0, 85, 379, CHARACTER},
+ {CHARACTER, 0, 71, 380, CHARACTER},
+ {CHARACTER, 0, 73, 381, CHARACTER},
+ {CHARACTER, 0, 78, 382, CHARACTER},
+ {CHARACTER, 0, 95, 383, CHARACTER},
+ {CHARACTER, 0, 77, 384, CHARACTER},
+ {CHARACTER, 0, 69, 385, CHARACTER},
+ {CHARACTER, 0, 84, 386, CHARACTER},
+ {CHARACTER, 0, 65, 387, CHARACTER},
+ {CHARACTER, 0, 68, 388, CHARACTER},
+ {CHARACTER, 0, 65, 389, CHARACTER},
+ {CHARACTER, 0, 84, 390, CHARACTER},
+ {CHARACTER, 0, 65, 391, CHARACTER},
+ {Q_PLUGIN_METADATA_TOKEN, 0, 0, 0, CHARACTER},
+ {CHARACTER, 0, 78, 393, CHARACTER},
+ {CHARACTER, 0, 85, 394, CHARACTER},
+ {CHARACTER, 0, 77, 395, CHARACTER},
+ {CHARACTER, 0, 83, 396, CHARACTER},
{Q_ENUMS_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 76, 384, CHARACTER},
- {CHARACTER, 0, 65, 385, CHARACTER},
- {CHARACTER, 0, 71, 386, CHARACTER},
- {CHARACTER, 0, 83, 387, CHARACTER},
+ {CHARACTER, 0, 76, 398, CHARACTER},
+ {CHARACTER, 0, 65, 399, CHARACTER},
+ {CHARACTER, 0, 71, 400, CHARACTER},
+ {CHARACTER, 0, 83, 401, CHARACTER},
{Q_FLAGS_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 69, 389, CHARACTER},
- {CHARACTER, 0, 67, 390, CHARACTER},
- {CHARACTER, 0, 76, 391, CHARACTER},
- {CHARACTER, 0, 65, 392, CHARACTER},
- {CHARACTER, 0, 82, 393, CHARACTER},
- {CHARACTER, 0, 69, 394, CHARACTER},
- {CHARACTER, 0, 95, 395, CHARACTER},
- {CHARACTER, 45, 0, 0, CHARACTER},
- {CHARACTER, 0, 76, 397, CHARACTER},
- {CHARACTER, 0, 65, 398, CHARACTER},
- {CHARACTER, 0, 71, 399, CHARACTER},
- {CHARACTER, 0, 83, 400, CHARACTER},
+ {CHARACTER, 0, 69, 403, CHARACTER},
+ {CHARACTER, 0, 67, 404, CHARACTER},
+ {CHARACTER, 0, 76, 405, CHARACTER},
+ {CHARACTER, 0, 65, 406, CHARACTER},
+ {CHARACTER, 0, 82, 407, CHARACTER},
+ {CHARACTER, 0, 69, 408, CHARACTER},
+ {CHARACTER, 0, 95, 409, CHARACTER},
+ {CHARACTER, 46, 0, 0, CHARACTER},
+ {CHARACTER, 0, 76, 411, CHARACTER},
+ {CHARACTER, 0, 65, 412, CHARACTER},
+ {CHARACTER, 0, 71, 413, CHARACTER},
+ {CHARACTER, 0, 83, 414, CHARACTER},
{Q_DECLARE_FLAGS_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 78, 402, CHARACTER},
- {CHARACTER, 0, 84, 403, CHARACTER},
- {CHARACTER, 0, 69, 404, CHARACTER},
- {CHARACTER, 0, 82, 405, CHARACTER},
- {CHARACTER, 0, 70, 406, CHARACTER},
- {CHARACTER, 0, 65, 407, CHARACTER},
- {CHARACTER, 0, 67, 408, CHARACTER},
- {CHARACTER, 0, 69, 409, CHARACTER},
+ {CHARACTER, 0, 78, 416, CHARACTER},
+ {CHARACTER, 0, 84, 417, CHARACTER},
+ {CHARACTER, 0, 69, 418, CHARACTER},
+ {CHARACTER, 0, 82, 419, CHARACTER},
+ {CHARACTER, 0, 70, 420, CHARACTER},
+ {CHARACTER, 0, 65, 421, CHARACTER},
+ {CHARACTER, 0, 67, 422, CHARACTER},
+ {CHARACTER, 0, 69, 423, CHARACTER},
{Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 69, 411, CHARACTER},
- {CHARACTER, 0, 84, 412, CHARACTER},
- {CHARACTER, 0, 65, 413, CHARACTER},
- {CHARACTER, 0, 84, 414, CHARACTER},
- {CHARACTER, 0, 89, 415, CHARACTER},
- {CHARACTER, 0, 80, 416, CHARACTER},
- {CHARACTER, 0, 69, 417, CHARACTER},
- {Q_DECLARE_METATYPE_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 88, 419, CHARACTER},
- {CHARACTER, 0, 84, 420, CHARACTER},
- {CHARACTER, 0, 69, 421, CHARACTER},
- {CHARACTER, 0, 78, 422, CHARACTER},
- {CHARACTER, 0, 83, 423, CHARACTER},
- {CHARACTER, 0, 73, 424, CHARACTER},
- {CHARACTER, 0, 79, 425, CHARACTER},
- {CHARACTER, 0, 78, 426, CHARACTER},
- {CHARACTER, 0, 95, 427, CHARACTER},
- {CHARACTER, 0, 73, 428, CHARACTER},
- {CHARACTER, 0, 78, 429, CHARACTER},
- {CHARACTER, 0, 84, 430, CHARACTER},
+ {CHARACTER, 0, 69, 425, CHARACTER},
+ {CHARACTER, 0, 84, 426, CHARACTER},
+ {CHARACTER, 0, 65, 427, CHARACTER},
+ {CHARACTER, 0, 84, 428, CHARACTER},
+ {CHARACTER, 0, 89, 429, CHARACTER},
+ {CHARACTER, 0, 80, 430, CHARACTER},
{CHARACTER, 0, 69, 431, CHARACTER},
- {CHARACTER, 0, 82, 432, CHARACTER},
- {CHARACTER, 0, 70, 433, CHARACTER},
- {CHARACTER, 0, 65, 434, CHARACTER},
- {CHARACTER, 0, 67, 435, CHARACTER},
- {CHARACTER, 0, 69, 409, CHARACTER},
- {CHARACTER, 46, 0, 0, CHARACTER},
- {CHARACTER, 0, 84, 438, CHARACTER},
- {CHARACTER, 0, 83, 387, CHARACTER},
- {CHARACTER, 0, 76, 440, CHARACTER},
- {CHARACTER, 0, 65, 441, CHARACTER},
- {CHARACTER, 0, 83, 442, CHARACTER},
- {CHARACTER, 0, 83, 443, CHARACTER},
- {CHARACTER, 0, 73, 444, CHARACTER},
- {CHARACTER, 0, 78, 445, CHARACTER},
- {CHARACTER, 0, 70, 446, CHARACTER},
- {CHARACTER, 0, 79, 447, CHARACTER},
- {Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 78, 449, CHARACTER},
+ {Q_DECLARE_METATYPE_TOKEN, 0, 0, 0, CHARACTER},
+ {CHARACTER, 0, 88, 433, CHARACTER},
+ {CHARACTER, 0, 84, 434, CHARACTER},
+ {CHARACTER, 0, 69, 435, CHARACTER},
+ {CHARACTER, 0, 78, 436, CHARACTER},
+ {CHARACTER, 0, 83, 437, CHARACTER},
+ {CHARACTER, 0, 73, 438, CHARACTER},
+ {CHARACTER, 0, 79, 439, CHARACTER},
+ {CHARACTER, 0, 78, 440, CHARACTER},
+ {CHARACTER, 0, 95, 441, CHARACTER},
+ {CHARACTER, 0, 73, 442, CHARACTER},
+ {CHARACTER, 0, 78, 443, CHARACTER},
+ {CHARACTER, 0, 84, 444, CHARACTER},
+ {CHARACTER, 0, 69, 445, CHARACTER},
+ {CHARACTER, 0, 82, 446, CHARACTER},
+ {CHARACTER, 0, 70, 447, CHARACTER},
+ {CHARACTER, 0, 65, 448, CHARACTER},
+ {CHARACTER, 0, 67, 449, CHARACTER},
+ {CHARACTER, 0, 69, 423, CHARACTER},
{CHARACTER, 47, 0, 0, CHARACTER},
- {CHARACTER, 0, 69, 451, CHARACTER},
- {CHARACTER, 0, 82, 452, CHARACTER},
- {CHARACTER, 0, 70, 453, CHARACTER},
- {CHARACTER, 0, 65, 454, CHARACTER},
- {CHARACTER, 0, 67, 455, CHARACTER},
- {CHARACTER, 0, 69, 456, CHARACTER},
+ {CHARACTER, 0, 84, 452, CHARACTER},
+ {CHARACTER, 0, 83, 401, CHARACTER},
+ {CHARACTER, 0, 76, 454, CHARACTER},
+ {CHARACTER, 0, 65, 455, CHARACTER},
+ {CHARACTER, 0, 83, 456, CHARACTER},
{CHARACTER, 0, 83, 457, CHARACTER},
+ {CHARACTER, 0, 73, 458, CHARACTER},
+ {CHARACTER, 0, 78, 459, CHARACTER},
+ {CHARACTER, 0, 70, 460, CHARACTER},
+ {CHARACTER, 0, 79, 461, CHARACTER},
+ {Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER},
+ {CHARACTER, 0, 78, 463, CHARACTER},
+ {CHARACTER, 48, 0, 0, CHARACTER},
+ {CHARACTER, 0, 69, 465, CHARACTER},
+ {CHARACTER, 0, 82, 466, CHARACTER},
+ {CHARACTER, 0, 70, 467, CHARACTER},
+ {CHARACTER, 0, 65, 468, CHARACTER},
+ {CHARACTER, 0, 67, 469, CHARACTER},
+ {CHARACTER, 0, 69, 470, CHARACTER},
+ {CHARACTER, 0, 83, 471, CHARACTER},
{Q_INTERFACES_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 108, 459, CHARACTER},
- {CHARACTER, 0, 115, 460, CHARACTER},
+ {CHARACTER, 0, 108, 473, CHARACTER},
+ {CHARACTER, 0, 115, 474, CHARACTER},
{SIGNALS, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 111, 462, CHARACTER},
- {CHARACTER, 0, 116, 463, CHARACTER},
- {CHARACTER, 0, 115, 464, CHARACTER},
+ {CHARACTER, 0, 111, 476, CHARACTER},
+ {CHARACTER, 0, 116, 477, CHARACTER},
+ {CHARACTER, 0, 115, 478, CHARACTER},
{SLOTS, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 71, 466, CHARACTER},
- {CHARACTER, 0, 78, 467, CHARACTER},
- {CHARACTER, 0, 65, 468, CHARACTER},
- {CHARACTER, 0, 76, 469, CHARACTER},
- {Q_SIGNAL_TOKEN, 0, 83, 470, CHARACTER},
+ {CHARACTER, 0, 71, 480, CHARACTER},
+ {CHARACTER, 0, 78, 481, CHARACTER},
+ {CHARACTER, 0, 65, 482, CHARACTER},
+ {CHARACTER, 0, 76, 483, CHARACTER},
+ {Q_SIGNAL_TOKEN, 0, 83, 484, CHARACTER},
{Q_SIGNALS_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 79, 472, CHARACTER},
- {CHARACTER, 0, 84, 473, CHARACTER},
- {Q_SLOT_TOKEN, 0, 83, 474, CHARACTER},
+ {CHARACTER, 0, 79, 486, CHARACTER},
+ {CHARACTER, 0, 84, 487, CHARACTER},
+ {Q_SLOT_TOKEN, 0, 83, 488, CHARACTER},
{Q_SLOTS_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 86, 476, CHARACTER},
- {CHARACTER, 0, 65, 477, CHARACTER},
- {CHARACTER, 0, 84, 478, CHARACTER},
- {CHARACTER, 0, 69, 479, CHARACTER},
- {CHARACTER, 0, 95, 480, CHARACTER},
- {CHARACTER, 48, 0, 0, CHARACTER},
- {CHARACTER, 0, 76, 482, CHARACTER},
- {CHARACTER, 0, 79, 483, CHARACTER},
- {CHARACTER, 0, 84, 484, CHARACTER},
+ {CHARACTER, 0, 86, 490, CHARACTER},
+ {CHARACTER, 0, 65, 491, CHARACTER},
+ {CHARACTER, 0, 84, 492, CHARACTER},
+ {CHARACTER, 0, 69, 493, CHARACTER},
+ {CHARACTER, 0, 95, 494, CHARACTER},
+ {CHARACTER, 49, 0, 0, CHARACTER},
+ {CHARACTER, 0, 76, 496, CHARACTER},
+ {CHARACTER, 0, 79, 497, CHARACTER},
+ {CHARACTER, 0, 84, 498, CHARACTER},
{Q_PRIVATE_SLOT_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 95, 486, CHARACTER},
- {CHARACTER, 0, 77, 487, CHARACTER},
- {CHARACTER, 0, 79, 488, CHARACTER},
- {CHARACTER, 0, 67, 489, CHARACTER},
- {CHARACTER, 0, 95, 490, CHARACTER},
- {CHARACTER, 0, 67, 491, CHARACTER},
- {CHARACTER, 0, 79, 492, CHARACTER},
- {CHARACTER, 0, 77, 493, CHARACTER},
- {CHARACTER, 0, 80, 494, CHARACTER},
- {CHARACTER, 0, 65, 495, CHARACTER},
- {CHARACTER, 0, 84, 496, CHARACTER},
+ {CHARACTER, 0, 95, 500, CHARACTER},
+ {CHARACTER, 0, 77, 501, CHARACTER},
+ {CHARACTER, 0, 79, 502, CHARACTER},
+ {CHARACTER, 0, 67, 503, CHARACTER},
+ {CHARACTER, 0, 95, 504, CHARACTER},
+ {CHARACTER, 0, 67, 505, CHARACTER},
+ {CHARACTER, 0, 79, 506, CHARACTER},
+ {CHARACTER, 0, 77, 507, CHARACTER},
+ {CHARACTER, 0, 80, 508, CHARACTER},
+ {CHARACTER, 0, 65, 509, CHARACTER},
+ {CHARACTER, 0, 84, 510, CHARACTER},
{Q_MOC_COMPAT_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 79, 498, CHARACTER},
- {CHARACTER, 0, 75, 499, CHARACTER},
- {CHARACTER, 0, 65, 500, CHARACTER},
- {CHARACTER, 0, 66, 501, CHARACTER},
- {CHARACTER, 0, 76, 502, CHARACTER},
- {CHARACTER, 0, 69, 503, CHARACTER},
+ {CHARACTER, 0, 79, 512, CHARACTER},
+ {CHARACTER, 0, 75, 513, CHARACTER},
+ {CHARACTER, 0, 65, 514, CHARACTER},
+ {CHARACTER, 0, 66, 515, CHARACTER},
+ {CHARACTER, 0, 76, 516, CHARACTER},
+ {CHARACTER, 0, 69, 517, CHARACTER},
{Q_INVOKABLE_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 82, 505, CHARACTER},
- {CHARACTER, 0, 73, 506, CHARACTER},
- {CHARACTER, 0, 80, 507, CHARACTER},
- {CHARACTER, 0, 84, 508, CHARACTER},
- {CHARACTER, 0, 65, 509, CHARACTER},
- {CHARACTER, 0, 66, 510, CHARACTER},
- {CHARACTER, 0, 76, 511, CHARACTER},
- {CHARACTER, 0, 69, 512, CHARACTER},
+ {CHARACTER, 0, 82, 519, CHARACTER},
+ {CHARACTER, 0, 73, 520, CHARACTER},
+ {CHARACTER, 0, 80, 521, CHARACTER},
+ {CHARACTER, 0, 84, 522, CHARACTER},
+ {CHARACTER, 0, 65, 523, CHARACTER},
+ {CHARACTER, 0, 66, 524, CHARACTER},
+ {CHARACTER, 0, 76, 525, CHARACTER},
+ {CHARACTER, 0, 69, 526, CHARACTER},
{Q_SCRIPTABLE_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 82, 514, CHARACTER},
- {CHARACTER, 0, 79, 515, CHARACTER},
- {CHARACTER, 0, 80, 516, CHARACTER},
- {CHARACTER, 0, 69, 517, CHARACTER},
- {CHARACTER, 0, 82, 518, CHARACTER},
- {CHARACTER, 0, 84, 519, CHARACTER},
- {CHARACTER, 0, 89, 520, CHARACTER},
+ {CHARACTER, 0, 82, 528, CHARACTER},
+ {CHARACTER, 0, 79, 529, CHARACTER},
+ {CHARACTER, 0, 80, 530, CHARACTER},
+ {CHARACTER, 0, 69, 531, CHARACTER},
+ {CHARACTER, 0, 82, 532, CHARACTER},
+ {CHARACTER, 0, 84, 533, CHARACTER},
+ {CHARACTER, 0, 89, 534, CHARACTER},
{Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 69, 522, CHARACTER},
- {CHARACTER, 0, 86, 523, CHARACTER},
- {CHARACTER, 0, 73, 524, CHARACTER},
- {CHARACTER, 0, 83, 525, CHARACTER},
- {CHARACTER, 0, 73, 526, CHARACTER},
- {CHARACTER, 0, 79, 527, CHARACTER},
- {CHARACTER, 0, 78, 528, CHARACTER},
+ {CHARACTER, 0, 69, 536, CHARACTER},
+ {CHARACTER, 0, 86, 537, CHARACTER},
+ {CHARACTER, 0, 73, 538, CHARACTER},
+ {CHARACTER, 0, 83, 539, CHARACTER},
+ {CHARACTER, 0, 73, 540, CHARACTER},
+ {CHARACTER, 0, 79, 541, CHARACTER},
+ {CHARACTER, 0, 78, 542, CHARACTER},
{Q_REVISION_TOKEN, 0, 0, 0, CHARACTER},
{NEWLINE, 0, 0, 0, NOTOKEN},
{QUOTE, 0, 0, 0, NOTOKEN},
diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp
index 512d0212b7..772df1feec 100644
--- a/src/tools/moc/main.cpp
+++ b/src/tools/moc/main.cpp
@@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE
/tmp/abc, xyz/klm -> /tmp/abc
*/
-static QByteArray combinePath(const char *infile, const char *outfile)
+static QByteArray combinePath(const QByteArray &infile, const QByteArray &outfile)
{
QFileInfo inFileInfo(QDir::current(), QFile::decodeName(infile));
QFileInfo outFileInfo(QDir::current(), QFile::decodeName(outfile));
@@ -379,7 +379,7 @@ int runMoc(int _argc, char **_argv)
in = fopen(filename.data(), "rb");
if (!in) {
#endif
- fprintf(stderr, "moc: %s: No such file\n", (const char*)filename);
+ fprintf(stderr, "moc: %s: No such file\n", filename.constData());
return 1;
}
moc.filename = filename;
@@ -406,7 +406,7 @@ int runMoc(int _argc, char **_argv)
if (!out)
#endif
{
- fprintf(stderr, "moc: Cannot create %s\n", (const char*)output);
+ fprintf(stderr, "moc: Cannot create %s\n", output.constData());
return 1;
}
} else { // use stdout
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 5c9e1ee838..7b358c1ae8 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -44,6 +44,9 @@
#include "qdatetime.h"
#include "utils.h"
#include "outputrevision.h"
+#include <QtCore/qfile.h>
+#include <QtCore/qfileinfo.h>
+#include <QtCore/qdir.h>
// for normalizeTypeInternal
#include <private/qmetaobject_moc_p.h>
@@ -51,9 +54,10 @@
QT_BEGIN_NAMESPACE
// only moc needs this function
-static QByteArray normalizeType(const char *s, bool fixScope = false)
+static QByteArray normalizeType(const QByteArray &ba, bool fixScope = false)
{
- int len = qstrlen(s);
+ const char *s = ba.constData();
+ int len = ba.size();
char stackbuf[64];
char *buf = (len >= 64 ? new char[len + 1] : stackbuf);
char *d = buf;
@@ -673,6 +677,9 @@ void Moc::parse()
case Q_PROPERTY_TOKEN:
parseProperty(&def);
break;
+ case Q_PLUGIN_METADATA_TOKEN:
+ parsePluginData(&def);
+ break;
case Q_ENUMS_TOKEN:
parseEnumOrFlag(&def, false);
break;
@@ -788,7 +795,7 @@ void Moc::generate(FILE *out)
if (i >= 0)
fn = filename.mid(i);
fprintf(out, "/****************************************************************************\n"
- "** Meta object code from reading C++ file '%s'\n**\n" , (const char*)fn);
+ "** Meta object code from reading C++ file '%s'\n**\n" , fn.constData());
fprintf(out, "** Created: %s\n"
"** by: The Qt Meta Object Compiler version %d (Qt %s)\n**\n" , dstr.data(), mocOutputRevision, QT_VERSION_STR);
fprintf(out, "** WARNING! All changes made in this file will be lost!\n"
@@ -813,9 +820,11 @@ void Moc::generate(FILE *out)
if (mustIncludeQMetaTypeH)
fprintf(out, "#include <QtCore/qmetatype.h>\n");
+ if (mustIncludeQPluginH)
+ fprintf(out, "#include <QtCore/qplugin.h>\n");
fprintf(out, "#if !defined(Q_MOC_OUTPUT_REVISION)\n"
- "#error \"The header file '%s' doesn't include <QObject>.\"\n", (const char *)fn);
+ "#error \"The header file '%s' doesn't include <QObject>.\"\n", fn.constData());
fprintf(out, "#elif Q_MOC_OUTPUT_REVISION != %d\n", mocOutputRevision);
fprintf(out, "#error \"This file was generated using the moc from %s."
" It\"\n#error \"cannot be used with the include files from"
@@ -1080,6 +1089,50 @@ void Moc::parseProperty(ClassDef *def)
def->propertyList += propDef;
}
+void Moc::parsePluginData(ClassDef *def)
+{
+ next(LPAREN);
+ QByteArray metaData;
+ while (test(IDENTIFIER)) {
+ QByteArray l = lexem();
+ if (l == "IID") {
+ next(STRING_LITERAL);
+ def->pluginData.iid = unquotedLexem();
+ } else if (l == "FILE") {
+ next(STRING_LITERAL);
+ QByteArray metaDataFile = unquotedLexem();
+ QFileInfo fi(QFileInfo(QString::fromLocal8Bit(currentFilenames.top().constData())).dir(), QString::fromLocal8Bit(metaDataFile.constData()));
+ if (!fi.exists()) {
+ QByteArray msg;
+ msg += "Plugin Metadata file ";
+ msg += lexem();
+ msg += " does not exist. Declaration will be ignored";
+ warning(msg.constData());
+ return;
+ }
+ QFile file(fi.canonicalFilePath());
+ file.open(QFile::ReadOnly);
+ metaData = file.readAll();
+ }
+ }
+
+ if (!metaData.isEmpty()) {
+ def->pluginData.metaData = QJsonDocument::fromJson(metaData);
+ if (!def->pluginData.metaData.isObject()) {
+ QByteArray msg;
+ msg += "Plugin Metadata file ";
+ msg += lexem();
+ msg += " does not contain a valid JSON object. Declaration will be ignored";
+ warning(msg.constData());
+ def->pluginData.iid = QByteArray();
+ return;
+ }
+ }
+
+ mustIncludeQPluginH = true;
+ next(RPAREN);
+}
+
void Moc::parsePrivateProperty(ClassDef *def)
{
next(LPAREN);
diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h
index b780272dff..aedb97b234 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -46,6 +46,7 @@
#include <QStringList>
#include <QMap>
#include <QPair>
+#include <QJsonDocument>
#include <stdio.h>
#include <ctype.h>
@@ -167,6 +168,11 @@ struct ClassDef {
bool hasQObject;
bool hasQGadget;
+ struct PluginData {
+ QByteArray iid;
+ QJsonDocument metaData;
+ } pluginData;
+
QList<FunctionDef> constructorList;
QList<FunctionDef> signalList, slotList, methodList, publicList;
int notifyableProperties;
@@ -192,7 +198,7 @@ class Moc : public Parser
{
public:
Moc()
- : noInclude(false), generatedCode(false), mustIncludeQMetaTypeH(false)
+ : noInclude(false), generatedCode(false), mustIncludeQMetaTypeH(false), mustIncludeQPluginH(false)
{}
QByteArray filename;
@@ -200,6 +206,7 @@ public:
bool noInclude;
bool generatedCode;
bool mustIncludeQMetaTypeH;
+ bool mustIncludeQPluginH;
QByteArray includePath;
QList<QByteArray> includeFiles;
QList<ClassDef> classList;
@@ -229,6 +236,7 @@ public:
void parseSlots(ClassDef *def, FunctionDef::Access access);
void parseSignals(ClassDef *def);
void parseProperty(ClassDef *def);
+ void parsePluginData(ClassDef *def);
void createPropertyDef(PropertyDef &def);
void parseEnumOrFlag(ClassDef *def, bool isFlag);
void parseFlag(ClassDef *def);
diff --git a/src/tools/moc/moc.pro b/src/tools/moc/moc.pro
index 8e2e76d4b9..3ee507855c 100644
--- a/src/tools/moc/moc.pro
+++ b/src/tools/moc/moc.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
TARGET = moc
-DEFINES += QT_MOC
+DEFINES += QT_MOC QT_NO_CAST_FROM_BYTEARRAY
DESTDIR = ../../../bin
INCLUDEPATH += .
DEPENDPATH += .
diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp
index 07b9e4c500..07986a71e6 100644
--- a/src/tools/moc/preprocessor.cpp
+++ b/src/tools/moc/preprocessor.cpp
@@ -58,7 +58,7 @@ static QByteArray cleaned(const QByteArray &input)
{
QByteArray result;
result.reserve(input.size());
- const char *data = input;
+ const char *data = input.constData();
char *output = result.data();
int newlines = 0;
@@ -161,7 +161,7 @@ enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatem
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp)
{
Symbols symbols;
- const char *begin = input;
+ const char *begin = input.constData();
const char *data = begin;
while (*data) {
if (mode == TokenizeCpp) {
@@ -799,7 +799,7 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
// #### stringery
QFileInfo fi;
if (local)
- fi.setFile(QFileInfo(QString::fromLocal8Bit(filename)).dir(), QString::fromLocal8Bit(include));
+ fi.setFile(QFileInfo(QString::fromLocal8Bit(filename.constData())).dir(), QString::fromLocal8Bit(include.constData()));
for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) {
const IncludePath &p = Preprocessor::includes.at(j);
if (p.isFrameworkPath) {
@@ -808,9 +808,9 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
continue;
QByteArray frameworkCandidate = include.left(slashPos);
frameworkCandidate.append(".framework/Headers/");
- fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate)), QString::fromLocal8Bit(include.mid(slashPos + 1)));
+ fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate).constData()), QString::fromLocal8Bit(include.mid(slashPos + 1).constData()));
} else {
- fi.setFile(QString::fromLocal8Bit(p.path), QString::fromLocal8Bit(include));
+ fi.setFile(QString::fromLocal8Bit(p.path.constData()), QString::fromLocal8Bit(include.constData()));
}
// try again, maybe there's a file later in the include paths with the same name
// (186067)
@@ -828,7 +828,7 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
continue;
Preprocessor::preprocessedIncludes.insert(include);
- QFile file(QString::fromLocal8Bit(include));
+ QFile file(QString::fromLocal8Bit(include.constData()));
if (!file.open(QFile::ReadOnly))
continue;
diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h
index a694ff4eb2..a9f028f20a 100644
--- a/src/tools/moc/token.h
+++ b/src/tools/moc/token.h
@@ -169,6 +169,7 @@ enum Token {
Q_OBJECT_TOKEN = Q_META_TOKEN_BEGIN,
Q_GADGET_TOKEN,
Q_PROPERTY_TOKEN,
+ Q_PLUGIN_METADATA_TOKEN,
Q_ENUMS_TOKEN,
Q_FLAGS_TOKEN,
Q_DECLARE_FLAGS_TOKEN,
diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp
index eb06315fed..4560944a47 100644
--- a/src/tools/moc/util/generate_keywords.cpp
+++ b/src/tools/moc/util/generate_keywords.cpp
@@ -228,6 +228,7 @@ static const Keyword keywords[] = {
{ "Q_OBJECT", "Q_OBJECT_TOKEN" },
{ "Q_GADGET", "Q_GADGET_TOKEN" },
{ "Q_PROPERTY", "Q_PROPERTY_TOKEN" },
+ { "Q_PLUGIN_METADATA", "Q_PLUGIN_METADATA_TOKEN" },
{ "Q_ENUMS", "Q_ENUMS_TOKEN" },
{ "Q_FLAGS", "Q_FLAGS_TOKEN" },
{ "Q_DECLARE_FLAGS", "Q_DECLARE_FLAGS_TOKEN" },
diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp
index 91f2f2558b..5762c175cc 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.cpp
+++ b/src/tools/uic/cpp/cppwriteinitialization.cpp
@@ -537,7 +537,7 @@ void WriteInitialization::acceptUI(DomUI *node)
continue;
const QString varConn = connection + QLatin1String("Connection");
- m_output << m_indent << varConn << " = QSqlDatabase::database(" << fixString(connection, m_dindent) << ");\n";
+ m_output << m_indent << varConn << " = QSqlDatabase::database(" << writeString(connection, m_dindent) << ");\n";
}
acceptWidget(node->elementWidget());
@@ -1143,7 +1143,7 @@ QString WriteInitialization::writeStringListProperty(const DomStringList *list)
str << '\n' << m_indent << " << " << trCall(values.at(i), comment);
} else {
for (int i = 0; i < values.size(); ++i)
- str << " << QString::fromUtf8(" << fixString(values.at(i), m_dindent) << ')';
+ str << " << " << writeString(values.at(i), m_dindent);
}
return propertyValue;
}
@@ -1159,8 +1159,8 @@ void WriteInitialization::writeProperties(const QString &varName,
DomPropertyMap properties = propertyMap(lst);
if (properties.contains(QLatin1String("control"))) {
DomProperty *p = properties.value(QLatin1String("control"));
- m_output << m_indent << varName << "->setControl(QString::fromUtf8("
- << fixString(toString(p->elementString()), m_dindent) << "));\n";
+ m_output << m_indent << varName << "->setControl("
+ << writeString(toString(p->elementString()), m_dindent) << ");\n";
}
}
@@ -1171,7 +1171,7 @@ void WriteInitialization::writeProperties(const QString &varName,
}
if (!(flags & WritePropertyIgnoreObjectName))
m_output << m_indent << indent << varName
- << "->setObjectName(QString::fromUtf8(" << fixString(varName, m_dindent) << "));\n";
+ << "->setObjectName(" << writeString(varName, m_dindent) << ");\n";
int leftMargin, topMargin, rightMargin, bottomMargin;
leftMargin = topMargin = rightMargin = bottomMargin = -1;
@@ -1459,8 +1459,8 @@ void WriteInitialization::writeProperties(const QString &varName,
case DomProperty::Url: {
const DomUrl* u = p->elementUrl();
- propertyValue = QString::fromLatin1("QUrl(QString::fromUtf8(%1))")
- .arg(fixString(u->elementString()->text(), m_dindent));
+ propertyValue = QString::fromLatin1("QUrl(%1)")
+ .arg(writeString(u->elementString()->text(), m_dindent));
break;
}
case DomProperty::Brush:
@@ -1562,8 +1562,8 @@ QString WriteInitialization::writeFontProperties(const DomFont *f)
m_output << m_indent << "QFont " << fontName << ";\n";
if (f->hasElementFamily() && !f->elementFamily().isEmpty()) {
- m_output << m_indent << fontName << ".setFamily(QString::fromUtf8(" << fixString(f->elementFamily(), m_dindent)
- << "));\n";
+ m_output << m_indent << fontName << ".setFamily(" << writeString(f->elementFamily(), m_dindent)
+ << ");\n";
}
if (f->hasElementPointSize() && f->elementPointSize() > 0) {
m_output << m_indent << fontName << ".setPointSize(" << f->elementPointSize()
@@ -1612,21 +1612,21 @@ static void writeResourceIcon(QTextStream &output,
const DomResourceIcon *i)
{
if (i->hasElementNormalOff())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementNormalOff()->text(), indent) << "), QSize(), QIcon::Normal, QIcon::Off);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementNormalOff()->text(), indent) << ", QSize(), QIcon::Normal, QIcon::Off);\n";
if (i->hasElementNormalOn())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementNormalOn()->text(), indent) << "), QSize(), QIcon::Normal, QIcon::On);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementNormalOn()->text(), indent) << ", QSize(), QIcon::Normal, QIcon::On);\n";
if (i->hasElementDisabledOff())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementDisabledOff()->text(), indent) << "), QSize(), QIcon::Disabled, QIcon::Off);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementDisabledOff()->text(), indent) << ", QSize(), QIcon::Disabled, QIcon::Off);\n";
if (i->hasElementDisabledOn())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementDisabledOn()->text(), indent) << "), QSize(), QIcon::Disabled, QIcon::On);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementDisabledOn()->text(), indent) << ", QSize(), QIcon::Disabled, QIcon::On);\n";
if (i->hasElementActiveOff())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementActiveOff()->text(), indent) << "), QSize(), QIcon::Active, QIcon::Off);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementActiveOff()->text(), indent) << ", QSize(), QIcon::Active, QIcon::Off);\n";
if (i->hasElementActiveOn())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementActiveOn()->text(), indent) << "), QSize(), QIcon::Active, QIcon::On);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementActiveOn()->text(), indent) << ", QSize(), QIcon::Active, QIcon::On);\n";
if (i->hasElementSelectedOff())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementSelectedOff()->text(), indent) << "), QSize(), QIcon::Selected, QIcon::Off);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementSelectedOff()->text(), indent) << ", QSize(), QIcon::Selected, QIcon::Off);\n";
if (i->hasElementSelectedOn())
- output << indent << iconName << ".addFile(QString::fromUtf8(" << fixString(i->elementSelectedOn()->text(), indent) << "), QSize(), QIcon::Selected, QIcon::On);\n";
+ output << indent << iconName << ".addFile(" << writeString(i->elementSelectedOn()->text(), indent) << ", QSize(), QIcon::Selected, QIcon::On);\n";
}
QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
@@ -1648,7 +1648,7 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
writeResourceIcon(m_output, iconName, m_indent, i);
} else {
// Theme: Generate code to check the theme and default to resource
- const QString themeIconName = fixString(i->attributeTheme(), QString());
+ const QString themeIconName = writeString(i->attributeTheme(), QString());
if (iconHasStatePixmaps(i)) {
// Theme + default state pixmaps:
// Generate code to check the theme and default to state pixmaps
@@ -1660,8 +1660,8 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
m_output << "QString ";
m_firstThemeIcon = false;
}
- m_output << themeNameStringVariableC << " = QString::fromUtf8("
- << themeIconName << ");\n";
+ m_output << themeNameStringVariableC << " = "
+ << themeIconName << ";\n";
m_output << m_indent << "if (QIcon::hasThemeIcon("
<< themeNameStringVariableC
<< ")) {\n"
@@ -1672,8 +1672,8 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
} else {
// Theme, but no state pixmaps: Construct from theme directly.
m_output << m_indent << "QIcon " << iconName
- << "(QIcon::fromTheme(QString::fromUtf8("
- << themeIconName << ")));\n";
+ << "(QIcon::fromTheme("
+ << themeIconName << "));\n";
} // Theme, but not state
} // >= 4.4
} else { // pre-4.4 legacy
@@ -2356,10 +2356,7 @@ QString WriteInitialization::noTrCall(DomString *str, const QString &defaultStri
return QString();
if (str)
value = str->text();
- QString ret = QLatin1String("QString::fromUtf8(");
- ret += fixString(value, m_dindent);
- ret += QLatin1Char(')');
- return ret;
+ return writeString(value, m_dindent);
}
QString WriteInitialization::autoTrCall(DomString *str, const QString &defaultString) const
@@ -2481,8 +2478,8 @@ void WriteInitialization::acceptWidgetScripts(const DomScripts &widgetScripts, D
}
m_output << ";\n";
}
- m_output << m_indent << "scriptContext.run(QString::fromUtf8("
- << fixString(script, m_dindent) << "), "
+ m_output << m_indent << "scriptContext.run("
+ << writeString(script, m_dindent) << ", "
<< m_driver->findOrInsertWidget(node) << ", childWidgets);\n";
}
diff --git a/src/tools/uic/uic.pro b/src/tools/uic/uic.pro
index 6598180e45..7a95db861f 100644
--- a/src/tools/uic/uic.pro
+++ b/src/tools/uic/uic.pro
@@ -14,7 +14,7 @@ HEADERS += uic.h
SOURCES += main.cpp \
uic.cpp
-linux-g++-maemo:contains(QT_ARCH, arm) {
+linux-g++-maemo {
# UIC will crash when running inside QEMU if built with -O2
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O2
diff --git a/src/tools/uic/utils.h b/src/tools/uic/utils.h
index c864305891..c6dbe548cb 100644
--- a/src/tools/uic/utils.h
+++ b/src/tools/uic/utils.h
@@ -55,18 +55,21 @@ inline bool toBool(const QString &str)
inline QString toString(const DomString *str)
{ return str ? str->text() : QString(); }
-inline QString fixString(const QString &str, const QString &indent)
+inline QString fixString(const QString &str, const QString &indent, bool *isUtf8Ret=0)
{
QString cursegment;
QStringList result;
const QByteArray utf8 = str.toUtf8();
const int utf8Length = utf8.length();
+ bool isUtf8 = false;
+
for (int i = 0; i < utf8Length; ++i) {
const uchar cbyte = utf8.at(i);
if (cbyte >= 0x80) {
cursegment += QLatin1Char('\\');
cursegment += QString::number(cbyte, 8);
+ isUtf8 = true;
} else {
switch(cbyte) {
case '\\':
@@ -100,9 +103,21 @@ inline QString fixString(const QString &str, const QString &indent)
QString rc(QLatin1Char('"'));
rc += result.join(joinstr);
rc += QLatin1Char('"');
+ if (isUtf8Ret)
+ *isUtf8Ret = isUtf8;
return rc;
}
+inline QString writeString(const QString &s, const QString &indent)
+{
+ bool isUtf8 = false;
+ const QString ret = fixString(s, indent, &isUtf8);
+ if (isUtf8)
+ return QLatin1String("QString::fromUtf8(") + ret + QLatin1Char(')');
+ else
+ return QLatin1String("QStringLiteral(") + ret + QLatin1Char(')');
+}
+
inline QHash<QString, DomProperty *> propertyMap(const QList<DomProperty *> &properties)
{
QHash<QString, DomProperty *> map;
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index a4a86e5d31..feac42780d 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -327,41 +327,76 @@ static inline bool isAncestor(const QObject *obj, const QObject *child)
return false;
}
-
/*! \reimp */
-QAccessible::Relation QAccessibleWidget::relationTo(const QAccessibleInterface *other) const
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >
+QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const
{
- QAccessible::Relation relation = QAccessible::Unrelated;
- if (d->asking == this) // recursive call
- return relation;
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > rels;
+ if (match & QAccessible::Label) {
+ const QAccessible::Relation rel = QAccessible::Label;
+ if (QWidget *parent = widget()->parentWidget()) {
+#ifndef QT_NO_SHORTCUT
+ // first check for all siblings that are labels to us
+ // ideally we would go through all objects and check, but that
+ // will be too expensive
+ const QList<QWidget*> kids = childWidgets(parent);
+ for (int i = 0; i < kids.count(); ++i) {
+ if (QLabel *labelSibling = qobject_cast<QLabel*>(kids.at(i))) {
+ if (labelSibling->buddy() == widget()) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(labelSibling);
+ rels.append(qMakePair(iface, rel));
+ }
+ }
+ }
+#endif
+#ifndef QT_NO_GROUPBOX
+ QGroupBox *groupbox = qobject_cast<QGroupBox*>(parent);
+ if (groupbox && !groupbox->title().isEmpty()) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(groupbox);
+ rels.append(qMakePair(iface, rel));
+ }
+#endif
+ }
+ }
- QObject *o = other ? other->object() : 0;
- if (!o)
- return relation;
+ if (match & QAccessible::Controller) {
+ const QAccessible::Relation rel = QAccessible::Controller;
+ QACConnectionObject *connectionObject = (QACConnectionObject*)object();
+ const QObjectList senderList = connectionObject->senderList();
+ for (int s = 0; s < senderList.count(); ++s) {
+ QObject *sender = senderList.at(s);
+ if (sender->isWidgetType() && sender != object()) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(sender);
+ QACConnectionObject *connectionSender = (QACConnectionObject*)sender;
+ QStringList senderPrimarySignals = static_cast<QAccessibleWidget*>(iface)->d->primarySignals;
+ for (int sig = 0; sig < senderPrimarySignals.count(); ++sig) {
+ const QByteArray strSignal = senderPrimarySignals.at(sig).toAscii();
+ if (connectionSender->isSender(object(), strSignal.constData()))
+ rels.append(qMakePair(iface, rel));
+ }
+ }
+ }
+ }
- QWidget *focus = widget()->focusWidget();
- if (object() == focus && isAncestor(o, focus))
- relation |= QAccessible::FocusChild;
+ if (match & QAccessible::Controlled) {
+ QObjectList allReceivers;
+ QACConnectionObject *connectionObject = (QACConnectionObject*)object();
+ for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
+ const QObjectList receivers = connectionObject->receiverList(d->primarySignals.at(sig).toAscii());
+ allReceivers += receivers;
+ }
+
+ allReceivers.removeAll(object()); //### The object might connect to itself internally
- QACConnectionObject *connectionObject = (QACConnectionObject*)object();
- for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
- if (connectionObject->isSender(o, d->primarySignals.at(sig).toAscii())) {
- relation |= QAccessible::Controller;
- break;
+ for (int i = 0; i < allReceivers.count(); ++i) {
+ const QAccessible::Relation rel = QAccessible::Controlled;
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(allReceivers.at(i));
+ if (iface)
+ rels.append(qMakePair(iface, rel));
}
}
- // test for passive relationships.
- // d->asking protects from endless recursion.
- d->asking = this;
- int inverse = other->relationTo(this);
- d->asking = 0;
- if (inverse & QAccessible::Controller)
- relation |= QAccessible::Controlled;
- if (inverse & QAccessible::Label)
- relation |= QAccessible::Labelled;
-
- return relation;
+ return rels;
}
/*! \reimp */
@@ -383,116 +418,18 @@ QAccessibleInterface *QAccessibleWidget::child(int index) const
}
/*! \reimp */
-int QAccessibleWidget::navigate(QAccessible::RelationFlag relation, int entry,
- QAccessibleInterface **target) const
+QAccessibleInterface *QAccessibleWidget::focusChild() const
{
- if (!target)
- return -1;
-
- *target = 0;
- QObject *targetObject = 0;
-
- switch (relation) {
- // Logical
- case QAccessible::FocusChild:
- {
- if (widget()->hasFocus()) {
- targetObject = object();
- break;
- }
+ if (widget()->hasFocus())
+ return QAccessible::queryAccessibleInterface(object());
- QWidget *fw = widget()->focusWidget();
- if (!fw)
- return -1;
-
- if (isAncestor(widget(), fw) || fw == widget())
- targetObject = fw;
- /* ###
- QWidget *parent = fw;
- while (parent && !targetObject) {
- parent = parent->parentWidget();
- if (parent == widget())
- targetObject = fw;
- }
- */
- }
- break;
- case QAccessible::Label:
- if (entry > 0) {
- QAccessibleInterface *pIface = QAccessible::queryAccessibleInterface(parentObject());
- if (!pIface)
- return -1;
-
- // first check for all siblings that are labels to us
- // ideally we would go through all objects and check, but that
- // will be too expensive
- int sibCount = pIface->childCount();
- QAccessibleInterface *candidate = 0;
- for (int i = 0; i < sibCount && entry; ++i) {
- candidate = pIface->child(i);
- Q_ASSERT(candidate);
- if (candidate->relationTo(this) & QAccessible::Label)
- --entry;
- if (!entry)
- break;
-
- delete candidate;
- candidate = 0;
- }
- if (!candidate) {
- if (pIface->relationTo(this) & QAccessible::Label)
- --entry;
- if (!entry)
- candidate = pIface;
- }
- if (pIface != candidate)
- delete pIface;
+ QWidget *fw = widget()->focusWidget();
+ if (!fw)
+ return 0;
- *target = candidate;
- if (*target)
- return 0;
- }
- break;
- case QAccessible::Labelled: // only implemented in subclasses
- break;
- case QAccessible::Controller:
- if (entry > 0) {
- // check all senders we are connected to,
- // and figure out which one are controllers to us
- QACConnectionObject *connectionObject = (QACConnectionObject*)object();
- QObjectList allSenders = connectionObject->senderList();
- QObjectList senders;
- for (int s = 0; s < allSenders.size(); ++s) {
- QObject *sender = allSenders.at(s);
- QAccessibleInterface *candidate = QAccessible::queryAccessibleInterface(sender);
- if (!candidate)
- continue;
- if (candidate->relationTo(this) & QAccessible::Controller)
- senders << sender;
- delete candidate;
- }
- if (entry <= senders.size())
- targetObject = senders.at(entry-1);
- }
- break;
- case QAccessible::Controlled:
- if (entry > 0) {
- QObjectList allReceivers;
- QACConnectionObject *connectionObject = (QACConnectionObject*)object();
- for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
- QObjectList receivers = connectionObject->receiverList(d->primarySignals.at(sig).toAscii());
- allReceivers += receivers;
- }
- if (entry <= allReceivers.size())
- targetObject = allReceivers.at(entry-1);
- }
- break;
- default:
- break;
- }
-
- *target = QAccessible::queryAccessibleInterface(targetObject);
- return *target ? 0 : -1;
+ if (isAncestor(widget(), fw) || fw == widget())
+ return QAccessible::queryAccessibleInterface(fw);
+ return 0;
}
/*! \reimp */
@@ -609,7 +546,7 @@ QAccessible::State QAccessibleWidget::state() const
QWidget *w = widget();
if (w->testAttribute(Qt::WA_WState_Visible) == false)
state.invisible = true;
- if (w->focusPolicy() != Qt::NoFocus && w->isActiveWindow())
+ if (w->focusPolicy() != Qt::NoFocus)
state.focusable = true;
if (w->hasFocus())
state.focused = true;
diff --git a/src/widgets/accessible/qaccessiblewidget.h b/src/widgets/accessible/qaccessiblewidget.h
index f96d298f90..4b480ca0ee 100644
--- a/src/widgets/accessible/qaccessiblewidget.h
+++ b/src/widgets/accessible/qaccessiblewidget.h
@@ -61,13 +61,13 @@ public:
QWindow *window() const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
- QAccessible::Relation relationTo(const QAccessibleInterface *other) const;
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > relations(QAccessible::Relation match = QAccessible::AllRelations) const;
+ QAccessibleInterface *focusChild() const;
QRect rect() const;
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
QString text(QAccessible::Text t) const;
QAccessible::Role role() const;
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index e592f14704..263d3a623c 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -1060,7 +1060,7 @@ QColorShower::QColorShower(QColorDialog *parent)
gl->setMargin(gl->spacing());
lab = new QColorShowLabel(this);
-#ifndef Q_WS_WINCE
+#ifndef Q_OS_WINCE
#ifdef QT_SMALL_COLORDIALOG
lab->setMinimumHeight(60);
#endif
@@ -1440,7 +1440,7 @@ void QColorDialogPrivate::init(const QColor &initial)
q->setSizeGripEnabled(false);
q->setWindowTitle(QColorDialog::tr("Select Color"));
- nativeDialogInUse = false;
+ nativeDialogInUse = (platformColorDialogHelper() != 0);
nextCust = 0;
QVBoxLayout *mainLay = new QVBoxLayout(q);
@@ -1452,7 +1452,7 @@ void QColorDialogPrivate::init(const QColor &initial)
leftLay = 0;
-#if defined(Q_WS_WINCE) || defined(QT_SMALL_COLORDIALOG)
+#if defined(Q_OS_WINCE) || defined(QT_SMALL_COLORDIALOG)
smallDisplay = true;
const int lumSpace = 20;
#else
@@ -1477,7 +1477,7 @@ void QColorDialogPrivate::init(const QColor &initial)
leftLay->addWidget(lblBasicColors);
leftLay->addWidget(standard);
-#if !defined(Q_WS_WINCE)
+#if !defined(Q_OS_WINCE)
leftLay->addStretch();
#endif
@@ -1697,10 +1697,6 @@ void QColorDialog::setCurrentColor(const QColor &color)
d->selectColor(color);
d->setCurrentAlpha(color.alpha());
-#ifdef Q_WS_MAC
- d->setCurrentQColor(color);
- d->setCocoaPanelColor(color);
-#endif
// ### fixme: Call helper
if (d->nativeDialogInUse)
d->platformColorDialogHelper()->setCurrentColor_sys(color);
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index f462a362ca..49b4dd3a23 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -52,6 +52,7 @@
#include "qwhatsthis.h"
#include "qmenu.h"
#include "qcursor.h"
+#include "qplatformtheme_qpa.h"
#include "private/qdialog_p.h"
#include "private/qguiapplication_p.h"
#ifndef QT_NO_ACCESSIBILITY
@@ -404,8 +405,8 @@ void QDialogPrivate::resetModalitySetByOpen()
resetModalityTo = -1;
}
-#if defined(Q_WS_WINCE)
-#ifdef Q_WS_WINCE_WM
+#if defined(Q_OS_WINCE)
+#ifdef Q_OS_WINCE_WM
void QDialogPrivate::_q_doneAction()
{
//Done...
@@ -419,7 +420,7 @@ void QDialogPrivate::_q_doneAction()
bool QDialog::event(QEvent *e)
{
bool result = QWidget::event(e);
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (e->type() == QEvent::OkRequest) {
accept();
result = true;
@@ -430,7 +431,11 @@ bool QDialog::event(QEvent *e)
#endif
/*!
- Returns the modal dialog's result code, \c Accepted or \c Rejected.
+ In general returns the modal dialog's result code, \c Accepted or
+ \c Rejected.
+
+ \note When called on a QMessageBox instance, the returned value is a
+ value of the \l QMessageBox::StandardButton enum.
Do not call this function if the dialog was constructed with the
Qt::WA_DeleteOnClose attribute.
diff --git a/src/widgets/dialogs/qdialog.h b/src/widgets/dialogs/qdialog.h
index 40bfbb63ee..7d3052a782 100644
--- a/src/widgets/dialogs/qdialog.h
+++ b/src/widgets/dialogs/qdialog.h
@@ -102,7 +102,7 @@ public Q_SLOTS:
protected:
QDialog(QDialogPrivate &, QWidget *parent, Qt::WindowFlags f = 0);
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
bool event(QEvent *e);
#endif
void keyPressEvent(QKeyEvent *);
@@ -119,7 +119,7 @@ private:
Q_DISABLE_COPY(QDialog)
Q_PRIVATE_SLOT(d_func(), void _q_platformRunNativeAppModalPanel())
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
Q_PRIVATE_SLOT(d_func(), void _q_doneAction())
#endif
};
diff --git a/src/widgets/dialogs/qdialog_p.h b/src/widgets/dialogs/qdialog_p.h
index ca99600489..c40a885f86 100644
--- a/src/widgets/dialogs/qdialog_p.h
+++ b/src/widgets/dialogs/qdialog_p.h
@@ -101,7 +101,7 @@ public:
void hideDefault();
void resetModalitySetByOpen();
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
void _q_doneAction();
#endif
diff --git a/src/widgets/dialogs/qerrormessage.cpp b/src/widgets/dialogs/qerrormessage.cpp
index 4993a6d80f..094c35b107 100644
--- a/src/widgets/dialogs/qerrormessage.cpp
+++ b/src/widgets/dialogs/qerrormessage.cpp
@@ -61,11 +61,9 @@
#include <stdio.h>
#include <stdlib.h>
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
extern bool qt_wince_is_mobile(); //defined in qguifunctions_wince.cpp
extern bool qt_wince_is_high_dpi(); //defined in qguifunctions_wince.cpp
-
-#include "qguifunctions_wince.h"
#endif
#if defined(QT_SOFTKEYS_ENABLED)
@@ -107,7 +105,7 @@ public:
QSize QErrorMessageTextView::minimumSizeHint() const
{
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile())
if (qt_wince_is_high_dpi())
return QSize(200, 200);
@@ -122,7 +120,7 @@ QSize QErrorMessageTextView::minimumSizeHint() const
QSize QErrorMessageTextView::sizeHint() const
{
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile())
if (qt_wince_is_high_dpi())
return QSize(400, 200);
@@ -132,7 +130,7 @@ QSize QErrorMessageTextView::sizeHint() const
return QSize(300, 100);
#else
return QSize(250, 75);
-#endif //Q_WS_WINCE
+#endif //Q_OS_WINCE
}
/*!
@@ -255,7 +253,7 @@ QErrorMessage::QErrorMessage(QWidget * parent)
#endif
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
d->ok->setFixedSize(0,0);
#endif
connect(d->ok, SIGNAL(clicked()), this, SLOT(accept()));
diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp
index db13cfea0f..84fdef6702 100644
--- a/src/widgets/dialogs/qfiledialog.cpp
+++ b/src/widgets/dialogs/qfiledialog.cpp
@@ -59,7 +59,7 @@
#include <qdebug.h>
#include <qapplication.h>
#include <qstylepainter.h>
-#if !defined(Q_WS_WINCE)
+#if !defined(Q_OS_WINCE)
#include "ui_qfiledialog.h"
#else
#define Q_EMBEDDED_SMALLSCREEN
@@ -482,9 +482,20 @@ bool QFileDialog::restoreState(const QByteArray &state)
history.pop_front();
setHistory(history);
setDirectory(lastVisitedDir()->isEmpty() ? currentDirectory : *lastVisitedDir());
- if (!d->qFileDialogUi->treeView->header()->restoreState(headerData))
+ QHeaderView *headerView = d->qFileDialogUi->treeView->header();
+ if (!headerView->restoreState(headerData))
return false;
+ QList<QAction*> actions = headerView->actions();
+ QAbstractItemModel *abstractModel = d->model;
+#ifndef QT_NO_PROXYMODEL
+ if (d->proxyModel)
+ abstractModel = d->proxyModel;
+#endif
+ int total = qMin(abstractModel->columnCount(QModelIndex()), actions.count() + 1);
+ for (int i = 1; i < total; ++i)
+ actions.at(i - 1)->setChecked(!headerView->isSectionHidden(i));
+
setViewMode(ViewMode(viewMode));
return true;
}
@@ -2002,7 +2013,7 @@ QString QFileDialog::getExistingDirectory(QWidget *parent,
#if defined(Q_WS_WIN)
if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog) && (options & ShowDirsOnly)
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
&& qt_priv_ptr_valid
#endif
) {
diff --git a/src/widgets/dialogs/qfileinfogatherer_p.h b/src/widgets/dialogs/qfileinfogatherer_p.h
index 3e5d1be384..c07c908a55 100644
--- a/src/widgets/dialogs/qfileinfogatherer_p.h
+++ b/src/widgets/dialogs/qfileinfogatherer_p.h
@@ -58,13 +58,14 @@
#include <qwaitcondition.h>
#include <qfilesystemwatcher.h>
#include <qfileiconprovider.h>
-#include <qfsfileengine.h>
#include <qpair.h>
#include <qstack.h>
#include <qdatetime.h>
#include <qdir.h>
#include <qelapsedtimer.h>
+#include <private/qfilesystemengine_p.h>
+
QT_BEGIN_NAMESPACE
class QExtendedInformation {
@@ -86,8 +87,7 @@ public:
#ifndef QT_NO_FSFILEENGINE
bool isCaseSensitive() const {
- QFSFileEngine fe(mFileInfo.absoluteFilePath());
- return fe.caseSensitive();
+ return QFileSystemEngine::isCaseSensitive();
}
#endif
diff --git a/src/widgets/dialogs/qfontdialog.cpp b/src/widgets/dialogs/qfontdialog.cpp
index 2402f2a955..7e71cd7cd4 100644
--- a/src/widgets/dialogs/qfontdialog.cpp
+++ b/src/widgets/dialogs/qfontdialog.cpp
@@ -316,11 +316,11 @@ void QFontDialogPrivate::init()
buttonBox->addButton(QDialogButtonBox::Cancel);
QObject::connect(buttonBox, SIGNAL(rejected()), q, SLOT(reject()));
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
q->resize(180, 120);
#else
q->resize(500, 360);
-#endif // Q_WS_WINCE
+#endif // Q_OS_WINCE
sizeEdit->installEventFilter(q);
familyList->installEventFilter(q);
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index 0f57fa67e1..634e911cd1 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -189,7 +189,7 @@ public:
int layoutMinimumWidth();
void retranslateStrings();
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void hideSpecial();
#endif
@@ -307,7 +307,7 @@ void QMessageBoxPrivate::updateSize()
return;
QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size();
-#if defined(Q_WS_QWS) || defined(Q_WS_WINCE)
+#if defined(Q_WS_QWS) || defined(Q_OS_WINCE)
// the width of the screen, less the window border.
int hardLimit = screenSize.width() - (q->frameGeometry().width() - q->geometry().width());
#else
@@ -322,11 +322,11 @@ void QMessageBoxPrivate::updateSize()
int softLimit = qMin(hardLimit, 500);
#else
// note: ideally on windows, hard and soft limits but it breaks compat
-#ifndef Q_WS_WINCE
+#ifndef Q_OS_WINCE
int softLimit = qMin(screenSize.width()/2, 500);
#else
int softLimit = qMin(screenSize.width() * 3 / 4, 500);
-#endif //Q_WS_WINCE
+#endif //Q_OS_WINCE
#endif
if (informativeLabel)
@@ -384,7 +384,7 @@ void QMessageBoxPrivate::updateSize()
}
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
/*!
\internal
Hides special buttons which are rather shown in the title bar
@@ -1239,7 +1239,7 @@ bool QMessageBox::event(QEvent *e)
case QEvent::LanguageChange:
d_func()->retranslateStrings();
break;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
case QEvent::OkRequest:
case QEvent::HelpRequest: {
QString bName =
@@ -1382,7 +1382,7 @@ void QMessageBox::keyPressEvent(QKeyEvent *e)
QDialog::keyPressEvent(e);
}
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
/*!
\reimp
*/
@@ -1453,7 +1453,7 @@ void QMessageBox::showEvent(QShowEvent *e)
Q_D(QMessageBox);
if (d->autoAddOkButton) {
addButton(Ok);
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
d->hideSpecial();
#endif
}
@@ -1773,7 +1773,7 @@ void QMessageBox::aboutQt(QWidget *parent, const QString &title)
QPixmap pm(QLatin1String(":/trolltech/qmessagebox/images/qtlogo-64.png"));
if (!pm.isNull())
msgBox->setIconPixmap(pm);
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
msgBox->setDefaultButton(msgBox->addButton(QMessageBox::Ok));
#endif
@@ -2597,6 +2597,9 @@ QPixmap QMessageBox::standardIcon(Icon icon)
When using QMessageBox with custom buttons, this function returns an
opaque value; use clickedButton() to determine which button was clicked.
+ \note The result() function returns also \l StandardButton value instead
+ of \l QDialog::DialogCode.
+
Users cannot interact with any other window in the same
application until they close the dialog, either by clicking a
button or by using a mechanism provided by the window system.
diff --git a/src/widgets/dialogs/qmessagebox.h b/src/widgets/dialogs/qmessagebox.h
index b42681a565..37dfd96514 100644
--- a/src/widgets/dialogs/qmessagebox.h
+++ b/src/widgets/dialogs/qmessagebox.h
@@ -143,7 +143,7 @@ public:
QPushButton *addButton(StandardButton button);
void removeButton(QAbstractButton *button);
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void setVisible(bool visible);
#endif
diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp
index 629b6828b7..324831ea52 100644
--- a/src/widgets/dialogs/qwizard.cpp
+++ b/src/widgets/dialogs/qwizard.cpp
@@ -69,7 +69,7 @@
#include "private/qdialog_p.h"
#include <qdebug.h>
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
extern bool qt_wince_is_mobile(); //defined in qguifunctions_wce.cpp
#endif
@@ -2178,7 +2178,7 @@ QWizard::QWizard(QWidget *parent, Qt::WindowFlags flags)
{
Q_D(QWizard);
d->init();
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (!qt_wince_is_mobile())
setWindowFlags(windowFlags() & ~Qt::WindowOkButtonHint);
#endif
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index ba3b4962e7..ab03ff7a9e 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -11064,9 +11064,9 @@ QGraphicsItemGroup::~QGraphicsItemGroup()
}
/*!
- Adds the given \a item to this item group. The item will be
- reparented to this group, but its position and transformation
- relative to the scene will stay intact.
+ Adds the given \a item and item's child items to this item group.
+ The item and child items will be reparented to this group, but its
+ position and transformation relative to the scene will stay intact.
\sa removeFromGroup(), QGraphicsScene::createItemGroup()
*/
diff --git a/src/widgets/graphicsview/qgraphicslayout.cpp b/src/widgets/graphicsview/qgraphicslayout.cpp
index cec5ba57a3..63f04f67bc 100644
--- a/src/widgets/graphicsview/qgraphicslayout.cpp
+++ b/src/widgets/graphicsview/qgraphicslayout.cpp
@@ -103,6 +103,10 @@ QT_BEGIN_NAMESPACE
any way, but for a linear layout, the order is essential. When writing your own
layout subclass, you are free to choose the API that best suits your layout.
+ QGraphicsLayout provides the addChildLayoutItem() convenience function to add
+ layout items to a custom layout. The function will automatically reparent
+ graphics items, if required.
+
\section1 Activating the Layout
When the layout's geometry changes, QGraphicsLayout immediately rearranges
diff --git a/src/widgets/itemviews/qfileiconprovider.cpp b/src/widgets/itemviews/qfileiconprovider.cpp
index dd52aebea5..b6669c0784 100644
--- a/src/widgets/itemviews/qfileiconprovider.cpp
+++ b/src/widgets/itemviews/qfileiconprovider.cpp
@@ -47,7 +47,6 @@
#include <qdir.h>
#include <qpixmapcache.h>
#include <private/qfunctions_p.h>
-#include <private/qguiplatformplugin_p.h>
#if defined(Q_OS_WIN)
# define _WIN32_IE 0x0500
@@ -288,11 +287,7 @@ QIcon QFileIconProviderPrivate::getWinIcon(const QFileInfo &fileInfo) const
}
}
if (pixmap.isNull()) {
-#ifndef Q_OS_WINCE
pixmap = qt_pixmapFromWinHICON(info.hIcon);
-#else
- pixmap = QPixmap::fromWinHICON(ImageList_GetIcon((HIMAGELIST) val, info.iIcon, ILD_NORMAL));
-#endif
if (!pixmap.isNull()) {
retIcon.addPixmap(pixmap);
if (!key.isEmpty())
@@ -318,11 +313,7 @@ QIcon QFileIconProviderPrivate::getWinIcon(const QFileInfo &fileInfo) const
//using the unique icon index provided by windows save us from duplicate keys
key = QString::fromLatin1("qt_dir_%1").arg(info.iIcon);
}
-#ifndef Q_OS_WINCE
pixmap = qt_pixmapFromWinHICON(info.hIcon);
-#else
- pixmap = QPixmap::fromWinHICON(ImageList_GetIcon((HIMAGELIST) val, info.iIcon, ILD_NORMAL));
-#endif
if (!pixmap.isNull()) {
retIcon.addPixmap(pixmap);
if (!key.isEmpty())
@@ -407,10 +398,6 @@ QIcon QFileIconProvider::icon(const QFileInfo &info) const
{
Q_D(const QFileIconProvider);
- QIcon platformIcon = qt_guiPlatformPlugin()->fileSystemIcon(info);
- if (!platformIcon.isNull())
- return platformIcon;
-
#if defined(Q_WS_X11) && !defined(QT_NO_STYLE_GTK)
if (X11->desktopEnvironment == DE_GNOME) {
QIcon gtkIcon = QGtkStylePrivate::getFilesystemIcon(info);
@@ -429,7 +416,7 @@ QIcon QFileIconProvider::icon(const QFileInfo &info) const
return icon;
#endif
if (info.isRoot())
-#if defined (Q_OS_WIN) && !defined(Q_WS_WINCE)
+#if defined (Q_OS_WIN) && !defined(Q_OS_WINCE)
{
UINT type = GetDriveType((wchar_t *)info.absoluteFilePath().utf16());
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
index 33c8da4f69..299dcb3dd4 100644
--- a/src/widgets/itemviews/qheaderview.cpp
+++ b/src/widgets/itemviews/qheaderview.cpp
@@ -1660,31 +1660,22 @@ void QHeaderView::sectionsInserted(const QModelIndex &parent,
d->invalidateCachedSizeHint();
// add the new sections
- int insertAt = 0;
- for (int spanStart = 0; insertAt < d->sectionSpans.count() && spanStart < logicalFirst; ++insertAt)
- spanStart += d->sectionSpans.at(insertAt).count;
+ int insertAt = logicalFirst;
int insertCount = logicalLast - logicalFirst + 1;
d->sectionCount += insertCount;
+ QHeaderViewPrivate::SectionSpan span(d->defaultSectionSize, d->globalResizeMode);
+ d->sectionStartposRecalc = true;
if (d->sectionSpans.isEmpty() || insertAt >= d->sectionSpans.count()) {
int insertLength = d->defaultSectionSize * insertCount;
d->length += insertLength;
- QHeaderViewPrivate::SectionSpan span(insertLength, insertCount, d->globalResizeMode);
- d->sectionSpans.append(span);
- } else if ((d->sectionSpans.at(insertAt).sectionSize() == d->defaultSectionSize)
- && d->sectionSpans.at(insertAt).resizeMode == d->globalResizeMode) {
- // add the new sections to an existing span
- int insertLength = d->sectionSpans.at(insertAt).sectionSize() * insertCount;
- d->length += insertLength;
- d->sectionSpans[insertAt].size += insertLength;
- d->sectionSpans[insertAt].count += insertCount;
+ d->sectionSpans.insert(d->sectionSpans.count(), insertCount, span); // append
} else {
- // separate them out into their own span
+ // separate them out into their own spans
int insertLength = d->defaultSectionSize * insertCount;
d->length += insertLength;
- QHeaderViewPrivate::SectionSpan span(insertLength, insertCount, d->globalResizeMode);
- d->sectionSpans.insert(insertAt, span);
+ d->sectionSpans.insert(insertAt, insertCount, span);
}
// update sorting column
@@ -3112,177 +3103,27 @@ void QHeaderViewPrivate::resizeSections(QHeaderView::ResizeMode globalMode, bool
void QHeaderViewPrivate::createSectionSpan(int start, int end, int size, QHeaderView::ResizeMode mode)
{
- // ### the code for merging spans does not merge at all opertuneties
- // ### what if the number of sections is reduced ?
-
- SectionSpan span(size, (end - start) + 1, mode);
- int start_section = 0;
-#if !defined(QT_NO_DEBUG) || defined(QT_FORCE_ASSERTS)
- int initial_section_count = headerSectionCount(); // ### debug code
-#endif
-
- QList<int> spansToRemove;
- for (int i = 0; i < sectionSpans.count(); ++i) {
- int end_section = start_section + sectionSpans.at(i).count - 1;
- int section_count = sectionSpans.at(i).count;
- if (start <= start_section && end > end_section) {
- // the existing span is entirely coveded by the new span
- spansToRemove.append(i);
- } else if (start < start_section && end >= end_section) {
- // the existing span is entirely coveded by the new span
- spansToRemove.append(i);
- } else if (start == start_section && end == end_section) {
- // the new span is covered by an existin span
- length -= sectionSpans.at(i).size;
- length += size;
- sectionSpans[i].size = size;
- sectionSpans[i].resizeMode = mode;
- // ### check if we can merge the section with any of its neighbours
- removeSpans(spansToRemove);
- Q_ASSERT(initial_section_count == headerSectionCount());
- return;
- } else if (start > start_section && end < end_section) {
- if (sectionSpans.at(i).sectionSize() == span.sectionSize()
- && sectionSpans.at(i).resizeMode == span.resizeMode) {
- Q_ASSERT(initial_section_count == headerSectionCount());
- return;
- }
- // the new span is in the middle of the old span, so we have to split it
- length -= sectionSpans.at(i).size;
- int section_size = sectionSpans.at(i).sectionSize();
-#if !defined(QT_NO_DEBUG) || defined(QT_FORCE_ASSERTS)
- const int span_count = sectionSpans.at(i).count;
-#endif
- QHeaderView::ResizeMode span_mode = sectionSpans.at(i).resizeMode;
- // first span
- int first_span_count = start - start_section;
- int first_span_size = section_size * first_span_count;
- sectionSpans[i].count = first_span_count;
- sectionSpans[i].size = first_span_size;
- sectionSpans[i].resizeMode = span_mode;
- length += first_span_size;
- // middle span (the new span)
-#if !defined(QT_NO_DEBUG) || defined(QT_FORCE_ASSERTS)
- const int mid_span_count = span.count;
-#endif
- int mid_span_size = span.size;
- sectionSpans.insert(i + 1, span);
- length += mid_span_size;
- // last span
- int last_span_count = end_section - end;
- int last_span_size = section_size * last_span_count;
- sectionSpans.insert(i + 2, SectionSpan(last_span_size, last_span_count, span_mode));
- length += last_span_size;
- Q_ASSERT(span_count == first_span_count + mid_span_count + last_span_count);
- removeSpans(spansToRemove);
- Q_ASSERT(initial_section_count == headerSectionCount());
- return;
- } else if (start > start_section && start <= end_section && end >= end_section) {
- // the new span covers the last part of the existing span
- length -= sectionSpans.at(i).size;
- int removed_count = (end_section - start + 1);
- int span_count = sectionSpans.at(i).count - removed_count;
- int section_size = sectionSpans.at(i).sectionSize();
- int span_size = section_size * span_count;
- sectionSpans[i].count = span_count;
- sectionSpans[i].size = span_size;
- length += span_size;
- if (end == end_section) {
- sectionSpans.insert(i + 1, span); // insert after
- length += span.size;
- removeSpans(spansToRemove);
- Q_ASSERT(initial_section_count == headerSectionCount());
- return;
- }
- } else if (end < end_section && end >= start_section && start <= start_section) {
- // the new span covers the first part of the existing span
- length -= sectionSpans.at(i).size;
- int removed_count = (end - start_section + 1);
- int section_size = sectionSpans.at(i).sectionSize();
- int span_count = sectionSpans.at(i).count - removed_count;
- int span_size = section_size * span_count;
- sectionSpans[i].count = span_count;
- sectionSpans[i].size = span_size;
- length += span_size;
- sectionSpans.insert(i, span); // insert before
- length += span.size;
- removeSpans(spansToRemove);
- Q_ASSERT(initial_section_count == headerSectionCount());
- return;
- }
- start_section += section_count;
- }
-
- // ### adding and removing _ sections_ in addition to spans
- // ### add some more checks here
-
- if (spansToRemove.isEmpty()) {
- if (!sectionSpans.isEmpty()
- && sectionSpans.last().sectionSize() == span.sectionSize()
- && sectionSpans.last().resizeMode == span.resizeMode) {
- length += span.size;
- int last = sectionSpans.count() - 1;
- sectionSpans[last].count += span.count;
- sectionSpans[last].size += span.size;
- sectionSpans[last].resizeMode = span.resizeMode;
- } else {
- length += span.size;
- sectionSpans.append(span);
- }
- } else {
- removeSpans(spansToRemove);
- length += span.size;
- sectionSpans.insert(spansToRemove.first(), span);
- //Q_ASSERT(initial_section_count == headerSectionCount());
+ int sizePerSection = size / (end - start + 1);
+ if (end >= sectionSpans.count())
+ sectionSpans.resize(end + 1);
+ SectionSpan *sectiondata = sectionSpans.data();
+ for (int i = start; i <= end; ++i) {
+ length += (sizePerSection - sectiondata[i].size);
+ sectionStartposRecalc |= (sectiondata[i].size != sizePerSection);
+ sectiondata[i].size = sizePerSection;
+ sectiondata[i].resizeMode = mode;
}
}
void QHeaderViewPrivate::removeSectionsFromSpans(int start, int end)
{
// remove sections
- int start_section = 0;
- QList<int> spansToRemove;
- for (int i = 0; i < sectionSpans.count(); ++i) {
- int end_section = start_section + sectionSpans.at(i).count - 1;
- int section_size = sectionSpans.at(i).sectionSize();
- int section_count = sectionSpans.at(i).count;
- if (start <= start_section && end >= end_section) {
- // the change covers the entire span
- spansToRemove.append(i);
- if (end == end_section)
- break;
- } else if (start > start_section && end < end_section) {
- // all the removed sections are inside the span
- int change = (end - start + 1);
- sectionSpans[i].count -= change;
- sectionSpans[i].size = section_size * sectionSpans.at(i).count;
- length -= (change * section_size);
- break;
- } else if (start >= start_section && start <= end_section) {
- // the some of the removed sections are inside the span,at the end
- int change = qMin(end_section - start + 1, end - start + 1);
- sectionSpans[i].count -= change;
- sectionSpans[i].size = section_size * sectionSpans.at(i).count;
- start += change;
- length -= (change * section_size);
- // the change affects several spans
- } else if (end >= start_section && end <= end_section) {
- // the some of the removed sections are inside the span, at the beginning
- int change = qMin((end - start_section + 1), end - start + 1);
- sectionSpans[i].count -= change;
- sectionSpans[i].size = section_size * sectionSpans.at(i).count;
- length -= (change * section_size);
- break;
- }
- start_section += section_count;
- }
-
- for (int i = spansToRemove.count() - 1; i >= 0; --i) {
- int s = spansToRemove.at(i);
- length -= sectionSpans.at(s).size;
- sectionSpans.remove(s);
- // ### merge remaining spans
- }
+ sectionStartposRecalc |= (end != sectionSpans.count() - 1);
+ int removedlength = 0;
+ for (int u = start; u <= end; ++u)
+ removedlength += sectionSpans.at(u).size;
+ length -= removedlength;
+ sectionSpans.remove(start, end - start + 1);
}
void QHeaderViewPrivate::clear()
@@ -3427,25 +3268,31 @@ void QHeaderViewPrivate::setDefaultSectionSize(int size)
{
Q_Q(QHeaderView);
defaultSectionSize = size;
- int currentVisualIndex = 0;
for (int i = 0; i < sectionSpans.count(); ++i) {
QHeaderViewPrivate::SectionSpan &span = sectionSpans[i];
if (span.size > 0) {
//we resize it if it is not hidden (ie size > 0)
- const int newSize = span.count * size;
+ const int newSize = size;
if (newSize != span.size) {
length += newSize - span.size; //the whole length is changed
const int oldSectionSize = span.sectionSize();
- span.size = span.count * size;
- for (int i = currentVisualIndex; i < currentVisualIndex + span.count; ++i) {
- emit q->sectionResized(logicalIndex(i), oldSectionSize, size);
- }
+ span.size = size;
+ emit q->sectionResized(logicalIndex(i), oldSectionSize, size);
}
}
- currentVisualIndex += span.count;
}
}
+void QHeaderViewPrivate::recalcSectionStartPos() const // linear (but fast)
+{
+ int pixelpos = 0;
+ for (QVector<SectionSpan>::const_iterator i = sectionSpans.constBegin(); i != sectionSpans.constEnd(); ++i) {
+ i->calculated_startpos = pixelpos; // write into const mutable
+ pixelpos += i->size;
+ }
+ sectionStartposRecalc = false;
+}
+
void QHeaderViewPrivate::resizeSectionSpan(int visualIndex, int oldSize, int newSize)
{
Q_Q(QHeaderView);
@@ -3456,54 +3303,37 @@ void QHeaderViewPrivate::resizeSectionSpan(int visualIndex, int oldSize, int new
int QHeaderViewPrivate::headerSectionSize(int visual) const
{
- // ### stupid iteration
- int section_start = 0;
- const int sectionSpansCount = sectionSpans.count();
- for (int i = 0; i < sectionSpansCount; ++i) {
- const QHeaderViewPrivate::SectionSpan &currentSection = sectionSpans.at(i);
- int section_end = section_start + currentSection.count - 1;
- if (visual >= section_start && visual <= section_end)
- return currentSection.sectionSize();
- section_start = section_end + 1;
- }
+ if (visual < sectionCount && visual >= 0)
+ return sectionSpans.at(visual).sectionSize();
return -1;
}
int QHeaderViewPrivate::headerSectionPosition(int visual) const
{
- // ### stupid iteration
- int section_start = 0;
- int span_position = 0;
- const int sectionSpansCount = sectionSpans.count();
- for (int i = 0; i < sectionSpansCount; ++i) {
- const QHeaderViewPrivate::SectionSpan &currentSection = sectionSpans.at(i);
- int section_end = section_start + currentSection.count - 1;
- if (visual >= section_start && visual <= section_end)
- return span_position + (visual - section_start) * currentSection.sectionSize();
- section_start = section_end + 1;
- span_position += currentSection.size;
+ if (visual < sectionCount && visual >= 0) {
+ if (sectionStartposRecalc)
+ recalcSectionStartPos();
+ return sectionSpans.at(visual).calculated_startpos;
}
return -1;
}
int QHeaderViewPrivate::headerVisualIndexAt(int position) const
{
- // ### stupid iteration
- int span_start_section = 0;
- int span_position = 0;
- const int sectionSpansCount = sectionSpans.count();
- for (int i = 0; i < sectionSpansCount; ++i) {
- const QHeaderViewPrivate::SectionSpan &currentSection = sectionSpans.at(i);
- int next_span_start_section = span_start_section + currentSection.count;
- int next_span_position = span_position + currentSection.size;
- if (position == span_position)
- return span_start_section; // spans with no size
- if (position > span_position && position < next_span_position) {
- int position_in_span = position - span_position;
- return span_start_section + (position_in_span / currentSection.sectionSize());
+ if (sectionStartposRecalc)
+ recalcSectionStartPos();
+ int startidx = 0;
+ int endidx = sectionSpans.count() - 1;
+ while (startidx <= endidx) {
+ int middle = (endidx + startidx) / 2;
+ if (sectionSpans.at(middle).calculated_startpos > position) {
+ endidx = middle - 1;
+ } else {
+ if (sectionSpans.at(middle).calculatedEndPos() <= position)
+ startidx = middle + 1;
+ else // we found it.
+ return middle;
}
- span_start_section = next_span_start_section;
- span_position = next_span_position;
}
return -1;
}
@@ -3546,9 +3376,9 @@ int QHeaderViewPrivate::adjustedVisualIndex(int visualIndex) const
int currentVisualIndex = 0;
for (int i = 0; i < sectionSpans.count(); ++i) {
if (sectionSpans.at(i).size == 0)
- adjustedVisualIndex += sectionSpans.at(i).count;
+ ++adjustedVisualIndex;
else
- currentVisualIndex += sectionSpans.at(i).count;
+ ++currentVisualIndex;
if (currentVisualIndex >= visualIndex)
break;
}
@@ -3626,7 +3456,15 @@ bool QHeaderViewPrivate::read(QDataStream &in)
globalResizeMode = (QHeaderView::ResizeMode)global;
in >> sectionSpans;
-
+ // Spans in Qt5 only contains one element - but for backward compability with Qt4 we do the following
+ QVector<SectionSpan> newSectionSpans;
+ for (int u = 0; u < sectionSpans.count(); ++u) {
+ int count = sectionSpans.at(u).tmpDataStreamSectionCount;
+ for (int n = 0; n < count; ++n)
+ newSectionSpans.append(sectionSpans[u]);
+ }
+ sectionSpans = newSectionSpans;
+ recalcSectionStartPos();
return true;
}
diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h
index e26c4a6475..9d7d97f582 100644
--- a/src/widgets/itemviews/qheaderview_p.h
+++ b/src/widgets/itemviews/qheaderview_p.h
@@ -97,7 +97,8 @@ public:
lastSectionSize(0),
sectionIndicatorOffset(0),
sectionIndicator(0),
- globalResizeMode(QHeaderView::Interactive)
+ globalResizeMode(QHeaderView::Interactive),
+ sectionStartposRecalc(true)
{}
@@ -281,22 +282,24 @@ public:
QLabel *sectionIndicator;
QHeaderView::ResizeMode globalResizeMode;
QList<QPersistentModelIndex> persistentHiddenSections;
-
+ mutable bool sectionStartposRecalc;
// header section spans
struct SectionSpan {
int size;
- int count;
+ mutable int calculated_startpos;
QHeaderView::ResizeMode resizeMode;
- inline SectionSpan() : size(0), count(0), resizeMode(QHeaderView::Interactive) {}
- inline SectionSpan(int length, int sections, QHeaderView::ResizeMode mode)
- : size(length), count(sections), resizeMode(mode) {}
- inline int sectionSize() const { return (count > 0 ? size / count : 0); }
+ inline SectionSpan() : size(0), resizeMode(QHeaderView::Interactive) {}
+ inline SectionSpan(int length, QHeaderView::ResizeMode mode)
+ : size(length), calculated_startpos(-1), resizeMode(mode) {}
+ inline int sectionSize() const { return size; }
+ inline int calculatedEndPos() const { return calculated_startpos + size; }
#ifndef QT_NO_DATASTREAM
+ int tmpDataStreamSectionCount;
inline void write(QDataStream &out) const
- { out << size; out << count; out << (int)resizeMode; }
+ { out << size; out << 1; out << (int)resizeMode; }
inline void read(QDataStream &in)
- { in >> size; in >> count; int m; in >> m; resizeMode = (QHeaderView::ResizeMode)m; }
+ { in >> size; in >> tmpDataStreamSectionCount; int m; in >> m; resizeMode = (QHeaderView::ResizeMode)m; }
#endif
};
@@ -306,12 +309,10 @@ public:
void removeSectionsFromSpans(int start, int end);
void resizeSectionSpan(int visualIndex, int oldSize, int newSize);
void setDefaultSectionSize(int size);
+ void recalcSectionStartPos() const; // not really const
inline int headerSectionCount() const { // for debugging
- int count = 0;
- for (int i = 0; i < sectionSpans.count(); ++i)
- count += sectionSpans.at(i).count;
- return count;
+ return sectionSpans.count();
}
inline int headerLength() const { // for debugging
@@ -329,12 +330,8 @@ public:
}
inline int sectionSpanIndex(int visual) const {
- int section_start = 0;
- for (int i = 0; i < sectionSpans.count(); ++i) {
- int section_end = section_start + sectionSpans.at(i).count - 1;
- if (visual >= section_start && visual <= section_end)
- return i;
- section_start = section_end + 1;
+ if (visual < sectionSpans.count() && visual >= 0) {
+ return visual;
}
return -1;
}
diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp
index c8a7c664b0..97fbea6c3d 100644
--- a/src/widgets/itemviews/qlistwidget.cpp
+++ b/src/widgets/itemviews/qlistwidget.cpp
@@ -1167,10 +1167,10 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft,
\snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 1
- If you need to insert a new item into the list at a particular position, it
- is more required to construct the item without a parent widget and use the
- insertItem() function to place it within the list. The list widget will
- take ownership of the item.
+ If you need to insert a new item into the list at a particular position,
+ then it should be constructed without a parent widget. The insertItem()
+ function should then be used to place it within the list. The list widget
+ will take ownership of the item.
\snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 6
\snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 7
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index 179b122805..7f5e5964ab 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -83,7 +83,7 @@ QT_BEGIN_NAMESPACE
It is simple to construct a tree view displaying data from a
model. In the following example, the contents of a directory are
- supplied by a QDirModel and displayed as a tree:
+ supplied by a QFileSystemModel and displayed as a tree:
\snippet doc/src/snippets/shareddirmodel/main.cpp 3
\snippet doc/src/snippets/shareddirmodel/main.cpp 6
diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri
index 32934dc705..97430babd3 100644
--- a/src/widgets/kernel/kernel.pri
+++ b/src/widgets/kernel/kernel.pri
@@ -40,7 +40,6 @@ HEADERS += \
kernel/qgesturemanager_p.h \
kernel/qsoftkeymanager_p.h \
kernel/qsoftkeymanager_common_p.h \
- kernel/qguiplatformplugin_p.h \
kernel/qdesktopwidget_qpa_p.h \
kernel/qwidgetwindow_qpa_p.h \
kernel/qplatformmenu_qpa.h
@@ -72,7 +71,6 @@ SOURCES += \
kernel/qgesturemanager.cpp \
kernel/qsoftkeymanager.cpp \
kernel/qdesktopwidget.cpp \
- kernel/qguiplatformplugin.cpp \
kernel/qwidgetsvariant.cpp \
kernel/qapplication_qpa.cpp \
kernel/qdesktopwidget_qpa.cpp \
@@ -137,9 +135,8 @@ false:!x11:mac {
wince*: {
HEADERS += \
../corelib/kernel/qfunctions_wince.h \
- kernel/qguifunctions_wince.h
+ kernel/qwidgetsfunctions_wince.h
SOURCES += \
- ../corelib/kernel/qfunctions_wince.cpp \
- kernel/qguifunctions_wince.cpp
+ kernel/qwidgetsfunctions_wince.cpp
}
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index ae15c9f62a..f7153a0f32 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -62,14 +62,17 @@
#include "qvariant.h"
#include "qwidget.h"
#include "private/qdnd_p.h"
+#include "private/qguiapplication_p.h"
#include "qcolormap.h"
#include "qdebug.h"
#include "private/qstylesheetstyle_p.h"
#include "private/qstyle_p.h"
#include "qmessagebox.h"
+#include "qwidgetwindow_qpa_p.h"
#include <QtWidgets/qgraphicsproxywidget.h>
#include <QtGui/qstylehints.h>
#include <QtGui/qinputmethod.h>
+#include <QtGui/qplatformtheme_qpa.h>
#include "private/qkeymapper_p.h"
@@ -77,8 +80,6 @@
#include <private/qt_x11_p.h>
#endif
-#include "qguiplatformplugin_p.h"
-
#include <qthread.h>
#include <private/qthread_p.h>
@@ -104,9 +105,8 @@
#include "qlibrary.h"
#endif
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
#include "qdatetime.h"
-#include "qguifunctions_wince.h"
extern bool qt_wince_is_smartphone(); //qguifunctions_wince.cpp
extern bool qt_wince_is_mobile(); //qguifunctions_wince.cpp
extern bool qt_wince_is_pocket_pc(); //qguifunctions_wince.cpp
@@ -122,7 +122,7 @@ extern bool qt_wince_is_pocket_pc(); //qguifunctions_wince.cpp
static void initResources()
{
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
Q_INIT_RESOURCE_EXTERN(qstyle_wince)
Q_INIT_RESOURCE(qstyle_wince);
#else
@@ -140,7 +140,7 @@ Q_CORE_EXPORT void qt_call_post_routines();
QApplicationPrivate *QApplicationPrivate::self = 0;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
int QApplicationPrivate::autoMaximizeThreshold = -1;
bool QApplicationPrivate::autoSipEnabled = false;
#else
@@ -420,7 +420,6 @@ QWidget *QApplicationPrivate::main_widget = 0; // main application widget
QWidget *QApplicationPrivate::focus_widget = 0; // has keyboard input focus
QWidget *QApplicationPrivate::hidden_focus_widget = 0; // will get keyboard input focus after show()
QWidget *QApplicationPrivate::active_window = 0; // toplevel with keyboard focus
-bool QApplicationPrivate::obey_desktop_settings = true; // use winsys resources
#ifndef QT_NO_WHEELEVENT
int QApplicationPrivate::wheel_scroll_lines; // number of lines to scroll
#endif
@@ -757,10 +756,6 @@ void QApplicationPrivate::construct(
qCritical("Library qttestability load failed!");
}
}
-
- //make sure the plugin is loaded
- if (qt_is_gui_used)
- qt_guiPlatformPlugin();
#endif
}
@@ -873,7 +868,7 @@ void QApplicationPrivate::initialize()
if (qgetenv("QT_USE_NATIVE_WINDOWS").toInt() > 0)
q->setAttribute(Qt::AA_NativeWindows);
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
#ifdef QT_AUTO_MAXIMIZE_THRESHOLD
autoMaximizeThreshold = QT_AUTO_MAXIMIZE_THRESHOLD;
#else
@@ -882,7 +877,7 @@ void QApplicationPrivate::initialize()
else
autoMaximizeThreshold = -1;
#endif //QT_AUTO_MAXIMIZE_THRESHOLD
-#endif //Q_WS_WINCE
+#endif //Q_OS_WINCE
#ifndef QT_NO_WHEELEVENT
QApplicationPrivate::wheel_scroll_lines = 3;
@@ -1202,7 +1197,7 @@ bool QApplication::compressEvent(QEvent *event, QObject *receiver, QPostEventLis
The default is platform dependent.
*/
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void QApplication::setAutoMaximizeThreshold(const int threshold)
{
QApplicationPrivate::autoMaximizeThreshold = threshold;
@@ -1299,6 +1294,9 @@ QStyle *QApplication::style()
QApplicationPrivate::app_style->setParent(qApp);
if (!QApplicationPrivate::sys_pal)
+ if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
+ QApplicationPrivate::setSystemPalette(*themePalette);
+ if (!QApplicationPrivate::sys_pal)
QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette());
if (QApplicationPrivate::set_pal) // repolish set palette with the new style
QApplication::setPalette(*QApplicationPrivate::set_pal);
@@ -1851,7 +1849,15 @@ void QApplicationPrivate::setSystemFont(const QFont &font)
*/
QString QApplicationPrivate::desktopStyleKey()
{
- return qt_guiPlatformPlugin()->styleName();
+ // The platform theme might return a style that is not available, find
+ // first valid one.
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
+ const QStringList availableKeys = QStyleFactory::keys();
+ foreach (const QString &style, theme->themeHint(QPlatformTheme::StyleNames).toStringList())
+ if (availableKeys.contains(style, Qt::CaseInsensitive))
+ return style;
+ }
+ return QString();
}
/*!
@@ -2912,33 +2918,6 @@ QDesktopWidget *QApplication::desktop()
}
/*!
- Sets whether Qt should use the system's standard colors, fonts, etc., to
- \a on. By default, this is true.
-
- This function must be called before creating the QApplication object, like
- this:
-
- \snippet doc/src/snippets/code/src_gui_kernel_qapplication.cpp 6
-
- \sa desktopSettingsAware()
-*/
-void QApplication::setDesktopSettingsAware(bool on)
-{
- QApplicationPrivate::obey_desktop_settings = on;
-}
-
-/*!
- Returns true if Qt is set to use the system's standard colors, fonts, etc.;
- otherwise returns false. The default is true.
-
- \sa setDesktopSettingsAware()
-*/
-bool QApplication::desktopSettingsAware()
-{
- return QApplicationPrivate::obey_desktop_settings;
-}
-
-/*!
Returns the current state of the modifier keys on the keyboard. The current
state is updated sychronously as the event queue is emptied of events that
will spontaneously change the keyboard state (QEvent::KeyPress and
@@ -3318,6 +3297,20 @@ int QApplication::exec()
return QGuiApplication::exec();
}
+bool QApplicationPrivate::shouldQuit()
+{
+ /* if there is no non-withdrawn primary window left (except
+ the ones without QuitOnClose), we emit the lastWindowClosed
+ signal */
+ QWidgetList list = QApplication::topLevelWidgets();
+ for (int i = 0; i < list.size(); ++i) {
+ QWidget *w = list.at(i);
+ if (w->isVisible() && !w->parentWidget() && w->testAttribute(Qt::WA_QuitOnClose))
+ return false;
+ }
+ return true;
+}
+
/*! \reimp
*/
bool QApplication::notify(QObject *receiver, QEvent *e)
@@ -3993,7 +3986,7 @@ bool QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e)
if (receiver->isWidgetType()) {
QWidget *widget = static_cast<QWidget *>(receiver);
-#if !defined(Q_WS_WINCE) || (defined(GWES_ICONCURS) && !defined(QT_NO_CURSOR))
+#if !defined(Q_OS_WINCE) || (defined(GWES_ICONCURS) && !defined(QT_NO_CURSOR))
// toggle HasMouse widget state on enter and leave
if ((e->type() == QEvent::Enter || e->type() == QEvent::DragEnter) &&
(!QApplication::activePopupWidget() || QApplication::activePopupWidget() == widget->window()))
@@ -5201,6 +5194,28 @@ void QApplicationPrivate::translateRawTouchEvent(QWidget *window,
}
}
+void QApplicationPrivate::translateTouchCancel(QTouchDevice *device, ulong timestamp)
+{
+ QTouchEvent touchEvent(QEvent::TouchCancel, device, QApplication::keyboardModifiers());
+ touchEvent.setTimestamp(timestamp);
+ QHash<ActiveTouchPointsKey, ActiveTouchPointsValue>::const_iterator it
+ = self->activeTouchPoints.constBegin(), ite = self->activeTouchPoints.constEnd();
+ QSet<QWidget *> widgetsNeedingCancel;
+ while (it != ite) {
+ QWidget *widget = static_cast<QWidget *>(it->target.data());
+ if (widget)
+ widgetsNeedingCancel.insert(widget);
+ ++it;
+ }
+ for (QSet<QWidget *>::const_iterator widIt = widgetsNeedingCancel.constBegin(),
+ widItEnd = widgetsNeedingCancel.constEnd(); widIt != widItEnd; ++widIt) {
+ QWidget *widget = *widIt;
+ touchEvent.setWindow(widget->windowHandle());
+ touchEvent.setTarget(widget);
+ QApplication::sendSpontaneousEvent(widget, &touchEvent);
+ }
+}
+
#ifndef QT_NO_GESTURES
QGestureManager* QGestureManager::instance()
{
diff --git a/src/widgets/kernel/qapplication.h b/src/widgets/kernel/qapplication.h
index b613b0f7c0..503b36aec6 100644
--- a/src/widgets/kernel/qapplication.h
+++ b/src/widgets/kernel/qapplication.h
@@ -89,7 +89,7 @@ class Q_WIDGETS_EXPORT QApplication : public QGuiApplication
#ifndef QT_NO_STYLE_STYLESHEET
Q_PROPERTY(QString styleSheet READ styleSheet WRITE setStyleSheet)
#endif
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
Q_PROPERTY(int autoMaximizeThreshold READ autoMaximizeThreshold WRITE setAutoMaximizeThreshold)
#endif
Q_PROPERTY(bool autoSipEnabled READ autoSipEnabled WRITE setAutoSipEnabled)
@@ -158,9 +158,6 @@ public:
static Qt::KeyboardModifiers queryKeyboardModifiers();
static Qt::MouseButtons mouseButtons();
- static void setDesktopSettingsAware(bool);
- static bool desktopSettingsAware();
-
static void setCursorFlashTime(int);
static int cursorFlashTime();
@@ -245,7 +242,7 @@ public Q_SLOTS:
#ifndef QT_NO_STYLE_STYLESHEET
void setStyleSheet(const QString& sheet);
#endif
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void setAutoMaximizeThreshold(const int threshold);
int autoMaximizeThreshold() const;
#endif
diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h
index 601c511438..e728868182 100644
--- a/src/widgets/kernel/qapplication_p.h
+++ b/src/widgets/kernel/qapplication_p.h
@@ -178,6 +178,8 @@ public:
virtual void notifyLayoutDirectionChange();
virtual void notifyActiveWindowChange(QWindow *);
+ virtual bool shouldQuit();
+
#if defined(Q_WS_X11)
#ifndef QT_NO_SETTINGS
static bool x11_apply_settings();
@@ -187,7 +189,7 @@ public:
static bool qws_apply_settings();
static QWidget *findWidget(const QObjectList&, const QPoint &, bool rec);
#endif
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
static int autoMaximizeThreshold;
#endif
static bool autoSipEnabled;
@@ -267,7 +269,6 @@ public:
static QWidget *hidden_focus_widget;
static QWidget *active_window;
static QIcon *app_icon;
- static bool obey_desktop_settings;
#ifndef QT_NO_WHEELEVENT
static int wheel_scroll_lines;
#endif
@@ -386,6 +387,7 @@ public:
QTouchDevice *device,
const QList<QTouchEvent::TouchPoint> &touchPoints,
ulong timestamp);
+ static void translateTouchCancel(QTouchDevice *device, ulong timestamp);
private:
#ifdef Q_WS_QWS
diff --git a/src/widgets/kernel/qapplication_qpa.cpp b/src/widgets/kernel/qapplication_qpa.cpp
index e221df7ef7..54c5c39396 100644
--- a/src/widgets/kernel/qapplication_qpa.cpp
+++ b/src/widgets/kernel/qapplication_qpa.cpp
@@ -41,6 +41,7 @@
#include "qapplication_p.h"
#include "qcolormap.h"
+#include "qpalette.h"
#include "qpixmapcache.h"
#ifndef QT_NO_CURSOR
#include "private/qcursor_p.h"
@@ -53,8 +54,9 @@
#include "qgenericpluginfactory_qpa.h"
#include "private/qplatformintegrationfactory_qpa_p.h"
#include <qdesktopwidget.h>
-
#include <QPlatformCursor>
+#include <QPlatformTheme>
+
#include <qdebug.h>
#include <QWindowSystemInterface>
#include "private/qwindowsysteminterface_qpa_p.h"
@@ -62,6 +64,7 @@
#include "qdesktopwidget_qpa_p.h"
#include "qwidgetwindow_qpa_p.h"
+#include "qtooltip.h"
#ifdef Q_OS_WIN
# include <QtCore/qt_windows.h> // for qt_win_display_dc()
@@ -393,6 +396,8 @@ void qt_init(QApplicationPrivate *priv, int type)
qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
QColormap::initialize();
+ if (const QPalette *toolTipPalette = QGuiApplicationPrivate::platformTheme()->palette(QPlatformTheme::ToolTipPalette))
+ QToolTip::setPalette(*toolTipPalette);
qApp->setObjectName(appName);
}
diff --git a/src/widgets/kernel/qguiplatformplugin.cpp b/src/widgets/kernel/qguiplatformplugin.cpp
deleted file mode 100644
index f5f00cc769..0000000000
--- a/src/widgets/kernel/qguiplatformplugin.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qguiplatformplugin_p.h"
-#include <qdebug.h>
-#include <qfile.h>
-#include <qdir.h>
-#include <qsettings.h>
-#include "private/qfactoryloader_p.h"
-#include "qstylefactory.h"
-#include "qapplication.h"
-#include "qplatformdefs.h"
-#include "qicon.h"
-
-#ifdef Q_WS_WINCE
-#include "qguifunctions_wince.h"
-extern bool qt_wince_is_smartphone(); //qguifunctions_wince.cpp
-extern bool qt_wince_is_mobile(); //qguifunctions_wince.cpp
-extern bool qt_wince_is_pocket_pc(); //qguifunctions_wince.cpp
-#endif
-
-
-#if defined(Q_WS_X11)
-#include <private/qkde_p.h>
-#include <private/qgtkstyle_p.h>
-#include <private/qt_x11_p.h>
-#endif
-
-
-QT_BEGIN_NAMESPACE
-
-
-/*! \internal
- Return (an construct if necesseray) the Gui Platform plugin.
-
- The plugin key to be loaded is inside the QT_PLATFORM_PLUGIN environment variable.
- If it is not set, it will be the DESKTOP_SESSION on X11.
-
- If no plugin can be loaded, the default one is returned.
- */
-QGuiPlatformPlugin *qt_guiPlatformPlugin()
-{
- static QGuiPlatformPlugin *plugin;
- if (!plugin)
- {
-#ifndef QT_NO_LIBRARY
-
- QString key = QString::fromLocal8Bit(qgetenv("QT_PLATFORM_PLUGIN"));
-#ifdef Q_WS_X11
- if (key.isEmpty()) {
- switch(X11->desktopEnvironment) {
- case DE_KDE:
- key = QString::fromLatin1("kde");
- break;
- default:
- key = QString::fromLocal8Bit(qgetenv("DESKTOP_SESSION"));
- break;
- }
- }
-#endif
-
- if (!key.isEmpty() && QApplication::desktopSettingsAware()) {
- QFactoryLoader loader(QGuiPlatformPluginInterface_iid, QLatin1String("/gui_platform"));
- plugin = qobject_cast<QGuiPlatformPlugin *>(loader.instance(key));
- }
-#endif // QT_NO_LIBRARY
-
- if(!plugin) {
- static QGuiPlatformPlugin def;
- plugin = &def;
- }
- }
- return plugin;
-}
-
-
-/* \class QPlatformPlugin
- QGuiPlatformPlugin can be used to integrate Qt applications in a platform built on top of Qt.
- The application developer should not know or use the plugin, it is only used by Qt internaly.
-
- But full platforms that are built on top of Qt may provide a plugin so 3rd party Qt applications
- running on the platform are integrated.
- */
-
-/*
- The constructor can be used to install hooks in Qt
- */
-QGuiPlatformPlugin::QGuiPlatformPlugin(QObject *parent) : QObject(parent) {}
-QGuiPlatformPlugin::~QGuiPlatformPlugin() {}
-
-
-/* return the string key to be used by default the application */
-QString QGuiPlatformPlugin::styleName()
-{
-#if defined(Q_WS_WIN) && defined(Q_WS_WINCE)
- if (qt_wince_is_smartphone() || qt_wince_is_pocket_pc())
- return QLatin1String("WindowsMobile");
- else
- return QLatin1String("WindowsCE");
-#elif defined(Q_OS_WIN)
- if ((QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA
- && QSysInfo::WindowsVersion < QSysInfo::WV_NT_based))
- return QLatin1String("WindowsVista");
- else if ((QSysInfo::WindowsVersion >= QSysInfo::WV_XP
- && QSysInfo::WindowsVersion < QSysInfo::WV_NT_based))
- return QLatin1String("WindowsXP");
- else
- return QLatin1String("Windows"); // default styles for Windows
-#elif defined(Q_WS_X11) && defined(Q_OS_SOLARIS)
- return QLatin1String("CDE"); // default style for X11 on Solaris
-#elif defined(Q_WS_X11) && defined(Q_OS_IRIX)
- return QLatin1String("SGI"); // default style for X11 on IRIX
-#elif defined(Q_OS_MAC)
- return QLatin1String("Macintosh"); // default style for all Mac's
-#elif defined(Q_WS_X11)
- QString stylename;
- switch(X11->desktopEnvironment) {
- case DE_KDE:
- stylename = QKde::kdeStyle();
- break;
- case DE_GNOME: {
- QStringList availableStyles = QStyleFactory::keys();
- // Set QGtkStyle for GNOME if available
- QString gtkStyleKey = QString::fromLatin1("GTK+");
- if (availableStyles.contains(gtkStyleKey)) {
- stylename = gtkStyleKey;
- break;
- }
- if (X11->use_xrender)
- stylename = QLatin1String("cleanlooks");
- else
- stylename = QLatin1String("windows");
- break;
- }
- case DE_CDE:
- stylename = QLatin1String("cde");
- break;
- default:
- // Don't do anything
- break;
- }
- return stylename;
-#else
- return QLatin1String("Plastique"); // default style for X11 and small devices
-#endif
-}
-
-/* return an additional default palette (only work on X11) */
-QPalette QGuiPlatformPlugin::palette()
-{
-#ifdef Q_WS_X11
- if (QApplication::desktopSettingsAware() && X11->desktopEnvironment == DE_KDE)
- return QKde::kdePalette();
-#endif
-
- return QPalette();
-}
-
-/* the default icon theme name for QIcon::fromTheme. */
-QString QGuiPlatformPlugin::systemIconThemeName()
-{
- QString result;
-#ifdef Q_WS_X11
- if (X11->desktopEnvironment == DE_GNOME) {
- result = QString::fromLatin1("gnome");
-#ifndef QT_NO_STYLE_GTK
- result = QGtkStylePrivate::getGConfString(QLatin1String("/desktop/gnome/interface/icon_theme"), result);
-#endif
- } else if (X11->desktopEnvironment == DE_KDE) {
- result = X11->desktopVersion >= 4 ? QString::fromLatin1("oxygen") : QString::fromLatin1("crystalsvg");
- QSettings settings(QKde::kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat);
- settings.beginGroup(QLatin1String("Icons"));
- result = settings.value(QLatin1String("Theme"), result).toString();
- }
-#endif
- return result;
-}
-
-
-QStringList QGuiPlatformPlugin::iconThemeSearchPaths()
-{
- QStringList paths;
-#if defined(Q_WS_X11)
- QString xdgDirString = QFile::decodeName(getenv("XDG_DATA_DIRS"));
- if (xdgDirString.isEmpty())
- xdgDirString = QLatin1String("/usr/local/share/:/usr/share/");
-
- QStringList xdgDirs = xdgDirString.split(QLatin1Char(':'));
-
- for (int i = 0 ; i < xdgDirs.size() ; ++i) {
- QDir dir(xdgDirs[i]);
- if (dir.exists())
- paths.append(dir.path() + QLatin1String("/icons"));
- }
- if (X11->desktopEnvironment == DE_KDE) {
- paths << QLatin1Char(':') + QKde::kdeHome() + QLatin1String("/share/icons");
- QStringList kdeDirs = QFile::decodeName(getenv("KDEDIRS")).split(QLatin1Char(':'));
- for (int i = 0 ; i< kdeDirs.count() ; ++i) {
- QDir dir(QLatin1Char(':') + kdeDirs.at(i) + QLatin1String("/share/icons"));
- if (dir.exists())
- paths.append(dir.path());
- }
- }
-
- // Add home directory first in search path
- QDir homeDir(QDir::homePath() + QLatin1String("/.icons"));
- if (homeDir.exists())
- paths.prepend(homeDir.path());
-#endif
-
-#if defined(Q_WS_WIN)
- paths.append(qApp->applicationDirPath() + QLatin1String("/icons"));
-#elif defined(Q_WS_MAC)
- paths.append(qApp->applicationDirPath() + QLatin1String("/../Resources/icons"));
-#endif
- return paths;
-}
-
-/* backend for QFileIconProvider, null icon means default */
-QIcon QGuiPlatformPlugin::fileSystemIcon(const QFileInfo &)
-{
- return QIcon();
-}
-
-/* Like QStyle::styleHint */
-int QGuiPlatformPlugin::platformHint(PlatformHint hint)
-{
- int ret = 0;
- switch(hint)
- {
- case PH_ToolButtonStyle:
- ret = Qt::ToolButtonIconOnly;
-#ifdef Q_WS_X11
- if (X11->desktopEnvironment == DE_KDE && X11->desktopVersion >= 4
- && QApplication::desktopSettingsAware()) {
- ret = QKde::kdeToolButtonStyle();
- }
-#endif
- break;
- case PH_ToolBarIconSize:
-#ifdef Q_WS_X11
- if (X11->desktopEnvironment == DE_KDE && X11->desktopVersion >= 4
- && QApplication::desktopSettingsAware()) {
- ret = QKde::kdeToolBarIconSize();
- }
-#endif
- //by default keep ret = 0 so QCommonStyle will use the style default
- break;
- default:
- break;
- }
- return ret;
-}
-
-
-QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qicon.cpp b/src/widgets/kernel/qicon.cpp
index 1d3236aa46..e579fac4f4 100644
--- a/src/widgets/kernel/qicon.cpp
+++ b/src/widgets/kernel/qicon.cpp
@@ -53,7 +53,6 @@
#include "qvariant.h"
#include "qcache.h"
#include "qdebug.h"
-#include "private/qguiplatformplugin_p.h"
#include "qapplication.h"
#ifdef Q_WS_MAC
diff --git a/src/widgets/kernel/qiconloader.cpp b/src/widgets/kernel/qiconloader.cpp
index 0b86189b5e..2f9576f864 100644
--- a/src/widgets/kernel/qiconloader.cpp
+++ b/src/widgets/kernel/qiconloader.cpp
@@ -43,11 +43,12 @@
#include <private/qguiapplication_p.h>
#include <private/qicon_p.h>
-#include <private/qguiplatformplugin_p.h>
+#include <private/qguiapplication_p.h>
#include <QtWidgets/QApplication>
#include <QtWidgets/QIconEnginePlugin>
#include <QtGui/QPixmapCache>
+#include <QtGui/QPlatformTheme>
#include <QtWidgets/QIconEngine>
#include <QtWidgets/QStyleOption>
#include <QtCore/QList>
@@ -73,17 +74,11 @@ Q_GLOBAL_STATIC(QIconLoader, iconLoaderInstance)
/* Theme to use in last resort, if the theme does not have the icon, neither the parents */
static QString fallbackTheme()
{
-#ifdef Q_WS_X11
- if (X11->desktopEnvironment == DE_GNOME) {
- return QLatin1String("gnome");
- } else if (X11->desktopEnvironment == DE_KDE) {
- return X11->desktopVersion >= 4
- ? QString::fromLatin1("oxygen")
- : QString::fromLatin1("crystalsvg");
- } else {
- return QLatin1String("hicolor");
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
+ const QVariant themeHint = theme->themeHint(QPlatformTheme::SystemIconThemeName);
+ if (themeHint.isValid())
+ return themeHint.toString();
}
-#endif
return QString();
}
@@ -94,6 +89,27 @@ QIconLoader::QIconLoader() :
// We lazily initialize the loader to make static icons
// work. Though we do not officially support this.
+
+static inline QString systemThemeName()
+{
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
+ const QVariant themeHint = theme->themeHint(QPlatformTheme::SystemIconThemeName);
+ if (themeHint.isValid())
+ return themeHint.toString();
+ }
+ return QString();
+}
+
+static inline QStringList systemIconSearchPaths()
+{
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
+ const QVariant themeHint = theme->themeHint(QPlatformTheme::IconThemeSearchPaths);
+ if (themeHint.isValid())
+ return themeHint.toStringList();
+ }
+ return QStringList();
+}
+
void QIconLoader::ensureInitialized()
{
if (!m_initialized) {
@@ -101,7 +117,8 @@ void QIconLoader::ensureInitialized()
Q_ASSERT(qApp);
- m_systemTheme = qt_guiPlatformPlugin()->systemIconThemeName();
+ m_systemTheme = systemThemeName();
+
if (m_systemTheme.isEmpty())
m_systemTheme = fallbackTheme();
#ifndef QT_NO_LIBRARY
@@ -125,7 +142,7 @@ void QIconLoader::updateSystemTheme()
{
// Only change if this is not explicitly set by the user
if (m_userTheme.isEmpty()) {
- QString theme = qt_guiPlatformPlugin()->systemIconThemeName();
+ QString theme = systemThemeName();
if (theme.isEmpty())
theme = fallbackTheme();
if (theme != m_systemTheme) {
@@ -151,7 +168,7 @@ void QIconLoader::setThemeSearchPath(const QStringList &searchPaths)
QStringList QIconLoader::themeSearchPaths() const
{
if (m_iconDirs.isEmpty()) {
- m_iconDirs = qt_guiPlatformPlugin()->iconThemeSearchPaths();
+ m_iconDirs = systemIconSearchPaths();
// Always add resource directory as search path
m_iconDirs.append(QLatin1String(":/icons"));
}
@@ -221,8 +238,11 @@ QIconTheme::QIconTheme(const QString &themeName)
QLatin1String("Icon Theme/Inherits")).toStringList();
// Ensure a default platform fallback for all themes
- if (m_parents.isEmpty())
- m_parents.append(fallbackTheme());
+ if (m_parents.isEmpty()) {
+ const QString fallback = fallbackTheme();
+ if (!fallback.isEmpty())
+ m_parents.append(fallback);
+ }
// Ensure that all themes fall back to hicolor
if (!m_parents.contains(QLatin1String("hicolor")))
diff --git a/src/widgets/kernel/qlayoutitem.cpp b/src/widgets/kernel/qlayoutitem.cpp
index 860f1cc193..664334d725 100644
--- a/src/widgets/kernel/qlayoutitem.cpp
+++ b/src/widgets/kernel/qlayoutitem.cpp
@@ -522,7 +522,7 @@ bool QWidgetItem::hasHeightForWidth() const
{
if (isEmpty())
return false;
- return wid->d_func()->hasHeightForWidth();
+ return wid->hasHeightForWidth();
}
/*!
diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp
index 3d8bb5e4bf..4a6f3518d0 100644
--- a/src/widgets/kernel/qwhatsthis.cpp
+++ b/src/widgets/kernel/qwhatsthis.cpp
@@ -54,6 +54,7 @@
#include "qcursor.h"
#include "qbitmap.h"
#include "qtextdocument.h"
+#include "qplatformtheme_qpa.h"
#include "private/qtextdocumentlayout_p.h"
#include "qtoolbutton.h"
#include "qdebug.h"
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 4709a89d27..44995f0959 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1095,7 +1095,7 @@ void QWidgetPrivate::adjustFlags(Qt::WindowFlags &flags, QWidget *w)
if (customize)
; // don't modify window flags if the user explicitly set them.
else if (type == Qt::Dialog || type == Qt::Sheet)
-#ifndef Q_WS_WINCE
+#ifndef Q_OS_WINCE
flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint | Qt::WindowCloseButtonHint;
#else
flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint;
@@ -3018,8 +3018,8 @@ QList<QAction*> QWidget::actions() const
\property QWidget::enabled
\brief whether the widget is enabled
- An enabled widget handles keyboard and mouse events; a disabled
- widget does not.
+ In general an enabled widget handles keyboard and mouse events; a disabled
+ widget does not. An exception is made with \l{QAbstractButton}.
Some widgets display themselves differently when they are
disabled. For example a button might draw its label grayed out. If
@@ -4150,7 +4150,7 @@ const QPalette &QWidget::palette() const
if (!isEnabled()) {
data->pal.setCurrentColorGroup(QPalette::Disabled);
} else if ((!isVisible() || isActiveWindow())
-#if defined(Q_OS_WIN) && !defined(Q_WS_WINCE)
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
&& !QApplicationPrivate::isBlockedByModal(const_cast<QWidget *>(this))
#endif
) {
@@ -7245,9 +7245,6 @@ void QWidget::setVisible(bool visible)
setAttribute(Qt::WA_KeyboardFocusChange, false);
if (isWindow() || parentWidget()->isVisible()) {
- // remove posted quit events when showing a new window
- QCoreApplication::removePostedEvents(qApp, QEvent::Quit);
-
d->show_helper();
qApp->d_func()->sendSyntheticEnterLeave(this);
@@ -7413,8 +7410,24 @@ bool QWidgetPrivate::close_helper(CloseMode mode)
// Attempt to close the application only if this has WA_QuitOnClose set and a non-visible parent
quitOnClose = quitOnClose && (parentWidget.isNull() || !parentWidget->isVisible());
- if (quitOnClose && q->windowHandle()) {
- static_cast<QWindowPrivate*>(QObjectPrivate::get(q->windowHandle()))->maybeQuitOnLastWindowClosed();
+ if (quitOnClose) {
+ /* if there is no non-withdrawn primary window left (except
+ the ones without QuitOnClose), we emit the lastWindowClosed
+ signal */
+ QWidgetList list = QApplication::topLevelWidgets();
+ bool lastWindowClosed = true;
+ for (int i = 0; i < list.size(); ++i) {
+ QWidget *w = list.at(i);
+ if (!w->isVisible() || w->parentWidget() || !w->testAttribute(Qt::WA_QuitOnClose))
+ continue;
+ lastWindowClosed = false;
+ break;
+ }
+ if (lastWindowClosed) {
+ QGuiApplicationPrivate::emitLastWindowClosed();
+ QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
+ applicationPrivate->maybeQuit();
+ }
}
@@ -7579,7 +7592,7 @@ QSize QWidgetPrivate::adjustedSize() const
#else // all others
QRect screen = QApplication::desktop()->screenGeometry(q->pos());
#endif
-#if defined (Q_WS_WINCE)
+#if defined (Q_OS_WINCE)
s.setWidth(qMin(s.width(), screen.width()));
s.setHeight(qMin(s.height(), screen.height()));
#else
@@ -7776,6 +7789,7 @@ bool QWidget::event(QEvent *event)
case QEvent::TouchBegin:
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
+ case QEvent::TouchCancel:
case QEvent::ContextMenu:
#ifndef QT_NO_WHEELEVENT
case QEvent::Wheel:
@@ -8048,6 +8062,7 @@ bool QWidget::event(QEvent *event)
case QEvent::LocaleChange:
case QEvent::MacSizeChange:
case QEvent::ContentsRectChange:
+ case QEvent::ThemeChange:
changeEvent(event);
break;
@@ -8178,6 +8193,7 @@ bool QWidget::event(QEvent *event)
case QEvent::TouchBegin:
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
+ case QEvent::TouchCancel:
{
event->ignore();
break;
@@ -8250,6 +8266,20 @@ void QWidget::changeEvent(QEvent * event)
update();
break;
+ case QEvent::ThemeChange:
+ if (QApplication::desktopSettingsAware() && windowType() != Qt::Desktop
+ && qApp && !QApplication::closingDown()) {
+ if (testAttribute(Qt::WA_WState_Polished))
+ QApplication::style()->unpolish(this);
+ if (testAttribute(Qt::WA_WState_Polished))
+ QApplication::style()->polish(this);
+ QEvent styleChangedEvent(QEvent::StyleChange);
+ QCoreApplication::sendEvent(this, &styleChangedEvent);
+ if (isVisible())
+ update();
+ }
+ break;
+
#ifdef Q_WS_MAC
case QEvent::MacSizeChange:
updateGeometry();
@@ -9196,19 +9226,12 @@ int QWidget::heightForWidth(int w) const
/*!
- \internal
-
- *virtual private*
-
- This is a bit hackish, but ideally we would have created a virtual function
- in the public API (however, too late...) so that subclasses could reimplement
- their own function.
- Instead we add a virtual function to QWidgetPrivate.
- ### Qt5: move to public class and make virtual
+ Returns true if the widget's preferred height depends on its width; otherwise returns false.
*/
-bool QWidgetPrivate::hasHeightForWidth() const
+bool QWidget::hasHeightForWidth() const
{
- return layout ? layout->hasHeightForWidth() : size_policy.hasHeightForWidth();
+ Q_D(const QWidget);
+ return d->layout ? d->layout->hasHeightForWidth() : d->size_policy.hasHeightForWidth();
}
/*!
diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h
index 0f13d0b7f6..78b693c78d 100644
--- a/src/widgets/kernel/qwidget.h
+++ b/src/widgets/kernel/qwidget.h
@@ -481,11 +481,7 @@ public Q_SLOTS:
virtual void setVisible(bool visible);
inline void setHidden(bool hidden) { setVisible(!hidden); }
-#ifndef Q_WS_WINCE
inline void show() { setVisible(true); }
-#else
- void show();
-#endif
inline void hide() { setVisible(false); }
void showMinimized();
@@ -528,6 +524,7 @@ public:
void setSizePolicy(QSizePolicy);
inline void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical);
virtual int heightForWidth(int) const;
+ virtual bool hasHeightForWidth() const;
QRegion visibleRegion() const;
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index 0da0c65aaa..38314c234b 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -283,9 +283,8 @@ public:
DrawRecursive = 0x04,
DrawInvisible = 0x08,
DontSubtractOpaqueChildren = 0x10,
- DontSetCompositionMode = 0x20,
- DontDrawOpaqueChildren = 0x40,
- DontDrawNativeChildren = 0x80
+ DontDrawOpaqueChildren = 0x20,
+ DontDrawNativeChildren = 0x40
};
enum CloseMode {
@@ -468,7 +467,6 @@ public:
bool setMinimumSize_helper(int &minw, int &minh);
bool setMaximumSize_helper(int &maxw, int &maxh);
- virtual bool hasHeightForWidth() const;
void setConstraints_sys();
bool pointInsideRectAndMask(const QPoint &) const;
QWidget *childAt_helper(const QPoint &, bool) const;
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index 289b332a13..a37de8547a 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -424,6 +424,19 @@ void QWidget::activateWindow()
windowHandle()->requestActivateWindow();
}
+// Position top level windows at the center, avoid showing
+// Windows at the default 0,0 position excluding the frame.
+static inline QRect positionTopLevelWindow(QRect geometry, const QScreen *screen)
+{
+ if (screen && geometry.x() == 0 && geometry.y() == 0) {
+ const QRect availableGeometry = screen->availableGeometry();
+ if (availableGeometry.width() > geometry.width()
+ && availableGeometry.height() > geometry.height())
+ geometry.moveCenter(availableGeometry.center());
+ }
+ return geometry;
+}
+
void QWidgetPrivate::show_sys()
{
Q_Q(QWidget);
@@ -441,7 +454,10 @@ void QWidgetPrivate::show_sys()
QWindow *window = q->windowHandle();
if (window) {
QRect geomRect = q->geometry();
- if (!q->isWindow()) {
+ if (q->isWindow()) {
+ if (!q->testAttribute(Qt::WA_Moved))
+ geomRect = positionTopLevelWindow(geomRect, window->screen());
+ } else {
QPoint topLeftOfWindow = q->mapTo(q->nativeParentWidget(),QPoint());
geomRect.moveTopLeft(topLeftOfWindow);
}
@@ -483,7 +499,15 @@ void QWidgetPrivate::hide_sys()
void QWidgetPrivate::setMaxWindowState_helper()
{
- setFullScreenSize_helper(); //### decoration size
+ Q_Q(QWidget);
+
+ const uint old_state = data.in_set_window_state;
+ data.in_set_window_state = 1;
+
+ const QRect desktop = qApp->desktop()->availableGeometry(qApp->desktop()->screenNumber(q));
+ q->setGeometry(desktop);
+
+ data.in_set_window_state = old_state;
}
void QWidgetPrivate::setFullScreenSize_helper()
diff --git a/src/widgets/kernel/qwidgetsfunctions_wince.cpp b/src/widgets/kernel/qwidgetsfunctions_wince.cpp
new file mode 100644
index 0000000000..a45694177e
--- /dev/null
+++ b/src/widgets/kernel/qwidgetsfunctions_wince.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qwidgetsfunctions_wince.h"
+#include <shellapi.h>
+
+QT_USE_NAMESPACE
+
+#ifndef ShellExecute
+HINSTANCE qt_wince_ShellExecute(HWND hwnd, LPCWSTR, LPCWSTR file, LPCWSTR params, LPCWSTR dir, int showCmd)
+{
+ SHELLEXECUTEINFO info;
+ info.hwnd = hwnd;
+ info.lpVerb = L"Open";
+ info.lpFile = file;
+ info.lpParameters = params;
+ info.lpDirectory = dir;
+ info.nShow = showCmd;
+ info.cbSize = sizeof(info);
+ ShellExecuteEx(&info);
+ return info.hInstApp;
+}
+#endif
+
+#ifndef SPI_GETPLATFORMTYPE
+#define SPI_GETPLATFORMTYPE 257
+#endif
+
+// Internal Qt -----------------------------------------------------
+bool qt_wince_is_platform(const QString &platformString) {
+ wchar_t tszPlatform[64];
+ if (SystemParametersInfo(SPI_GETPLATFORMTYPE, sizeof(tszPlatform) / sizeof(wchar_t), tszPlatform, 0))
+ if (0 == _tcsicmp(reinterpret_cast<const wchar_t *> (platformString.utf16()), tszPlatform))
+ return true;
+ return false;
+}
+
+int qt_wince_get_build()
+{
+ OSVERSIONINFO osvi;
+ osvi.dwOSVersionInfoSize = sizeof(osvi);
+ if (GetVersionEx(&osvi))
+ return osvi.dwBuildNumber;
+ return 0;
+}
+
+int qt_wince_get_version()
+{
+ OSVERSIONINFO osvi;
+ osvi.dwOSVersionInfoSize = sizeof(osvi);
+ if (GetVersionEx(&osvi))
+ return (osvi.dwMajorVersion * 10 + osvi.dwMinorVersion);
+ return 0;
+}
+
+bool qt_wince_is_windows_mobile_65()
+{
+ const DWORD dwFirstWM65BuildNumber = 21139;
+ OSVERSIONINFO osvi;
+ osvi.dwOSVersionInfoSize = sizeof(osvi);
+ if (!GetVersionEx(&osvi))
+ return false;
+ return osvi.dwMajorVersion > 5
+ || (osvi.dwMajorVersion == 5 && (osvi.dwMinorVersion > 2 ||
+ (osvi.dwMinorVersion == 2 && osvi.dwBuildNumber >= dwFirstWM65BuildNumber)));
+}
+
+bool qt_wince_is_pocket_pc() {
+ return qt_wince_is_platform(QString::fromLatin1("PocketPC"));
+}
+
+bool qt_wince_is_smartphone() {
+ return qt_wince_is_platform(QString::fromLatin1("Smartphone"));
+}
+bool qt_wince_is_mobile() {
+ return (qt_wince_is_smartphone() || qt_wince_is_pocket_pc());
+}
+
+bool qt_wince_is_high_dpi() {
+ if (!qt_wince_is_pocket_pc())
+ return false;
+ HDC deviceContext = GetDC(0);
+ int dpi = GetDeviceCaps(deviceContext, LOGPIXELSX);
+ ReleaseDC(0, deviceContext);
+ if ((dpi < 1000) && (dpi > 0))
+ return dpi > 96;
+ else
+ return false;
+}
diff --git a/src/corelib/arch/sh/qatomic_sh.cpp b/src/widgets/kernel/qwidgetsfunctions_wince.h
index 5cd1b593d8..8223b0fb68 100644
--- a/src/corelib/arch/sh/qatomic_sh.cpp
+++ b/src/widgets/kernel/qwidgetsfunctions_wince.h
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the QtCore module of the Qt Toolkit.
+** This file is part of the QtWidgets module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -38,35 +38,25 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+#ifndef QWIDGETSFUNCTIONS_WCE_H
+#define QWIDGETSFUNCTIONS_WCE_H
+#ifdef Q_OS_WINCE
+#include <QtCore/qfunctions_wince.h>
-#include <QtCore/qglobal.h>
-
-#include <unistd.h>
-#ifdef _POSIX_PRIORITY_SCHEDULING
-# include <sched.h>
-#endif
-#include <time.h>
-
+#ifdef QT_BUILD_GUI_LIB
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
+QT_MODULE(Gui)
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif
-QT_USE_NAMESPACE
-
-Q_CORE_EXPORT volatile char qt_atomic_lock = 0;
-Q_CORE_EXPORT void qt_atomic_yield(int *count)
-{
-#ifdef _POSIX_PRIORITY_SCHEDULING
- if((*count)++ < 50) {
- sched_yield();
- } else
+//WinCe 7 has shell support
+#ifndef ShellExecute
+HINSTANCE qt_wince_ShellExecute(HWND hwnd, LPCWSTR operation, LPCWSTR file, LPCWSTR params, LPCWSTR dir, int showCmd);
+#define ShellExecute(a,b,c,d,e,f) qt_wince_ShellExecute(a,b,c,d,e,f)
#endif
- {
- struct timespec tm;
- tm.tv_sec = 0;
- tm.tv_nsec = 2000001;
- nanosleep(&tm, NULL);
- *count = 0;
- }
-}
-QT_END_NAMESPACE
+#endif // Q_OS_WINCE
+#endif // QWIDGETSFUNCTIONS_WCE_H \ No newline at end of file
diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp
index e7ba4853a0..c04d8a9dc3 100644
--- a/src/widgets/kernel/qwidgetwindow_qpa.cpp
+++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp
@@ -110,6 +110,7 @@ bool QWidgetWindow::event(QEvent *event)
case QEvent::TouchBegin:
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
+ case QEvent::TouchCancel:
handleTouchEvent(static_cast<QTouchEvent *>(event));
return true;
@@ -149,6 +150,12 @@ bool QWidgetWindow::event(QEvent *event)
handleWindowStateChangedEvent(static_cast<QWindowStateChangeEvent *>(event));
return true;
+ case QEvent::ThemeChange: {
+ QEvent widgetEvent(QEvent::ThemeChange);
+ QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent);
+ }
+ return true;
+
default:
break;
}
@@ -289,7 +296,10 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
void QWidgetWindow::handleTouchEvent(QTouchEvent *event)
{
- QApplicationPrivate::translateRawTouchEvent(m_widget, event->device(), event->touchPoints(), event->timestamp());
+ if (event->type() == QEvent::TouchCancel)
+ QApplicationPrivate::translateTouchCancel(event->device(), event->timestamp());
+ else
+ QApplicationPrivate::translateRawTouchEvent(m_widget, event->device(), event->touchPoints(), event->timestamp());
}
void QWidgetWindow::handleKeyEvent(QKeyEvent *event)
diff --git a/src/widgets/kernel/win.pri b/src/widgets/kernel/win.pri
index 4288e09ecb..dd47664c28 100644
--- a/src/widgets/kernel/win.pri
+++ b/src/widgets/kernel/win.pri
@@ -2,4 +2,6 @@
# --------------------------------------------------------------------
INCLUDEPATH += ../3rdparty/wintab
-LIBS *= -lshell32
+!wince* {
+ LIBS *= -lshell32
+}
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index db783d14d4..75476faeeb 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -45,6 +45,7 @@
#include <qfile.h>
#include <qapplication.h>
#include <private/qguiapplication_p.h>
+#include <qplatformtheme_qpa.h>
#include <qbitmap.h>
#include <qcache.h>
#include <qdockwidget.h>
@@ -75,7 +76,6 @@
#include <qsettings.h>
#include <qvariant.h>
#include <qpixmapcache.h>
-#include <private/qguiplatformplugin_p.h>
#include <limits.h>
@@ -4509,9 +4509,11 @@ int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const QWid
break;
case PM_ToolBarIconSize:
- ret = qt_guiPlatformPlugin()->platformHint(QGuiPlatformPlugin::PH_ToolBarIconSize);
- if (!ret)
- ret = int(QStyleHelper::dpiScaled(24.));
+ ret = 0;
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+ ret = theme->themeHint(QPlatformTheme::ToolBarIconSize).toInt();
+ if (ret <= 0)
+ ret = int(QStyleHelper::dpiScaled(24.));
break;
case PM_TabBarIconSize:
@@ -4903,9 +4905,10 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
break;
case SH_ItemView_ActivateItemOnSingleClick:
- ret = qt_guiPlatformPlugin()->platformHint(QGuiPlatformPlugin::PH_ItemView_ActivateItemOnSingleClick);
+ ret = 0;
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+ ret = theme->themeHint(QPlatformTheme::ToolButtonStyle).toBool() ? 1 : 0;
break;
-
case SH_TitleBar_ModifyNotification:
ret = true;
break;
@@ -4997,7 +5000,9 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
ret = true;
break;
case SH_ToolButtonStyle:
- ret = qt_guiPlatformPlugin()->platformHint(QGuiPlatformPlugin::PH_ToolButtonStyle);
+ ret = 0;
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+ ret = theme->themeHint(QPlatformTheme::ToolButtonStyle).toInt();
break;
case SH_RequestSoftwareInputPanel:
ret = RSIP_OnMouseClickAndAlreadyFocused;
diff --git a/src/widgets/styles/qgtkstyle_p.cpp b/src/widgets/styles/qgtkstyle_p.cpp
index 40ad9f2a95..18e120a4eb 100644
--- a/src/widgets/styles/qgtkstyle_p.cpp
+++ b/src/widgets/styles/qgtkstyle_p.cpp
@@ -661,7 +661,7 @@ QString QGtkStylePrivate::getThemeName()
foreach (const QString &rcPath, paths) {
if (!rcPath.isEmpty()) {
QFile rcFile(rcPath);
- if (rcFile.exists() && rcFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ if (rcFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&rcFile);
while(!in.atEnd()) {
QString line = in.readLine();
diff --git a/src/widgets/styles/qstylehelper.cpp b/src/widgets/styles/qstylehelper.cpp
index 818671f85f..3fdbc98323 100644
--- a/src/widgets/styles/qstylehelper.cpp
+++ b/src/widgets/styles/qstylehelper.cpp
@@ -159,7 +159,9 @@ QPolygonF calcLines(const QStyleOptionSlider *dial)
qreal xc = width / 2 + 0.5;
qreal yc = height / 2 + 0.5;
- int ns = dial->tickInterval;
+ const int ns = dial->tickInterval;
+ if (!ns) // Invalid values may be set by Qt Designer.
+ return poly;
int notches = (dial->maximum + ns - 1 - dial->minimum) / ns;
if (notches <= 0)
return poly;
diff --git a/src/widgets/styles/qwindowscestyle.cpp b/src/widgets/styles/qwindowscestyle.cpp
index 72f7426268..5bd2de290a 100644
--- a/src/widgets/styles/qwindowscestyle.cpp
+++ b/src/widgets/styles/qwindowscestyle.cpp
@@ -52,6 +52,7 @@
#include "qstyleoption.h"
#include "qwindowscestyle_p.h"
#include "qdebug.h"
+#include "qdrawutil.h"
QT_BEGIN_NAMESPACE
diff --git a/src/widgets/styles/qwindowsmobilestyle.cpp b/src/widgets/styles/qwindowsmobilestyle.cpp
index 284d42dacc..30269751ca 100644
--- a/src/widgets/styles/qwindowsmobilestyle.cpp
+++ b/src/widgets/styles/qwindowsmobilestyle.cpp
@@ -72,13 +72,12 @@
#include "qdebug.h"
#include "qtabwidget.h"
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
#include "qt_windows.h"
-#include "qguifunctions_wince.h"
extern bool qt_wince_is_high_dpi(); //defined in qguifunctions_wince.cpp
extern bool qt_wince_is_smartphone(); //defined in qguifunctions_wince.cpp
extern bool qt_wince_is_windows_mobile_65(); //defined in qguifunctions_wince.cpp
-#endif // Q_WS_WINCE
+#endif // Q_OS_WINCE
#include "qstylehelper_p.h"
@@ -667,7 +666,7 @@ static const char * const min_small_xpm[] = {
" ++++++++++++ ",
" "};
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
static char * sbhandleup_xpm[] = {
"26 41 45 1",
@@ -4033,12 +4032,12 @@ void tintImage(QImage *image, QColor color, qreal saturation)
}
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
enum QSliderDirection { SliderUp, SliderDown, SliderLeft, SliderRight };
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
void QWindowsMobileStylePrivate::tintImagesButton(QColor color)
{
@@ -4096,11 +4095,11 @@ void QWindowsMobileStylePrivate::tintListViewHighlight(QColor color)
}
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
void QWindowsMobileStylePrivate::setupWindowsMobileStyle65()
{
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
wm65 = qt_wince_is_windows_mobile_65();
if (wm65) {
imageScrollbarHandleUp = QImage(sbhandleup_xpm);
@@ -4119,13 +4118,13 @@ void QWindowsMobileStylePrivate::setupWindowsMobileStyle65()
}
tintImagesHigh(Qt::blue);
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
}
void QWindowsMobileStylePrivate::drawTabBarTab(QPainter *painter, const QStyleOptionTab *tab)
{
#ifndef QT_NO_TABBAR
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (wm65) {
tintImagesButton(tab->palette.button().color());
QRect r;
@@ -4154,7 +4153,7 @@ void QWindowsMobileStylePrivate::drawTabBarTab(QPainter *painter, const QStyleOp
//imageTabBarBig
return;
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
painter->save();
painter->setPen(tab->palette.shadow().color());
if (doubleControls) {
@@ -4216,7 +4215,7 @@ void QWindowsMobileStylePrivate::drawTabBarTab(QPainter *painter, const QStyleOp
void QWindowsMobileStylePrivate::drawPanelItemViewSelected(QPainter *painter, const QStyleOptionViewItemV4 *option, QRect rect)
{
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (wm65) {
QRect r;
if (rect.isValid())
@@ -4257,7 +4256,7 @@ void QWindowsMobileStylePrivate::drawPanelItemViewSelected(QPainter *painter, co
}
return;
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
QPalette::ColorGroup cg = option->state & QStyle::State_Enabled
? QPalette::Normal : QPalette::Disabled;
@@ -4269,7 +4268,7 @@ void QWindowsMobileStylePrivate::drawPanelItemViewSelected(QPainter *painter, co
void QWindowsMobileStylePrivate::drawScrollbarGrip(QPainter *p, QStyleOptionSlider *newScrollbar, const QStyleOptionComplex *option, bool drawCompleteFrame)
{
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (wm65) {
if (newScrollbar->orientation == Qt::Horizontal) {
QTransform transform;
@@ -4361,7 +4360,7 @@ void QWindowsMobileStylePrivate::drawScrollbarGrip(QPainter *p, QStyleOptionSlid
void QWindowsMobileStylePrivate::drawScrollbarHandleUp(QPainter *p, QStyleOptionSlider *opt, bool completeFrame, bool )
{
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (wm65) {
tintImagesHigh(opt->palette.highlight().color());
QRect r = opt->rect;
@@ -4380,7 +4379,7 @@ void QWindowsMobileStylePrivate::drawScrollbarHandleUp(QPainter *p, QStyleOption
}
return ;
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
QBrush fill = opt->palette.button();
if (opt->state & QStyle::State_Sunken)
@@ -4418,7 +4417,7 @@ void QWindowsMobileStylePrivate::drawScrollbarHandleUp(QPainter *p, QStyleOption
void QWindowsMobileStylePrivate::drawScrollbarHandleDown(QPainter *p, QStyleOptionSlider *opt, bool completeFrame, bool secondScrollBar)
{
#ifndef QT_NO_SCROLLBAR
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (wm65) {
tintImagesHigh(opt->palette.highlight().color());
QRect r = opt->rect;
@@ -4437,7 +4436,7 @@ void QWindowsMobileStylePrivate::drawScrollbarHandleDown(QPainter *p, QStyleOpti
}
return ;
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
QBrush fill = opt->palette.button();
if (opt->state & QStyle::State_Sunken)
@@ -4520,13 +4519,13 @@ QWindowsMobileStyle::QWindowsMobileStyle() : QWindowsStyle(*new QWindowsMobileSt
QWindowsMobileStylePrivate::QWindowsMobileStylePrivate() :QWindowsStylePrivate() {
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
doubleControls = qt_wince_is_high_dpi();
smartphone = qt_wince_is_smartphone();
#else
doubleControls = false;
smartphone = false;
-#endif //Q_WS_WINCE
+#endif //Q_OS_WINCE
#ifndef QT_NO_IMAGEFORMAT_XPM
@@ -5215,7 +5214,7 @@ void QWindowsMobileStyle::drawPrimitive(PrimitiveElement element, const QStyleOp
}
switch (tab->shape) {
case QTabBar::RoundedNorth:
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (!d->wm65)
#endif
{
@@ -5226,7 +5225,7 @@ void QWindowsMobileStyle::drawPrimitive(PrimitiveElement element, const QStyleOp
}
break;
case QTabBar::RoundedSouth:
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (!d->wm65)
#endif
{
@@ -5237,13 +5236,13 @@ void QWindowsMobileStyle::drawPrimitive(PrimitiveElement element, const QStyleOp
}
break;
case QTabBar::RoundedEast:
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (!d->wm65)
#endif
painter->drawLine(rect.topRight(), rect.bottomRight());
break;
case QTabBar::RoundedWest:
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (!d->wm65)
#endif
painter->drawLine(rect.topLeft(), rect.bottomLeft());
@@ -6458,7 +6457,7 @@ QSize QWindowsMobileStyle::sizeFromContents(ContentsType type, const QStyleOptio
newSize += QSize(4, 2);
break;
#ifndef QT_NO_ITEMVIEWS
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
case CT_ItemViewItem:
if (d_func()->wm65)
if (d_func()->doubleControls)
@@ -6466,7 +6465,7 @@ QSize QWindowsMobileStyle::sizeFromContents(ContentsType type, const QStyleOptio
else
newSize.setHeight(23);
break;
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
#endif //QT_NO_ITEMVIEWS
default:
break;
@@ -6508,7 +6507,7 @@ QRect QWindowsMobileStyle::subElementRect(SubElement element, const QStyleOption
#endif // QT_NO_SLIDER
#ifndef QT_NO_ITEMVIEWS
case SE_ItemViewItemFocusRect:
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (d->wm65)
rect = QRect();
#endif
@@ -6533,13 +6532,13 @@ QRect QWindowsMobileStyle::subControlRect(ComplexControl control, const QStyleOp
float stretchFactor = 1.4f;
int sliderButtonExtentDir = int (sliderButtonExtent * stretchFactor);
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (d->wm65)
{
sliderButtonExtent = d->imageScrollbarHandleUp.width();
sliderButtonExtentDir = d->imageScrollbarHandleUp.height();
}
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
int sliderlen;
int maxlen = ((scrollbar->orientation == Qt::Horizontal) ?
@@ -7067,7 +7066,7 @@ int QWindowsMobileStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, co
d->doubleControls ? ret = 42 : ret = 21;
break;
case PM_ScrollBarSliderMin:
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (d->wm65)
#else
if (false)
@@ -7085,7 +7084,7 @@ int QWindowsMobileStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, co
else
d->doubleControls ? ret = 25 : ret = 13;
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (d->wm65)
#else
if (false)
@@ -7239,10 +7238,10 @@ QPixmap QWindowsMobileStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPi
switch (iconMode) {
case QIcon::Selected: {
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
if (d_func()->wm65)
return pixmap;
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
int imgh = img.height();
int imgw = img.width();
diff --git a/src/widgets/styles/qwindowsmobilestyle_p.h b/src/widgets/styles/qwindowsmobilestyle_p.h
index d536afe50e..3efbe535c2 100644
--- a/src/widgets/styles/qwindowsmobilestyle_p.h
+++ b/src/widgets/styles/qwindowsmobilestyle_p.h
@@ -62,7 +62,6 @@ QT_BEGIN_NAMESPACE
class QStyleOptionTab;
class QStyleOptionSlider;
-class QStyleOptionViewItemV4;
class QWindowsMobileStylePrivate : public QWindowsStylePrivate
{
@@ -71,7 +70,7 @@ public:
QWindowsMobileStylePrivate();
bool doubleControls;
bool smartphone;
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
bool wm65;
#endif
@@ -95,7 +94,7 @@ public:
void setupWindowsMobileStyle65();
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
//Windows Mobile 6.5 images
QImage imageScrollbarHandleUp;
QImage imageScrollbarHandleDown;
@@ -119,7 +118,7 @@ public:
void tintImagesButton(QColor color);
void tintListViewHighlight(QColor color);
-#endif //Q_WS_WINCE_WM
+#endif //Q_OS_WINCE_WM
void drawScrollbarHandleUp(QPainter *p, QStyleOptionSlider *opt, bool completeFrame = false, bool secondScrollBar = false);
void drawScrollbarHandleDown(QPainter *p, QStyleOptionSlider *opt, bool completeFrame = false, bool secondScrollBar = false);
diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp
index 63d275a391..a24f42c5f1 100644
--- a/src/widgets/styles/qwindowsxpstyle.cpp
+++ b/src/widgets/styles/qwindowsxpstyle.cpp
@@ -337,10 +337,11 @@ HWND QWindowsXPStylePrivate::winId(const QWidget *widget)
if (const HWND hwnd = QApplicationPrivate::getHWNDForWidget(const_cast<QWidget *>(widget)))
return hwnd;
- const QWidgetList toplevels = QApplication::topLevelWidgets();
- if (!toplevels.isEmpty())
- if (const HWND topLevelHwnd = QApplicationPrivate::getHWNDForWidget(toplevels.front()))
- return topLevelHwnd;
+ // Find top level with native window (there might be dialogs that do not have one).
+ foreach (const QWidget *toplevel, QApplication::topLevelWidgets())
+ if (toplevel->windowHandle())
+ if (const HWND topLevelHwnd = QApplicationPrivate::getHWNDForWidget(toplevel))
+ return topLevelHwnd;
if (QDesktopWidget *desktop = qApp->desktop())
if (const HWND desktopHwnd = QApplicationPrivate::getHWNDForWidget(desktop))
diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp
index 321323733b..bed8dc2eae 100644
--- a/src/widgets/util/qsystemtrayicon.cpp
+++ b/src/widgets/util/qsystemtrayicon.cpp
@@ -434,13 +434,13 @@ QBalloonTip::QBalloonTip(QSystemTrayIcon::MessageIcon icon, const QString& title
titleLabel->setText(title);
QFont f = titleLabel->font();
f.setBold(true);
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
f.setPointSize(f.pointSize() - 2);
#endif
titleLabel->setFont(f);
titleLabel->setTextFormat(Qt::PlainText); // to maintain compat with windows
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
const int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize);
const int closeButtonSize = style()->pixelMetric(QStyle::PM_SmallIconSize) - 2;
#else
@@ -456,7 +456,7 @@ QBalloonTip::QBalloonTip(QSystemTrayIcon::MessageIcon icon, const QString& title
QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
QLabel *msgLabel = new QLabel;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
f.setBold(false);
msgLabel->setFont(f);
#endif
@@ -466,7 +466,7 @@ QBalloonTip::QBalloonTip(QSystemTrayIcon::MessageIcon icon, const QString& title
msgLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft);
// smart size for the message label
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
int limit = QApplication::desktop()->availableGeometry(msgLabel).size().width() / 2;
#else
int limit = QApplication::desktop()->availableGeometry(msgLabel).size().width() / 3;
@@ -481,7 +481,7 @@ QBalloonTip::QBalloonTip(QSystemTrayIcon::MessageIcon icon, const QString& title
control->document()->setDefaultTextOption(opt);
}
}
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
// Make sure that the text isn't wrapped "somewhere" in the balloon widget
// in the case that we have a long title label.
setMaximumWidth(limit);
diff --git a/src/widgets/widgets/qabstractbutton.cpp b/src/widgets/widgets/qabstractbutton.cpp
index a398cc1567..be250c54e1 100644
--- a/src/widgets/widgets/qabstractbutton.cpp
+++ b/src/widgets/widgets/qabstractbutton.cpp
@@ -115,7 +115,9 @@ Q_WIDGETS_EXPORT extern bool qt_tab_all_widgets;
checkable buttons can be checked and unchecked (see below).
\o isEnabled() indicates whether the button can be pressed by the
- user.
+ user. \note As opposed to other widgets, buttons derived from
+ QAbstractButton accepts mouse and context menu events
+ when disabled.
\o setAutoRepeat() sets whether the button will auto-repeat if the
user holds it down. \l autoRepeatDelay and \l autoRepeatInterval
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp
index 6da7605f4c..a90c754cee 100644
--- a/src/widgets/widgets/qdockwidget.cpp
+++ b/src/widgets/widgets/qdockwidget.cpp
@@ -207,7 +207,7 @@ bool QDockWidgetLayout::nativeWindowDeco() const
bool QDockWidgetLayout::nativeWindowDeco(bool floating) const
{
-#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_WS_WINCE)
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_WINCE)
Q_UNUSED(floating);
return false;
#else
diff --git a/src/widgets/widgets/qeffects.cpp b/src/widgets/widgets/qeffects.cpp
index 486905658d..84823675dd 100644
--- a/src/widgets/widgets/qeffects.cpp
+++ b/src/widgets/widgets/qeffects.cpp
@@ -111,7 +111,7 @@ QAlphaWidget::QAlphaWidget(QWidget* w, Qt::WindowFlags f)
QAlphaWidget::~QAlphaWidget()
{
-#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE)
+#if defined(Q_WS_WIN) && !defined(Q_OS_WINCE)
// Restore user-defined opacity value
if (widget)
widget->setWindowOpacity(1);
diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp
index cca39a6502..b42fedf0be 100644
--- a/src/widgets/widgets/qmdisubwindow.cpp
+++ b/src/widgets/widgets/qmdisubwindow.cpp
@@ -1772,7 +1772,7 @@ bool QMdiSubWindowPrivate::drawTitleBarWhenMaximized() const
if (isChildOfTabbedQMdiArea(q))
return false;
-#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) || defined(Q_WS_WINCE_WM)
+#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) || defined(Q_OS_WINCE_WM)
return true;
#else
if (q->style()->styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, 0, q))
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index 1ad697c430..e8415e3a9c 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -49,6 +49,7 @@
#include "qtimer.h"
#include "qlayout.h"
#include "qpainter.h"
+#include "qplatformtheme_qpa.h"
#include "qapplication.h"
#include "qdesktopwidget.h"
#ifndef QT_NO_ACCESSIBILITY
@@ -2882,7 +2883,7 @@ void QMenu::actionEvent(QActionEvent *e)
d->platformMenu->syncAction(e->action());
}
-#if defined(Q_WS_WINCE) && !defined(QT_NO_MENUBAR)
+#if defined(Q_OS_WINCE) && !defined(QT_NO_MENUBAR)
if (!d->wce_menu)
d->wce_menu = new QMenuPrivate::QWceMenuPrivate;
if (e->type() == QEvent::ActionAdded)
diff --git a/src/widgets/widgets/qmenu.h b/src/widgets/widgets/qmenu.h
index fa0542b6c2..182b0bc2b8 100644
--- a/src/widgets/widgets/qmenu.h
+++ b/src/widgets/widgets/qmenu.h
@@ -48,7 +48,7 @@
#include <QtWidgets/qaction.h>
#include <QtWidgets/qplatformmenu_qpa.h>
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
#include <windef.h> // for HMENU
#endif
@@ -136,7 +136,7 @@ public:
void setNoReplayFor(QWidget *widget);
QPlatformMenu *platformMenu();
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
HMENU wceMenu();
#endif
@@ -170,7 +170,7 @@ protected:
bool focusNextPrevChild(bool next);
void initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
QAction* wceCommands(uint command);
#endif
diff --git a/src/widgets/widgets/qmenu_p.h b/src/widgets/widgets/qmenu_p.h
index af236c1c8f..ee6e62653f 100644
--- a/src/widgets/widgets/qmenu_p.h
+++ b/src/widgets/widgets/qmenu_p.h
@@ -68,7 +68,7 @@ QT_BEGIN_NAMESPACE
class QTornOffMenu;
class QEventLoop;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
struct QWceMenuAction {
uint command;
QPointer<QAction> action;
@@ -91,7 +91,7 @@ public:
scroll(0), eventLoop(0), tearoff(0), tornoff(0), tearoffHighlighted(0),
hasCheckableItems(0), sloppyAction(0), doChildEffects(false), platformMenu(0)
-#if defined(Q_WS_WINCE) && !defined(QT_NO_MENUBAR)
+#if defined(Q_OS_WINCE) && !defined(QT_NO_MENUBAR)
,wce_menu(0)
#endif
{ }
@@ -99,7 +99,7 @@ public:
{
delete scroll;
delete platformMenu;
-#if defined(Q_WS_WINCE) && !defined(QT_NO_MENUBAR)
+#if defined(Q_OS_WINCE) && !defined(QT_NO_MENUBAR)
delete wce_menu;
#endif
}
@@ -228,7 +228,7 @@ public:
QPointer<QAction> actionAboutToTrigger;
-#if defined(Q_WS_WINCE) && !defined(QT_NO_MENUBAR)
+#if defined(Q_OS_WINCE) && !defined(QT_NO_MENUBAR)
struct QWceMenuPrivate {
QList<QWceMenuAction*> actionItems;
HMENU menuHandle;
diff --git a/src/widgets/widgets/qmenu_wince.cpp b/src/widgets/widgets/qmenu_wince.cpp
index ae90d23b28..dae0a67e11 100644
--- a/src/widgets/widgets/qmenu_wince.cpp
+++ b/src/widgets/widgets/qmenu_wince.cpp
@@ -40,7 +40,7 @@
****************************************************************************/
//Native menubars are only supported for Windows Mobile not the standard SDK/generic WinCE
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
#include "qmenu.h"
#include "qt_windows.h"
#include "qapplication.h"
@@ -62,8 +62,6 @@
# include <windowsm.h>
#endif
-#include "qguifunctions_wince.h"
-
#ifndef QT_NO_MENUBAR
#ifndef SHCMBF_EMPTYBAR
@@ -377,7 +375,8 @@ void QMenuBarPrivate::wceCreateMenuBar(QWidget *parent)
Q_Q(QMenuBar);
wce_menubar = new QWceMenuBarPrivate(this);
- wce_menubar->parentWindowHandle = parent ? parent->winId() : q->winId();
+ wce_menubar->parentWindowHandle = parent ? QApplicationPrivate::getHWNDForWidget(parent) :
+ QApplicationPrivate::getHWNDForWidget(q);
wce_menubar->leftButtonAction = defaultAction;
wce_menubar->menubarHandle = qt_wce_create_menubar(wce_menubar->parentWindowHandle, (HINSTANCE)qWinAppInst(), 0, SHCMBF_EMPTYBAR);
@@ -547,7 +546,8 @@ void QMenuBarPrivate::_q_updateDefaultAction()
void QMenuBarPrivate::QWceMenuBarPrivate::rebuild()
{
d->q_func()->resize(0,0);
- parentWindowHandle = d->q_func()->parentWidget() ? d->q_func()->parentWidget()->winId() : d->q_func()->winId();
+ parentWindowHandle = d->q_func()->parentWidget() ? QApplicationPrivate::getHWNDForWidget(d->q_func()->parentWidget()) :
+ QApplicationPrivate::getHWNDForWidget(d->q_func());
if (d->wceClassicMenu) {
QList<QAction*> actions = d->actions;
int maxEntries;
@@ -665,4 +665,4 @@ void QMenuBarPrivate::QWceMenuBarPrivate::rebuild()
QT_END_NAMESPACE
#endif //QT_NO_MENUBAR
-#endif //Q_WS_WINCE
+#endif //Q_OS_WINCE
diff --git a/src/widgets/widgets/qmenu_wince.rc b/src/widgets/widgets/qmenu_wince.rc
index 2540d9f43a..497c549137 100644
--- a/src/widgets/widgets/qmenu_wince.rc
+++ b/src/widgets/widgets/qmenu_wince.rc
@@ -4,9 +4,9 @@
#include "winuser.h"
#if defined (_DEBUG) && defined(QT_DLL)
-#include "QtGuid_resource.rc"
+#include "QtWidgetsd_resource.rc"
#elif defined(QT_DLL)
-#include "QtGui_resource.rc"
+#include "QtWidgets_resource.rc"
#endif
#define DIALOGEX DIALOG DISCARDABLE
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index f1269fde0f..d797a4e315 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -55,6 +55,7 @@
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qwhatsthis.h>
+#include <qplatformtheme_qpa.h>
#include "private/qguiapplication_p.h"
#ifndef QT_NO_MENUBAR
@@ -64,7 +65,7 @@
#include "qmenubar_p.h"
#include "qdebug.h"
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
extern bool qt_wince_is_mobile(); //defined in qguifunctions_wce.cpp
#endif
@@ -719,7 +720,7 @@ void QMenuBarPrivate::init()
if (platformMenuBar)
q->hide();
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile()) {
wceCreateMenuBar(q->parentWidget());
if(wce_menubar)
@@ -783,8 +784,7 @@ QMenuBar::~QMenuBar()
delete d->platformMenuBar;
d->platformMenuBar = 0;
-#ifdef Q_WS_WINCE
- Q_D(QMenuBar);
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile())
d->wceDestroyMenuBar();
#endif
@@ -1244,8 +1244,9 @@ void QMenuBar::actionEvent(QActionEvent *e)
d->itemsDirty = true;
if (d->platformMenuBar) {
+#if !defined(Q_OS_WINCE)
QPlatformMenuBar *nativeMenuBar = d->platformMenuBar;
-#if defined(Q_WS_WINCE)
+#else
QMenuBarPrivate::QWceMenuBarPrivate *nativeMenuBar = d->wce_menubar;
#endif
if (!nativeMenuBar)
@@ -1338,7 +1339,7 @@ void QMenuBarPrivate::handleReparent()
if (platformMenuBar)
platformMenuBar->handleReparent(newParent);
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile() && wce_menubar)
wce_menubar->rebuild();
#endif
@@ -1526,7 +1527,7 @@ QRect QMenuBar::actionGeometry(QAction *act) const
QSize QMenuBar::minimumSizeHint() const
{
Q_D(const QMenuBar);
-#if defined(Q_OS_MAC) || defined(Q_WS_WINCE)
+#if defined(Q_OS_MAC) || defined(Q_OS_WINCE)
const bool as_gui_menubar = !isNativeMenuBar();
#else
const bool as_gui_menubar = true;
@@ -1582,7 +1583,7 @@ QSize QMenuBar::minimumSizeHint() const
QSize QMenuBar::sizeHint() const
{
Q_D(const QMenuBar);
-#if defined(Q_OS_MAC) || defined(Q_WS_WINCE)
+#if defined(Q_OS_MAC) || defined(Q_OS_WINCE)
const bool as_gui_menubar = !isNativeMenuBar();
#else
const bool as_gui_menubar = true;
@@ -1641,7 +1642,7 @@ QSize QMenuBar::sizeHint() const
int QMenuBar::heightForWidth(int) const
{
Q_D(const QMenuBar);
-#if defined(Q_OS_MAC) || defined(Q_WS_WINCE)
+#if defined(Q_OS_MAC) || defined(Q_OS_WINCE)
const bool as_gui_menubar = !isNativeMenuBar();
#else
const bool as_gui_menubar = true;
@@ -1838,13 +1839,13 @@ QPlatformMenuBar *QMenuBar::platformMenuBar()
\sa defaultAction()
*/
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void QMenuBar::setDefaultAction(QAction *act)
{
Q_D(QMenuBar);
if (d->defaultAction == act)
return;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile())
if (d->defaultAction) {
disconnect(d->defaultAction, SIGNAL(changed()), this, SLOT(_q_updateDefaultAction()));
@@ -1852,7 +1853,7 @@ void QMenuBar::setDefaultAction(QAction *act)
}
#endif
d->defaultAction = act;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
if (qt_wince_is_mobile())
if (d->defaultAction) {
connect(d->defaultAction, SIGNAL(changed()), this, SLOT(_q_updateDefaultAction()));
diff --git a/src/widgets/widgets/qmenubar.h b/src/widgets/widgets/qmenubar.h
index b20682ef6c..9818526543 100644
--- a/src/widgets/widgets/qmenubar.h
+++ b/src/widgets/widgets/qmenubar.h
@@ -102,7 +102,7 @@ public:
void setCornerWidget(QWidget *w, Qt::Corner corner = Qt::TopRightCorner);
QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void setDefaultAction(QAction *);
QAction *defaultAction() const;
@@ -145,7 +145,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_internalShortcutActivated(int))
Q_PRIVATE_SLOT(d_func(), void _q_updateLayout())
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
Q_PRIVATE_SLOT(d_func(), void _q_updateDefaultAction())
#endif
diff --git a/src/widgets/widgets/qmenubar_p.h b/src/widgets/widgets/qmenubar_p.h
index a15a1e432e..9e1d3179c7 100644
--- a/src/widgets/widgets/qmenubar_p.h
+++ b/src/widgets/widgets/qmenubar_p.h
@@ -57,10 +57,6 @@
#include "QtWidgets/qstyleoption.h"
#include <private/qmenu_p.h> // Mac needs what in this file!
-#ifdef Q_WS_WINCE
-#include "qguifunctions_wince.h"
-#endif
-
QT_BEGIN_NAMESPACE
#ifndef QT_NO_MENUBAR
@@ -73,14 +69,14 @@ public:
closePopupMode(0), defaultPopDown(1), popupState(0), keyboardState(0), altPressed(0),
nativeMenuBar(-1), doChildEffects(false), platformMenuBar(0)
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
, wce_menubar(0), wceClassicMenu(false)
#endif
{ }
~QMenuBarPrivate()
{
delete platformMenuBar;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
delete wce_menubar;
#endif
}
@@ -124,7 +120,7 @@ public:
void _q_internalShortcutActivated(int);
void _q_updateLayout();
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void _q_updateDefaultAction();
#endif
@@ -150,7 +146,7 @@ public:
QBasicTimer autoReleaseTimer;
QPlatformMenuBar *platformMenuBar;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
void wceCreateMenuBar(QWidget *);
void wceDestroyMenuBar();
struct QWceMenuBarPrivate {
@@ -168,6 +164,7 @@ public:
QWceMenuBarPrivate(QMenuBarPrivate *menubar);
~QWceMenuBarPrivate();
+ void addAction(QAction *, QAction *);
void addAction(QAction *, QWceMenuAction* =0);
void addAction(QWceMenuAction *, QWceMenuAction* =0);
void syncAction(QWceMenuAction *);
diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp
index 674a818052..de6cb6a283 100644
--- a/src/widgets/widgets/qplaintextedit.cpp
+++ b/src/widgets/widgets/qplaintextedit.cpp
@@ -2519,11 +2519,13 @@ bool QPlainTextEdit::canPaste() const
\sa QTextDocument::print()
*/
+#ifndef QT_NO_PRINTER
void QPlainTextEdit::print(QPagedPaintDevice *printer) const
{
Q_D(const QPlainTextEdit);
d->control->print(printer);
}
+#endif
/*! \property QPlainTextEdit::tabChangesFocus
\brief whether \gui Tab changes focus or is accepted as input
diff --git a/src/widgets/widgets/qscrollbar.cpp b/src/widgets/widgets/qscrollbar.cpp
index bca5517d8a..cb3126e566 100644
--- a/src/widgets/widgets/qscrollbar.cpp
+++ b/src/widgets/widgets/qscrollbar.cpp
@@ -387,7 +387,7 @@ void QScrollBarPrivate::init()
q->setAttribute(Qt::WA_WState_OwnSizePolicy, false);
q->setAttribute(Qt::WA_OpaquePaintEvent);
-#if !defined(QT_NO_CONTEXTMENU) && defined(Q_WS_WINCE)
+#if !defined(QT_NO_CONTEXTMENU) && defined(Q_OS_WINCE)
if (!q->style()->styleHint(QStyle::SH_ScrollBar_ContextMenu, 0, q)) {
q->setContextMenuPolicy(Qt::PreventContextMenu);
}
diff --git a/src/widgets/widgets/qsizegrip.cpp b/src/widgets/widgets/qsizegrip.cpp
index 145bdf02d4..09557a3c90 100644
--- a/src/widgets/widgets/qsizegrip.cpp
+++ b/src/widgets/widgets/qsizegrip.cpp
@@ -301,7 +301,7 @@ void QSizeGrip::mousePressEvent(QMouseEvent * e)
// Use a native X11 sizegrip for "real" top-level windows if supported.
if (tlw->isWindow() && X11->isSupportedByWM(ATOM(_NET_WM_MOVERESIZE))
&& !(tlw->windowFlags() & Qt::X11BypassWindowManagerHint)
- && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth()) {
+ && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !tlw->hasHeightForWidth()) {
XEvent xev;
xev.xclient.type = ClientMessage;
xev.xclient.message_type = ATOM(_NET_WM_MOVERESIZE);
@@ -323,7 +323,7 @@ void QSizeGrip::mousePressEvent(QMouseEvent * e)
}
#endif // Q_WS_X11
#ifdef Q_OS_WIN
- if (tlw->isWindow() && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth()) {
+ if (tlw->isWindow() && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !tlw->hasHeightForWidth()) {
uint orientation = 0;
if (d->atBottom())
orientation = d->atLeft() ? SZ_SIZEBOTTOMLEFT : SZ_SIZEBOTTOMRIGHT;
@@ -413,11 +413,11 @@ void QSizeGrip::mouseMoveEvent(QMouseEvent * e)
#ifdef Q_WS_X11
if (tlw->isWindow() && X11->isSupportedByWM(ATOM(_NET_WM_MOVERESIZE))
&& tlw->isTopLevel() && !(tlw->windowFlags() & Qt::X11BypassWindowManagerHint)
- && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth())
+ && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !tlw->hasHeightForWidth())
return;
#endif
#ifdef Q_OS_WIN
- if (tlw->isWindow() && qt_getWindowsSystemMenu(tlw) && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth()) {
+ if (tlw->isWindow() && qt_getWindowsSystemMenu(tlw) && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !tlw->hasHeightForWidth()) {
if (const HWND hwnd = QApplicationPrivate::getHWNDForWidget(tlw)) {
MSG msg;
while (PeekMessage(&msg, hwnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE)) ;
diff --git a/src/widgets/widgets/qtabwidget.cpp b/src/widgets/widgets/qtabwidget.cpp
index 66d31e72c7..612d51826c 100644
--- a/src/widgets/widgets/qtabwidget.cpp
+++ b/src/widgets/widgets/qtabwidget.cpp
@@ -186,7 +186,6 @@ public:
void _q_removeTab(int);
void _q_tabMoved(int from, int to);
void init();
- bool hasHeightForWidth() const;
QTabBar *tabs;
QStackedWidget *stack;
@@ -238,11 +237,16 @@ void QTabWidgetPrivate::init()
}
-bool QTabWidgetPrivate::hasHeightForWidth() const
+/*!
+ \reimp
+*/
+
+bool QTabWidget::hasHeightForWidth() const
{
- bool has = size_policy.hasHeightForWidth();
- if (!has && stack)
- has = qt_widget_private(stack)->hasHeightForWidth();
+ Q_D(const QTabWidget);
+ bool has = d->size_policy.hasHeightForWidth();
+ if (!has && d->stack)
+ has = d->stack->hasHeightForWidth();
return has;
}
diff --git a/src/widgets/widgets/qtabwidget.h b/src/widgets/widgets/qtabwidget.h
index 1865ddf897..26d9243eb9 100644
--- a/src/widgets/widgets/qtabwidget.h
+++ b/src/widgets/widgets/qtabwidget.h
@@ -125,6 +125,7 @@ public:
QSize sizeHint() const;
QSize minimumSizeHint() const;
int heightForWidth(int width) const;
+ bool hasHeightForWidth() const;
void setCornerWidget(QWidget * w, Qt::Corner corner = Qt::TopRightCorner);
QWidget * cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const;
diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp
index 002d7860cd..d0065aacb9 100644
--- a/src/widgets/widgets/qtextedit.cpp
+++ b/src/widgets/widgets/qtextedit.cpp
@@ -404,7 +404,7 @@ void QTextEditPrivate::_q_ensureVisible(const QRectF &_rect)
within the text.
If you want to limit the total number of paragraphs in a QTextEdit,
- as it is for example open useful in a log viewer, then you can use
+ as for example it is often useful in a log viewer, then you can use
QTextDocument's maximumBlockCount property for that.
\section2 Read-only Key Bindings
@@ -2264,11 +2264,13 @@ bool QTextEdit::canPaste() const
\sa QTextDocument::print()
*/
+#ifndef QT_NO_PRINTER
void QTextEdit::print(QPagedPaintDevice *printer) const
{
Q_D(const QTextEdit);
d->control->print(printer);
}
+#endif
/*! \property QTextEdit::tabChangesFocus
\brief whether \gui Tab changes focus or is accepted as input
diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp
index c9fe4f7cc2..84cb5fd10c 100644
--- a/src/widgets/widgets/qtoolbar.cpp
+++ b/src/widgets/widgets/qtoolbar.cpp
@@ -1163,7 +1163,7 @@ bool QToolBar::event(QEvent *event)
if (d->mouseMoveEvent(static_cast<QMouseEvent*>(event)))
return true;
break;
-#ifdef Q_WS_WINCE
+#ifdef Q_OS_WINCE
case QEvent::ContextMenu:
{
QContextMenuEvent* contextMenuEvent = static_cast<QContextMenuEvent*>(event);
diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp
index 96389b8333..a2c7915a5e 100644
--- a/src/widgets/widgets/qwidgettextcontrol.cpp
+++ b/src/widgets/widgets/qwidgettextcontrol.cpp
@@ -2441,6 +2441,7 @@ bool QWidgetTextControl::isWordSelectionEnabled() const
return d->wordSelectionEnabled;
}
+#ifndef QT_NO_PRINTER
void QWidgetTextControl::print(QPagedPaintDevice *printer) const
{
Q_D(const QWidgetTextControl);
@@ -2465,6 +2466,7 @@ void QWidgetTextControl::print(QPagedPaintDevice *printer) const
doc->print(printer);
delete tempDoc;
}
+#endif
QMimeData *QWidgetTextControl::createMimeDataFromSelection() const
{
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index c84b1f6319..c16fd03613 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -80,8 +80,6 @@ QT_BEGIN_NAMESPACE
Make a lot of the (mostly empty) methods in the public classes inline.
Specially constructors assignment operators and comparison operators are candidates.
-
- The virtual isXxx functions in *Private can probably be replaced by inline methods checking the nodeType().
*/
/*
@@ -167,19 +165,22 @@ public:
}
// Dynamic cast
- virtual bool isAttr() const { return false; }
- virtual bool isCDATASection() const { return false; }
- virtual bool isDocumentFragment() const { return false; }
- virtual bool isDocument() const { return false; }
- virtual bool isDocumentType() const { return false; }
- virtual bool isElement() const { return false; }
- virtual bool isEntityReference() const { return false; }
- virtual bool isText() const { return false; }
- virtual bool isEntity() const { return false; }
- virtual bool isNotation() const { return false; }
- virtual bool isProcessingInstruction() const { return false; }
- virtual bool isCharacterData() const { return false; }
- virtual bool isComment() const { return false; }
+ bool isAttr() const { return nodeType() == QDomNode::AttributeNode; }
+ bool isCDATASection() const { return nodeType() == QDomNode::CDATASectionNode; }
+ bool isDocumentFragment() const { return nodeType() == QDomNode::DocumentFragmentNode; }
+ bool isDocument() const { return nodeType() == QDomNode::DocumentNode; }
+ bool isDocumentType() const { return nodeType() == QDomNode::DocumentTypeNode; }
+ bool isElement() const { return nodeType() == QDomNode::ElementNode; }
+ bool isEntityReference() const { return nodeType() == QDomNode::EntityReferenceNode; }
+ bool isText() const { return (nodeType() == QDomNode::TextNode)
+ || (nodeType() == QDomNode::CDATASectionNode); }
+ bool isEntity() const { return nodeType() == QDomNode::EntityNode; }
+ bool isNotation() const { return nodeType() == QDomNode::NotationNode; }
+ bool isProcessingInstruction() const { return nodeType() == QDomNode::ProcessingInstructionNode; }
+ bool isCharacterData() const { return (nodeType() == QDomNode::CharacterDataNode)
+ || (nodeType() == QDomNode::TextNode)
+ || (nodeType() == QDomNode::CommentNode); }
+ bool isComment() const { return nodeType() == QDomNode::CommentNode; }
virtual QDomNode::NodeType nodeType() const { return QDomNode::BaseNode; }
@@ -219,7 +220,7 @@ public:
void createList();
QDomNodePrivate* item(int index);
- uint length() const;
+ int length() const;
QAtomicInt ref;
/*
@@ -244,7 +245,7 @@ public:
QDomNodePrivate* setNamedItemNS(QDomNodePrivate* arg);
QDomNodePrivate* removeNamedItem(const QString& name);
QDomNodePrivate* item(int index) const;
- uint length() const;
+ int length() const;
bool contains(const QString& name) const;
bool containsNS(const QString& nsURI, const QString & localName) const;
@@ -296,7 +297,6 @@ public:
QDomNodePrivate* removeChild(QDomNodePrivate* oldChild);
QDomNodePrivate* appendChild(QDomNodePrivate* newChild);
- virtual bool isDocumentType() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::DocumentTypeNode; }
void save(QTextStream& s, int, int) const;
@@ -317,7 +317,6 @@ public:
// Reimplemented from QDomNodePrivate
virtual QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isDocumentFragment() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::DocumentFragmentNode; }
};
@@ -327,7 +326,7 @@ public:
QDomCharacterDataPrivate(QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& data);
QDomCharacterDataPrivate(QDomCharacterDataPrivate* n, bool deep);
- uint dataLength() const;
+ int dataLength() const;
QString substringData(unsigned long offset, unsigned long count) const;
void appendData(const QString& arg);
void insertData(unsigned long offset, const QString& arg);
@@ -335,7 +334,6 @@ public:
void replaceData(unsigned long offset, unsigned long count, const QString& arg);
// Reimplemented from QDomNodePrivate
- virtual bool isCharacterData() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::CharacterDataNode; }
QDomNodePrivate* cloneNode(bool deep = true);
};
@@ -350,7 +348,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isText() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::TextNode; }
virtual void save(QTextStream& s, int, int) const;
};
@@ -367,7 +364,6 @@ public:
// Reimplemented from QDomNodePrivate
void setNodeValue(const QString& v);
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isAttr() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::AttributeNode; }
virtual void save(QTextStream& s, int, int) const;
@@ -401,7 +397,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNamedNodeMapPrivate* attributes() { return m_attr; }
bool hasAttributes() { return (m_attr->length() > 0); }
- virtual bool isElement() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::ElementNode; }
QDomNodePrivate* cloneNode(bool deep = true);
virtual void save(QTextStream& s, int, int) const;
@@ -419,7 +414,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isComment() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::CommentNode; }
virtual void save(QTextStream& s, int, int) const;
};
@@ -432,7 +426,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isCDATASection() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::CDATASectionNode; }
virtual void save(QTextStream& s, int, int) const;
};
@@ -446,7 +439,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isNotation() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::NotationNode; }
virtual void save(QTextStream& s, int, int) const;
@@ -464,7 +456,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isEntity() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::EntityNode; }
virtual void save(QTextStream& s, int, int) const;
@@ -482,7 +473,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- bool isEntityReference() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::EntityReferenceNode; }
virtual void save(QTextStream& s, int, int) const;
};
@@ -496,7 +486,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- virtual bool isProcessingInstruction() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::ProcessingInstructionNode; }
virtual void save(QTextStream& s, int, int) const;
};
@@ -534,7 +523,6 @@ public:
// Reimplemented from QDomNodePrivate
QDomNodePrivate* cloneNode(bool deep = true);
- bool isDocument() const { return true; }
QDomNode::NodeType nodeType() const { return QDomNode::DocumentNode; }
void clear();
@@ -1262,7 +1250,7 @@ QDomNodePrivate* QDomNodeListPrivate::item(int index)
return list.at(index);
}
-uint QDomNodeListPrivate::length() const
+int QDomNodeListPrivate::length() const
{
if (!node_impl)
return 0;
@@ -1394,7 +1382,7 @@ QDomNode QDomNodeList::item(int index) const
/*!
Returns the number of nodes in the list.
*/
-uint QDomNodeList::length() const
+int QDomNodeList::length() const
{
if (!impl)
return 0;
@@ -2668,23 +2656,16 @@ QDomNode QDomNode::namedItem(const QString& name) const
the stream \a str. This function uses \a indent as the amount of
space to indent the node.
- If this node is a document node, the encoding of text stream \a str's encoding is
- set by treating a processing instruction by name "xml" as an XML declaration, if such a one exists,
- and otherwise defaults to UTF-8. XML declarations are not processing instructions, but this
- behavior exists for historical reasons. If this node is not a document node,
- the text stream's encoding is used.
-
If the document contains invalid XML characters or characters that cannot be
encoded in the given encoding, the result and behavior is undefined.
-*/
-void QDomNode::save(QTextStream& str, int indent) const
-{
- save(str, indent, QDomNode::EncodingFromDocument);
-}
-
-/*!
- If \a encodingPolicy is QDomNode::EncodingFromDocument, this function behaves as save(QTextStream &str, int indent).
+ If \a encodingPolicy is QDomNode::EncodingFromDocument and this node is a
+ document node, the encoding of text stream \a str's encoding is set by
+ treating a processing instruction by name "xml" as an XML declaration, if
+ one exists, and otherwise defaults to UTF-8. XML declarations are not
+ processing instructions, but this behavior exists for historical
+ reasons. If this node is not a document node, the text stream's encoding
+ is used.
If \a encodingPolicy is EncodingFromTextStream and this node is a document node, this
function behaves as save(QTextStream &str, int indent) with the exception that the encoding
@@ -2695,15 +2676,15 @@ void QDomNode::save(QTextStream& str, int indent) const
\since 4.2
*/
-void QDomNode::save(QTextStream& str, int indent, EncodingPolicy encodingPolicy) const
+void QDomNode::save(QTextStream& stream, int indent, EncodingPolicy encodingPolicy) const
{
if (!impl)
return;
if(isDocument())
- static_cast<const QDomDocumentPrivate *>(impl)->saveDocument(str, indent, encodingPolicy);
+ static_cast<const QDomDocumentPrivate *>(impl)->saveDocument(stream, indent, encodingPolicy);
else
- IMPL->save(str, 1, indent);
+ IMPL->save(stream, 1, indent);
}
/*!
@@ -2951,7 +2932,7 @@ QDomElement QDomNode::firstChildElement(const QString &tagName) const
/*!
Returns the last child element with tag name \a tagName if tagName is non-empty;
- otherwise returns the first child element. Returns a null element if no
+ otherwise returns the last child element. Returns a null element if no
such child exists.
\sa firstChildElement() previousSiblingElement() nextSiblingElement()
@@ -3162,13 +3143,12 @@ QDomNodePrivate* QDomNamedNodeMapPrivate::removeNamedItem(const QString& name)
QDomNodePrivate* QDomNamedNodeMapPrivate::item(int index) const
{
- if ((uint)index >= length())
+ if (index >= length())
return 0;
return *(map.constBegin() + index);
}
-// ### Qt 5: convert all length/size() functions in QDom to use int instead of uint.
-uint QDomNamedNodeMapPrivate::length() const
+int QDomNamedNodeMapPrivate::length() const
{
return map.count();
}
@@ -3415,7 +3395,7 @@ QDomNode QDomNamedNodeMap::removeNamedItemNS(const QString& nsURI, const QString
\sa item()
*/
-uint QDomNamedNodeMap::length() const
+int QDomNamedNodeMap::length() const
{
if (!impl)
return 0;
@@ -3903,7 +3883,7 @@ QDomNodePrivate* QDomCharacterDataPrivate::cloneNode(bool deep)
return p;
}
-uint QDomCharacterDataPrivate::dataLength() const
+int QDomCharacterDataPrivate::dataLength() const
{
return value.length();
}
@@ -4027,7 +4007,7 @@ void QDomCharacterData::setData(const QString& v)
/*!
Returns the length of the stored string.
*/
-uint QDomCharacterData::length() const
+int QDomCharacterData::length() const
{
if (impl)
return IMPL->dataLength();
@@ -5700,8 +5680,8 @@ QDomNodePrivate* QDomEntityPrivate::cloneNode(bool deep)
static QByteArray encodeEntity(const QByteArray& str)
{
QByteArray tmp(str);
- uint len = tmp.size();
- uint i = 0;
+ int len = tmp.size();
+ int i = 0;
const char* d = tmp.data();
while (i < len) {
if (d[i] == '%'){
@@ -6561,6 +6541,10 @@ void QDomDocumentPrivate::saveDocument(QTextStream& s, const int indent, QDomNod
element is available using documentElement(). The textual
representation of the document can be obtained using toString().
+ \note The DOM tree might end up reserving a lot of memory if the XML
+ document is big. For such documents, the QXmlStreamReader or the
+ QXmlQuery classes might be better solutions.
+
It is possible to insert a node from another document into the
document using importNode().
diff --git a/src/xml/dom/qdom.h b/src/xml/dom/qdom.h
index 8b049b211b..34c4b00636 100644
--- a/src/xml/dom/qdom.h
+++ b/src/xml/dom/qdom.h
@@ -227,8 +227,7 @@ public:
QDomCharacterData toCharacterData() const;
QDomComment toComment() const;
- void save(QTextStream&, int) const;
- void save(QTextStream&, int, EncodingPolicy) const; // ### Qt 5: Merge overload(if we at all keep this)
+ void save(QTextStream&, int, EncodingPolicy=QDomNode::EncodingFromDocument) const;
QDomElement firstChildElement(const QString &tagName = QString()) const;
QDomElement lastChildElement(const QString &tagName = QString()) const;
@@ -264,7 +263,7 @@ public:
inline QDomNode at(int index) const { return item(index); } // Qt API consistency
// DOM read only attributes
- uint length() const;
+ int length() const;
inline int count() const { return length(); } // Qt API consitancy
inline int size() const { return length(); } // Qt API consistency
inline bool isEmpty() const { return length() == 0; } // Qt API consistency
@@ -378,7 +377,7 @@ public:
QDomNode removeNamedItemNS(const QString& nsURI, const QString& localName);
// DOM read only attributes
- uint length() const;
+ int length() const;
int count() const { return length(); } // Qt API consitancy
inline int size() const { return length(); } // Qt API consistency
inline bool isEmpty() const { return length() == 0; } // Qt API consistency
@@ -427,7 +426,7 @@ public:
void replaceData(unsigned long offset, unsigned long count, const QString& arg);
// DOM read only attributes
- uint length() const;
+ int length() const;
// DOM attributes
QString data() const;
diff --git a/sync.profile b/sync.profile
index 446f8f40fa..cc681b0ebe 100644
--- a/sync.profile
+++ b/sync.profile
@@ -77,7 +77,7 @@
);
@ignore_for_master_contents = ( "qt.h", "qpaintdevicedefs.h" );
-@ignore_for_include_check = ( "qatomic.h" );
+@ignore_for_include_check = ( "qsystemdetection.h", "qcompilerdetection.h", "qprocessordetection.h" );
@ignore_for_qt_begin_header_check = ( "qiconset.h", "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qt_windows.h" );
@ignore_for_qt_begin_namespace_check = ( "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qatomic_arch.h", "qatomic_windowsce.h", "qt_windows.h", "qatomic_macosx.h" );
@ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtTest}", "$modules{QtDBus}" );
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 1796fa2db9..63c4ca6a48 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -18,8 +18,8 @@ cross_compile: SUBDIRS -= tools
!contains(QT_CONFIG, opengl): SUBDIRS -= opengl
!unix|embedded|!contains(QT_CONFIG, dbus): SUBDIRS -= dbus
-# disable 'make check' on Mac OS X for the following subdirs for the time being
-mac {
+# disable 'make check' on Mac OS X and Windows for the following subdirs for the time being
+mac|win32 {
network.CONFIG += no_check_target
}
diff --git a/tests/auto/concurrent/qfuture/qfuture.pro b/tests/auto/concurrent/qfuture/qfuture.pro
index a4c706129d..c0fe7ec5a3 100644
--- a/tests/auto/concurrent/qfuture/qfuture.pro
+++ b/tests/auto/concurrent/qfuture/qfuture.pro
@@ -1,5 +1,5 @@
CONFIG += testcase parallel_test
TARGET = tst_qfuture
-QT = concurrent-private testlib concurrent
+QT = core concurrent-private testlib concurrent
SOURCES = tst_qfuture.cpp
DEFINES += QT_STRICT_ITERATORS
diff --git a/tests/auto/concurrent/qfuturewatcher/qfuturewatcher.pro b/tests/auto/concurrent/qfuturewatcher/qfuturewatcher.pro
index 3b8ebda4a4..e9caf5494a 100644
--- a/tests/auto/concurrent/qfuturewatcher/qfuturewatcher.pro
+++ b/tests/auto/concurrent/qfuturewatcher/qfuturewatcher.pro
@@ -1,4 +1,4 @@
CONFIG += testcase parallel_test
TARGET = tst_qfuturewatcher
-QT = concurrent-private testlib concurrent
+QT = core concurrent-private testlib concurrent
SOURCES = tst_qfuturewatcher.cpp
diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
index 7daed397d5..4144e82a29 100644
--- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
+++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
@@ -172,75 +172,72 @@ void tst_QTextCodec::fromUnicode_data()
QTest::addColumn<QString>("codecName");
QTest::addColumn<bool>("eightBit");
- QTest::newRow("data1") << "ISO-8859-1" << true;
- QTest::newRow("data2") << "ISO-8859-2" << true;
- QTest::newRow("data3") << "ISO-8859-3" << true;
- QTest::newRow("data4") << "ISO-8859-4" << true;
- QTest::newRow("data5") << "ISO-8859-5" << true;
- QTest::newRow("data6") << "ISO-8859-6" << true;
- QTest::newRow("data7") << "ISO-8859-7" << true;
- QTest::newRow("data8") << "ISO-8859-8" << true;
- QTest::newRow("data9") << "ISO-8859-9" << true;
- QTest::newRow("data10") << "ISO-8859-10" << true;
- QTest::newRow("data13") << "ISO-8859-13" << true;
- QTest::newRow("data14") << "ISO-8859-14" << true;
- QTest::newRow("data15") << "ISO-8859-15" << true;
- QTest::newRow("data16") << "ISO-8859-16" << true;
-
- QTest::newRow("data18") << "IBM850" << true;
- QTest::newRow("data19") << "IBM874" << true;
- QTest::newRow("data20") << "IBM866" << true;
-
- QTest::newRow("data21") << "windows-1250" << true;
- QTest::newRow("data22") << "windows-1251" << true;
- QTest::newRow("data23") << "windows-1252" << true;
- QTest::newRow("data24") << "windows-1253" << true;
- QTest::newRow("data25") << "windows-1254" << true;
- QTest::newRow("data26") << "windows-1255" << true;
- QTest::newRow("data27") << "windows-1256" << true;
- QTest::newRow("data28") << "windows-1257" << true;
- QTest::newRow("data28") << "windows-1258" << true;
-
- QTest::newRow("data29") << "Apple Roman" << true;
- QTest::newRow("data29") << "WINSAMI2" << true;
- QTest::newRow("data30") << "TIS-620" << true;
- QTest::newRow("data31") << "roman8" << true;
-
- QTest::newRow("data32") << "SJIS" << false;
- QTest::newRow("data33") << "EUC-KR" << false;
+ QTest::newRow("ISO-8859-1") << "ISO-8859-1" << true;
+ QTest::newRow("ISO-8859-2") << "ISO-8859-2" << true;
+ QTest::newRow("ISO-8859-3") << "ISO-8859-3" << true;
+ QTest::newRow("ISO-8859-4") << "ISO-8859-4" << true;
+ QTest::newRow("ISO-8859-5") << "ISO-8859-5" << true;
+ QTest::newRow("ISO-8859-6") << "ISO-8859-6" << true;
+ QTest::newRow("ISO-8859-7") << "ISO-8859-7" << true;
+ QTest::newRow("ISO-8859-8") << "ISO-8859-8" << true;
+ QTest::newRow("ISO-8859-9") << "ISO-8859-9" << true;
+ QTest::newRow("ISO-8859-10") << "ISO-8859-10" << true;
+ QTest::newRow("ISO-8859-13") << "ISO-8859-13" << true;
+ QTest::newRow("ISO-8859-14") << "ISO-8859-14" << true;
+ QTest::newRow("ISO-8859-15") << "ISO-8859-15" << true;
+ QTest::newRow("ISO-8859-16") << "ISO-8859-16" << true;
+
+ QTest::newRow("IBM850") << "IBM850" << true;
+ QTest::newRow("IBM874") << "IBM874" << true;
+ QTest::newRow("IBM866") << "IBM866" << true;
+
+ QTest::newRow("windows-1250") << "windows-1250" << true;
+ QTest::newRow("windows-1251") << "windows-1251" << true;
+ QTest::newRow("windows-1252") << "windows-1252" << true;
+ QTest::newRow("windows-1253") << "windows-1253" << true;
+ QTest::newRow("windows-1254") << "windows-1254" << true;
+ QTest::newRow("windows-1255") << "windows-1255" << true;
+ QTest::newRow("windows-1256") << "windows-1256" << true;
+ QTest::newRow("windows-1257") << "windows-1257" << true;
+ QTest::newRow("windows-1258") << "windows-1258" << true;
+
+ QTest::newRow("Apple Roman") << "Apple Roman" << true;
+ QTest::newRow("WINSAMI2") << "WINSAMI2" << true;
+ QTest::newRow("TIS-620") << "TIS-620" << true;
+ QTest::newRow("roman8") << "roman8" << true;
+ QTest::newRow("SJIS") << "SJIS" << false;
// all codecs from documentation
- QTest::newRow("doc2") << "Big5" << false;
- QTest::newRow("doc3") << "Big5-HKSCS" << false;
- QTest::newRow("doc4") << "CP949" << false;
- QTest::newRow("doc5") << "EUC-JP" << false;
- QTest::newRow("doc6") << "EUC-KR" << false;
- //QTest::newRow("doc7") << "GB18030-0" << false; // only GB18030 works
- QTest::newRow("doc7-bis") << "GB18030" << false;
- QTest::newRow("doc8") << "IBM 850" << false;
- QTest::newRow("doc9") << "IBM 866" << false;
- QTest::newRow("doc10") << "IBM 874" << false;
- QTest::newRow("doc11") << "ISO 2022-JP" << false;
+ QTest::newRow("Big5") << "Big5" << false;
+ QTest::newRow("Big5-HKSCS") << "Big5-HKSCS" << false;
+ QTest::newRow("CP949") << "CP949" << false;
+ QTest::newRow("EUC-JP") << "EUC-JP" << false;
+ QTest::newRow("EUC-KR") << "EUC-KR" << false;
+ //QTest::newRow("GB18030-0") << "GB18030-0" << false; // only GB18030 works
+ QTest::newRow("GB18030") << "GB18030" << false;
+ QTest::newRow("IBM 850") << "IBM 850" << false;
+ QTest::newRow("IBM 866") << "IBM 866" << false;
+ QTest::newRow("IBM 874") << "IBM 874" << false;
+ QTest::newRow("ISO 2022-JP") << "ISO 2022-JP" << false;
//ISO 8859-1 to 10 and ISO 8859-13 to 16 tested previously
// Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml tested in Iscii test
- //QTest::newRow("doc12") << "JIS X 0201" << false; //actually not there
- //QTest::newRow("doc13") << "JIS X 0208" << false; // actually not there
- QTest::newRow("doc14") << "KOI8-R" << false;
- QTest::newRow("doc15") << "KOI8-U" << false;
- //QTest::newRow("doc16") << "MuleLao-1" << false; //only on x11
- QTest::newRow("doc17") << "ROMAN8" << false;
- QTest::newRow("doc18") << "Shift-JIS" << false;
- QTest::newRow("doc19") << "TIS-620" << false;
- QTest::newRow("doc20") << "TSCII" << false;
- QTest::newRow("doc21") << "UTF-8" << false;
- QTest::newRow("doc22") << "UTF-16" << false;
- QTest::newRow("doc23") << "UTF-16BE" << false;
- QTest::newRow("doc24") << "UTF-16LE" << false;
- QTest::newRow("doc25") << "UTF-32" << false;
- QTest::newRow("doc26") << "UTF-32BE" << false;
- QTest::newRow("doc27") << "UTF-32LE" << false;
+ //QTest::newRow("JIS X 0201") << "JIS X 0201" << false; // actually not there
+ //QTest::newRow("JIS X 0208") << "JIS X 0208" << false; // actually not there
+ QTest::newRow("KOI8-R") << "KOI8-R" << false;
+ QTest::newRow("KOI8-U") << "KOI8-U" << false;
+ //QTest::newRow("MuleLao-1") << "MuleLao-1" << false; //only on x11
+ QTest::newRow("ROMAN8") << "ROMAN8" << false;
+ QTest::newRow("Shift-JIS") << "Shift-JIS" << false;
+ QTest::newRow("TIS-620") << "TIS-620" << false;
+ QTest::newRow("TSCII") << "TSCII" << false;
+ QTest::newRow("UTF-8") << "UTF-8" << false;
+ QTest::newRow("UTF-16") << "UTF-16" << false;
+ QTest::newRow("UTF-16BE") << "UTF-16BE" << false;
+ QTest::newRow("UTF-16LE") << "UTF-16LE" << false;
+ QTest::newRow("UTF-32") << "UTF-32" << false;
+ QTest::newRow("UTF-32BE") << "UTF-32BE" << false;
+ QTest::newRow("UTF-32LE") << "UTF-32LE" << false;
//Windows-1250 to 1258 tested previously
- QTest::newRow("doc3") << "WINSAMI2" << false;
}
void tst_QTextCodec::fromUnicode()
@@ -1222,7 +1219,7 @@ void tst_QTextCodec::utf8Codec_data()
utf8.clear();
utf8 += char(0xff);
str = fromInvalidUtf8Sequence(utf8);
- QTest::newRow("http://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html 3.5.1") << utf8 << str << -1;
+ QTest::newRow("http://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html 3.5.2") << utf8 << str << -1;
// 3.5.2
utf8.clear();
@@ -1230,7 +1227,7 @@ void tst_QTextCodec::utf8Codec_data()
utf8 += char(0xfe);
utf8 += char(0xff);
str = fromInvalidUtf8Sequence(utf8);
- QTest::newRow("http://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html 3.5.1") << utf8 << str << -1;
+ QTest::newRow("http://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html 3.5.2-1") << utf8 << str << -1;
// 4.1.1
utf8.clear();
diff --git a/tests/auto/corelib/codecs/utf8/tst_utf8.cpp b/tests/auto/corelib/codecs/utf8/tst_utf8.cpp
index 69b91683d4..e07b7cb239 100644
--- a/tests/auto/corelib/codecs/utf8/tst_utf8.cpp
+++ b/tests/auto/corelib/codecs/utf8/tst_utf8.cpp
@@ -239,7 +239,7 @@ void tst_Utf8::invalidUtf8_data()
QTest::newRow("non-unicode-3") << QByteArray("\xFC\x84\x80\x80\x80\x80");
// 0x7fffffff: 1 11 1111 11 1111 11 1111 11 1111 11 1111
// encoding: xxxx:xxz0 xz00:0100 xz00:0000 xz00:0000 xz00:0001 xz00:0001
- QTest::newRow("non-unicode-3") << QByteArray("\xFD\xBF\xBF\xBF\xBF\xBF");
+ QTest::newRow("non-unicode-4") << QByteArray("\xFD\xBF\xBF\xBF\xBF\xBF");
// As seen above, 0xFE and 0xFF never appear:
QTest::newRow("fe") << QByteArray("\xFE");
@@ -269,9 +269,9 @@ void tst_Utf8::invalidUtf8_data()
// overlong 4: xxxx:z000 xz00:0000 xz00:0010 xz00:0000
QTest::newRow("overlong-2-4") << QByteArray("\xF0\x80\x82\x80");
// overlong 5: xxxx:xz00 xz00:0000 xz00:0000 xz00:0010 xz00:0000
- QTest::newRow("overlong-2-4") << QByteArray("\xF8\x80\x80\x82\x80");
+ QTest::newRow("overlong-2-5") << QByteArray("\xF8\x80\x80\x82\x80");
// overlong 6: xxxx:xxz0 xz00:0000 xz00:0000 xz00:0000 xz00:0010 xz00:0000
- QTest::newRow("overlong-2-4") << QByteArray("\xFC\x80\x80\x80\x82\x80");
+ QTest::newRow("overlong-2-6") << QByteArray("\xFC\x80\x80\x80\x82\x80");
// U+0800: 10 0000 00 0000
// proper encoding: xxxz:0000 xz10:0000 xz00:0000
diff --git a/tests/auto/corelib/corelib.pro b/tests/auto/corelib/corelib.pro
index 4f284ac21e..a85a385f80 100644
--- a/tests/auto/corelib/corelib.pro
+++ b/tests/auto/corelib/corelib.pro
@@ -7,6 +7,7 @@ SUBDIRS=\
itemmodels \
json \
kernel \
+ mimetypes \
plugin \
statemachine \
thread \
diff --git a/tests/auto/corelib/global/global.pro b/tests/auto/corelib/global/global.pro
index a6c638f530..d4293a896c 100644
--- a/tests/auto/corelib/global/global.pro
+++ b/tests/auto/corelib/global/global.pro
@@ -6,4 +6,4 @@ SUBDIRS=\
qglobal \
qnumeric \
qrand \
- qmessagehandler
+ qlogging
diff --git a/tests/auto/corelib/global/qlogging/app/app.pro b/tests/auto/corelib/global/qlogging/app/app.pro
new file mode 100644
index 0000000000..1088d08a58
--- /dev/null
+++ b/tests/auto/corelib/global/qlogging/app/app.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+
+TARGET = app
+QT = core
+
+DESTDIR = ./
+
+CONFIG -= app_bundle
+CONFIG += console
+
+SOURCES += main.cpp
diff --git a/tests/auto/corelib/global/qlogging/app/main.cpp b/tests/auto/corelib/global/qlogging/app/main.cpp
new file mode 100644
index 0000000000..dfa52315c7
--- /dev/null
+++ b/tests/auto/corelib/global/qlogging/app/main.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QCoreApplication>
+
+struct T {
+ T() { qDebug("static constructor"); }
+ ~T() { qDebug("static destructor"); }
+} t;
+
+int main(int argc, char **argv)
+{
+ QCoreApplication app(argc, argv);
+ app.setApplicationName("tst_qlogging");
+
+ qDebug("qDebug");
+ qWarning("qWarning");
+ qCritical("qCritical");
+ return 0;
+}
diff --git a/tests/auto/corelib/global/qlogging/qlogging.pro b/tests/auto/corelib/global/qlogging/qlogging.pro
new file mode 100644
index 0000000000..1d5e7681df
--- /dev/null
+++ b/tests/auto/corelib/global/qlogging/qlogging.pro
@@ -0,0 +1,6 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+
+SUBDIRS += \
+ app \
+ tst_qlogging.pro
diff --git a/tests/auto/corelib/global/qlogging/tst_qlogging.cpp b/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
new file mode 100644
index 0000000000..aaec46fe64
--- /dev/null
+++ b/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
@@ -0,0 +1,674 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qdebug.h>
+#include <qglobal.h>
+#include <QtCore/QProcess>
+#include <QtTest/QtTest>
+
+class tst_qmessagehandler : public QObject
+{
+ Q_OBJECT
+public slots:
+ void initTestCase();
+
+private slots:
+ void cleanup();
+
+ void defaultHandler();
+ void installMessageHandler();
+ void installMsgHandler();
+ void installBothHandler();
+
+ void cleanupFuncinfo_data();
+ void cleanupFuncinfo();
+
+ void qMessagePattern();
+
+private:
+ QString m_appDir;
+};
+
+static QtMsgType s_type;
+const char *s_file;
+int s_line;
+const char *s_function;
+static QString s_message;
+
+void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const char *msg)
+{
+ s_type = type;
+ s_file = context.file;
+ s_line = context.line;
+ s_function = context.function;
+ s_message = QString::fromLocal8Bit(msg);
+}
+
+void customMsgHandler(QtMsgType type, const char *msg)
+{
+ s_type = type;
+ s_file = 0;
+ s_line = 0;
+ s_function = 0;
+ s_message = QString::fromLocal8Bit(msg);
+}
+
+void tst_qmessagehandler::initTestCase()
+{
+ m_appDir = QFINDTESTDATA("app");
+ QVERIFY2(!m_appDir.isEmpty(), qPrintable(
+ QString::fromLatin1("Couldn't find helper app dir starting from %1.").arg(QDir::currentPath())));
+}
+
+void tst_qmessagehandler::cleanup()
+{
+ qInstallMsgHandler(0);
+ qInstallMessageHandler(0);
+ s_type = QtFatalMsg;
+ s_file = 0;
+ s_line = 0;
+ s_function = 0;
+}
+
+void tst_qmessagehandler::defaultHandler()
+{
+ // check that the default works
+ QTest::ignoreMessage(QtDebugMsg, "defaultHandler");
+ qDebug("defaultHandler");
+}
+
+void tst_qmessagehandler::installMessageHandler()
+{
+ QMessageHandler oldHandler = qInstallMessageHandler(customMessageHandler);
+
+ qDebug("installMessageHandler"); int line = __LINE__;
+
+ QCOMPARE(s_type, QtDebugMsg);
+ QCOMPARE(s_message, QString::fromLocal8Bit("installMessageHandler"));
+ QCOMPARE(s_file, __FILE__);
+ QCOMPARE(s_function, Q_FUNC_INFO);
+ QCOMPARE(s_line, line);
+
+ QMessageHandler myHandler = qInstallMessageHandler(oldHandler);
+ QCOMPARE((void*)myHandler, (void*)customMessageHandler);
+}
+
+void tst_qmessagehandler::installMsgHandler()
+{
+ QtMsgHandler oldHandler = qInstallMsgHandler(customMsgHandler);
+
+ qDebug("installMsgHandler");
+
+ QCOMPARE(s_type, QtDebugMsg);
+ QCOMPARE(s_message, QString::fromLocal8Bit("installMsgHandler"));
+ QCOMPARE(s_file, (const char*)0);
+ QCOMPARE(s_function, (const char*)0);
+ QCOMPARE(s_line, 0);
+
+ QtMsgHandler myHandler = qInstallMsgHandler(oldHandler);
+ QCOMPARE((void*)myHandler, (void*)customMsgHandler);
+}
+
+void tst_qmessagehandler::installBothHandler()
+{
+ qInstallMessageHandler(customMessageHandler);
+ qInstallMsgHandler(customMsgHandler);
+
+ qDebug("installBothHandler"); int line = __LINE__;
+
+ QCOMPARE(s_type, QtDebugMsg);
+ QCOMPARE(s_message, QString::fromLocal8Bit("installBothHandler"));
+ QCOMPARE(s_file, __FILE__);
+ QCOMPARE(s_function, Q_FUNC_INFO);
+ QCOMPARE(s_line, line);
+}
+
+# define ADD(x) QTest::newRow(x) << Q_FUNC_INFO << x;
+
+class TestClass1
+{
+public:
+ enum Something { foo };
+ char c;
+
+ void func_void() { ADD("TestClass1::func_void"); }
+ int func_int() { ADD("TestClass1::func_int"); return 0; }
+ unsigned func_unsigned() { ADD("TestClass1::func_unsigned"); return 0; }
+ long func_long() { ADD("TestClass1::func_long"); return 0; }
+ long long func_ll() { ADD("TestClass1::func_ll"); return 0; }
+ unsigned long long func_ull() { ADD("TestClass1::func_ull"); return 0; }
+ char func_char() { ADD("TestClass1::func_char"); return 0; }
+ signed char func_schar() { ADD("TestClass1::func_schar"); return 0; }
+ unsigned char func_uchar() { ADD("TestClass1::func_uchar"); return 0; }
+ char &func_Rchar() { ADD("TestClass1::func_Rchar"); return c; }
+ char *func_Pchar() { ADD("TestClass1::func_Pchar"); return 0; }
+ const char *func_KPchar() { ADD("TestClass1::func_KPchar"); return 0; }
+ const volatile char *func_VKPchar() { ADD("TestClass1::func_VKPchar"); return 0; }
+ const volatile unsigned long long * const volatile func_KVPKVull() { ADD("TestClass1::func_KVPKVull"); return 0; }
+ const void * const volatile *func_KPKVvoid() { ADD("TestClass1::func_KPKVvoid"); return 0; }
+
+ QList<int> func_ai() { ADD("TestClass1::func_ai"); return QList<int>(); }
+ QList<unsigned long long const volatile*> func_aptr() { ADD("TestClass1::func_aptr"); return QList<unsigned long long const volatile*>(); }
+
+ QList<Something> func_aenum() { ADD("TestClass1::func_aenum"); return QList<Something>(); }
+ QList<QList<const void *> > func_aaptr() { ADD("TestClass1::func_aaptr"); return QList<QList<const void *> >(); }
+
+ QMap<int, Something> func_ienummap() { ADD("TestClass1::func_ienummap"); return QMap<int, Something>(); }
+
+ template<typename T>
+ T* func_template1() { ADD("TestClass1::func_template1"); return 0; }
+ template<Something val>
+ long func_template2() { ADD("TestClass1::func_template2"); return long(val); }
+
+ typedef unsigned long long * ( *fptr)();
+ typedef unsigned long long * (TestClass1::* pmf)();
+ typedef fptr (TestClass1::* uglypmf)();
+ fptr func_fptr() { ADD("TestClass1::func_fptr"); return 0; }
+ pmf func_pmf() { ADD("TestClass1::func_pmf"); return 0; }
+ uglypmf func_uglypmf(uglypmf = 0) { ADD("TestClass1::func_uglypmf"); return 0; }
+ QMap<QString, uglypmf> func_uglypmf2() { ADD("TestClass1::func_uglypmf2"); return QMap<QString, uglypmf>(); }
+
+ void operator()() { ADD("TestClass1::operator()"); }
+ int operator<(int) { ADD("TestClass1::operator<"); return 0; }
+ int operator>(int) { ADD("TestClass1::operator>"); return 0; }
+ int operator<=(int) { ADD("TestClass1::operator<="); return 0; }
+ int operator>=(int) { ADD("TestClass1::operator>="); return 0; }
+ int operator=(int) { ADD("TestClass1::operator="); return 0; }
+ int operator+(int) { ADD("TestClass1::operator+"); return 0; }
+ int operator-(int) { ADD("TestClass1::operator-"); return 0; }
+ int operator*(int) { ADD("TestClass1::operator*"); return 0; }
+ int operator/(int) { ADD("TestClass1::operator/"); return 0; }
+ int operator%(int) { ADD("TestClass1::operator%"); return 0; }
+ int x;
+ int &operator++() { ADD("TestClass1::operator++"); return x; }
+ int operator++(int) { ADD("TestClass1::operator++"); return 0; }
+ int &operator--() { ADD("TestClass1::operator--"); return x; }
+ int operator--(int) { ADD("TestClass1::operator--"); return 0; }
+
+public:
+ TestClass1()
+ {
+ // instantiate
+ func_void();
+ func_int();
+ func_unsigned();
+ func_long();
+ func_ll();
+ func_ull();
+ func_char();
+ func_schar();
+ func_uchar();
+ func_Rchar();
+ func_Pchar();
+ func_KPchar();
+ func_VKPchar();
+ func_KVPKVull();
+ func_KPKVvoid();
+ func_ai();
+ func_aptr();
+ func_aenum();
+ func_aaptr();
+ func_ienummap();
+ func_template1<TestClass1>();
+ func_template2<foo>();
+ func_fptr();
+ func_pmf();
+ func_uglypmf();
+ func_uglypmf2();
+ operator()();
+ operator<(0);
+ operator>(0);
+ operator<=(0);
+ operator>=(0);
+ operator=(0);
+ operator+(0);
+ operator-(0);
+ operator*(0);
+ operator/(0);
+ operator%(0);
+ operator++();
+ operator++(0);
+ operator--();
+ operator--(0);
+ }
+};
+
+template<typename T> class TestClass2
+{
+ long func_long() { ADD("TestClass2::func_long"); return 0; }
+ template<typename S>
+ T* func_template1() { ADD("TestClass2::func_template1"); return 0; }
+ template<TestClass1::Something val>
+ long func_template2() { ADD("TestClass2::func_template2"); return long(val); }
+public:
+ TestClass2()
+ {
+ func_long();
+ func_template1<TestClass2>();
+ func_template2<TestClass1::foo>();
+ }
+};
+
+template<typename T, TestClass1::Something v> class TestClass3
+{
+ long func_long() { ADD("TestClass3::func_long"); return 0; }
+ template<typename S>
+ S* func_template1() { ADD("TestClass3::func_template1"); return 0; }
+ template<TestClass1::Something val>
+ long func_template2() { ADD("TestClass3::func_template2"); return long(val); }
+public:
+ struct Foo { TestClass3 foo; };
+ TestClass3()
+ {
+ func_long();
+ func_template1<TestClass2<T> >();
+ func_template2<TestClass1::foo>();
+ }
+};
+
+class TestClass4
+{
+ TestClass1 c1;
+
+ TestClass2<std::map<long, const void *> > func2()
+ { ADD("TestClass4::func2"); return TestClass2<std::map<long, const void *> >(); }
+ TestClass3<std::map<std::list<int>, const void *>, TestClass1::foo>::Foo func3()
+ { ADD("TestClass4::func3"); return TestClass3<std::map<std::list<int>, const void *>, TestClass1::foo>::Foo(); }
+public:
+ TestClass4()
+ {
+ func2();
+ func3();
+ ADD("TestClass4::TestClass4");
+ }
+ ~TestClass4()
+ {
+ ADD("TestClass4::~TestClass4");
+ }
+};
+
+
+void tst_qmessagehandler::cleanupFuncinfo_data()
+{
+#ifndef QT_BUILD_INTERNAL
+ QSKIP("Requires -developer-build");
+#endif
+ QTest::addColumn<QString>("funcinfo");
+ QTest::addColumn<QString>("expected");
+
+ TestClass4 c4;
+
+ QTest::newRow("msvc_01")
+ << "void __thiscall TestClass1::func_void(void)"
+ << "TestClass1::func_void";
+ QTest::newRow("gcc_01")
+ << "void TestClass1::func_void()"
+ << "TestClass1::func_void";
+
+ QTest::newRow("msvc_02")
+ << "int __thiscall TestClass1::func_int(void)"
+ << "TestClass1::func_int";
+ QTest::newRow("gcc_02")
+ << "int TestClass1::func_int()"
+ << "TestClass1::func_int";
+
+ QTest::newRow("msvc_03")
+ << "unsigned int __thiscall TestClass1::func_unsigned(void)"
+ << "TestClass1::func_unsigned";
+ QTest::newRow("gcc_03")
+ << "unsigned int TestClass1::func_unsigned()"
+ << "TestClass1::func_unsigned";
+
+ QTest::newRow("msvc_04")
+ << "long __thiscall TestClass1::func_long(void)"
+ << "TestClass1::func_long";
+ QTest::newRow("gcc_04")
+ << "long int TestClass1::func_long()"
+ << "TestClass1::func_long";
+
+ QTest::newRow("msvc_05")
+ << "__int64 __thiscall TestClass1::func_ll(void)"
+ << "TestClass1::func_ll";
+ QTest::newRow("gcc_05")
+ << "long long int TestClass1::func_ll()"
+ << "TestClass1::func_ll";
+
+ QTest::newRow("msvc_06")
+ << "unsigned __int64 __thiscall TestClass1::func_ull(void)"
+ << "TestClass1::func_ull";
+ QTest::newRow("gcc_06")
+ << "long long unsigned int TestClass1::func_ull()"
+ << "TestClass1::func_ull";
+
+ QTest::newRow("msvc_07")
+ << "char __thiscall TestClass1::func_char(void)"
+ << "TestClass1::func_char";
+ QTest::newRow("gcc_07")
+ << "char TestClass1::func_char()"
+ << "TestClass1::func_char";
+
+ QTest::newRow("msvc_08")
+ << "signed char __thiscall TestClass1::func_schar(void)"
+ << "TestClass1::func_schar";
+ QTest::newRow("gcc_08")
+ << "signed char TestClass1::func_schar()"
+ << "TestClass1::func_schar";
+
+ QTest::newRow("msvc_09")
+ << "unsigned char __thiscall TestClass1::func_uchar(void)"
+ << "TestClass1::func_uchar";
+ QTest::newRow("gcc_09")
+ << "unsigned char TestClass1::func_uchar()"
+ << "TestClass1::func_uchar";
+
+ QTest::newRow("msvc_09a")
+ << "char &__thiscall TestClass1::func_Rchar(void)"
+ << "TestClass1::func_Rchar";
+ QTest::newRow("gcc_09a")
+ << "char& TestClass1::func_Rchar()"
+ << "TestClass1::func_Rchar";
+ QTest::newRow("clang_09a")
+ << "char &TestClass1::func_Rchar()"
+ << "TestClass1::func_Rchar";
+
+ QTest::newRow("msvc_10")
+ << "char *__thiscall TestClass1::func_Pchar(void)"
+ << "TestClass1::func_Pchar";
+ QTest::newRow("gcc_10")
+ << "char* TestClass1::func_Pchar()"
+ << "TestClass1::func_Pchar";
+ QTest::newRow("clang_10")
+ << "char *TestClass1::func_Pchar()"
+ << "TestClass1::func_Pchar";
+
+ QTest::newRow("msvc_11")
+ << "const char *__thiscall TestClass1::func_KPchar(void)"
+ << "TestClass1::func_KPchar";
+ QTest::newRow("gcc_11")
+ << "const char* TestClass1::func_KPchar()"
+ << "TestClass1::func_KPchar";
+
+ QTest::newRow("msvc_12")
+ << "volatile const char *__thiscall TestClass1::func_VKPchar(void)"
+ << "TestClass1::func_VKPchar";
+ QTest::newRow("gcc_12")
+ << "const volatile char* TestClass1::func_VKPchar()"
+ << "TestClass1::func_VKPchar";
+
+ QTest::newRow("msvc_13")
+ << "volatile const unsigned __int64 *volatile const __thiscall TestClass1::func_KVPKVull(void)"
+ << "TestClass1::func_KVPKVull";
+ QTest::newRow("gcc_13")
+ << "const volatile long long unsigned int* const volatile TestClass1::func_KVPKVull()"
+ << "TestClass1::func_KVPKVull";
+
+ QTest::newRow("msvc_14")
+ << "const void *volatile const *__thiscall TestClass1::func_KPKVvoid(void)"
+ << "TestClass1::func_KPKVvoid";
+ QTest::newRow("gcc_14")
+ << "const void* const volatile* TestClass1::func_KPKVvoid()"
+ << "TestClass1::func_KPKVvoid";
+
+ QTest::newRow("msvc_15")
+ << "class QList<int> __thiscall TestClass1::func_ai(void)"
+ << "TestClass1::func_ai";
+ QTest::newRow("gcc_15")
+ << "QList<int> TestClass1::func_ai()"
+ << "TestClass1::func_ai";
+
+ QTest::newRow("msvc_16")
+ << "class QList<unsigned __int64 const volatile *> __thiscall TestClass1::func_aptr(void)"
+ << "TestClass1::func_aptr";
+ QTest::newRow("gcc_16")
+ << "QList<const volatile long long unsigned int*> TestClass1::func_aptr()"
+ << "TestClass1::func_aptr";
+
+ QTest::newRow("msvc_17")
+ << "class QList<enum TestClass1::Something> __thiscall TestClass1::func_aenum(void)"
+ << "TestClass1::func_aenum";
+ QTest::newRow("gcc_17")
+ << "QList<TestClass1::Something> TestClass1::func_aenum()"
+ << "TestClass1::func_aenum";
+
+ QTest::newRow("msvc_18")
+ << "class QList<class QList<void const *> > __thiscall TestClass1::func_aaptr(void)"
+ << "TestClass1::func_aaptr";
+ QTest::newRow("gcc_18")
+ << "QList<QList<const void*> > TestClass1::func_aaptr()"
+ << "TestClass1::func_aaptr";
+
+ QTest::newRow("msvc_19")
+ << "class QMap<int,enum TestClass1::Something> __thiscall TestClass1::func_ienummap(void)"
+ << "TestClass1::func_ienummap";
+ QTest::newRow("gcc_19")
+ << "QMap<int, TestClass1::Something> TestClass1::func_ienummap()"
+ << "TestClass1::func_ienummap";
+
+ QTest::newRow("msvc_20")
+ << "class TestClass1 *__thiscall TestClass1::func_template1<class TestClass1>(void)"
+ << "TestClass1::func_template1";
+ QTest::newRow("gcc_20")
+ << "T* TestClass1::func_template1() [with T = TestClass1]"
+ << "TestClass1::func_template1";
+
+ QTest::newRow("msvc_21")
+ << "long __thiscall TestClass1::func_template2<foo>(void)"
+ << "TestClass1::func_template2";
+ QTest::newRow("gcc_21")
+ << "long int TestClass1::func_template2() [with TestClass1::Something val = foo]"
+ << "TestClass1::func_template2";
+
+ QTest::newRow("msvc_22")
+ << "unsigned __int64 *(__cdecl *__thiscall TestClass1::func_fptr(void))(void)"
+ << "TestClass1::func_fptr";
+ QTest::newRow("gcc_22")
+ << "long long unsigned int* (* TestClass1::func_fptr())()"
+ << "TestClass1::func_fptr";
+
+ QTest::newRow("msvc_23")
+ << "unsigned __int64 *(__thiscall TestClass1::* __thiscall TestClass1::func_pmf(void))(void)"
+ << "TestClass1::func_pmf";
+ QTest::newRow("gcc_23")
+ << "long long unsigned int* (TestClass1::* TestClass1::func_pmf())()"
+ << "TestClass1::func_pmf";
+
+ QTest::newRow("msvc_24")
+ << "unsigned __int64 *(__cdecl *(__thiscall TestClass1::* __thiscall TestClass1::func_uglypmf(unsigned __int64 *(__cdecl *(__thiscall TestClass1::* )(void))(void)))(void))(void)"
+ << "TestClass1::func_uglypmf";
+ QTest::newRow("gcc_24")
+ << "long long unsigned int* (* (TestClass1::* TestClass1::func_uglypmf(long long unsigned int* (* (TestClass1::*)())()))())()"
+ << "TestClass1::func_uglypmf";
+
+ QTest::newRow("msvc_25")
+ << "class QMap<class QString,unsigned __int64 * (__cdecl*(__thiscall TestClass1::*)(void))(void)> __thiscall TestClass1::func_uglypmf2(void)"
+ << "TestClass1::func_uglypmf2";
+ QTest::newRow("gcc_25")
+ << "QMap<QString, long long unsigned int* (* (TestClass1::*)())()> TestClass1::func_uglypmf2()"
+ << "TestClass1::func_uglypmf2";
+
+ QTest::newRow("msvc_26")
+ << "class TestClass2<class std::map<long,void const *,struct std::less<long>,class std::allocator<struct std::pair<long const ,void const *> > > > __thiscall TestClass4::func2(void)"
+ << "TestClass4::func2";
+ QTest::newRow("gcc_26")
+ << "TestClass2<std::map<long int, const void*, std::less<long int>, std::allocator<std::pair<const long int, const void*> > > > TestClass4::func2()"
+ << "TestClass4::func2";
+
+ QTest::newRow("msvc_27")
+ << "long __thiscall TestClass2<class std::map<long,void const *,struct std::less<long>,class std::allocator<struct std::pair<long const ,void const *> > > >::func_long(void)"
+ << "TestClass2::func_long";
+ QTest::newRow("gcc_27")
+ << "long int TestClass2<T>::func_long() [with T = std::map<long int, const void*, std::less<long int>, std::allocator<std::pair<const long int, const void*> > >]"
+ << "TestClass2::func_long";
+
+ QTest::newRow("msvc_28")
+ << "class std::map<long,void const *,struct std::less<long>,class std::allocator<struct std::pair<long const ,void const *> > > *__thiscall TestClass2<class std::map<long,void const *,struct std::less<long>,class std::allocator<struct std::pair<long const ,void const *> > > >::func_template1<class TestClass2<class std::map<long,void const *,struct std::less<long>,class std::allocator<struct std::pair<long const ,void const *> > > >>(void)"
+ << "TestClass2::func_template1";
+ QTest::newRow("gcc_21")
+ << "T* TestClass2<T>::func_template1() [with S = TestClass2<std::map<long int, const void*, std::less<long int>, std::allocator<std::pair<const long int, const void*> > > >, T = std::map<long int, const void*, std::less<long int>, std::allocator<std::pair<const long int, const void*> > >]"
+ << "TestClass2::func_template1";
+
+ QTest::newRow("msvc_29")
+ << "long __thiscall TestClass2<class std::map<long,void const *,struct std::less<long>,class std::allocator<struct std::pair<long const ,void const *> > > >::func_template2<foo>(void)"
+ << "TestClass2::func_template2";
+ QTest::newRow("gcc_29")
+ << "long int TestClass2<T>::func_template2() [with TestClass1::Something val = foo, T = std::map<long int, const void*, std::less<long int>, std::allocator<std::pair<const long int, const void*> > >]"
+ << "TestClass2::func_template2";
+
+ QTest::newRow("msvc_30")
+ << "struct TestClass3<class std::map<class std::list<int,class std::allocator<int> >,void const *,struct std::less<class std::list<int,class std::allocator<int> > >,class std::allocator<struct std::pair<class std::list<int,class std::allocator<int> > const ,void const *> > >,0>::Foo __thiscall TestClass4::func3(void)"
+ << "TestClass4::func3";
+ QTest::newRow("gcc_30")
+ << "TestClass3<std::map<std::list<int, std::allocator<int> >, const void*, std::less<std::list<int, std::allocator<int> > >, std::allocator<std::pair<const std::list<int, std::allocator<int> >, const void*> > >, foo>::Foo TestClass4::func3()"
+ << "TestClass4::func3";
+
+ QTest::newRow("msvc_31")
+ << "long __thiscall TestClass3<class std::map<class std::list<int,class std::allocator<int> >,void const *,struct std::less<class std::list<int,class std::allocator<int> > >,class std::allocator<struct std::pair<class std::list<int,class std::allocator<int> > const ,void const *> > >,0>::func_long(void)"
+ << "TestClass3::func_long";
+ QTest::newRow("gcc_31")
+ << "long int TestClass3<T, v>::func_long() [with T = std::map<std::list<int, std::allocator<int> >, const void*, std::less<std::list<int, std::allocator<int> > >, std::allocator<std::pair<const std::list<int, std::allocator<int> >, const void*> > >, TestClass1::Something v = foo]"
+ << "TestClass3::func_long";
+
+ QTest::newRow("msvc_32")
+ << "class TestClass2<class std::map<class std::list<int,class std::allocator<int> >,void const *,struct std::less<class std::list<int,class std::allocator<int> > >,class std::allocator<struct std::pair<class std::list<int,class std::allocator<int> > const ,void const *> > > > *__thiscall TestClass3<class std::map<class std::list<int,class std::allocator<int> >,void const *,struct std::less<class std::list<int,class std::allocator<int> > >,class std::allocator<struct std::pair<class std::list<int,class std::allocator<int> > const ,void const *> > >,0>::func_template1<class TestClass2<class std::map<class std::list<int,class std::allocator<int> >,void const *,struct std::less<class std::list<int,class std::allocator<int> > >,class std::allocator<struct std::pair<class std::list<int,class std::allocator<int> > const ,void const *> > > >>(void)"
+ << "TestClass3::func_template1";
+ QTest::newRow("gcc_32")
+ << "S* TestClass3<T, v>::func_template1() [with S = TestClass2<std::map<std::list<int, std::allocator<int> >, const void*, std::less<std::list<int, std::allocator<int> > >, std::allocator<std::pair<const std::list<int, std::allocator<int> >, const void*> > > >, T = std::map<std::list<int, std::allocator<int> >, const void*, std::less<std::list<int, std::allocator<int> > >, std::allocator<std::pair<const std::list<int, std::allocator<int> >, const void*> > >, TestClass1::Something v = foo]"
+ << "TestClass3::func_template1";
+
+ QTest::newRow("msvc_33")
+ << "long __thiscall TestClass3<class std::map<class std::list<int,class std::allocator<int> >,void const *,struct std::less<class std::list<int,class std::allocator<int> > >,class std::allocator<struct std::pair<class std::list<int,class std::allocator<int> > const ,void const *> > >,0>::func_template2<foo>(void)"
+ << "TestClass3::func_template2";
+ QTest::newRow("gcc_33")
+ << "long int TestClass3<T, v>::func_template2() [with TestClass1::Something val = foo, T = std::map<std::list<int, std::allocator<int> >, const void*, std::less<std::list<int, std::allocator<int> > >, std::allocator<std::pair<const std::list<int, std::allocator<int> >, const void*> > >, TestClass1::Something v = foo]"
+ << "TestClass3::func_template2";
+
+ QTest::newRow("msvc_34")
+ << "__thiscall TestClass4::TestClass4(void)"
+ << "TestClass4::TestClass4";
+ QTest::newRow("gcc_34")
+ << "TestClass4::TestClass4()"
+ << "TestClass4::TestClass4";
+
+ QTest::newRow("msvc_35")
+ << "__thiscall TestClass4::~TestClass4(void)"
+ << "TestClass4::~TestClass4";
+ QTest::newRow("gcc_35")
+ << "TestClass4::~TestClass4()"
+ << "TestClass4::~TestClass4";
+
+ QTest::newRow("gcc_36")
+ << "void TestClass1::operator()()"
+ << "TestClass1::operator()";
+
+ QTest::newRow("gcc_37")
+ << "long int TestClass1::func_template2() [with TestClass1::Something val = (TestClass1::Something)0u]"
+ << "TestClass1::func_template2";
+
+ QTest::newRow("gcc_38")
+ << "int TestClass1::operator<(int)"
+ << "TestClass1::operator<";
+
+ QTest::newRow("gcc_39")
+ << "int TestClass1::operator>(int)"
+ << "TestClass1::operator>";}
+
+#ifdef QT_BUILD_INTERNAL
+QT_BEGIN_NAMESPACE
+extern QByteArray qCleanupFuncinfo(QByteArray);
+QT_END_NAMESPACE
+#endif
+
+void tst_qmessagehandler::cleanupFuncinfo()
+{
+#ifdef QT_BUILD_INTERNAL
+ QFETCH(QString, funcinfo);
+
+// qDebug() << funcinfo.toLatin1();
+ QByteArray result = qCleanupFuncinfo(funcinfo.toLatin1());
+ QTEST(QString::fromLatin1(result), "expected");
+#endif
+}
+
+void tst_qmessagehandler::qMessagePattern()
+{
+ QProcess process;
+
+ QStringList environment = QProcess::systemEnvironment();
+ // %{file} is tricky because of shadow builds
+ environment.prepend("QT_MESSAGE_PATTERN=\"%{type} %{appname} %{line} %{function} %{message}\"");
+ process.setEnvironment(environment);
+
+ QString appExe = m_appDir + "/app";
+ process.start(appExe);
+ QVERIFY2(process.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(appExe, process.errorString())));
+ process.waitForFinished();
+
+ QByteArray output = process.readAllStandardError();
+// qDebug() << output;
+ QVERIFY(!output.isEmpty());
+
+ QVERIFY(output.contains("debug 45 T::T static constructor"));
+ // we can't be sure whether the QT_MESSAGE_PATTERN is already destructed
+ QVERIFY(output.contains("static destructor"));
+ QVERIFY(output.contains("debug tst_qlogging 54 main qDebug"));
+ QVERIFY(output.contains("warning tst_qlogging 55 main qWarning"));
+ QVERIFY(output.contains("critical tst_qlogging 56 main qCritical"));
+
+ environment = QProcess::systemEnvironment();
+ environment.prepend("QT_MESSAGE_PATTERN=\"PREFIX: %{unknown} %{message}\"");
+ process.setEnvironment(environment);
+
+ process.start(appExe);
+ QVERIFY2(process.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(appExe, process.errorString())));
+ process.waitForFinished();
+
+ output = process.readAllStandardError();
+// qDebug() << output;
+ QVERIFY(!output.isEmpty());
+
+ QVERIFY(output.contains("QT_MESSAGE_PATTERN: Unknown placeholder %{unknown}"));
+ QVERIFY(output.contains("PREFIX: qDebug"));
+}
+
+QTEST_MAIN(tst_qmessagehandler)
+#include "tst_qlogging.moc"
diff --git a/tests/auto/corelib/global/qlogging/tst_qlogging.pro b/tests/auto/corelib/global/qlogging/tst_qlogging.pro
new file mode 100644
index 0000000000..60377e0fdc
--- /dev/null
+++ b/tests/auto/corelib/global/qlogging/tst_qlogging.pro
@@ -0,0 +1,4 @@
+CONFIG += testcase parallel_test
+TARGET = tst_qlogging
+QT = core testlib
+SOURCES = tst_qlogging.cpp
diff --git a/tests/auto/corelib/global/qmessagehandler/qmessagehandler.pro b/tests/auto/corelib/global/qmessagehandler/qmessagehandler.pro
deleted file mode 100644
index 8bdba4bfc4..0000000000
--- a/tests/auto/corelib/global/qmessagehandler/qmessagehandler.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-CONFIG += testcase parallel_test
-TARGET = tst_qmessagehandler
-QT = core testlib
-SOURCES = tst_qmessagehandler.cpp
diff --git a/tests/auto/corelib/global/qmessagehandler/tst_qmessagehandler.cpp b/tests/auto/corelib/global/qmessagehandler/tst_qmessagehandler.cpp
deleted file mode 100644
index 39bd0986a5..0000000000
--- a/tests/auto/corelib/global/qmessagehandler/tst_qmessagehandler.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qdebug.h>
-#include <QtTest/QtTest>
-
-#include <qglobal.h>
-
-class tst_qmessagehandler : public QObject
-{
- Q_OBJECT
-private slots:
- void cleanup();
-
- void defaultHandler();
- void installMessageHandler();
- void installMsgHandler();
- void installBothHandler();
-};
-
-static QtMsgType s_type;
-const char *s_file;
-int s_line;
-const char *s_function;
-static QString s_message;
-
-void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const char *msg)
-{
- s_type = type;
- s_file = context.file;
- s_line = context.line;
- s_function = context.function;
- s_message = QString::fromLocal8Bit(msg);
-}
-
-void customMsgHandler(QtMsgType type, const char *msg)
-{
- s_type = type;
- s_file = 0;
- s_line = 0;
- s_function = 0;
- s_message = QString::fromLocal8Bit(msg);
-}
-
-void tst_qmessagehandler::cleanup()
-{
- qInstallMsgHandler(0);
- qInstallMessageHandler(0);
- s_type = QtFatalMsg;
- s_file = 0;
- s_line = 0;
- s_function = 0;
-}
-
-void tst_qmessagehandler::defaultHandler()
-{
- // check that the default works
- QTest::ignoreMessage(QtDebugMsg, "defaultHandler");
- qDebug("defaultHandler");
-}
-
-void tst_qmessagehandler::installMessageHandler()
-{
- QMessageHandler oldHandler = qInstallMessageHandler(customMessageHandler);
-
- qDebug("installMessageHandler"); int line = __LINE__;
-
- QCOMPARE(s_type, QtDebugMsg);
- QCOMPARE(s_message, QString::fromLocal8Bit("installMessageHandler"));
- QCOMPARE(s_file, __FILE__);
- QCOMPARE(s_function, Q_FUNC_INFO);
- QCOMPARE(s_line, line);
-
- QMessageHandler myHandler = qInstallMessageHandler(oldHandler);
- QCOMPARE((void*)myHandler, (void*)customMessageHandler);
-}
-
-void tst_qmessagehandler::installMsgHandler()
-{
- QtMsgHandler oldHandler = qInstallMsgHandler(customMsgHandler);
-
- qDebug("installMsgHandler");
-
- QCOMPARE(s_type, QtDebugMsg);
- QCOMPARE(s_message, QString::fromLocal8Bit("installMsgHandler"));
- QCOMPARE(s_file, (const char*)0);
- QCOMPARE(s_function, (const char*)0);
- QCOMPARE(s_line, 0);
-
- QtMsgHandler myHandler = qInstallMsgHandler(oldHandler);
- QCOMPARE((void*)myHandler, (void*)customMsgHandler);
-}
-
-void tst_qmessagehandler::installBothHandler()
-{
- qInstallMessageHandler(customMessageHandler);
- qInstallMsgHandler(customMsgHandler);
-
- qDebug("installBothHandler"); int line = __LINE__;
-
- QCOMPARE(s_type, QtDebugMsg);
- QCOMPARE(s_message, QString::fromLocal8Bit("installBothHandler"));
- QCOMPARE(s_file, __FILE__);
- QCOMPARE(s_function, Q_FUNC_INFO);
- QCOMPARE(s_line, line);
-}
-
-QTEST_MAIN(tst_qmessagehandler)
-#include "tst_qmessagehandler.moc"
diff --git a/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp b/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
index 064724e888..899efc11d9 100644
--- a/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
+++ b/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
@@ -72,7 +72,7 @@ void tst_QNumeric::fuzzyCompare_data()
QTest::newRow("mis2") << 0.0 << 10000000.0 << false;
QTest::newRow("mis3") << 0.0 << 0.000000001 << false;
QTest::newRow("mis4") << 100000000.0 << 0.000000001 << false;
- QTest::newRow("mis4") << 0.0000000001 << 0.000000001 << false;
+ QTest::newRow("mis5") << 0.0000000001 << 0.000000001 << false;
}
void tst_QNumeric::fuzzyCompare()
diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
index eb227625a7..79c96fbdc9 100644
--- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
@@ -2680,8 +2680,8 @@ void tst_QDataStream::status_QBitArray_data()
// past end
QTest::newRow("empty") << QByteArray() << (int) QDataStream::ReadPastEnd << QBitArray();
QTest::newRow("badsize 0a") << QByteArray("\x00", 1) << (int) QDataStream::ReadPastEnd << QBitArray();
- QTest::newRow("badsize 0a") << QByteArray("\x00\x00", 2) << (int) QDataStream::ReadPastEnd << QBitArray();
- QTest::newRow("badsize 0a") << QByteArray("\x00\x00\x00", 3) << (int) QDataStream::ReadPastEnd << QBitArray();
+ QTest::newRow("badsize 0b") << QByteArray("\x00\x00", 2) << (int) QDataStream::ReadPastEnd << QBitArray();
+ QTest::newRow("badsize 0c") << QByteArray("\x00\x00\x00", 3) << (int) QDataStream::ReadPastEnd << QBitArray();
QTest::newRow("badsize 1") << QByteArray("\x00\x00\x00\x01", 4) << (int) QDataStream::ReadPastEnd << QBitArray();
QTest::newRow("badsize 2") << QByteArray("\x00\x00\x00\x02", 4) << (int) QDataStream::ReadPastEnd << QBitArray();
QTest::newRow("badsize 3") << QByteArray("\x00\x00\x00\x03", 4) << (int) QDataStream::ReadPastEnd << QBitArray();
diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp
index f1c9015092..6a48d7e60f 100644
--- a/tests/auto/corelib/io/qdir/tst_qdir.cpp
+++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp
@@ -190,6 +190,8 @@ private slots:
void isReadable();
+ void cdBelowRoot();
+
private:
QString m_dataPath;
};
@@ -383,6 +385,10 @@ void tst_QDir::removeRecursively()
void tst_QDir::removeRecursivelyFailure()
{
+#ifdef Q_OS_UNIX
+ if (::getuid() == 0)
+ QSKIP("Running this test as root doesn't make sense");
+#endif
const QString tmpdir = QDir::currentPath() + "/tmpdir/";
const QString path = tmpdir + "undeletable";
QDir().mkpath(path);
@@ -1930,6 +1936,10 @@ void tst_QDir::isRelative()
void tst_QDir::isReadable()
{
+#ifdef Q_OS_UNIX
+ if (::getuid() == 0)
+ QSKIP("Running this test as root doesn't make sense");
+#endif
QDir dir;
QVERIFY(dir.isReadable());
@@ -1942,6 +1952,36 @@ void tst_QDir::isReadable()
#endif
}
+void tst_QDir::cdBelowRoot()
+{
+#if defined (Q_OS_UNIX)
+#define ROOT QString("/")
+#define DIR QString("/tmp")
+#define CD_INTO "tmp"
+#else
+#define ROOT QString::fromLocal8Bit(qgetenv("SystemDrive"))+"/"
+#define DIR QString::fromLocal8Bit(qgetenv("SystemRoot")).replace('\\', '/')
+#define CD_INTO QString::fromLocal8Bit(qgetenv("SystemRoot")).mid(3)
+#endif
+
+ QDir root(ROOT);
+ QVERIFY(!root.cd(".."));
+ QCOMPARE(root.path(), ROOT);
+ QVERIFY(root.cd(CD_INTO));
+ QCOMPARE(root.path(), DIR);
+#ifdef Q_OS_UNIX
+ if (::getuid() == 0)
+ QSKIP("Running this test as root doesn't make sense");
+#endif
+ QDir dir(DIR);
+ QVERIFY(!dir.cd("../.."));
+ QCOMPARE(dir.path(), DIR);
+ QVERIFY(!dir.cd("../abs/../.."));
+ QCOMPARE(dir.path(), DIR);
+ QVERIFY(dir.cd(".."));
+ QCOMPARE(dir.path(), ROOT);
+}
+
QTEST_MAIN(tst_QDir)
#include "tst_qdir.moc"
diff --git a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
index ad61db51d6..d5d490dc29 100644
--- a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
+++ b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
@@ -403,8 +403,11 @@ void tst_QDirIterator::iterateResource()
QDirIterator it(dirName, nameFilters, filters, flags);
QStringList list;
- while (it.hasNext())
- list << it.next();
+ while (it.hasNext()) {
+ const QString dir = it.next();
+ if (!dir.startsWith(":/qt-project.org"))
+ list << dir;
+ }
list.sort();
QStringList sortedEntries = entries;
diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp
index 00e45354ba..d1a0debf4d 100644
--- a/tests/auto/corelib/io/qfile/tst_qfile.cpp
+++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp
@@ -53,7 +53,9 @@
#include <QHostInfo>
#endif
#include <QProcess>
-#ifndef Q_OS_WIN
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#else
# include <sys/types.h>
# include <unistd.h>
#endif
@@ -476,8 +478,16 @@ void tst_QFile::open_data()
QTest::newRow("noreadfile") << QString("noreadfile") << int(QIODevice::ReadOnly)
<< false << QFile::OpenError;
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
- << true << QFile::NoError;
+ //opening devices requires administrative privileges (and elevation).
+ HANDLE hTest = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
+ if (hTest != INVALID_HANDLE_VALUE) {
+ CloseHandle(hTest);
+ QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
+ << true << QFile::NoError;
+ } else {
+ QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
+ << false << QFile::OpenError;
+ }
QTest::newRow("uncFile") << "//" + QtNetworkSettings::winServerName() + "/testshare/test.pri" << int(QIODevice::ReadOnly)
<< true << QFile::NoError;
#endif
@@ -2339,6 +2349,13 @@ void tst_QFile::rename()
QFETCH(QString, destination);
QFETCH(bool, result);
+#if defined(Q_OS_UNIX)
+ if (strcmp(QTest::currentDataTag(), "renamefile -> /etc/renamefile") == 0) {
+ if (::getuid() == 0)
+ QSKIP("Running this test as root doesn't make sense");
+ }
+#endif
+
QFile::remove("renamedfile");
QFile f("renamefile");
f.open(QFile::WriteOnly);
@@ -3011,25 +3028,28 @@ void tst_QFile::openStandardStreamsBufferedStreams()
{
QFile in;
in.open(stdin, QIODevice::ReadOnly);
+ if (!in.isSequential())
+ QSKIP("Standard input redirected.");
QCOMPARE( in.pos(), (qint64)0 );
QCOMPARE( in.size(), (qint64)0 );
- QVERIFY( in.isSequential() );
}
{
QFile out;
out.open(stdout, QIODevice::WriteOnly);
+ if (!out.isSequential())
+ QSKIP("Standard output redirected.");
QCOMPARE( out.pos(), (qint64)0 );
QCOMPARE( out.size(), (qint64)0 );
- QVERIFY( out.isSequential() );
}
{
QFile err;
err.open(stderr, QIODevice::WriteOnly);
+ if (!err.isSequential())
+ QSKIP("Standard error redirected.");
QCOMPARE( err.pos(), (qint64)0 );
QCOMPARE( err.size(), (qint64)0 );
- QVERIFY( err.isSequential() );
}
}
diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
index 7b80152b62..797d5ff5e3 100644
--- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
@@ -159,8 +159,8 @@ private slots:
void isBundle_data();
void isBundle();
- void isLocalFs_data();
- void isLocalFs();
+ void isNativePath_data();
+ void isNativePath();
void refresh();
@@ -1222,10 +1222,13 @@ void tst_QFileInfo::isBundle()
QCOMPARE(fi.isBundle(), isBundle);
}
-void tst_QFileInfo::isLocalFs_data()
+void tst_QFileInfo::isNativePath_data()
{
QTest::addColumn<QString>("path");
- QTest::addColumn<bool>("isLocalFs");
+ QTest::addColumn<bool>("isNativePath");
+
+ QTest::newRow("default-constructed") << QString() << false;
+ QTest::newRow("empty") << QString("") << true;
QTest::newRow("local root") << QString::fromLatin1("/") << true;
QTest::newRow("local non-existent file") << QString::fromLatin1("/abrakadabra.boo") << true;
@@ -1233,17 +1236,15 @@ void tst_QFileInfo::isLocalFs_data()
QTest::newRow("qresource root") << QString::fromLatin1(":/") << false;
}
-void tst_QFileInfo::isLocalFs()
+void tst_QFileInfo::isNativePath()
{
QFETCH(QString, path);
- QFETCH(bool, isLocalFs);
+ QFETCH(bool, isNativePath);
QFileInfo info(path);
- QFileInfoPrivate *privateInfo = getPrivate(info);
- QCOMPARE((privateInfo->fileEngine == 0), isLocalFs);
- if (privateInfo->fileEngine)
- QCOMPARE(bool(privateInfo->fileEngine->fileFlags(QAbstractFileEngine::LocalDiskFlag)
- & QAbstractFileEngine::LocalDiskFlag), isLocalFs);
+ if (path.isNull())
+ info = QFileInfo();
+ QCOMPARE(info.isNativePath(), isNativePath);
}
void tst_QFileInfo::refresh()
@@ -1722,7 +1723,13 @@ void tst_QFileInfo::group()
#if defined(Q_OS_UNIX)
struct group *gr;
gid_t gid = getegid();
+
+ errno = 0;
gr = getgrgid(gid);
+
+ QVERIFY2(gr, qPrintable(
+ QString("getgrgid returned 0: %1, cannot determine my own group")
+ .arg(QString::fromLocal8Bit(strerror(errno)))));
expected = QString::fromLocal8Bit(gr->gr_name);
#endif
diff --git a/tests/auto/corelib/io/qfilesystementry/tst_qfilesystementry.cpp b/tests/auto/corelib/io/qfilesystementry/tst_qfilesystementry.cpp
index fe2e30a95c..b083d3b1c3 100644
--- a/tests/auto/corelib/io/qfilesystementry/tst_qfilesystementry.cpp
+++ b/tests/auto/corelib/io/qfilesystementry/tst_qfilesystementry.cpp
@@ -241,15 +241,15 @@ void tst_QFileSystemEntry::suffix_data()
QTest::newRow("data1") << "file.tar.gz" << "gz";
QTest::newRow("data2") << "/path/file/file.tar.gz" << "gz";
QTest::newRow("data3") << "/path/file.tar" << "tar";
- QTest::newRow("hidden1") << ".ext1" << "ext1";
- QTest::newRow("hidden1") << ".ext" << "ext";
- QTest::newRow("hidden1") << ".ex" << "ex";
- QTest::newRow("hidden1") << ".e" << "e";
- QTest::newRow("hidden2") << ".ext1.ext2" << "ext2";
- QTest::newRow("hidden2") << ".ext.ext2" << "ext2";
- QTest::newRow("hidden2") << ".ex.ext2" << "ext2";
- QTest::newRow("hidden2") << ".e.ext2" << "ext2";
- QTest::newRow("hidden2") << "..ext2" << "ext2";
+ QTest::newRow("hidden1-1") << ".ext1" << "ext1";
+ QTest::newRow("hidden1-2") << ".ext" << "ext";
+ QTest::newRow("hidden1-3") << ".ex" << "ex";
+ QTest::newRow("hidden1-4") << ".e" << "e";
+ QTest::newRow("hidden2-1") << ".ext1.ext2" << "ext2";
+ QTest::newRow("hidden2-2") << ".ext.ext2" << "ext2";
+ QTest::newRow("hidden2-3") << ".ex.ext2" << "ext2";
+ QTest::newRow("hidden2-4") << ".e.ext2" << "ext2";
+ QTest::newRow("hidden2-5") << "..ext2" << "ext2";
QTest::newRow("dots") << "/path/file.with.dots/file..ext2" << "ext2";
QTest::newRow("dots2") << "/path/file.with.dots/.file..ext2" << "ext2";
}
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro b/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
index e712a6ad5f..8ada44fdf7 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
+++ b/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
@@ -2,5 +2,3 @@ CONFIG += testcase parallel_test
TARGET = tst_qfilesystemwatcher
QT = core testlib
SOURCES = tst_qfilesystemwatcher.cpp
-
-mac: CONFIG += insignificant_test # QTBUG-22744
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
index 5e5a99f937..8caccb6da9 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
+++ b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
@@ -42,6 +42,7 @@
#include <QCoreApplication>
+#include <QTemporaryDir>
#include <QFileSystemWatcher>
#ifdef Q_OS_LINUX
@@ -52,9 +53,15 @@
# endif
#endif
+/* All tests need to run in temporary directories not used
+ * by the application to avoid non-deterministic failures on Windows
+ * due to locked directories and left-overs from previous tests. */
+
class tst_QFileSystemWatcher : public QObject
{
Q_OBJECT
+public:
+ tst_QFileSystemWatcher();
private slots:
void basicTest_data();
@@ -75,11 +82,20 @@ private slots:
void removeFileAndUnWatch();
- void cleanup();
-
void destroyAfterQCoreApplication();
+
+private:
+ QString m_tempDirPattern;
};
+tst_QFileSystemWatcher::tst_QFileSystemWatcher()
+{
+ m_tempDirPattern = QDir::tempPath();
+ if (!m_tempDirPattern.endsWith(QLatin1Char('/')))
+ m_tempDirPattern += QLatin1Char('/');
+ m_tempDirPattern += QStringLiteral("tst_qfilesystemwatcherXXXXXX");
+}
+
void tst_QFileSystemWatcher::basicTest_data()
{
QTest::addColumn<QString>("backend");
@@ -92,7 +108,9 @@ void tst_QFileSystemWatcher::basicTest()
QFETCH(QString, backend);
// create test file
- QFile testFile("testfile.txt");
+ QTemporaryDir temporaryDirectory(m_tempDirPattern);
+ QVERIFY(temporaryDirectory.isValid());
+ QFile testFile(temporaryDirectory.path() + QStringLiteral("/testfile.txt"));
testFile.setPermissions(QFile::ReadOwner | QFile::WriteOwner);
testFile.remove();
QVERIFY(testFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
@@ -151,14 +169,16 @@ void tst_QFileSystemWatcher::basicTest()
QCOMPARE(changedSpy.count(), 0);
// readd the file watch with a relative path
- QVERIFY(watcher.addPath(testFile.fileName().prepend("./")));
+ const QString relativeTestFileName = QDir::current().relativeFilePath(testFile.fileName());
+ QVERIFY(!relativeTestFileName.isEmpty());
+ QVERIFY(watcher.addPath(relativeTestFileName));
testFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
testFile.write(QByteArray("hello multiverse!"));
testFile.close();
QTRY_VERIFY(changedSpy.count() > 0);
- QVERIFY(watcher.removePath(testFile.fileName().prepend("./")));
+ QVERIFY(watcher.removePath(relativeTestFileName));
changedSpy.clear();
@@ -222,15 +242,21 @@ void tst_QFileSystemWatcher::watchDirectory()
{
QFETCH(QString, backend);
- QDir().mkdir("testDir");
- QDir testDir("testDir");
+ QTemporaryDir temporaryDirectory(m_tempDirPattern);
+ QVERIFY(temporaryDirectory.isValid());
+
+ QDir temporaryDir(temporaryDirectory.path());
+ const QString testDirName = QStringLiteral("testDir");
+ QVERIFY(temporaryDir.mkdir(testDirName));
+ QDir testDir = temporaryDir;
+ QVERIFY(testDir.cd(testDirName));
QString testFileName = testDir.filePath("testFile.txt");
QFile::remove(testFileName);
QFileSystemWatcher watcher;
watcher.setObjectName(QLatin1String("_qt_autotest_force_engine_") + backend);
- QVERIFY(watcher.addPath(testDir.dirName()));
+ QVERIFY(watcher.addPath(testDir.absolutePath()));
QSignalSpy changedSpy(&watcher, SIGNAL(directoryChanged(const QString &)));
QVERIFY(changedSpy.isValid());
@@ -246,7 +272,7 @@ void tst_QFileSystemWatcher::watchDirectory()
QString fileName;
// remove the watch, should not get notification of a new file
- QVERIFY(watcher.removePath(testDir.dirName()));
+ QVERIFY(watcher.removePath(testDir.absolutePath()));
QVERIFY(testFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
testFile.close();
@@ -256,7 +282,7 @@ void tst_QFileSystemWatcher::watchDirectory()
QCOMPARE(changedSpy.count(), 0);
- QVERIFY(watcher.addPath(testDir.dirName()));
+ QVERIFY(watcher.addPath(testDir.absolutePath()));
// remove the file again, should get a signal from the watcher
QVERIFY(testFile.remove());
@@ -265,7 +291,7 @@ void tst_QFileSystemWatcher::watchDirectory()
eventLoop.exec();
// remove the directory, should get a signal from the watcher
- QVERIFY(QDir().rmdir("testDir"));
+ QVERIFY(temporaryDir.rmdir(testDirName));
// waiting max 5 seconds for notification for directory removal to trigger
#ifdef Q_OS_WINCE
@@ -276,15 +302,16 @@ void tst_QFileSystemWatcher::watchDirectory()
QCOMPARE(changedSpy.at(1).count(), 1);
fileName = changedSpy.at(0).at(0).toString();
- QCOMPARE(fileName, testDir.dirName());
+ QCOMPARE(fileName, testDir.absolutePath());
fileName = changedSpy.at(1).at(0).toString();
- QCOMPARE(fileName, testDir.dirName());
+ QCOMPARE(fileName, testDir.absolutePath());
changedSpy.clear();
// recreate the file, we should not get any notification
- if (!QDir().mkdir("testDir"))
- QSKIP("Failed to recreate directory, skipping final test.");
+ if (!temporaryDir.mkdir(testDirName))
+ QSKIP(qPrintable(QString::fromLatin1("Failed to recreate directory '%1' under '%2', skipping final test.").
+ arg(testDirName, temporaryDir.absolutePath())));
// waiting max 5 seconds for notification for dir recreation to trigger
timer.start(5000);
@@ -292,7 +319,7 @@ void tst_QFileSystemWatcher::watchDirectory()
QCOMPARE(changedSpy.count(), 0);
- QVERIFY(QDir().rmdir("testDir"));
+ QVERIFY(temporaryDir.rmdir(testDirName));
}
void tst_QFileSystemWatcher::addPath()
@@ -360,8 +387,15 @@ void tst_QFileSystemWatcher::removePaths()
void tst_QFileSystemWatcher::watchFileAndItsDirectory()
{
QFETCH(QString, backend);
- QDir().mkdir("testDir");
- QDir testDir("testDir");
+
+ QTemporaryDir temporaryDirectory(m_tempDirPattern);
+ QVERIFY(temporaryDirectory.isValid());
+
+ QDir temporaryDir(temporaryDirectory.path());
+ const QString testDirName = QStringLiteral("testDir");
+ QVERIFY(temporaryDir.mkdir(testDirName));
+ QDir testDir = temporaryDir;
+ QVERIFY(testDir.cd(testDirName));
QString testFileName = testDir.filePath("testFile.txt");
QString secondFileName = testDir.filePath("testFile2.txt");
@@ -378,7 +412,7 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory()
QFileSystemWatcher watcher;
watcher.setObjectName(QLatin1String("_qt_autotest_force_engine_") + backend);
- QVERIFY(watcher.addPath(testDir.dirName()));
+ QVERIFY(watcher.addPath(testDir.absolutePath()));
QVERIFY(watcher.addPath(testFileName));
QSignalSpy fileChangedSpy(&watcher, SIGNAL(fileChanged(const QString &)));
@@ -398,6 +432,11 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory()
testFile.write(QByteArray("hello again"));
testFile.close();
+#ifdef Q_OS_MAC
+ // wait again for the file's atime to be updated
+ QTest::qWait(2000);
+#endif
+
QTRY_VERIFY(fileChangedSpy.count() > 0);
//according to Qt 4 documentation:
@@ -443,17 +482,7 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory()
QCOMPARE(fileChangedSpy.count(), 0);
QCOMPARE(dirChangedSpy.count(), 1);
- QVERIFY(QDir().rmdir("testDir"));
-}
-
-void tst_QFileSystemWatcher::cleanup()
-{
- QDir testDir("testDir");
- QString testFileName = testDir.filePath("testFile.txt");
- QString secondFileName = testDir.filePath("testFile2.txt");
- QFile::remove(testFileName);
- QFile::remove(secondFileName);
- QDir().rmdir("testDir");
+ QVERIFY(temporaryDir.rmdir(testDirName));
}
void tst_QFileSystemWatcher::nonExistingFile()
@@ -475,22 +504,33 @@ void tst_QFileSystemWatcher::nonExistingFile()
void tst_QFileSystemWatcher::removeFileAndUnWatch()
{
- static const char * const filename = "foo.txt";
+ QTemporaryDir temporaryDirectory(m_tempDirPattern);
+ QVERIFY(temporaryDirectory.isValid());
+
+ const QString filename = temporaryDirectory.path() + QStringLiteral("/foo.txt");
+
QFileSystemWatcher watcher;
{
QFile testFile(filename);
- testFile.open(QIODevice::WriteOnly);
+ QVERIFY2(testFile.open(QIODevice::WriteOnly),
+ qPrintable(QString::fromLatin1("Cannot open %1 for writing: %2").arg(filename, testFile.errorString())));
testFile.close();
}
QVERIFY(watcher.addPath(filename));
QFile::remove(filename);
- QVERIFY(watcher.removePath(filename));
+ /* There are potential race conditions here; the watcher thread might remove the file from its list
+ * before the call to watcher.removePath(), which then fails. When that happens, the auto-signal
+ * notification to remove the file from the watcher's main list will not be delivered before the next
+ * event loop such that the call to watcher.addPath() fails since the file is still in the main list. */
+ if (!watcher.removePath(filename))
+ QSKIP("Skipping remaining test due to race condition.");
{
QFile testFile(filename);
- testFile.open(QIODevice::WriteOnly);
+ QVERIFY2(testFile.open(QIODevice::WriteOnly),
+ qPrintable(QString::fromLatin1("Cannot open %1 for writing: %2").arg(filename, testFile.errorString())));
testFile.close();
}
QVERIFY(watcher.addPath(filename));
diff --git a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp
index fa72083dcc..796282d6d8 100644
--- a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp
+++ b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp
@@ -92,6 +92,7 @@ void tst_QResourceEngine::checkStructure_data()
<< QString()
<< (QStringList() << "search_file.txt")
<< (QStringList() << QLatin1String("aliasdir") << QLatin1String("otherdir")
+ << QLatin1String("qt-project.org")
<< QLatin1String("runtime_resource")
<< QLatin1String("searchpath1") << QLatin1String("searchpath2")
<< QLatin1String("secondary_root")
diff --git a/tests/auto/corelib/io/qsettings/qsettings.pro b/tests/auto/corelib/io/qsettings/qsettings.pro
index ed3be0f23f..9de476fe13 100644
--- a/tests/auto/corelib/io/qsettings/qsettings.pro
+++ b/tests/auto/corelib/io/qsettings/qsettings.pro
@@ -6,4 +6,4 @@ RESOURCES += qsettings.qrc
win32-msvc*:LIBS += advapi32.lib
-mac: CONFIG += insignificant_test # QTBUG-22745
+win32: CONFIG += insignificant_test # QTBUG-24145
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index 0d6443c5ac..df8e97ab9c 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -580,6 +580,9 @@ void tst_QSettings::ctor()
QCoreApplication::instance()->setOrganizationName("");
QCoreApplication::instance()->setApplicationName("");
QSettings settings;
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("native", "Default settings on Mac are valid, despite organization domain, name, and app name being null", Continue);
+#endif
QCOMPARE(settings.status(), QSettings::AccessError);
QCoreApplication::instance()->setOrganizationName("software.org");
QCoreApplication::instance()->setApplicationName("KillerAPP");
@@ -592,6 +595,9 @@ void tst_QSettings::ctor()
}
QSettings settings(format, QSettings::UserScope, "", "");
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("native", "Default settings on Mac are valid, despite organization domain, name, and app name being null", Continue);
+#endif
QCOMPARE(settings.status(), QSettings::AccessError);
QSettings settings2(format, QSettings::UserScope, "software.org", "KillerAPP");
QCOMPARE(settings2.status(), QSettings::NoError);
diff --git a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
index 1e288e2418..ebfd640dfb 100644
--- a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
+++ b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
@@ -229,6 +229,11 @@ void tst_qstandardpaths::testRuntimeDirectory()
void tst_qstandardpaths::testCustomRuntimeDirectory()
{
+#if defined(Q_OS_UNIX)
+ if (::getuid() == 0)
+ QSKIP("Running this test as root doesn't make sense");
+#endif
+
#ifdef Q_XDG_PLATFORM
qputenv("XDG_RUNTIME_DIR", QFile::encodeName("/tmp"));
// It's very unlikely that /tmp is 0600 or that we can chmod it
diff --git a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp
index 46d2fa2bde..0b2e1e1902 100644
--- a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp
+++ b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp
@@ -50,6 +50,10 @@
#ifdef Q_OS_WIN
# include <windows.h>
#endif
+#ifdef Q_OS_UNIX // for geteuid()
+# include <sys/types.h>
+# include <unistd.h>
+#endif
class tst_QTemporaryDir : public QObject
{
diff --git a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
index 01aecc2a21..37a1556cf9 100644
--- a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
+++ b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
@@ -2755,7 +2755,7 @@ void tst_QTextStream::double_write_with_flags_data()
QTest::newRow("inf uppercase") << qInf() << QString("INF") << (int)QTextStream::UppercaseDigits << 0;
QTest::newRow("-inf uppercase") << -qInf() << QString("-INF") << (int)QTextStream::UppercaseDigits << 0;
QTest::newRow("nan") << qQNaN() << QString("nan") << 0 << 0;
- QTest::newRow("nan") << qQNaN() << QString("NAN") << (int)QTextStream::UppercaseDigits << 0;
+ QTest::newRow("NAN") << qQNaN() << QString("NAN") << (int)QTextStream::UppercaseDigits << 0;
QTest::newRow("scientific") << 1.234567e+02 << QString("1.234567e+02") << 0 << (int)QTextStream::ScientificNotation;
QTest::newRow("scientific2") << 1.234567e+02 << QString("1.234567e+02") << (int)QTextStream::UppercaseBase << (int)QTextStream::ScientificNotation;
QTest::newRow("scientific uppercase") << 1.234567e+02 << QString("1.234567E+02") << (int)QTextStream::UppercaseDigits << (int)QTextStream::ScientificNotation;
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 611847852f..a74d817b8a 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -350,6 +350,8 @@ void tst_QUrl::setUrl()
QVERIFY(url.authority().isEmpty());
QVERIFY(url.fragment().isEmpty());
QCOMPARE(url.port(), -1);
+ QCOMPARE(url.toString(), QString::fromLatin1("file:///"));
+ QCOMPARE(url.toDisplayString(), QString::fromLatin1("file:///"));
}
{
@@ -363,6 +365,8 @@ void tst_QUrl::setUrl()
QCOMPARE(url.host(), QString::fromLatin1("www.foo.bar"));
QCOMPARE(url.authority(), QString::fromLatin1("www.foo.bar:80"));
QCOMPARE(url.port(), 80);
+ QCOMPARE(url.toString(), QString::fromLatin1("http://www.foo.bar:80"));
+ QCOMPARE(url.toDisplayString(), QString::fromLatin1("http://www.foo.bar:80"));
QUrl url2("//www1.foo.bar");
QCOMPARE(url.resolved(url2).toString(), QString::fromLatin1("http://www1.foo.bar"));
@@ -379,6 +383,8 @@ void tst_QUrl::setUrl()
QCOMPARE(url.host(), QString::fromLatin1("56::56:56:56:127.0.0.1"));
QCOMPARE(url.authority(), QString::fromLatin1("user:pass@[56::56:56:56:127.0.0.1]:99"));
QCOMPARE(url.port(), 99);
+ QCOMPARE(url.url(), QString::fromLatin1("http://user:pass@[56::56:56:56:127.0.0.1]:99"));
+ QCOMPARE(url.toDisplayString(), QString::fromLatin1("http://user@[56::56:56:56:127.0.0.1]:99"));
}
{
@@ -3114,8 +3120,8 @@ void tst_QUrl::fromUserInput_data()
QTest::newRow("port-0") << "example.org:80" << portUrl;
QTest::newRow("port-1") << "http://example.org:80" << portUrl;
portUrl.setPath("path");
- QTest::newRow("port-1") << "example.org:80/path" << portUrl;
- QTest::newRow("port-1") << "http://example.org:80/path" << portUrl;
+ QTest::newRow("port-2") << "example.org:80/path" << portUrl;
+ QTest::newRow("port-3") << "http://example.org:80/path" << portUrl;
// mailto doesn't have a ://, but is valid
QUrl mailto("ben@example.net");
diff --git a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
index 2ca5df477b..8d451dbff9 100644
--- a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
@@ -1257,13 +1257,13 @@ void tst_QAbstractItemModel::testMoveToGrandParent_data()
QTest::newRow("move09") << 8 << 8 << 8;
// Moving to the row of my parent and its neighbours doesn't confuse things
- QTest::newRow("move09") << 8 << 8 << 4;
- QTest::newRow("move10") << 8 << 8 << 5;
- QTest::newRow("move11") << 8 << 8 << 6;
+ QTest::newRow("move10") << 8 << 8 << 4;
+ QTest::newRow("move11") << 8 << 8 << 5;
+ QTest::newRow("move12") << 8 << 8 << 6;
// Moving everything from one parent to another
- QTest::newRow("move12") << 0 << 9 << 10;
- QTest::newRow("move13") << 0 << 9 << 0;
+ QTest::newRow("move13") << 0 << 9 << 10;
+ QTest::newRow("move14") << 0 << 9 << 0;
}
void tst_QAbstractItemModel::testMoveToGrandParent()
@@ -1397,14 +1397,14 @@ void tst_QAbstractItemModel::testMoveToSibling_data()
QTest::newRow("move09") << 8 << 8 << 8;
// Moving to the row of my target and its neighbours doesn't confuse things
- QTest::newRow("move09") << 8 << 8 << 4;
- QTest::newRow("move10") << 8 << 8 << 5;
- QTest::newRow("move11") << 8 << 8 << 6;
+ QTest::newRow("move10") << 8 << 8 << 4;
+ QTest::newRow("move11") << 8 << 8 << 5;
+ QTest::newRow("move12") << 8 << 8 << 6;
// Move such that the destination parent no longer valid after the move.
// The destination parent is always QMI(5, 0), but after this move the
// row count is 5, so (5, 0) (used internally in QAIM) no longer refers to a valid index.
- QTest::newRow("move12") << 0 << 4 << 0;
+ QTest::newRow("move13") << 0 << 4 << 0;
}
void tst_QAbstractItemModel::testMoveToSibling()
@@ -1541,12 +1541,12 @@ void tst_QAbstractItemModel::testMoveToUncle_data()
QTest::newRow("move09") << 8 << 8 << 8;
// Moving to the row of my parent and its neighbours doesn't confuse things
- QTest::newRow("move09") << 8 << 8 << 4;
- QTest::newRow("move10") << 8 << 8 << 5;
- QTest::newRow("move11") << 8 << 8 << 6;
+ QTest::newRow("move10") << 8 << 8 << 4;
+ QTest::newRow("move11") << 8 << 8 << 5;
+ QTest::newRow("move12") << 8 << 8 << 6;
// Moving everything from one parent to another
- QTest::newRow("move12") << 0 << 9 << 10;
+ QTest::newRow("move13") << 0 << 9 << 10;
}
void tst_QAbstractItemModel::testMoveToUncle()
@@ -1734,22 +1734,22 @@ void tst_QAbstractItemModel::testMoveWithinOwnRange_data()
QTest::newRow("move07") << 0 << 5 << 4;
QTest::newRow("move08") << 0 << 5 << 5;
QTest::newRow("move09") << 0 << 5 << 6;
- QTest::newRow("move08") << 3 << 5 << 5;
- QTest::newRow("move08") << 3 << 5 << 6;
- QTest::newRow("move09") << 4 << 5 << 5;
- QTest::newRow("move10") << 4 << 5 << 6;
- QTest::newRow("move11") << 5 << 5 << 5;
- QTest::newRow("move12") << 5 << 5 << 6;
- QTest::newRow("move13") << 5 << 9 << 9;
- QTest::newRow("move14") << 5 << 9 << 10;
- QTest::newRow("move15") << 6 << 9 << 9;
- QTest::newRow("move16") << 6 << 9 << 10;
- QTest::newRow("move17") << 7 << 9 << 9;
- QTest::newRow("move18") << 7 << 9 << 10;
- QTest::newRow("move19") << 8 << 9 << 9;
- QTest::newRow("move20") << 8 << 9 << 10;
- QTest::newRow("move21") << 9 << 9 << 9;
- QTest::newRow("move22") << 0 << 9 << 10;
+ QTest::newRow("move10") << 3 << 5 << 5;
+ QTest::newRow("move11") << 3 << 5 << 6;
+ QTest::newRow("move12") << 4 << 5 << 5;
+ QTest::newRow("move13") << 4 << 5 << 6;
+ QTest::newRow("move14") << 5 << 5 << 5;
+ QTest::newRow("move15") << 5 << 5 << 6;
+ QTest::newRow("move16") << 5 << 9 << 9;
+ QTest::newRow("move17") << 5 << 9 << 10;
+ QTest::newRow("move18") << 6 << 9 << 9;
+ QTest::newRow("move19") << 6 << 9 << 10;
+ QTest::newRow("move20") << 7 << 9 << 9;
+ QTest::newRow("move21") << 7 << 9 << 10;
+ QTest::newRow("move22") << 8 << 9 << 9;
+ QTest::newRow("move23") << 8 << 9 << 10;
+ QTest::newRow("move24") << 9 << 9 << 9;
+ QTest::newRow("move25") << 0 << 9 << 10;
}
void tst_QAbstractItemModel::testMoveWithinOwnRange()
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
index cbe7da11ad..d27d685f37 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
@@ -779,19 +779,19 @@ void tst_QItemModel::remove_data()
makeTestRow(":none at the middle", MIDDLE, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
makeTestRow(":none at the end", END, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", -99, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", 9999, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", -99, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", 9999, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", -99, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", 9999, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
-
- makeTestRow(":valid start, invalid count", START, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", MIDDLE, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", END, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", START, 9999, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", MIDDLE, 9999, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", END, 9999, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 1", -99, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 2", 9999, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 3", -99, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 4", 9999, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 5", -99, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 6", 9999, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+
+ makeTestRow(":valid start, invalid count 1", START, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 2", MIDDLE, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 3", END, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 4", START, 9999, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 5", MIDDLE, 9999, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 6", END, 9999, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
// Recursive remove's might assert, haven't decided yet...
//makeTestRow(":one at the start recursivly", START, DEFAULTCOUNT, 2, DNS, 2, DNS, RECURSIVE, START, DEFAULTCOUNT, FAIL);
@@ -1126,16 +1126,16 @@ void tst_QItemModel::insert_data()
makeTestRow(":none at the middle", MIDDLE, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
makeTestRow(":none at the end", END, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", -99, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", 9999, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", -99, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", 9999, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", -99, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":invalid start, valid count", 9999, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 1", -99, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 2", 9999, 0, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 3", -99, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 4", 9999, 1, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 5", -99, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":invalid start, valid count 6", 9999, MANY, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", START, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", MIDDLE, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
- makeTestRow(":valid start, invalid count", END, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 1", START, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 2", MIDDLE, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
+ makeTestRow(":valid start, invalid count 3", END, -2, NOSIGNALS, NOSIGNALS, NOSIGNALS, NOSIGNALS, !RECURSIVE, 0, 0, FAIL);
// Recursive insert's might assert, haven't decided yet...
//makeTestRow(":one at the start recursivly", START, DEFAULTCOUNT, 2, DNS, 2, DNS, RECURSIVE, START, DEFAULTCOUNT, FAIL);
diff --git a/tests/auto/corelib/json/json.pro b/tests/auto/corelib/json/json.pro
index 5158b7337a..7978a74278 100644
--- a/tests/auto/corelib/json/json.pro
+++ b/tests/auto/corelib/json/json.pro
@@ -3,6 +3,6 @@ QT = core testlib
CONFIG -= app_bundle
CONFIG += testcase
-DEFINES += SRCDIR=\\\"$$PWD/\\\"
+TESTDATA += test.json test.bjson test3.json test2.json
SOURCES += tst_qtjson.cpp
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index e35f645ef6..2ac0574ec5 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -92,6 +92,7 @@ private Q_SLOTS:
void toJson();
void fromJson();
+ void fromJsonErrors();
void fromBinary();
void toAndFromBinary_data();
void toAndFromBinary();
@@ -111,6 +112,8 @@ private Q_SLOTS:
void testCompaction();
void testDebugStream();
void testCompactionError();
+private:
+ QString testDataDir;
};
TestQtJson::TestQtJson(QObject *parent) : QObject(parent)
@@ -119,6 +122,9 @@ TestQtJson::TestQtJson(QObject *parent) : QObject(parent)
void TestQtJson::initTestCase()
{
+ testDataDir = QFileInfo(QFINDTESTDATA("test.json")).absolutePath();
+ if (testDataDir.isEmpty())
+ testDataDir = QCoreApplication::applicationDirPath();
}
void TestQtJson::cleanupTestCase()
@@ -1075,9 +1081,173 @@ void TestQtJson::fromJson()
}
}
+void TestQtJson::fromJsonErrors()
+{
+ {
+ QJsonParseError error;
+ QByteArray json = "{\n \n\n";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::UnterminatedObject);
+ QCOMPARE(error.offset, 8);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "{\n \"key\" 10\n";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::MissingNameSeparator);
+ QCOMPARE(error.offset, 13);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \n\n";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::UnterminatedArray);
+ QCOMPARE(error.offset, 8);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n 1, true\n\n";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::UnterminatedArray);
+ QCOMPARE(error.offset, 14);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n 1 true\n\n";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::MissingValueSeparator);
+ QCOMPARE(error.offset, 7);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n nul";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalValue);
+ QCOMPARE(error.offset, 7);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n nulzz";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalValue);
+ QCOMPARE(error.offset, 10);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n tru";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalValue);
+ QCOMPARE(error.offset, 7);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n trud]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalValue);
+ QCOMPARE(error.offset, 10);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n fal";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalValue);
+ QCOMPARE(error.offset, 7);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n falsd]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalValue);
+ QCOMPARE(error.offset, 11);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n 11111";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::EndOfNumber);
+ QCOMPARE(error.offset, 11);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n -1E10000]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalNumber);
+ QCOMPARE(error.offset, 14);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n -1e-10000]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::IllegalNumber);
+ QCOMPARE(error.offset, 15);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \"\\u12\"]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::StringEscapeSequence);
+ QCOMPARE(error.offset, 11);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \"foo\uffffbar\"]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::StringUTF8Scan);
+ QCOMPARE(error.offset, 13);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \"";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::EndOfString);
+ QCOMPARE(error.offset, 8);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \"cЂa\\u12\"]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::StringEscapeSequence);
+ QCOMPARE(error.offset, 15);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \"cЂa\uffffbar\"]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::StringUTF8Scan);
+ QCOMPARE(error.offset, 14);
+ }
+ {
+ QJsonParseError error;
+ QByteArray json = "[\n \"cЂa ]";
+ QJsonDocument doc = QJsonDocument::fromJson(json, &error);
+ QVERIFY(doc.isEmpty());
+ QCOMPARE(error.error, QJsonParseError::EndOfString);
+ QCOMPARE(error.offset, 14);
+ }
+}
+
void TestQtJson::fromBinary()
{
- QFile file(QLatin1String(SRCDIR "test.json"));
+ QFile file(testDataDir + "/test.json");
file.open(QFile::ReadOnly);
QByteArray testJson = file.readAll();
@@ -1086,7 +1256,7 @@ void TestQtJson::fromBinary()
QVERIFY(!outdoc.isNull());
QVERIFY(doc == outdoc);
- QFile bfile(QLatin1String(SRCDIR "test.bjson"));
+ QFile bfile(testDataDir + "/test.bjson");
bfile.open(QFile::ReadOnly);
QByteArray binary = bfile.readAll();
@@ -1099,8 +1269,8 @@ void TestQtJson::fromBinary()
void TestQtJson::toAndFromBinary_data()
{
QTest::addColumn<QString>("filename");
- QTest::newRow("test.json") << QString::fromLatin1(SRCDIR "test.json");
- QTest::newRow("test2.json") << QString::fromLatin1(SRCDIR "test2.json");
+ QTest::newRow("test.json") << (testDataDir + "/test.json");
+ QTest::newRow("test2.json") << (testDataDir + "/test2.json");
}
void TestQtJson::toAndFromBinary()
@@ -1279,7 +1449,7 @@ void TestQtJson::parseDuplicateKeys()
void TestQtJson::testParser()
{
- QFile file(QLatin1String(SRCDIR "test.json"));
+ QFile file(testDataDir + "/test.json");
file.open(QFile::ReadOnly);
QByteArray testJson = file.readAll();
@@ -1364,7 +1534,7 @@ void TestQtJson::compactObject()
void TestQtJson::validation()
{
// this basically tests that we don't crash on corrupt data
- QFile file(QLatin1String(SRCDIR "test.json"));
+ QFile file(testDataDir + "/test.json");
QVERIFY(file.open(QFile::ReadOnly));
QByteArray testJson = file.readAll();
QVERIFY(!testJson.isEmpty());
@@ -1385,7 +1555,7 @@ void TestQtJson::validation()
}
- QFile file2(QLatin1String(SRCDIR "test3.json"));
+ QFile file2(testDataDir + "/test3.json");
file2.open(QFile::ReadOnly);
testJson = file2.readAll();
QVERIFY(!testJson.isEmpty());
diff --git a/tests/auto/corelib/kernel/kernel.pro b/tests/auto/corelib/kernel/kernel.pro
index 3c697f4149..7ec01d4a36 100644
--- a/tests/auto/corelib/kernel/kernel.pro
+++ b/tests/auto/corelib/kernel/kernel.pro
@@ -1,10 +1,12 @@
TEMPLATE=subdirs
SUBDIRS=\
qcoreapplication \
+ qeventdispatcher \
qeventloop \
qmath \
qmetaobject \
qmetaobjectbuilder \
+ qmetamethod \
qmetaproperty \
qmetatype \
qmimedata \
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
index 97c9757107..572c2fdfd1 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
+++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
@@ -126,6 +126,9 @@ void tst_QCoreApplication::qAppName()
void tst_QCoreApplication::argc()
{
+#ifdef Q_OS_WIN
+ QSKIP("QCoreApplication::arguments() always parses arguments from actual command line in Windows, making this test invalid.");
+#endif
{
int argc = 1;
char *argv[] = { "tst_qcoreapplication" };
diff --git a/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro b/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
new file mode 100644
index 0000000000..ff048d0429
--- /dev/null
+++ b/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
@@ -0,0 +1,4 @@
+CONFIG += testcase
+TARGET = tst_qeventdispatcher
+QT = core testlib
+SOURCES += tst_qeventdispatcher.cpp
diff --git a/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp b/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
new file mode 100644
index 0000000000..bc6d6bfadd
--- /dev/null
+++ b/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
@@ -0,0 +1,213 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifdef QT_GUI_LIB
+# include <QtGui/QGuiApplication>
+#else
+# include <QtCore/QCoreApplication>
+#endif
+#include <QtTest/QtTest>
+
+enum {
+ PreciseTimerInterval = 10,
+ CoarseTimerInterval = 200,
+ VeryCoarseTimerInterval = 1000
+};
+
+class tst_QEventDispatcher : public QObject
+{
+ Q_OBJECT
+
+ QAbstractEventDispatcher *eventDispatcher;
+ int receivedEventType;
+ int timerIdFromEvent;
+
+protected:
+ bool event(QEvent *e);
+
+public:
+ inline tst_QEventDispatcher()
+ : QObject(),
+ eventDispatcher(QAbstractEventDispatcher::instance(thread())),
+ receivedEventType(-1),
+ timerIdFromEvent(-1)
+ { }
+
+private slots:
+ void initTestCase();
+ void registerTimer();
+ /* void registerSocketNotifier(); */ // Not implemented here, see tst_QSocketNotifier instead
+ /* void registerEventNotifiier(); */ // Not implemented here, see tst_QWinEventNotifier instead
+ void sendPostedEvents_data();
+ void sendPostedEvents();
+};
+
+bool tst_QEventDispatcher::event(QEvent *e)
+{
+ switch (receivedEventType = e->type()) {
+ case QEvent::Timer:
+ {
+ timerIdFromEvent = static_cast<QTimerEvent *>(e)->timerId();
+ return true;
+ }
+ default:
+ break;
+ }
+ return QObject::event(e);
+}
+
+// drain the system event queue after the test starts to avoid destabilizing the test functions
+void tst_QEventDispatcher::initTestCase()
+{
+ QElapsedTimer elapsedTimer;
+ elapsedTimer.start();
+ while (!elapsedTimer.hasExpired(CoarseTimerInterval) && eventDispatcher->processEvents(QEventLoop::AllEvents)) {
+ ;
+ }
+}
+
+// test that the eventDispatcher's timer implementation is complete and working
+void tst_QEventDispatcher::registerTimer()
+{
+#define FIND_TIMERS() \
+ do { \
+ foundPrecise = false; \
+ foundCoarse = false; \
+ foundVeryCoarse = false; \
+ for (int i = 0; i < registeredTimers.count(); ++i) { \
+ const QAbstractEventDispatcher::TimerInfo &timerInfo = registeredTimers.at(i); \
+ if (timerInfo.timerId == preciseTimerId) { \
+ QCOMPARE(timerInfo.interval, int(PreciseTimerInterval)); \
+ QCOMPARE(timerInfo.timerType, Qt::PreciseTimer); \
+ foundPrecise = true; \
+ } else if (timerInfo.timerId == coarseTimerId) { \
+ QCOMPARE(timerInfo.interval, int(CoarseTimerInterval)); \
+ QCOMPARE(timerInfo.timerType, Qt::CoarseTimer); \
+ foundCoarse = true; \
+ } else if (timerInfo.timerId == veryCoarseTimerId) { \
+ QCOMPARE(timerInfo.interval, int(VeryCoarseTimerInterval)); \
+ QCOMPARE(timerInfo.timerType, Qt::VeryCoarseTimer); \
+ foundVeryCoarse = true; \
+ } \
+ } \
+ } while (0)
+
+ // start 3 timers, each with the different timer types and different intervals
+ int preciseTimerId = eventDispatcher->registerTimer(PreciseTimerInterval, Qt::PreciseTimer, this);
+ int coarseTimerId = eventDispatcher->registerTimer(CoarseTimerInterval, Qt::CoarseTimer, this);
+ int veryCoarseTimerId = eventDispatcher->registerTimer(VeryCoarseTimerInterval, Qt::VeryCoarseTimer, this);
+ QVERIFY(preciseTimerId > 0);
+ QVERIFY(coarseTimerId > 0);
+ QVERIFY(veryCoarseTimerId > 0);
+
+ // check that all 3 are present in the eventDispatcher's registeredTimer() list
+ QList<QAbstractEventDispatcher::TimerInfo> registeredTimers = eventDispatcher->registeredTimers(this);
+ QCOMPARE(registeredTimers.count(), 3);
+ bool foundPrecise, foundCoarse, foundVeryCoarse;
+ FIND_TIMERS();
+ QVERIFY(foundPrecise && foundCoarse && foundVeryCoarse);
+
+ // process events, waiting for the next event... this should only fire the precise timer
+ receivedEventType = -1;
+ timerIdFromEvent = -1;
+ QVERIFY(eventDispatcher->processEvents(QEventLoop::WaitForMoreEvents));
+ QCOMPARE(receivedEventType, int(QEvent::Timer));
+ QCOMPARE(timerIdFromEvent, preciseTimerId);
+ // now unregister it and make sure it's gone
+ eventDispatcher->unregisterTimer(preciseTimerId);
+ registeredTimers = eventDispatcher->registeredTimers(this);
+ QCOMPARE(registeredTimers.count(), 2);
+ FIND_TIMERS();
+ QVERIFY(!foundPrecise && foundCoarse && foundVeryCoarse);
+
+ // do the same again for the coarse timer
+ receivedEventType = -1;
+ timerIdFromEvent = -1;
+ QVERIFY(eventDispatcher->processEvents(QEventLoop::WaitForMoreEvents));
+ QCOMPARE(receivedEventType, int(QEvent::Timer));
+ QCOMPARE(timerIdFromEvent, coarseTimerId);
+ // now unregister it and make sure it's gone
+ eventDispatcher->unregisterTimer(coarseTimerId);
+ registeredTimers = eventDispatcher->registeredTimers(this);
+ QCOMPARE(registeredTimers.count(), 1);
+ FIND_TIMERS();
+ QVERIFY(!foundPrecise && !foundCoarse && foundVeryCoarse);
+
+ // not going to wait for the VeryCoarseTimer, would take too long, just unregister it
+ eventDispatcher->unregisterTimers(this);
+ registeredTimers = eventDispatcher->registeredTimers(this);
+ QVERIFY(registeredTimers.isEmpty());
+
+#undef FIND_TIMERS
+}
+
+void tst_QEventDispatcher::sendPostedEvents_data()
+{
+ QTest::addColumn<int>("processEventsFlagsInt");
+
+ QTest::newRow("WaitForMoreEvents") << int(QEventLoop::WaitForMoreEvents);
+ QTest::newRow("AllEvents") << int(QEventLoop::AllEvents);
+}
+
+// test that the eventDispatcher sends posted events correctly
+void tst_QEventDispatcher::sendPostedEvents()
+{
+ QFETCH(int, processEventsFlagsInt);
+ QEventLoop::ProcessEventsFlags processEventsFlags = QEventLoop::ProcessEventsFlags(processEventsFlagsInt);
+
+ QElapsedTimer elapsedTimer;
+ elapsedTimer.start();
+ while (!elapsedTimer.hasExpired(200)) {
+ receivedEventType = -1;
+ QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+
+ // event shouldn't be delivered as a result of posting
+ QCOMPARE(receivedEventType, -1);
+
+ // since there is a pending posted event, this should not actually block, it should send the posted event and return
+ QVERIFY(eventDispatcher->processEvents(processEventsFlags));
+ // event shouldn't be delivered as a result of posting
+ QCOMPARE(receivedEventType, int(QEvent::User));
+ }
+}
+
+QTEST_MAIN(tst_QEventDispatcher)
+#include "tst_qeventdispatcher.moc"
diff --git a/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro b/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
new file mode 100644
index 0000000000..f909742748
--- /dev/null
+++ b/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
@@ -0,0 +1,5 @@
+CONFIG += testcase
+TARGET = tst_qmetamethod
+QT = core testlib
+SOURCES = tst_qmetamethod.cpp
+macx:CONFIG -= app_bundle
diff --git a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
new file mode 100644
index 0000000000..1651d00738
--- /dev/null
+++ b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
@@ -0,0 +1,630 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+
+#include <qobject.h>
+#include <qmetaobject.h>
+
+class tst_QMetaMethod : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void method_data();
+ void method();
+
+ void invalidMethod();
+};
+
+struct CustomType { };
+Q_DECLARE_METATYPE(CustomType)
+
+struct CustomUnregisteredType { };
+
+Q_DECLARE_METATYPE(QMetaMethod::Access)
+Q_DECLARE_METATYPE(QMetaMethod::MethodType)
+
+class MethodTestObject : public QObject
+{
+ Q_OBJECT
+public:
+ Q_INVOKABLE MethodTestObject();
+ Q_INVOKABLE MethodTestObject(int constructorIntArg);
+ Q_INVOKABLE MethodTestObject(qreal constructorQRealArg);
+ Q_INVOKABLE MethodTestObject(const QString &constructorQStringArg);
+ Q_INVOKABLE MethodTestObject(CustomType constructorCustomTypeArg);
+ Q_INVOKABLE MethodTestObject(CustomUnregisteredType constructorCustomUnregisteredTypeArg);
+ Q_INVOKABLE MethodTestObject(bool boolArg, int intArg, uint uintArg,
+ qlonglong longlongArg, qulonglong ulonglongArg,
+ double doubleArg, long longArg, short shortArg,
+ char charArg, ulong ulongArg, ushort ushortArg,
+ uchar ucharArg, float floatArg);
+ Q_INVOKABLE MethodTestObject(bool, int);
+
+ Q_INVOKABLE void voidInvokable();
+ Q_INVOKABLE void voidInvokableInt(int voidInvokableIntArg);
+ Q_INVOKABLE void voidInvokableQReal(qreal voidInvokableQRealArg);
+ Q_INVOKABLE void voidInvokableQString(const QString &voidInvokableQStringArg);
+ Q_INVOKABLE void voidInvokableCustomType(CustomType voidInvokableCustomTypeArg);
+ Q_INVOKABLE void voidInvokableCustomUnregisteredType(CustomUnregisteredType voidInvokableCustomUnregisteredTypeArg);
+ Q_INVOKABLE bool boolInvokable();
+ Q_INVOKABLE qreal qrealInvokable();
+ Q_INVOKABLE QString qstringInvokable();
+ Q_INVOKABLE CustomType customTypeInvokable();
+ Q_INVOKABLE CustomUnregisteredType customUnregisteredTypeInvokable();
+ Q_INVOKABLE QVariant qvariantInvokableBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat(
+ bool boolArg, int intArg, uint uintArg, qlonglong longlongArg, qulonglong ulonglongArg, double doubleArg,
+ long longArg, short shortArg, char charArg, ulong ulongArg, ushort ushortArg, uchar ucharArg, float floatArg);
+ Q_INVOKABLE void voidInvokableNoParameterNames(bool, int);
+public slots:
+ void voidSlot();
+ void voidSlotInt(int voidSlotIntArg);
+ void voidSlotQReal(qreal voidSlotQRealArg);
+ void voidSlotQString(const QString &voidSlotQStringArg);
+ void voidSlotCustomType(CustomType voidSlotCustomTypeArg);
+ void voidSlotCustomUnregisteredType(CustomUnregisteredType voidSlotCustomUnregisteredTypeArg);
+ bool boolSlot();
+ qreal qrealSlot();
+ QString qstringSlot();
+ CustomType customTypeSlot();
+ CustomUnregisteredType customUnregisteredTypeSlot();
+ QVariant qvariantSlotBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat(
+ bool boolArg, int intArg, uint uintArg, qlonglong longlongArg, qulonglong ulonglongArg, double doubleArg,
+ long longArg, short shortArg, char charArg, ulong ulongArg, ushort ushortArg, uchar ucharArg, float floatArg);
+ void voidSlotNoParameterNames(bool, int);
+signals:
+ void voidSignal();
+ void voidSignalInt(int voidSignalIntArg);
+ void voidSignalQReal(qreal voidSignalQRealArg);
+ void voidSignalQString(const QString &voidSignalQStringArg);
+ void voidSignalCustomType(CustomType voidSignalCustomTypeArg);
+ void voidSignalCustomUnregisteredType(CustomUnregisteredType voidSignalCustomUnregisteredTypeArg);
+ bool boolSignal();
+ qreal qrealSignal();
+ QString qstringSignal();
+ CustomType customTypeSignal();
+ CustomUnregisteredType customUnregisteredTypeSignal();
+ QVariant qvariantSignalBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat(
+ bool boolArg, int intArg, uint uintArg, qlonglong longlongArg, qulonglong ulonglongArg, double doubleArg,
+ long longArg, short shortArg, char charArg, ulong ulongArg, ushort ushortArg, uchar ucharArg, float floatArg);
+ void voidSignalNoParameterNames(bool, int);
+};
+
+MethodTestObject::MethodTestObject() {}
+MethodTestObject::MethodTestObject(int) {}
+MethodTestObject::MethodTestObject(qreal) {}
+MethodTestObject::MethodTestObject(const QString &) {}
+MethodTestObject::MethodTestObject(CustomType) {}
+MethodTestObject::MethodTestObject(CustomUnregisteredType) {}
+MethodTestObject::MethodTestObject(bool, int, uint, qlonglong, qulonglong,
+ double, long, short, char, ulong, ushort,
+ uchar, float) {}
+MethodTestObject::MethodTestObject(bool, int) {}
+
+void MethodTestObject::voidInvokable() {}
+void MethodTestObject::voidInvokableInt(int) {}
+void MethodTestObject::voidInvokableQReal(qreal) {}
+void MethodTestObject::voidInvokableQString(const QString &) {}
+void MethodTestObject::voidInvokableCustomType(CustomType) {}
+void MethodTestObject::voidInvokableCustomUnregisteredType(CustomUnregisteredType) {}
+bool MethodTestObject::boolInvokable() { return true; }
+qreal MethodTestObject::qrealInvokable() { return 1.0; }
+QString MethodTestObject::qstringInvokable() { return QString(); }
+CustomType MethodTestObject::customTypeInvokable() { return CustomType(); }
+CustomUnregisteredType MethodTestObject::customUnregisteredTypeInvokable()
+{
+ return CustomUnregisteredType();
+}
+QVariant MethodTestObject::qvariantInvokableBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat(
+ bool, int, uint, qlonglong, qulonglong, double, long, short, char, ulong, ushort, uchar, float)
+{
+ return QVariant();
+}
+void MethodTestObject::voidInvokableNoParameterNames(bool, int) {}
+
+void MethodTestObject::voidSlot() {}
+void MethodTestObject::voidSlotInt(int) {}
+void MethodTestObject::voidSlotQReal(qreal) {}
+void MethodTestObject::voidSlotQString(const QString &) {}
+void MethodTestObject::voidSlotCustomType(CustomType) {}
+void MethodTestObject::voidSlotCustomUnregisteredType(CustomUnregisteredType) {}
+bool MethodTestObject::boolSlot() { return true; }
+qreal MethodTestObject::qrealSlot() { return 1.0; }
+QString MethodTestObject::qstringSlot() { return QString(); }
+CustomType MethodTestObject::customTypeSlot() { return CustomType(); }
+CustomUnregisteredType MethodTestObject::customUnregisteredTypeSlot()
+{
+ return CustomUnregisteredType();
+}
+QVariant MethodTestObject::qvariantSlotBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat(
+ bool, int, uint, qlonglong, qulonglong, double, long, short, char, ulong, ushort, uchar, float)
+{
+ return QVariant();
+}
+void MethodTestObject::voidSlotNoParameterNames(bool, int) {}
+
+void tst_QMetaMethod::method_data()
+{
+ QTest::addColumn<QByteArray>("signature");
+ QTest::addColumn<int>("returnType");
+ QTest::addColumn<QByteArray>("returnTypeName");
+ QTest::addColumn<QList<int> >("parameterTypes");
+ QTest::addColumn<QList<QByteArray> >("parameterTypeNames");
+ QTest::addColumn<QList<QByteArray> >("parameterNames");
+ QTest::addColumn<QMetaMethod::Access>("access");
+ QTest::addColumn<QMetaMethod::MethodType>("methodType");
+
+ QTest::newRow("voidSignal")
+ << QByteArray("voidSignal()")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokable")
+ << QByteArray("voidInvokable()")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlot")
+ << QByteArray("voidSlot()")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject()")
+ << QByteArray("MethodTestObject()")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+
+ QTest::newRow("voidSignalInt")
+ << QByteArray("voidSignalInt(int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("voidSignalIntArg"))
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokableInt")
+ << QByteArray("voidInvokableInt(int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("voidInvokableIntArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlotInt")
+ << QByteArray("voidSlotInt(int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("voidSlotIntArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(int)")
+ << QByteArray("MethodTestObject(int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("constructorIntArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+
+ QTest::newRow("voidSignalQReal")
+ << QByteArray("voidSignalQReal(qreal)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<qreal>())
+ << (QList<QByteArray>() << QByteArray("qreal"))
+ << (QList<QByteArray>() << QByteArray("voidSignalQRealArg"))
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokableQReal")
+ << QByteArray("voidInvokableQReal(qreal)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<qreal>())
+ << (QList<QByteArray>() << QByteArray("qreal"))
+ << (QList<QByteArray>() << QByteArray("voidInvokableQRealArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlotQReal")
+ << QByteArray("voidSlotQReal(qreal)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<qreal>())
+ << (QList<QByteArray>() << QByteArray("qreal"))
+ << (QList<QByteArray>() << QByteArray("voidSlotQRealArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(qreal)")
+ << QByteArray("MethodTestObject(qreal)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<qreal>())
+ << (QList<QByteArray>() << QByteArray("qreal"))
+ << (QList<QByteArray>() << QByteArray("constructorQRealArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+
+ QTest::newRow("voidSignalQString")
+ << QByteArray("voidSignalQString(QString)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::QString))
+ << (QList<QByteArray>() << QByteArray("QString"))
+ << (QList<QByteArray>() << QByteArray("voidSignalQStringArg"))
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokableQString")
+ << QByteArray("voidInvokableQString(QString)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::QString))
+ << (QList<QByteArray>() << QByteArray("QString"))
+ << (QList<QByteArray>() << QByteArray("voidInvokableQStringArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlotQString")
+ << QByteArray("voidSlotQString(QString)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::QString))
+ << (QList<QByteArray>() << QByteArray("QString"))
+ << (QList<QByteArray>() << QByteArray("voidSlotQStringArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(QString)")
+ << QByteArray("MethodTestObject(QString)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::QString))
+ << (QList<QByteArray>() << QByteArray("QString"))
+ << (QList<QByteArray>() << QByteArray("constructorQStringArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+
+ QTest::newRow("voidSignalCustomType")
+ << QByteArray("voidSignalCustomType(CustomType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<CustomType>())
+ << (QList<QByteArray>() << QByteArray("CustomType"))
+ << (QList<QByteArray>() << QByteArray("voidSignalCustomTypeArg"))
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokableCustomType")
+ << QByteArray("voidInvokableCustomType(CustomType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<CustomType>())
+ << (QList<QByteArray>() << QByteArray("CustomType"))
+ << (QList<QByteArray>() << QByteArray("voidInvokableCustomTypeArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlotCustomType")
+ << QByteArray("voidSlotCustomType(CustomType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<CustomType>())
+ << (QList<QByteArray>() << QByteArray("CustomType"))
+ << (QList<QByteArray>() << QByteArray("voidSlotCustomTypeArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(CustomType)")
+ << QByteArray("MethodTestObject(CustomType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << qMetaTypeId<CustomType>())
+ << (QList<QByteArray>() << QByteArray("CustomType"))
+ << (QList<QByteArray>() << QByteArray("constructorCustomTypeArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+
+ QTest::newRow("voidSignalCustomUnregisteredType")
+ << QByteArray("voidSignalCustomUnregisteredType(CustomUnregisteredType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << 0)
+ << (QList<QByteArray>() << QByteArray("CustomUnregisteredType"))
+ << (QList<QByteArray>() << QByteArray("voidSignalCustomUnregisteredTypeArg"))
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokableCustomUnregisteredType")
+ << QByteArray("voidInvokableCustomUnregisteredType(CustomUnregisteredType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << 0)
+ << (QList<QByteArray>() << QByteArray("CustomUnregisteredType"))
+ << (QList<QByteArray>() << QByteArray("voidInvokableCustomUnregisteredTypeArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlotCustomUnregisteredType")
+ << QByteArray("voidSlotCustomUnregisteredType(CustomUnregisteredType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << 0)
+ << (QList<QByteArray>() << QByteArray("CustomUnregisteredType"))
+ << (QList<QByteArray>() << QByteArray("voidSlotCustomUnregisteredTypeArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(CustomUnregisteredType)")
+ << QByteArray("MethodTestObject(CustomUnregisteredType)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << 0)
+ << (QList<QByteArray>() << QByteArray("CustomUnregisteredType"))
+ << (QList<QByteArray>() << QByteArray("constructorCustomUnregisteredTypeArg"))
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+
+ QTest::newRow("boolSignal")
+ << QByteArray("boolSignal()")
+ << int(QMetaType::Bool) << QByteArray("bool")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("boolInvokable")
+ << QByteArray("boolInvokable()")
+ << int(QMetaType::Bool) << QByteArray("bool")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("boolSlot")
+ << QByteArray("boolSlot()")
+ << int(QMetaType::Bool) << QByteArray("bool")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("qrealSignal")
+ << QByteArray("qrealSignal()")
+ << int(QMetaType::QReal) << QByteArray("qreal")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("qrealInvokable")
+ << QByteArray("qrealInvokable()")
+ << int(QMetaType::QReal) << QByteArray("qreal")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("qrealSlot")
+ << QByteArray("qrealSlot()")
+ << int(QMetaType::QReal) << QByteArray("qreal")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("qstringSignal")
+ << QByteArray("qstringSignal()")
+ << int(QMetaType::QString) << QByteArray("QString")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("qstringInvokable")
+ << QByteArray("qstringInvokable()")
+ << int(QMetaType::QString) << QByteArray("QString")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("qstringSlot")
+ << QByteArray("qstringSlot()")
+ << int(QMetaType::QString) << QByteArray("QString")
+ << (QList<int>())
+ << (QList<QByteArray>())
+ << (QList<QByteArray>())
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ {
+ QList<int> parameterTypes = QList<int>()
+ << int(QMetaType::Bool) << int(QMetaType::Int) << int(QMetaType::UInt)
+ << int(QMetaType::LongLong) << int(QMetaType::ULongLong) << int(QMetaType::Double)
+ << int(QMetaType::Long) << int(QMetaType::Short) << int(QMetaType::Char)
+ << int(QMetaType::ULong) << int(QMetaType::UShort) << int(QMetaType::UChar)
+ << int(QMetaType::Float);
+ QList<QByteArray> parameterTypeNames = QList<QByteArray>()
+ << QByteArray("bool") << QByteArray("int") << QByteArray("uint")
+ << QByteArray("qlonglong") << QByteArray("qulonglong") << QByteArray("double")
+ << QByteArray("long") << QByteArray("short") << QByteArray("char") << QByteArray("ulong")
+ << QByteArray("ushort") << QByteArray("uchar") << QByteArray("float");
+ QList<QByteArray> parameterNames = QList<QByteArray>()
+ << QByteArray("boolArg") << QByteArray("intArg") << QByteArray("uintArg")
+ << QByteArray("longlongArg") << QByteArray("ulonglongArg") << QByteArray("doubleArg")
+ << QByteArray("longArg") << QByteArray("shortArg") << QByteArray("charArg")
+ << QByteArray("ulongArg") << QByteArray("ushortArg") << QByteArray("ucharArg")
+ << QByteArray("floatArg");
+
+ QTest::newRow("qvariantSignalBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat")
+ << QByteArray("qvariantSignalBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat("
+ "bool,int,uint,qlonglong,qulonglong,double,long,short,char,ulong,ushort,uchar,float)")
+ << int(QMetaType::QVariant) << QByteArray("QVariant")
+ << parameterTypes << parameterTypeNames << parameterNames
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("qvariantInvokableBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat")
+ << QByteArray("qvariantInvokableBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat("
+ "bool,int,uint,qlonglong,qulonglong,double,long,short,char,ulong,ushort,uchar,float)")
+ << int(QMetaType::QVariant) << QByteArray("QVariant")
+ << parameterTypes << parameterTypeNames << parameterNames
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("qvariantSlotBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat")
+ << QByteArray("qvariantSlotBoolIntUIntLonglongULonglongDoubleLongShortCharUlongUshortUcharFloat("
+ "bool,int,uint,qlonglong,qulonglong,double,long,short,char,ulong,ushort,uchar,float)")
+ << int(QMetaType::QVariant) << QByteArray("QVariant")
+ << parameterTypes << parameterTypeNames << parameterNames
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(bool,int,uint,qlonglong,qulonglong,double,long,short,char,ulong,ushort,uchar,float)")
+ << QByteArray("MethodTestObject(bool,int,uint,qlonglong,qulonglong,double,long,short,char,ulong,ushort,uchar,float)")
+ << int(QMetaType::Void) << QByteArray("")
+ << parameterTypes << parameterTypeNames << parameterNames
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+ }
+
+ QTest::newRow("voidSignalNoParameterNames")
+ << QByteArray("voidSignalNoParameterNames(bool,int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Bool) << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("bool") << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("") << QByteArray(""))
+ << QMetaMethod::Protected
+ << QMetaMethod::Signal;
+
+ QTest::newRow("voidInvokableNoParameterNames")
+ << QByteArray("voidInvokableNoParameterNames(bool,int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Bool) << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("bool") << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("") << QByteArray(""))
+ << QMetaMethod::Public
+ << QMetaMethod::Method;
+
+ QTest::newRow("voidSlotNoParameterNames")
+ << QByteArray("voidSlotNoParameterNames(bool,int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Bool) << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("bool") << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("") << QByteArray(""))
+ << QMetaMethod::Public
+ << QMetaMethod::Slot;
+
+ QTest::newRow("MethodTestObject(bool,int)")
+ << QByteArray("MethodTestObject(bool,int)")
+ << int(QMetaType::Void) << QByteArray("")
+ << (QList<int>() << int(QMetaType::Bool) << int(QMetaType::Int))
+ << (QList<QByteArray>() << QByteArray("bool") << QByteArray("int"))
+ << (QList<QByteArray>() << QByteArray("") << QByteArray(""))
+ << QMetaMethod::Public
+ << QMetaMethod::Constructor;
+}
+
+void tst_QMetaMethod::method()
+{
+ QFETCH(QByteArray, signature);
+ QFETCH(int, returnType);
+ QFETCH(QByteArray, returnTypeName);
+ QFETCH(QList<int>, parameterTypes);
+ QFETCH(QList<QByteArray>, parameterTypeNames);
+ QFETCH(QList<QByteArray>, parameterNames);
+ QFETCH(QMetaMethod::MethodType, methodType);
+ QFETCH(QMetaMethod::Access, access);
+
+ QVERIFY(parameterTypes.size() == parameterTypeNames.size());
+ QVERIFY(parameterTypes.size() == parameterNames.size());
+
+ const QMetaObject *mo = &MethodTestObject::staticMetaObject;
+ int index = (methodType == QMetaMethod::Constructor)
+ ? mo->indexOfConstructor(signature) : mo->indexOfMethod(signature);
+ QVERIFY(index != -1);
+ QMetaMethod method = (methodType == QMetaMethod::Constructor)
+ ? mo->constructor(index) : mo->method(index);
+ QVERIFY(method.isValid());
+ QCOMPARE(method.methodType(), methodType);
+ QCOMPARE(method.access(), access);
+
+ QCOMPARE(method.signature(), signature.constData());
+
+ QCOMPARE(method.tag(), "");
+
+ QCOMPARE(method.typeName(), returnTypeName.constData());
+ QCOMPARE(QMetaType::type(method.typeName()), returnType);
+
+ QCOMPARE(method.parameterTypes(), parameterTypeNames);
+ QCOMPARE(method.parameterNames(), parameterNames);
+}
+
+void tst_QMetaMethod::invalidMethod()
+{
+ QMetaMethod method;
+ QVERIFY(!method.isValid());
+
+ QMetaMethod method2 = staticMetaObject.method(staticMetaObject.methodCount());
+ QVERIFY(!method2.isValid());
+
+ QMetaMethod method3 = staticMetaObject.method(-1);
+ QVERIFY(!method3.isValid());
+}
+
+QTEST_MAIN(tst_QMetaMethod)
+#include "tst_qmetamethod.moc"
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index def1b74ea4..97b14a374e 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -64,6 +64,7 @@ private slots:
void staticMetacall();
void copyMetaObject();
void serialize();
+ void relocatableData();
void removeNotifySignal();
void usage_signal();
@@ -90,6 +91,7 @@ class SomethingOfEverything : public QObject
Q_CLASSINFO("ci_bar", "DEF")
Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged)
Q_PROPERTY(QString prop2 READ prop WRITE setProp)
+ Q_PROPERTY(QString revisionProp READ prop WRITE setProp REVISION 42)
Q_PROPERTY(SomethingEnum eprop READ eprop)
Q_PROPERTY(SomethingFlagEnum fprop READ fprop)
Q_PROPERTY(QLocale::Language language READ language)
@@ -123,6 +125,7 @@ public:
public slots:
void slot1(const QString&) {}
void slot2(int, const QString&) {}
+ Q_REVISION(24) void revisionSlot() {}
private slots:
void slot3() {}
@@ -218,6 +221,7 @@ void tst_QMetaObjectBuilder::method()
QVERIFY(nullMethod.tag().isEmpty());
QVERIFY(nullMethod.access() == QMetaMethod::Public);
QCOMPARE(nullMethod.attributes(), 0);
+ QCOMPARE(nullMethod.revision(), 0);
QCOMPARE(nullMethod.index(), 0);
// Add a method and check its attributes.
@@ -229,6 +233,7 @@ void tst_QMetaObjectBuilder::method()
QVERIFY(method1.tag().isEmpty());
QVERIFY(method1.access() == QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
+ QCOMPARE(method1.revision(), 0);
QCOMPARE(method1.index(), 0);
QCOMPARE(builder.methodCount(), 1);
@@ -241,6 +246,7 @@ void tst_QMetaObjectBuilder::method()
QVERIFY(method2.tag().isEmpty());
QVERIFY(method2.access() == QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
+ QCOMPARE(method2.revision(), 0);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -255,6 +261,7 @@ void tst_QMetaObjectBuilder::method()
method1.setTag("tag");
method1.setAccess(QMetaMethod::Private);
method1.setAttributes(42);
+ method1.setRevision(123);
// Check that method1 is changed, but method2 is not.
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
@@ -264,6 +271,7 @@ void tst_QMetaObjectBuilder::method()
QCOMPARE(method1.tag(), QByteArray("tag"));
QVERIFY(method1.access() == QMetaMethod::Private);
QCOMPARE(method1.attributes(), 42);
+ QCOMPARE(method1.revision(), 123);
QCOMPARE(method1.index(), 0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
QVERIFY(method2.methodType() == QMetaMethod::Method);
@@ -272,6 +280,7 @@ void tst_QMetaObjectBuilder::method()
QVERIFY(method2.tag().isEmpty());
QVERIFY(method2.access() == QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
+ QCOMPARE(method2.revision(), 0);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -281,6 +290,7 @@ void tst_QMetaObjectBuilder::method()
method2.setTag("Q_FOO");
method2.setAccess(QMetaMethod::Protected);
method2.setAttributes(24);
+ method2.setRevision(321);
// This time check that only method2 changed.
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
@@ -290,6 +300,7 @@ void tst_QMetaObjectBuilder::method()
QCOMPARE(method1.tag(), QByteArray("tag"));
QVERIFY(method1.access() == QMetaMethod::Private);
QCOMPARE(method1.attributes(), 42);
+ QCOMPARE(method1.revision(), 123);
QCOMPARE(method1.index(), 0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
QVERIFY(method2.methodType() == QMetaMethod::Method);
@@ -298,6 +309,7 @@ void tst_QMetaObjectBuilder::method()
QCOMPARE(method2.tag(), QByteArray("Q_FOO"));
QVERIFY(method2.access() == QMetaMethod::Protected);
QCOMPARE(method2.attributes(), 24);
+ QCOMPARE(method2.revision(), 321);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -312,6 +324,7 @@ void tst_QMetaObjectBuilder::method()
QCOMPARE(method2.tag(), QByteArray("Q_FOO"));
QVERIFY(method2.access() == QMetaMethod::Protected);
QCOMPARE(method2.attributes(), 24);
+ QCOMPARE(method2.revision(), 321);
QCOMPARE(method2.index(), 0);
// Perform index-based lookup again.
@@ -541,6 +554,7 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!nullProp.isConstant());
QVERIFY(!nullProp.isFinal());
QCOMPARE(nullProp.index(), 0);
+ QCOMPARE(nullProp.revision(), 0);
// Add a property and check its attributes.
QMetaPropertyBuilder prop1 = builder.addProperty("foo", "const QString &");
@@ -559,6 +573,7 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop1.isEnumOrFlag());
QVERIFY(!prop1.isConstant());
QVERIFY(!prop1.isFinal());
+ QCOMPARE(prop1.revision(), 0);
QCOMPARE(prop1.index(), 0);
QCOMPARE(builder.propertyCount(), 1);
@@ -579,6 +594,7 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop2.isEnumOrFlag());
QVERIFY(!prop2.isConstant());
QVERIFY(!prop2.isFinal());
+ QCOMPARE(prop2.revision(), 0);
QCOMPARE(prop2.index(), 1);
QCOMPARE(builder.propertyCount(), 2);
@@ -602,6 +618,7 @@ void tst_QMetaObjectBuilder::property()
prop1.setEnumOrFlag(true);
prop1.setConstant(true);
prop1.setFinal(true);
+ prop1.setRevision(123);
// Check that prop1 is changed, but prop2 is not.
QCOMPARE(prop1.name(), QByteArray("foo"));
@@ -618,6 +635,7 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(prop1.isEnumOrFlag());
QVERIFY(prop1.isConstant());
QVERIFY(prop1.isFinal());
+ QCOMPARE(prop1.revision(), 123);
QVERIFY(prop2.isReadable());
QVERIFY(prop2.isWritable());
QCOMPARE(prop2.name(), QByteArray("bar"));
@@ -632,6 +650,7 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop2.isEnumOrFlag());
QVERIFY(!prop2.isConstant());
QVERIFY(!prop2.isFinal());
+ QCOMPARE(prop2.revision(), 0);
// Remove prop1 and check that prop2 becomes index 0.
builder.removeProperty(0);
@@ -649,6 +668,7 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop2.isEnumOrFlag());
QVERIFY(!prop2.isConstant());
QVERIFY(!prop2.isFinal());
+ QCOMPARE(prop2.revision(), 0);
QCOMPARE(prop2.index(), 0);
// Perform index-based lookup again.
@@ -1028,6 +1048,39 @@ void tst_QMetaObjectBuilder::serialize()
}
}
+void tst_QMetaObjectBuilder::relocatableData()
+{
+ QMetaObjectBuilder builder;
+ builder.setClassName("TestObject");
+
+ QMetaMethodBuilder intPropChanged = builder.addSignal("intPropChanged(int)");
+ intPropChanged.setParameterNames(QList<QByteArray>() << "newIntPropValue");
+
+ QMetaPropertyBuilder prop = builder.addProperty("intProp", "int");
+ prop.setNotifySignal(intPropChanged);
+
+ QMetaMethodBuilder voidSlotInt = builder.addSlot("voidSlotInt(int)");
+ voidSlotInt.setParameterNames(QList<QByteArray>() << "slotIntArg");
+
+ QMetaMethodBuilder listInvokableQRealQString = builder.addMethod("listInvokableQRealQString(qreal,QString)");
+ listInvokableQRealQString.setReturnType("QVariantList");
+ listInvokableQRealQString.setParameterNames(QList<QByteArray>() << "qrealArg" << "qstringArg");
+
+ bool ok = false;
+ QByteArray data = builder.toRelocatableData(&ok);
+ QVERIFY(ok);
+
+ QMetaObjectBuilder builder2;
+ QMetaObject meta2;
+ builder2.fromRelocatableData(&meta2, &QObject::staticMetaObject, data);
+
+ QMetaObject *meta = builder.toMetaObject();
+
+ QVERIFY(sameMetaObject(meta, &meta2));
+ free(meta);
+}
+
+
// Check that removing a method updates notify signals appropriately
void tst_QMetaObjectBuilder::removeNotifySignal()
{
@@ -1129,6 +1182,9 @@ static bool sameMethod(const QMetaMethod& method1, const QMetaMethod& method2)
if (method1.attributes() != method2.attributes())
return false;
+ if (method1.revision() != method2.revision())
+ return false;
+
return true;
}
@@ -1159,6 +1215,9 @@ static bool sameProperty(const QMetaProperty& prop1, const QMetaProperty& prop2)
return false;
}
+ if (prop1.revision() != prop2.revision())
+ return false;
+
return true;
}
@@ -1282,11 +1341,11 @@ class TestObject : public QObject
// Manually expanded from Q_OBJECT macro
public:
Q_OBJECT_CHECK
+ static QMetaObject staticMetaObject;
virtual const QMetaObject *metaObject() const;
virtual void *qt_metacast(const char *);
virtual int qt_metacall(QMetaObject::Call, int, void **);
private:
- Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData;
Q_DECL_HIDDEN static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
//Q_PROPERTY(int intProp READ intProp WRITE setIntProp NOTIFY intPropChanged)
@@ -1319,14 +1378,15 @@ private:
int m_voidSlotIntArg;
};
-const QMetaObjectExtraData TestObject::staticMetaObjectExtraData = {
- 0, qt_static_metacall
+QMetaObject TestObject::staticMetaObject = {
+ { 0, 0, 0, 0 }
};
TestObject::TestObject(QObject *parent)
: QObject(parent), m_metaObject(buildMetaObject()),
m_intProp(-1), m_voidSlotIntArg(-1)
{
+ staticMetaObject = *m_metaObject;
}
TestObject::~TestObject()
@@ -1422,9 +1482,6 @@ void TestObject::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id,
}
}
} else if (_c == QMetaObject::IndexOfMethod) {
- // This code is currently unreachable because it's only used by the
- // template-based versions of connect() and disconnect(), which don't
- // work with dynamically generated meta-objects (see test).
int *result = reinterpret_cast<int *>(_a[0]);
void **func = reinterpret_cast<void **>(_a[1]);
{
@@ -1445,7 +1502,6 @@ void TestObject::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id,
*result = 2;
}
}
- qFatal("You forgot to add one or more IndexOfMethod cases");
}
}
@@ -1609,11 +1665,22 @@ void tst_QMetaObjectBuilder::usage_templateConnect()
{
QScopedPointer<TestObject> testObject(new TestObject);
- QTest::ignoreMessage(QtWarningMsg, "QObject::connect: signal not found in QObject");
QMetaObject::Connection con = QObject::connect(testObject.data(), &TestObject::intPropChanged,
testObject.data(), &TestObject::voidSlotInt);
- QEXPECT_FAIL("", "template-based connect() fails because meta-object is deduced at compile-time", Abort);
QVERIFY(con);
+
+ QVERIFY(testObject->voidSlotIntArgument() == -1);
+ testObject->setProperty("intProp", 123);
+ QCOMPARE(testObject->voidSlotIntArgument(), 123);
+
+ QVERIFY(QObject::disconnect(testObject.data(), &TestObject::intPropChanged,
+ testObject.data(), &TestObject::voidSlotInt));
+
+ // Something that isn't a signal
+ QTest::ignoreMessage(QtWarningMsg, "QObject::connect: signal not found in TestObject");
+ con = QObject::connect(testObject.data(), &TestObject::setIntProp,
+ testObject.data(), &TestObject::intPropChanged);
+ QVERIFY(!con);
}
QTEST_MAIN(tst_QMetaObjectBuilder)
diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
index be13b39e7e..72913d10f2 100644
--- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
+++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
@@ -78,16 +78,22 @@ private slots:
void createCopy();
void sizeOf_data();
void sizeOf();
+ void sizeOfStaticLess_data();
+ void sizeOfStaticLess();
void flags_data();
void flags();
+ void flagsStaticLess_data();
+ void flagsStaticLess();
void construct_data();
void construct();
void constructCopy_data();
void constructCopy();
void typedefs();
+ void registerType();
void isRegistered_data();
void isRegistered();
- void unregisterType();
+ void isRegisteredStaticLess_data();
+ void isRegisteredStaticLess();
void registerStreamBuiltin();
void automaticTemplateRegistration();
};
@@ -125,6 +131,9 @@ class MetaTypeTorturer: public QThread
protected:
void run()
{
+ Bar space[1];
+ space[0].~Bar();
+
for (int i = 0; i < 1000; ++i) {
const QByteArray name = QString("Bar%1_%2").arg(i).arg((size_t)QThread::currentThreadId()).toLatin1();
const char *nm = name.constData();
@@ -132,6 +141,15 @@ protected:
#ifdef Q_OS_LINUX
pthread_yield();
#endif
+ QMetaType info(tp);
+ if (!info.isValid()) {
+ ++failureCount;
+ qWarning() << "Wrong typeInfo returned for" << tp;
+ }
+ if (!info.isRegistered()) {
+ ++failureCount;
+ qWarning() << name << "is not a registered metatype";
+ }
if (QMetaType::typeFlags(tp) != (QMetaType::NeedsConstruction | QMetaType::NeedsDestruction)) {
++failureCount;
qWarning() << "Wrong typeInfo returned for" << tp;
@@ -148,9 +166,22 @@ protected:
++failureCount;
qWarning() << "Wrong typeName returned for" << tp;
}
- void *buf = QMetaType::create(tp, 0);
- void *buf2 = QMetaType::create(tp, buf);
- if (!buf) {
+ void *buf1 = QMetaType::create(tp, 0);
+ void *buf2 = QMetaType::create(tp, buf1);
+ void *buf3 = info.create(tp, 0);
+ void *buf4 = info.create(tp, buf1);
+
+ QMetaType::construct(tp, space, 0);
+ QMetaType::destruct(tp, space);
+ QMetaType::construct(tp, space, buf1);
+ QMetaType::destruct(tp, space);
+
+ info.construct(space, 0);
+ info.destruct(space);
+ info.construct(space, buf1);
+ info.destruct(space);
+
+ if (!buf1) {
++failureCount;
qWarning() << "Null buffer returned by QMetaType::create(tp, 0)";
}
@@ -158,9 +189,20 @@ protected:
++failureCount;
qWarning() << "Null buffer returned by QMetaType::create(tp, buf)";
}
- QMetaType::destroy(tp, buf);
+ if (!buf3) {
+ ++failureCount;
+ qWarning() << "Null buffer returned by info.create(tp, 0)";
+ }
+ if (!buf4) {
+ ++failureCount;
+ qWarning() << "Null buffer returned by infocreate(tp, buf)";
+ }
+ QMetaType::destroy(tp, buf1);
QMetaType::destroy(tp, buf2);
+ info.destroy(buf3);
+ info.destroy(buf4);
}
+ new (space) Bar;
}
public:
MetaTypeTorturer() : failureCount(0) { }
@@ -480,13 +522,17 @@ template<int ID>
static void testCreateHelper()
{
typedef typename MetaEnumToType<ID>::Type Type;
- void *actual = QMetaType::create(ID);
+ QMetaType info(ID);
+ void *actual1 = QMetaType::create(ID);
+ void *actual2 = info.create();
if (DefaultValueTraits<ID>::IsInitialized) {
Type *expected = DefaultValueFactory<ID>::create();
- QCOMPARE(*static_cast<Type *>(actual), *expected);
+ QCOMPARE(*static_cast<Type *>(actual1), *expected);
+ QCOMPARE(*static_cast<Type *>(actual2), *expected);
delete expected;
}
- QMetaType::destroy(ID, actual);
+ QMetaType::destroy(ID, actual1);
+ info.destroy(actual2);
}
template<>
@@ -529,9 +575,13 @@ static void testCreateCopyHelper()
{
typedef typename MetaEnumToType<ID>::Type Type;
Type *expected = TestValueFactory<ID>::create();
- void *actual = QMetaType::create(ID, expected);
- QCOMPARE(*static_cast<Type *>(actual), *expected);
- QMetaType::destroy(ID, actual);
+ QMetaType info(ID);
+ void *actual1 = QMetaType::create(ID, expected);
+ void *actual2 = info.create(expected);
+ QCOMPARE(*static_cast<Type *>(actual1), *expected);
+ QCOMPARE(*static_cast<Type *>(actual2), *expected);
+ QMetaType::destroy(ID, actual1);
+ info.destroy(actual2);
delete expected;
}
@@ -588,6 +638,18 @@ void tst_QMetaType::sizeOf()
QCOMPARE(QMetaType::sizeOf(type), size);
}
+void tst_QMetaType::sizeOfStaticLess_data()
+{
+ sizeOf_data();
+}
+
+void tst_QMetaType::sizeOfStaticLess()
+{
+ QFETCH(QMetaType::Type, type);
+ QFETCH(int, size);
+ QCOMPARE(QMetaType(type).sizeOf(), size);
+}
+
struct CustomMovable {};
QT_BEGIN_NAMESPACE
Q_DECLARE_TYPEINFO(CustomMovable, Q_MOVABLE_TYPE);
@@ -653,6 +715,23 @@ void tst_QMetaType::flags()
QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::PointerToQObject), isPointerToQObject);
}
+void tst_QMetaType::flagsStaticLess_data()
+{
+ flags_data();
+}
+
+void tst_QMetaType::flagsStaticLess()
+{
+ QFETCH(int, type);
+ QFETCH(bool, isMovable);
+ QFETCH(bool, isComplex);
+
+ int flags = QMetaType(type).flags();
+ QCOMPARE(bool(flags & QMetaType::NeedsConstruction), isComplex);
+ QCOMPARE(bool(flags & QMetaType::NeedsDestruction), isComplex);
+ QCOMPARE(bool(flags & QMetaType::MovableType), isMovable);
+}
+
void tst_QMetaType::construct_data()
{
create_data();
@@ -688,20 +767,30 @@ template<int ID>
static void testConstructHelper()
{
typedef typename MetaEnumToType<ID>::Type Type;
- int size = QMetaType::sizeOf(ID);
- void *storage = qMallocAligned(size, TypeAlignment<Type>::Value);
- void *actual = QMetaType::construct(ID, storage, /*copy=*/0);
- QCOMPARE(actual, storage);
+ QMetaType info(ID);
+ int size = info.sizeOf();
+ void *storage1 = qMallocAligned(size, TypeAlignment<Type>::Value);
+ void *actual1 = QMetaType::construct(ID, storage1, /*copy=*/0);
+ void *storage2 = qMallocAligned(size, TypeAlignment<Type>::Value);
+ void *actual2 = info.construct(storage2, /*copy=*/0);
+ QCOMPARE(actual1, storage1);
+ QCOMPARE(actual2, storage2);
if (DefaultValueTraits<ID>::IsInitialized) {
Type *expected = DefaultValueFactory<ID>::create();
- QCOMPARE(*static_cast<Type *>(actual), *expected);
+ QCOMPARE(*static_cast<Type *>(actual1), *expected);
+ QCOMPARE(*static_cast<Type *>(actual2), *expected);
delete expected;
}
- QMetaType::destruct(ID, actual);
- qFreeAligned(storage);
+ QMetaType::destruct(ID, actual1);
+ qFreeAligned(storage1);
+ info.destruct(actual2);
+ qFreeAligned(storage2);
QVERIFY(QMetaType::construct(ID, 0, /*copy=*/0) == 0);
QMetaType::destruct(ID, 0);
+
+ QVERIFY(info.construct(0, /*copy=*/0) == 0);
+ info.destruct(0);
}
template<>
@@ -748,15 +837,24 @@ static void testConstructCopyHelper()
{
typedef typename MetaEnumToType<ID>::Type Type;
Type *expected = TestValueFactory<ID>::create();
+ QMetaType info(ID);
int size = QMetaType::sizeOf(ID);
- void *storage = qMallocAligned(size, TypeAlignment<Type>::Value);
- void *actual = QMetaType::construct(ID, storage, expected);
- QCOMPARE(actual, storage);
- QCOMPARE(*static_cast<Type *>(actual), *expected);
- QMetaType::destruct(ID, actual);
- qFreeAligned(storage);
+ QCOMPARE(info.sizeOf(), size);
+ void *storage1 = qMallocAligned(size, TypeAlignment<Type>::Value);
+ void *actual1 = QMetaType::construct(ID, storage1, expected);
+ void *storage2 = qMallocAligned(size, TypeAlignment<Type>::Value);
+ void *actual2 = info.construct(storage2, expected);
+ QCOMPARE(actual1, storage1);
+ QCOMPARE(actual2, storage2);
+ QCOMPARE(*static_cast<Type *>(actual1), *expected);
+ QCOMPARE(*static_cast<Type *>(actual2), *expected);
+ QMetaType::destruct(ID, actual1);
+ qFreeAligned(storage1);
+ info.destruct(actual2);
+ qFreeAligned(storage2);
QVERIFY(QMetaType::construct(ID, 0, expected) == 0);
+ QVERIFY(info.construct(0, expected) == 0);
delete expected;
}
@@ -829,6 +927,44 @@ void tst_QMetaType::typedefs()
QCOMPARE(QMetaType::type("WhityDouble"), ::qMetaTypeId<WhityDouble>());
}
+void tst_QMetaType::registerType()
+{
+ // Built-in
+ QCOMPARE(qRegisterMetaType<QString>("QString"), int(QMetaType::QString));
+ QCOMPARE(qRegisterMetaType<QString>("QString"), int(QMetaType::QString));
+
+ // Custom
+ int fooId = qRegisterMetaType<TestSpace::Foo>("TestSpace::Foo");
+ QVERIFY(fooId >= int(QMetaType::User));
+ QCOMPARE(qRegisterMetaType<TestSpace::Foo>("TestSpace::Foo"), fooId);
+
+ int movableId = qRegisterMetaType<CustomMovable>("CustomMovable");
+ QVERIFY(movableId >= int(QMetaType::User));
+ QCOMPARE(qRegisterMetaType<CustomMovable>("CustomMovable"), movableId);
+
+ // Alias to built-in
+ typedef QString MyString;
+
+ QCOMPARE(qRegisterMetaType<MyString>("MyString"), int(QMetaType::QString));
+ QCOMPARE(qRegisterMetaType<MyString>("MyString"), int(QMetaType::QString));
+
+ QCOMPARE(QMetaType::type("MyString"), int(QMetaType::QString));
+
+ // Alias to custom type
+ typedef CustomMovable MyMovable;
+ typedef TestSpace::Foo MyFoo;
+
+ QCOMPARE(qRegisterMetaType<MyMovable>("MyMovable"), movableId);
+ QCOMPARE(qRegisterMetaType<MyMovable>("MyMovable"), movableId);
+
+ QCOMPARE(QMetaType::type("MyMovable"), movableId);
+
+ QCOMPARE(qRegisterMetaType<MyFoo>("MyFoo"), fooId);
+ QCOMPARE(qRegisterMetaType<MyFoo>("MyFoo"), fooId);
+
+ QCOMPARE(QMetaType::type("MyFoo"), fooId);
+}
+
class IsRegisteredDummyType { };
void tst_QMetaType::isRegistered_data()
@@ -857,26 +993,16 @@ void tst_QMetaType::isRegistered()
QCOMPARE(QMetaType::isRegistered(typeId), registered);
}
-class RegUnreg
+void tst_QMetaType::isRegisteredStaticLess_data()
{
-public:
- RegUnreg() {};
- RegUnreg(const RegUnreg &) {};
- ~RegUnreg() {};
-};
-
-void tst_QMetaType::unregisterType()
-{
- // cannot unregister standard types
- int typeId = qRegisterMetaType<QList<QVariant> >("QList<QVariant>");
- QCOMPARE(QMetaType::isRegistered(typeId), true);
- QMetaType::unregisterType("QList<QVariant>");
- QCOMPARE(QMetaType::isRegistered(typeId), true);
- // allow unregister user types
- typeId = qRegisterMetaType<RegUnreg>("RegUnreg");
- QCOMPARE(QMetaType::isRegistered(typeId), true);
- QMetaType::unregisterType("RegUnreg");
- QCOMPARE(QMetaType::isRegistered(typeId), false);
+ isRegistered_data();
+}
+
+void tst_QMetaType::isRegisteredStaticLess()
+{
+ QFETCH(int, typeId);
+ QFETCH(bool, registered);
+ QCOMPARE(QMetaType(typeId).isRegistered(), registered);
}
void tst_QMetaType::registerStreamBuiltin()
diff --git a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
index 09f17602b3..f9a6bae087 100644
--- a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
+++ b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
@@ -317,19 +317,22 @@ void tst_QMimeData::setUrls() const
longUrlList += QUrl("http://www.google.com");
// verify initial state
- QVERIFY(mimeData.hasUrls() == false);
+ QCOMPARE(mimeData.hasUrls(), false);
// set a few, verify
mimeData.setUrls(shortUrlList);
QCOMPARE(mimeData.urls(), shortUrlList);
+ QCOMPARE(mimeData.text(), QString("http://qt.nokia.com"));
// change them, verify
mimeData.setUrls(longUrlList);
QCOMPARE(mimeData.urls(), longUrlList);
+ QCOMPARE(mimeData.text(), QString("http://qt.nokia.com\nhttp://www.google.com\n"));
// clear, verify
mimeData.clear();
- QVERIFY(mimeData.hasUrls() == false);
+ QCOMPARE(mimeData.hasUrls(), false);
+ QCOMPARE(mimeData.hasText(), false);
}
QTEST_MAIN(tst_QMimeData)
diff --git a/tests/auto/corelib/kernel/qobject/qobject.pro b/tests/auto/corelib/kernel/qobject/qobject.pro
index ee48f56b1d..0f86408fc9 100644
--- a/tests/auto/corelib/kernel/qobject/qobject.pro
+++ b/tests/auto/corelib/kernel/qobject/qobject.pro
@@ -1,3 +1,4 @@
TEMPLATE = subdirs
-SUBDIRS = signalbug tst_qobject.pro
-CONFIG += parallel_test
+SUBDIRS = signalbug
+tst_qobject.pro.depends = $$SUBDIRS
+SUBDIRS += tst_qobject.pro
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 7f95f68075..a6ad1d53bc 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -1703,7 +1703,9 @@ void tst_QObject::property()
QVERIFY(property.isWritable());
QVERIFY(!property.isEnumType());
QCOMPARE(property.typeName(), "CustomType*");
+ qRegisterMetaType<CustomType*>();
QCOMPARE(property.type(), QVariant::UserType);
+ QCOMPARE(property.userType(), qMetaTypeId<CustomType*>());
CustomType *customPointer = 0;
QVariant customVariant = object.property("custom");
@@ -1718,6 +1720,7 @@ void tst_QObject::property()
QVERIFY(property.isWritable());
QCOMPARE(property.typeName(), "CustomType*");
QCOMPARE(property.type(), QVariant::UserType);
+ QCOMPARE(property.userType(), qMetaTypeId<CustomType*>());
QVERIFY(object.setProperty("custom", customVariant));
QCOMPARE(object.custom(), customPointer);
@@ -3183,6 +3186,14 @@ void tst_QObject::dumpObjectInfo()
QObject a, b;
QObject::connect(&a, SIGNAL(destroyed(QObject *)), &b, SLOT(deleteLater()));
a.disconnect(&b);
+#ifdef QT_DEBUG
+ QTest::ignoreMessage(QtDebugMsg, "OBJECT QObject::unnamed");
+ QTest::ignoreMessage(QtDebugMsg, " SIGNALS OUT");
+ QTest::ignoreMessage(QtDebugMsg, " signal: destroyed(QObject*)");
+ QTest::ignoreMessage(QtDebugMsg, " <Disconnected receiver>");
+ QTest::ignoreMessage(QtDebugMsg, " SIGNALS IN");
+ QTest::ignoreMessage(QtDebugMsg, " <None>");
+#endif
a.dumpObjectInfo(); // should not crash
}
@@ -3810,12 +3821,18 @@ void tst_QObject::sameName()
c2.emitSignal1();
QCOMPARE(c1.s, 2);
+#ifndef QT_NO_DEBUG
+ QTest::ignoreMessage(QtWarningMsg, "QMetaObject::indexOfSignal: signal aPublicSlot() from SenderObject redefined in ConfusingObject");
+#endif
QVERIFY(connect(&c2, SIGNAL(aPublicSlot()), &c1, SLOT(signal1())));
c2.aPublicSlot();
QCOMPARE(c2.aPublicSlotCalled, 0);
QCOMPARE(c1.aPublicSlotCalled, 0);
QCOMPARE(c1.s, 3);
+#ifndef QT_NO_DEBUG
+ QTest::ignoreMessage(QtWarningMsg, "QMetaObject::indexOfSignal: signal aPublicSlot() from SenderObject redefined in ConfusingObject");
+#endif
QVERIFY(connect(&c2, SIGNAL(aPublicSlot()), &c1, SLOT(aPublicSlot())));
c2.aPublicSlot();
QCOMPARE(c2.aPublicSlotCalled, 0);
@@ -4149,9 +4166,6 @@ void tst_QObject::pointerConnect()
QVERIFY( connect( s, &SenderObject::signal1 , r2, &ReceiverObject::slot1 ) );
QVERIFY( connect( s, &SenderObject::signal1 , r1, &ReceiverObject::slot3 ) );
QVERIFY( connect( s, &SenderObject::signal3 , r1, &ReceiverObject::slot3 ) );
-#if defined(Q_CC_GNU) && defined(Q_OS_UNIX)
- QEXPECT_FAIL("", "Test may fail due to failing comparison of pointers to member functions caused by problems with -reduce-relocations on this platform.", Continue);
-#endif
QVERIFY2( connect( &timer, &QTimer::timeout, r1, &ReceiverObject::deleteLater ),
"Signal connection failed most likely due to failing comparison of pointers to member functions caused by problems with -reduce-relocations on this platform.");
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.pro b/tests/auto/corelib/kernel/qobject/tst_qobject.pro
index d74f2bcb0f..30fd810a2e 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.pro
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.pro
@@ -6,3 +6,6 @@ SOURCES = tst_qobject.cpp
# this is here for a reason, moc_oldnormalizedobject.cpp is not auto-generated, it was generated by
# moc from Qt 4.6, and should *not* be generated by the current moc
SOURCES += moc_oldnormalizeobject.cpp
+
+load(testcase) # for target.path and installTestHelperApp()
+installTestHelperApp("signalbug/signalbug",signalbug,signalbug)
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro b/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
index 55f6934fc9..58e4b98af7 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
+++ b/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
@@ -6,5 +6,3 @@ SOURCES = tst_qsocketnotifier.cpp
requires(contains(QT_CONFIG,private_tests))
include(../../../network/socket/platformsocketengine/platformsocketengine.pri)
-
-mac: CONFIG += insignificant_test # QTBUG-22746
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
index e3bfe3bc6d..5442303e7e 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
+++ b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
@@ -237,7 +237,7 @@ void tst_QSocketNotifier::mixingWithTimers()
QCoreApplication::processEvents();
QCOMPARE(helper.timerActivated, true);
- QCOMPARE(helper.socketActivated, true);
+ QTRY_COMPARE(helper.socketActivated, true);
}
void tst_QSocketNotifier::posixSockets()
@@ -264,10 +264,7 @@ void tst_QSocketNotifier::posixSockets()
connect(&rn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QSignalSpy readSpy(&rn, SIGNAL(activated(int)));
QVERIFY(readSpy.isValid());
- QSocketNotifier wn(posixSocket, QSocketNotifier::Write);
- connect(&wn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QSignalSpy writeSpy(&wn, SIGNAL(activated(int)));
- QVERIFY(writeSpy.isValid());
+ // No write notifier, some systems trigger write notification on socket creation, but not all
QSocketNotifier en(posixSocket, QSocketNotifier::Exception);
connect(&en, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QSignalSpy errorSpy(&en, SIGNAL(activated(int)));
@@ -278,19 +275,27 @@ void tst_QSocketNotifier::posixSockets()
QTestEventLoop::instance().enterLoop(3);
QCOMPARE(readSpy.count(), 1);
- writeSpy.clear(); //depending on OS, write notifier triggers on creation or not.
QCOMPARE(errorSpy.count(), 0);
char buffer[100];
- qt_safe_read(posixSocket, buffer, 100);
+ int r = qt_safe_read(posixSocket, buffer, 100);
+ QCOMPARE(r, 6);
QCOMPARE(buffer, "hello");
+ QSocketNotifier wn(posixSocket, QSocketNotifier::Write);
+ connect(&wn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ QSignalSpy writeSpy(&wn, SIGNAL(activated(int)));
+ QVERIFY(writeSpy.isValid());
qt_safe_write(posixSocket, "goodbye", 8);
QTestEventLoop::instance().enterLoop(3);
QCOMPARE(readSpy.count(), 1);
QCOMPARE(writeSpy.count(), 1);
QCOMPARE(errorSpy.count(), 0);
+
+ // Write notifier may have fired before the read notifier inside
+ // QTcpSocket, give QTcpSocket a chance to see the incoming data
+ passive->waitForReadyRead(100);
QCOMPARE(passive->readAll(), QByteArray("goodbye",8));
}
qt_safe_close(posixSocket);
diff --git a/tests/auto/corelib/kernel/qvariant/qvariant.pro b/tests/auto/corelib/kernel/qvariant/qvariant.pro
index 48229ee140..9b4b346d35 100644
--- a/tests/auto/corelib/kernel/qvariant/qvariant.pro
+++ b/tests/auto/corelib/kernel/qvariant/qvariant.pro
@@ -3,5 +3,3 @@ TARGET = tst_qvariant
QT += widgets network testlib
SOURCES = tst_qvariant.cpp
RESOURCES += qvariant.qrc
-
-mac: CONFIG += insignificant_test # QTBUG-QTBUG-22747
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 2bf554dd78..ccdab17668 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -83,11 +83,22 @@ Q_DECLARE_METATYPE(QFont)
Q_DECLARE_METATYPE(QColor)
Q_DECLARE_METATYPE(QKeySequence)
+class CustomNonQObject;
+
class tst_QVariant : public QObject
{
Q_OBJECT
+public:
+ tst_QVariant(QObject *parent = 0)
+ : QObject(parent), customNonQObjectPointer(0)
+ {
+
+ }
+
private slots:
+ void cleanupTestCase();
+
void constructor();
void copy_constructor();
void isNull();
@@ -176,6 +187,7 @@ private slots:
void qvariant_cast_QObject_data();
void qvariant_cast_QObject();
+ void qvariant_cast_QObject_derived();
void toLocale();
@@ -275,6 +287,9 @@ private:
void dataStream_data(QDataStream::Version version);
void loadQVariantFromDataStream(QDataStream::Version version);
void saveQVariantFromDataStream(QDataStream::Version version);
+
+ CustomNonQObject *customNonQObjectPointer;
+ QVector<QObject*> objectPointerTestData;
};
Q_DECLARE_METATYPE(QDate)
@@ -1842,10 +1857,6 @@ void tst_QVariant::operator_eq_eq_data()
QTest::newRow("HashSecondLarger") << QVariant(hash1) << QVariant(hash2) << false;
}
-
- QTest::newRow( "UserType" ) << QVariant(QVariant::UserType) << QVariant(QVariant::UserType) << true;
- QVariant mUserType(QVariant::UserType);
- QTest::newRow( "Shared UserType" ) << mUserType << mUserType << true;
}
void tst_QVariant::operator_eq_eq()
@@ -1919,7 +1930,6 @@ void tst_QVariant::typeName_data()
QTest::newRow("39") << int(QVariant::RectF) << QByteArray("QRectF");
QTest::newRow("40") << int(QVariant::PointF) << QByteArray("QPointF");
QTest::newRow("41") << int(QVariant::RegExp) << QByteArray("QRegExp");
- QTest::newRow("42") << int(QVariant::UserType) << QByteArray();
QTest::newRow("43") << int(QVariant::Matrix) << QByteArray("QMatrix");
QTest::newRow("44") << int(QVariant::Transform) << QByteArray("QTransform");
QTest::newRow("45") << int(QVariant::Hash) << QByteArray("QVariantHash");
@@ -2031,10 +2041,10 @@ void tst_QVariant::userType()
qVariantSetValue(userVar, data);
QCOMPARE(userVar.type(), QVariant::UserType);
+ QCOMPARE(userVar.userType(), qMetaTypeId<MyType>());
QCOMPARE(userVar.typeName(), "MyType");
QVERIFY(!userVar.isNull());
QVERIFY(!userVar.canConvert(QVariant::String));
- QVERIFY(!userVar.canConvert(QVariant::UserType));
QVariant userVar2(userVar);
QVERIFY(userVar == userVar2);
@@ -2060,10 +2070,10 @@ void tst_QVariant::userType()
qVariantSetValue(userVar, &data);
QCOMPARE(userVar.type(), QVariant::UserType);
+ QCOMPARE(userVar.userType(), qMetaTypeId<MyType*>());
QCOMPARE(userVar.typeName(), "MyType*");
QVERIFY(!userVar.isNull());
QVERIFY(!userVar.canConvert(QVariant::String));
- QVERIFY(!userVar.canConvert(QVariant::UserType));
QVariant userVar2(userVar);
QVERIFY(userVar == userVar2);
@@ -2457,20 +2467,63 @@ void tst_QVariant::invalidQColor() const
QVERIFY(!qvariant_cast<QColor>(va).isValid());
}
-void tst_QVariant::qvariant_cast_QObject_data() {
+class CustomQObject : public QObject {
+ Q_OBJECT
+public:
+ CustomQObject(QObject *parent = 0) : QObject(parent) {}
+};
+class CustomQWidget : public QWidget {
+ Q_OBJECT
+public:
+ CustomQWidget(QWidget *parent = 0) : QWidget(parent) {}
+};
+Q_DECLARE_METATYPE(CustomQObject*)
+Q_DECLARE_METATYPE(CustomQWidget*)
+
+class CustomNonQObject { };
+Q_DECLARE_METATYPE(CustomNonQObject)
+Q_DECLARE_METATYPE(CustomNonQObject*)
+void tst_QVariant::cleanupTestCase()
+{
+ delete customNonQObjectPointer;
+ qDeleteAll(objectPointerTestData);
+}
+
+void tst_QVariant::qvariant_cast_QObject_data()
+{
QTest::addColumn<QVariant>("data");
QTest::addColumn<bool>("success");
- QObject *obj = new QObject(this);
+ QObject *obj = new QObject;
obj->setObjectName(QString::fromLatin1("Hello"));
QTest::newRow("from QObject") << QVariant(QMetaType::QObjectStar, &obj) << true;
QTest::newRow("from QObject2") << QVariant::fromValue(obj) << true;
QTest::newRow("from String") << QVariant(QLatin1String("1, 2, 3")) << false;
QTest::newRow("from int") << QVariant((int) 123) << false;
-}
-
-
-void tst_QVariant::qvariant_cast_QObject() {
+ QWidget *widget = new QWidget;
+ widget->setObjectName(QString::fromLatin1("Hello"));
+ QTest::newRow("from QWidget") << QVariant::fromValue(widget) << true;
+ CustomQObject *customObject = new CustomQObject(this);
+ customObject->setObjectName(QString::fromLatin1("Hello"));
+ QTest::newRow("from Derived QObject") << QVariant::fromValue(customObject) << true;
+ CustomQWidget *customWidget = new CustomQWidget;
+ customWidget->setObjectName(QString::fromLatin1("Hello"));
+ QTest::newRow("from Derived QWidget") << QVariant::fromValue(customWidget) << true;
+ QTest::newRow("from custom Object") << QVariant::fromValue(CustomNonQObject()) << false;
+
+ // Deleted in cleanupTestCase.
+ customNonQObjectPointer = new CustomNonQObject;
+ QTest::newRow("from custom ObjectStar") << QVariant::fromValue(customNonQObjectPointer) << false;
+
+ // Deleted in cleanupTestCase.
+ objectPointerTestData.push_back(obj);
+ objectPointerTestData.push_back(widget);
+ objectPointerTestData.push_back(customObject);
+ objectPointerTestData.push_back(customWidget);
+}
+
+void tst_QVariant::qvariant_cast_QObject()
+{
QFETCH(QVariant, data);
QFETCH(bool, success);
@@ -2481,6 +2534,38 @@ void tst_QVariant::qvariant_cast_QObject() {
}
}
+class CustomQObjectDerived : public CustomQObject {
+ Q_OBJECT
+public:
+ CustomQObjectDerived(QObject *parent = 0) : CustomQObject(parent) {}
+};
+Q_DECLARE_METATYPE(CustomQObjectDerived*)
+
+void tst_QVariant::qvariant_cast_QObject_derived()
+{
+ {
+ CustomQObjectDerived *object = new CustomQObjectDerived(this);
+ QVariant data = QVariant::fromValue(object);
+
+ QVERIFY(data.userType() == qMetaTypeId<CustomQObjectDerived*>());
+
+ QCOMPARE(data.value<QObject *>(), object);
+ QCOMPARE(data.value<CustomQObjectDerived *>(), object);
+ QCOMPARE(data.value<CustomQObject *>(), object);
+ QVERIFY(data.value<CustomQWidget*>() == 0);
+ }
+ {
+ CustomQWidget customWidget;
+ QWidget *widget = &customWidget;
+ QVariant data = QVariant::fromValue(widget);
+ QVERIFY(data.userType() == QMetaType::QWidgetStar);
+
+ QCOMPARE(data.value<QObject*>(), widget);
+ QCOMPARE(data.value<QWidget*>(), widget);
+ QCOMPARE(data.value<CustomQWidget*>(), widget);
+ }
+}
+
Q_DECLARE_METATYPE(qint8);
void tst_QVariant::convertToQUint8() const
@@ -2696,7 +2781,7 @@ Q_DECLARE_METATYPE( MyClass )
void tst_QVariant::loadUnknownUserType()
{
qRegisterMetaType<MyClass>("MyClass");
- char data[] = {0, 0, 0, 127, 0, 0, 0, 0, 8, 77, 121, 67, 108, 97, 115, 115, 0};
+ char data[] = {0, 0, 1, 0, 0, 0, 0, 0, 8, 77, 121, 67, 108, 97, 115, 115, 0};
QByteArray ba(data, sizeof(data));
QDataStream ds(&ba, QIODevice::ReadOnly);
@@ -3306,6 +3391,7 @@ void tst_QVariant::movabilityTest()
memcpy(buffer, &variant, sizeof(QVariant));
QCOMPARE(buffer[0].type(), QVariant::UserType);
+ QCOMPARE(buffer[0].userType(), qMetaTypeId<MyNotMovable>());
MyNotMovable tmp(buffer[0].value<MyNotMovable>());
new (&variant) QVariant();
@@ -3365,12 +3451,8 @@ void tst_QVariant::colorInteger()
}
class Forward;
-QT_BEGIN_NAMESPACE namespace QtPrivate {
-template <> struct IsPointerToTypeDerivedFromQObject<Forward*> {
- enum { Value = false };
-};
-} QT_END_NAMESPACE
-Q_DECLARE_METATYPE(Forward*);
+Q_DECLARE_OPAQUE_POINTER(Forward*)
+Q_DECLARE_METATYPE(Forward*)
void tst_QVariant::forwardDeclare()
{
@@ -3460,6 +3542,7 @@ void tst_QVariant::loadQVariantFromDataStream(QDataStream::Version version)
stream >> typeName >> loadedVariant;
const int id = QMetaType::type(typeName.toLatin1());
+
QVariant constructedVariant(static_cast<QVariant::Type>(id));
QCOMPARE(constructedVariant.userType(), id);
QCOMPARE(QMetaType::typeName(loadedVariant.userType()), typeName.toLatin1().constData());
@@ -3534,7 +3617,7 @@ void tst_QVariant::debugStream_data()
{
QTest::addColumn<QVariant>("variant");
QTest::addColumn<int>("typeId");
- for (int id = QMetaType::Void; id < QMetaType::User; ++id) {
+ for (int id = 0; id < QMetaType::User; ++id) {
const char *tagName = QMetaType::typeName(id);
if (!tagName)
continue;
diff --git a/tests/auto/corelib/mimetypes/mimetypes.pro b/tests/auto/corelib/mimetypes/mimetypes.pro
new file mode 100644
index 0000000000..9063d677e7
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/mimetypes.pro
@@ -0,0 +1,8 @@
+TEMPLATE=subdirs
+
+SUBDIRS = \
+ qmimetype \
+ qmimedatabase
+
+!contains(QT_CONFIG, private_tests): SUBDIRS -= \
+ qmimetype
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
new file mode 100644
index 0000000000..815401ce1e
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
@@ -0,0 +1,12 @@
+CONFIG += testcase parallel_test
+
+TARGET = tst_qmimedatabase-cache
+
+QT = core testlib concurrent
+
+SOURCES = tst_qmimedatabase-cache.cpp
+HEADERS = ../tst_qmimedatabase.h
+
+DEFINES += SRCDIR='"\\"$$PWD/../\\""'
+
+*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/tst_qmimedatabase-cache.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/tst_qmimedatabase-cache.cpp
new file mode 100644
index 0000000000..205331d4dd
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/tst_qmimedatabase-cache.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../tst_qmimedatabase.h"
+#include <QDir>
+#include <QFile>
+#include <QtTest/QtTest>
+#include <qstandardpaths.h>
+
+#include "../tst_qmimedatabase.cpp"
+
+tst_QMimeDatabase::tst_QMimeDatabase()
+{
+ QDir here = QDir::currentPath();
+ const QString tempMime = here.absolutePath() + QString::fromLatin1("/mime");
+ runUpdateMimeDatabase(tempMime);
+ QVERIFY(QFile::exists(tempMime + QString::fromLatin1("/mime.cache")));
+}
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
new file mode 100644
index 0000000000..ac7515f781
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
@@ -0,0 +1,14 @@
+CONFIG += testcase parallel_test
+
+TARGET = tst_qmimedatabase-xml
+
+QT = core testlib concurrent
+
+CONFIG += depend_includepath
+
+SOURCES += tst_qmimedatabase-xml.cpp
+HEADERS += ../tst_qmimedatabase.h
+
+DEFINES += SRCDIR='"\\"$$PWD/../\\""'
+
+*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/tst_qmimedatabase-xml.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/tst_qmimedatabase-xml.cpp
new file mode 100644
index 0000000000..13ca372290
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/tst_qmimedatabase-xml.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../tst_qmimedatabase.h"
+#include <QDebug>
+#include <QDir>
+
+tst_QMimeDatabase::tst_QMimeDatabase()
+{
+ qputenv("QT_NO_MIME_CACHE", "1");
+}
+
+#include "../tst_qmimedatabase.cpp"
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
new file mode 100644
index 0000000000..876b4377dd
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+SUBDIRS = qmimedatabase-xml
+unix: SUBDIRS += qmimedatabase-cache
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
new file mode 100644
index 0000000000..fc86fa5431
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
@@ -0,0 +1,834 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qmimedatabase.h>
+
+#include "qstandardpaths.h"
+
+#include <QtCore/QFile>
+#include <QtConcurrent/QtConcurrentRun>
+#include <QtConcurrent/QFuture>
+
+#include <QtTest/QtTest>
+
+void initializeLang()
+{
+ qputenv("LANG", "en_US");
+}
+
+// Set LANG before QCoreApplication is created
+Q_CONSTRUCTOR_FUNCTION(initializeLang)
+
+void tst_QMimeDatabase::initTestCase()
+{
+ // Create a "global" and a "local" XDG data dir, right here.
+ // The local dir will be empty initially, while the global dir will contain a copy of freedesktop.org.xml
+
+ QDir here = QDir::currentPath();
+
+ qputenv("XDG_DATA_DIRS", QFile::encodeName(here.absolutePath()));
+ QDir(here.absolutePath() + "/mime").removeRecursively();
+ here.mkpath(QString::fromLatin1("mime/packages"));
+
+ QFile xml(QFile::decodeName(SRCDIR "../../../src/mimetypes/mime/packages/freedesktop.org.xml"));
+ const QString mimeDir = here.absolutePath() + QLatin1String("/mime");
+ xml.copy(mimeDir + QLatin1String("/packages/freedesktop.org.xml"));
+
+ m_dataHome = here.absolutePath() + QLatin1String("/../datahome");
+ qputenv("XDG_DATA_HOME", QFile::encodeName(m_dataHome));
+ //qDebug() << "XDG_DATA_HOME=" << m_dataHome;
+
+ // Make sure we start clean
+ cleanupTestCase();
+}
+
+void tst_QMimeDatabase::cleanupTestCase()
+{
+ QDir here = QDir::currentPath();
+ here.remove(QString::fromLatin1("mime/packages/yast2-metapackage-handler-mimetypes.xml"));
+
+ QDir(m_dataHome).removeRecursively();
+}
+
+void tst_QMimeDatabase::mimeTypeForName()
+{
+ QMimeDatabase db;
+ QMimeType s0 = db.mimeTypeForName(QString::fromLatin1("application/x-zerosize"));
+ QVERIFY(s0.isValid());
+ QCOMPARE(s0.name(), QString::fromLatin1("application/x-zerosize"));
+ QCOMPARE(s0.comment(), QString::fromLatin1("empty document"));
+
+ QMimeType s0Again = db.mimeTypeForName(QString::fromLatin1("application/x-zerosize"));
+ QCOMPARE(s0Again.name(), s0.name());
+
+ QMimeType s1 = db.mimeTypeForName(QString::fromLatin1("text/plain"));
+ QVERIFY(s1.isValid());
+ QCOMPARE(s1.name(), QString::fromLatin1("text/plain"));
+ //qDebug("Comment is %s", qPrintable(s1.comment()));
+
+ QMimeType krita = db.mimeTypeForName(QString::fromLatin1("application/x-krita"));
+ QVERIFY(krita.isValid());
+
+ // Test <comment> parsing with application/rdf+xml which has the english comment after the other ones
+ QMimeType rdf = db.mimeTypeForName(QString::fromLatin1("application/rdf+xml"));
+ QVERIFY(rdf.isValid());
+ QCOMPARE(rdf.comment(), QString::fromLatin1("RDF file"));
+
+ QMimeType bzip2 = db.mimeTypeForName(QString::fromLatin1("application/x-bzip2"));
+ QVERIFY(bzip2.isValid());
+ QCOMPARE(bzip2.comment(), QString::fromLatin1("Bzip archive"));
+
+ QMimeType defaultMime = db.mimeTypeForName(QString::fromLatin1("application/octet-stream"));
+ QVERIFY(defaultMime.isValid());
+ QVERIFY(defaultMime.isDefault());
+
+ QMimeType doesNotExist = db.mimeTypeForName(QString::fromLatin1("foobar/x-doesnot-exist"));
+ QVERIFY(!doesNotExist.isValid());
+
+ // TODO move to findByFile
+#ifdef Q_OS_LINUX
+ QString exePath = QStandardPaths::findExecutable(QLatin1String("ls"));
+ if (exePath.isEmpty())
+ qWarning() << "ls not found";
+ else {
+ const QString executableType = QString::fromLatin1("application/x-executable");
+ //QTest::newRow("executable") << exePath << executableType;
+ QCOMPARE(db.mimeTypeForFile(exePath).name(), executableType);
+ }
+#endif
+
+}
+
+void tst_QMimeDatabase::mimeTypeForFileName_data()
+{
+ QTest::addColumn<QString>("fileName");
+ QTest::addColumn<QString>("expectedMimeType");
+
+ QTest::newRow("text") << "textfile.txt" << "text/plain";
+ QTest::newRow("case-insensitive search") << "textfile.TxT" << "text/plain";
+
+ // Needs shared-mime-info > 0.91. Earlier versions wrote .Z to the mime.cache file...
+ //QTest::newRow("case-insensitive match on a non-lowercase glob") << "foo.z" << "application/x-compress";
+
+ QTest::newRow("case-sensitive uppercase match") << "textfile.C" << "text/x-c++src";
+ QTest::newRow("case-sensitive lowercase match") << "textfile.c" << "text/x-csrc";
+ QTest::newRow("case-sensitive long-extension match") << "foo.PS.gz" << "application/x-gzpostscript";
+ QTest::newRow("case-sensitive-only match") << "core" << "application/x-core";
+ QTest::newRow("case-sensitive-only match") << "Core" << "application/octet-stream"; // #198477
+
+ QTest::newRow("desktop file") << "foo.desktop" << "application/x-desktop";
+ QTest::newRow("old kdelnk file is x-desktop too") << "foo.kdelnk" << "application/x-desktop";
+ QTest::newRow("double-extension file") << "foo.tar.bz2" << "application/x-bzip-compressed-tar";
+ QTest::newRow("single-extension file") << "foo.bz2" << "application/x-bzip";
+ QTest::newRow(".doc should assume msword") << "somefile.doc" << "application/msword"; // #204139
+ QTest::newRow("glob that uses [] syntax, 1") << "Makefile" << "text/x-makefile";
+ QTest::newRow("glob that uses [] syntax, 2") << "makefile" << "text/x-makefile";
+ QTest::newRow("glob that ends with *, no extension") << "README" << "text/x-readme";
+ QTest::newRow("glob that ends with *, extension") << "README.foo" << "text/x-readme";
+ QTest::newRow("glob that ends with *, also matches *.txt. Higher weight wins.") << "README.txt" << "text/plain";
+ QTest::newRow("glob that ends with *, also matches *.nfo. Higher weight wins.") << "README.nfo" << "text/x-nfo";
+ // fdo bug 15436, needs shared-mime-info >= 0.40 (and this tests the globs2-parsing code).
+ QTest::newRow("glob that ends with *, also matches *.pdf. *.pdf has higher weight") << "README.pdf" << "application/pdf";
+ QTest::newRow("directory") << "/" << "inode/directory";
+ QTest::newRow("doesn't exist, no extension") << "IDontExist" << "application/octet-stream";
+ QTest::newRow("doesn't exist but has known extension") << "IDontExist.txt" << "text/plain";
+}
+
+void tst_QMimeDatabase::mimeTypeForFileName()
+{
+ QFETCH(QString, fileName);
+ QFETCH(QString, expectedMimeType);
+ QMimeDatabase db;
+ QMimeType mime = db.mimeTypeForFile(fileName, QMimeDatabase::MatchExtension);
+ QVERIFY(mime.isValid());
+ QCOMPARE(mime.name(), expectedMimeType);
+
+ QList<QMimeType> mimes = db.mimeTypesForFileName(fileName);
+ if (expectedMimeType == "application/octet-stream") {
+ QVERIFY(mimes.isEmpty());
+ } else {
+ QVERIFY(!mimes.isEmpty());
+ QCOMPARE(mimes.count(), 1);
+ QCOMPARE(mimes.first().name(), expectedMimeType);
+ }
+}
+
+void tst_QMimeDatabase::mimeTypesForFileName_data()
+{
+ QTest::addColumn<QString>("fileName");
+ QTest::addColumn<QStringList>("expectedMimeTypes");
+
+ QTest::newRow("txt, 1 hit") << "foo.txt" << (QStringList() << "text/plain");
+ QTest::newRow("txtfoobar, 0 hit") << "foo.foobar" << QStringList();
+ QTest::newRow("m, 2 hits") << "foo.m" << (QStringList() << "text/x-matlab" << "text/x-objcsrc");
+ QTest::newRow("sub, 3 hits") << "foo.sub" << (QStringList() << "text/x-microdvd" << "text/x-mpsub" << "text/x-subviewer");
+}
+
+void tst_QMimeDatabase::mimeTypesForFileName()
+{
+ QFETCH(QString, fileName);
+ QFETCH(QStringList, expectedMimeTypes);
+ QMimeDatabase db;
+ QList<QMimeType> mimes = db.mimeTypesForFileName(fileName);
+ QStringList mimeNames;
+ foreach (const QMimeType &mime, mimes)
+ mimeNames.append(mime.name());
+ QCOMPARE(mimeNames, expectedMimeTypes);
+}
+
+void tst_QMimeDatabase::inheritance()
+{
+ QMimeDatabase db;
+
+ // All file-like mimetypes inherit from octet-stream
+ const QMimeType wordperfect = db.mimeTypeForName(QString::fromLatin1("application/vnd.wordperfect"));
+ QVERIFY(wordperfect.isValid());
+ QCOMPARE(wordperfect.parentMimeTypes().join(QString::fromLatin1(",")), QString::fromLatin1("application/octet-stream"));
+ QVERIFY(wordperfect.inherits(QLatin1String("application/octet-stream")));
+
+ QVERIFY(db.mimeTypeForName(QString::fromLatin1("image/svg+xml-compressed")).inherits(QLatin1String("application/x-gzip")));
+
+ // Check that msword derives from ole-storage
+ const QMimeType msword = db.mimeTypeForName(QString::fromLatin1("application/msword"));
+ QVERIFY(msword.isValid());
+ const QMimeType olestorage = db.mimeTypeForName(QString::fromLatin1("application/x-ole-storage"));
+ QVERIFY(olestorage.isValid());
+ QVERIFY(msword.inherits(olestorage.name()));
+ QVERIFY(msword.inherits(QLatin1String("application/octet-stream")));
+
+ const QMimeType directory = db.mimeTypeForName(QString::fromLatin1("inode/directory"));
+ QVERIFY(directory.isValid());
+ QCOMPARE(directory.parentMimeTypes().count(), 0);
+ QVERIFY(!directory.inherits(QLatin1String("application/octet-stream")));
+
+ // Check that text/x-patch knows that it inherits from text/plain (it says so explicitly)
+ const QMimeType plain = db.mimeTypeForName(QString::fromLatin1("text/plain"));
+ const QMimeType derived = db.mimeTypeForName(QString::fromLatin1("text/x-patch"));
+ QVERIFY(derived.isValid());
+ QCOMPARE(derived.parentMimeTypes().join(QString::fromLatin1(",")), plain.name());
+ QVERIFY(derived.inherits(QLatin1String("text/plain")));
+ QVERIFY(derived.inherits(QLatin1String("application/octet-stream")));
+
+ // Check that application/x-shellscript inherits from application/x-executable
+ // (Otherwise KRun cannot start shellscripts...)
+ // This is a test for multiple inheritance...
+ const QMimeType shellscript = db.mimeTypeForName(QString::fromLatin1("application/x-shellscript"));
+ QVERIFY(shellscript.isValid());
+ QVERIFY(shellscript.inherits(QLatin1String("text/plain")));
+ QVERIFY(shellscript.inherits(QLatin1String("application/x-executable")));
+ const QStringList shellParents = shellscript.parentMimeTypes();
+ QVERIFY(shellParents.contains(QLatin1String("text/plain")));
+ QVERIFY(shellParents.contains(QLatin1String("application/x-executable")));
+ QCOMPARE(shellParents.count(), 2); // only the above two
+ const QStringList allShellAncestors = shellscript.allAncestors();
+ QVERIFY(allShellAncestors.contains(QLatin1String("text/plain")));
+ QVERIFY(allShellAncestors.contains(QLatin1String("application/x-executable")));
+ QVERIFY(allShellAncestors.contains(QLatin1String("application/octet-stream")));
+ // Must be least-specific last, i.e. breadth first.
+ QCOMPARE(allShellAncestors.last(), QString::fromLatin1("application/octet-stream"));
+
+ const QStringList allSvgAncestors = db.mimeTypeForName(QString::fromLatin1("image/svg+xml")).allAncestors();
+ QCOMPARE(allSvgAncestors, QStringList() << QLatin1String("application/xml") << QLatin1String("text/plain") << QLatin1String("application/octet-stream"));
+
+ // Check that text/x-mrml knows that it inherits from text/plain (implicitly)
+ const QMimeType mrml = db.mimeTypeForName(QString::fromLatin1("text/x-mrml"));
+ QVERIFY(mrml.isValid());
+ QVERIFY(mrml.inherits(QLatin1String("text/plain")));
+ QVERIFY(mrml.inherits(QLatin1String("application/octet-stream")));
+
+ // Check that msword-template inherits msword
+ const QMimeType mswordTemplate = db.mimeTypeForName(QString::fromLatin1("application/msword-template"));
+ QVERIFY(mswordTemplate.isValid());
+ QVERIFY(mswordTemplate.inherits(QLatin1String("application/msword")));
+}
+
+void tst_QMimeDatabase::aliases()
+{
+ QMimeDatabase db;
+
+ const QMimeType canonical = db.mimeTypeForName(QString::fromLatin1("application/xml"));
+ QVERIFY(canonical.isValid());
+
+ QMimeType resolvedAlias = db.mimeTypeForName(QString::fromLatin1("text/xml"));
+ QVERIFY(resolvedAlias.isValid());
+ QCOMPARE(resolvedAlias.name(), QString::fromLatin1("application/xml"));
+
+ QVERIFY(resolvedAlias.inherits(QLatin1String("application/xml")));
+ QVERIFY(canonical.inherits(QLatin1String("text/xml")));
+
+ // Test for kde bug 197346: does nspluginscan see that audio/mp3 already exists?
+ bool mustWriteMimeType = !db.mimeTypeForName(QString::fromLatin1("audio/mp3")).isValid();
+ QVERIFY(!mustWriteMimeType);
+}
+
+void tst_QMimeDatabase::icons()
+{
+ QMimeDatabase db;
+ QMimeType directory = db.mimeTypeForFile(QString::fromLatin1("/"));
+ QCOMPARE(directory.name(), QString::fromLatin1("inode/directory"));
+ QCOMPARE(directory.iconName(), QString::fromLatin1("inode-directory"));
+ QCOMPARE(directory.genericIconName(), QString::fromLatin1("inode-x-generic"));
+
+ QMimeType pub = db.mimeTypeForFile(QString::fromLatin1("foo.epub"), QMimeDatabase::MatchExtension);
+ QCOMPARE(pub.name(), QString::fromLatin1("application/epub+zip"));
+ QCOMPARE(pub.iconName(), QString::fromLatin1("application-epub+zip"));
+ QCOMPARE(pub.genericIconName(), QString::fromLatin1("x-office-document"));
+}
+
+// In here we do the tests that need some content in a temporary file.
+// This could also be added to shared-mime-info's testsuite...
+void tst_QMimeDatabase::mimeTypeForFileWithContent()
+{
+ QMimeDatabase db;
+ QMimeType mime;
+
+ // Test a real PDF file.
+ // If we find x-matlab because it starts with '%' then we are not ordering by priority.
+ QTemporaryFile tempFile;
+ QVERIFY(tempFile.open());
+ QString tempFileName = tempFile.fileName();
+ tempFile.write("%PDF-");
+ tempFile.close();
+ mime = db.mimeTypeForFile(tempFileName);
+ QCOMPARE(mime.name(), QString::fromLatin1("application/pdf"));
+ QFile file(tempFileName);
+ mime = db.mimeTypeForData(&file); // QIODevice ctor
+ QCOMPARE(mime.name(), QString::fromLatin1("application/pdf"));
+ // by name only, we cannot find the mimetype
+ mime = db.mimeTypeForFile(tempFileName, QMimeDatabase::MatchExtension);
+ QVERIFY(mime.isValid());
+ QVERIFY(mime.isDefault());
+
+ // Test the case where the extension doesn't match the contents: extension wins
+ {
+ QTemporaryFile txtTempFile(QDir::tempPath() + QLatin1String("/tst_QMimeDatabase_XXXXXX.txt"));
+ QVERIFY(txtTempFile.open());
+ txtTempFile.write("%PDF-");
+ QString txtTempFileName = txtTempFile.fileName();
+ txtTempFile.close();
+ mime = db.mimeTypeForFile(txtTempFileName);
+ QCOMPARE(mime.name(), QString::fromLatin1("text/plain"));
+ // fast mode finds the same
+ mime = db.mimeTypeForFile(txtTempFileName, QMimeDatabase::MatchExtension);
+ QCOMPARE(mime.name(), QString::fromLatin1("text/plain"));
+ }
+
+ // Now the case where extension differs from contents, but contents has >80 magic rule
+ // XDG spec says: contents wins. But we can't sniff all files...
+ {
+ QTemporaryFile txtTempFile(QDir::tempPath() + QLatin1String("/tst_QMimeDatabase_XXXXXX.txt"));
+ QVERIFY(txtTempFile.open());
+ txtTempFile.write("<smil");
+ QString txtTempFileName = txtTempFile.fileName();
+ txtTempFile.close();
+ mime = db.mimeTypeForFile(txtTempFileName);
+ QCOMPARE(mime.name(), QString::fromLatin1("text/plain"));
+ }
+
+ // Test what happens with an incorrect path
+ mime = db.mimeTypeForFile(QString::fromLatin1("file:///etc/passwd" /* incorrect code, use a path instead */));
+ QVERIFY(mime.isDefault());
+
+ // findByData when the device cannot be opened (e.g. a directory)
+ QFile dir("/");
+ mime = db.mimeTypeForData(&dir);
+ QVERIFY(mime.isDefault());
+}
+
+void tst_QMimeDatabase::mimeTypeForUrl()
+{
+ QMimeDatabase db;
+ QVERIFY(db.mimeTypeForUrl(QUrl::fromEncoded("http://foo/bar.png")).isDefault()); // HTTP can't know before downloading
+ QCOMPARE(db.mimeTypeForUrl(QUrl::fromEncoded("ftp://foo/bar.png")).name(), QString::fromLatin1("image/png"));
+ QCOMPARE(db.mimeTypeForUrl(QUrl::fromEncoded("ftp://foo/bar")).name(), QString::fromLatin1("application/octet-stream")); // unknown extension
+}
+
+void tst_QMimeDatabase::mimeTypeForData_data()
+{
+ QTest::addColumn<QByteArray>("data");
+ QTest::addColumn<QString>("expectedMimeTypeName");
+
+ QTest::newRow("tnef data, needs smi >= 0.20") << QByteArray("\x78\x9f\x3e\x22") << "application/vnd.ms-tnef";
+ QTest::newRow("PDF magic") << QByteArray("%PDF-") << "application/pdf";
+ QTest::newRow("PHP, High-priority rule") << QByteArray("<?php") << "application/x-php";
+ QTest::newRow("unknown") << QByteArray("\001abc?}") << "application/octet-stream";
+}
+
+void tst_QMimeDatabase::mimeTypeForData()
+{
+ QFETCH(QByteArray, data);
+ QFETCH(QString, expectedMimeTypeName);
+
+ QMimeDatabase db;
+ QCOMPARE(db.mimeTypeForData(data).name(), expectedMimeTypeName);
+ QBuffer buffer(&data);
+ QCOMPARE(db.mimeTypeForData(&buffer).name(), expectedMimeTypeName);
+ QVERIFY(!buffer.isOpen()); // initial state was restored
+
+ QVERIFY(buffer.open(QIODevice::ReadOnly));
+ QCOMPARE(db.mimeTypeForData(&buffer).name(), expectedMimeTypeName);
+ QVERIFY(buffer.isOpen());
+ QCOMPARE(buffer.pos(), qint64(0));
+}
+
+void tst_QMimeDatabase::mimeTypeForFileAndContent_data()
+{
+ QTest::addColumn<QString>("name");
+ QTest::addColumn<QByteArray>("data");
+ QTest::addColumn<QString>("expectedMimeTypeName");
+
+ QTest::newRow("plain text, no extension") << QString::fromLatin1("textfile") << QByteArray("Hello world") << "text/plain";
+ QTest::newRow("plain text, unknown extension") << QString::fromLatin1("textfile.foo") << QByteArray("Hello world") << "text/plain";
+ // Needs kde/mimetypes.xml
+ //QTest::newRow("plain text, doc extension") << QString::fromLatin1("textfile.doc") << QByteArray("Hello world") << "text/plain";
+
+ // If you get powerpoint instead, then you're hit by https://bugs.freedesktop.org/show_bug.cgi?id=435,
+ // upgrade to shared-mime-info >= 0.22
+ const QByteArray oleData("\320\317\021\340\241\261\032\341"); // same as \xD0\xCF\x11\xE0 \xA1\xB1\x1A\xE1
+ QTest::newRow("msword file, unknown extension") << QString::fromLatin1("mswordfile") << oleData << "application/x-ole-storage";
+ QTest::newRow("excel file, found by extension") << QString::fromLatin1("excelfile.xls") << oleData << "application/vnd.ms-excel";
+ QTest::newRow("text.xls, found by extension, user is in control") << QString::fromLatin1("text.xls") << oleData << "application/vnd.ms-excel";
+}
+
+void tst_QMimeDatabase::mimeTypeForFileAndContent()
+{
+ QFETCH(QString, name);
+ QFETCH(QByteArray, data);
+ QFETCH(QString, expectedMimeTypeName);
+
+ QMimeDatabase db;
+ QCOMPARE(db.mimeTypeForNameAndData(name, data).name(), expectedMimeTypeName);
+
+ QBuffer buffer(&data);
+ QCOMPARE(db.mimeTypeForNameAndData(name, &buffer).name(), expectedMimeTypeName);
+ QVERIFY(!buffer.isOpen()); // initial state was restored
+
+ QVERIFY(buffer.open(QIODevice::ReadOnly));
+ QCOMPARE(db.mimeTypeForNameAndData(name, &buffer).name(), expectedMimeTypeName);
+ QVERIFY(buffer.isOpen());
+ QCOMPARE(buffer.pos(), qint64(0));
+}
+
+void tst_QMimeDatabase::allMimeTypes()
+{
+ QMimeDatabase db;
+ const QList<QMimeType> lst = db.allMimeTypes(); // does NOT include aliases
+ QVERIFY(!lst.isEmpty());
+
+ // Hardcoding this is the only way to check both providers find the same number of mimetypes.
+ QCOMPARE(lst.count(), 661);
+
+ foreach (const QMimeType &mime, lst) {
+ const QString name = mime.name();
+ QVERIFY(!name.isEmpty());
+ QCOMPARE(name.count(QLatin1Char('/')), 1);
+ const QMimeType lookedupMime = db.mimeTypeForName(name);
+ QVERIFY(lookedupMime.isValid());
+ QCOMPARE(lookedupMime.name(), name); // if this fails, you have an alias defined as a real mimetype too!
+ }
+}
+
+void tst_QMimeDatabase::inheritsPerformance()
+{
+ // Check performance of inherits().
+ // This benchmark (which started in 2009 in kmimetypetest.cpp) uses 40 mimetypes.
+ QStringList mimeTypes; mimeTypes << QLatin1String("image/jpeg") << QLatin1String("image/png") << QLatin1String("image/tiff") << QLatin1String("text/plain") << QLatin1String("text/html");
+ mimeTypes += mimeTypes;
+ mimeTypes += mimeTypes;
+ mimeTypes += mimeTypes;
+ QCOMPARE(mimeTypes.count(), 40);
+ QMimeDatabase db;
+ QMimeType mime = db.mimeTypeForName(QString::fromLatin1("text/x-chdr"));
+ QVERIFY(mime.isValid());
+ QBENCHMARK {
+ QString match;
+ foreach (const QString &mt, mimeTypes) {
+ if (mime.inherits(mt)) {
+ match = mt;
+ // of course there would normally be a "break" here, but we're testing worse-case
+ // performance here
+ }
+ }
+ QCOMPARE(match, QString::fromLatin1("text/plain"));
+ }
+ // Numbers from 2011, in release mode:
+ // KDE 4.7 numbers: 0.21 msec / 494,000 ticks / 568,345 instr. loads per iteration
+ // QMimeBinaryProvider (with Qt 5): 0.16 msec / NA / 416,049 instr. reads per iteration
+ // QMimeXmlProvider (with Qt 5): 0.062 msec / NA / 172,889 instr. reads per iteration
+ // (but the startup time is way higher)
+ // And memory usage is flat at 200K with QMimeBinaryProvider, while it peaks at 6 MB when
+ // parsing XML, and then keeps being around 4.5 MB for all the in-memory hashes.
+}
+
+void tst_QMimeDatabase::suffixes_data()
+{
+ QTest::addColumn<QString>("mimeType");
+ QTest::addColumn<QString>("patterns");
+ QTest::addColumn<QString>("preferredSuffix");
+
+ QTest::newRow("mimetype with a single pattern") << "application/pdf" << "*.pdf" << "pdf";
+ QTest::newRow("mimetype with multiple patterns") << "application/x-kpresenter" << "*.kpr;*.kpt" << "kpr";
+ //if (KMimeType::sharedMimeInfoVersion() > KDE_MAKE_VERSION(0, 60, 0)) {
+ QTest::newRow("mimetype with many patterns") << "application/vnd.wordperfect" << "*.wp;*.wp4;*.wp5;*.wp6;*.wpd;*.wpp" << "wp";
+ //}
+ QTest::newRow("oasis text mimetype") << "application/vnd.oasis.opendocument.text" << "*.odt" << "odt";
+ QTest::newRow("oasis presentation mimetype") << "application/vnd.oasis.opendocument.presentation" << "*.odp" << "odp";
+ QTest::newRow("mimetype with multiple patterns") << "text/plain" << "*.asc;*.txt;*,v" << "txt";
+ QTest::newRow("mimetype with uncommon pattern") << "text/x-readme" << "README*" << QString();
+ QTest::newRow("mimetype with no patterns") << "application/x-ole-storage" << QString() << QString();
+}
+
+void tst_QMimeDatabase::suffixes()
+{
+ QFETCH(QString, mimeType);
+ QFETCH(QString, patterns);
+ QFETCH(QString, preferredSuffix);
+ QMimeDatabase db;
+ QMimeType mime = db.mimeTypeForName(mimeType);
+ QVERIFY(mime.isValid());
+ // Sort both lists; order is unreliable since shared-mime-info uses hashes internally.
+ QStringList expectedPatterns = patterns.split(QLatin1Char(';'));
+ expectedPatterns.sort();
+ QStringList mimePatterns = mime.globPatterns();
+ mimePatterns.sort();
+ QCOMPARE(mimePatterns.join(QLatin1String(";")), expectedPatterns.join(QLatin1String(";")));
+ QCOMPARE(mime.preferredSuffix(), preferredSuffix);
+}
+
+void tst_QMimeDatabase::knownSuffix()
+{
+ QMimeDatabase db;
+ QCOMPARE(db.suffixForFileName(QString::fromLatin1("foo.tar")), QString::fromLatin1("tar"));
+ QCOMPARE(db.suffixForFileName(QString::fromLatin1("foo.bz2")), QString::fromLatin1("bz2"));
+ QCOMPARE(db.suffixForFileName(QString::fromLatin1("foo.bar.bz2")), QString::fromLatin1("bz2"));
+ QCOMPARE(db.suffixForFileName(QString::fromLatin1("foo.tar.bz2")), QString::fromLatin1("tar.bz2"));
+}
+
+void tst_QMimeDatabase::findByFileName_data()
+{
+ QTest::addColumn<QString>("filePath");
+ QTest::addColumn<QString>("mimeTypeName");
+ QTest::addColumn<QString>("xFail");
+
+ QString prefix = QLatin1String(SRCDIR "testfiles/");
+
+ QFile f(prefix + QLatin1String("list"));
+ if (!f.open(QIODevice::ReadOnly)) {
+ const QString warning = QString::fromLatin1(
+ "Please download the shared-mime-info test suite:\n"
+ "cd tests/auto/corelib/mimetypes/qmimedatabase\n"
+ "wget http://cgit.freedesktop.org/xdg/shared-mime-info/snapshot/Release-1-0.zip\n"
+ "unzip Release-1-0.zip\n"
+ "ln -s Release-1-0/tests testfiles\n"
+ );
+ qWarning() << warning;
+ QSKIP("shared-mime-info test suite not available.");
+ }
+
+ QByteArray line(1024, Qt::Uninitialized);
+
+ while (!f.atEnd()) {
+ int len = f.readLine(line.data(), 1023);
+
+ if (len <= 2 || line.at(0) == '#')
+ continue;
+
+ QString string = QString::fromLatin1(line.constData(), len - 1).trimmed();
+ QStringList list = string.split(QLatin1Char(' '), QString::SkipEmptyParts);
+ QVERIFY(list.size() >= 2);
+
+ QString filePath = list.at(0);
+ QString mimeTypeType = list.at(1);
+ QString xFail;
+ if (list.size() >= 3)
+ xFail = list.at(2);
+
+ QTest::newRow(filePath.toLatin1().constData()) << QString(prefix + filePath) << mimeTypeType << xFail;
+ }
+}
+
+void tst_QMimeDatabase::findByFileName()
+{
+ QFETCH(QString, filePath);
+ QFETCH(QString, mimeTypeName);
+ QFETCH(QString, xFail);
+
+ QMimeDatabase database;
+
+ //qDebug() << Q_FUNC_INFO << filePath;
+
+ const QMimeType resultMimeType(database.mimeTypeForFile(filePath, QMimeDatabase::MatchExtension));
+ if (resultMimeType.isValid()) {
+ //qDebug() << Q_FUNC_INFO << "MIME type" << resultMimeType.name() << "has generic icon name" << resultMimeType.genericIconName() << "and icon name" << resultMimeType.iconName();
+
+// Loading icons depend on the icon theme, we can't enable this test
+#if 0
+ QCOMPARE(resultMimeType.genericIconName(), QIcon::fromTheme(resultMimeType.genericIconName()).name());
+ QVERIFY2(!QIcon::fromTheme(resultMimeType.genericIconName()).isNull(), qPrintable(resultMimeType.genericIconName()));
+ QVERIFY2(QIcon::hasThemeIcon(resultMimeType.genericIconName()), qPrintable(resultMimeType.genericIconName()));
+
+ QCOMPARE(resultMimeType.iconName(), QIcon::fromTheme(resultMimeType.iconName()).name());
+ QVERIFY2(!QIcon::fromTheme(resultMimeType.iconName()).isNull(), qPrintable(resultMimeType.iconName()));
+ QVERIFY2(QIcon::hasThemeIcon(resultMimeType.iconName()), qPrintable(resultMimeType.iconName()));
+#endif
+ }
+ const QString resultMimeTypeName = resultMimeType.name();
+ //qDebug() << Q_FUNC_INFO << "mimeTypeForFile() returned" << resultMimeTypeName;
+
+ const bool failed = resultMimeTypeName != mimeTypeName;
+ const bool shouldFail = (xFail.length() >= 1 && xFail.at(0) == QLatin1Char('x'));
+ if (shouldFail != failed) {
+ // Results are ambiguous when multiple MIME types have the same glob
+ // -> accept the current result if the found MIME type actually
+ // matches the file's extension.
+ // TODO: a better file format in testfiles/list!
+ const QMimeType foundMimeType = database.mimeTypeForName(resultMimeTypeName);
+ QVERIFY2(resultMimeType == foundMimeType, qPrintable(resultMimeType.name() + QString::fromLatin1(" vs. ") + foundMimeType.name()));
+ if (foundMimeType.isValid()) {
+ const QString extension = QFileInfo(filePath).suffix();
+ //qDebug() << Q_FUNC_INFO << "globPatterns:" << foundMimeType.globPatterns() << "- extension:" << QString() + "*." + extension;
+ if (foundMimeType.globPatterns().contains(QString::fromLatin1("*.") + extension))
+ return;
+ }
+ }
+ if (shouldFail) {
+ // Expected to fail
+ QVERIFY2(resultMimeTypeName != mimeTypeName, qPrintable(resultMimeTypeName));
+ } else {
+ QCOMPARE(resultMimeTypeName, mimeTypeName);
+ }
+
+ // Test QFileInfo overload
+ const QMimeType mimeForFileInfo = database.mimeTypeForFile(QFileInfo(filePath), QMimeDatabase::MatchExtension);
+ QCOMPARE(mimeForFileInfo.name(), resultMimeTypeName);
+}
+
+void tst_QMimeDatabase::findByData_data()
+{
+ findByFileName_data();
+}
+
+void tst_QMimeDatabase::findByData()
+{
+ QFETCH(QString, filePath);
+ QFETCH(QString, mimeTypeName);
+ QFETCH(QString, xFail);
+
+ QMimeDatabase database;
+ QFile f(filePath);
+ QVERIFY(f.open(QIODevice::ReadOnly));
+ QByteArray data = f.read(16384);
+
+ const QString resultMimeTypeName = database.mimeTypeForData(data).name();
+ if (xFail.length() >= 2 && xFail.at(1) == QLatin1Char('x')) {
+ // Expected to fail
+ QVERIFY2(resultMimeTypeName != mimeTypeName, qPrintable(resultMimeTypeName));
+ } else {
+ QCOMPARE(resultMimeTypeName, mimeTypeName);
+ }
+
+ QFileInfo info(filePath);
+ QString mimeForInfo = database.mimeTypeForFile(info, QMimeDatabase::MatchContent).name();
+ QCOMPARE(mimeForInfo, resultMimeTypeName);
+}
+
+void tst_QMimeDatabase::findByFile_data()
+{
+ findByFileName_data();
+}
+
+void tst_QMimeDatabase::findByFile()
+{
+ QFETCH(QString, filePath);
+ QFETCH(QString, mimeTypeName);
+ QFETCH(QString, xFail);
+
+ QMimeDatabase database;
+ const QString resultMimeTypeName = database.mimeTypeForFile(filePath).name();
+ //qDebug() << Q_FUNC_INFO << filePath << "->" << resultMimeTypeName;
+ if (xFail.length() >= 3 && xFail.at(2) == QLatin1Char('x')) {
+ // Expected to fail
+ QVERIFY2(resultMimeTypeName != mimeTypeName, qPrintable(resultMimeTypeName));
+ } else {
+ QCOMPARE(resultMimeTypeName, mimeTypeName);
+ }
+
+ // Test QFileInfo overload
+ const QMimeType mimeForFileInfo = database.mimeTypeForFile(QFileInfo(filePath));
+ QCOMPARE(mimeForFileInfo.name(), resultMimeTypeName);
+}
+
+
+void tst_QMimeDatabase::fromThreads()
+{
+ QThreadPool::globalInstance()->setMaxThreadCount(20);
+ // Note that data-based tests cannot be used here (QTest::fetchData asserts).
+ QList<QFuture<void> > futures;
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::mimeTypeForName);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::aliases);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::allMimeTypes);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::icons);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::inheritance);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::knownSuffix);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::mimeTypeForFileWithContent);
+ futures << QtConcurrent::run(this, &tst_QMimeDatabase::allMimeTypes); // a second time
+ Q_FOREACH (QFuture<void> f, futures)
+ f.waitForFinished();
+}
+
+static bool runUpdateMimeDatabase(const QString &path) // TODO make it a QMimeDatabase method?
+{
+ const QString umd = QStandardPaths::findExecutable(QString::fromLatin1("update-mime-database"));
+ if (umd.isEmpty())
+ return false;
+
+ QProcess proc;
+ proc.setProcessChannelMode(QProcess::MergedChannels); // silence output
+ proc.start(umd, QStringList() << path);
+ proc.waitForFinished();
+ //qDebug() << "runUpdateMimeDatabase" << path;
+ return true;
+}
+
+static bool waitAndRunUpdateMimeDatabase(const QString &path)
+{
+ QFileInfo mimeCacheInfo(path + QString::fromLatin1("/mime.cache"));
+ if (mimeCacheInfo.exists()) {
+ // Wait until the begining of the next second
+ while (mimeCacheInfo.lastModified().secsTo(QDateTime::currentDateTime()) == 0) {
+ QTest::qSleep(200);
+ }
+ }
+ return runUpdateMimeDatabase(path);
+}
+
+static void checkHasMimeType(const QString &mimeType)
+{
+ QMimeDatabase db;
+ QVERIFY(db.mimeTypeForName(mimeType).isValid());
+
+ bool found = false;
+ foreach (const QMimeType &mt, db.allMimeTypes()) {
+ if (mt.name() == mimeType) {
+ found = true;
+ break;
+ }
+ }
+ QVERIFY(found);
+}
+
+QT_BEGIN_NAMESPACE
+extern Q_CORE_EXPORT int qmime_secondsBetweenChecks; // see qmimeprovider.cpp
+QT_END_NAMESPACE
+
+void tst_QMimeDatabase::installNewGlobalMimeType()
+{
+ qmime_secondsBetweenChecks = 0;
+
+ QMimeDatabase db;
+ QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+
+ const QString fileName = QLatin1String("yast2-metapackage-handler-mimetypes.xml");
+ const QString srcFile = QFile::decodeName(SRCDIR) + fileName;
+
+ QDir here = QDir::currentPath();
+ const QString mimeDir = here.absolutePath() + QLatin1String("/mime");
+ const QString destDir = mimeDir + QLatin1String("/packages/");
+ const QString destFile = destDir + fileName;
+ QFile::remove(destFile);
+ //qDebug() << destFile;
+ QVERIFY(QFile::copy(srcFile, destFile));
+ if (!waitAndRunUpdateMimeDatabase(mimeDir))
+ QSKIP("shared-mime-info not found, skipping mime.cache test");
+
+ QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
+ QString::fromLatin1("text/x-suse-ymu"));
+ QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+ checkHasMimeType("text/x-suse-ymp");
+
+ // Now test removing it again
+ QFile::remove(destFile);
+ if (!waitAndRunUpdateMimeDatabase(mimeDir))
+ QSKIP("shared-mime-info not found, skipping mime.cache test");
+ QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
+ QString::fromLatin1("application/octet-stream"));
+ QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+}
+
+void tst_QMimeDatabase::installNewLocalMimeType()
+{
+ qmime_secondsBetweenChecks = 0;
+
+ QMimeDatabase db;
+ QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+
+ const QString fileName = QLatin1String("yast2-metapackage-handler-mimetypes.xml");
+ const QString srcFile = QFile::decodeName(SRCDIR) + fileName;
+ const QString mimeDir = m_dataHome + QLatin1String("/mime");
+ const QString destDir = mimeDir + QLatin1String("/packages/");
+ QDir().mkpath(destDir);
+ const QString destFile = destDir + fileName;
+ QFile::remove(destFile);
+ QVERIFY(QFile::copy(srcFile, destFile));
+ if (!runUpdateMimeDatabase(mimeDir))
+ QSKIP("shared-mime-info not found, skipping mime.cache test");;
+
+ QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
+ QString::fromLatin1("text/x-suse-ymu"));
+ QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+ checkHasMimeType("text/x-suse-ymp");
+
+ // Now test removing it again (note, this leaves a mostly-empty mime.cache file)
+ QFile::remove(destFile);
+ if (!waitAndRunUpdateMimeDatabase(mimeDir))
+ QSKIP("shared-mime-info not found, skipping mime.cache test");
+ QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
+ QString::fromLatin1("application/octet-stream"));
+ QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+
+ // And now the user goes wild and uses rm -rf
+ QFile::remove(mimeDir + QString::fromLatin1("/mime.cache"));
+ QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
+ QString::fromLatin1("application/octet-stream"));
+ QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
+}
+
+QTEST_GUILESS_MAIN(tst_QMimeDatabase)
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.h b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.h
new file mode 100644
index 0000000000..869990401c
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TST_QMIMEDATABASE_H
+#define TST_QMIMEDATABASE_H
+
+#include <QtCore/QObject>
+
+class tst_QMimeDatabase : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QMimeDatabase();
+
+private slots:
+ void initTestCase();
+ void cleanupTestCase();
+
+ void mimeTypeForName();
+ void mimeTypeForFileName_data();
+ void mimeTypeForFileName();
+ void mimeTypesForFileName_data();
+ void mimeTypesForFileName();
+ void inheritance();
+ void aliases();
+ void icons();
+ void mimeTypeForFileWithContent();
+ void mimeTypeForUrl();
+ void mimeTypeForData_data();
+ void mimeTypeForData();
+ void mimeTypeForFileAndContent_data();
+ void mimeTypeForFileAndContent();
+ void allMimeTypes();
+ void inheritsPerformance();
+ void suffixes_data();
+ void suffixes();
+ void knownSuffix();
+ void fromThreads();
+
+ // shared-mime-info test suite
+
+ void findByFileName_data();
+ void findByFileName();
+
+ void findByData_data();
+ void findByData();
+
+ void findByFile_data();
+ void findByFile();
+
+ //
+
+ void installNewGlobalMimeType();
+ void installNewLocalMimeType();
+
+private:
+ QString m_dataHome;
+};
+
+#endif // TST_QMIMEDATABASE_H
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/yast2-metapackage-handler-mimetypes.xml b/tests/auto/corelib/mimetypes/qmimedatabase/yast2-metapackage-handler-mimetypes.xml
new file mode 100644
index 0000000000..ef3035ef4a
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/yast2-metapackage-handler-mimetypes.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!-- http://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec -->
+<!-- to to ${PREFIX-~/.local}/share/mime/packages -->
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+ <mime-type type="text/x-suse-ymp">
+ <comment>YaST Meta Package</comment>
+ <glob pattern="*.ymp"/>
+ </mime-type>
+
+ <mime-type type="text/x-suse-ymu">
+ <comment>URL of a YaST Meta Package</comment>
+ <glob pattern="*.ymu"/>
+ </mime-type>
+</mime-info>
+
diff --git a/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro b/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
new file mode 100644
index 0000000000..125d0d280f
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
@@ -0,0 +1,7 @@
+CONFIG += testcase parallel_test
+TARGET = tst_qmimetype
+QT = core-private testlib
+
+*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor
+
+SOURCES = tst_qmimetype.cpp
diff --git a/tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp b/tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp
new file mode 100644
index 0000000000..6f24bfe6f1
--- /dev/null
+++ b/tests/auto/corelib/mimetypes/qmimetype/tst_qmimetype.cpp
@@ -0,0 +1,257 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qmimetype_p.h>
+
+#include <qmimetype.h>
+#include <qmimedatabase.h>
+
+#include <QtTest/QtTest>
+
+
+class tst_qmimetype : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+
+ void isValid();
+ void name();
+ void genericIconName();
+ void iconName();
+ void suffixes();
+};
+
+// ------------------------------------------------------------------------------------------------
+
+void tst_qmimetype::initTestCase()
+{
+ qputenv("XDG_DATA_DIRS", "doesnotexist");
+}
+
+// ------------------------------------------------------------------------------------------------
+
+static QString qMimeTypeName()
+{
+ static const QString result ("No name of the MIME type");
+ return result;
+}
+
+static QString qMimeTypeGenericIconName()
+{
+ static const QString result ("No file name of an icon image that represents the MIME type");
+ return result;
+}
+
+static QString qMimeTypeIconName()
+{
+ static const QString result ("No file name of an icon image that represents the MIME type");
+ return result;
+}
+
+static QStringList buildQMimeTypeFilenameExtensions()
+{
+ QStringList result;
+ result << QString::fromLatin1("*.png");
+ return result;
+}
+
+static QStringList qMimeTypeGlobPatterns()
+{
+ static const QStringList result (buildQMimeTypeFilenameExtensions());
+ return result;
+}
+
+// ------------------------------------------------------------------------------------------------
+
+#ifndef Q_COMPILER_RVALUE_REFS
+QMIMETYPE_BUILDER
+#else
+QMIMETYPE_BUILDER_FROM_RVALUE_REFS
+#endif
+
+// ------------------------------------------------------------------------------------------------
+
+void tst_qmimetype::isValid()
+{
+ QMimeType instantiatedQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ QVERIFY(instantiatedQMimeType.isValid());
+
+ QMimeType otherQMimeType (instantiatedQMimeType);
+
+ QVERIFY(otherQMimeType.isValid());
+ QCOMPARE(instantiatedQMimeType, otherQMimeType);
+
+ QMimeType defaultQMimeType;
+
+ QVERIFY(!defaultQMimeType.isValid());
+}
+
+// ------------------------------------------------------------------------------------------------
+
+void tst_qmimetype::name()
+{
+ QMimeType instantiatedQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ QMimeType otherQMimeType (
+ buildQMimeType (
+ QString(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ // Verify that the Name is part of the equality test:
+ QCOMPARE(instantiatedQMimeType.name(), qMimeTypeName());
+
+ QVERIFY(instantiatedQMimeType != otherQMimeType);
+ QVERIFY(!(instantiatedQMimeType == otherQMimeType));
+}
+
+// ------------------------------------------------------------------------------------------------
+
+void tst_qmimetype::genericIconName()
+{
+ QMimeType instantiatedQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ QMimeType otherQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ QString(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ // Verify that the GenericIconName is part of the equality test:
+ QCOMPARE(instantiatedQMimeType.genericIconName(), qMimeTypeGenericIconName());
+
+ QVERIFY(instantiatedQMimeType != otherQMimeType);
+ QVERIFY(!(instantiatedQMimeType == otherQMimeType));
+}
+
+// ------------------------------------------------------------------------------------------------
+
+void tst_qmimetype::iconName()
+{
+ QMimeType instantiatedQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ QMimeType otherQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ QString(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ // Verify that the IconName is part of the equality test:
+ QCOMPARE(instantiatedQMimeType.iconName(), qMimeTypeIconName());
+
+ QVERIFY(instantiatedQMimeType != otherQMimeType);
+ QVERIFY(!(instantiatedQMimeType == otherQMimeType));
+}
+
+// ------------------------------------------------------------------------------------------------
+
+void tst_qmimetype::suffixes()
+{
+ QMimeType instantiatedQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ qMimeTypeGlobPatterns()
+ )
+ );
+
+ QMimeType otherQMimeType (
+ buildQMimeType (
+ qMimeTypeName(),
+ qMimeTypeGenericIconName(),
+ qMimeTypeIconName(),
+ QStringList()
+ )
+ );
+
+ // Verify that the Suffixes are part of the equality test:
+ QCOMPARE(instantiatedQMimeType.globPatterns(), qMimeTypeGlobPatterns());
+ QCOMPARE(instantiatedQMimeType.suffixes(), QStringList() << QString::fromLatin1("png"));
+
+ QVERIFY(instantiatedQMimeType != otherQMimeType);
+ QVERIFY(!(instantiatedQMimeType == otherQMimeType));
+}
+
+// ------------------------------------------------------------------------------------------------
+
+QTEST_GUILESS_MAIN(tst_qmimetype)
+#include "tst_qmimetype.moc"
diff --git a/tests/auto/corelib/plugin/qlibrary/tst/tst.pro b/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
index 6e71ec8ff9..ae6cf97891 100644
--- a/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
+++ b/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
@@ -1,4 +1,5 @@
CONFIG += testcase
+CONFIG -= app_bundle
TARGET = ../tst_qlibrary
QT = core testlib
SOURCES = ../tst_qlibrary.cpp
@@ -12,3 +13,5 @@ win32 {
}
TESTDATA += ../library_path/invalid.so
+
+win32:CONFIG += insignificant_test # QTBUG-24151
diff --git a/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp b/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
index cff98de54f..efbc89880f 100644
--- a/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
+++ b/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
@@ -258,7 +258,7 @@ void tst_QLibrary::unload()
void tst_QLibrary::unload_after_implicit_load()
{
- QLibrary library( "./mylib" );
+ QLibrary library( QCoreApplication::applicationDirPath() + "/mylib" );
QFunctionPointer p = library.resolve("mylibversion");
QVERIFY(p); // Check if it was loaded
QVERIFY(library.isLoaded());
diff --git a/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro b/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
index cd87e68848..0ad311de99 100644
--- a/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
+++ b/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
@@ -2,5 +2,3 @@ CONFIG += testcase parallel_test
TARGET = tst_qsemaphore
QT = core testlib
SOURCES = tst_qsemaphore.cpp
-
-mac*:CONFIG+=insignificant_test
diff --git a/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp b/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
index 1d54c8e036..884e8718cb 100644
--- a/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
+++ b/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
@@ -223,11 +223,21 @@ void tst_QSemaphore::tryAcquireWithTimeout()
{
QFETCH(int, timeout);
+ // timers are not guaranteed to be accurate down to the last millisecond,
+ // so we permit the elapsed times to be up to this far from the expected value.
+ int fuzz = 10;
+
QSemaphore semaphore;
QTime time;
-#define QVERIFYGE(a,b) QVERIFY2(a >= b, qPrintable(QString("%1 = %2 !>= %3 = %4").arg(#a).arg(a).arg(#b).arg(b)));
-#define QVERIFYLE(a,b) QVERIFY2(a <= b, qPrintable(QString("%1 = %2 !<= %3 = %4").arg(#a).arg(a).arg(#b).arg(b)));
+#define FUZZYCOMPARE(a,e) \
+ do { \
+ int a1 = a; \
+ int e1 = e; \
+ QVERIFY2(qAbs(a1-e1) < fuzz, \
+ qPrintable(QString("(%1=%2) is more than %3 milliseconds different from (%4=%5)") \
+ .arg(#a).arg(a1).arg(fuzz).arg(#e).arg(e1))); \
+ } while (0)
QCOMPARE(semaphore.available(), 0);
@@ -235,73 +245,72 @@ void tst_QSemaphore::tryAcquireWithTimeout()
QCOMPARE(semaphore.available(), 1);
time.start();
QVERIFY(!semaphore.tryAcquire(2, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 1);
semaphore.release();
QCOMPARE(semaphore.available(), 2);
time.start();
QVERIFY(!semaphore.tryAcquire(3, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 2);
semaphore.release(10);
QCOMPARE(semaphore.available(), 12);
time.start();
QVERIFY(!semaphore.tryAcquire(100, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 12);
semaphore.release(10);
QCOMPARE(semaphore.available(), 22);
time.start();
QVERIFY(!semaphore.tryAcquire(100, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 22);
time.start();
QVERIFY(semaphore.tryAcquire(1, timeout));
- QVERIFYLE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), 0);
QCOMPARE(semaphore.available(), 21);
time.start();
QVERIFY(semaphore.tryAcquire(1, timeout));
- QVERIFYLE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), 0);
QCOMPARE(semaphore.available(), 20);
time.start();
QVERIFY(semaphore.tryAcquire(10, timeout));
- QVERIFYLE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), 0);
QCOMPARE(semaphore.available(), 10);
time.start();
QVERIFY(semaphore.tryAcquire(10, timeout));
- QVERIFYLE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), 0);
QCOMPARE(semaphore.available(), 0);
// should not be able to acquire more
time.start();
QVERIFY(!semaphore.tryAcquire(1, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 0);
time.start();
QVERIFY(!semaphore.tryAcquire(1, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 0);
time.start();
QVERIFY(!semaphore.tryAcquire(10, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 0);
time.start();
QVERIFY(!semaphore.tryAcquire(10, timeout));
- QVERIFYGE(time.elapsed(), timeout);
+ FUZZYCOMPARE(time.elapsed(), timeout);
QCOMPARE(semaphore.available(), 0);
-#undef QVERIFYGE
-#undef QVERIFYLE
+#undef FUZZYCOMPARE
}
void tst_QSemaphore::tryAcquireWithTimeoutStarvation()
diff --git a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp
index 1dd0410f41..aa4d163fc4 100644
--- a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp
+++ b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp
@@ -367,17 +367,17 @@ void tst_QThreadPool::setMaxThreadCount_data()
{
QTest::addColumn<int>("limit");
- QTest::newRow("") << 1;
- QTest::newRow("") << -1;
- QTest::newRow("") << 2;
- QTest::newRow("") << -2;
- QTest::newRow("") << 4;
- QTest::newRow("") << -4;
- QTest::newRow("") << 0;
- QTest::newRow("") << 12345;
- QTest::newRow("") << -6789;
- QTest::newRow("") << 42;
- QTest::newRow("") << -666;
+ QTest::newRow("1") << 1;
+ QTest::newRow("-1") << -1;
+ QTest::newRow("2") << 2;
+ QTest::newRow("-2") << -2;
+ QTest::newRow("4") << 4;
+ QTest::newRow("-4") << -4;
+ QTest::newRow("0") << 0;
+ QTest::newRow("12345") << 12345;
+ QTest::newRow("-6789") << -6789;
+ QTest::newRow("42") << 42;
+ QTest::newRow("-666") << -666;
}
void tst_QThreadPool::setMaxThreadCount()
diff --git a/tests/auto/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp b/tests/auto/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp
index 578f867032..0e1fa47a3e 100644
--- a/tests/auto/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp
+++ b/tests/auto/corelib/thread/qwaitcondition/tst_qwaitcondition.cpp
@@ -59,14 +59,8 @@ private slots:
void wait_RaceCondition();
};
-static const int iterations = 10;
-
-// Note: some tests rely on ThreadCount being multiple of 2
-#if defined(Q_OS_SOLARIS) || ( defined(Q_OS_LINUX) && defined(QT_ARCH_ARMV6) )
+static const int iterations = 4;
static const int ThreadCount = 4;
-#else
-static const int ThreadCount = 10;
-#endif
class wait_QMutex_Thread_1 : public QThread
{
diff --git a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
index e442aa7e1a..13a6b3d471 100644
--- a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
@@ -521,7 +521,10 @@ void tst_QByteArray::qvsnprintf()
QCOMPARE(::qsnprintf(buf, 10, "%s", "bubu"), 4);
QCOMPARE(static_cast<const char *>(buf), "bubu");
+#ifndef Q_CC_MSVC
+ // MSVC implementation of vsnprintf overwrites bytes after null terminator so this would fail.
QCOMPARE(buf[5], char(42));
+#endif
qMemSet(buf, 42, sizeof(buf));
QCOMPARE(::qsnprintf(buf, 5, "%s", "bubu"), 4);
@@ -862,7 +865,7 @@ void tst_QByteArray::indexOf_data()
QTest::newRow("BoyerMooreStressTest4") << QByteArray(veryBigHaystack) << QByteArray(veryBigHaystack + 'c') << 0 << -1;
QTest::newRow("BoyerMooreStressTest5") << QByteArray(veryBigHaystack) << QByteArray('c' + veryBigHaystack) << 0 << -1;
QTest::newRow("BoyerMooreStressTest6") << QByteArray('d' + veryBigHaystack) << QByteArray('c' + veryBigHaystack) << 0 << -1;
- QTest::newRow("BoyerMooreStressTest6") << QByteArray(veryBigHaystack + 'c') << QByteArray('c' + veryBigHaystack) << 0 << -1;
+ QTest::newRow("BoyerMooreStressTest7") << QByteArray(veryBigHaystack + 'c') << QByteArray('c' + veryBigHaystack) << 0 << -1;
}
void tst_QByteArray::indexOf()
@@ -985,13 +988,13 @@ void tst_QByteArray::toInt_data()
QTest::addColumn<bool>("expectedok");
QTest::newRow("base 10") << QByteArray("100") << 10 << int(100) << true;
- QTest::newRow("base 16") << QByteArray("100") << 16 << int(256) << true;
- QTest::newRow("base 16") << QByteArray("0400") << 16 << int(1024) << true;
+ QTest::newRow("base 16-1") << QByteArray("100") << 16 << int(256) << true;
+ QTest::newRow("base 16-2") << QByteArray("0400") << 16 << int(1024) << true;
QTest::newRow("base 2") << QByteArray("1111") << 2 << int(15) << true;
QTest::newRow("base 8") << QByteArray("100") << 8 << int(64) << true;
- QTest::newRow("base 0") << QByteArray("0x10") << 0 << int(16) << true;
- QTest::newRow("base 0") << QByteArray("10") << 0 << int(10) << true;
- QTest::newRow("base 0") << QByteArray("010") << 0 << int(8) << true;
+ QTest::newRow("base 0-1") << QByteArray("0x10") << 0 << int(16) << true;
+ QTest::newRow("base 0-2") << QByteArray("10") << 0 << int(10) << true;
+ QTest::newRow("base 0-3") << QByteArray("010") << 0 << int(8) << true;
QTest::newRow("empty") << QByteArray() << 0 << int(0) << false;
// using fromRawData
@@ -999,7 +1002,7 @@ void tst_QByteArray::toInt_data()
QTest::newRow("raw2") << QByteArray::fromRawData("1foo", 1) << 10 << 1 << true;
QTest::newRow("raw3") << QByteArray::fromRawData("12", 1) << 10 << 1 << true;
QTest::newRow("raw4") << QByteArray::fromRawData("123456789", 1) << 10 << 1 << true;
- QTest::newRow("raw4") << QByteArray::fromRawData("123456789", 2) << 10 << 12 << true;
+ QTest::newRow("raw5") << QByteArray::fromRawData("123456789", 2) << 10 << 12 << true;
QTest::newRow("raw-static") << QByteArray::fromRawData(&globalChar, 1) << 10 << 1 << true;
}
@@ -1398,58 +1401,58 @@ void tst_QByteArray::repeated_data() const
QTest::addColumn<int>("count" );
/* Empty strings. */
- QTest::newRow("")
+ QTest::newRow("data1")
<< QByteArray()
<< QByteArray()
<< 0;
- QTest::newRow("")
+ QTest::newRow("data2")
<< QByteArray()
<< QByteArray()
<< -1004;
- QTest::newRow("")
+ QTest::newRow("data3")
<< QByteArray()
<< QByteArray()
<< 1;
- QTest::newRow("")
+ QTest::newRow("data4")
<< QByteArray()
<< QByteArray()
<< 5;
/* On simple string. */
- QTest::newRow("")
+ QTest::newRow("data5")
<< QByteArray("abc")
<< QByteArray()
<< -1004;
- QTest::newRow("")
+ QTest::newRow("data6")
<< QByteArray("abc")
<< QByteArray()
<< -1;
- QTest::newRow("")
+ QTest::newRow("data7")
<< QByteArray("abc")
<< QByteArray()
<< 0;
- QTest::newRow("")
+ QTest::newRow("data8")
<< QByteArray("abc")
<< QByteArray("abc")
<< 1;
- QTest::newRow("")
+ QTest::newRow("data9")
<< QByteArray(("abc"))
<< QByteArray(("abcabc"))
<< 2;
- QTest::newRow("")
+ QTest::newRow("data10")
<< QByteArray(("abc"))
<< QByteArray(("abcabcabc"))
<< 3;
- QTest::newRow("")
+ QTest::newRow("data11")
<< QByteArray(("abc"))
<< QByteArray(("abcabcabcabc"))
<< 4;
diff --git a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
index fddd67fbd6..1c4b74e16d 100644
--- a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
+++ b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
@@ -3,14 +3,4 @@ TARGET = tst_qcryptographichash
QT = core testlib
SOURCES = tst_qcryptographichash.cpp
-
-wince* {
- addFiles.files = data/*
- addFiles.path = data/
- DEPLOYMENT += addFiles
-
- DEFINES += SRCDIR=\\\".\\\"
-}
-else {
- DEFINES += SRCDIR=\\\"$$PWD/\\\"
-} \ No newline at end of file
+TESTDATA += data/*
diff --git a/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp b/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp
index 3a257c2f11..81cc66f045 100644
--- a/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp
+++ b/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp
@@ -158,8 +158,8 @@ void tst_QCryptographicHash::files_data() {
QTest::addColumn<QString>("filename");
QTest::addColumn<QCryptographicHash::Algorithm>("algorithm");
QTest::addColumn<QByteArray>("md5sum");
- QTest::newRow("Line") << QString::fromAscii("data/2c1517dad3678f03917f15849b052fd5.md5") << QCryptographicHash::Md5 << QByteArray("2c1517dad3678f03917f15849b052fd5");
- QTest::newRow("Line") << QString::fromAscii("data/d41d8cd98f00b204e9800998ecf8427e.md5") << QCryptographicHash::Md5 << QByteArray("d41d8cd98f00b204e9800998ecf8427e");
+ QTest::newRow("data1") << QString::fromAscii("data/2c1517dad3678f03917f15849b052fd5.md5") << QCryptographicHash::Md5 << QByteArray("2c1517dad3678f03917f15849b052fd5");
+ QTest::newRow("data2") << QString::fromAscii("data/d41d8cd98f00b204e9800998ecf8427e.md5") << QCryptographicHash::Md5 << QByteArray("d41d8cd98f00b204e9800998ecf8427e");
}
@@ -169,7 +169,9 @@ void tst_QCryptographicHash::files()
QFETCH(QCryptographicHash::Algorithm, algorithm);
QFETCH(QByteArray, md5sum);
{
- QFile f(QString::fromLocal8Bit(SRCDIR) + filename);
+ QString testData = QFINDTESTDATA(filename);
+ QVERIFY2(!testData.isEmpty(), qPrintable(QString("Cannot find test data: %1").arg(filename)));
+ QFile f(testData);
QCryptographicHash hash(algorithm);
QVERIFY(! hash.addData(&f)); // file is not open for reading;
if (f.open(QIODevice::ReadOnly)) {
diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
index 4921a7e734..258dbf8625 100644
--- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp
+++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
@@ -147,14 +147,14 @@ void tst_QDate::isValid_data()
QTest::newRow("month 13") << 2000 << 13 << 1 << nullJd << false;
// test leap years
- QTest::newRow("non-leap") << 2006 << 2 << 29 << nullJd << false;
- QTest::newRow("normal leap") << 2004 << 2 << 29 << qint64(2453065) << true;
- QTest::newRow("century leap") << 1900 << 2 << 29 << nullJd << false;
- QTest::newRow("century leap") << 2100 << 2 << 29 << nullJd << false;
- QTest::newRow("400-years leap") << 2000 << 2 << 29 << qint64(2451604) << true;
- QTest::newRow("400-years leap 2") << 2400 << 2 << 29 << qint64(2597701) << true;
- QTest::newRow("400-years leap 3") << 1600 << 2 << 29 << qint64(2305507) << true;
- QTest::newRow("year 0") << 0 << 2 << 27 << nullJd << false;
+ QTest::newRow("non-leap") << 2006 << 2 << 29 << nullJd << false;
+ QTest::newRow("normal leap") << 2004 << 2 << 29 << qint64(2453065) << true;
+ QTest::newRow("century leap 1900") << 1900 << 2 << 29 << nullJd << false;
+ QTest::newRow("century leap 2100") << 2100 << 2 << 29 << nullJd << false;
+ QTest::newRow("400-years leap 2000") << 2000 << 2 << 29 << qint64(2451604) << true;
+ QTest::newRow("400-years leap 2400") << 2400 << 2 << 29 << qint64(2597701) << true;
+ QTest::newRow("400-years leap 1600") << 1600 << 2 << 29 << qint64(2305507) << true;
+ QTest::newRow("year 0") << 0 << 2 << 27 << nullJd << false;
// test the number of days in months:
QTest::newRow("jan") << 2000 << 1 << 31 << qint64(2451575) << true;
@@ -262,7 +262,7 @@ void tst_QDate::dayOfWeek_data()
QTest::newRow("data8") << -4800 << 1 << 1 << 1;
QTest::newRow("data9") << -4800 << 1 << 2 << 2;
QTest::newRow("data10") << -4800 << 1 << 3 << 3;
- QTest::newRow("data12") << -4800 << 1 << 4 << 4;
+ QTest::newRow("data11") << -4800 << 1 << 4 << 4;
QTest::newRow("data12") << -4800 << 1 << 5 << 5;
QTest::newRow("data13") << -4800 << 1 << 6 << 6;
QTest::newRow("data14") << -4800 << 1 << 7 << 7;
@@ -580,10 +580,10 @@ void tst_QDate::addMonths_data()
QTest::newRow( "data14" ) << 2000 << 2 << 29 << -12 << 1999 << 2 << 28;
// year sign change:
- QTest::newRow( "data14" ) << 1 << 1 << 1 << -1 << -1 << 12 << 1;
- QTest::newRow( "data15" ) << 1 << 1 << 1 << -12 << -1 << 1 << 1;
- QTest::newRow( "data16" ) << -1 << 12 << 1 << 1 << 1 << 1 << 1;
- QTest::newRow( "data17" ) << -1 << 1 << 1 << 12 << 1 << 1 << 1;
+ QTest::newRow( "data15" ) << 1 << 1 << 1 << -1 << -1 << 12 << 1;
+ QTest::newRow( "data16" ) << 1 << 1 << 1 << -12 << -1 << 1 << 1;
+ QTest::newRow( "data17" ) << -1 << 12 << 1 << 1 << 1 << 1 << 1;
+ QTest::newRow( "data18" ) << -1 << 1 << 1 << 12 << 1 << 1 << 1;
}
void tst_QDate::addYears()
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
index af8deefa4c..eb6af23ba5 100644
--- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
@@ -1363,19 +1363,19 @@ void tst_QDateTime::dateFromStringFormat_data()
QTest::newRow("data24") << tuesday << QString("dddd") << QDate(1900, 1, 2);
QTest::newRow("data25") << wednesday << QString("dddd") << QDate(1900, 1, 3);
QTest::newRow("data26") << thursday << QString("dddd") << QDate(1900, 1, 4);
- QTest::newRow("data26") << friday << QString("dddd") << QDate(1900, 1, 5);
- QTest::newRow("data27") << saturday << QString("dddd") << QDate(1900, 1, 6);
- QTest::newRow("data28") << sunday << QString("dddd") << QDate(1900, 1, 7);
-
- QTest::newRow("data29") << monday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 2);
- QTest::newRow("data30") << tuesday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 3);
- QTest::newRow("data31") << wednesday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 4);
- QTest::newRow("data32") << thursday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 5);
- QTest::newRow("data33") << friday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 6);
- QTest::newRow("data34") << saturday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 7);
- QTest::newRow("data35") << sunday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 1);
-
- QTest::newRow("data36 ") << tuesday + " 2007 " + march << QString("dddd yyyy MMMM") << QDate(2007, 3, 6);
+ QTest::newRow("data27") << friday << QString("dddd") << QDate(1900, 1, 5);
+ QTest::newRow("data28") << saturday << QString("dddd") << QDate(1900, 1, 6);
+ QTest::newRow("data29") << sunday << QString("dddd") << QDate(1900, 1, 7);
+
+ QTest::newRow("data30") << monday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 2);
+ QTest::newRow("data31") << tuesday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 3);
+ QTest::newRow("data32") << wednesday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 4);
+ QTest::newRow("data33") << thursday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 5);
+ QTest::newRow("data34") << friday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 6);
+ QTest::newRow("data35") << saturday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 7);
+ QTest::newRow("data36") << sunday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 1);
+
+ QTest::newRow("data37") << tuesday + " 2007 " + march << QString("dddd yyyy MMMM") << QDate(2007, 3, 6);
}
diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
index 5544c0fd71..db7f503f57 100644
--- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
+++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
@@ -59,7 +59,6 @@
#endif
#ifdef Q_OS_WINCE
-#include <qcoreapplication.h>
#include <windows.h> // needed for GetUserDefaultLCID
#define _control87 _controlfp
extern "C" DWORD GetThreadLocale(void) {
@@ -141,11 +140,6 @@ tst_QLocale::tst_QLocale()
void tst_QLocale::ctor()
{
-#ifdef Q_OS_WINCE
- int argc = 1;
- char argv[20] = "tst_qlocale.exe";
- QCoreApplication app(argc, (char**)&argv);
-#endif
QLocale default_locale = QLocale::system();
QLocale::Language default_lang = default_locale.language();
QLocale::Country default_country = default_locale.country();
@@ -934,7 +928,7 @@ void tst_QLocale::formatDateTime_data()
<< "\"yymm\"" << "\"7414\"";
QTest::newRow("27C") << "C" << QDateTime(QDate(1974, 12, 1), QTime(15, 14, 13))
<< "'\"yymm\"'" << "\"yymm\"";
- QTest::newRow("27C") << "C" << QDateTime()
+ QTest::newRow("28C") << "C" << QDateTime()
<< "'\"yymm\"'" << "";
QTest::newRow("1no_NO") << "no_NO" << QDateTime(QDate(1974, 12, 1), QTime(5, 14, 13))
@@ -976,7 +970,7 @@ void tst_QLocale::formatDateTime_data()
<< "\"yymm\"" << "\"7414\"";
QTest::newRow("27no_NO") << "no_NO" << QDateTime(QDate(1974, 12, 1), QTime(15, 14, 13))
<< "'\"yymm\"'" << "\"yymm\"";
- QTest::newRow("27no_NO") << "no_NO" << QDateTime()
+ QTest::newRow("28no_NO") << "no_NO" << QDateTime()
<< "'\"yymm\"'" << "";
}
@@ -1988,5 +1982,5 @@ void tst_QLocale::listPatterns()
QCOMPARE(zh_CN.createSeparatedList(sl5), QString::fromUtf8("aaa" "\xe3\x80\x81" "bbb" "\xe3\x80\x81" "ccc" "\xe5\x92\x8c" "ddd"));
}
-QTEST_APPLESS_MAIN(tst_QLocale)
+QTEST_MAIN(tst_QLocale)
#include "tst_qlocale.moc"
diff --git a/tests/auto/corelib/tools/qsharedpointer/externaltests.pri b/tests/auto/corelib/tools/qsharedpointer/externaltests.pri
index e12bb914c0..10d30e3c76 100644
--- a/tests/auto/corelib/tools/qsharedpointer/externaltests.pri
+++ b/tests/auto/corelib/tools/qsharedpointer/externaltests.pri
@@ -3,5 +3,5 @@ HEADERS += $$PWD/externaltests.h
cleanedQMAKESPEC = $$replace(QMAKESPEC, \\\\, /)
DEFINES += DEFAULT_MAKESPEC=\\\"$$cleanedQMAKESPEC\\\"
-embedded:DEFINES += QTEST_NO_RTTI QTEST_CROSS_COMPILED
+cross_compile:DEFINES += QTEST_NO_RTTI QTEST_CROSS_COMPILED
wince*:DEFINES += QTEST_CROSS_COMPILED QTEST_NO_RTTI
diff --git a/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro b/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
index b1cd309293..1b227109b3 100644
--- a/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
+++ b/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
@@ -13,3 +13,5 @@ HEADERS = forwarddeclared.h \
TESTDATA += forwarddeclared.cpp forwarddeclared.h
include(externaltests.pri)
+
+win32:CONFIG += insignificant_test # QTBUG-24160
diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
index 2bae52a622..5b697a3509 100644
--- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
+++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
@@ -76,6 +76,7 @@ private slots:
void upCast();
void qobjectWeakManagement();
void noSharedPointerFromWeakQObject();
+ void sharedPointerFromQObjectWithWeak();
void weakQObjectFromSharedPointer();
void objectCast();
void differentPointers();
@@ -692,12 +693,34 @@ void tst_QSharedPointer::noSharedPointerFromWeakQObject()
QObject obj;
QWeakPointer<QObject> weak(&obj);
- QSharedPointer<QObject> strong = weak.toStrongRef();
- QVERIFY(strong.isNull());
+ {
+ QTest::ignoreMessage(QtWarningMsg , "QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
+ QSharedPointer<QObject> strong = weak.toStrongRef();
+ QVERIFY(strong.isNull());
+ }
+ {
+ QTest::ignoreMessage(QtWarningMsg , "QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
+ QSharedPointer<QObject> strong = weak;
+ QVERIFY(strong.isNull());
+ }
+ QCOMPARE(weak.data(), &obj);
// if something went wrong, we'll probably crash here
}
+void tst_QSharedPointer::sharedPointerFromQObjectWithWeak()
+{
+ QObject *ptr = new QObject;
+ QWeakPointer<QObject> weak = ptr;
+ {
+ QSharedPointer<QObject> shared(ptr);
+ QVERIFY(!weak.isNull());
+ QCOMPARE(shared.data(), ptr);
+ QCOMPARE(weak.data(), ptr);
+ }
+ QVERIFY(weak.isNull());
+}
+
void tst_QSharedPointer::weakQObjectFromSharedPointer()
{
// this is the inverse of the above: you're allowed to create a QWeakPointer
@@ -1070,10 +1093,6 @@ void tst_QSharedPointer::constCorrectness()
ptr = cptr.constCast<Data>();
ptr = vptr.constCast<Data>();
-#if !defined(Q_CC_HPACC) && !defined(QT_ARCH_PARISC)
- // the aCC series 3 compiler we have on the PA-RISC
- // machine crashes compiling this code
-
QSharedPointer<const volatile Data> cvptr(ptr);
QSharedPointer<const volatile Data> cvptr2(cptr);
QSharedPointer<const volatile Data> cvptr3(vptr);
@@ -1082,7 +1101,6 @@ void tst_QSharedPointer::constCorrectness()
cvptr3 = vptr;
ptr = qSharedPointerConstCast<Data>(cvptr);
ptr = cvptr.constCast<Data>();
-#endif
}
safetyCheck();
@@ -1767,12 +1785,6 @@ void tst_QSharedPointer::invalidConstructs_data()
<< "Data *ptr = 0;\n"
"QWeakPointer<Data> weakptr(ptr);\n";
- QTest::newRow("shared-pointer-from-unmanaged-qobject")
- << &QTest::QExternalTest::tryRunFail
- << "QObject *ptr = new QObject;\n"
- "QWeakPointer<QObject> weak = ptr;\n" // this makes the object unmanaged
- "QSharedPointer<QObject> shared(ptr);\n";
-
QTest::newRow("shared-pointer-implicit-from-uninitialized")
<< &QTest::QExternalTest::tryCompileFail
<< "Data *ptr = 0;\n"
diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
index 7dd801b50b..e3808244d3 100644
--- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
@@ -447,7 +447,7 @@ void tst_QString::replace_uint_uint_data()
QTest::newRow( "rep08" ) << QString("ACABCAB") << 3 << 2 << QString("XX") << QString("ACAXXAB");
QTest::newRow( "rep09" ) << QString("ACABCAB") << 4 << 2 << QString("XX") << QString("ACABXXB");
QTest::newRow( "rep10" ) << QString("ACABCAB") << 5 << 2 << QString("XX") << QString("ACABCXX");
- QTest::newRow( "rep10" ) << QString("ACABCAB") << 6 << 2 << QString("XX") << QString("ACABCAXX");
+ QTest::newRow( "rep11" ) << QString("ACABCAB") << 6 << 2 << QString("XX") << QString("ACABCAXX");
QTest::newRow( "rep12" ) << QString() << 0 << 10 << QString("X") << QString("X");
QTest::newRow( "rep13" ) << QString("short") << 0 << 10 << QString("X") << QString("X");
QTest::newRow( "rep14" ) << QString() << 0 << 10 << QString("XX") << QString("XX");
@@ -1042,7 +1042,7 @@ void tst_QString::indexOf_data()
QTest::newRow("BoyerMooreStressTest4") << veryBigHaystack << QString(veryBigHaystack + 'c') << 0 << true << -1;
QTest::newRow("BoyerMooreStressTest5") << veryBigHaystack << QString('c' + veryBigHaystack) << 0 << true << -1;
QTest::newRow("BoyerMooreStressTest6") << QString('d' + veryBigHaystack) << QString('c' + veryBigHaystack) << 0 << true << -1;
- QTest::newRow("BoyerMooreStressTest6") << QString(veryBigHaystack + 'c') << QString('c' + veryBigHaystack) << 0 << true << -1;
+ QTest::newRow("BoyerMooreStressTest7") << QString(veryBigHaystack + 'c') << QString('c' + veryBigHaystack) << 0 << true << -1;
QTest::newRow("BoyerMooreInsensitiveStressTest") << veryBigHaystack << veryBigHaystack << 0 << false << 0;
@@ -1211,15 +1211,15 @@ void tst_QString::lastIndexOf_data()
QTest::newRow("4") << a << "G" << 14 << 14 << true;
QTest::newRow("5") << a << "G" << 13 << 11 << true;
QTest::newRow("6") << a << "B" << a.size() - 1 << 1 << true;
- QTest::newRow("6") << a << "B" << - 1 << 1 << true;
- QTest::newRow("7") << a << "B" << 1 << 1 << true;
- QTest::newRow("8") << a << "B" << 0 << -1 << true;
+ QTest::newRow("7") << a << "B" << - 1 << 1 << true;
+ QTest::newRow("8") << a << "B" << 1 << 1 << true;
+ QTest::newRow("9") << a << "B" << 0 << -1 << true;
- QTest::newRow("9") << a << "G" << -1 << a.size()-1 << true;
- QTest::newRow("10") << a << "G" << a.size()-1 << a.size()-1 << true;
- QTest::newRow("11") << a << "G" << a.size() << -1 << true;
- QTest::newRow("12") << a << "A" << 0 << 0 << true;
- QTest::newRow("13") << a << "A" << -1*a.size() << 0 << true;
+ QTest::newRow("10") << a << "G" << -1 << a.size()-1 << true;
+ QTest::newRow("11") << a << "G" << a.size()-1 << a.size()-1 << true;
+ QTest::newRow("12") << a << "G" << a.size() << -1 << true;
+ QTest::newRow("13") << a << "A" << 0 << 0 << true;
+ QTest::newRow("14") << a << "A" << -1*a.size() << 0 << true;
QTest::newRow("15") << a << "efg" << 0 << -1 << false;
QTest::newRow("16") << a << "efg" << a.size() << -1 << false;
@@ -4742,8 +4742,8 @@ void tst_QString::compare_data()
// different length
QTest::newRow("data6") << QString("abcdef") << QString("abc") << 1 << 1;
- QTest::newRow("data6") << QString("abCdef") << QString("abc") << -1 << 1;
- QTest::newRow("data7") << QString("abc") << QString("abcdef") << -1 << -1;
+ QTest::newRow("data7") << QString("abCdef") << QString("abc") << -1 << 1;
+ QTest::newRow("data8") << QString("abc") << QString("abcdef") << -1 << -1;
QString upper;
upper += QChar(QChar::highSurrogate(0x10400));
@@ -4755,12 +4755,12 @@ void tst_QString::compare_data()
// embedded nulls
// These don't work as of now. It's OK that these don't work since \0 is not a valid unicode
- /*QTest::newRow("data9") << QString(QByteArray("\0", 1)) << QString(QByteArray("\0", 1)) << 0 << 0;
- QTest::newRow("data10") << QString(QByteArray("\0", 1)) << QString("") << 1 << 1;
- QTest::newRow("data11") << QString("") << QString(QByteArray("\0", 1)) << -1 << -1;
- QTest::newRow("data12") << QString("ab\0c") << QString(QByteArray("ab\0c", 4)) << 0 << 0;
- QTest::newRow("data13") << QString(QByteArray("ab\0c", 4)) << QString("abc") << -1 << -1;
- QTest::newRow("data14") << QString("abc") << QString(QByteArray("ab\0c", 4)) << 1 << 1;*/
+ /*QTest::newRow("data10") << QString(QByteArray("\0", 1)) << QString(QByteArray("\0", 1)) << 0 << 0;
+ QTest::newRow("data11") << QString(QByteArray("\0", 1)) << QString("") << 1 << 1;
+ QTest::newRow("data12") << QString("") << QString(QByteArray("\0", 1)) << -1 << -1;
+ QTest::newRow("data13") << QString("ab\0c") << QString(QByteArray("ab\0c", 4)) << 0 << 0;
+ QTest::newRow("data14") << QString(QByteArray("ab\0c", 4)) << QString("abc") << -1 << -1;
+ QTest::newRow("data15") << QString("abc") << QString(QByteArray("ab\0c", 4)) << 1 << 1;*/
}
static bool isLatin(const QString &s)
@@ -5004,58 +5004,58 @@ void tst_QString::repeated_data() const
QTest::addColumn<int>("count" );
/* Empty strings. */
- QTest::newRow("")
+ QTest::newRow("data1")
<< QString()
<< QString()
<< 0;
- QTest::newRow("")
+ QTest::newRow("data2")
<< QString()
<< QString()
<< -1004;
- QTest::newRow("")
+ QTest::newRow("data3")
<< QString()
<< QString()
<< 1;
- QTest::newRow("")
+ QTest::newRow("data4")
<< QString()
<< QString()
<< 5;
/* On simple string. */
- QTest::newRow("")
+ QTest::newRow("data5")
<< QString(QLatin1String("abc"))
<< QString()
<< -1004;
- QTest::newRow("")
+ QTest::newRow("data6")
<< QString(QLatin1String("abc"))
<< QString()
<< -1;
- QTest::newRow("")
+ QTest::newRow("data7")
<< QString(QLatin1String("abc"))
<< QString()
<< 0;
- QTest::newRow("")
+ QTest::newRow("data8")
<< QString(QLatin1String("abc"))
<< QString(QLatin1String("abc"))
<< 1;
- QTest::newRow("")
+ QTest::newRow("data9")
<< QString(QLatin1String("abc"))
<< QString(QLatin1String("abcabc"))
<< 2;
- QTest::newRow("")
+ QTest::newRow("data10")
<< QString(QLatin1String("abc"))
<< QString(QLatin1String("abcabcabc"))
<< 3;
- QTest::newRow("")
+ QTest::newRow("data11")
<< QString(QLatin1String("abc"))
<< QString(QLatin1String("abcabcabcabc"))
<< 4;
diff --git a/tests/auto/corelib/tools/qstringlist/tst_qstringlist.cpp b/tests/auto/corelib/tools/qstringlist/tst_qstringlist.cpp
index e3eb1a21ac..6066f7c8e0 100644
--- a/tests/auto/corelib/tools/qstringlist/tst_qstringlist.cpp
+++ b/tests/auto/corelib/tools/qstringlist/tst_qstringlist.cpp
@@ -193,8 +193,8 @@ void tst_QStringList::removeDuplicates_data()
QTest::addColumn<QString>("after");
QTest::addColumn<int>("count");
- QTest::newRow("empty") << "Hello,Hello" << "Hello" << 1;
- QTest::newRow("empty") << "Hello,World" << "Hello,World" << 0;
+ QTest::newRow("empty-1") << "Hello,Hello" << "Hello" << 1;
+ QTest::newRow("empty-2") << "Hello,World" << "Hello,World" << 0;
}
void tst_QStringList::removeDuplicates()
@@ -245,35 +245,35 @@ void tst_QStringList::join_data() const
QTest::addColumn<QString>("separator");
QTest::addColumn<QString>("expectedResult");
- QTest::newRow("")
+ QTest::newRow("data1")
<< QStringList()
<< QString()
<< QString();
- QTest::newRow("")
+ QTest::newRow("data2")
<< QStringList()
<< QString(QLatin1String("separator"))
<< QString();
- QTest::newRow("")
+ QTest::newRow("data3")
<< QStringList("one")
<< QString(QLatin1String("separator"))
<< QString("one");
- QTest::newRow("")
+ QTest::newRow("data4")
<< QStringList("one")
<< QString(QLatin1String("separator"))
<< QString("one");
- QTest::newRow("")
+ QTest::newRow("data5")
<< (QStringList()
<< QLatin1String("a")
<< QLatin1String("b"))
<< QString(QLatin1String(" "))
<< QString("a b");
- QTest::newRow("")
+ QTest::newRow("data6")
<< (QStringList()
<< QLatin1String("a")
<< QLatin1String("b")
diff --git a/tests/auto/corelib/tools/qstringmatcher/tst_qstringmatcher.cpp b/tests/auto/corelib/tools/qstringmatcher/tst_qstringmatcher.cpp
index ebbad86c81..5829c0e917 100644
--- a/tests/auto/corelib/tools/qstringmatcher/tst_qstringmatcher.cpp
+++ b/tests/auto/corelib/tools/qstringmatcher/tst_qstringmatcher.cpp
@@ -81,16 +81,16 @@ void tst_QStringMatcher::indexIn_data()
QTest::addColumn<QString>("haystack");
QTest::addColumn<int>("from");
QTest::addColumn<int>("indexIn");
- QTest::newRow("empty") << QString() << QString("foo") << 0 << 0;
- QTest::newRow("empty") << QString() << QString("foo") << 10 << -1;
- QTest::newRow("empty") << QString() << QString("foo") << -10 << 0;
-
- QTest::newRow("simple") << QString("a") << QString("foo") << 0 << -1;
- QTest::newRow("simple") << QString("a") << QString("bar") << 0 << 1;
- QTest::newRow("harder") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 0 << 26;
- QTest::newRow("harder") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 20 << 26;
- QTest::newRow("harder") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 26 << 26;
- QTest::newRow("harder") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 27 << -1;
+ QTest::newRow("empty-1") << QString() << QString("foo") << 0 << 0;
+ QTest::newRow("empty-2") << QString() << QString("foo") << 10 << -1;
+ QTest::newRow("empty-3") << QString() << QString("foo") << -10 << 0;
+
+ QTest::newRow("simple-1") << QString("a") << QString("foo") << 0 << -1;
+ QTest::newRow("simple-2") << QString("a") << QString("bar") << 0 << 1;
+ QTest::newRow("harder-1") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 0 << 26;
+ QTest::newRow("harder-2") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 20 << 26;
+ QTest::newRow("harder-3") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 26 << 26;
+ QTest::newRow("harder-4") << QString("foo") << QString("slkdf sldkjf slakjf lskd ffools ldjf") << 27 << -1;
}
void tst_QStringMatcher::indexIn()
diff --git a/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp b/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
index 77d2101320..de01df2001 100644
--- a/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
+++ b/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
@@ -288,7 +288,7 @@ void tst_QStringRef::indexOf_data()
QTest::newRow("BoyerMooreStressTest4") << veryBigHaystack << veryBigHaystack + 'c' << 0 << true << -1;
QTest::newRow("BoyerMooreStressTest5") << veryBigHaystack << 'c' + veryBigHaystack << 0 << true << -1;
QTest::newRow("BoyerMooreStressTest6") << 'd' + veryBigHaystack << 'c' + veryBigHaystack << 0 << true << -1;
- QTest::newRow("BoyerMooreStressTest6") << veryBigHaystack + 'c' << 'c' + veryBigHaystack << 0 << true << -1;
+ QTest::newRow("BoyerMooreStressTest7") << veryBigHaystack + 'c' << 'c' + veryBigHaystack << 0 << true << -1;
QTest::newRow("BoyerMooreInsensitiveStressTest") << veryBigHaystack << veryBigHaystack << 0 << false << 0;
@@ -441,15 +441,15 @@ void tst_QStringRef::lastIndexOf_data()
QTest::newRow("4") << a << "G" << 14 << 14 << true;
QTest::newRow("5") << a << "G" << 13 << 11 << true;
QTest::newRow("6") << a << "B" << a.size() - 1 << 1 << true;
- QTest::newRow("6") << a << "B" << - 1 << 1 << true;
- QTest::newRow("7") << a << "B" << 1 << 1 << true;
- QTest::newRow("8") << a << "B" << 0 << -1 << true;
+ QTest::newRow("7") << a << "B" << - 1 << 1 << true;
+ QTest::newRow("8") << a << "B" << 1 << 1 << true;
+ QTest::newRow("9") << a << "B" << 0 << -1 << true;
- QTest::newRow("9") << a << "G" << -1 << a.size()-1 << true;
- QTest::newRow("10") << a << "G" << a.size()-1 << a.size()-1 << true;
- QTest::newRow("11") << a << "G" << a.size() << -1 << true;
- QTest::newRow("12") << a << "A" << 0 << 0 << true;
- QTest::newRow("13") << a << "A" << -1*a.size() << 0 << true;
+ QTest::newRow("10") << a << "G" << -1 << a.size()-1 << true;
+ QTest::newRow("11") << a << "G" << a.size()-1 << a.size()-1 << true;
+ QTest::newRow("12") << a << "G" << a.size() << -1 << true;
+ QTest::newRow("13") << a << "A" << 0 << 0 << true;
+ QTest::newRow("14") << a << "A" << -1*a.size() << 0 << true;
QTest::newRow("15") << a << "efg" << 0 << -1 << false;
QTest::newRow("16") << a << "efg" << a.size() << -1 << false;
@@ -777,8 +777,8 @@ void tst_QStringRef::compare_data()
// different length
QTest::newRow("data6") << QString("abcdef") << QString("abc") << 1 << 1;
- QTest::newRow("data6") << QString("abCdef") << QString("abc") << -1 << 1;
- QTest::newRow("data7") << QString("abc") << QString("abcdef") << -1 << -1;
+ QTest::newRow("data7") << QString("abCdef") << QString("abc") << -1 << 1;
+ QTest::newRow("data8") << QString("abc") << QString("abcdef") << -1 << -1;
QString upper;
upper += QChar(QChar::highSurrogate(0x10400));
@@ -786,7 +786,7 @@ void tst_QStringRef::compare_data()
QString lower;
lower += QChar(QChar::highSurrogate(0x10428));
lower += QChar(QChar::lowSurrogate(0x10428));
- QTest::newRow("data8") << upper << lower << -1 << 0;
+ QTest::newRow("data9") << upper << lower << -1 << 0;
}
static bool isLatin(const QString &s)
diff --git a/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp b/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
index 89dd01ac3a..b8ae709fd0 100644
--- a/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
+++ b/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
@@ -302,22 +302,22 @@ void tst_QTextBoundaryFinder::toNextBoundary_data()
QList<int> boundaries;
boundaries << 0 << 3 << 4 << 7 << 8 << 11 << 12 << 13 << 16 << 17 << 20 << 21 << 24 << 25;
- QTest::newRow("Line") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Word) \
+ QTest::newRow("data1") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Word) \
<< boundaries;
boundaries.clear();
boundaries << 0 << 13 << 25;
- QTest::newRow("Line") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Sentence) \
+ QTest::newRow("data2") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Sentence) \
<< boundaries;
boundaries.clear();
boundaries << 0 << 4 << 8 << 13 << 17 << 21 << 25;
- QTest::newRow("Line") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Line) \
+ QTest::newRow("data3") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Line) \
<< boundaries;
boundaries.clear();
boundaries << 0 << 5 << 9 << 15 << 17 << 21 << 28;
- QTest::newRow("Line") << QString::fromUtf8("Diga-nos qualé a sua opinião") << int(QTextBoundaryFinder::Line)
+ QTest::newRow("data4") << QString::fromUtf8("Diga-nos qualé a sua opinião") << int(QTextBoundaryFinder::Line)
<< boundaries;
}
@@ -344,22 +344,22 @@ void tst_QTextBoundaryFinder::toPreviousBoundary_data()
QList<int> boundaries;
boundaries << 25 << 24 << 21 << 20 << 17 << 16 << 13 << 12 << 11 << 8 << 7 << 4 << 3 << 0;
- QTest::newRow("Line") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Word)
+ QTest::newRow("data1") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Word)
<< boundaries;
boundaries.clear();
boundaries << 25 << 13 << 0;
- QTest::newRow("Line") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Sentence)
+ QTest::newRow("data2") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Sentence)
<< boundaries;
boundaries.clear();
boundaries << 25 << 21 << 17 << 13 << 8 << 4 << 0;
- QTest::newRow("Line") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Line)
+ QTest::newRow("data3") << QString("Aaa bbb ccc. Ddd eee fff.") << int(QTextBoundaryFinder::Line)
<< boundaries;
boundaries.clear();
boundaries << 28 << 21 << 17 << 15 << 9 << 5 << 0;
- QTest::newRow("Line") << QString::fromUtf8("Diga-nos qualé a sua opinião") << int(QTextBoundaryFinder::Line)
+ QTest::newRow("data4") << QString::fromUtf8("Diga-nos qualé a sua opinião") << int(QTextBoundaryFinder::Line)
<< boundaries;
}
diff --git a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
index 0ce0da06aa..bd9fa2a8db 100644
--- a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
+++ b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
@@ -674,7 +674,7 @@ void tst_QXmlStream::reportSuccess_data() const
const int len = m_handler.successes.count();
for(int i = 0; i < len; ++i)
- QTest::newRow(m_handler.successes.at(i).toLatin1().constData()) << false;
+ QTest::newRow(qPrintable(QString("%1. %2").arg(i).arg(m_handler.successes.at(i)))) << false;
if(len == 0)
QTest::newRow("No test cases succeeded.") << true;
diff --git a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index 28dfd0b63f..b696294005 100644
--- a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -89,7 +89,9 @@ public:
private slots:
void initTestCase();
- void cleanupTestCase();
+
+ void init();
+ void cleanup();
void makeVoidCall();
void makeStringCall();
@@ -194,39 +196,6 @@ private:
QProcess proc;
};
-class WaitForQPinger: public QObject
-{
- Q_OBJECT
-public:
- WaitForQPinger();
- bool ok();
-public Q_SLOTS:
- void ownerChange(const QString &name)
- {
- if (name == serviceName)
- loop.quit();
- }
-
-private:
- QEventLoop loop;
-};
-
-WaitForQPinger::WaitForQPinger()
-{
- QDBusConnection con = QDBusConnection::sessionBus();
- if (!ok()) {
- connect(con.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
- SLOT(ownerChange(QString)));
- QTimer::singleShot(2000, &loop, SLOT(quit()));
- loop.exec();
- }
-}
-
-bool WaitForQPinger::ok()
-{
- return QDBusConnection::sessionBus().isConnected() &&
- QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName);
-}
tst_QDBusAbstractInterface::tst_QDBusAbstractInterface()
{
@@ -244,6 +213,16 @@ void tst_QDBusAbstractInterface::initTestCase()
QDBusConnection con = QDBusConnection::sessionBus();
QVERIFY(con.isConnected());
con.registerObject("/", &targetObj, QDBusConnection::ExportScriptableContents);
+}
+
+void tst_QDBusAbstractInterface::init()
+{
+ QDBusConnection con = QDBusConnection::sessionBus();
+ QVERIFY(con.isConnected());
+
+ // verify service isn't registered by something else
+ // (e.g. a left over qpinger from a previous test run)
+ QVERIFY(!con.interface()->isServiceRegistered(serviceName));
// start peer server
#ifdef Q_OS_WIN
@@ -253,9 +232,8 @@ void tst_QDBusAbstractInterface::initTestCase()
#endif
QVERIFY(proc.waitForStarted());
- WaitForQPinger w;
- QVERIFY(w.ok());
- //QTest::qWait(2000);
+ // verify service is now registered
+ QTRY_VERIFY(con.interface()->isServiceRegistered(serviceName));
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
@@ -273,10 +251,24 @@ void tst_QDBusAbstractInterface::initTestCase()
QVERIFY(rpl2.arguments().at(0).toBool());
}
-void tst_QDBusAbstractInterface::cleanupTestCase()
+void tst_QDBusAbstractInterface::cleanup()
{
- proc.close();
- proc.kill();
+ QDBusConnection::disconnectFromPeer("peer");
+
+ // Kill peer, resetting the object exported by a separate process
+ proc.terminate();
+ QVERIFY(proc.waitForFinished() || proc.state() == QProcess::NotRunning);
+
+ // Reset the object exported by this process
+ targetObj.m_stringProp = QString();
+ targetObj.m_variantProp = QDBusVariant();
+ targetObj.m_complexProp = RegisteredType();
+
+ // Wait until the service is certainly not registered
+ QDBusConnection con = QDBusConnection::sessionBus();
+ if (con.isConnected()) {
+ QTRY_VERIFY(!con.interface()->isServiceRegistered(serviceName));
+ }
}
void tst_QDBusAbstractInterface::makeVoidCall()
@@ -635,6 +627,7 @@ void tst_QDBusAbstractInterface::stringPropWritePeer()
QString expectedValue = "This is a value";
QVERIFY(p->setProperty("stringProp", expectedValue));
+ QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_stringProp, expectedValue);
}
@@ -660,6 +653,7 @@ void tst_QDBusAbstractInterface::variantPropWritePeer()
QDBusVariant expectedValue = QDBusVariant(Q_INT64_C(-47));
QVERIFY(p->setProperty("variantProp", qVariantFromValue(expectedValue)));
+ QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_variantProp.variant(), expectedValue.variant());
}
@@ -683,6 +677,7 @@ void tst_QDBusAbstractInterface::complexPropWritePeer()
RegisteredType expectedValue = RegisteredType("This is a value");
QVERIFY(p->setProperty("complexProp", qVariantFromValue(expectedValue)));
+ QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_complexProp, expectedValue);
}
@@ -762,6 +757,7 @@ void tst_QDBusAbstractInterface::stringPropDirectWritePeer()
QString expectedValue = "This is a value";
p->setStringProp(expectedValue);
+ QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_stringProp, expectedValue);
}
@@ -783,6 +779,7 @@ void tst_QDBusAbstractInterface::variantPropDirectWritePeer()
QDBusVariant expectedValue = QDBusVariant(Q_INT64_C(-47));
p->setVariantProp(expectedValue);
+ QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_variantProp.variant().userType(), expectedValue.variant().userType());
QCOMPARE(targetObj.m_variantProp.variant(), expectedValue.variant());
}
@@ -805,6 +802,7 @@ void tst_QDBusAbstractInterface::complexPropDirectWritePeer()
RegisteredType expectedValue = RegisteredType("This is a value");
p->setComplexProp(expectedValue);
+ QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_complexProp, expectedValue);
}
diff --git a/tests/auto/dbus/qdbusmarshall/common.h b/tests/auto/dbus/qdbusmarshall/common.h
index d49f4eff30..87c434b71e 100644
--- a/tests/auto/dbus/qdbusmarshall/common.h
+++ b/tests/auto/dbus/qdbusmarshall/common.h
@@ -610,10 +610,6 @@ template<> bool compare(const QVariant &v1, const QVariant &v2)
else if (id == QVariant::ByteArray)
return compare(v1.toByteArray(), v2.toByteArray());
- else if (id < int(QVariant::UserType)) // yes, v1.type()
- // QVariant can compare
- return v1 == v2;
-
else if (id == QMetaType::UChar)
return qvariant_cast<uchar>(v1) == qvariant_cast<uchar>(v2);
@@ -716,6 +712,10 @@ template<> bool compare(const QVariant &v1, const QVariant &v2)
else if (id == qMetaTypeId<MyStruct>()) // (is)
return qvariant_cast<MyStruct>(v1) == qvariant_cast<MyStruct>(v2);
+ else if (id < int(QVariant::UserType)) // yes, v1.type()
+ // QVariant can compare
+ return v1 == v2;
+
else {
qWarning() << "Please write a comparison case for type" << v1.typeName();
return false; // unknown type
diff --git a/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp b/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp
index 7eb31ffb41..25e3fdeabd 100644
--- a/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp
+++ b/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp
@@ -470,12 +470,12 @@ void tst_QDBusXmlParser::properties_data()
prop.type = "i";
prop.access = QDBusIntrospection::Property::Read;
map << prop;
- QTest::newRow("two") <<
+ QTest::newRow("two-1") <<
"<property name=\"foo\" type=\"s\" access=\"readwrite\"/>"
"<property name=\"bar\" type=\"i\" access=\"read\"/>" << map;
// invert the order of the declaration
- QTest::newRow("two") <<
+ QTest::newRow("two-2") <<
"<property name=\"bar\" type=\"i\" access=\"read\"/>"
"<property name=\"foo\" type=\"s\" access=\"readwrite\"/>" << map;
diff --git a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
index 25c6c81b2a..74eec26c52 100644
--- a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
+++ b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
@@ -127,8 +127,8 @@ void tst_QIcoImageFormat::canRead_data()
QTest::newRow("16px,32px,48px - 16,256,16M colors") << "valid/Obj_N2_Internal_Mem.ico" << 1;
QTest::newRow("16px - 16,256,16M colors") << "valid/Status_Play.ico" << 1;
QTest::newRow("16px,32px - 16 colors") << "valid/TIMER01.ICO" << 1;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLD.ico" << 1;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLDH.ico" << 1;
+ QTest::newRow("16px16c, 32px32c, 32px256c 1") << "valid/WORLD.ico" << 1;
+ QTest::newRow("16px16c, 32px32c, 32px256c 2") << "valid/WORLDH.ico" << 1;
QTest::newRow("invalid floppy (first 8 bytes = 0xff)") << "invalid/35floppy.ico" << 0;
QTest::newRow("103x16px, 24BPP") << "valid/trolltechlogo_tiny.ico" << 1;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 1;
@@ -198,8 +198,8 @@ void tst_QIcoImageFormat::imageCount_data()
QTest::newRow("16px,32px,48px - 16,256,16M colors") << "valid/Obj_N2_Internal_Mem.ico" << 9;
QTest::newRow("16px - 16,256,16M colors") << "valid/Status_Play.ico" << 3;
QTest::newRow("16px,32px - 16 colors") << "valid/TIMER01.ICO" << 2;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLD.ico" << 3;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLDH.ico" << 3;
+ QTest::newRow("16px16c, 32px32c, 32px256c 1") << "valid/WORLD.ico" << 3;
+ QTest::newRow("16px16c, 32px32c, 32px256c 2") << "valid/WORLDH.ico" << 3;
QTest::newRow("invalid floppy (first 8 bytes = 0xff)") << "invalid/35floppy.ico" << 0;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 9;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 4;
@@ -227,8 +227,8 @@ void tst_QIcoImageFormat::jumpToNextImage_data()
QTest::newRow("16px,32px,48px - 16,256,16M colors") << "valid/Obj_N2_Internal_Mem.ico" << 9;
QTest::newRow("16px - 16,256,16M colors") << "valid/Status_Play.ico" << 3;
QTest::newRow("16px,32px - 16 colors") << "valid/TIMER01.ICO" << 2;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLD.ico" << 3;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLDH.ico" << 3;
+ QTest::newRow("16px16c, 32px32c, 32px256c 1") << "valid/WORLD.ico" << 3;
+ QTest::newRow("16px16c, 32px32c, 32px256c 2") << "valid/WORLDH.ico" << 3;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 9;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 4;
}
@@ -276,8 +276,8 @@ void tst_QIcoImageFormat::nextImageDelay_data()
QTest::newRow("16px,32px,48px - 16,256,16M colors") << "valid/Obj_N2_Internal_Mem.ico" << 9;
QTest::newRow("16px - 16,256,16M colors") << "valid/Status_Play.ico" << 3;
QTest::newRow("16px,32px - 16 colors") << "valid/TIMER01.ICO" << 2;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLD.ico" << 3;
- QTest::newRow("16px16c, 32px32c, 32px256c") << "valid/WORLDH.ico" << 3;
+ QTest::newRow("16px16c, 32px32c, 32px256c 1") << "valid/WORLD.ico" << 3;
+ QTest::newRow("16px16c, 32px32c, 32px256c 2") << "valid/WORLDH.ico" << 3;
QTest::newRow("invalid floppy (first 8 bytes = 0xff)") << "invalid/35floppy.ico" << -1;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 9;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 4;
diff --git a/tests/auto/gui/image/qicon/heart.svg b/tests/auto/gui/image/qicon/heart.svg
deleted file mode 100644
index 8c982cd93c..0000000000
--- a/tests/auto/gui/image/qicon/heart.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) --><svg viewBox="100 200 550 500" height="841.88976pt" id="svg1" inkscape:version="0.40+cvs" sodipodi:docbase="C:\Documents and Settings\Jon Phillips\My Documents\projects\clipart-project\submissions" sodipodi:docname="heart-left-highlight.svg" sodipodi:version="0.32" width="595.27559pt" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
-<metadata>
-<rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<cc:Work rdf:about="">
-<dc:title>Heart Left-Highlight</dc:title>
-<dc:description>This is a normal valentines day heart.</dc:description>
-<dc:subject>
-<rdf:Bag>
-<rdf:li>holiday</rdf:li>
-<rdf:li>valentines</rdf:li>
-<rdf:li></rdf:li>
-<rdf:li>valentine</rdf:li>
-<rdf:li>hash(0x8a091c0)</rdf:li>
-<rdf:li>hash(0x8a0916c)</rdf:li>
-<rdf:li>signs_and_symbols</rdf:li>
-<rdf:li>hash(0x8a091f0)</rdf:li>
-<rdf:li>day</rdf:li>
-</rdf:Bag>
-</dc:subject>
-<dc:publisher>
-<cc:Agent rdf:about="http://www.openclipart.org">
-<dc:title>Jon Phillips</dc:title>
-</cc:Agent>
-</dc:publisher>
-<dc:creator>
-<cc:Agent>
-<dc:title>Jon Phillips</dc:title>
-</cc:Agent>
-</dc:creator>
-<dc:rights>
-<cc:Agent>
-<dc:title>Jon Phillips</dc:title>
-</cc:Agent>
-</dc:rights>
-<dc:date></dc:date>
-<dc:format>image/svg+xml</dc:format>
-<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
-<cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
-<dc:language>en</dc:language>
-</cc:Work>
-<cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
-<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
-<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
-<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
-</cc:License>
-</rdf:RDF>
-</metadata>
-<defs id="defs3"/>
-<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="549.40674" inkscape:cy="596.00159" inkscape:document-units="px" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="615" inkscape:window-width="866" inkscape:window-x="88" inkscape:window-y="116" inkscape:zoom="0.35000000" pagecolor="#ffffff" showguides="true"/>
-<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
-<path d="M 263.41570,235.14588 C 197.17570,235.14588 143.41575,288.90587 143.41575,355.14588 C 143.41575,489.90139 279.34890,525.23318 371.97820,658.45392 C 459.55244,526.05056 600.54070,485.59932 600.54070,355.14588 C 600.54070,288.90588 546.78080,235.14587 480.54070,235.14588 C 432.49280,235.14588 391.13910,263.51631 371.97820,304.33338 C 352.81740,263.51630 311.46370,235.14587 263.41570,235.14588 z " id="path7" sodipodi:nodetypes="ccccccc" style="fill:#e60000;fill-opacity:1.0000000;stroke:#000000;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
-<path d="M 265.00000,253.59375 C 207.04033,253.59375 160.00000,300.63407 160.00000,358.59375 C 160.00000,476.50415 278.91857,507.43251 359.96875,624.00000 C 366.52868,614.08205 220.00000,478.47309 220.00000,378.59375 C 220.00000,320.63407 267.04033,273.59375 325.00000,273.59375 C 325.50453,273.59375 325.99718,273.64912 326.50000,273.65625 C 309.22436,261.07286 288.00557,253.59374 265.00000,253.59375 z " id="path220" sodipodi:nodetypes="ccccccc" style="fill:#e6e6e6;fill-opacity:0.64556962;stroke:none;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
-</g>
-</svg>
diff --git a/tests/auto/gui/image/qicon/heart.svgz b/tests/auto/gui/image/qicon/heart.svgz
deleted file mode 100644
index 0f0913ffa7..0000000000
--- a/tests/auto/gui/image/qicon/heart.svgz
+++ /dev/null
Binary files differ
diff --git a/tests/auto/gui/image/qicon/rect.svg b/tests/auto/gui/image/qicon/rect.svg
deleted file mode 100644
index 8eb24727be..0000000000
--- a/tests/auto/gui/image/qicon/rect.svg
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.0"
- width="40px"
- height="5px"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docname="test.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <sodipodi:namedview
- inkscape:window-height="1005"
- inkscape:window-width="1280"
- inkscape:pageshadow="2"
- inkscape:pageopacity="0.0"
- guidetolerance="10.0"
- gridtolerance="10.0"
- objecttolerance="10.0"
- borderopacity="1.0"
- bordercolor="#666666"
- pagecolor="#ffffff"
- id="base"
- showgrid="false"
- inkscape:zoom="13.6"
- inkscape:cx="20"
- inkscape:cy="2.5"
- inkscape:window-x="-4"
- inkscape:window-y="-4"
- inkscape:current-layer="svg2" />
- <defs
- id="defs4">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 2.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="40 : 2.5 : 1"
- inkscape:persp3d-origin="20 : 1.6666667 : 1"
- id="perspective9" />
- </defs>
- <g
- id="layer1">
- <rect
- width="40px"
- height="5px"
- x="0px"
- y="0px"
- id="rect2393"
- style="fill:#ff0000" />
- </g>
- <rect
- style="fill:#000000"
- id="rect2382"
- width="2"
- height="2"
- x="19"
- y="1.5" />
-</svg>
diff --git a/tests/auto/gui/image/qicon/trash.svg b/tests/auto/gui/image/qicon/trash.svg
deleted file mode 100644
index c44e4c75a2..0000000000
--- a/tests/auto/gui/image/qicon/trash.svg
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 10, SVG Export Plug-In . SVG Version: 3.0.0 Build 76) --><svg enable-background="new 0 0 347 348" height="348" i:pageBounds="0 792 612 0" i:rulerOrigin="0 0" i:viewOrigin="131 567" overflow="visible" space="preserve" viewBox="-20 -20 387 388" width="347" xmlns="http://www.w3.org/2000/svg" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:xlink="http://www.w3.org/1999/xlink">
-<metadata>
-<rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<cc:Work rdf:about="">
-<dc:title>Keep Tidy Inside</dc:title>
-<dc:description></dc:description>
-<dc:subject>
-<rdf:Bag>
-<rdf:li></rdf:li>
-<rdf:li>symbol</rdf:li>
-<rdf:li>bin</rdf:li>
-<rdf:li>signs_and_symbols</rdf:li>
-<rdf:li>clean</rdf:li>
-<rdf:li>rubish</rdf:li>
-<rdf:li>trash</rdf:li>
-<rdf:li>inside</rdf:li>
-<rdf:li>garbage</rdf:li>
-<rdf:li>sign</rdf:li>
-</rdf:Bag>
-</dc:subject>
-<dc:publisher>
-<cc:Agent rdf:about="http://www.openclipart.org">
-<dc:title>Martin Owens</dc:title>
-</cc:Agent>
-</dc:publisher>
-<dc:creator>
-<cc:Agent>
-<dc:title>Martin Owens</dc:title>
-</cc:Agent>
-</dc:creator>
-<dc:rights>
-<cc:Agent>
-<dc:title>Martin Owens</dc:title>
-</cc:Agent>
-</dc:rights>
-<dc:date></dc:date>
-<dc:format>image/svg+xml</dc:format>
-<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
-<cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
-<dc:language>en</dc:language>
-</cc:Work>
-<cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
-<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
-<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
-<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
-</cc:License>
-</rdf:RDF>
-</metadata>
-<g i:dimmedPercent="50" i:knockout="Off" i:layer="yes" i:rgbTrio="#4F008000FFFF" id="Layer_1">
-<path d="M347,174c0,96.098-77.679,174-173.5,174C77.679,348,0,270.098,0,174 C0,77.902,77.679,0,173.5,0C269.321,0,347,77.902,347,174z" fill="#10A040" i:knockout="Off"/>
-<path d="M238,53c0,13.807-11.864,25-26.5,25S185,66.807,185,53s11.864-25,26.5-25 S238,39.193,238,53z" fill="#FFFFFF" i:knockout="Off"/>
-<path d="M66,175c1.055,6.355,19.333,126.417,19.333,126.417h68.333 c0,0,14.105-122.524,14.333-126.417c6.224-0.622,6.667-13-2-13c-12.164,0-89.205-0.059-98,0S61.167,174.487,66,175z" fill="#FFFFFF" i:knockout="Off"/>
-<path d="M78,141c17.292-5.325,24.179-23.532,27-31c14.513,6.596,40.333,12.265,59,8 c3.683,19.419-28.043,19.31-23,37C132.577,145.705,89.404,167.292,78,141z" fill="#FFFFFF" i:knockout="Off"/>
-<path d="M103,82l139-1c-0.6,3.421,33.633,57.497,29,67c-4.089,0.418-67,5-67,5 c6.109-9.379-13-43-13-43L103,82z" fill="#FFFFFF" i:knockout="Off"/>
-<path d="M270,156l-66-3c0,0-23.565,143.355-24,145s1.855,2.536,3,1s51-82,51-82 s19.754,80.701,20,82s3.721,1.209,4,0S270,156,270,156z" fill="#FFFFFF" i:knockout="Off"/>
-</g>
-</svg>
diff --git a/tests/auto/gui/image/qicon/tst_qicon.cpp b/tests/auto/gui/image/qicon/tst_qicon.cpp
index 7d455f1010..4a9ab93921 100644
--- a/tests/auto/gui/image/qicon/tst_qicon.cpp
+++ b/tests/auto/gui/image/qicon/tst_qicon.cpp
@@ -58,13 +58,11 @@ private slots:
void actualSize();
void actualSize2_data(); // test with 2 pixmaps with different aspect ratio
void actualSize2();
- void svgActualSize();
void isNull();
void swap();
void bestMatch();
void cacheKey();
void detach();
- void svg();
void addFile();
void availableSizes();
void name();
@@ -181,28 +179,6 @@ void tst_QIcon::actualSize2()
QCOMPARE(icon.pixmap(argument).size(), result);
}
-void tst_QIcon::svgActualSize()
-{
- if (!haveImageFormat("svg")) {
- QSKIP("SVG support is not available");
- }
-
- const QString prefix = QFileInfo(QFINDTESTDATA("icons")).absolutePath() + "/";
- QIcon icon(prefix + "rect.svg");
- QCOMPARE(icon.actualSize(QSize(16, 16)), QSize(16, 2));
- QCOMPARE(icon.pixmap(QSize(16, 16)).size(), QSize(16, 2));
-
- QPixmap p(16, 16);
- p.fill(Qt::cyan);
- icon.addPixmap(p);
-
- QCOMPARE(icon.actualSize(QSize(16, 16)), QSize(16, 16));
- QCOMPARE(icon.pixmap(QSize(16, 16)).size(), QSize(16, 16));
-
- QCOMPARE(icon.actualSize(QSize(16, 14)), QSize(16, 2));
- QCOMPARE(icon.pixmap(QSize(16, 14)).size(), QSize(16, 2));
-}
-
void tst_QIcon::isNull() {
// test default constructor
QIcon defaultConstructor;
@@ -395,54 +371,6 @@ void tst_QIcon::detach()
QVERIFY(img1 == img2);
}
-void tst_QIcon::svg()
-{
- if (!haveImageFormat("svg")) {
- QSKIP("SVG support is not available");
- }
- QIcon icon1("heart.svg");
-
- QVERIFY(!icon1.pixmap(32).isNull());
- QImage img1 = icon1.pixmap(32).toImage();
- QVERIFY(!icon1.pixmap(32, QIcon::Disabled).isNull());
- QImage img2 = icon1.pixmap(32, QIcon::Disabled).toImage();
-
- icon1.addFile("trash.svg", QSize(), QIcon::Disabled);
- QVERIFY(!icon1.pixmap(32, QIcon::Disabled).isNull());
- QImage img3 = icon1.pixmap(32, QIcon::Disabled).toImage();
- QVERIFY(img3 != img2);
- QVERIFY(img3 != img1);
-
- QPixmap pm("image.png");
- icon1.addPixmap(pm, QIcon::Normal, QIcon::On);
- QVERIFY(!icon1.pixmap(128, QIcon::Normal, QIcon::On).isNull());
- QImage img4 = icon1.pixmap(128, QIcon::Normal, QIcon::On).toImage();
- QVERIFY(img4 != img3);
- QVERIFY(img4 != img2);
- QVERIFY(img4 != img1);
-
- QIcon icon2;
- icon2.addFile("heart.svg");
- QVERIFY(icon2.pixmap(57).toImage() == icon1.pixmap(57).toImage());
-
- QIcon icon3("trash.svg");
- icon3.addFile("heart.svg");
- QVERIFY(icon3.pixmap(57).toImage() == icon1.pixmap(57).toImage());
-
- QIcon icon4("heart.svg");
- icon4.addFile("image.png", QSize(), QIcon::Active);
- QVERIFY(!icon4.pixmap(32).isNull());
- QVERIFY(!icon4.pixmap(32, QIcon::Active).isNull());
- QVERIFY(icon4.pixmap(32).toImage() == img1);
- QIcon pmIcon(pm);
- QVERIFY(icon4.pixmap(pm.size(), QIcon::Active).toImage() == pmIcon.pixmap(pm.size(), QIcon::Active).toImage());
-
-#ifndef QT_NO_COMPRESS
- QIcon icon5("heart.svgz");
- QVERIFY(!icon5.pixmap(32).isNull());
-#endif
-}
-
void tst_QIcon::addFile()
{
QIcon icon;
@@ -506,22 +434,6 @@ void tst_QIcon::availableSizes()
QCOMPARE(availableSizes.at(0), QSize(16,16));
}
- if (haveImageFormat("svg")) {
- // checks that there are no availableSizes for scalable images.
- QIcon icon("heart.svg");
- QList<QSize> availableSizes = icon.availableSizes();
- QVERIFY(availableSizes.isEmpty());
- }
-
- if (haveImageFormat("svg")) {
- // even if an a scalable image contain added pixmaps,
- // availableSizes still should be empty.
- QIcon icon("heart.svg");
- icon.addFile("image.png", QSize(32,32));
- QList<QSize> availableSizes = icon.availableSizes();
- QVERIFY(availableSizes.isEmpty());
- }
-
{
// we try to load an icon from resources
QIcon icon(QLatin1String(":/trolltech/styles/commonstyle/images/standardbutton-open-16.png"));
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index cda887d8e1..c5c2b13b3e 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -1025,17 +1025,17 @@ void tst_QImage::setPixel_data()
QTest::newRow("RGB16 blue") << int(QImage::Format_RGB16)
<< 0xff0000ff << 0x001fu;
QTest::newRow("ARGB8565_Premultiplied red") << int(QImage::Format_ARGB8565_Premultiplied)
- << 0xffff0000 << 0xffff0000;
+ << 0xffff0000 << 0xf800ffu;
QTest::newRow("ARGB8565_Premultiplied green") << int(QImage::Format_ARGB8565_Premultiplied)
- << 0xff00ff00 << 0xff00ff00;
+ << 0xff00ff00 << 0x07e0ffu;
QTest::newRow("ARGB8565_Premultiplied blue") << int(QImage::Format_ARGB8565_Premultiplied)
- << 0xff0000ff << 0xff0000ff;
+ << 0xff0000ff << 0x001fffu;
QTest::newRow("RGB666 red") << int(QImage::Format_RGB666)
- << 0xffff0000 << 0xffff0000;
+ << 0xffff0000 << 0x03f000u;
QTest::newRow("RGB666 green") << int(QImage::Format_RGB666)
- << 0xff00ff00 << 0xff00ff00;;
+ << 0xff00ff00 << 0x000fc0u;
QTest::newRow("RGB666 blue") << int(QImage::Format_RGB666)
- << 0xff0000ff << 0xff0000ff;
+ << 0xff0000ff << 0x00003fu;
QTest::newRow("RGB555 red") << int(QImage::Format_RGB555)
<< 0xffff0000 << 0x7c00u;
QTest::newRow("RGB555 green") << int(QImage::Format_RGB555)
@@ -1043,17 +1043,17 @@ void tst_QImage::setPixel_data()
QTest::newRow("RGB555 blue") << int(QImage::Format_RGB555)
<< 0xff0000ff << 0x001fu;
QTest::newRow("ARGB8555_Premultiplied red") << int(QImage::Format_ARGB8555_Premultiplied)
- << 0xffff0000 << 0xffff0000;
+ << 0xffff0000 << 0x7c00ffu;
QTest::newRow("ARGB8555_Premultiplied green") << int(QImage::Format_ARGB8555_Premultiplied)
- << 0xff00ff00 << 0xff00ff00;
+ << 0xff00ff00 << 0x03e0ffu;
QTest::newRow("ARGB8555_Premultiplied blue") << int(QImage::Format_ARGB8555_Premultiplied)
- << 0xff0000ff << 0xff0000ff;
+ << 0xff0000ff << 0x001fffu;
QTest::newRow("RGB888 red") << int(QImage::Format_RGB888)
- << 0xffff0000 << 0xffff0000;
+ << 0xffff0000 << 0x0000ffu;
QTest::newRow("RGB888 green") << int(QImage::Format_RGB888)
- << 0xff00ff00 << 0xff00ff00;
+ << 0xff00ff00 << 0x00ff00u;
QTest::newRow("RGB888 blue") << int(QImage::Format_RGB888)
- << 0xff0000ff << 0xff0000ff;
+ << 0xff0000ff << 0xff0000u;
}
void tst_QImage::setPixel()
@@ -1106,37 +1106,12 @@ void tst_QImage::setPixel()
break;
}
case int(QImage::Format_RGB666):
- {
- for (int y = 0; y < h; ++y) {
- const qrgb666 *row = (const qrgb666*)(img.scanLine(y));
- for (int x = 0; x < w; ++x) {
- quint32 result = row[x];
- if (result != expected)
- printf("[x,y]: %d,%d, expected=%04x, result=%04x\n",
- x, y, expected, result);
- QCOMPARE(result, expected);
- }
- }
- break;
- }
case int(QImage::Format_ARGB8565_Premultiplied):
- {
- for (int y = 0; y < h; ++y) {
- const qargb8565 *row = (const qargb8565*)(img.scanLine(y));
- for (int x = 0; x < w; ++x) {
- quint32 result = row[x];
- if (result != expected)
- printf("[x,y]: %d,%d, expected=%04x, result=%04x\n",
- x, y, expected, result);
- QCOMPARE(result, expected);
- }
- }
- break;
- }
case int(QImage::Format_ARGB8555_Premultiplied):
+ case int(QImage::Format_RGB888):
{
for (int y = 0; y < h; ++y) {
- const qargb8555 *row = (const qargb8555*)(img.scanLine(y));
+ const quint24 *row = (const quint24*)(img.scanLine(y));
for (int x = 0; x < w; ++x) {
quint32 result = row[x];
if (result != expected)
@@ -1147,20 +1122,6 @@ void tst_QImage::setPixel()
}
break;
}
- case int(QImage::Format_RGB888):
- {
- for (int y = 0; y < h; ++y) {
- const qrgb888 *row = (const qrgb888*)(img.scanLine(y));
- for (int x = 0; x < w; ++x) {
- qrgb888 result = row[x];
- if (result != expected)
- printf("[x,y]: %d,%d, expected=%04x, result=%04x\n",
- x, y, expected, quint32(result));
- QCOMPARE(uint(result), expected);
- }
- }
- break;
- }
default:
qFatal("Test not implemented for format %d", format);
}
diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
index 8a18bee83f..96171740e2 100644
--- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
@@ -623,7 +623,6 @@ void tst_QImageReader::supportsAnimation_data()
QTest::newRow("XPM: marble") << QString("marble.xpm") << false;
QTest::newRow("PNG: kollada") << QString("kollada.png") << false;
QTest::newRow("PPM: teapot") << QString("teapot.ppm") << false;
- QTest::newRow("PPM: teapot") << QString("teapot.ppm") << false;
QTest::newRow("PPM: runners") << QString("runners.ppm") << false;
QTest::newRow("XBM: gnus") << QString("gnus.xbm") << false;
diff --git a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
index 8473597dac..ad9da27c7e 100644
--- a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
+++ b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
@@ -52,6 +52,11 @@
#include <QPainter>
#include <QSet>
+#ifdef Q_OS_UNIX // for geteuid()
+# include <sys/types.h>
+# include <unistd.h>
+#endif
+
typedef QMap<QString, QString> QStringMap;
typedef QList<int> QIntList;
Q_DECLARE_METATYPE(QImage)
diff --git a/tests/auto/gui/image/qpixmap/qpixmap.pro b/tests/auto/gui/image/qpixmap/qpixmap.pro
index 15098770c6..91d93a781d 100644
--- a/tests/auto/gui/image/qpixmap/qpixmap.pro
+++ b/tests/auto/gui/image/qpixmap/qpixmap.pro
@@ -10,3 +10,5 @@ SOURCES += tst_qpixmap.cpp
RESOURCES += qpixmap.qrc
TESTDATA += convertFromImage/* convertFromToHICON/* loadFromData/* images/*
+
+win32:CONFIG += insignificant_test # QTBUG-24183
diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
index 527dcce916..563baef486 100644
--- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
@@ -52,6 +52,7 @@
#include <qsplashscreen.h>
#include <qplatformpixmap_qpa.h>
+#include <qplatformintegration_qpa.h>
#include <private/qguiapplication_p.h>
#include <private/qdrawhelper_p.h>
@@ -1342,7 +1343,7 @@ void tst_QPixmap::fromImageReader_data()
QTest::newRow("designer_indexed8_with_alpha.gif") << prefix + "/designer_indexed8_with_alpha.gif";
QTest::newRow("designer_rgb32.jpg") << prefix + "/designer_rgb32.jpg";
QTest::newRow("designer_indexed8_with_alpha_animated") << prefix + "/designer_indexed8_with_alpha_animated.gif";
- QTest::newRow("designer_indexed8_with_alpha_animated") << prefix + "/designer_indexed8_no_alpha_animated.gif";
+ QTest::newRow("designer_indexed8_no_alpha_animated") << prefix + "/designer_indexed8_no_alpha_animated.gif";
}
void tst_QPixmap::fromImageReader()
diff --git a/tests/auto/gui/kernel/kernel.pro b/tests/auto/gui/kernel/kernel.pro
index 1adae128cf..116e9dd1f1 100644
--- a/tests/auto/gui/kernel/kernel.pro
+++ b/tests/auto/gui/kernel/kernel.pro
@@ -4,6 +4,7 @@ SUBDIRS=\
qdrag \
qevent \
qfileopenevent \
+ qguieventdispatcher \
qguimetatype \
qguivariant \
qinputmethod \
diff --git a/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro b/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro
index fffa097d73..777e2c6b1a 100644
--- a/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro
+++ b/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro
@@ -2,3 +2,5 @@ CONFIG += testcase
TARGET = tst_qguiapplication
QT += core gui testlib
SOURCES = tst_qguiapplication.cpp
+
+win32:CONFIG += insignificant_test # QTBUG-24186
diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
index 2fd875b7f4..7664706b93 100644
--- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
+++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
@@ -53,6 +53,7 @@ private slots:
void focusObject();
void allWindows();
void topLevelWindows();
+ void abortQuitOnShow();
};
class DummyWindow : public QWindow
@@ -77,6 +78,9 @@ public:
void tst_QGuiApplication::focusObject()
{
+#ifdef Q_OS_MAC
+ QSKIP("This test fails intermittently, and at different locations. See QTBUG-24322");
+#endif
int argc = 0;
QGuiApplication app(argc, 0);
@@ -152,5 +156,44 @@ void tst_QGuiApplication::topLevelWindows()
QCOMPARE(app.topLevelWindows().count(), 0);
}
+class ShowCloseShowWindow : public QWindow
+{
+ Q_OBJECT
+public:
+ ShowCloseShowWindow(bool showAgain, QWindow *parent = 0)
+ : QWindow(parent), showAgain(showAgain)
+ {
+ QTimer::singleShot(0, this, SLOT(doClose()));
+ QTimer::singleShot(500, this, SLOT(exitApp()));
+ }
+
+private slots:
+ void doClose() {
+ close();
+ if (showAgain)
+ show();
+ }
+
+ void exitApp() {
+ qApp->exit(1);
+ }
+
+private:
+ bool showAgain;
+};
+
+void tst_QGuiApplication::abortQuitOnShow()
+{
+ int argc = 0;
+ QGuiApplication app(argc, 0);
+ QWindow *window1 = new ShowCloseShowWindow(false);
+ window1->show();
+ QCOMPARE(app.exec(), 0);
+
+ QWindow *window2 = new ShowCloseShowWindow(true);
+ window2->show();
+ QCOMPARE(app.exec(), 1);
+}
+
QTEST_APPLESS_MAIN(tst_QGuiApplication)
#include "tst_qguiapplication.moc"
diff --git a/tests/auto/gui/kernel/qguieventdispatcher/qguieventdispatcher.pro b/tests/auto/gui/kernel/qguieventdispatcher/qguieventdispatcher.pro
new file mode 100644
index 0000000000..3057037e74
--- /dev/null
+++ b/tests/auto/gui/kernel/qguieventdispatcher/qguieventdispatcher.pro
@@ -0,0 +1,4 @@
+CONFIG += testcase
+TARGET = tst_qguieventdispatcher
+QT = core gui testlib
+SOURCES += ../../../corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
diff --git a/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro b/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
index c6eb02919e..1e0baafd09 100644
--- a/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
+++ b/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
@@ -7,5 +7,3 @@ QT += core-private gui-private
SOURCES += tst_qkeysequence.cpp
RESOURCES += qkeysequence.qrc
-
-mac: CONFIG += insignificant_test # QTBUG-23058
diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
index eed7977c82..29588e2ee9 100644
--- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
+++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
@@ -576,6 +576,11 @@ void tst_QKeySequence::parseString()
QFETCH( QString, strSequence );
QFETCH( QKeySequence, keycode );
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("Win+A", "QTBUG-24406 - This test fails on OSX", Abort);
+ QEXPECT_FAIL("Simon+G", "QTBUG-24406 - This test fails on OSX", Abort);
+#endif
+
QCOMPARE( QKeySequence(strSequence).toString(), keycode.toString() );
QVERIFY( QKeySequence(strSequence) == keycode );
}
diff --git a/tests/auto/gui/kernel/qwindow/qwindow.pro b/tests/auto/gui/kernel/qwindow/qwindow.pro
index 0115d96c56..363f7dd92e 100644
--- a/tests/auto/gui/kernel/qwindow/qwindow.pro
+++ b/tests/auto/gui/kernel/qwindow/qwindow.pro
@@ -6,3 +6,4 @@ QT += core-private gui-private testlib
SOURCES += tst_qwindow.cpp
mac: CONFIG += insignificant_test # QTBUG-23059
+
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index d7c153dca1..90c96b4030 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -45,6 +45,9 @@
#include <QEvent>
+// For QSignalSpy slot connections.
+Q_DECLARE_METATYPE(Qt::ScreenOrientation)
+
class tst_QWindow: public QObject
{
Q_OBJECT
@@ -57,6 +60,8 @@ private slots:
void touchToMouseTranslation();
void mouseToTouchTranslation();
void mouseToTouchLoop();
+ void touchCancel();
+ void touchCancelWithTouchToMouse();
void orientation();
void close();
void initTestCase()
@@ -274,6 +279,7 @@ public:
event->ignore();
return;
}
+ touchEventType = event->type();
QList<QTouchEvent::TouchPoint> points = event->touchPoints();
for (int i = 0; i < points.count(); ++i) {
switch (points.at(i).state()) {
@@ -283,6 +289,9 @@ public:
case Qt::TouchPointReleased:
++touchReleasedCount;
break;
+ case Qt::TouchPointMoved:
+ ++touchMovedCount;
+ break;
default:
break;
}
@@ -292,14 +301,15 @@ public:
InputTestWindow() {
keyPressCode = keyReleaseCode = 0;
mousePressButton = mouseReleaseButton = 0;
- touchPressedCount = touchReleasedCount = 0;
- ignoreMouse = ignoreTouch = 0;
+ touchPressedCount = touchReleasedCount = touchMovedCount = 0;
+ ignoreMouse = ignoreTouch = false;
}
int keyPressCode, keyReleaseCode;
int mousePressButton, mouseReleaseButton, mouseMoveButton;
QPointF mousePressScreenPos, mouseMoveScreenPos;
- int touchPressedCount, touchReleasedCount;
+ int touchPressedCount, touchReleasedCount, touchMovedCount;
+ QEvent::Type touchEventType;
bool ignoreMouse, ignoreTouch;
};
@@ -480,11 +490,114 @@ void tst_QWindow::mouseToTouchLoop()
QCoreApplication::processEvents();
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, false);
- qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, false);
+ qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, true);
+}
+
+void tst_QWindow::touchCancel()
+{
+ InputTestWindow window;
+ window.setGeometry(80, 80, 40, 40);
+ window.show();
+ QTest::qWaitForWindowShown(&window);
+
+ QList<QWindowSystemInterface::TouchPoint> points;
+ QWindowSystemInterface::TouchPoint tp1;
+ tp1.id = 1;
+
+ // Start a touch.
+ tp1.state = Qt::TouchPointPressed;
+ tp1.area = QRect(10, 10, 4, 4);
+ points << tp1;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchEventType, QEvent::TouchBegin);
+ QTRY_COMPARE(window.touchPressedCount, 1);
+
+ // Cancel the active touch sequence.
+ QWindowSystemInterface::handleTouchCancelEvent(&window, touchDevice);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchEventType, QEvent::TouchCancel);
+
+ // Send a move -> will not be delivered due to the cancellation.
+ QTRY_COMPARE(window.touchMovedCount, 0);
+ points[0].state = Qt::TouchPointMoved;
+ tp1.area.adjust(2, 2, 2, 2);
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchMovedCount, 0);
+
+ // Likewise. The only allowed transition is TouchCancel -> TouchBegin.
+ QTRY_COMPARE(window.touchReleasedCount, 0);
+ points[0].state = Qt::TouchPointReleased;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchReleasedCount, 0);
+
+ // Start a new sequence -> from this point on everything should go through normally.
+ points[0].state = Qt::TouchPointPressed;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchEventType, QEvent::TouchBegin);
+ QTRY_COMPARE(window.touchPressedCount, 2);
+
+ points[0].state = Qt::TouchPointMoved;
+ tp1.area.adjust(2, 2, 2, 2);
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchMovedCount, 1);
+
+ points[0].state = Qt::TouchPointReleased;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.touchReleasedCount, 1);
+}
+
+void tst_QWindow::touchCancelWithTouchToMouse()
+{
+ InputTestWindow window;
+ window.ignoreTouch = true;
+ window.setGeometry(80, 80, 40, 40);
+ window.show();
+ QTest::qWaitForWindowShown(&window);
+
+ QList<QWindowSystemInterface::TouchPoint> points;
+ QWindowSystemInterface::TouchPoint tp1;
+ tp1.id = 1;
+
+ tp1.state = Qt::TouchPointPressed;
+ tp1.area = QRect(100, 100, 4, 4);
+ points << tp1;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.mousePressButton, int(Qt::LeftButton));
+ QTRY_COMPARE(window.mousePressScreenPos, points[0].area.center());
+
+ // Cancel the touch. Should result in a mouse release for windows that have
+ // have an active touch-to-mouse sequence.
+ QWindowSystemInterface::handleTouchCancelEvent(0, touchDevice);
+ QCoreApplication::processEvents();
+
+ QTRY_COMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
+
+ // Now change the window to accept touches.
+ window.mousePressButton = window.mouseReleaseButton = 0;
+ window.ignoreTouch = false;
+
+ // Send a touch, there will be no mouse event generated.
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.mousePressButton, 0);
+
+ // Cancel the touch. It should not result in a mouse release with this window.
+ QWindowSystemInterface::handleTouchCancelEvent(0, touchDevice);
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(window.mouseReleaseButton, 0);
}
void tst_QWindow::orientation()
{
+ qRegisterMetaType<Qt::ScreenOrientation>("Qt::ScreenOrientation");
+
QWindow window;
window.setGeometry(80, 80, 40, 40);
window.create();
diff --git a/tests/auto/gui/painting/qpainter/qpainter.pro b/tests/auto/gui/painting/qpainter/qpainter.pro
index 0209043d20..2cbd5b7e1c 100644
--- a/tests/auto/gui/painting/qpainter/qpainter.pro
+++ b/tests/auto/gui/painting/qpainter/qpainter.pro
@@ -5,6 +5,7 @@ QT += widgets widgets-private printsupport testlib
SOURCES += tst_qpainter.cpp
mac*:CONFIG+=insignificant_test
+win32:CONFIG += insignificant_test # QTBUG-24188
TESTDATA += drawEllipse/* drawLine_rop_bitmap/* drawPixmap_rop/* drawPixmap_rop_bitmap/* \
task217400.png
diff --git a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
index bcd009dfb4..44006d4571 100644
--- a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
+++ b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
@@ -282,13 +282,13 @@ void tst_QPainterPath::contains_QPointF_data()
inside.addEllipse(base_rect.adjusted(5, 5, -5, -5));
QPolygonF inside_poly = inside.toFillPolygon();
for (int i=0; i<inside_poly.size(); ++i)
- QTest::newRow("inside_ellipse") << path << inside_poly.at(i) << true;
+ QTest::newRow(qPrintable(QString("inside_ellipse %1").arg(i))) << path << inside_poly.at(i) << true;
QPainterPath outside;
outside.addEllipse(base_rect.adjusted(-5, -5, 5, 5));
QPolygonF outside_poly = outside.toFillPolygon();
for (int i=0; i<outside_poly.size(); ++i)
- QTest::newRow("outside_ellipse") << path << outside_poly.at(i) << false;
+ QTest::newRow(qPrintable(QString("outside_ellipse %1").arg(i))) << path << outside_poly.at(i) << false;
path = QPainterPath();
base_rect = QRectF(50, 50, 200, 200);
@@ -865,12 +865,12 @@ void tst_QPainterPath::testArcMoveTo_data()
for (int domain=0; domain<rects.size(); ++domain) {
for (int i=-360; i<=360; ++i) {
- QTest::newRow("test") << rects.at(domain) << (qreal) i;
+ QTest::newRow(qPrintable(QString("test %1 %2").arg(domain).arg(i))) << rects.at(domain) << (qreal) i;
}
// test low angles
- QTest::newRow("test") << rects.at(domain) << (qreal) 1e-10;
- QTest::newRow("test") << rects.at(domain) << (qreal)-1e-10;
+ QTest::newRow("low angles 1") << rects.at(domain) << (qreal) 1e-10;
+ QTest::newRow("low angles 2") << rects.at(domain) << (qreal)-1e-10;
}
}
diff --git a/tests/auto/gui/painting/qprinter/qprinter.pro b/tests/auto/gui/painting/qprinter/qprinter.pro
index ebf8edea32..7543e91f8c 100644
--- a/tests/auto/gui/painting/qprinter/qprinter.pro
+++ b/tests/auto/gui/painting/qprinter/qprinter.pro
@@ -4,3 +4,4 @@ QT += printsupport widgets testlib
SOURCES += tst_qprinter.cpp
mac*:CONFIG+=insignificant_test
+win32:CONFIG += insignificant_test # QTBUG-24191
diff --git a/tests/auto/gui/painting/qprinterinfo/qprinterinfo.pro b/tests/auto/gui/painting/qprinterinfo/qprinterinfo.pro
index b0e69dca2e..88cb07f338 100644
--- a/tests/auto/gui/painting/qprinterinfo/qprinterinfo.pro
+++ b/tests/auto/gui/painting/qprinterinfo/qprinterinfo.pro
@@ -7,3 +7,4 @@ QT += printsupport network testlib
DEFINES += QT_USE_USING_NAMESPACE
mac: CONFIG += insignificant_test # QTBUG-23060
+win32:CONFIG += insignificant_test # QTBUG-24190
diff --git a/tests/auto/gui/painting/qprinterinfo/tst_qprinterinfo.cpp b/tests/auto/gui/painting/qprinterinfo/tst_qprinterinfo.cpp
index d312469449..2323dc8df3 100644
--- a/tests/auto/gui/painting/qprinterinfo/tst_qprinterinfo.cpp
+++ b/tests/auto/gui/painting/qprinterinfo/tst_qprinterinfo.cpp
@@ -110,7 +110,7 @@ QString tst_QPrinterInfo::getDefaultPrinterFromSystem()
return QString();
}
- QRegExp defaultReg("default.*: *([a-zA-Z0-9_]+)");
+ QRegExp defaultReg("default.*: *([a-zA-Z0-9_-]+)");
defaultReg.indexIn(output);
QString printer = defaultReg.cap(1);
macFixNameFormat(&printer);
@@ -221,7 +221,8 @@ void tst_QPrinterInfo::testForDefaultPrinter()
# else
QString defSysPrinter = getDefaultPrinterFromSystem();
# endif
- if (defSysPrinter == "") return;
+ if (defSysPrinter == "")
+ QSKIP("No default printer available");
QList<QPrinterInfo> list = QPrinterInfo::availablePrinters();
bool found = false;
diff --git a/tests/auto/gui/qopengl/qopengl.pro b/tests/auto/gui/qopengl/qopengl.pro
index f3c020dde2..d0af96df37 100644
--- a/tests/auto/gui/qopengl/qopengl.pro
+++ b/tests/auto/gui/qopengl/qopengl.pro
@@ -9,3 +9,4 @@ QT += gui gui-private core-private testlib
SOURCES += tst_qopengl.cpp
mac: CONFIG += insignificant_test # QTBUG-23061
+win32:CONFIG += insignificant_test # QTBUG-24192
diff --git a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
index 7eda35efb8..7e0a60c859 100644
--- a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
+++ b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
@@ -344,7 +344,6 @@ void tst_QCssParser::term_data()
val.variant = QVariant(QColor("#ffbb00"));
QTest::newRow("hexcolor2") << true << "#fb0" << val;
- QTest::ignoreMessage(QtWarningMsg, "QCssParser::parseHexColor: Unknown color name '#cafebabe'");
QTest::newRow("hexcolor_failure") << false << "#cafebabe" << val;
val.type = QCss::Value::Uri;
@@ -368,6 +367,9 @@ void tst_QCssParser::term()
QFETCH(QString, css);
QFETCH(QCss::Value, expectedValue);
+ if (strcmp(QTest::currentDataTag(), "hexcolor_failure") == 0)
+ QTest::ignoreMessage(QtWarningMsg, "QCssParser::parseHexColor: Unknown color name '#cafebabe'");
+
QCss::Parser parser(css);
QCss::Value val;
QVERIFY(parser.testTerm());
diff --git a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
index c853aaa100..034d08fc8f 100644
--- a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
+++ b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
@@ -11,3 +11,4 @@ wince* {
}
mac: CONFIG += insignificant_test # QTBUG-23062
+win32:CONFIG += insignificant_test # QTBUG-24193
diff --git a/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro b/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
index a636651724..bb0d8e3c4a 100644
--- a/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
+++ b/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
@@ -4,3 +4,4 @@ QT += testlib
SOURCES += tst_qfontmetrics.cpp
RESOURCES += testfont.qrc
+win32:CONFIG += insignificant_test # QTBUG-24195
diff --git a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
index 0b5486dd5a..4dbdf9a4f1 100644
--- a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
+++ b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
@@ -140,7 +140,7 @@ void tst_QFontMetrics::metrics()
font = fdb.font(family, style, 12);
QFontMetrics fontmetrics(font);
- QCOMPARE(fontmetrics.ascent() + fontmetrics.descent() + 1,
+ QCOMPARE(fontmetrics.ascent() + fontmetrics.descent(),
fontmetrics.height());
QCOMPARE(fontmetrics.height() + fontmetrics.leading(),
@@ -156,7 +156,7 @@ void tst_QFontMetrics::metrics()
font = fdb.font(family, style, size);
QFontMetrics fontmetrics(font);
- QCOMPARE(fontmetrics.ascent() + fontmetrics.descent() + 1,
+ QCOMPARE(fontmetrics.ascent() + fontmetrics.descent(),
fontmetrics.height());
QCOMPARE(fontmetrics.height() + fontmetrics.leading(),
fontmetrics.lineSpacing());
diff --git a/tests/auto/gui/text/qglyphrun/qglyphrun.pro b/tests/auto/gui/text/qglyphrun/qglyphrun.pro
index acdff0584f..97b9806c11 100644
--- a/tests/auto/gui/text/qglyphrun/qglyphrun.pro
+++ b/tests/auto/gui/text/qglyphrun/qglyphrun.pro
@@ -10,3 +10,5 @@ wince* {
} else {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}
+
+win32:CONFIG += insignificant_test # QTBUG-24196
diff --git a/tests/auto/gui/text/qrawfont/qrawfont.pro b/tests/auto/gui/text/qrawfont/qrawfont.pro
index 149ad6442e..8cac4abc57 100644
--- a/tests/auto/gui/text/qrawfont/qrawfont.pro
+++ b/tests/auto/gui/text/qrawfont/qrawfont.pro
@@ -9,3 +9,5 @@ SOURCES += \
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src
TESTDATA += testfont_bold_italic.ttf testfont.ttf
+
+win32:CONFIG += insignificant_test # QTBUG-24197
diff --git a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
index c2ae853a92..213b388895 100644
--- a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
+++ b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
@@ -1171,7 +1171,7 @@ void tst_QTextDocument::toHtml_data()
fmt.setVerticalAlignment(QTextCharFormat::AlignMiddle);
cursor.insertImage(fmt);
- QTest::newRow("image-malign") << QTextDocumentFragment(&doc)
+ QTest::newRow("image-align-middle") << QTextDocumentFragment(&doc)
<< QString("<p DEFAULTBLOCKSTYLE><img src=\"foo\" style=\"vertical-align: middle;\" /></p>");
}
@@ -1183,7 +1183,7 @@ void tst_QTextDocument::toHtml_data()
fmt.setVerticalAlignment(QTextCharFormat::AlignTop);
cursor.insertImage(fmt);
- QTest::newRow("image-malign") << QTextDocumentFragment(&doc)
+ QTest::newRow("image-align-top") << QTextDocumentFragment(&doc)
<< QString("<p DEFAULTBLOCKSTYLE><img src=\"foo\" style=\"vertical-align: top;\" /></p>");
}
diff --git a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
index 33293400c2..50ae22c530 100644
--- a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
+++ b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
@@ -3078,7 +3078,7 @@ void tst_QTextDocumentFragment::html_preNewlineHandling_data()
<< QString("Foo\nBar");
QTest::newRow("pre2") << QString("Foo<pre>\nBar")
<< QString("Foo\nBar");
- QTest::newRow("pre2") << QString("Foo<pre>\n\nBar")
+ QTest::newRow("pre3") << QString("Foo<pre>\n\nBar")
<< QString("Foo\n\nBar");
QTest::newRow("pre4") << QString("<html>Foo<pre>\nBar")
<< QString("Foo\nBar");
diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
index e7435743e5..8920e63957 100644
--- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
@@ -352,7 +352,7 @@ void tst_QTextLayout::threeLineBoundingRect()
QCOMPARE(qRound(line.naturalTextWidth()), thirdLineWidth);
y += qRound(line.ascent() + line.descent());
- QCOMPARE(layout.boundingRect(), QRectF(0, 0, longestLine, y + 1));
+ QCOMPARE(layout.boundingRect(), QRectF(0, 0, longestLine, y));
}
void tst_QTextLayout::boundingRectWithLongLineAndNoWrap()
@@ -386,7 +386,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(), pos);
QCOMPARE(line.textLength(),2);
QCOMPARE(qRound(line.naturalTextWidth()),testFont.pixelSize());
- QCOMPARE((int) line.height(), testFont.pixelSize() + 1); // + 1 baseline
+ QCOMPARE((int) line.height(), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
pos += line.textLength();
@@ -395,7 +395,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(),pos);
QCOMPARE(line.textLength(),1);
QCOMPARE(qRound(line.naturalTextWidth()), 0);
- QCOMPARE((int) line.height(), testFont.pixelSize() + 1); // + 1 baseline
+ QCOMPARE((int) line.height(), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
pos += line.textLength();
@@ -404,7 +404,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(),pos);
QCOMPARE(line.textLength(),2);
QCOMPARE(qRound(line.naturalTextWidth()),testFont.pixelSize());
- QCOMPARE(qRound(line.height()), testFont.pixelSize() + 1); // + 1 baseline
+ QCOMPARE(qRound(line.height()), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
pos += line.textLength();
@@ -413,7 +413,7 @@ void tst_QTextLayout::forcedBreaks()
QCOMPARE(line.textStart(),pos);
QCOMPARE(line.textLength(),1);
QCOMPARE(qRound(line.naturalTextWidth()), testFont.pixelSize());
- QCOMPARE((int) line.height(), testFont.pixelSize() + 1); // + 1 baseline
+ QCOMPARE((int) line.height(), testFont.pixelSize());
QCOMPARE(line.xToCursor(0), line.textStart());
}
diff --git a/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro b/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
index 719c34f286..ef47a4b458 100644
--- a/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
+++ b/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
@@ -4,10 +4,6 @@ QT += network testlib
QT -= gui
SOURCES += tst_qabstractnetworkcache.cpp
-wince* {
- testFiles.files = tests
- testFiles.path = .
- DEPLOYMENT += testFiles
-}
+TESTDATA += tests/*
CONFIG += insignificant_test # QTBUG-20686; note, assumed unstable on all platforms
diff --git a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
index 7c27973b56..bcd9cbdff7 100644
--- a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -165,11 +165,11 @@ void tst_QNetworkCookie::parseSingleCookie_data()
QTest::newRow("with-value2") << " a=b" << cookie;
QTest::newRow("with-value3") << "a=b " << cookie;
QTest::newRow("with-value4") << " a=b " << cookie;
- QTest::newRow("with-value4") << " a=b ;" << cookie;
- QTest::newRow("with-value5") << "a =b" << cookie;
- QTest::newRow("with-value6") << "a= b" << cookie;
- QTest::newRow("with-value7") << "a = b" << cookie;
- QTest::newRow("with-value8") << "a = b " << cookie;
+ QTest::newRow("with-value5") << " a=b ;" << cookie;
+ QTest::newRow("with-value6") << "a =b" << cookie;
+ QTest::newRow("with-value7") << "a= b" << cookie;
+ QTest::newRow("with-value8") << "a = b" << cookie;
+ QTest::newRow("with-value9") << "a = b " << cookie;
cookie.setValue("\",\"");
QTest::newRow("with-value-with-special1") << "a = \",\" " << cookie;
@@ -376,31 +376,31 @@ void tst_QNetworkCookie::parseSingleCookie_data()
// extra offsets
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 2), QTime(0, 0), Qt::UTC));
- QTest::newRow("zoneoffset-14") << "a=b;expires=Jan 1 89 15:0 JST+1" << cookie;
+ QTest::newRow("zoneoffset-15") << "a=b;expires=Jan 1 89 15:0 JST+1" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(1, 0), Qt::UTC));
- QTest::newRow("zoneoffset-15") << "a=b;expires=Jan 1 89 0:0 GMT+1" << cookie;
+ QTest::newRow("zoneoffset-16") << "a=b;expires=Jan 1 89 0:0 GMT+1" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(0, 0), Qt::UTC));
- QTest::newRow("zoneoffset-15b") << "a=b;expires=Jan 1 89 1:0 GMT-1" << cookie;
+ QTest::newRow("zoneoffset-17") << "a=b;expires=Jan 1 89 1:0 GMT-1" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(1, 0), Qt::UTC));
- QTest::newRow("zoneoffset-16") << "a=b;expires=Jan 1 89 0:0 GMT+01" << cookie;
+ QTest::newRow("zoneoffset-18") << "a=b;expires=Jan 1 89 0:0 GMT+01" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(1, 5), Qt::UTC));
- QTest::newRow("zoneoffset-17") << "a=b;expires=Jan 1 89 0:0 GMT+0105" << cookie;
+ QTest::newRow("zoneoffset-19") << "a=b;expires=Jan 1 89 0:0 GMT+0105" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(0, 0), Qt::UTC));
- QTest::newRow("zoneoffset-18") << "a=b;expires=Jan 1 89 0:0 GMT+015" << cookie;
+ QTest::newRow("zoneoffset-20") << "a=b;expires=Jan 1 89 0:0 GMT+015" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(0, 0), Qt::UTC));
- QTest::newRow("zoneoffset-19") << "a=b;expires=Jan 1 89 0:0 GM" << cookie;
+ QTest::newRow("zoneoffset-21") << "a=b;expires=Jan 1 89 0:0 GM" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(0, 0), Qt::UTC));
- QTest::newRow("zoneoffset-19b") << "a=b;expires=Jan 1 89 0:0 GMT" << cookie;
+ QTest::newRow("zoneoffset-22") << "a=b;expires=Jan 1 89 0:0 GMT" << cookie;
// offsets from gmt
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(1, 0), Qt::UTC));
- QTest::newRow("zoneoffset-20") << "a=b;expires=Jan 1 89 0:0 +1" << cookie;
+ QTest::newRow("zoneoffset-23") << "a=b;expires=Jan 1 89 0:0 +1" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(1, 0), Qt::UTC));
- QTest::newRow("zoneoffset-21") << "a=b;expires=Jan 1 89 0:0 +01" << cookie;
+ QTest::newRow("zoneoffset-24") << "a=b;expires=Jan 1 89 0:0 +01" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(1, 1), Qt::UTC));
- QTest::newRow("zoneoffset-22") << "a=b;expires=Jan 1 89 0:0 +0101" << cookie;
+ QTest::newRow("zoneoffset-25") << "a=b;expires=Jan 1 89 0:0 +0101" << cookie;
cookie.setExpirationDate(QDateTime(QDate(1989, 1, 1), QTime(0, 0), Qt::UTC));
- QTest::newRow("zoneoffset-23") << "a=b;expires=Jan 1 89 1:0 -1" << cookie;
+ QTest::newRow("zoneoffset-26") << "a=b;expires=Jan 1 89 1:0 -1" << cookie;
// Y2k
cookie.setExpirationDate(QDateTime(QDate(2000, 1, 1), QTime(0, 0), Qt::UTC));
diff --git a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
index 73d0a4a650..0e046ad6f9 100644
--- a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
+++ b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
@@ -284,7 +284,7 @@ void tst_QNetworkCookieJar::cookiesForUrl_data()
QTest::newRow("match-2") << allCookies << "http://nokia.com/web/" << result;
QTest::newRow("match-3") << allCookies << "http://nokia.com/web/content" << result;
QTest::newRow("match-4") << allCookies << "http://qt.nokia.com/web" << result;
- QTest::newRow("match-4") << allCookies << "http://qt.nokia.com/web/" << result;
+ QTest::newRow("match-5") << allCookies << "http://qt.nokia.com/web/" << result;
QTest::newRow("match-6") << allCookies << "http://qt.nokia.com/web/content" << result;
cookie.setPath("/web/wiki");
@@ -295,7 +295,7 @@ void tst_QNetworkCookieJar::cookiesForUrl_data()
QTest::newRow("one-match-2") << allCookies << "http://nokia.com/web/" << result;
QTest::newRow("one-match-3") << allCookies << "http://nokia.com/web/content" << result;
QTest::newRow("one-match-4") << allCookies << "http://qt.nokia.com/web" << result;
- QTest::newRow("one-match-4") << allCookies << "http://qt.nokia.com/web/" << result;
+ QTest::newRow("one-match-5") << allCookies << "http://qt.nokia.com/web/" << result;
QTest::newRow("one-match-6") << allCookies << "http://qt.nokia.com/web/content" << result;
result.prepend(cookie); // longer path, it must match first
@@ -317,7 +317,7 @@ void tst_QNetworkCookieJar::cookiesForUrl_data()
QTest::newRow("exp-match-2") << allCookies << "http://nokia.com/web/" << result;
QTest::newRow("exp-match-3") << allCookies << "http://nokia.com/web/content" << result;
QTest::newRow("exp-match-4") << allCookies << "http://qt.nokia.com/web" << result;
- QTest::newRow("exp-match-4") << allCookies << "http://qt.nokia.com/web/" << result;
+ QTest::newRow("exp-match-5") << allCookies << "http://qt.nokia.com/web/" << result;
QTest::newRow("exp-match-6") << allCookies << "http://qt.nokia.com/web/content" << result;
// path matching
diff --git a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index 533108e76b..8a3c52cf72 100644
--- a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -306,7 +306,7 @@ void tst_QNetworkDiskCache::data_data()
QNetworkCacheMetaData::RawHeaderList headers;
headers.append(QNetworkCacheMetaData::RawHeader("type", "bin"));
metaData.setRawHeaders(headers);
- QTest::newRow("null") << metaData;
+ QTest::newRow("non-null") << metaData;
}
// public QIODevice* data(QUrl const& url)
diff --git a/tests/auto/network/access/qnetworkreply/echo/main.cpp b/tests/auto/network/access/qnetworkreply/echo/main.cpp
index 8e6811d2ff..90217e4923 100644
--- a/tests/auto/network/access/qnetworkreply/echo/main.cpp
+++ b/tests/auto/network/access/qnetworkreply/echo/main.cpp
@@ -39,8 +39,7 @@
**
****************************************************************************/
-
-#include <QtCore>
+#include <QtCore/QFile>
int main(int argc, char **)
{
diff --git a/tests/auto/network/access/qnetworkreply/qnetworkreply.pro b/tests/auto/network/access/qnetworkreply/qnetworkreply.pro
index 0bcf067c4f..885e7f15b6 100644
--- a/tests/auto/network/access/qnetworkreply/qnetworkreply.pro
+++ b/tests/auto/network/access/qnetworkreply/qnetworkreply.pro
@@ -1,4 +1,5 @@
TEMPLATE = subdirs
-SUBDIRS = test
!wince*:SUBDIRS += echo
+test.depends += $$SUBDIRS
+SUBDIRS += test
diff --git a/tests/auto/network/access/qnetworkreply/test/test.pro b/tests/auto/network/access/qnetworkreply/test/test.pro
index 1dfd67a1c8..f267b09631 100644
--- a/tests/auto/network/access/qnetworkreply/test/test.pro
+++ b/tests/auto/network/access/qnetworkreply/test/test.pro
@@ -5,26 +5,13 @@ TARGET = ../tst_qnetworkreply
contains(QT_CONFIG,xcb): CONFIG+=insignificant_test # unstable, QTBUG-21102
-win32 {
- CONFIG(debug, debug|release) {
- TARGET = ../../debug/tst_qnetworkreply
-} else {
- TARGET = ../../release/tst_qnetworkreply
- }
-}
-
-DEFINES += SRCDIR=\\\"$$PWD/..\\\"
-
QT = core-private network-private testlib
RESOURCES += ../qnetworkreply.qrc
-wince* {
- # For cross compiled targets, reference data files need to be deployed
- addFiles.files = ../empty ../rfc3252.txt ../resource ../bigfile ../*.jpg
- addFiles.path = .
- DEPLOYMENT += addFiles
+contains(QT_CONFIG,ipv6ifname): DEFINES += HAVE_IPV6
+TESTDATA += ../empty ../rfc3252.txt ../resource ../bigfile ../*.jpg ../certs \
+ ../index.html ../smb-file.txt
- certFiles.files = ../certs
- certFiles.path = .
- DEPLOYMENT += certFiles
-}
+win32:CONFIG += insignificant_test # QTBUG-24226
+load(testcase) # for target.path and installTestHelperApp()
+installTestHelperApp("../echo/echo",echo,echo)
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 959250acb4..279570b547 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -135,6 +135,7 @@ class tst_QNetworkReply: public QObject
enum RunSimpleRequestReturn { Timeout = 0, Success, Failure };
int returnCode;
QString testFileName;
+ QString echoProcessDir;
#if !defined Q_OS_WIN
QString wronlyFileName;
#endif
@@ -162,6 +163,7 @@ public:
QString runCustomRequest(const QNetworkRequest &request, QNetworkReplyPtr &reply,
const QByteArray &verb, QIODevice *data);
+ int waitForFinish(QNetworkReplyPtr &reply);
public Q_SLOTS:
void finished();
@@ -391,8 +393,13 @@ private Q_SLOTS:
void synchronousAuthenticationCache();
void pipelining();
+ void closeDuringDownload_data();
+ void closeDuringDownload();
+
// NOTE: This test must be last!
void parentingRepliesToTheApp();
+private:
+ QString testDataDir;
};
bool tst_QNetworkReply::seedCreated = false;
@@ -446,9 +453,13 @@ QT_END_NAMESPACE
#ifndef QT_NO_OPENSSL
static void setupSslServer(QSslSocket* serverSocket)
{
+ QString testDataDir = QFileInfo(QFINDTESTDATA("rfc3252.txt")).absolutePath();
+ if (testDataDir.isEmpty())
+ testDataDir = QCoreApplication::applicationDirPath();
+
serverSocket->setProtocol(QSsl::AnyProtocol);
- serverSocket->setLocalCertificate(SRCDIR "/certs/server.pem");
- serverSocket->setPrivateKey(SRCDIR "/certs/server.key");
+ serverSocket->setLocalCertificate(testDataDir + "/certs/server.pem");
+ serverSocket->setPrivateKey(testDataDir + "/certs/server.key");
}
#endif
@@ -1231,9 +1242,18 @@ QString tst_QNetworkReply::runSimpleRequest(QNetworkAccessManager::Operation op,
connect(reply, SIGNAL(finished()), SLOT(finished()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+ int count = 0;
loop = new QEventLoop;
- QTimer::singleShot(20000, loop, SLOT(quit()));
- code = returnCode == Timeout ? loop->exec() : returnCode;
+ QSignalSpy spy(reply, SIGNAL(downloadProgress(qint64,qint64)));
+ while (!reply->isFinished()) {
+ QTimer::singleShot(20000, loop, SLOT(quit()));
+ code = loop->exec();
+ if (count == spy.count() && !reply->isFinished()) {
+ code = Timeout;
+ break;
+ }
+ count = spy.count();
+ }
delete loop;
loop = 0;
}
@@ -1273,6 +1293,31 @@ QString tst_QNetworkReply::runCustomRequest(const QNetworkRequest &request,
return QString();
}
+int tst_QNetworkReply::waitForFinish(QNetworkReplyPtr &reply)
+{
+ int code = Success;
+ int count = 0;
+
+ connect(reply, SIGNAL(finished()), SLOT(finished()));
+ connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+
+ loop = new QEventLoop;
+ QSignalSpy spy(reply, SIGNAL(downloadProgress(qint64,qint64)));
+ while (!reply->isFinished()) {
+ QTimer::singleShot(10000, loop, SLOT(quit()));
+ code = loop->exec();
+ if (count == spy.count() && !reply->isFinished()) {
+ code = Timeout;
+ break;
+ }
+ count = spy.count();
+ }
+ delete loop;
+ loop = 0;
+
+ return code;
+}
+
void tst_QNetworkReply::finished()
{
loop->exit(returnCode = Success);
@@ -1286,16 +1331,20 @@ void tst_QNetworkReply::gotError()
void tst_QNetworkReply::initTestCase()
{
+ testDataDir = QFileInfo(QFINDTESTDATA("rfc3252.txt")).absolutePath();
+ if (testDataDir.isEmpty())
+ testDataDir = QCoreApplication::applicationDirPath();
+
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
#if !defined Q_OS_WIN
- wronlyFileName = QDir::currentPath() + "/write-only";
+ wronlyFileName = testDataDir + "/write-only";
QFile wr(wronlyFileName);
QVERIFY(wr.open(QIODevice::WriteOnly | QIODevice::Truncate));
wr.setPermissions(QFile::WriteOwner | QFile::WriteUser);
wr.close();
#endif
- QDir::setSearchPaths("srcdir", QStringList() << SRCDIR);
+ QDir::setSearchPaths("testdata", QStringList() << testDataDir);
#ifndef QT_NO_OPENSSL
QSslSocket::defaultCaCertificates(); //preload certificates
#endif
@@ -1308,6 +1357,10 @@ void tst_QNetworkReply::initTestCase()
QVERIFY(networkSession->waitForOpened(30000));
}
#endif
+
+ echoProcessDir = QFINDTESTDATA("echo");
+ QVERIFY2(!echoProcessDir.isEmpty(), qPrintable(
+ QString::fromLatin1("Couldn't find echo dir starting from %1.").arg(QDir::currentPath())));
}
void tst_QNetworkReply::cleanupTestCase()
@@ -1528,10 +1581,10 @@ void tst_QNetworkReply::getFromFileSpecial_data()
QTest::addColumn<QString>("url");
QTest::newRow("resource") << ":/resource" << "qrc:/resource";
- QTest::newRow("search-path") << "srcdir:/rfc3252.txt" << "srcdir:/rfc3252.txt";
- QTest::newRow("bigfile-path") << "srcdir:/bigfile" << "srcdir:/bigfile";
+ QTest::newRow("search-path") << "testdata:/rfc3252.txt" << "testdata:/rfc3252.txt";
+ QTest::newRow("bigfile-path") << "testdata:/bigfile" << "testdata:/bigfile";
#ifdef Q_OS_WIN
- QTest::newRow("smb-path") << "srcdir:/smb-file.txt" << "file://" + QtNetworkSettings::winServerName() + "/testshare/test.pri";
+ QTest::newRow("smb-path") << "testdata:/smb-file.txt" << "file://" + QtNetworkSettings::winServerName() + "/testshare/test.pri";
#endif
}
@@ -1561,8 +1614,8 @@ void tst_QNetworkReply::getFromFtp_data()
QTest::addColumn<QString>("referenceName");
QTest::addColumn<QString>("url");
- QTest::newRow("rfc3252.txt") << SRCDIR "/rfc3252.txt" << "ftp://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt";
- QTest::newRow("bigfile") << SRCDIR "/bigfile" << "ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile";
+ QTest::newRow("rfc3252.txt") << (testDataDir + "/rfc3252.txt") << "ftp://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt";
+ QTest::newRow("bigfile") << (testDataDir + "/bigfile") << "ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile";
}
void tst_QNetworkReply::getFromFtp()
@@ -1589,9 +1642,9 @@ void tst_QNetworkReply::getFromHttp_data()
QTest::addColumn<QString>("referenceName");
QTest::addColumn<QString>("url");
- QTest::newRow("success-internal") << SRCDIR "/rfc3252.txt" << "http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt";
- QTest::newRow("success-external") << SRCDIR "/rfc3252.txt" << "http://www.ietf.org/rfc/rfc3252.txt";
- QTest::newRow("bigfile-internal") << SRCDIR "/bigfile" << "http://" + QtNetworkSettings::serverName() + "/qtest/bigfile";
+ QTest::newRow("success-internal") << (testDataDir + "/rfc3252.txt") << "http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt";
+ QTest::newRow("success-external") << (testDataDir + "/rfc3252.txt") << "http://www.ietf.org/rfc/rfc3252.txt";
+ QTest::newRow("bigfile-internal") << (testDataDir + "/bigfile") << "http://" + QtNetworkSettings::serverName() + "/qtest/bigfile";
}
void tst_QNetworkReply::getFromHttp()
@@ -1628,9 +1681,9 @@ void tst_QNetworkReply::headFromHttp_data()
QTest::addColumn<QString>("contentType");
QTest::addColumn<QNetworkProxy>("proxy");
- qint64 rfcsize = QFileInfo(SRCDIR "/rfc3252.txt").size();
- qint64 bigfilesize = QFileInfo(SRCDIR "/bigfile").size();
- qint64 indexsize = QFileInfo(SRCDIR "/index.html").size();
+ qint64 rfcsize = QFileInfo(testDataDir + "/rfc3252.txt").size();
+ qint64 bigfilesize = QFileInfo(testDataDir + "/bigfile").size();
+ qint64 indexsize = QFileInfo(testDataDir + "/index.html").size();
//testing proxies, mainly for the 407 response from http proxy
for (int i = 0; i < proxies.count(); ++i) {
@@ -1689,7 +1742,7 @@ void tst_QNetworkReply::getErrors_data()
// empties
QTest::newRow("empty-url") << QString() << int(QNetworkReply::ProtocolUnknownError) << 0 << true;
- QTest::newRow("empty-scheme-host") << SRCDIR "/rfc3252.txt" << int(QNetworkReply::ProtocolUnknownError) << 0 << true;
+ QTest::newRow("empty-scheme-host") << (testDataDir + "/rfc3252.txt") << int(QNetworkReply::ProtocolUnknownError) << 0 << true;
QTest::newRow("empty-scheme") << "//" + QtNetworkSettings::winServerName() + "/testshare/test.pri"
<< int(QNetworkReply::ProtocolUnknownError) << 0 << true;
@@ -1742,6 +1795,14 @@ void tst_QNetworkReply::getErrors()
QFETCH(QString, url);
QNetworkRequest request(url);
+#ifdef Q_OS_UNIX
+ if ((qstrcmp(QTest::currentDataTag(), "file-is-wronly") == 0) ||
+ (qstrcmp(QTest::currentDataTag(), "file-permissions") == 0)) {
+ if (::getuid() == 0)
+ QSKIP("Running this test as root doesn't make sense");
+ }
+#endif
+
QNetworkReplyPtr reply = manager.get(request);
reply->setParent(this); // we have expect-fails
@@ -1749,11 +1810,7 @@ void tst_QNetworkReply::getErrors()
QCOMPARE(reply->error(), QNetworkReply::NoError);
// now run the request:
- connect(reply, SIGNAL(finished()),
- &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- //qDebug() << reply->errorString();
+ QVERIFY(waitForFinish(reply) != Timeout);
QFETCH(int, error);
QEXPECT_FAIL("ftp-is-dir", "QFtp cannot provide enough detail", Abort);
@@ -1859,8 +1916,15 @@ void tst_QNetworkReply::putToFtp()
QNetworkReply *r = qnam.get(req);
QObject::connect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QObject::disconnect(r, SIGNAL(finished(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ int count = 0;
+ QSignalSpy spy(r, SIGNAL(downloadProgress(qint64,qint64)));
+ while (!r->isFinished()) {
+ QTestEventLoop::instance().enterLoop(10);
+ if (count == spy.count() && !r->isFinished())
+ break;
+ count = spy.count();
+ }
+ QObject::disconnect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QByteArray uploaded = r->readAll();
QCOMPARE(uploaded.size(), data.size());
@@ -2103,7 +2167,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
imagePart11.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage\""));
imagePart11.setRawHeader("Content-Location", "http://my.test.location.tld");
imagePart11.setRawHeader("Content-ID", "my@id.tld");
- QFile *file11 = new QFile(SRCDIR "/image1.jpg");
+ QFile *file11 = new QFile(testDataDir + "/image1.jpg");
file11->open(QIODevice::ReadOnly);
imagePart11.setBodyDevice(file11);
QHttpMultiPart *imageMultiPart1 = new QHttpMultiPart(QHttpMultiPart::FormDataType);
@@ -2117,7 +2181,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
imagePart21.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage1\""));
imagePart21.setRawHeader("Content-Location", "http://my.test.location.tld");
imagePart21.setRawHeader("Content-ID", "my@id.tld");
- QFile *file21 = new QFile(SRCDIR "/image1.jpg");
+ QFile *file21 = new QFile(testDataDir + "/image1.jpg");
file21->open(QIODevice::ReadOnly);
imagePart21.setBodyDevice(file21);
QHttpMultiPart *imageMultiPart2 = new QHttpMultiPart();
@@ -2128,7 +2192,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
QHttpPart imagePart22;
imagePart22.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart22.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage2\""));
- QFile *file22 = new QFile(SRCDIR "/image2.jpg");
+ QFile *file22 = new QFile(testDataDir + "/image2.jpg");
file22->open(QIODevice::ReadOnly);
imagePart22.setBodyDevice(file22);
imageMultiPart2->append(imagePart22);
@@ -2144,7 +2208,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
imagePart31.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage1\""));
imagePart31.setRawHeader("Content-Location", "http://my.test.location.tld");
imagePart31.setRawHeader("Content-ID", "my@id.tld");
- QFile *file31 = new QFile(SRCDIR "/image1.jpg");
+ QFile *file31 = new QFile(testDataDir + "/image1.jpg");
file31->open(QIODevice::ReadOnly);
imagePart31.setBodyDevice(file31);
QHttpMultiPart *imageMultiPart3 = new QHttpMultiPart(QHttpMultiPart::FormDataType);
@@ -2153,7 +2217,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
QHttpPart imagePart32;
imagePart32.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart32.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage2\""));
- QFile *file32 = new QFile(SRCDIR "/image2.jpg");
+ QFile *file32 = new QFile(testDataDir + "/image2.jpg");
file32->open(QIODevice::ReadOnly);
imagePart32.setBodyDevice(file31); // check that resetting works
imagePart32.setBodyDevice(file32);
@@ -2162,7 +2226,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
QHttpPart imagePart33;
imagePart33.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart33.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage3\""));
- QFile *file33 = new QFile(SRCDIR "/image3.jpg");
+ QFile *file33 = new QFile(testDataDir + "/image3.jpg");
file33->open(QIODevice::ReadOnly);
imagePart33.setBodyDevice(file33);
imageMultiPart3->append(imagePart33);
@@ -2177,7 +2241,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
// QHttpPart imagePart41;
// imagePart41.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
-// QFile *file41 = new QFile(SRCDIR "/image1.jpg");
+// QFile *file41 = new QFile(testDataDir + "/image1.jpg");
// file41->open(QIODevice::ReadOnly);
// imagePart41.setBodyDevice(file41);
//
@@ -2211,7 +2275,7 @@ void tst_QNetworkReply::postToHttpMultipart_data()
QHttpPart imagePart51;
imagePart51.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart51.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage\""));
- QFile *file51 = new QFile(SRCDIR "/image1.jpg");
+ QFile *file51 = new QFile(testDataDir + "/image1.jpg");
file51->open(QIODevice::ReadOnly);
QByteArray imageData = file51->readAll();
file51->close();
@@ -2418,6 +2482,10 @@ void tst_QNetworkReply::connectToIPv6Address()
QFETCH(QByteArray, dataToSend);
QFETCH(QByteArray, hostfield);
+#if !defined(HAVE_IPV6) && defined(Q_OS_UNIX)
+ QSKIP("system doesn't support ipv6!");
+#endif
+
QByteArray httpResponse = QByteArray("HTTP/1.0 200 OK\r\nContent-Length: ");
httpResponse += QByteArray::number(dataToSend.size());
httpResponse += "\r\n\r\n";
@@ -2430,9 +2498,7 @@ void tst_QNetworkReply::connectToIPv6Address()
QNetworkRequest request(url);
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QByteArray content = reply->readAll();
//qDebug() << server.receivedData;
QByteArray hostinfo = "\r\nHost: " + hostfield + ":" + QByteArray::number(server.serverPort()) + "\r\n";
@@ -2599,7 +2665,7 @@ void tst_QNetworkReply::ioGetFromFtp_data()
QTest::newRow("bigfile") << "bigfile" << Q_INT64_C(519240);
- QFile file(SRCDIR "/rfc3252.txt");
+ QFile file(testDataDir + "/rfc3252.txt");
QTest::newRow("rfc3252.txt") << "rfc3252.txt" << file.size();
}
@@ -2613,9 +2679,7 @@ void tst_QNetworkReply::ioGetFromFtp()
QNetworkReplyPtr reply = manager.get(request);
DataReader reader(reply);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -2630,7 +2694,7 @@ void tst_QNetworkReply::ioGetFromFtp()
void tst_QNetworkReply::ioGetFromFtpWithReuse()
{
- QString fileName = SRCDIR "/rfc3252.txt";
+ QString fileName = testDataDir + "/rfc3252.txt";
QFile reference(fileName);
reference.open(QIODevice::ReadOnly);
@@ -2643,14 +2707,8 @@ void tst_QNetworkReply::ioGetFromFtpWithReuse()
DataReader reader2(reply2);
QSignalSpy spy(reply1, SIGNAL(finished()));
- connect(reply2, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- if (spy.count() == 0) {
- connect(reply1, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- }
+ QVERIFY(waitForFinish(reply1) == Success);
+ QVERIFY(waitForFinish(reply2) == Success);
QCOMPARE(reply1->url(), request.url());
QCOMPARE(reply2->url(), request.url());
@@ -2669,16 +2727,14 @@ void tst_QNetworkReply::ioGetFromFtpWithReuse()
void tst_QNetworkReply::ioGetFromHttp()
{
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
QNetworkReplyPtr reply = manager.get(request);
DataReader reader(reply);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -2692,7 +2748,7 @@ void tst_QNetworkReply::ioGetFromHttp()
void tst_QNetworkReply::ioGetFromHttpWithReuseParallel()
{
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
@@ -2702,14 +2758,8 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseParallel()
DataReader reader2(reply2);
QSignalSpy spy(reply1, SIGNAL(finished()));
- connect(reply2, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- if (spy.count() == 0) {
- connect(reply1, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- }
+ QVERIFY(waitForFinish(reply2) == Success);
+ QVERIFY(waitForFinish(reply1) == Success);
QCOMPARE(reply1->url(), request.url());
QCOMPARE(reply2->url(), request.url());
@@ -2730,7 +2780,7 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseParallel()
void tst_QNetworkReply::ioGetFromHttpWithReuseSequential()
{
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
@@ -2738,9 +2788,7 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseSequential()
QNetworkReplyPtr reply = manager.get(request);
DataReader reader(reply);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -2758,9 +2806,7 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseSequential()
QNetworkReplyPtr reply = manager.get(request);
DataReader reader(reply);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -2777,12 +2823,21 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth_data()
{
QTest::addColumn<QUrl>("url");
QTest::addColumn<QByteArray>("expectedData");
+ QTest::addColumn<int>("expectedAuth");
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
reference.open(QIODevice::ReadOnly);
QByteArray referenceData = reference.readAll();
- QTest::newRow("basic") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData;
- QTest::newRow("digest") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n");
+ QTest::newRow("basic") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData << 1;
+ QTest::newRow("digest") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n") << 1;
+ //if url contains username & password, then it should be used
+ QTest::newRow("basic-in-url") << QUrl("http://httptest:httptest@" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData << 0;
+ QTest::newRow("digest-in-url") << QUrl("http://httptest:httptest@" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n") << 0;
+ // if url contains incorrect credentials, expect QNAM to ask for good ones (even if cached - matches behaviour of browsers)
+ QTest::newRow("basic-bad-user-in-url") << QUrl("http://baduser:httptest@" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData << 3;
+ QTest::newRow("basic-bad-password-in-url") << QUrl("http://httptest:wrong@" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData << 3;
+ QTest::newRow("digest-bad-user-in-url") << QUrl("http://baduser:httptest@" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n") << 3;
+ QTest::newRow("digest-bad-password-in-url") << QUrl("http://httptest:wrong@" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n") << 3;
}
void tst_QNetworkReply::ioGetFromHttpWithAuth()
@@ -2793,6 +2848,7 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
QFETCH(QUrl, url);
QFETCH(QByteArray, expectedData);
+ QFETCH(int, expectedAuth);
QNetworkRequest request(url);
{
QNetworkReplyPtr reply1 = manager.get(request);
@@ -2805,14 +2861,9 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- connect(reply2, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- if (finishedspy.count() == 0) {
- connect(reply1, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- }
+ QVERIFY(waitForFinish(reply2) == Success);
+ QVERIFY(waitForFinish(reply1) == Success);
+
manager.disconnect(SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
@@ -2821,7 +2872,8 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
QCOMPARE(reader1.data, expectedData);
QCOMPARE(reader2.data, expectedData);
- QCOMPARE(authspy.count(), 1);
+ QCOMPARE(authspy.count(), (expectedAuth ? 1 : 0));
+ expectedAuth = qMax(0, expectedAuth - 1);
}
// rinse and repeat:
@@ -2832,16 +2884,17 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
QSignalSpy authspy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
+
manager.disconnect(SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
QCOMPARE(reader.data, expectedData);
- QCOMPARE(authspy.count(), 0);
+ QCOMPARE(authspy.count(), (expectedAuth ? 1 : 0));
+ expectedAuth = qMax(0, expectedAuth - 1);
}
// now check with synchronous calls:
@@ -2853,14 +2906,45 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
QSignalSpy authspy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
QNetworkReplyPtr replySync = manager.get(request);
QVERIFY(replySync->isFinished()); // synchronous
- QCOMPARE(authspy.count(), 0);
+ if (expectedAuth) {
+ // bad credentials in a synchronous request should just fail
+ QCOMPARE(replySync->error(), QNetworkReply::AuthenticationRequiredError);
+ } else {
+ QCOMPARE(authspy.count(), 0);
- // we cannot use a data reader here, since that connects to the readyRead signal,
- // just use readAll()
+ // we cannot use a data reader here, since that connects to the readyRead signal,
+ // just use readAll()
- // the only thing we check here is that the auth cache was used when using synchronous requests
- QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
- QCOMPARE(replySync->readAll(), expectedData);
+ // the only thing we check here is that the auth cache was used when using synchronous requests
+ QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ QCOMPARE(replySync->readAll(), expectedData);
+ }
+ }
+
+ // check that credentials are used from cache if the same url is requested without credentials
+ {
+ url.setUserInfo(QString());
+ request.setUrl(url);
+ request.setAttribute(
+ QNetworkRequest::SynchronousRequestAttribute,
+ true);
+
+ QSignalSpy authspy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
+ QNetworkReplyPtr replySync = manager.get(request);
+ QVERIFY(replySync->isFinished()); // synchronous
+ if (expectedAuth) {
+ // bad credentials in a synchronous request should just fail
+ QCOMPARE(replySync->error(), QNetworkReply::AuthenticationRequiredError);
+ } else {
+ QCOMPARE(authspy.count(), 0);
+
+ // we cannot use a data reader here, since that connects to the readyRead signal,
+ // just use readAll()
+
+ // the only thing we check here is that the auth cache was used when using synchronous requests
+ QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ QCOMPARE(replySync->readAll(), expectedData);
+ }
}
}
@@ -2890,7 +2974,7 @@ void tst_QNetworkReply::ioGetFromHttpWithProxyAuth()
// This test sends three requests
// The first two in parallel
// The third after the first two finished
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkProxy proxy(QNetworkProxy::HttpCachingProxy, QtNetworkSettings::serverName(), 3129);
@@ -2909,14 +2993,9 @@ void tst_QNetworkReply::ioGetFromHttpWithProxyAuth()
connect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
- connect(reply2, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- if (finishedspy.count() == 0) {
- connect(reply1, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
- }
+ QVERIFY(waitForFinish(reply2) == Success);
+ QVERIFY(waitForFinish(reply1) == Success);
+
manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
@@ -2940,9 +3019,9 @@ void tst_QNetworkReply::ioGetFromHttpWithProxyAuth()
QSignalSpy authspy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
connect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
+
manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
@@ -3002,7 +3081,7 @@ void tst_QNetworkReply::ioGetFromHttpWithSocksProxy()
qRegisterMetaType<QNetworkProxy>(); // for QSignalSpy
qRegisterMetaType<QAuthenticator *>();
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080);
@@ -3016,9 +3095,9 @@ void tst_QNetworkReply::ioGetFromHttpWithSocksProxy()
QSignalSpy authspy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
connect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
+
manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
@@ -3039,9 +3118,9 @@ void tst_QNetworkReply::ioGetFromHttpWithSocksProxy()
QSignalSpy authspy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
connect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Failure);
+
manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
@@ -3062,7 +3141,7 @@ void tst_QNetworkReply::ioGetFromHttpsWithSslErrors()
qRegisterMetaType<QNetworkReply*>(); // for QSignalSpy
qRegisterMetaType<QList<QSslError> >();
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkRequest request(QUrl("https://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
@@ -3074,9 +3153,8 @@ void tst_QNetworkReply::ioGetFromHttpsWithSslErrors()
SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
connect(reply, SIGNAL(metaDataChanged()), SLOT(storeSslConfiguration()));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
+
manager.disconnect(SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
this, SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
@@ -3097,7 +3175,7 @@ void tst_QNetworkReply::ioGetFromHttpsWithIgnoreSslErrors()
qRegisterMetaType<QNetworkReply*>(); // for QSignalSpy
qRegisterMetaType<QList<QSslError> >();
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkRequest request(QUrl("https://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
@@ -3108,9 +3186,8 @@ void tst_QNetworkReply::ioGetFromHttpsWithIgnoreSslErrors()
QSignalSpy sslspy(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)));
connect(reply, SIGNAL(metaDataChanged()), SLOT(storeSslConfiguration()));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
QCOMPARE(reader.data, reference.readAll());
@@ -3126,7 +3203,7 @@ void tst_QNetworkReply::ioGetFromHttpsWithSslHandshakeError()
qRegisterMetaType<QNetworkReply*>(); // for QSignalSpy
qRegisterMetaType<QList<QSslError> >();
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QNetworkRequest request(QUrl("https://" + QtNetworkSettings::serverName() + ":80"));
@@ -3137,9 +3214,8 @@ void tst_QNetworkReply::ioGetFromHttpsWithSslHandshakeError()
QSignalSpy sslspy(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)));
connect(reply, SIGNAL(metaDataChanged()), SLOT(storeSslConfiguration()));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Failure);
QCOMPARE(reply->error(), QNetworkReply::SslHandshakeFailedError);
QCOMPARE(sslspy.count(), 0);
@@ -3197,10 +3273,7 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer()
QNetworkReplyPtr reply = manager.get(request);
QSignalSpy spy(reply, SIGNAL(error(QNetworkReply::NetworkError)));
-
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Failure);
QCOMPARE(reply->url(), request.url());
QCOMPARE(spy.count(), 1);
@@ -3230,9 +3303,7 @@ void tst_QNetworkReply::ioGetFromHttpStatus100()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3255,9 +3326,7 @@ void tst_QNetworkReply::ioGetFromHttpNoHeaders()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3426,9 +3495,7 @@ void tst_QNetworkReply::ioGetFromHttpWithCache()
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) != Timeout);
QTEST(reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(), "loadedFromCache");
QTEST(server.totalConnections > 0, "networkUsed");
@@ -3641,7 +3708,7 @@ void tst_QNetworkReply::ioGetWithManyProxies()
qRegisterMetaType<QNetworkProxy>(); // for QSignalSpy
qRegisterMetaType<QAuthenticator *>();
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
// set the proxy factory:
@@ -3659,13 +3726,12 @@ void tst_QNetworkReply::ioGetWithManyProxies()
QSignalSpy authspy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
connect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
#ifndef QT_NO_OPENSSL
connect(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
#endif
- QTestEventLoop::instance().enterLoop(15);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) != Timeout);
manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
@@ -3706,10 +3772,10 @@ void tst_QNetworkReply::ioPutToFileFromFile_data()
{
QTest::addColumn<QString>("fileName");
- QTest::newRow("empty") << SRCDIR "/empty";
- QTest::newRow("real-file") << SRCDIR "/rfc3252.txt";
+ QTest::newRow("empty") << (testDataDir + "/empty");
+ QTest::newRow("real-file") << (testDataDir + "/rfc3252.txt");
QTest::newRow("resource") << ":/resource";
- QTest::newRow("search-path") << "srcdir:/rfc3252.txt";
+ QTest::newRow("search-path") << "testdata:/rfc3252.txt";
}
void tst_QNetworkReply::ioPutToFileFromFile()
@@ -3724,9 +3790,7 @@ void tst_QNetworkReply::ioPutToFileFromFile()
QNetworkRequest request(url);
QNetworkReplyPtr reply = manager.put(request, &sourceFile);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3762,10 +3826,8 @@ void tst_QNetworkReply::ioPutToFileFromSocket()
QNetworkReplyPtr reply = manager.put(QNetworkRequest(url), socketpair.endPoints[1]);
socketpair.endPoints[0]->close();
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->error(), QNetworkReply::NoError);
- QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3808,10 +3870,8 @@ void tst_QNetworkReply::ioPutToFileFromLocalSocket()
QNetworkReplyPtr reply = manager.put(QNetworkRequest(url), passive);
passive->setParent(reply);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->error(), QNetworkReply::NoError);
- QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3849,15 +3909,16 @@ void tst_QNetworkReply::ioPutToFileFromProcess()
QFETCH(QByteArray, data);
QProcess process;
- process.start("echo/echo all");
+ QString echoExe = echoProcessDir + "/echo";
+ process.start(echoExe, QStringList("all"));
+ QVERIFY2(process.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(echoExe, process.errorString())));
process.write(data);
process.closeWriteChannel();
QNetworkReplyPtr reply = manager.put(QNetworkRequest(url), &process);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3891,9 +3952,7 @@ void tst_QNetworkReply::ioPutToFtpFromFile()
QNetworkRequest request(url);
QNetworkReplyPtr reply = manager.put(request, &sourceFile);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3911,7 +3970,7 @@ void tst_QNetworkReply::ioPutToFtpFromFile()
QObject::connect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(3);
- QObject::disconnect(r, SIGNAL(finished(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ QObject::disconnect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QByteArray uploaded = r->readAll();
QCOMPARE(qint64(uploaded.size()), sourceFile.size());
@@ -3942,9 +4001,7 @@ void tst_QNetworkReply::ioPutToHttpFromFile()
QNetworkRequest request(url);
QNetworkReplyPtr reply = manager.put(request, &sourceFile);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3958,9 +4015,8 @@ void tst_QNetworkReply::ioPutToHttpFromFile()
// download the file again from HTTP to make sure it was uploaded
// correctly
reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -3986,9 +4042,7 @@ void tst_QNetworkReply::ioPostToHttpFromFile()
QNetworkReplyPtr reply = manager.post(request, &sourceFile);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -4066,7 +4120,6 @@ void tst_QNetworkReply::ioPostToHttpFromSocket()
QNetworkReplyPtr reply = manager.post(request, socketpair.endPoints[1]);
socketpair.endPoints[0]->close();
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
connect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
@@ -4075,13 +4128,13 @@ void tst_QNetworkReply::ioPostToHttpFromSocket()
QSignalSpy authenticationRequiredSpy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
QSignalSpy proxyAuthenticationRequiredSpy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
- QTestEventLoop::instance().enterLoop(12);
+ QVERIFY(waitForFinish(reply) == Success);
+
disconnect(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
disconnect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
QCOMPARE(reply->error(), QNetworkReply::NoError);
- QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(reply->url(), url);
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -4159,7 +4212,7 @@ void tst_QNetworkReply::ioPostToHttpFromSocketSynchronous()
// worked.
void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileToEnd()
{
- QFile sourceFile(SRCDIR "/rfc3252.txt");
+ QFile sourceFile(testDataDir + "/rfc3252.txt");
QVERIFY(sourceFile.open(QIODevice::ReadOnly));
// seeking to the middle
sourceFile.seek(sourceFile.size() / 2);
@@ -4169,14 +4222,13 @@ void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileToEnd()
request.setRawHeader("Content-Type", "application/octet-stream");
QNetworkReplyPtr reply = manager.post(request, &sourceFile);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(waitForFinish(reply) == Success);
+
disconnect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QVERIFY(!QTestEventLoop::instance().timeout());
// compare half data
sourceFile.seek(sourceFile.size() / 2);
@@ -4186,7 +4238,7 @@ void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileToEnd()
void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileFiveBytes()
{
- QFile sourceFile(SRCDIR "/rfc3252.txt");
+ QFile sourceFile(testDataDir + "/rfc3252.txt");
QVERIFY(sourceFile.open(QIODevice::ReadOnly));
// seeking to the middle
sourceFile.seek(sourceFile.size() / 2);
@@ -4199,14 +4251,13 @@ void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileFiveBytes()
QVERIFY(request.header(QNetworkRequest::ContentLengthHeader).isValid());
QNetworkReplyPtr reply = manager.post(request, &sourceFile);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(waitForFinish(reply) == Success);
+
disconnect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QVERIFY(!QTestEventLoop::instance().timeout());
// compare half data
sourceFile.seek(sourceFile.size() / 2);
@@ -4228,14 +4279,13 @@ void tst_QNetworkReply::ioPostToHttpFromMiddleOfQBufferFiveBytes()
request.setRawHeader("Content-Type", "application/octet-stream");
QNetworkReplyPtr reply = manager.post(request, &uploadBuffer);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(waitForFinish(reply) == Success);
+
disconnect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QVERIFY(!QTestEventLoop::instance().timeout());
// compare half data
uploadBuffer.seek(5);
@@ -4262,11 +4312,11 @@ void tst_QNetworkReply::ioPostToHttpNoBufferFlag()
QNetworkReplyPtr reply = manager.post(request, socketpair.endPoints[1]);
socketpair.endPoints[0]->close();
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
- QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(waitForFinish(reply) == Failure);
+
disconnect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
@@ -4284,12 +4334,16 @@ public:
serverSocket->setParent(this);
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
+ QString testDataDir = QFileInfo(QFINDTESTDATA("rfc3252.txt")).absolutePath();
+ if (testDataDir.isEmpty())
+ testDataDir = QCoreApplication::applicationDirPath();
+
connect(serverSocket, SIGNAL(encrypted()), this, SLOT(encryptedSlot()));
connect(serverSocket, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
serverSocket->setProtocol(QSsl::AnyProtocol);
connect(serverSocket, SIGNAL(sslErrors(const QList<QSslError>&)), serverSocket, SLOT(ignoreSslErrors()));
- serverSocket->setLocalCertificate(SRCDIR "/certs/server.pem");
- serverSocket->setPrivateKey(SRCDIR "/certs/server.key");
+ serverSocket->setLocalCertificate(testDataDir + "/certs/server.pem");
+ serverSocket->setPrivateKey(testDataDir + "/certs/server.key");
serverSocket->startServerEncryption();
} else {
delete serverSocket;
@@ -4314,7 +4368,7 @@ public:
// very similar to ioPostToHttpUploadProgress but for SSL
void tst_QNetworkReply::ioPostToHttpsUploadProgress()
{
- //QFile sourceFile(SRCDIR "/bigfile");
+ //QFile sourceFile(testDataDir + "/bigfile");
//QVERIFY(sourceFile.open(QIODevice::ReadOnly));
qint64 wantedSize = 2*1024*1024; // 2 MB
QByteArray sourceFile;
@@ -4366,13 +4420,11 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
QCOMPARE(args3.at(0).toLongLong(), qint64(sourceFile.size()));
// after sending this, the QNAM should emit finished()
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
incomingSocket->write("HTTP/1.0 200 OK\r\n");
incomingSocket->write("Content-Length: 0\r\n");
incomingSocket->write("\r\n");
- QTestEventLoop::instance().enterLoop(10);
- // not timeouted -> finished() was emitted
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
incomingSocket->close();
server.close();
@@ -4429,10 +4481,11 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
const int rate = 200; // in kB per sec
RateControlledReader reader(server, reply, rate, bufferSize);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTime loopTime;
loopTime.start();
- QTestEventLoop::instance().enterLoop(30);
+
+ QVERIFY(waitForFinish(reply) == Success);
+
const int elapsedTime = loopTime.elapsed();
server.wait();
reader.wrapUp();
@@ -4441,8 +4494,6 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
qDebug() << "receive rate:" << reader.totalBytesRead * 1000 / elapsedTime
<< "(it received" << reader.totalBytesRead << "bytes in" << elapsedTime << "ms)";
- QVERIFY(!QTestEventLoop::instance().timeout());
-
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
@@ -4472,7 +4523,7 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
void tst_QNetworkReply::ioPostToHttpUploadProgress()
{
- QFile sourceFile(SRCDIR "/bigfile");
+ QFile sourceFile(testDataDir + "/bigfile");
QVERIFY(sourceFile.open(QIODevice::ReadOnly));
// emulate a minimal http server
@@ -4577,16 +4628,15 @@ void tst_QNetworkReply::ioPostToHttpEmptyUploadProgress()
void tst_QNetworkReply::lastModifiedHeaderForFile()
{
- QFileInfo fileInfo(SRCDIR "/bigfile");
+ QFileInfo fileInfo(testDataDir + "/bigfile");
QVERIFY(fileInfo.exists());
QUrl url = QUrl::fromLocalFile(fileInfo.filePath());
QNetworkRequest request(url);
QNetworkReplyPtr reply = manager.head(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
QDateTime header = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();
QCOMPARE(header, fileInfo.lastModified());
@@ -4599,9 +4649,8 @@ void tst_QNetworkReply::lastModifiedHeaderForHttp()
QNetworkRequest request(url);
QNetworkReplyPtr reply = manager.head(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply) == Success);
QDateTime header = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();
QDateTime realDate = QDateTime::fromString("2007-05-22T12:04:57", Qt::ISODate);
@@ -4615,9 +4664,8 @@ void tst_QNetworkReply::httpCanReadLine()
QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
+
QCOMPARE(reply->error(), QNetworkReply::NoError);
QVERIFY(reply->canReadLine());
@@ -4645,13 +4693,16 @@ void tst_QNetworkReply::rateControl()
// faster than the data is being consumed.
QFETCH(int, rate);
+#if !defined(QT_BUILD_INTERNAL)
+ QSKIP("backend for testing not available!");
+#endif
+
// ask for 20 seconds worth of data
FastSender sender(20 * rate * 1024);
QNetworkRequest request("debugpipe://localhost:" + QString::number(sender.serverPort()));
QNetworkReplyPtr reply = manager.get(request);
reply->setReadBufferSize(32768);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");
QSignalSpy errorSpy(reply, SIGNAL(error(QNetworkReply::NetworkError)));
@@ -4660,7 +4711,9 @@ void tst_QNetworkReply::rateControl()
// this test is designed to run for 25 seconds at most
QTime loopTime;
loopTime.start();
- QTestEventLoop::instance().enterLoop(40);
+
+ QVERIFY(waitForFinish(reply) == Success);
+
int elapsedTime = loopTime.elapsed();
if (!errorSpy.isEmpty()) {
@@ -4672,7 +4725,6 @@ void tst_QNetworkReply::rateControl()
<< "(it received" << reader.totalBytesRead << "bytes in" << elapsedTime << "ms)";
sender.wait();
- QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(reply->url(), request.url());
QCOMPARE(reply->error(), QNetworkReply::NoError);
@@ -4695,6 +4747,9 @@ void tst_QNetworkReply::downloadProgress_data()
void tst_QNetworkReply::downloadProgress()
{
+#if !defined(QT_BUILD_INTERNAL)
+ QSKIP("backend for testing not available!");
+#endif
QTcpServer server;
QVERIFY(server.listen());
@@ -4758,6 +4813,9 @@ void tst_QNetworkReply::uploadProgress_data()
void tst_QNetworkReply::uploadProgress()
{
QFETCH(QByteArray, data);
+#if !defined(QT_BUILD_INTERNAL)
+ QSKIP("backend for testing not available!");
+#endif
QTcpServer server;
QVERIFY(server.listen());
@@ -4776,9 +4834,7 @@ void tst_QNetworkReply::uploadProgress()
QTcpSocket *receiver = server.nextPendingConnection();
if (finished.count() == 0) {
// it's not finished yet, so wait for it to be
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(2);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
}
delete receiver;
@@ -4814,9 +4870,7 @@ void tst_QNetworkReply::chaining()
request.setUrl(url);
QNetworkReplyPtr putReply = manager.put(request, getReply);
- connect(putReply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(putReply) == Success);
QCOMPARE(getReply->url(), QUrl::fromLocalFile(sourceFile.fileName()));
QCOMPARE(getReply->error(), QNetworkReply::NoError);
@@ -5097,11 +5151,7 @@ void tst_QNetworkReply::httpProxyCommands()
//manager.setProxy(QNetworkProxy());
// wait for the finished signal
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
-
- QTestEventLoop::instance().enterLoop(15);
-
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) != Timeout);
//qDebug() << reply->error() << reply->errorString();
//qDebug() << proxyServer.receivedData;
@@ -5234,9 +5284,8 @@ void tst_QNetworkReply::proxyChange()
manager.setProxy(dummyProxy);
QNetworkReplyPtr reply3 = manager.get(req);
- connect(reply3, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(5);
- QVERIFY(!QTestEventLoop::instance().timeout());
+
+ QVERIFY(waitForFinish(reply3) == Failure);
QVERIFY(int(reply3->error()) > 0);
}
@@ -5272,10 +5321,7 @@ void tst_QNetworkReply::authorizationError()
QSignalSpy errorSpy(reply, SIGNAL(error(QNetworkReply::NetworkError)));
QSignalSpy finishedSpy(reply, SIGNAL(finished()));
// now run the request:
- connect(reply, SIGNAL(finished()),
- &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Failure);
QFETCH(int, errorSignalCount);
QCOMPARE(errorSpy.count(), errorSignalCount);
@@ -5501,8 +5547,7 @@ void tst_QNetworkReply::ignoreSslErrorsList_data()
QTest::addColumn<QNetworkReply::NetworkError>("expectedNetworkError");
QList<QSslError> expectedSslErrors;
- // apparently, because of some weird behaviour of SRCDIR, the file name below needs to start with a slash
- QList<QSslCertificate> certs = QSslCertificate::fromPath(QLatin1String(SRCDIR "/certs/qt-test-server-cacert.pem"));
+ QList<QSslCertificate> certs = QSslCertificate::fromPath(testDataDir + "/certs/qt-test-server-cacert.pem");
QSslError rightError(QSslError::SelfSignedCertificate, certs.at(0));
QSslError wrongError(QSslError::SelfSignedCertificate);
@@ -5526,9 +5571,7 @@ void tst_QNetworkReply::ignoreSslErrorsList()
QFETCH(QList<QSslError>, expectedSslErrors);
reply->ignoreSslErrors(expectedSslErrors);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) != Timeout);
QFETCH(QNetworkReply::NetworkError, expectedNetworkError);
QCOMPARE(reply->error(), expectedNetworkError);
@@ -5559,9 +5602,7 @@ void tst_QNetworkReply::ignoreSslErrorsListWithSlot()
this, SLOT(ignoreSslErrorListSlot(QNetworkReply *, const QList<QSslError> &)));
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) != Timeout);
QFETCH(QNetworkReply::NetworkError, expectedNetworkError);
QCOMPARE(reply->error(), expectedNetworkError);
@@ -5575,7 +5616,7 @@ void tst_QNetworkReply::sslConfiguration_data()
QTest::newRow("empty") << QSslConfiguration() << false;
QSslConfiguration conf = QSslConfiguration::defaultConfiguration();
QTest::newRow("default") << conf << false; // does not contain test server cert
- QList<QSslCertificate> testServerCert = QSslCertificate::fromPath(SRCDIR "/certs/qt-test-server-cacert.pem");
+ QList<QSslCertificate> testServerCert = QSslCertificate::fromPath(testDataDir + "/certs/qt-test-server-cacert.pem");
conf.setCaCertificates(testServerCert);
QTest::newRow("set-root-cert") << conf << true;
conf.setProtocol(QSsl::SecureProtocols);
@@ -5589,9 +5630,7 @@ void tst_QNetworkReply::sslConfiguration()
request.setSslConfiguration(configuration);
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) != Timeout);
QFETCH(bool, works);
QNetworkReply::NetworkError expectedError = works ? QNetworkReply::NoError : QNetworkReply::SslHandshakeFailedError;
@@ -5675,12 +5714,11 @@ void tst_QNetworkReply::getFromHttpIntoBuffer()
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(request);
connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
-
QTestEventLoop::instance().enterLoop(10);
QVERIFY(!QTestEventLoop::instance().timeout());
QVERIFY(reply->isFinished());
- QFile reference(SRCDIR "/rfc3252.txt");
+ QFile reference(testDataDir + "/rfc3252.txt");
QVERIFY(reference.open(QIODevice::ReadOnly));
QCOMPARE(reference.bytesAvailable(), reply->bytesAvailable());
@@ -5850,7 +5888,7 @@ void tst_QNetworkReply::getFromHttpIntoBuffer2()
QFETCH(bool, useDownloadBuffer);
// On my Linux Desktop the results are already visible with 128 kB, however we use this to have good results.
-#if defined(Q_WS_WINCE_WM)
+#if defined(Q_OS_WINCE_WM)
// Show some mercy to non-desktop platform/s
enum {UploadSize = 4*1024*1024}; // 4 MB
#else
@@ -5886,9 +5924,7 @@ void tst_QNetworkReply::getFromHttpIntoBufferCanReadLine()
request.setAttribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute, 1024*1024*128); // 128 MB is max allowed
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->error(), QNetworkReply::NoError);
QVERIFY(reply->canReadLine());
@@ -5912,9 +5948,7 @@ void tst_QNetworkReply::ioGetFromHttpWithoutContentLength()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->url(), request.url());
QVERIFY(reply->isFinished());
@@ -5962,9 +5996,7 @@ void tst_QNetworkReply::qtbug12908compressedHttpReply()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QCOMPARE(reply->error(), QNetworkReply::NoError);
QCOMPARE(reply->size(), qint64(16384));
@@ -5987,9 +6019,7 @@ void tst_QNetworkReply::compressedHttpReplyBrokenGzip()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Failure);
QCOMPARE(reply->error(), QNetworkReply::ProtocolFailure);
}
@@ -6002,9 +6032,7 @@ void tst_QNetworkReply::getFromUnreachableIp()
QNetworkRequest request(QUrl("http://255.255.255.255/42/23/narf/narf/narf"));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Failure);
QVERIFY(reply->error() != QNetworkReply::NoError);
}
@@ -6337,9 +6365,8 @@ void tst_QNetworkReply::qtbug15311doubleContentLength()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
+
QVERIFY(reply->isFinished());
QCOMPARE(reply->error(), QNetworkReply::NoError);
QCOMPARE(reply->size(), qint64(3));
@@ -6357,9 +6384,8 @@ void tst_QNetworkReply::qtbug18232gzipContentLengthZero()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
+
QVERIFY(reply->isFinished());
QCOMPARE(reply->error(), QNetworkReply::NoError);
QCOMPARE(reply->size(), qint64(0));
@@ -6379,9 +6405,8 @@ void tst_QNetworkReply::qtbug22660gzipNoContentLengthEmptyContent()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
+
QVERIFY(reply->isFinished());
QCOMPARE(reply->error(), QNetworkReply::NoError);
QCOMPARE(reply->size(), qint64(0));
@@ -6400,13 +6425,13 @@ void tst_QNetworkReply::synchronousRequest_data()
QTest::newRow("http")
<< QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt")
- << QString("file:" SRCDIR "/rfc3252.txt")
+ << QString("file:" + testDataDir + "/rfc3252.txt")
<< true
<< QString("text/plain");
QTest::newRow("http-gzip")
<< QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/deflate/rfc3252.txt")
- << QString("file:" SRCDIR "/rfc3252.txt")
+ << QString("file:" + testDataDir + "/rfc3252.txt")
<< false // don't check content length, because it's gzip encoded
// ### we would need to enflate (un-deflate) the file content and compare the sizes
<< QString("text/plain");
@@ -6414,7 +6439,7 @@ void tst_QNetworkReply::synchronousRequest_data()
#ifndef QT_NO_OPENSSL
QTest::newRow("https")
<< QUrl("https://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt")
- << QString("file:" SRCDIR "/rfc3252.txt")
+ << QString("file:" + testDataDir + "/rfc3252.txt")
<< true
<< QString("text/plain");
#endif
@@ -6426,8 +6451,8 @@ void tst_QNetworkReply::synchronousRequest_data()
<< QString("text/plain");
QTest::newRow("simple-file")
- << QUrl::fromLocalFile(SRCDIR "/rfc3252.txt")
- << QString("file:" SRCDIR "/rfc3252.txt")
+ << QUrl::fromLocalFile(testDataDir + "/rfc3252.txt")
+ << QString("file:" + testDataDir + "/rfc3252.txt")
<< true
<< QString();
}
@@ -6449,7 +6474,7 @@ void tst_QNetworkReply::synchronousRequest()
// QNetworkRequest, see http://bugreports.qt.nokia.com/browse/QTBUG-14774
if (url.scheme() == "https") {
QSslConfiguration sslConf;
- QList<QSslCertificate> certs = QSslCertificate::fromPath(SRCDIR "/certs/qt-test-server-cacert.pem");
+ QList<QSslCertificate> certs = QSslCertificate::fromPath(testDataDir + "/certs/qt-test-server-cacert.pem");
sslConf.setCaCertificates(certs);
request.setSslConfiguration(sslConf);
}
@@ -6559,8 +6584,9 @@ void tst_QNetworkReply::httpAbort()
// Abort after the finished()
QNetworkRequest request3("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
QNetworkReplyPtr reply3 = manager.get(request3);
- connect(reply3, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
+
+ QVERIFY(waitForFinish(reply3) == Success);
+
QVERIFY(reply3->isFinished());
reply3->abort();
QCOMPARE(reply3->error(), QNetworkReply::NoError);
@@ -6590,9 +6616,7 @@ void tst_QNetworkReply::dontInsertPartialContentIntoTheCache()
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
QVERIFY(server.totalConnections > 0);
QCOMPARE(reply->readAll().constData(), "load");
@@ -6609,9 +6633,8 @@ void tst_QNetworkReply::httpUserAgent()
request.setHeader(QNetworkRequest::UserAgentHeader, "abcDEFghi");
QNetworkReplyPtr reply = manager.get(request);
- connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(10);
- QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(waitForFinish(reply) == Success);
+
QVERIFY(reply->isFinished());
QCOMPARE(reply->error(), QNetworkReply::NoError);
QVERIFY(server.receivedData.contains("\r\nUser-Agent: abcDEFghi\r\n"));
@@ -6728,6 +6751,27 @@ void tst_QNetworkReply::pipeliningHelperSlot() {
}
}
+void tst_QNetworkReply::closeDuringDownload_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::newRow("http") << QUrl("http://" + QtNetworkSettings::serverName() + "/bigfile");
+ QTest::newRow("ftp") << QUrl("ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
+}
+
+void tst_QNetworkReply::closeDuringDownload()
+{
+ QFETCH(QUrl, url);
+ QNetworkRequest request(url);
+ QNetworkReply* reply = manager.get(request);
+ connect(reply, SIGNAL(readyRead()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ QTestEventLoop::instance().enterLoop(10);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+ connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ reply->close();
+ reply->deleteLater();
+ QTest::qWait(1000); //cancelling ftp takes some time, this avoids a warning caused by test's cleanup() destroying the connection cache before the abort is finished
+}
+
// NOTE: This test must be last testcase in tst_qnetworkreply!
void tst_QNetworkReply::parentingRepliesToTheApp()
{
diff --git a/tests/auto/network/bearer/qnetworksession/qnetworksession.pro b/tests/auto/network/bearer/qnetworksession/qnetworksession.pro
index a85925bc17..f1cb47d14e 100644
--- a/tests/auto/network/bearer/qnetworksession/qnetworksession.pro
+++ b/tests/auto/network/bearer/qnetworksession/qnetworksession.pro
@@ -1,2 +1,4 @@
TEMPLATE = subdirs
-SUBDIRS = lackey test
+SUBDIRS = lackey
+test.depends = $$SUBDIRS
+SUBDIRS += test
diff --git a/tests/auto/network/bearer/qnetworksession/test/test.pro b/tests/auto/network/bearer/qnetworksession/test/test.pro
index 5567e35b02..2f1a9ba6ea 100644
--- a/tests/auto/network/bearer/qnetworksession/test/test.pro
+++ b/tests/auto/network/bearer/qnetworksession/test/test.pro
@@ -14,3 +14,6 @@ CONFIG(debug_and_release) {
} else {
DESTDIR = ..
}
+
+load(testcase) # for target.path and installTestHelperApp()
+installTestHelperApp("../lackey/lackey",lackey,lackey)
diff --git a/tests/auto/network/bearer/qnetworksession/test/tst_qnetworksession.cpp b/tests/auto/network/bearer/qnetworksession/test/tst_qnetworksession.cpp
index a51b4e5632..27e1e7f013 100644
--- a/tests/auto/network/bearer/qnetworksession/test/tst_qnetworksession.cpp
+++ b/tests/auto/network/bearer/qnetworksession/test/tst_qnetworksession.cpp
@@ -96,6 +96,7 @@ private slots:
private:
QNetworkConfigurationManager manager;
int inProcessSessionManagementCount;
+ QString lackeyDir;
#endif
};
@@ -117,6 +118,10 @@ void tst_QNetworkSession::initTestCase()
QSignalSpy spy(&manager, SIGNAL(updateCompleted()));
manager.updateConfigurations();
QTRY_VERIFY_WITH_TIMEOUT(spy.count() == 1, TestTimeOut);
+
+ lackeyDir = QFINDTESTDATA("lackey");
+ QVERIFY2(!lackeyDir.isEmpty(), qPrintable(
+ QString::fromLatin1("Couldn't find lackey dir starting from %1.").arg(QDir::currentPath())));
}
void tst_QNetworkSession::cleanupTestCase()
@@ -916,10 +921,10 @@ void tst_QNetworkSession::outOfProcessSession()
oopServer.listen("tst_qnetworksession");
QProcess lackey;
- lackey.start("lackey/lackey");
- qDebug() << lackey.error() << lackey.errorString();
- QVERIFY(lackey.waitForStarted());
-
+ QString lackeyExe = lackeyDir + "/lackey";
+ lackey.start(lackeyExe);
+ QVERIFY2(lackey.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(lackeyExe, lackey.errorString())));
QVERIFY(oopServer.waitForNewConnection(-1));
QLocalSocket *oopSocket = oopServer.nextPendingConnection();
diff --git a/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp b/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp
index 9b8391d6be..43b1f225c4 100644
--- a/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp
+++ b/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp
@@ -294,7 +294,7 @@ void tst_QHttpSocketEngine::errorTest()
connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),
&QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(5);
+ QTestEventLoop::instance().enterLoop(30);
QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(int(socket.error()), expectedError);
@@ -371,7 +371,7 @@ void tst_QHttpSocketEngine::simpleErrorsAndStates()
QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
QVERIFY(!socketDevice.connectToHost(QHostAddress(QtNetworkSettings::serverName()), 8088));
QVERIFY(socketDevice.state() == QAbstractSocket::ConnectingState);
- if (socketDevice.waitForWrite(15000)) {
+ if (socketDevice.waitForWrite(30000)) {
QVERIFY(socketDevice.state() == QAbstractSocket::ConnectedState ||
socketDevice.state() == QAbstractSocket::UnconnectedState);
} else {
@@ -425,7 +425,7 @@ void tst_QHttpSocketEngine::tcpLoopbackPerformance()
QTime timer;
timer.start();
qlonglong readBytes = 0;
- while (timer.elapsed() < 5000) {
+ while (timer.elapsed() < 30000) {
qlonglong written = serverSocket.write(message1.data(), message1.size());
while (written > 0) {
client.waitForRead();
@@ -458,7 +458,7 @@ void tst_QHttpSocketEngine::tcpSocketBlockingTest()
QCOMPARE(socket.state(), QTcpSocket::ConnectedState);
// Read greeting
- QVERIFY(socket.waitForReadyRead(5000));
+ QVERIFY(socket.waitForReadyRead(30000));
QString s = socket.readLine();
QVERIFY2(QtNetworkSettings::compareReplyIMAP(s.toLatin1()), qPrintable(s));
@@ -466,7 +466,7 @@ void tst_QHttpSocketEngine::tcpSocketBlockingTest()
QCOMPARE((int) socket.write("1 NOOP\r\n", 8), 8);
if (!socket.canReadLine())
- QVERIFY(socket.waitForReadyRead(5000));
+ QVERIFY(socket.waitForReadyRead(30000));
// Read response
s = socket.readLine();
@@ -476,14 +476,14 @@ void tst_QHttpSocketEngine::tcpSocketBlockingTest()
QCOMPARE((int) socket.write("2 LOGOUT\r\n", 10), 10);
if (!socket.canReadLine())
- QVERIFY(socket.waitForReadyRead(5000));
+ QVERIFY(socket.waitForReadyRead(30000));
// Read two lines of respose
s = socket.readLine();
QCOMPARE(s.toLatin1().constData(), "* BYE LOGOUT received\r\n");
if (!socket.canReadLine())
- QVERIFY(socket.waitForReadyRead(5000));
+ QVERIFY(socket.waitForReadyRead(30000));
s = socket.readLine();
QCOMPARE(s.toLatin1().constData(), "2 OK Completed\r\n");
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index 221ef602a1..72fa9f74a4 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -46,17 +46,21 @@
#include <QtNetwork/qlocalsocket.h>
#include <QtNetwork/qlocalserver.h>
+#ifdef Q_OS_UNIX
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif
+
Q_DECLARE_METATYPE(QLocalSocket::LocalSocketError)
Q_DECLARE_METATYPE(QLocalSocket::LocalSocketState)
+Q_DECLARE_METATYPE(QLocalServer::SocketOption)
+Q_DECLARE_METATYPE(QFile::Permissions)
class tst_QLocalSocket : public QObject
{
Q_OBJECT
-public:
- tst_QLocalSocket();
- virtual ~tst_QLocalSocket();
-
public Q_SLOTS:
void init();
void cleanup();
@@ -108,26 +112,21 @@ private slots:
void bytesWrittenSignal();
void syncDisconnectNotify();
void asyncDisconnectNotify();
-};
-tst_QLocalSocket::tst_QLocalSocket()
-{
- if (!QFile::exists("lackey/lackey"
-#ifdef Q_OS_WIN
- ".exe"
-#endif
- ))
- qWarning() << "lackey executable doesn't exists!";
-}
+ void verifySocketOptions();
+ void verifySocketOptions_data();
-tst_QLocalSocket::~tst_QLocalSocket()
-{
-}
+ void verifyListenWithDescriptor();
+ void verifyListenWithDescriptor_data();
+
+};
void tst_QLocalSocket::init()
{
qRegisterMetaType<QLocalSocket::LocalSocketState>("QLocalSocket::LocalSocketState");
qRegisterMetaType<QLocalSocket::LocalSocketError>("QLocalSocket::LocalSocketError");
+ qRegisterMetaType<QLocalServer::SocketOption>("QLocalServer::SocketOption");
+ qRegisterMetaType<QFile::Permissions>("QFile::Permissions");
}
void tst_QLocalSocket::cleanup()
@@ -749,6 +748,16 @@ void tst_QLocalSocket::processConnection_data()
*/
void tst_QLocalSocket::processConnection()
{
+#ifdef Q_OS_WIN
+# define EXE_SUFFIX ".exe"
+#else
+# define EXE_SUFFIX
+#endif
+
+// ### lackey is currently not build
+ QEXPECT_FAIL("", "lackey is currently not built due to qscript dependency, QTBUG-24142", Abort);
+ QVERIFY(QFile::exists("lackey/lackey" EXE_SUFFIX));
+
QFETCH(int, processes);
QStringList serverArguments = QStringList() << SRCDIR "lackey/scripts/server.js" << QString::number(processes);
QProcess producer;
@@ -758,7 +767,7 @@ void tst_QLocalSocket::processConnection()
#endif
QList<QProcess*> consumers;
producer.start("lackey/lackey", serverArguments);
- QVERIFY(producer.waitForStarted(-1));
+ QVERIFY2(producer.waitForStarted(-1), qPrintable(producer.errorString()));
QTest::qWait(2000);
for (int i = 0; i < processes; ++i) {
QStringList arguments = QStringList() << SRCDIR "lackey/scripts/client.js";
@@ -1018,6 +1027,140 @@ void tst_QLocalSocket::asyncDisconnectNotify()
QTRY_VERIFY(!disconnectedSpy.isEmpty());
}
+void tst_QLocalSocket::verifySocketOptions_data()
+{
+#ifdef Q_OS_LINUX
+ QTest::addColumn<QString>("service");
+ QTest::addColumn<QLocalServer::SocketOption>("opts");
+ QTest::addColumn<QFile::Permissions>("perms");
+
+ QFile::Permissions p = QFile::ExeOwner|QFile::WriteOwner|QFile::ReadOwner |
+ QFile::ExeUser|QFile::WriteUser|QFile::ReadUser;
+ QTest::newRow("user") << "userPerms" << QLocalServer::UserAccessOption << p;
+
+ p = QFile::ExeGroup|QFile::WriteGroup|QFile::ReadGroup;
+ QTest::newRow("group") << "groupPerms" << QLocalServer::GroupAccessOption << p;
+
+ p = QFile::ExeOther|QFile::WriteOther|QFile::ReadOther;
+ QTest::newRow("other") << "otherPerms" << QLocalServer::OtherAccessOption << p;
+
+ p = QFile::ExeOwner|QFile::WriteOwner|QFile::ReadOwner|
+ QFile::ExeUser|QFile::WriteUser|QFile::ReadUser |
+ QFile::ExeGroup|QFile::WriteGroup|QFile::ReadGroup|
+ QFile::ExeOther|QFile::WriteOther|QFile::ReadOther;
+ QTest::newRow("all") << "worldPerms" << QLocalServer::WorldAccessOption << p;
+#endif
+}
+
+void tst_QLocalSocket::verifySocketOptions()
+{
+ // These are only guaranteed to be useful on linux at this time
+#ifdef Q_OS_LINUX
+ QFETCH(QString, service);
+ QFETCH(QLocalServer::SocketOption, opts);
+ QFETCH(QFile::Permissions, perms);
+
+
+ QLocalServer::removeServer(service);
+ QLocalServer server;
+ server.setSocketOptions(opts);
+ QVERIFY2(server.listen(service), "service failed to start listening");
+
+ // find the socket
+ QString fullServerPath = QDir::cleanPath(QDir::tempPath());
+ fullServerPath += QLatin1Char('/') + service;
+
+ QFile socketFile(fullServerPath);
+ QVERIFY2(perms == socketFile.permissions(), "permissions on the socket don't match");
+#endif
+}
+
+void tst_QLocalSocket::verifyListenWithDescriptor()
+{
+#ifdef Q_OS_UNIX
+ QFETCH(QString, path);
+ QFETCH(bool, abstract);
+ QFETCH(bool, bound);
+
+ qDebug() << "socket" << path << abstract;
+
+ int listenSocket;
+
+ if (bound) {
+ // create the unix socket
+ listenSocket = ::socket(PF_UNIX, SOCK_STREAM, 0);
+ QVERIFY2(listenSocket != -1, "failed to create test socket");
+
+ // Construct the unix address
+ struct ::sockaddr_un addr;
+ addr.sun_family = PF_UNIX;
+
+ QVERIFY2(sizeof(addr.sun_path) > ((uint)path.size() + 1), "path to large to create socket");
+
+ ::memset(addr.sun_path, 0, sizeof(addr.sun_path));
+ if (abstract)
+ ::memcpy(addr.sun_path+1, path.toLatin1().data(), path.toLatin1().size());
+ else
+ ::memcpy(addr.sun_path, path.toLatin1().data(), path.toLatin1().size());
+
+ if (path.startsWith(QLatin1Char('/'))) {
+ ::unlink(path.toLatin1());
+ }
+
+ QVERIFY2(-1 != ::bind(listenSocket, (sockaddr *)&addr, sizeof(sockaddr_un)), "failed to bind test socket to address");
+
+ // listen for connections
+ QVERIFY2(-1 != ::listen(listenSocket, 50), "failed to call listen on test socket");
+ } else {
+ int fds[2];
+ QVERIFY2(-1 != ::socketpair(PF_UNIX, SOCK_STREAM, 0, fds), "failed to create socket pair");
+
+ listenSocket = fds[0];
+ close(fds[1]);
+ }
+
+ QLocalServer server;
+ QVERIFY2(server.listen(listenSocket), "failed to start create QLocalServer with local socket");
+
+#ifdef Q_OS_LINUX
+ if (!bound) {
+ QVERIFY(server.serverName().at(0) == QLatin1Char('@'));
+ QVERIFY(server.fullServerName().at(0) == QLatin1Char('@'));
+ } else if (abstract) {
+ QVERIFY2(server.fullServerName().at(0) == QLatin1Char('@'), "abstract sockets should start with a '@'");
+ } else {
+ QVERIFY2(server.fullServerName() == path, "full server path doesn't match patch provided");
+ if (path.contains(QLatin1String("/"))) {
+ QVERIFY2(server.serverName() == path.mid(path.lastIndexOf(QLatin1Char('/'))+1), "server name invalid short name");
+ } else {
+ QVERIFY2(server.serverName() == path, "servier name doesn't match the path provided");
+ }
+ }
+#else
+ QVERIFY(server.serverName().isEmpty());
+ QVERIFY(server.fullServerName().isEmpty());
+#endif
+
+
+#endif
+}
+
+void tst_QLocalSocket::verifyListenWithDescriptor_data()
+{
+#ifdef Q_OS_UNIX
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<bool>("abstract");
+ QTest::addColumn<bool>("bound");
+
+ QTest::newRow("normal") << QDir::tempPath() + QLatin1Literal("/testsocket") << false << true;
+ QTest::newRow("absrtact") << QString::fromLatin1("abstractsocketname") << true << true;
+ QTest::newRow("abstractwithslash") << QString::fromLatin1("abstractsocketwitha/inthename") << true << true;
+ QTest::newRow("no path") << QString::fromLatin1("/invalid/no path name speficied") << true << false;
+
+#endif
+
+}
+
QTEST_MAIN(tst_QLocalSocket)
#include "tst_qlocalsocket.moc"
diff --git a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
index 941e0b2142..ac27a621bb 100644
--- a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
@@ -119,6 +119,7 @@ private:
#ifndef QT_NO_BEARERMANAGEMENT
QNetworkSession *networkSession;
#endif
+ QString crashingServerDir;
};
// Testing get/set functions
@@ -150,6 +151,10 @@ void tst_QTcpServer::initTestCase_data()
QTest::newRow("WithoutProxy") << false << 0;
QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy);
+
+ crashingServerDir = QFINDTESTDATA("crashingServer");
+ QVERIFY2(!crashingServerDir.isEmpty(), qPrintable(
+ QString::fromLatin1("Couldn't find crashingServer dir starting from %1.").arg(QDir::currentPath())));
}
void tst_QTcpServer::initTestCase()
@@ -538,7 +543,10 @@ void tst_QTcpServer::addressReusable()
QFile::remove(signalName);
// The crashingServer process will crash once it gets a connection.
QProcess process;
- process.start("crashingServer/crashingServer");
+ QString processExe = crashingServerDir + "/crashingServer";
+ process.start(processExe);
+ QVERIFY2(process.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(processExe, process.errorString())));
int waitCount = 5;
while (waitCount-- && !QFile::exists(signalName))
QTest::qWait(1000);
@@ -547,7 +555,10 @@ void tst_QTcpServer::addressReusable()
#else
// The crashingServer process will crash once it gets a connection.
QProcess process;
- process.start("crashingServer/crashingServer");
+ QString processExe = crashingServerDir + "/crashingServer";
+ process.start(processExe);
+ QVERIFY2(process.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(processExe, process.errorString())));
QVERIFY(process.waitForReadyRead(5000));
#endif
diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
index 829ddd2054..abeb1ed06d 100644
--- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
@@ -246,6 +246,7 @@ private:
SocketPair *earlyConstructedSockets;
int earlyBytesWrittenCount;
int earlyReadyReadCount;
+ QString stressTestDir;
};
enum ProxyTests {
@@ -340,6 +341,10 @@ void tst_QTcpSocket::initTestCase_data()
QTest::newRow("WithHttpProxyBasicAuth SSL") << true << int(HttpProxy | AuthBasic) << true;
// QTest::newRow("WithHttpProxyNtlmAuth SSL") << true << int(HttpProxy | AuthNtlm) << true;
#endif
+
+ stressTestDir = QFINDTESTDATA("stressTest");
+ QVERIFY2(!stressTestDir.isEmpty(), qPrintable(
+ QString::fromLatin1("Couldn't find stressTest dir starting from %1.").arg(QDir::currentPath())));
}
void tst_QTcpSocket::initTestCase()
@@ -2225,11 +2230,14 @@ void tst_QTcpSocket::suddenRemoteDisconnect()
if (ssl)
return;
+ QString processExe = stressTestDir + "/stressTest";
+
// Start server
QProcess serverProcess;
serverProcess.setReadChannel(QProcess::StandardError);
- serverProcess.start(QString::fromLatin1("stressTest/stressTest %1").arg(server),
- QIODevice::ReadWrite | QIODevice::Text);
+ serverProcess.start(processExe, QStringList(server), QIODevice::ReadWrite | QIODevice::Text);
+ QVERIFY2(serverProcess.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(processExe, serverProcess.errorString())));
while (!serverProcess.canReadLine())
QVERIFY(serverProcess.waitForReadyRead(10000));
QCOMPARE(serverProcess.readLine().data(), (server.toLatin1() + "\n").data());
@@ -2237,8 +2245,9 @@ void tst_QTcpSocket::suddenRemoteDisconnect()
// Start client
QProcess clientProcess;
clientProcess.setReadChannel(QProcess::StandardError);
- clientProcess.start(QString::fromLatin1("stressTest/stressTest %1").arg(client),
- QIODevice::ReadWrite | QIODevice::Text);
+ clientProcess.start(processExe, QStringList(client), QIODevice::ReadWrite | QIODevice::Text);
+ QVERIFY2(clientProcess.waitForStarted(), qPrintable(
+ QString::fromLatin1("Could not start %1: %2").arg(processExe, clientProcess.errorString())));
while (!clientProcess.canReadLine())
QVERIFY(clientProcess.waitForReadyRead(10000));
QCOMPARE(clientProcess.readLine().data(), (client.toLatin1() + "\n").data());
diff --git a/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro b/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
index 7e2abac3f8..60ad3cbfd1 100644
--- a/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
+++ b/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
@@ -6,19 +6,4 @@ QT = core network testlib
TARGET = tst_qsslcertificate
-win32 {
- CONFIG(debug, debug|release) {
- DESTDIR = debug
-} else {
- DESTDIR = release
- }
-}
-
-wince* {
- certFiles.files = certificates more-certificates
- certFiles.path = .
- DEPLOYMENT += certFiles
- DEFINES += SRCDIR=\\\".\\\"
-} else {
- DEFINES += SRCDIR=\\\"$$PWD/\\\"
-}
+TESTDATA += certificates/* more-certificates/* verify-certs/*
diff --git a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
index 8003ad1932..da2dd989c7 100644
--- a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
+++ b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
@@ -71,14 +71,10 @@ class tst_QSslCertificate : public QObject
#endif
QString oldCurrentDir;
-public:
- tst_QSslCertificate();
- virtual ~tst_QSslCertificate();
public slots:
- void initTestCase_data();
- void init();
- void cleanup();
+ void initTestCase();
+ void cleanupTestCase();
#ifndef QT_NO_OPENSSL
private slots:
@@ -120,11 +116,23 @@ private slots:
// ### add tests for certificate bundles (multiple certificates concatenated into a single
// structure); both PEM and DER formatted
#endif
+private:
+ QString testDataDir;
};
-tst_QSslCertificate::tst_QSslCertificate()
+void tst_QSslCertificate::initTestCase()
{
- QDir dir(SRCDIR + QLatin1String("/certificates"));
+ testDataDir = QFileInfo(QFINDTESTDATA("certificates")).absolutePath();
+ if (testDataDir.isEmpty())
+ testDataDir = QCoreApplication::applicationDirPath();
+
+ if (QDir::current().absolutePath() != testDataDir) {
+ oldCurrentDir = QDir::current().absolutePath();
+ QVERIFY2(QDir::setCurrent(testDataDir),
+ qPrintable(QString("Cannot change directory to %1").arg(testDataDir)));
+ }
+
+ QDir dir(testDataDir + "/certificates");
QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::Readable);
QRegExp rxCert(QLatin1String("^.+\\.(pem|der)$"));
QRegExp rxSan(QLatin1String("^(.+\\.(?:pem|der))\\.san$"));
@@ -148,29 +156,11 @@ tst_QSslCertificate::tst_QSslCertificate()
}
}
-tst_QSslCertificate::~tst_QSslCertificate()
-{
-}
-
-void tst_QSslCertificate::initTestCase_data()
-{
-}
-
-void tst_QSslCertificate::init()
-{
- QString srcdir(QLatin1String(SRCDIR));
- if (!srcdir.isEmpty()) {
- oldCurrentDir = QDir::current().absolutePath();
- QDir::setCurrent(srcdir);
- }
-}
-
-void tst_QSslCertificate::cleanup()
+void tst_QSslCertificate::cleanupTestCase()
{
if (!oldCurrentDir.isEmpty()) {
QDir::setCurrent(oldCurrentDir);
}
-
}
static QByteArray readFile(const QString &absFilePath)
@@ -569,7 +559,7 @@ void tst_QSslCertificate::fromPath_data()
QTest::newRow("\"d.*/c.*.pem\" wildcard pem") << QString("d.*/c.*.pem") << int(QRegExp::Wildcard) << true << 0;
QTest::newRow("\"d.*/c.*.pem\" wildcard der") << QString("d.*/c.*.pem") << int(QRegExp::Wildcard) << false << 0;
#ifdef Q_OS_LINUX
- QTest::newRow("absolute path wildcard pem") << QString(QDir::currentPath() + "/certificates/*.pem") << int(QRegExp::Wildcard) << true << 5;
+ QTest::newRow("absolute path wildcard pem") << (testDataDir + "/certificates/*.pem") << int(QRegExp::Wildcard) << true << 5;
#endif
QTest::newRow("trailing-whitespace") << QString("more-certificates/trailing-whitespace.pem") << int(QRegExp::FixedString) << true << 1;
@@ -783,7 +773,7 @@ void tst_QSslCertificate::task256066toPem()
void tst_QSslCertificate::nulInCN()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/badguy-nul-cn.crt");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/badguy-nul-cn.crt");
QCOMPARE(certList.size(), 1);
const QSslCertificate &cert = certList.at(0);
@@ -799,7 +789,7 @@ void tst_QSslCertificate::nulInCN()
void tst_QSslCertificate::nulInSan()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/badguy-nul-san.crt");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/badguy-nul-san.crt");
QCOMPARE(certList.size(), 1);
const QSslCertificate &cert = certList.at(0);
@@ -819,7 +809,7 @@ void tst_QSslCertificate::nulInSan()
void tst_QSslCertificate::largeSerialNumber()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/cert-large-serial-number.pem");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/cert-large-serial-number.pem");
QCOMPARE(certList.size(), 1);
@@ -831,7 +821,7 @@ void tst_QSslCertificate::largeSerialNumber()
void tst_QSslCertificate::largeExpirationDate() // QTBUG-12489
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/cert-large-expiration-date.pem");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/cert-large-expiration-date.pem");
QCOMPARE(certList.size(), 1);
@@ -854,18 +844,18 @@ void tst_QSslCertificate::blacklistedCertificates()
void tst_QSslCertificate::toText()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/cert-large-expiration-date.pem");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/cert-large-expiration-date.pem");
QCOMPARE(certList.size(), 1);
const QSslCertificate &cert = certList.at(0);
// Openssl's cert dump method changed slightly between 0.9.8 and 1.0.0 versions, so we want it to match any output
- QFile fOld(SRCDIR "more-certificates/cert-large-expiration-date.txt.0.9.8");
+ QFile fOld(testDataDir + "/more-certificates/cert-large-expiration-date.txt.0.9.8");
QVERIFY(fOld.open(QIODevice::ReadOnly | QFile::Text));
QByteArray txtOld = fOld.readAll();
- QFile fNew(SRCDIR "more-certificates/cert-large-expiration-date.txt.1.0.0");
+ QFile fNew(testDataDir + "/more-certificates/cert-large-expiration-date.txt.1.0.0");
QVERIFY(fNew.open(QIODevice::ReadOnly | QFile::Text));
QByteArray txtNew = fNew.readAll();
QVERIFY(txtOld == cert.toText() || txtNew == cert.toText());
@@ -874,7 +864,7 @@ void tst_QSslCertificate::toText()
void tst_QSslCertificate::multipleCommonNames()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/test-cn-two-cns-cert.pem");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/test-cn-two-cns-cert.pem");
QVERIFY2(certList.count() > 0, "Please run this test from the source directory");
QStringList commonNames = certList[0].subjectInfo(QSslCertificate::CommonName);
@@ -885,14 +875,14 @@ void tst_QSslCertificate::multipleCommonNames()
void tst_QSslCertificate::subjectAndIssuerAttributes()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/test-cn-with-drink-cert.pem");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/test-cn-with-drink-cert.pem");
QVERIFY2(certList.count() > 0, "Please run this test from the source directory");
QList<QByteArray> attributes = certList[0].subjectInfoAttributes();
QVERIFY(attributes.contains(QByteArray("favouriteDrink")));
attributes.clear();
- certList = QSslCertificate::fromPath(SRCDIR "more-certificates/natwest-banking.pem");
+ certList = QSslCertificate::fromPath(testDataDir + "/more-certificates/natwest-banking.pem");
QVERIFY2(certList.count() > 0, "Please run this test from the source directory");
attributes = certList[0].subjectInfoAttributes();
@@ -917,17 +907,17 @@ void tst_QSslCertificate::verify()
errors.clear();
// Verify a valid cert signed by a CA
- QList<QSslCertificate> caCerts = QSslCertificate::fromPath(SRCDIR "verify-certs/cacert.pem");
+ QList<QSslCertificate> caCerts = QSslCertificate::fromPath(testDataDir + "/verify-certs/cacert.pem");
QSslSocket::addDefaultCaCertificate(caCerts.first());
- toVerify = QSslCertificate::fromPath(SRCDIR "verify-certs/test-ocsp-good-cert.pem");
+ toVerify = QSslCertificate::fromPath(testDataDir + "/verify-certs/test-ocsp-good-cert.pem");
errors = QSslCertificate::verify(toVerify);
VERIFY_VERBOSE(errors.count() == 0);
errors.clear();
// Test a blacklisted certificate
- toVerify = QSslCertificate::fromPath(SRCDIR "verify-certs/test-addons-mozilla-org-cert.pem");
+ toVerify = QSslCertificate::fromPath(testDataDir + "/verify-certs/test-addons-mozilla-org-cert.pem");
errors = QSslCertificate::verify(toVerify);
bool foundBlack = false;
foreach (const QSslError &error, errors) {
@@ -940,7 +930,7 @@ void tst_QSslCertificate::verify()
errors.clear();
// This one is expired and untrusted
- toVerify = QSslCertificate::fromPath(SRCDIR "more-certificates/cert-large-serial-number.pem");
+ toVerify = QSslCertificate::fromPath(testDataDir + "/more-certificates/cert-large-serial-number.pem");
errors = QSslCertificate::verify(toVerify);
VERIFY_VERBOSE(errors.contains(QSslError(QSslError::SelfSignedCertificate, toVerify[0])));
VERIFY_VERBOSE(errors.contains(QSslError(QSslError::CertificateExpired, toVerify[0])));
@@ -948,15 +938,15 @@ void tst_QSslCertificate::verify()
toVerify.clear();
// This one is signed by a valid cert, but the signer is not a valid CA
- toVerify << QSslCertificate::fromPath(SRCDIR "verify-certs/test-intermediate-not-ca-cert.pem").first();
- toVerify << QSslCertificate::fromPath(SRCDIR "verify-certs/test-ocsp-good-cert.pem").first();
+ toVerify << QSslCertificate::fromPath(testDataDir + "/verify-certs/test-intermediate-not-ca-cert.pem").first();
+ toVerify << QSslCertificate::fromPath(testDataDir + "/verify-certs/test-ocsp-good-cert.pem").first();
errors = QSslCertificate::verify(toVerify);
VERIFY_VERBOSE(errors.contains(QSslError(QSslError::InvalidCaCertificate, toVerify[1])));
toVerify.clear();
// This one is signed by a valid cert, and the signer is a valid CA
- toVerify << QSslCertificate::fromPath(SRCDIR "verify-certs/test-intermediate-is-ca-cert.pem").first();
- toVerify << QSslCertificate::fromPath(SRCDIR "verify-certs/test-intermediate-ca-cert.pem").first();
+ toVerify << QSslCertificate::fromPath(testDataDir + "/verify-certs/test-intermediate-is-ca-cert.pem").first();
+ toVerify << QSslCertificate::fromPath(testDataDir + "/verify-certs/test-intermediate-ca-cert.pem").first();
errors = QSslCertificate::verify(toVerify);
VERIFY_VERBOSE(errors.count() == 0);
@@ -986,7 +976,7 @@ QString tst_QSslCertificate::toString(const QList<QSslError>& errors)
void tst_QSslCertificate::extensions()
{
QList<QSslCertificate> certList =
- QSslCertificate::fromPath(SRCDIR "more-certificates/natwest-banking.pem");
+ QSslCertificate::fromPath(testDataDir + "/more-certificates/natwest-banking.pem");
QVERIFY2(certList.count() > 0, "Please run this test from the source directory");
QSslCertificate cert = certList[0];
diff --git a/tests/auto/network/ssl/qsslkey/qsslkey.pro b/tests/auto/network/ssl/qsslkey/qsslkey.pro
index 4af35487cd..d794c0faf0 100644
--- a/tests/auto/network/ssl/qsslkey/qsslkey.pro
+++ b/tests/auto/network/ssl/qsslkey/qsslkey.pro
@@ -6,23 +6,4 @@ QT = core network testlib
TARGET = tst_qsslkey
-win32 {
- CONFIG(debug, debug|release) {
- DESTDIR = debug
-} else {
- DESTDIR = release
- }
-}
-
-wince* {
- keyFiles.files = keys
- keyFiles.path = .
-
- passphraseFiles.files = rsa-without-passphrase.pem rsa-with-passphrase.pem
- passphraseFiles.path = .
-
- DEPLOYMENT += keyFiles passphraseFiles
- DEFINES += SRCDIR=\\\".\\\"
-} else {
- DEFINES+= SRCDIR=\\\"$$PWD\\\"
-}
+TESTDATA += keys/* rsa-without-passphrase.pem rsa-with-passphrase.pem
diff --git a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
index f59f0bb5a9..e8941a2642 100644
--- a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
+++ b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
@@ -68,14 +68,8 @@ class tst_QSslKey : public QObject
void createPlainTestRows();
-public:
- tst_QSslKey();
- virtual ~tst_QSslKey();
-
public slots:
- void initTestCase_data();
- void init();
- void cleanup();
+ void initTestCase();
#ifndef QT_NO_OPENSSL
@@ -95,16 +89,17 @@ private slots:
void passphraseChecks();
#endif
+private:
+ QString testDataDir;
};
-tst_QSslKey::tst_QSslKey()
+void tst_QSslKey::initTestCase()
{
-#ifdef Q_OS_MAC
- // applicationDirPath() points to a path inside the app bundle on Mac.
- QDir dir(qApp->applicationDirPath() + QLatin1String("/../../../keys"));
-#else
- QDir dir(SRCDIR + QLatin1String("/keys")); // prefer this way to avoid ifdeffery and support shadow builds?
-#endif
+ testDataDir = QFileInfo(QFINDTESTDATA("rsa-without-passphrase.pem")).absolutePath();
+ if (testDataDir.isEmpty())
+ testDataDir = QCoreApplication::applicationDirPath();
+
+ QDir dir(testDataDir + "/keys");
QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::Readable);
QRegExp rx(QLatin1String("^(rsa|dsa)-(pub|pri)-(\\d+)\\.(pem|der)$"));
foreach (QFileInfo fileInfo, fileInfoList) {
@@ -118,22 +113,6 @@ tst_QSslKey::tst_QSslKey()
}
}
-tst_QSslKey::~tst_QSslKey()
-{
-}
-
-void tst_QSslKey::initTestCase_data()
-{
-}
-
-void tst_QSslKey::init()
-{
-}
-
-void tst_QSslKey::cleanup()
-{
-}
-
static QByteArray readFile(const QString &absFilePath)
{
QFile file(absFilePath);
@@ -295,10 +274,11 @@ void tst_QSslKey::toEncryptedPemOrDer_data()
<< "aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?"; // ### add more (?)
foreach (KeyInfo keyInfo, keyInfoList) {
foreach (QString password, passwords) {
- QString testName = QString("%1-%2-%3-%4").arg(keyInfo.fileInfo.fileName())
+ QString testName = QString("%1-%2-%3-%4-%5").arg(keyInfo.fileInfo.fileName())
.arg(keyInfo.algorithm == QSsl::Rsa ? "RSA" : "DSA")
.arg(keyInfo.type == QSsl::PrivateKey ? "PrivateKey" : "PublicKey")
- .arg(keyInfo.format == QSsl::Pem ? "PEM" : "DER");
+ .arg(keyInfo.format == QSsl::Pem ? "PEM" : "DER")
+ .arg(password);
QTest::newRow(testName.toLatin1())
<< keyInfo.fileInfo.absoluteFilePath() << keyInfo.algorithm << keyInfo.type
<< keyInfo.format << password;
@@ -367,7 +347,7 @@ void tst_QSslKey::toEncryptedPemOrDer()
void tst_QSslKey::passphraseChecks()
{
{
- QString fileName(SRCDIR "/rsa-with-passphrase.pem");
+ QString fileName(testDataDir + "/rsa-with-passphrase.pem");
QFile keyFile(fileName);
QVERIFY(keyFile.exists());
{
@@ -406,7 +386,7 @@ void tst_QSslKey::passphraseChecks()
{
// be sure and check a key without passphrase too
- QString fileName(SRCDIR "/rsa-without-passphrase.pem");
+ QString fileName(testDataDir + "/rsa-without-passphrase.pem");
QFile keyFile(fileName);
{
if (!keyFile.isOpen())
diff --git a/tests/auto/network/ssl/qsslsocket/qsslsocket.pro b/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
index a8763d69af..bb04e0b9c4 100644
--- a/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
+++ b/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
@@ -35,3 +35,5 @@ wince* {
linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):DEFINES+=UBUNTU_ONEIRIC
requires(contains(QT_CONFIG,private_tests))
+
+win32:CONFIG += insignificant_test # QTBUG-24234
diff --git a/tests/auto/other/headersclean/headersclean.pro b/tests/auto/other/headersclean/headersclean.pro
index 814f19c865..5444bebfb9 100644
--- a/tests/auto/other/headersclean/headersclean.pro
+++ b/tests/auto/other/headersclean/headersclean.pro
@@ -1,7 +1,28 @@
CONFIG += testcase
TARGET = tst_headersclean
SOURCES += tst_headersclean.cpp
-QT = core network xml sql testlib
-contains(QT_CONFIG,dbus): QT += dbus
-contains(QT_CONFIG,opengl): QT += opengl
+# No need to link to all modules, only those actually used
+QT = core testlib gui widgets
+
+*-g++*: QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror
+
+# The flags here come from http://wiki.qt-project.org/Coding_Conventions#Conventions_for_public_header_files
+# -Wold-style-cast cannot be used, /usr/include/bits/byteswap.h defines the macro bswap_16 using C style casts :(
+# -Wfloat-equal cannot be used, qrect.h and qvector2d.h do exact comparisons in isNull and operator==. Would need #pragmas.
+*-g++*: QMAKE_CXXFLAGS += -Woverloaded-virtual -Wshadow -Wundef
+
+# Other nice flags
+*-g++*: QMAKE_CXXFLAGS += -Wnon-virtual-dtor -ansi -Wcast-align -Wchar-subscripts -Wpointer-arith -Wformat-security
+
+# Enable pedantic mode, but accept variadic macros and 'long long' usage.
+*-g++*: QMAKE_CXXFLAGS += -Wno-long-long -Wno-variadic-macros -pedantic-errors
+
+QMAKE_CXXFLAGS += -DQT_NO_CAST_TO_ASCII \
+ -DQT_NO_CAST_FROM_ASCII \
+ -DQT_STRICT_ITERATORS \
+ -DQT_NO_URL_CAST_FROM_STRING \
+ -DQT_NO_CAST_FROM_BYTEARRAY \
+ -DQT_NO_KEYWORDS \
+ -DQT_USE_FAST_CONCATENATION \
+ -DQT_USE_FAST_OPERATOR_PLUS
diff --git a/tests/auto/other/headersclean/tst_headersclean.cpp b/tests/auto/other/headersclean/tst_headersclean.cpp
index 41992b8d2a..81d0aa3a4a 100644
--- a/tests/auto/other/headersclean/tst_headersclean.cpp
+++ b/tests/auto/other/headersclean/tst_headersclean.cpp
@@ -39,7 +39,6 @@
**
****************************************************************************/
-#define QT_NO_KEYWORDS
#define signals int
#define slots int
#define emit public:;
@@ -47,12 +46,16 @@
#define forever public:;
#include <QtCore/QtCore>
+#include <QtConcurrent/QtConcurrent>
#include <QtTest/QtTest>
#include <QtNetwork/QtNetwork>
#include <QtXml/QtXml>
#include <QtSql/QtSql>
#include <QtGui/QtGui>
+#include <QtWidgets/QtWidgets>
+#include <QtPrintSupport/QtPrintSupport>
+#include <QtPlatformSupport/QtPlatformSupport>
#ifndef QT_NO_OPENGL
#include <QtOpenGL/QtOpenGL>
diff --git a/tests/auto/other/networkselftest/networkselftest.pro b/tests/auto/other/networkselftest/networkselftest.pro
index 3cd5f26689..1c0d256dbb 100644
--- a/tests/auto/other/networkselftest/networkselftest.pro
+++ b/tests/auto/other/networkselftest/networkselftest.pro
@@ -4,14 +4,3 @@ TARGET = tst_networkselftest
SOURCES += tst_networkselftest.cpp
QT = core network testlib
-wince*: {
- addFiles.files = rfc3252.txt
- addFiles.path = .
- DEPLOYMENT += addFiles
- DEFINES += SRCDIR=\\\"\\\"
-} else:vxworks*: {
- DEFINES += SRCDIR=\\\"\\\"
-} else {
- DEFINES += SRCDIR=\\\"$$PWD/\\\"
-}
-
diff --git a/tests/auto/other/networkselftest/rfc3252.txt b/tests/auto/other/networkselftest/rfc3252.txt
deleted file mode 100644
index b80c61bf0a..0000000000
--- a/tests/auto/other/networkselftest/rfc3252.txt
+++ /dev/null
@@ -1,899 +0,0 @@
-
-
-
-
-
-
-Network Working Group H. Kennedy
-Request for Comments: 3252 Mimezine
-Category: Informational 1 April 2002
-
-
- Binary Lexical Octet Ad-hoc Transport
-
-Status of this Memo
-
- This memo provides information for the Internet community. It does
- not specify an Internet standard of any kind. Distribution of this
- memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2002). All Rights Reserved.
-
-Abstract
-
- This document defines a reformulation of IP and two transport layer
- protocols (TCP and UDP) as XML applications.
-
-1. Introduction
-
-1.1. Overview
-
- This document describes the Binary Lexical Octet Ad-hoc Transport
- (BLOAT): a reformulation of a widely-deployed network-layer protocol
- (IP [RFC791]), and two associated transport layer protocols (TCP
- [RFC793] and UDP [RFC768]) as XML [XML] applications. It also
- describes methods for transporting BLOAT over Ethernet and IEEE 802
- networks as well as encapsulating BLOAT in IP for gatewaying BLOAT
- across the public Internet.
-
-1.2. Motivation
-
- The wild popularity of XML as a basis for application-level protocols
- such as the Blocks Extensible Exchange Protocol [RFC3080], the Simple
- Object Access Protocol [SOAP], and Jabber [JABBER] prompted
- investigation into the possibility of extending the use of XML in the
- protocol stack. Using XML at both the transport and network layer in
- addition to the application layer would provide for an amazing amount
- of power and flexibility while removing dependencies on proprietary
- and hard-to-understand binary protocols. This protocol unification
- would also allow applications to use a single XML parser for all
- aspects of their operation, eliminating developer time spent figuring
- out the intricacies of each new protocol, and moving the hard work of
-
-
-
-
-Kennedy Informational [Page 1]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- parsing to the XML toolset. The use of XML also mitigates concerns
- over "network vs. host" byte ordering which is at the root of many
- network application bugs.
-
-1.3. Relation to Existing Protocols
-
- The reformulations specified in this RFC follow as closely as
- possible the spirit of the RFCs on which they are based, and so MAY
- contain elements or attributes that would not be needed in a pure
- reworking (e.g. length attributes, which are implicit in XML.)
-
- The layering of network and transport protocols are maintained in
- this RFC despite the optimizations that could be made if the line
- were somewhat blurred (i.e. merging TCP and IP into a single, larger
- element in the DTD) in order to foster future use of this protocol as
- a basis for reformulating other protocols (such as ICMP.)
-
- Other than the encoding, the behavioral aspects of each of the
- existing protocols remain unchanged. Routing, address spaces, TCP
- congestion control, etc. behave as specified in the extant standards.
- Adapting to new standards and experimental algorithm heuristics for
- improving performance will become much easier once the move to BLOAT
- has been completed.
-
-1.4. Requirement Levels
-
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in BCP 14, RFC 2119
- [RFC2119].
-
-2. IPoXML
-
- This protocol MUST be implemented to be compliant with this RFC.
- IPoXML is the root protocol REQUIRED for effective use of TCPoXML
- (section 3.) and higher-level application protocols.
-
- The DTD for this document type can be found in section 7.1.
-
- The routing of IPoXML can be easily implemented on hosts with an XML
- parser, as the regular structure lends itself handily to parsing and
- validation of the document/datagram and then processing the
- destination address, TTL, and checksum before sending it on to its
- next-hop.
-
- The reformulation of IPv4 was chosen over IPv6 [RFC2460] due to the
- wider deployment of IPv4 and the fact that implementing IPv6 as XML
- would have exceeded the 1500 byte Ethernet MTU.
-
-
-
-Kennedy Informational [Page 2]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- All BLOAT implementations MUST use - and specify - the UTF-8 encoding
- of RFC 2279 [RFC2279]. All BLOAT document/datagrams MUST be well-
- formed and include the XMLDecl.
-
-2.1. IP Description
-
- A number of items have changed (for the better) from the original IP
- specification. Bit-masks, where present have been converted into
- human-readable values. IP addresses are listed in their dotted-
- decimal notation [RFC1123]. Length and checksum values are present
- as decimal integers.
-
- To calculate the length and checksum fields of the IP element, a
- canonicalized form of the element MUST be used. The canonical form
- SHALL have no whitespace (including newline characters) between
- elements and only one space character between attributes. There
- SHALL NOT be a space following the last attribute in an element.
-
- An iterative method SHOULD be used to calculate checksums, as the
- length field will vary based on the size of the checksum.
-
- The payload element bears special attention. Due to the character
- set restrictions of XML, the payload of IP datagrams (which MAY
- contain arbitrary data) MUST be encoded for transport. This RFC
- REQUIRES the contents of the payload to be encoded in the base-64
- encoding of RFC 2045 [RFC2045], but removes the requirement that the
- encoded output MUST be wrapped on 76-character lines.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Kennedy Informational [Page 3]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
-2.2. Example Datagram
-
- The following is an example IPoXML datagram with an empty payload:
-
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE ip PUBLIC "-//IETF//DTD BLOAT 1.0 IP//EN" "bloat.dtd">
- <ip>
- <header length="474">
- <version value="4"/>
- <tos precedence="Routine" delay="Normal" throughput="Normal"
- relibility="Normal" reserved="0"/>
- <total.length value="461"/>
- <id value="1"/>
- <flags reserved="0" df="dont" mf="last"/>
- <offset value="0"/>
- <ttl value="255"/>
- <protocol value="6"/>
- <checksum value="8707"/>
- <source address="10.0.0.22"/>
- <destination address="10.0.0.1"/>
- <options>
- <end copied="0" class="0" number="0"/>
- </options>
- <padding pad="0"/>
- </header>
- <payload>
- </payload>
- </ip>
-
-3. TCPoXML
-
- This protocol MUST be implemented to be compliant with this RFC. The
- DTD for this document type can be found in section 7.2.
-
-3.1. TCP Description
-
- A number of items have changed from the original TCP specification.
- Bit-masks, where present have been converted into human-readable
- values. Length and checksum and port values are present as decimal
- integers.
-
- To calculate the length and checksum fields of the TCP element, a
- canonicalized form of the element MUST be used as in section 2.1.
-
- An iterative method SHOULD be used to calculate checksums as in
- section 2.1.
-
- The payload element MUST be encoded as in section 2.1.
-
-
-
-Kennedy Informational [Page 4]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- The TCP offset element was expanded to a maximum of 255 from 16 to
- allow for the increased size of the header in XML.
-
- TCPoXML datagrams encapsulated by IPoXML MAY omit the <?xml?> header
- as well as the <!DOCTYPE> declaration.
-
-3.2. Example Datagram
-
- The following is an example TCPoXML datagram with an empty payload:
-
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE tcp PUBLIC "-//IETF//DTD BLOAT 1.0 TCP//EN" "bloat.dtd">
- <tcp>
- <tcp.header>
- <src port="31415"/>
- <dest port="42424"/>
- <sequence number="322622954"/>
- <acknowledgement number="689715995"/>
- <offset number=""/>
- <reserved value="0"/>
- <control syn="1" ack="1"/>
- <window size="1"/>
- <urgent pointer="0"/>
- <checksum value="2988"/>
- <tcp.options>
- <tcp.end kind="0"/>
- </tcp.options>
- <padding pad="0"/>
- </tcp.header>
- <payload>
- </payload>
- </tcp>
-
-4. UDPoXML
-
- This protocol MUST be implemented to be compliant with this RFC. The
- DTD for this document type can be found in section 7.3.
-
-4.1. UDP Description
-
- A number of items have changed from the original UDP specification.
- Bit-masks, where present have been converted into human-readable
- values. Length and checksum and port values are present as decimal
- integers.
-
-
-
-
-
-
-
-Kennedy Informational [Page 5]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- To calculate the length and checksum fields of the UDP element, a
- canonicalized form of the element MUST be used as in section 2.1. An
- iterative method SHOULD be used to calculate checksums as in section
- 2.1.
-
- The payload element MUST be encoded as in section 2.1.
-
- UDPoXML datagrams encapsulated by IPoXML MAY omit the <?xml?> header
- as well as the <!DOCTYPE> declaration.
-
-4.2. Example Datagram
-
- The following is an example UDPoXML datagram with an empty payload:
-
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE udp PUBLIC "-//IETF//DTD BLOAT 1.0 UDP//EN" "bloat.dtd">
- <udp>
- <udp.header>
- <src port="31415"/>
- <dest port="42424"/>
- <udp.length value="143"/>
- <checksum value="2988"/>
- </udp.header>
- <payload>
- </payload>
- </udp>
-
-5. Network Transport
-
- This document provides for the transmission of BLOAT datagrams over
- two common families of physical layer transport. Future RFCs will
- address additional transports as routing vendors catch up to the
- specification, and we begin to see BLOAT routed across the Internet
- backbone.
-
-5.1. Ethernet
-
- BLOAT is encapsulated in Ethernet datagrams as in [RFC894] with the
- exception that the type field of the Ethernet frame MUST contain the
- value 0xBEEF. The first 5 octets of the Ethernet frame payload will
- be 0x3c 3f 78 6d 6c ("<?xml".)
-
-5.2. IEEE 802
-
- BLOAT is encapsulated in IEEE 802 Networks as in [RFC1042] except
- that the protocol type code for IPoXML is 0xBEEF.
-
-
-
-
-
-Kennedy Informational [Page 6]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
-6. Gatewaying over IP
-
- In order to facilitate the gradual introduction of BLOAT into the
- public Internet, BLOAT MAY be encapsulated in IP as in [RFC2003] to
- gateway between networks that run BLOAT natively on their LANs.
-
-7. DTDs
-
- The Transport DTDs (7.2. and 7.3.) build on the definitions in the
- Network DTD (7.1.)
-
- The DTDs are referenced by their PubidLiteral and SystemLiteral (from
- [XML]) although it is understood that most IPoXML implementations
- will not need to pull down the DTD, as it will normally be embedded
- in the implementation, and presents something of a catch-22 if you
- need to load part of your network protocol over the network.
-
-7.1. IPoXML DTD
-
- <!--
- DTD for IP over XML.
- Refer to this DTD as:
-
- <!DOCTYPE ip PUBLIC "-//IETF//DTD BLOAT 1.0 IP//EN" "bloat.dtd">
- -->
- <!--
- DTD data types:
-
- Digits [0..9]+
-
- Precedence "NetworkControl | InternetworkControl |
- CRITIC | FlashOverride | Flash | Immediate |
- Priority | Routine"
-
- IP4Addr "dotted-decimal" notation of [RFC1123]
-
- Class [0..3]
-
- Sec "Unclassified | Confidential | EFTO | MMMM | PROG |
- Restricted | Secret | Top Secret | Reserved"
-
- Compartments [0..65535]
-
- Handling [0..65535]
-
- TCC [0..16777216]
-
- -->
-
-
-
-Kennedy Informational [Page 7]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- <!ENTITY % Digits "CDATA">
- <!ENTITY % Precedence "CDATA">
- <!ENTITY % IP4Addr "CDATA">
- <!ENTITY % Class "CDATA">
- <!ENTITY % Sec "CDATA">
- <!ENTITY % Compartments "CDATA">
- <!ENTITY % Handling "CDATA">
- <!ENTITY % TCC "CDATA">
-
- <!ELEMENT ip (header, payload)>
-
- <!ELEMENT header (version, tos, total.length, id, flags, offset, ttl,
- protocol, checksum, source, destination, options,
- padding)>
- <!-- length of header in 32-bit words -->
- <!ATTLIST header
- length %Digits; #REQUIRED>
-
- <!ELEMENT version EMPTY>
- <!-- ip version. SHOULD be "4" -->
- <!ATTLIST version
- value %Digits; #REQUIRED>
-
- <!ELEMENT tos EMPTY>
- <!ATTLIST tos
- precedence %Precedence; #REQUIRED
- delay (normal | low) #REQUIRED
- throughput (normal | high) #REQUIRED
- relibility (normal | high) #REQUIRED
- reserved CDATA #FIXED "0">
-
- <!ELEMENT total.length EMPTY>
- <!--
- total length of datagram (header and payload) in octets, MUST be
- less than 65,535 (and SHOULD be less than 1024 for IPoXML on local
- ethernets).
- -->
- <!ATTLIST total.length
- value %Digits; #REQUIRED>
-
- <!ELEMENT id EMPTY>
- <!-- 0 <= id <= 65,535 -->
- <!ATTLIST id
- value %Digits; #REQUIRED>
-
- <!ELEMENT flags EMPTY>
- <!-- df = don't fragment, mf = more fragments -->
- <!ATTLIST flags
-
-
-
-Kennedy Informational [Page 8]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- reserved CDATA #FIXED "0"
- df (may|dont) #REQUIRED
- mf (last|more) #REQUIRED>
-
- <!ELEMENT offset EMPTY>
- <!-- 0 <= offset <= 8192 measured in 8 octet (64-bit) chunks -->
- <!ATTLIST offset
- value %Digits; #REQUIRED>
-
- <!ELEMENT ttl EMPTY>
- <!-- 0 <= ttl <= 255 -->
- <!ATTLIST ttl
- value %Digits; #REQUIRED>
-
- <!ELEMENT protocol EMPTY>
- <!-- 0 <= protocol <= 255 (per IANA) -->
- <!ATTLIST protocol
- value %Digits; #REQUIRED>
-
- <!ELEMENT checksum EMPTY>
- <!-- 0 <= checksum <= 65535 (over header only) -->
- <!ATTLIST checksum
- value %Digits; #REQUIRED>
-
- <!ELEMENT source EMPTY>
- <!ATTLIST source
- address %IP4Addr; #REQUIRED>
-
- <!ELEMENT destination EMPTY>
- <!ATTLIST destination
- address %IP4Addr; #REQUIRED>
-
- <!ELEMENT options ( end | noop | security | loose | strict | record
- | stream | timestamp )*>
-
- <!ELEMENT end EMPTY>
- <!ATTLIST end
- copied (0|1) #REQUIRED
- class CDATA #FIXED "0"
- number CDATA #FIXED "0">
-
- <!ELEMENT noop EMPTY>
- <!ATTLIST noop
- copied (0|1) #REQUIRED
- class CDATA #FIXED "0"
- number CDATA #FIXED "1">
-
- <!ELEMENT security EMPTY>
-
-
-
-Kennedy Informational [Page 9]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- <!ATTLIST security
- copied CDATA #FIXED "1"
- class CDATA #FIXED "0"
- number CDATA #FIXED "2"
- length CDATA #FIXED "11"
- security %Sec; #REQUIRED
- compartments %Compartments; #REQUIRED
- handling %Handling; #REQUIRED
- tcc %TCC; #REQUIRED>
- <!ELEMENT loose (hop)+>
- <!ATTLIST loose
- copied CDATA #FIXED "1"
- class CDATA #FIXED "0"
- number CDATA #FIXED "3"
- length %Digits; #REQUIRED
- pointer %Digits; #REQUIRED>
-
- <!ELEMENT hop EMPTY>
- <!ATTLIST hop
- address %IP4Addr; #REQUIRED>
-
- <!ELEMENT strict (hop)+>
- <!ATTLIST strict
- copied CDATA #FIXED "1"
- class CDATA #FIXED "0"
- number CDATA #FIXED "9"
- length %Digits; #REQUIRED
- pointer %Digits; #REQUIRED>
-
- <!ELEMENT record (hop)+>
- <!ATTLIST record
- copied CDATA #FIXED "0"
- class CDATA #FIXED "0"
- number CDATA #FIXED "7"
- length %Digits; #REQUIRED
- pointer %Digits; #REQUIRED>
-
- <!ELEMENT stream EMPTY>
- <!-- 0 <= id <= 65,535 -->
- <!ATTLIST stream
- copied CDATA #FIXED "1"
- class CDATA #FIXED "0"
- number CDATA #FIXED "8"
- length CDATA #FIXED "4"
- id %Digits; #REQUIRED>
-
- <!ELEMENT timestamp (tstamp)+>
- <!-- 0 <= oflw <=15 -->
-
-
-
-Kennedy Informational [Page 10]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- <!ATTLIST timestamp
- copied CDATA #FIXED "0"
- class CDATA #FIXED "2"
- number CDATA #FIXED "4"
- length %Digits; #REQUIRED
- pointer %Digits; #REQUIRED
- oflw %Digits; #REQUIRED
- flag (0 | 1 | 3) #REQUIRED>
-
- <!ELEMENT tstamp EMPTY>
- <!ATTLIST tstamp
- time %Digits; #REQUIRED
- address %IP4Addr; #IMPLIED>
- <!--
- padding to bring header to 32-bit boundary.
- pad MUST be "0"*
- -->
- <!ELEMENT padding EMPTY>
- <!ATTLIST padding
- pad CDATA #REQUIRED>
-
- <!-- payload MUST be encoded as base-64 [RFC2045], as modified
- by section 2.1 of this RFC -->
- <!ELEMENT payload (CDATA)>
-
-7.2. TCPoXML DTD
-
- <!--
- DTD for TCP over XML.
- Refer to this DTD as:
-
- <!DOCTYPE tcp PUBLIC "-//IETF//DTD BLOAT 1.0 TCP//EN" "bloat.dtd">
- -->
-
- <!-- the pseudoheader is only included for checksum calculations -->
- <!ELEMENT tcp (tcp.pseudoheader?, tcp.header, payload)>
-
- <!ELEMENT tcp.header (src, dest, sequence, acknowledgement, offset,
- reserved, control, window, checksum, urgent,
- tcp.options, padding)>
-
- <!ELEMENT src EMPTY>
- <!-- 0 <= port <= 65,535 -->
- <!ATTLIST src
- port %Digits; #REQUIRED>
-
- <!ELEMENT dest EMPTY>
- <!-- 0 <= port <= 65,535 -->
-
-
-
-Kennedy Informational [Page 11]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- <!ATTLIST dest
- port %Digits; #REQUIRED>
-
- <!ELEMENT sequence EMPTY>
- <!-- 0 <= number <= 4294967295 -->
- <!ATTLIST sequence
- number %Digits; #REQUIRED>
-
- <!ELEMENT acknowledgement EMPTY>
- <!-- 0 <= number <= 4294967295 -->
- <!ATTLIST acknowledgement
- number %Digits; #REQUIRED>
-
- <!ELEMENT offset EMPTY>
- <!-- 0 <= number <= 255 -->
- <!ATTLIST offset
- number %Digits; #REQUIRED>
-
- <!ELEMENT reserved EMPTY>
- <!ATTLIST reserved
- value CDATA #FIXED "0">
-
- <!ELEMENT control EMPTY>
- <!ATTLIST control
- urg (0|1) #IMPLIED
- ack (0|1) #IMPLIED
- psh (0|1) #IMPLIED
- rst (0|1) #IMPLIED
- syn (0|1) #IMPLIED
- fin (0|1) #IMPLIED>
-
- <!ELEMENT window EMPTY>
- <!-- 0 <= size <= 65,535 -->
- <!ATTLIST window
- size %Digits; #REQUIRED>
-
- <!--
- checksum as in ip, but with
- the following pseudo-header added into the tcp element:
- -->
- <!ELEMENT tcp.pseudoheader (source, destination, protocol,
- tcp.length)>
-
- <!--
- tcp header + data length in octets. does not include the size of
-
- the pseudoheader.
- -->
-
-
-
-Kennedy Informational [Page 12]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- <!ELEMENT tcp.length EMPTY>
- <!ATTLIST tcp.length
- value %Digits; #REQUIRED>
-
- <!ELEMENT urgent EMPTY>
- <!-- 0 <= pointer <= 65,535 -->
- <!ATTLIST urgent
- pointer %Digits; #REQUIRED>
-
- <!ELEMENT tcp.options (tcp.end | tcp.noop | tcp.mss)+>
-
- <!ELEMENT tcp.end EMPTY>
- <!ATTLIST tcp.end
- kind CDATA #FIXED "0">
-
- <!ELEMENT tcp.noop EMPTY>
- <!ATTLIST tcp.noop
- kind CDATA #FIXED "1">
-
- <!ELEMENT tcp.mss EMPTY>
- <!ATTLIST tcp.mss
- kind CDATA #FIXED "2"
- length CDATA #FIXED "4"
- size %Digits; #REQUIRED>
-
-7.3. UDPoXML DTD
-
- <!--
- DTD for UDP over XML.
- Refer to this DTD as:
-
- <!DOCTYPE udp PUBLIC "-//IETF//DTD BLOAT 1.0 UDP//EN" "bloat.dtd">
- -->
-
- <!ELEMENT udp (udp.pseudoheader?, udp.header, payload)>
-
- <!ELEMENT udp.header (src, dest, udp.length, checksum)>
-
- <!ELEMENT udp.pseudoheader (source, destination, protocol,
- udp.length)>
-
- <!--
- udp header + data length in octets. does not include the size of
- the pseudoheader.
- -->
- <!ELEMENT udp.length EMPTY>
- <!ATTLIST udp.length
- value %Digits; #REQUIRED>
-
-
-
-Kennedy Informational [Page 13]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
-8. Security Considerations
-
- XML, as a subset of SGML, has the same security considerations as
- specified in SGML Media Types [RFC1874]. Security considerations
- that apply to IP, TCP and UDP also likely apply to BLOAT as it does
- not attempt to correct for issues not related to message format.
-
-9. References
-
- [JABBER] Miller, J., "Jabber", draft-miller-jabber-00.txt,
- February 2002. (Work in Progress)
-
- [RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768,
- August 1980.
-
- [RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791,
- September 1981.
-
- [RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC
- 793, September 1981.
-
- [RFC894] Hornig, C., "Standard for the Transmission of IP
- Datagrams over Ethernet Networks.", RFC 894, April 1984.
-
- [RFC1042] Postel, J. and J. Reynolds, "Standard for the
- Transmission of IP Datagrams Over IEEE 802 Networks", STD
- 43, RFC 1042, February 1988.
-
- [RFC1123] Braden, R., "Requirements for Internet Hosts -
- Application and Support", RFC 1123, October 1989.
-
- [RFC1874] Levinson, E., "SGML Media Types", RFC 1874, December
- 1995.
-
- [RFC2003] Perkins, C., "IP Encapsulation within IP", RFC 2003,
- October 1996.
-
- [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message
- Bodies", RFC 2045, November 1996.
-
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
-
- [RFC2279] Yergeau, F., "UTF-8, a transformation format of ISO
- 10646", RFC 2279, January 1998.
-
-
-
-
-
-Kennedy Informational [Page 14]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
- [RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6
- (IPv6) Specification", RFC 2460, December 1998.
-
- [RFC3080] Rose, M., "The Blocks Extensible Exchange Protocol Core",
- RFC 3080, March 2001.
-
- [SOAP] Box, D., Ehnebuske, D., Kakivaya, G., Layman, A.,
- Mendelsohn, N., Nielsen, H. F., Thatte, S. Winer, D.,
- "Simple Object Access Protocol (SOAP) 1.1" World Wide Web
- Consortium Note, May 2000 http://www.w3.org/TR/SOAP/
-
- [XML] Bray, T., Paoli, J., Sperberg-McQueen, C. M., "Extensible
- Markup Language (XML)" World Wide Web Consortium
- Recommendation REC- xml-19980210.
- http://www.w3.org/TR/1998/REC-xml-19980210
-
-10. Author's Address
-
- Hugh Kennedy
- Mimezine
- 1060 West Addison
- Chicago, IL 60613
- USA
-
- EMail: kennedyh@engin.umich.edu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Kennedy Informational [Page 15]
-
-RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002
-
-
-11. Full Copyright Statement
-
- Copyright (C) The Internet Society (2002). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this
- document itself may not be modified in any way, such as by removing
- the copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of
- developing Internet standards in which case the procedures for
- copyrights defined in the Internet Standards process must be
- followed, or as required to translate it into languages other than
- English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Kennedy Informational [Page 16]
-
diff --git a/tests/auto/other/networkselftest/tst_networkselftest.cpp b/tests/auto/other/networkselftest/tst_networkselftest.cpp
index c1a3cd17d2..99d4ac9522 100644
--- a/tests/auto/other/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/other/networkselftest/tst_networkselftest.cpp
@@ -70,7 +70,6 @@ private slots:
void serverReachability();
void remotePortsOpen_data();
void remotePortsOpen();
- void fileLineEndingTest();
// specific protocol tests
void ftpServer();
@@ -458,31 +457,6 @@ void tst_NetworkSelfTest::remotePortsOpen()
QVERIFY(socket.state() == QAbstractSocket::ConnectedState);
}
-
-void tst_NetworkSelfTest::fileLineEndingTest()
-{
- QString referenceName = SRCDIR "/rfc3252.txt";
- long long expectedReferenceSize = 25962;
-
- QString lineEndingType("LF");
-
- QFile reference(referenceName);
- QVERIFY(reference.open(QIODevice::ReadOnly));
- QByteArray byteLine = reference.readLine();
- if(byteLine.endsWith("\r\n"))
- lineEndingType = "CRLF";
- else if(byteLine.endsWith("\r"))
- lineEndingType = "CR";
-
- QString referenceAsTextData;
- QFile referenceAsText(referenceName);
- QVERIFY(referenceAsText.open(QIODevice::ReadOnly));
- referenceAsTextData = referenceAsText.readAll();
-
- QVERIFY2(expectedReferenceSize == referenceAsTextData.length(), QString("Reference file %1 has %2 as line ending and file size not matching - Git checkout issue !?!").arg(referenceName, lineEndingType).toLocal8Bit());
- QVERIFY2(!lineEndingType.compare("LF"), QString("Reference file %1 has %2 as line ending - Git checkout issue !?!").arg(referenceName, lineEndingType).toLocal8Bit());
-}
-
static QList<Chat> ftpChat(const QByteArray &userSuffix = QByteArray())
{
QList<Chat> rv;
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index eca5814b8e..b2a4b1cca2 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -846,6 +846,17 @@ public Q_SLOTS:
}
};
+static QAccessibleInterface *relatedInterface(QAccessibleInterface *iface, QAccessible::RelationFlag flag)
+{
+ typedef QPair<QAccessibleInterface *, QAccessible::Relation> RelationPair;
+ QVector<RelationPair> rels = iface->relations(flag);
+
+ for (int i = 1; i < rels.count(); ++i)
+ delete rels.at(i).first;
+
+ return rels.value(0).first;
+}
+
void tst_QAccessibility::buttonTest()
{
QWidget window;
@@ -879,6 +890,30 @@ void tst_QAccessibility::buttonTest()
toggletool.setText("Toggle");
toggletool.setMinimumSize(20,20);
+ // test Controller/Controlled relations
+ {
+ QCheckBox toggler("Toggle me!", &window);
+ bool ok = connect(&pushButton, SIGNAL(clicked()), &toggler, SLOT(toggle()));
+ QCOMPARE(ok, true);
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&toggler);
+ QVERIFY(iface);
+ QCOMPARE(iface->role(), QAccessible::CheckBox);
+ QAccessibleInterface *buttonIFace = relatedInterface(iface, QAccessible::Controller);
+ QVERIFY(buttonIFace);
+ QCOMPARE(buttonIFace->role(), QAccessible::Button);
+ QCOMPARE(buttonIFace->object(), &pushButton);
+ delete buttonIFace;
+ delete iface;
+
+ buttonIFace = QAccessible::queryAccessibleInterface(&pushButton);
+ QVERIFY(buttonIFace);
+ QCOMPARE(buttonIFace->role(), QAccessible::Button);
+ iface = relatedInterface(buttonIFace, QAccessible::Controlled);
+ QVERIFY(iface);
+ QCOMPARE(iface->object(), &toggler);
+
+ }
+
// test push button
QAccessibleInterface* interface = QAccessible::queryAccessibleInterface(&pushButton);
QAccessibleActionInterface* actionInterface = interface->actionInterface();
@@ -1516,6 +1551,12 @@ void tst_QAccessibility::textEditTest()
QCOMPARE(iface->textInterface()->characterRect(0, QAccessible2::RelativeToParent).size(), QSize(fm.width("h"), fm.height()));
QCOMPARE(iface->textInterface()->characterRect(5, QAccessible2::RelativeToParent).size(), QSize(fm.width(" "), fm.height()));
QCOMPARE(iface->textInterface()->characterRect(6, QAccessible2::RelativeToParent).size(), QSize(fm.width("w"), fm.height()));
+
+ iface->editableTextInterface()->copyText(6, 11);
+ QCOMPARE(QApplication::clipboard()->text(), QLatin1String("world"));
+ iface->editableTextInterface()->cutText(12, 16);
+ QCOMPARE(QApplication::clipboard()->text(), QLatin1String("how "));
+ QCOMPARE(iface->textInterface()->text(12, 15), QLatin1String("are"));
}
QTestAccessibility::clearEvents();
}
@@ -1685,7 +1726,7 @@ void tst_QAccessibility::lineEditTest()
QCOMPARE(iface->childCount(), 0);
QVERIFY(iface->state().sizeable);
QVERIFY(iface->state().movable);
- QCOMPARE(bool(iface->state().focusable), le->isActiveWindow());
+ QVERIFY(iface->state().focusable);
QVERIFY(iface->state().selectable);
QVERIFY(iface->state().hasPopup);
QCOMPARE(bool(iface->state().focused), le->hasFocus());
@@ -1714,7 +1755,7 @@ void tst_QAccessibility::lineEditTest()
QApplication::processEvents();
QVERIFY(!(iface->state().sizeable));
QVERIFY(!(iface->state().movable));
- QCOMPARE(bool(iface->state().focusable), le->isActiveWindow());
+ QVERIFY(iface->state().focusable);
QVERIFY(iface->state().selectable);
QVERIFY(iface->state().hasPopup);
QCOMPARE(bool(iface->state().focused), le->hasFocus());
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index c8b5513a29..270de8292b 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -412,10 +412,10 @@ void tst_QSqlTableModel::setRecord()
model.submit();
else {
// dataChanged() is not emitted when submitAll() is called
- QCOMPARE(spy.count(), 2);
+ QCOMPARE(spy.count(), 1);
QCOMPARE(spy.at(0).count(), 2);
- QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 1));
- QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, 1));
+ QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 0));
+ QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, rec.count() - 1));
}
}
@@ -699,14 +699,13 @@ void tst_QSqlTableModel::removeRows()
QVERIFY(!model.removeRows(-1,1)); // negative start
QVERIFY(!model.removeRows(-1, 0)); // negative start, and zero count
QVERIFY(!model.removeRows(1, 0)); // zero count
- QVERIFY(!model.removeRows(5, 1)); // past end (causes a beforeDelete to be emitted)
+ QVERIFY(!model.removeRows(5, 1)); // past end (DOESN'T causes a beforeDelete to be emitted)
QVERIFY(!model.removeRows(1, 0, model.index(2, 0))); // can't pass a valid modelindex
QVERIFY_SQL(model, removeRows(0, 2));
- QCOMPARE(beforeDeleteSpy.count(), 3);
- QVERIFY(beforeDeleteSpy.at(0).at(0).toInt() == 5);
- QVERIFY(beforeDeleteSpy.at(1).at(0).toInt() == 0);
- QVERIFY(beforeDeleteSpy.at(2).at(0).toInt() == 1);
+ QCOMPARE(beforeDeleteSpy.count(), 2);
+ QVERIFY(beforeDeleteSpy.at(0).at(0).toInt() == 0);
+ QVERIFY(beforeDeleteSpy.at(1).at(0).toInt() == 1);
QCOMPARE(model.rowCount(), 1);
QCOMPARE(model.data(model.index(0, 1)).toString(), QString("vohi"));
model.clear();
@@ -1200,9 +1199,13 @@ void tst_QSqlTableModel::insertRecordsInLoop()
model.submitAll(); // submitAll() calls select() which clears and repopulates the table
int firstRowIndex = 0, lastRowIndex = 12;
- QCOMPARE(spyRowsRemoved.count(), 1);
- QCOMPARE(spyRowsRemoved.at(0).at(1).toInt(), firstRowIndex);
- QCOMPARE(spyRowsRemoved.at(0).at(2).toInt(), lastRowIndex);
+ QCOMPARE(spyRowsRemoved.count(), 11);
+ // QSqlTableModel emits 10 signals for its 10 inserted rows
+ QCOMPARE(spyRowsRemoved.at(0).at(1).toInt(), lastRowIndex);
+ QCOMPARE(spyRowsRemoved.at(9).at(1).toInt(), firstRowIndex + 3);
+ // QSqlQueryModel emits 1 signal for its 3 rows
+ QCOMPARE(spyRowsRemoved.at(10).at(1).toInt(), firstRowIndex);
+ QCOMPARE(spyRowsRemoved.at(10).at(2).toInt(), firstRowIndex + 2);
QCOMPARE(spyRowsInserted.at(10).at(1).toInt(), firstRowIndex);
QCOMPARE(spyRowsInserted.at(10).at(2).toInt(), lastRowIndex);
diff --git a/tests/auto/testlib/selftests/badxml/tst_badxml.cpp b/tests/auto/testlib/selftests/badxml/tst_badxml.cpp
index 1c9a0d9493..1a143e5243 100644
--- a/tests/auto/testlib/selftests/badxml/tst_badxml.cpp
+++ b/tests/auto/testlib/selftests/badxml/tst_badxml.cpp
@@ -106,15 +106,18 @@ void tst_BadXml::badDataTag() const
QBENCHMARK {
}
- QFAIL("a failure");
+ QFETCH(bool, shouldFail);
+ if (shouldFail)
+ QFAIL("a failure");
}
void tst_BadXml::badDataTag_data() const
{
- QTest::addColumn<int>("dummy");
+ QTest::addColumn<bool>("shouldFail");
foreach (char const* str, badStrings()) {
- QTest::newRow(str) << 0;
+ QTest::newRow(qPrintable(QString("fail %1").arg(str))) << true;
+ QTest::newRow(qPrintable(QString("pass %1").arg(str))) << false;
}
}
diff --git a/tests/auto/testlib/selftests/benchlibcounting/benchlibcounting.pro b/tests/auto/testlib/selftests/benchlibcounting/benchlibcounting.pro
new file mode 100644
index 0000000000..b495995eac
--- /dev/null
+++ b/tests/auto/testlib/selftests/benchlibcounting/benchlibcounting.pro
@@ -0,0 +1,7 @@
+SOURCES += tst_benchlibcounting.cpp
+QT = core testlib
+
+mac:CONFIG -= app_bundle
+CONFIG -= debug_and_release_target
+
+TARGET = benchlibcounting
diff --git a/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp b/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp
new file mode 100644
index 0000000000..847bc1a81d
--- /dev/null
+++ b/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QCoreApplication>
+#include <QtTest/QtTest>
+
+class tst_BenchlibCounting : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void passingBenchmark();
+ void skippingBenchmark();
+ void failingBenchmark();
+};
+
+void tst_BenchlibCounting::passingBenchmark()
+{
+ QBENCHMARK {
+ }
+}
+
+void tst_BenchlibCounting::skippingBenchmark()
+{
+ QBENCHMARK {
+ QSKIP("This is a skipping benchmark");
+ }
+}
+
+void tst_BenchlibCounting::failingBenchmark()
+{
+ QBENCHMARK {
+ QFAIL("This is a failing benchmark");
+ };
+}
+
+QTEST_MAIN(tst_BenchlibCounting)
+#include "tst_benchlibcounting.moc"
diff --git a/tests/auto/testlib/selftests/counting/tst_counting.cpp b/tests/auto/testlib/selftests/counting/tst_counting.cpp
index 6758b533bb..fa61fce173 100644
--- a/tests/auto/testlib/selftests/counting/tst_counting.cpp
+++ b/tests/auto/testlib/selftests/counting/tst_counting.cpp
@@ -47,6 +47,8 @@ class tst_Counting : public QObject
Q_OBJECT
private slots:
+ // The following test functions exercise each possible combination of test
+ // results for two data rows.
void testPassPass_data();
void testPassPass();
@@ -74,6 +76,19 @@ private slots:
void testFailFail_data();
void testFailFail();
+ // The following test functions test skips and fails in the special
+ // init() and cleanup() slots.
+ void init();
+ void cleanup();
+ void testFailInInit_data();
+ void testFailInInit();
+ void testFailInCleanup_data();
+ void testFailInCleanup();
+ void testSkipInInit_data();
+ void testSkipInInit();
+ void testSkipInCleanup_data();
+ void testSkipInCleanup();
+
private:
void helper();
};
@@ -212,5 +227,77 @@ void tst_Counting::testFailFail()
helper();
}
+void tst_Counting::init()
+{
+ if (strcmp(QTest::currentTestFunction(), "testFailInInit") == 0 && strcmp(QTest::currentDataTag(), "fail") == 0)
+ QFAIL("Fail in init()");
+ else if (strcmp(QTest::currentTestFunction(), "testSkipInInit") == 0 && strcmp(QTest::currentDataTag(), "skip") == 0)
+ QSKIP("Skip in init()");
+}
+
+void tst_Counting::cleanup()
+{
+ if (strcmp(QTest::currentTestFunction(), "testFailInCleanup") == 0 && strcmp(QTest::currentDataTag(), "fail") == 0)
+ QFAIL("Fail in cleanup()");
+ else if (strcmp(QTest::currentTestFunction(), "testSkipInCleanup") == 0 && strcmp(QTest::currentDataTag(), "skip") == 0)
+ QSKIP("Skip in cleanup()");
+}
+
+void tst_Counting::testFailInInit_data()
+{
+ QTest::addColumn<bool>("dummy");
+ QTest::newRow("before") << true;
+ QTest::newRow("fail") << true;
+ QTest::newRow("after") << true;
+}
+
+void tst_Counting::testFailInInit()
+{
+ if (strcmp(QTest::currentDataTag(), "fail") == 0)
+ QFAIL("This test function should have been skipped due to QFAIL in init()");
+}
+
+void tst_Counting::testFailInCleanup_data()
+{
+ QTest::addColumn<bool>("dummy");
+ QTest::newRow("before") << true;
+ QTest::newRow("fail") << true;
+ QTest::newRow("after") << true;
+}
+
+void tst_Counting::testFailInCleanup()
+{
+ if (strcmp(QTest::currentDataTag(), "fail") == 0)
+ qDebug() << "This test function should execute and then QFAIL in cleanup()";
+}
+
+void tst_Counting::testSkipInInit_data()
+{
+ QTest::addColumn<bool>("dummy");
+ QTest::newRow("before") << true;
+ QTest::newRow("skip") << true;
+ QTest::newRow("after") << true;
+}
+
+void tst_Counting::testSkipInInit()
+{
+ if (strcmp(QTest::currentDataTag(), "skip") == 0)
+ QFAIL("This test function should have been skipped due to QSKIP in init()");
+}
+
+void tst_Counting::testSkipInCleanup_data()
+{
+ QTest::addColumn<bool>("dummy");
+ QTest::newRow("before") << true;
+ QTest::newRow("skip") << true;
+ QTest::newRow("after") << true;
+}
+
+void tst_Counting::testSkipInCleanup()
+{
+ if (strcmp(QTest::currentDataTag(), "skip") == 0)
+ qDebug() << "This test function should execute and then QSKIP in cleanup()";
+}
+
QTEST_MAIN(tst_Counting)
#include "tst_counting.moc"
diff --git a/tests/auto/testlib/selftests/crashes/tst_crashes.cpp b/tests/auto/testlib/selftests/crashes/tst_crashes.cpp
index b6298f5e63..c2174e90e8 100644
--- a/tests/auto/testlib/selftests/crashes/tst_crashes.cpp
+++ b/tests/auto/testlib/selftests/crashes/tst_crashes.cpp
@@ -61,8 +61,14 @@ void tst_Crashes::crash()
//we avoid the error dialogbox to appear on windows
SetErrorMode( SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
#endif
+ /*
+ We deliberately dereference an invalid but non-zero address;
+ it should be non-zero because a few platforms may have special crash behavior
+ when dereferencing exactly 0 (e.g. some macs have been observed to generate SIGILL
+ rather than SIGSEGV).
+ */
int *i = 0;
- *i = 1;
+ i[1] = 1;
}
QTEST_MAIN(tst_Crashes)
diff --git a/tests/auto/testlib/selftests/datetime/tst_datetime.cpp b/tests/auto/testlib/selftests/datetime/tst_datetime.cpp
index 60ebbfc104..c98f119f75 100644
--- a/tests/auto/testlib/selftests/datetime/tst_datetime.cpp
+++ b/tests/auto/testlib/selftests/datetime/tst_datetime.cpp
@@ -78,10 +78,10 @@ void tst_DateTime::qurl_data() const
QTest::addColumn<QUrl>("operandA");
QTest::addColumn<QUrl>("operandB");
- QTest::newRow("") << QUrl() << QUrl();
- QTest::newRow("") << QUrl(QLatin1String("http://example.com")) << QUrl();
- QTest::newRow("") << QUrl() << QUrl(QLatin1String("http://example.com"));
- QTest::newRow("") << QUrl(QLatin1String("http://example.com")) << QUrl(QLatin1String("http://example.com"));
+ QTest::newRow("empty urls") << QUrl() << QUrl();
+ QTest::newRow("empty rhs") << QUrl(QLatin1String("http://example.com")) << QUrl();
+ QTest::newRow("empty lhs") << QUrl() << QUrl(QLatin1String("http://example.com"));
+ QTest::newRow("same urls") << QUrl(QLatin1String("http://example.com")) << QUrl(QLatin1String("http://example.com"));
}
QTEST_MAIN(tst_DateTime)
diff --git a/tests/auto/testlib/selftests/expected_badxml.lightxml b/tests/auto/testlib/selftests/expected_badxml.lightxml
index 43446c3169..08ba497efa 100644
--- a/tests/auto/testlib/selftests/expected_badxml.lightxml
+++ b/tests/auto/testlib/selftests/expected_badxml.lightxml
@@ -7,60 +7,99 @@
</TestFunction>
<TestFunction name="badDataTag">
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
+ <DataTag><![CDATA[fail end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="end cdata ]]&gt; text ]]&gt; more text" value="0" iterations="1" />
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[quotes " text" more text]]></DataTag>
+ <DataTag><![CDATA[pass end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[quotes " text" more text]]></DataTag>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass end cdata ]]&gt; text ]]&gt; more text" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail quotes " text" more text]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail quotes " text" more text]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="quotes &quot; text&quot; more text" value="0" iterations="1" />
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[xml close > open < tags < text]]></DataTag>
+ <DataTag><![CDATA[pass quotes " text" more text]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[xml close > open < tags < text]]></DataTag>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass quotes " text" more text]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass quotes &quot; text&quot; more text" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail xml close > open < tags < text]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail xml close > open < tags < text]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="xml close &gt; open &lt; tags &lt; text" value="0" iterations="1" />
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+ <DataTag><![CDATA[pass xml close > open < tags < text]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass xml close > open < tags < text]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass xml close &gt; open &lt; tags &lt; text" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[pass all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" value="0" iterations="1" />
</TestFunction>
<TestFunction name="badMessage">
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 0]]></DataTag>
<Description><![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 0]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 1]]></DataTag>
<Description><![CDATA[quotes " text" more text]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 2]]></DataTag>
<Description><![CDATA[xml close > open < tags < text]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 2]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 3]]></DataTag>
<Description><![CDATA[all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 3]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="failWithNoFile">
<Incident type="fail" file="" line="0">
diff --git a/tests/auto/testlib/selftests/expected_badxml.txt b/tests/auto/testlib/selftests/expected_badxml.txt
index 0db292e269..68d333ec30 100644
--- a/tests/auto/testlib/selftests/expected_badxml.txt
+++ b/tests/auto/testlib/selftests/expected_badxml.txt
@@ -1,32 +1,43 @@
********* Start testing of tst_BadXml *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_BadXml::initTestCase()
-QDEBUG : tst_BadXml::badDataTag(end cdata ]]> text ]]> more text) a message
-FAIL! : tst_BadXml::badDataTag(end cdata ]]> text ]]> more text) a failure
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(109)]
-RESULT : tst_BadXml::badDataTag():"end cdata ]]> text ]]> more text":
+QDEBUG : tst_BadXml::badDataTag(fail end cdata ]]> text ]]> more text) a message
+FAIL! : tst_BadXml::badDataTag(fail end cdata ]]> text ]]> more text) a failure
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(111)]
+QDEBUG : tst_BadXml::badDataTag(pass end cdata ]]> text ]]> more text) a message
+PASS : tst_BadXml::badDataTag(pass end cdata ]]> text ]]> more text)
+RESULT : tst_BadXml::badDataTag():"pass end cdata ]]> text ]]> more text":
0 events per iteration (total: 0, iterations: 1)
-QDEBUG : tst_BadXml::badDataTag(quotes " text" more text) a message
-FAIL! : tst_BadXml::badDataTag(quotes " text" more text) a failure
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(109)]
-RESULT : tst_BadXml::badDataTag():"quotes " text" more text":
+QDEBUG : tst_BadXml::badDataTag(fail quotes " text" more text) a message
+FAIL! : tst_BadXml::badDataTag(fail quotes " text" more text) a failure
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(111)]
+QDEBUG : tst_BadXml::badDataTag(pass quotes " text" more text) a message
+PASS : tst_BadXml::badDataTag(pass quotes " text" more text)
+RESULT : tst_BadXml::badDataTag():"pass quotes " text" more text":
0 events per iteration (total: 0, iterations: 1)
-QDEBUG : tst_BadXml::badDataTag(xml close > open < tags < text) a message
-FAIL! : tst_BadXml::badDataTag(xml close > open < tags < text) a failure
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(109)]
-RESULT : tst_BadXml::badDataTag():"xml close > open < tags < text":
+QDEBUG : tst_BadXml::badDataTag(fail xml close > open < tags < text) a message
+FAIL! : tst_BadXml::badDataTag(fail xml close > open < tags < text) a failure
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(111)]
+QDEBUG : tst_BadXml::badDataTag(pass xml close > open < tags < text) a message
+PASS : tst_BadXml::badDataTag(pass xml close > open < tags < text)
+RESULT : tst_BadXml::badDataTag():"pass xml close > open < tags < text":
0 events per iteration (total: 0, iterations: 1)
-QDEBUG : tst_BadXml::badDataTag(all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs) a message
-FAIL! : tst_BadXml::badDataTag(all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs) a failure
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(109)]
-RESULT : tst_BadXml::badDataTag():"all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs":
+QDEBUG : tst_BadXml::badDataTag(fail all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs) a message
+FAIL! : tst_BadXml::badDataTag(fail all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs) a failure
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp(111)]
+QDEBUG : tst_BadXml::badDataTag(pass all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs) a message
+PASS : tst_BadXml::badDataTag(pass all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs)
+RESULT : tst_BadXml::badDataTag():"pass all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs":
0 events per iteration (total: 0, iterations: 1)
QDEBUG : tst_BadXml::badMessage(string 0) end cdata ]]> text ]]> more text
+PASS : tst_BadXml::badMessage(string 0)
QDEBUG : tst_BadXml::badMessage(string 1) quotes " text" more text
+PASS : tst_BadXml::badMessage(string 1)
QDEBUG : tst_BadXml::badMessage(string 2) xml close > open < tags < text
+PASS : tst_BadXml::badMessage(string 2)
QDEBUG : tst_BadXml::badMessage(string 3) all > " mixed ]]> up > " in < the ]]> hopes < of triggering "< ]]> bugs
-PASS : tst_BadXml::badMessage()
+PASS : tst_BadXml::badMessage(string 3)
FAIL! : tst_BadXml::failWithNoFile() failure message
PASS : tst_BadXml::cleanupTestCase()
-Totals: 3 passed, 5 failed, 0 skipped
+Totals: 10 passed, 5 failed, 0 skipped
********* Finished testing of tst_BadXml *********
diff --git a/tests/auto/testlib/selftests/expected_badxml.xml b/tests/auto/testlib/selftests/expected_badxml.xml
index fbb584d5e5..849bc07bfc 100644
--- a/tests/auto/testlib/selftests/expected_badxml.xml
+++ b/tests/auto/testlib/selftests/expected_badxml.xml
@@ -9,60 +9,99 @@
</TestFunction>
<TestFunction name="badDataTag">
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
+ <DataTag><![CDATA[fail end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="end cdata ]]&gt; text ]]&gt; more text" value="0" iterations="1" />
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[quotes " text" more text]]></DataTag>
+ <DataTag><![CDATA[pass end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[quotes " text" more text]]></DataTag>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass end cdata ]]&gt; text ]]&gt; more text" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail quotes " text" more text]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail quotes " text" more text]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="quotes &quot; text&quot; more text" value="0" iterations="1" />
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[xml close > open < tags < text]]></DataTag>
+ <DataTag><![CDATA[pass quotes " text" more text]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[xml close > open < tags < text]]></DataTag>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass quotes " text" more text]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass quotes &quot; text&quot; more text" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail xml close > open < tags < text]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail xml close > open < tags < text]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="xml close &gt; open &lt; tags &lt; text" value="0" iterations="1" />
<Message type="qdebug" file="" line="0">
- <DataTag><![CDATA[all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+ <DataTag><![CDATA[pass xml close > open < tags < text]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass xml close > open < tags < text]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass xml close &gt; open &lt; tags &lt; text" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
<Description><![CDATA[a message]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="109">
- <DataTag><![CDATA[all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/badxml/tst_badxml.cpp" line="111">
+ <DataTag><![CDATA[fail all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
<Description><![CDATA[a failure]]></Description>
</Incident>
-<BenchmarkResult metric="Events" tag="all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" value="0" iterations="1" />
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[pass all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+ <Description><![CDATA[a message]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[pass all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></DataTag>
+</Incident>
+<BenchmarkResult metric="Events" tag="pass all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" value="0" iterations="1" />
</TestFunction>
<TestFunction name="badMessage">
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 0]]></DataTag>
<Description><![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 0]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 1]]></DataTag>
<Description><![CDATA[quotes " text" more text]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 2]]></DataTag>
<Description><![CDATA[xml close > open < tags < text]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 2]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[string 3]]></DataTag>
<Description><![CDATA[all > " mixed ]]]><![CDATA[]> up > " in < the ]]]><![CDATA[]> hopes < of triggering "< ]]]><![CDATA[]> bugs]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[string 3]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="failWithNoFile">
<Incident type="fail" file="" line="0">
diff --git a/tests/auto/testlib/selftests/expected_badxml.xunitxml b/tests/auto/testlib/selftests/expected_badxml.xunitxml
index 724aed59e7..939e887a88 100644
--- a/tests/auto/testlib/selftests/expected_badxml.xunitxml
+++ b/tests/auto/testlib/selftests/expected_badxml.xunitxml
@@ -1,19 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="8" failures="5" tests="5" name="tst_BadXml">
+<testsuite errors="12" failures="5" tests="5" name="tst_BadXml">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
</properties>
<testcase result="pass" name="initTestCase"/>
<testcase result="fail" name="badDataTag">
- <!-- tag="end cdata ]]&gt; text ]]&gt; more text" message="a message" type="qdebug" -->
- <failure tag="end cdata ]]&gt; text ]]&gt; more text" message="a failure" result="fail"/>
- <!-- tag="quotes &quot; text&quot; more text" message="a message" type="qdebug" -->
- <failure tag="quotes &quot; text&quot; more text" message="a failure" result="fail"/>
- <!-- tag="xml close &gt; open &lt; tags &lt; text" message="a message" type="qdebug" -->
- <failure tag="xml close &gt; open &lt; tags &lt; text" message="a failure" result="fail"/>
- <!-- tag="all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" message="a message" type="qdebug" -->
- <failure tag="all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" message="a failure" result="fail"/>
+ <!-- tag="fail end cdata ]]&gt; text ]]&gt; more text" message="a message" type="qdebug" -->
+ <failure tag="fail end cdata ]]&gt; text ]]&gt; more text" message="a failure" result="fail"/>
+ <!-- tag="pass end cdata ]]&gt; text ]]&gt; more text" message="a message" type="qdebug" -->
+ <!-- tag="fail quotes &quot; text&quot; more text" message="a message" type="qdebug" -->
+ <failure tag="fail quotes &quot; text&quot; more text" message="a failure" result="fail"/>
+ <!-- tag="pass quotes &quot; text&quot; more text" message="a message" type="qdebug" -->
+ <!-- tag="fail xml close &gt; open &lt; tags &lt; text" message="a message" type="qdebug" -->
+ <failure tag="fail xml close &gt; open &lt; tags &lt; text" message="a failure" result="fail"/>
+ <!-- tag="pass xml close &gt; open &lt; tags &lt; text" message="a message" type="qdebug" -->
+ <!-- tag="fail all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" message="a message" type="qdebug" -->
+ <failure tag="fail all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" message="a failure" result="fail"/>
+ <!-- tag="pass all &gt; &quot; mixed ]]&gt; up &gt; &quot; in &lt; the ]]&gt; hopes &lt; of triggering &quot;&lt; ]]&gt; bugs" message="a message" type="qdebug" -->
</testcase>
<testcase result="pass" name="badMessage">
<!-- tag="string 0" message="end cdata ]]&gt; text ]]&gt; more text" type="qdebug" -->
@@ -30,6 +34,10 @@
<![CDATA[a message]]>
<![CDATA[a message]]>
<![CDATA[a message]]>
+<![CDATA[a message]]>
+<![CDATA[a message]]>
+<![CDATA[a message]]>
+<![CDATA[a message]]>
<![CDATA[end cdata ]]]><![CDATA[]> text ]]]><![CDATA[]> more text]]>
<![CDATA[quotes " text" more text]]>
<![CDATA[xml close > open < tags < text]]>
diff --git a/tests/auto/testlib/selftests/expected_benchlibcallgrind.txt b/tests/auto/testlib/selftests/expected_benchlibcallgrind.txt
index 2498c81138..13e9a39aff 100644
--- a/tests/auto/testlib/selftests/expected_benchlibcallgrind.txt
+++ b/tests/auto/testlib/selftests/expected_benchlibcallgrind.txt
@@ -1,9 +1,9 @@
********* Start testing of tst_BenchlibCallgrind *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_BenchlibCallgrind::initTestCase()
-RESULT : tst_BenchlibCallgrind::twoHundredMillionInstructions():
- 200,000,000 instruction reads per iteration (total: 200000000, iterations: 1)
PASS : tst_BenchlibCallgrind::twoHundredMillionInstructions()
+RESULT : tst_BenchlibCallgrind::twoHundredMillionInstructions():
+ 200,000,158 instruction reads per iteration (total: 200,000,158, iterations: 1)
PASS : tst_BenchlibCallgrind::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of tst_BenchlibCallgrind *********
diff --git a/tests/auto/testlib/selftests/expected_benchlibcounting.lightxml b/tests/auto/testlib/selftests/expected_benchlibcounting.lightxml
new file mode 100644
index 0000000000..5c436a53e0
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_benchlibcounting.lightxml
@@ -0,0 +1,24 @@
+<Environment>
+ <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+ <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
+</Environment>
+<TestFunction name="initTestCase">
+<Incident type="pass" file="" line="0" />
+</TestFunction>
+<TestFunction name="passingBenchmark">
+<Incident type="pass" file="" line="0" />
+<BenchmarkResult metric="Events" tag="" value="0" iterations="1" />
+</TestFunction>
+<TestFunction name="skippingBenchmark">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp" line="64">
+ <Description><![CDATA[This is a skipping benchmark]]></Description>
+</Message>
+</TestFunction>
+<TestFunction name="failingBenchmark">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp" line="71">
+ <Description><![CDATA[This is a failing benchmark]]></Description>
+</Incident>
+</TestFunction>
+<TestFunction name="cleanupTestCase">
+<Incident type="pass" file="" line="0" />
+</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_benchlibcounting.txt b/tests/auto/testlib/selftests/expected_benchlibcounting.txt
new file mode 100644
index 0000000000..e1af40b9e0
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_benchlibcounting.txt
@@ -0,0 +1,13 @@
+********* Start testing of tst_BenchlibCounting *********
+Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
+PASS : tst_BenchlibCounting::initTestCase()
+PASS : tst_BenchlibCounting::passingBenchmark()
+RESULT : tst_BenchlibCounting::passingBenchmark():
+ 0 events per iteration (total: 0, iterations: 1)
+SKIP : tst_BenchlibCounting::skippingBenchmark() This is a skipping benchmark
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp(64)]
+FAIL! : tst_BenchlibCounting::failingBenchmark() This is a failing benchmark
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp(71)]
+PASS : tst_BenchlibCounting::cleanupTestCase()
+Totals: 3 passed, 1 failed, 1 skipped
+********* Finished testing of tst_BenchlibCounting *********
diff --git a/tests/auto/testlib/selftests/expected_benchlibcounting.xml b/tests/auto/testlib/selftests/expected_benchlibcounting.xml
new file mode 100644
index 0000000000..5bf71fbf8e
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_benchlibcounting.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<TestCase name="tst_BenchlibCounting">
+<Environment>
+ <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+ <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
+</Environment>
+<TestFunction name="initTestCase">
+<Incident type="pass" file="" line="0" />
+</TestFunction>
+<TestFunction name="passingBenchmark">
+<Incident type="pass" file="" line="0" />
+<BenchmarkResult metric="Events" tag="" value="0" iterations="1" />
+</TestFunction>
+<TestFunction name="skippingBenchmark">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp" line="64">
+ <Description><![CDATA[This is a skipping benchmark]]></Description>
+</Message>
+</TestFunction>
+<TestFunction name="failingBenchmark">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp" line="71">
+ <Description><![CDATA[This is a failing benchmark]]></Description>
+</Incident>
+</TestFunction>
+<TestFunction name="cleanupTestCase">
+<Incident type="pass" file="" line="0" />
+</TestFunction>
+</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_benchlibcounting.xunitxml b/tests/auto/testlib/selftests/expected_benchlibcounting.xunitxml
new file mode 100644
index 0000000000..83e429aa3a
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_benchlibcounting.xunitxml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="1" failures="1" tests="5" name="tst_BenchlibCounting">
+ <properties>
+ <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+ <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
+ </properties>
+ <testcase result="pass" name="initTestCase"/>
+ <testcase result="pass" name="passingBenchmark">
+ </testcase>
+ <testcase name="skippingBenchmark">
+ <!-- message="This is a skipping benchmark" type="skip" -->
+ </testcase>
+ <testcase result="fail" name="failingBenchmark">
+ <failure message="This is a failing benchmark" result="fail"/>
+ </testcase>
+ <testcase result="pass" name="cleanupTestCase"/>
+ <system-err>
+<![CDATA[This is a skipping benchmark]]>
+ </system-err>
+</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_benchlibeventcounter.lightxml b/tests/auto/testlib/selftests/expected_benchlibeventcounter.lightxml
index 3bede6de83..3cb59d209b 100644
--- a/tests/auto/testlib/selftests/expected_benchlibeventcounter.lightxml
+++ b/tests/auto/testlib/selftests/expected_benchlibeventcounter.lightxml
@@ -6,14 +6,34 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="events">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[0]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="0" value="0" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="1" value="1" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[10]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="10" value="10" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[100]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="100" value="100" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[500]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="500" value="500" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[5000]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="5000" value="5000" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[100000]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="100000" value="100000" iterations="1" />
-<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_benchlibeventcounter.txt b/tests/auto/testlib/selftests/expected_benchlibeventcounter.txt
index e3dc6c0411..7be4bcccc4 100644
--- a/tests/auto/testlib/selftests/expected_benchlibeventcounter.txt
+++ b/tests/auto/testlib/selftests/expected_benchlibeventcounter.txt
@@ -1,21 +1,27 @@
********* Start testing of tst_BenchlibEventCounter *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_BenchlibEventCounter::initTestCase()
+PASS : tst_BenchlibEventCounter::events(0)
RESULT : tst_BenchlibEventCounter::events():"0":
0 events per iteration (total: 0, iterations: 1)
+PASS : tst_BenchlibEventCounter::events(1)
RESULT : tst_BenchlibEventCounter::events():"1":
1 events per iteration (total: 1, iterations: 1)
+PASS : tst_BenchlibEventCounter::events(10)
RESULT : tst_BenchlibEventCounter::events():"10":
10 events per iteration (total: 10, iterations: 1)
+PASS : tst_BenchlibEventCounter::events(100)
RESULT : tst_BenchlibEventCounter::events():"100":
100 events per iteration (total: 100, iterations: 1)
+PASS : tst_BenchlibEventCounter::events(500)
RESULT : tst_BenchlibEventCounter::events():"500":
500 events per iteration (total: 500, iterations: 1)
+PASS : tst_BenchlibEventCounter::events(5000)
RESULT : tst_BenchlibEventCounter::events():"5000":
- 5,000 events per iteration (total: 5000, iterations: 1)
+ 5,000 events per iteration (total: 5,000, iterations: 1)
+PASS : tst_BenchlibEventCounter::events(100000)
RESULT : tst_BenchlibEventCounter::events():"100000":
- 100,000 events per iteration (total: 100000, iterations: 1)
-PASS : tst_BenchlibEventCounter::events()
+ 100,000 events per iteration (total: 100,000, iterations: 1)
PASS : tst_BenchlibEventCounter::cleanupTestCase()
-Totals: 3 passed, 0 failed, 0 skipped
+Totals: 9 passed, 0 failed, 0 skipped
********* Finished testing of tst_BenchlibEventCounter *********
diff --git a/tests/auto/testlib/selftests/expected_benchlibeventcounter.xml b/tests/auto/testlib/selftests/expected_benchlibeventcounter.xml
index 646cf22b80..47b497881a 100644
--- a/tests/auto/testlib/selftests/expected_benchlibeventcounter.xml
+++ b/tests/auto/testlib/selftests/expected_benchlibeventcounter.xml
@@ -8,14 +8,34 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="events">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[0]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="0" value="0" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="1" value="1" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[10]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="10" value="10" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[100]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="100" value="100" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[500]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="500" value="500" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[5000]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="5000" value="5000" iterations="1" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[100000]]></DataTag>
+</Incident>
<BenchmarkResult metric="Events" tag="100000" value="100000" iterations="1" />
-<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_benchliboptions.txt b/tests/auto/testlib/selftests/expected_benchliboptions.txt
index 3e75d209d0..ef9f0c5ad0 100644
--- a/tests/auto/testlib/selftests/expected_benchliboptions.txt
+++ b/tests/auto/testlib/selftests/expected_benchliboptions.txt
@@ -1,27 +1,27 @@
********* Start testing of tst_BenchlibOptions *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_BenchlibOptions::initTestCase()
+PASS : tst_BenchlibOptions::threeEvents()
RESULT : tst_BenchlibOptions::threeEvents():
3 events per iteration (total: 3, iterations: 1)
-PASS : tst_BenchlibOptions::threeEvents()
PASS : tst_BenchlibOptions::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of tst_BenchlibOptions *********
********* Start testing of tst_BenchlibFifteenIterations *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_BenchlibFifteenIterations::initTestCase()
+PASS : tst_BenchlibFifteenIterations::threeEvents()
RESULT : tst_BenchlibFifteenIterations::threeEvents():
3.0 events per iteration (total: 45, iterations: 15)
-PASS : tst_BenchlibFifteenIterations::threeEvents()
PASS : tst_BenchlibFifteenIterations::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of tst_BenchlibFifteenIterations *********
********* Start testing of tst_BenchlibOneHundredMinimum *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_BenchlibOneHundredMinimum::initTestCase()
+PASS : tst_BenchlibOneHundredMinimum::threeEvents()
RESULT : tst_BenchlibOneHundredMinimum::threeEvents():
3.00 events per iteration (total: 192, iterations: 64)
-PASS : tst_BenchlibOneHundredMinimum::threeEvents()
PASS : tst_BenchlibOneHundredMinimum::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of tst_BenchlibOneHundredMinimum *********
diff --git a/tests/auto/testlib/selftests/expected_benchliboptions.xml b/tests/auto/testlib/selftests/expected_benchliboptions.xml
deleted file mode 100644
index 40bff95f79..0000000000
--- a/tests/auto/testlib/selftests/expected_benchliboptions.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<TestCase name="tst_BenchlibOneHundredMinimum">
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="threeEvents">
-<BenchmarkResult metric="walltime" tag="" value="123" iterations="2097152" />
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_benchliboptions.xunitxml b/tests/auto/testlib/selftests/expected_benchliboptions.xunitxml
deleted file mode 100644
index 7317e90470..0000000000
--- a/tests/auto/testlib/selftests/expected_benchliboptions.xunitxml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="0" tests="3" name="tst_BenchlibOneHundredMinimum">
- <properties>
- <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
- <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
- </properties>
- <testcase result="pass" name="initTestCase"/>
- <testcase result="pass" name="threeEvents">
- </testcase>
- <testcase result="pass" name="cleanupTestCase"/>
- <system-err/>
-</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_cmptest.lightxml b/tests/auto/testlib/selftests/expected_cmptest.lightxml
index 17f3e6ec3a..d1cccd4bd2 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.lightxml
+++ b/tests/auto/testlib/selftests/expected_cmptest.lightxml
@@ -12,25 +12,28 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="compare_tostring">
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[int, string]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(int,123)
Expected (expected): QVariant(QString,hi)]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[both invalid]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[null hash, invalid]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(QVariantHash)
Expected (expected): QVariant()]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[string, null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(QString,A simple string)
Expected (expected): QVariant(PhonyClass)]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[both non-null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(PhonyClass,<value not representable as string>)
@@ -38,31 +41,37 @@
</Incident>
</TestFunction>
<TestFunction name="compareQStringLists">
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[empty lists]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[equal lists]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[last item different]]></DataTag>
<Description><![CDATA[Compared QStringLists differ at index 2.
Actual (opA) : 'string3'
Expected (opB) : 'DIFFERS']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[second-last item different]]></DataTag>
<Description><![CDATA[Compared QStringLists differ at index 2.
Actual (opA) : 'string3'
Expected (opB) : 'DIFFERS']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[prefix]]></DataTag>
<Description><![CDATA[Compared QStringLists have different sizes.
Actual (opA) size : '2'
Expected (opB) size: '1']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[short list second]]></DataTag>
<Description><![CDATA[Compared QStringLists have different sizes.
Actual (opA) size : '12'
Expected (opB) size: '1']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[short list first]]></DataTag>
<Description><![CDATA[Compared QStringLists have different sizes.
Actual (opA) size : '1'
@@ -70,55 +79,67 @@
</Incident>
</TestFunction>
<TestFunction name="compareQPixmaps">
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[both null]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull() : 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull() : 0
Expected (opB).isNull(): 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[equal]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ in size.
Actual (opA) : 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
</TestFunction>
<TestFunction name="compareQImages">
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[both null]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull() : 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull() : 0
Expected (opB).isNull(): 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[equal]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QImages differ in size.
Actual (opA) : 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[different format]]></DataTag>
<Description><![CDATA[Compared QImages differ in format.
Actual (opA) : 6
Expected (opB): 3]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
diff --git a/tests/auto/testlib/selftests/expected_cmptest.txt b/tests/auto/testlib/selftests/expected_cmptest.txt
index 36a4995d91..fce635ae5a 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.txt
+++ b/tests/auto/testlib/selftests/expected_cmptest.txt
@@ -6,71 +6,78 @@ PASS : tst_Cmptest::compare_pointerfuncs()
FAIL! : tst_Cmptest::compare_tostring(int, string) Compared values are not the same
Actual (actual): QVariant(int,123)
Expected (expected): QVariant(QString,hi)
- Loc: [tst_cmptest.cpp(214)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(214)]
+PASS : tst_Cmptest::compare_tostring(both invalid)
FAIL! : tst_Cmptest::compare_tostring(null hash, invalid) Compared values are not the same
Actual (actual): QVariant(QVariantHash)
Expected (expected): QVariant()
- Loc: [tst_cmptest.cpp(214)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(214)]
FAIL! : tst_Cmptest::compare_tostring(string, null user type) Compared values are not the same
Actual (actual): QVariant(QString,A simple string)
Expected (expected): QVariant(PhonyClass)
- Loc: [tst_cmptest.cpp(214)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(214)]
FAIL! : tst_Cmptest::compare_tostring(both non-null user type) Compared values are not the same
Actual (actual): QVariant(PhonyClass,<value not representable as string>)
Expected (expected): QVariant(PhonyClass,<value not representable as string>)
- Loc: [tst_cmptest.cpp(214)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(214)]
+PASS : tst_Cmptest::compareQStringLists(empty lists)
+PASS : tst_Cmptest::compareQStringLists(equal lists)
FAIL! : tst_Cmptest::compareQStringLists(last item different) Compared QStringLists differ at index 2.
Actual (opA) : 'string3'
Expected (opB) : 'DIFFERS'
- Loc: [tst_cmptest.cpp(308)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(308)]
FAIL! : tst_Cmptest::compareQStringLists(second-last item different) Compared QStringLists differ at index 2.
Actual (opA) : 'string3'
Expected (opB) : 'DIFFERS'
- Loc: [tst_cmptest.cpp(308)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(308)]
FAIL! : tst_Cmptest::compareQStringLists(prefix) Compared QStringLists have different sizes.
Actual (opA) size : '2'
Expected (opB) size: '1'
- Loc: [tst_cmptest.cpp(308)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(308)]
FAIL! : tst_Cmptest::compareQStringLists(short list second) Compared QStringLists have different sizes.
Actual (opA) size : '12'
Expected (opB) size: '1'
- Loc: [tst_cmptest.cpp(308)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(308)]
FAIL! : tst_Cmptest::compareQStringLists(short list first) Compared QStringLists have different sizes.
Actual (opA) size : '1'
Expected (opB) size: '12'
- Loc: [tst_cmptest.cpp(308)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(308)]
+PASS : tst_Cmptest::compareQPixmaps(both null)
FAIL! : tst_Cmptest::compareQPixmaps(one null) Compared QPixmaps differ.
Actual (opA).isNull() : 1
Expected (opB).isNull(): 0
- Loc: [tst_cmptest.cpp(333)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(333)]
FAIL! : tst_Cmptest::compareQPixmaps(other null) Compared QPixmaps differ.
Actual (opA).isNull() : 0
Expected (opB).isNull(): 1
- Loc: [tst_cmptest.cpp(333)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(333)]
+PASS : tst_Cmptest::compareQPixmaps(equal)
FAIL! : tst_Cmptest::compareQPixmaps(different size) Compared QPixmaps differ in size.
Actual (opA) : 11x20
Expected (opB): 20x20
- Loc: [tst_cmptest.cpp(333)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(333)]
FAIL! : tst_Cmptest::compareQPixmaps(different pixels) Compared values are not the same
- Loc: [tst_cmptest.cpp(333)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(333)]
+PASS : tst_Cmptest::compareQImages(both null)
FAIL! : tst_Cmptest::compareQImages(one null) Compared QImages differ.
Actual (opA).isNull() : 1
Expected (opB).isNull(): 0
- Loc: [tst_cmptest.cpp(360)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(360)]
FAIL! : tst_Cmptest::compareQImages(other null) Compared QImages differ.
Actual (opA).isNull() : 0
Expected (opB).isNull(): 1
- Loc: [tst_cmptest.cpp(360)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(360)]
+PASS : tst_Cmptest::compareQImages(equal)
FAIL! : tst_Cmptest::compareQImages(different size) Compared QImages differ in size.
Actual (opA) : 11x20
Expected (opB): 20x20
- Loc: [tst_cmptest.cpp(360)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(360)]
FAIL! : tst_Cmptest::compareQImages(different format) Compared QImages differ in format.
Actual (opA) : 6
Expected (opB): 3
- Loc: [tst_cmptest.cpp(360)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(360)]
FAIL! : tst_Cmptest::compareQImages(different pixels) Compared values are not the same
- Loc: [tst_cmptest.cpp(360)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(360)]
PASS : tst_Cmptest::cleanupTestCase()
-Totals: 4 passed, 18 failed, 0 skipped
+Totals: 11 passed, 18 failed, 0 skipped
********* Finished testing of tst_Cmptest *********
diff --git a/tests/auto/testlib/selftests/expected_cmptest.xml b/tests/auto/testlib/selftests/expected_cmptest.xml
index aba1ce5edd..90bb313518 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.xml
+++ b/tests/auto/testlib/selftests/expected_cmptest.xml
@@ -14,25 +14,28 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="compare_tostring">
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[int, string]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(int,123)
Expected (expected): QVariant(QString,hi)]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[both invalid]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[null hash, invalid]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(QVariantHash)
Expected (expected): QVariant()]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[string, null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(QString,A simple string)
Expected (expected): QVariant(PhonyClass)]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="214">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="214">
<DataTag><![CDATA[both non-null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual): QVariant(PhonyClass,<value not representable as string>)
@@ -40,31 +43,37 @@
</Incident>
</TestFunction>
<TestFunction name="compareQStringLists">
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[empty lists]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[equal lists]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[last item different]]></DataTag>
<Description><![CDATA[Compared QStringLists differ at index 2.
Actual (opA) : 'string3'
Expected (opB) : 'DIFFERS']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[second-last item different]]></DataTag>
<Description><![CDATA[Compared QStringLists differ at index 2.
Actual (opA) : 'string3'
Expected (opB) : 'DIFFERS']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[prefix]]></DataTag>
<Description><![CDATA[Compared QStringLists have different sizes.
Actual (opA) size : '2'
Expected (opB) size: '1']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[short list second]]></DataTag>
<Description><![CDATA[Compared QStringLists have different sizes.
Actual (opA) size : '12'
Expected (opB) size: '1']]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="308">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="308">
<DataTag><![CDATA[short list first]]></DataTag>
<Description><![CDATA[Compared QStringLists have different sizes.
Actual (opA) size : '1'
@@ -72,55 +81,67 @@
</Incident>
</TestFunction>
<TestFunction name="compareQPixmaps">
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[both null]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull() : 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull() : 0
Expected (opB).isNull(): 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[equal]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ in size.
Actual (opA) : 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="333">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="333">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
</TestFunction>
<TestFunction name="compareQImages">
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[both null]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull() : 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull() : 0
Expected (opB).isNull(): 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[equal]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QImages differ in size.
Actual (opA) : 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[different format]]></DataTag>
<Description><![CDATA[Compared QImages differ in format.
Actual (opA) : 6
Expected (opB): 3]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="360">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="360">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
diff --git a/tests/auto/testlib/selftests/expected_commandlinedata.lightxml b/tests/auto/testlib/selftests/expected_commandlinedata.lightxml
index 8de90f05d8..37eb5f5a2b 100644
--- a/tests/auto/testlib/selftests/expected_commandlinedata.lightxml
+++ b/tests/auto/testlib/selftests/expected_commandlinedata.lightxml
@@ -10,30 +10,46 @@
<DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data2]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data2]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data3]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data3]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data4]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data4]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data5]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="fiveTablePasses">
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_commandlinedata.txt b/tests/auto/testlib/selftests/expected_commandlinedata.txt
index c1b97e2a30..10e4916b54 100644
--- a/tests/auto/testlib/selftests/expected_commandlinedata.txt
+++ b/tests/auto/testlib/selftests/expected_commandlinedata.txt
@@ -4,21 +4,25 @@ INFO : tst_DataTable::initTestCase() entering
PASS : tst_DataTable::initTestCase()
INFO : tst_DataTable::fiveTablePasses() entering
INFO : tst_DataTable::fiveTablePasses(fiveTablePasses_data1) QVERIFY(test)
- Loc: [tst_commandlinedata.cpp(30)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp(65)]
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data1)
INFO : tst_DataTable::fiveTablePasses(fiveTablePasses_data2) QVERIFY(test)
- Loc: [tst_commandlinedata.cpp(30)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp(65)]
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data2)
INFO : tst_DataTable::fiveTablePasses(fiveTablePasses_data3) QVERIFY(test)
- Loc: [tst_commandlinedata.cpp(30)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp(65)]
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data3)
INFO : tst_DataTable::fiveTablePasses(fiveTablePasses_data4) QVERIFY(test)
- Loc: [tst_commandlinedata.cpp(30)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp(65)]
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data4)
INFO : tst_DataTable::fiveTablePasses(fiveTablePasses_data5) QVERIFY(test)
- Loc: [tst_commandlinedata.cpp(30)]
-PASS : tst_DataTable::fiveTablePasses()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp(65)]
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data5)
INFO : tst_DataTable::fiveTablePasses() entering
INFO : tst_DataTable::fiveTablePasses(fiveTablePasses_data1) QVERIFY(test)
- Loc: [tst_commandlinedata.cpp(30)]
-PASS : tst_DataTable::fiveTablePasses()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp(65)]
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data1)
INFO : tst_DataTable::cleanupTestCase() entering
PASS : tst_DataTable::cleanupTestCase()
-Totals: 4 passed, 0 failed, 0 skipped
+Totals: 8 passed, 0 failed, 0 skipped
********* Finished testing of tst_DataTable *********
diff --git a/tests/auto/testlib/selftests/expected_commandlinedata.xml b/tests/auto/testlib/selftests/expected_commandlinedata.xml
index bfaf623330..2296ae8e74 100644
--- a/tests/auto/testlib/selftests/expected_commandlinedata.xml
+++ b/tests/auto/testlib/selftests/expected_commandlinedata.xml
@@ -12,30 +12,46 @@
<DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data2]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data2]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data3]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data3]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data4]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data4]]></DataTag>
+</Incident>
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data5]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="fiveTablePasses">
<Message type="info" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp" line="65">
<DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
<Description><![CDATA[QVERIFY(test)]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data1]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_counting.lightxml b/tests/auto/testlib/selftests/expected_counting.lightxml
index f16abef128..e7b1136417 100644
--- a/tests/auto/testlib/selftests/expected_counting.lightxml
+++ b/tests/auto/testlib/selftests/expected_counting.lightxml
@@ -6,73 +6,145 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testPassPass">
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="testPassSkip">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 1]]></DataTag>
+</Incident>
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
</TestFunction>
<TestFunction name="testPassFail">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 1]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="testSkipPass">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="testSkipSkip">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
</TestFunction>
<TestFunction name="testSkipFail">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="testFailPass">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="testFailSkip">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
</TestFunction>
<TestFunction name="testFailFail">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
+<TestFunction name="testFailInInit">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="233">
+ <DataTag><![CDATA[fail]]></DataTag>
+ <Description><![CDATA[Fail in init()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="testFailInCleanup">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail]]></DataTag>
+ <Description><![CDATA[This test function should execute and then QFAIL in cleanup() ]]></Description>
+</Message>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="241">
+ <DataTag><![CDATA[fail]]></DataTag>
+ <Description><![CDATA[Fail in cleanup()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="testSkipInInit">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="235">
+ <DataTag><![CDATA[skip]]></DataTag>
+ <Description><![CDATA[Skip in init()]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="testSkipInCleanup">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[skip]]></DataTag>
+ <Description><![CDATA[This test function should execute and then QSKIP in cleanup() ]]></Description>
+</Message>
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="243">
+ <DataTag><![CDATA[skip]]></DataTag>
+ <Description><![CDATA[Skip in cleanup()]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_counting.txt b/tests/auto/testlib/selftests/expected_counting.txt
index adf80012c7..5c17e3c257 100644
--- a/tests/auto/testlib/selftests/expected_counting.txt
+++ b/tests/auto/testlib/selftests/expected_counting.txt
@@ -1,32 +1,54 @@
********* Start testing of tst_Counting *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_Counting::initTestCase()
-PASS : tst_Counting::testPassPass()
+PASS : tst_Counting::testPassPass(row 1)
+PASS : tst_Counting::testPassPass(row 2)
+PASS : tst_Counting::testPassSkip(row 1)
SKIP : tst_Counting::testPassSkip(row 2) Skipping
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(102)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(117)]
+PASS : tst_Counting::testPassFail(row 1)
FAIL! : tst_Counting::testPassFail(row 2) 'false' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(114)]
SKIP : tst_Counting::testSkipPass(row 1) Skipping
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(102)]
-PASS : tst_Counting::testSkipPass()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(117)]
+PASS : tst_Counting::testSkipPass(row 2)
SKIP : tst_Counting::testSkipSkip(row 1) Skipping
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(102)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(117)]
SKIP : tst_Counting::testSkipSkip(row 2) Skipping
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(102)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(117)]
SKIP : tst_Counting::testSkipFail(row 1) Skipping
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(102)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(117)]
FAIL! : tst_Counting::testSkipFail(row 2) 'false' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(114)]
FAIL! : tst_Counting::testFailPass(row 1) 'false' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(114)]
+PASS : tst_Counting::testFailPass(row 2)
FAIL! : tst_Counting::testFailSkip(row 1) 'false' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(114)]
SKIP : tst_Counting::testFailSkip(row 2) Skipping
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(102)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(117)]
FAIL! : tst_Counting::testFailFail(row 1) 'false' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(114)]
FAIL! : tst_Counting::testFailFail(row 2) 'false' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(114)]
+PASS : tst_Counting::testFailInInit(before)
+FAIL! : tst_Counting::testFailInInit(fail) Fail in init()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(233)]
+PASS : tst_Counting::testFailInInit(after)
+PASS : tst_Counting::testFailInCleanup(before)
+QDEBUG : tst_Counting::testFailInCleanup(fail) This test function should execute and then QFAIL in cleanup()
+FAIL! : tst_Counting::testFailInCleanup(fail) Fail in cleanup()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(241)]
+PASS : tst_Counting::testFailInCleanup(after)
+PASS : tst_Counting::testSkipInInit(before)
+SKIP : tst_Counting::testSkipInInit(skip) Skip in init()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(235)]
+PASS : tst_Counting::testSkipInInit(after)
+PASS : tst_Counting::testSkipInCleanup(before)
+QDEBUG : tst_Counting::testSkipInCleanup(skip) This test function should execute and then QSKIP in cleanup()
+SKIP : tst_Counting::testSkipInCleanup(skip) Skip in cleanup()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp(243)]
+PASS : tst_Counting::testSkipInCleanup(after)
PASS : tst_Counting::cleanupTestCase()
-Totals: 4 passed, 6 failed, 6 skipped
+Totals: 16 passed, 8 failed, 8 skipped
********* Finished testing of tst_Counting *********
diff --git a/tests/auto/testlib/selftests/expected_counting.xml b/tests/auto/testlib/selftests/expected_counting.xml
index f5982d7052..a97296807d 100644
--- a/tests/auto/testlib/selftests/expected_counting.xml
+++ b/tests/auto/testlib/selftests/expected_counting.xml
@@ -8,73 +8,145 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testPassPass">
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="testPassSkip">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 1]]></DataTag>
+</Incident>
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
</TestFunction>
<TestFunction name="testPassFail">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 1]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="testSkipPass">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="testSkipSkip">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
</TestFunction>
<TestFunction name="testSkipFail">
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="testFailPass">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[row 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="testFailSkip">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
-<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="102">
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="117">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA[Skipping]]></Description>
</Message>
</TestFunction>
<TestFunction name="testFailFail">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 1]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="99">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="114">
<DataTag><![CDATA[row 2]]></DataTag>
<Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
+<TestFunction name="testFailInInit">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="233">
+ <DataTag><![CDATA[fail]]></DataTag>
+ <Description><![CDATA[Fail in init()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="testFailInCleanup">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[fail]]></DataTag>
+ <Description><![CDATA[This test function should execute and then QFAIL in cleanup() ]]></Description>
+</Message>
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="241">
+ <DataTag><![CDATA[fail]]></DataTag>
+ <Description><![CDATA[Fail in cleanup()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="testSkipInInit">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="235">
+ <DataTag><![CDATA[skip]]></DataTag>
+ <Description><![CDATA[Skip in init()]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="testSkipInCleanup">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[before]]></DataTag>
+</Incident>
+<Message type="qdebug" file="" line="0">
+ <DataTag><![CDATA[skip]]></DataTag>
+ <Description><![CDATA[This test function should execute and then QSKIP in cleanup() ]]></Description>
+</Message>
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/counting/tst_counting.cpp" line="243">
+ <DataTag><![CDATA[skip]]></DataTag>
+ <Description><![CDATA[Skip in cleanup()]]></Description>
+</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[after]]></DataTag>
+</Incident>
+</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_counting.xunitxml b/tests/auto/testlib/selftests/expected_counting.xunitxml
index c19a1612cb..f317ed5923 100644
--- a/tests/auto/testlib/selftests/expected_counting.xunitxml
+++ b/tests/auto/testlib/selftests/expected_counting.xunitxml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="6" failures="6" tests="11" name="tst_Counting">
+<testsuite errors="10" failures="8" tests="15" name="tst_Counting">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
</properties>
<testcase result="pass" name="initTestCase"/>
<testcase result="pass" name="testPassPass"/>
- <testcase name="testPassSkip">
+ <testcase result="pass" name="testPassSkip">
<!-- tag="row 2" message="Skipping" type="skip" -->
</testcase>
<testcase result="fail" name="testPassFail">
@@ -34,6 +34,20 @@
<failure tag="row 1" message="&apos;false&apos; returned FALSE. ()" result="fail"/>
<failure tag="row 2" message="&apos;false&apos; returned FALSE. ()" result="fail"/>
</testcase>
+ <testcase result="fail" name="testFailInInit">
+ <failure tag="fail" message="Fail in init()" result="fail"/>
+ </testcase>
+ <testcase result="fail" name="testFailInCleanup">
+ <!-- tag="fail" message="This test function should execute and then QFAIL in cleanup() " type="qdebug" -->
+ <failure tag="fail" message="Fail in cleanup()" result="fail"/>
+ </testcase>
+ <testcase result="pass" name="testSkipInInit">
+ <!-- tag="skip" message="Skip in init()" type="skip" -->
+ </testcase>
+ <testcase result="pass" name="testSkipInCleanup">
+ <!-- tag="skip" message="This test function should execute and then QSKIP in cleanup() " type="qdebug" -->
+ <!-- tag="skip" message="Skip in cleanup()" type="skip" -->
+ </testcase>
<testcase result="pass" name="cleanupTestCase"/>
<system-err>
<![CDATA[Skipping]]>
@@ -42,5 +56,9 @@
<![CDATA[Skipping]]>
<![CDATA[Skipping]]>
<![CDATA[Skipping]]>
+<![CDATA[This test function should execute and then QFAIL in cleanup() ]]>
+<![CDATA[Skip in init()]]>
+<![CDATA[This test function should execute and then QSKIP in cleanup() ]]>
+<![CDATA[Skip in cleanup()]]>
</system-err>
</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_crashes.lightxml b/tests/auto/testlib/selftests/expected_crashes.lightxml
deleted file mode 100644
index 76890deb75..0000000000
--- a/tests/auto/testlib/selftests/expected_crashes.lightxml
+++ /dev/null
@@ -1,15 +0,0 @@
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="crash">
-<Incident type="fail" file="Unknown file" line="0">
-<Message type="qfatal" file="" line="0">
- <Description><![CDATA[Received signal 11]]></Description>
-</Message>
- <Description><![CDATA[Received a fatal error.]]></Description>
-</Incident>
-</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_crashes.xml b/tests/auto/testlib/selftests/expected_crashes.xml
deleted file mode 100644
index be01e633e9..0000000000
--- a/tests/auto/testlib/selftests/expected_crashes.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<TestCase name="tst_Crashes">
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="crash">
-<Message type="qfatal" file="" line="0">
- <Description><![CDATA[Received signal 11]]></Description>
-</Message>
-<Incident type="fail" file="Unknown file" line="0">
- <Description><![CDATA[Received a fatal error.]]></Description>
-</Incident>
-</TestFunction>
-</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_datatable.lightxml b/tests/auto/testlib/selftests/expected_datatable.lightxml
index 1741b6f1e3..83ac0c0b5d 100644
--- a/tests/auto/testlib/selftests/expected_datatable.lightxml
+++ b/tests/auto/testlib/selftests/expected_datatable.lightxml
@@ -12,7 +12,21 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="fiveTablePasses">
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 2]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 3]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 4]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="fiveTableFailures">
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="91">
@@ -41,18 +55,54 @@
<DataTag><![CDATA[startsWithFailure_data 1]]></DataTag>
<Description><![CDATA['test' returned FALSE. ()]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 2]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 3]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 4]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="endsWithFailure">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 2]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 3]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 4]]></DataTag>
+</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="91">
<DataTag><![CDATA[endsWithFailure 5]]></DataTag>
<Description><![CDATA['test' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="failureInMiddle">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 2]]></DataTag>
+</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="91">
<DataTag><![CDATA[failureInMiddle_data 3]]></DataTag>
<Description><![CDATA['test' returned FALSE. ()]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 4]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="fiveIsolatedFailures">
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="173">
diff --git a/tests/auto/testlib/selftests/expected_datatable.txt b/tests/auto/testlib/selftests/expected_datatable.txt
index 4031ca22dd..68c33e6efd 100644
--- a/tests/auto/testlib/selftests/expected_datatable.txt
+++ b/tests/auto/testlib/selftests/expected_datatable.txt
@@ -3,33 +3,49 @@ Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE
PASS : tst_DataTable::initTestCase()
PASS : tst_DataTable::singleTestFunction1()
PASS : tst_DataTable::singleTestFunction2()
-PASS : tst_DataTable::fiveTablePasses()
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data 1)
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data 2)
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data 3)
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data 4)
+PASS : tst_DataTable::fiveTablePasses(fiveTablePasses_data 5)
FAIL! : tst_DataTable::fiveTableFailures(fiveTableFailures_data 1) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
FAIL! : tst_DataTable::fiveTableFailures(fiveTableFailures_data 2) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
FAIL! : tst_DataTable::fiveTableFailures(fiveTableFailures_data 3) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
FAIL! : tst_DataTable::fiveTableFailures(fiveTableFailures_data 4) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
FAIL! : tst_DataTable::fiveTableFailures(fiveTableFailures_data 5) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
FAIL! : tst_DataTable::startsWithFailure(startsWithFailure_data 1) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
+PASS : tst_DataTable::startsWithFailure(startsWithFailure_data 2)
+PASS : tst_DataTable::startsWithFailure(startsWithFailure_data 3)
+PASS : tst_DataTable::startsWithFailure(startsWithFailure_data 4)
+PASS : tst_DataTable::startsWithFailure(startsWithFailure_data 5)
+PASS : tst_DataTable::endsWithFailure(endsWithFailure 1)
+PASS : tst_DataTable::endsWithFailure(endsWithFailure 2)
+PASS : tst_DataTable::endsWithFailure(endsWithFailure 3)
+PASS : tst_DataTable::endsWithFailure(endsWithFailure 4)
FAIL! : tst_DataTable::endsWithFailure(endsWithFailure 5) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
+PASS : tst_DataTable::failureInMiddle(failureInMiddle_data 1)
+PASS : tst_DataTable::failureInMiddle(failureInMiddle_data 2)
FAIL! : tst_DataTable::failureInMiddle(failureInMiddle_data 3) 'test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(58)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(91)]
+PASS : tst_DataTable::failureInMiddle(failureInMiddle_data 4)
+PASS : tst_DataTable::failureInMiddle(failureInMiddle_data 5)
FAIL! : tst_DataTable::fiveIsolatedFailures(fiveIsolatedFailures_data 1) '!test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(140)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(173)]
FAIL! : tst_DataTable::fiveIsolatedFailures(fiveIsolatedFailures_data 2) '!test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(140)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(173)]
FAIL! : tst_DataTable::fiveIsolatedFailures(fiveIsolatedFailures_data 3) '!test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(140)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(173)]
FAIL! : tst_DataTable::fiveIsolatedFailures(fiveIsolatedFailures_data 4) '!test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(140)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(173)]
FAIL! : tst_DataTable::fiveIsolatedFailures(fiveIsolatedFailures_data 5) '!test' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(140)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp(173)]
PASS : tst_DataTable::cleanupTestCase()
-Totals: 5 passed, 13 failed, 0 skipped
+Totals: 21 passed, 13 failed, 0 skipped
********* Finished testing of tst_DataTable *********
diff --git a/tests/auto/testlib/selftests/expected_datatable.xml b/tests/auto/testlib/selftests/expected_datatable.xml
index ce123d836c..132b34ec4a 100644
--- a/tests/auto/testlib/selftests/expected_datatable.xml
+++ b/tests/auto/testlib/selftests/expected_datatable.xml
@@ -14,7 +14,21 @@
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="fiveTablePasses">
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 2]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 3]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 4]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[fiveTablePasses_data 5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="fiveTableFailures">
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="91">
@@ -43,18 +57,54 @@
<DataTag><![CDATA[startsWithFailure_data 1]]></DataTag>
<Description><![CDATA['test' returned FALSE. ()]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 2]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 3]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 4]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[startsWithFailure_data 5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="endsWithFailure">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 2]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 3]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[endsWithFailure 4]]></DataTag>
+</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="91">
<DataTag><![CDATA[endsWithFailure 5]]></DataTag>
<Description><![CDATA['test' returned FALSE. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="failureInMiddle">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 2]]></DataTag>
+</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="91">
<DataTag><![CDATA[failureInMiddle_data 3]]></DataTag>
<Description><![CDATA['test' returned FALSE. ()]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 4]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[failureInMiddle_data 5]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="fiveIsolatedFailures">
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datatable/tst_datatable.cpp" line="173">
diff --git a/tests/auto/testlib/selftests/expected_datetime.lightxml b/tests/auto/testlib/selftests/expected_datetime.lightxml
index 1b7e601585..17fd48a196 100644
--- a/tests/auto/testlib/selftests/expected_datetime.lightxml
+++ b/tests/auto/testlib/selftests/expected_datetime.lightxml
@@ -13,16 +13,24 @@
</Incident>
</TestFunction>
<TestFunction name="qurl">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[empty urls]]></DataTag>
+</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp" line="74">
+ <DataTag><![CDATA[empty rhs]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (operandA): http://example.com
Expected (operandB): ]]></Description>
</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp" line="74">
+ <DataTag><![CDATA[empty lhs]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (operandA):
Expected (operandB): http://example.com]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[same urls]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_datetime.txt b/tests/auto/testlib/selftests/expected_datetime.txt
index 70d5c5a70c..239886ca8e 100644
--- a/tests/auto/testlib/selftests/expected_datetime.txt
+++ b/tests/auto/testlib/selftests/expected_datetime.txt
@@ -5,14 +5,16 @@ FAIL! : tst_DateTime::dateTime() Compared values are not the same
Actual (local): 2000/05/03 04:03:04.000[local time]
Expected (utc): 2000/05/03 04:03:04.000[UTC]
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp(33)]
-FAIL! : tst_DateTime::qurl() Compared values are not the same
+PASS : tst_DateTime::qurl(empty urls)
+FAIL! : tst_DateTime::qurl(empty rhs) Compared values are not the same
Actual (operandA): http://example.com
Expected (operandB):
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp(41)]
-FAIL! : tst_DateTime::qurl() Compared values are not the same
+FAIL! : tst_DateTime::qurl(empty lhs) Compared values are not the same
Actual (operandA):
Expected (operandB): http://example.com
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp(41)]
+PASS : tst_DateTime::qurl(same urls)
PASS : tst_DateTime::cleanupTestCase()
-Totals: 2 passed, 3 failed, 0 skipped
+Totals: 4 passed, 3 failed, 0 skipped
********* Finished testing of tst_DateTime *********
diff --git a/tests/auto/testlib/selftests/expected_datetime.xml b/tests/auto/testlib/selftests/expected_datetime.xml
index d848e73c82..747ff13730 100644
--- a/tests/auto/testlib/selftests/expected_datetime.xml
+++ b/tests/auto/testlib/selftests/expected_datetime.xml
@@ -15,16 +15,24 @@
</Incident>
</TestFunction>
<TestFunction name="qurl">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[empty urls]]></DataTag>
+</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp" line="74">
+ <DataTag><![CDATA[empty rhs]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (operandA): http://example.com
Expected (operandB): ]]></Description>
</Incident>
<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/datetime/tst_datetime.cpp" line="74">
+ <DataTag><![CDATA[empty lhs]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (operandA):
Expected (operandB): http://example.com]]></Description>
</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[same urls]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_datetime.xunitxml b/tests/auto/testlib/selftests/expected_datetime.xunitxml
index b30d1c441f..f25e20674b 100644
--- a/tests/auto/testlib/selftests/expected_datetime.xunitxml
+++ b/tests/auto/testlib/selftests/expected_datetime.xunitxml
@@ -11,10 +11,10 @@
Expected (utc): 2000/05/03 04:03:04.000[UTC]" result="fail"/>
</testcase>
<testcase result="fail" name="qurl">
- <failure message="Compared values are not the same
+ <failure tag="empty rhs" message="Compared values are not the same
Actual (operandA): http://example.com
Expected (operandB): " result="fail"/>
- <failure message="Compared values are not the same
+ <failure tag="empty lhs" message="Compared values are not the same
Actual (operandA):
Expected (operandB): http://example.com" result="fail"/>
</testcase>
diff --git a/tests/auto/testlib/selftests/expected_expectfail.lightxml b/tests/auto/testlib/selftests/expected_expectfail.lightxml
index 02e4dde7d8..34f4f1e70b 100644
--- a/tests/auto/testlib/selftests/expected_expectfail.lightxml
+++ b/tests/auto/testlib/selftests/expected_expectfail.lightxml
@@ -9,7 +9,7 @@
<Message type="qdebug" file="" line="0">
<Description><![CDATA[begin]]></Description>
</Message>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="72">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="78">
<Description><![CDATA[This should xfail]]></Description>
</Incident>
<Message type="qdebug" file="" line="0">
@@ -21,59 +21,121 @@
<Message type="qdebug" file="" line="0">
<Description><![CDATA[begin]]></Description>
</Message>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="80">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="86">
<Description><![CDATA[This should xfail]]></Description>
</Incident>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="xfailTwice">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="90">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="96">
<Description><![CDATA[Already expecting a fail]]></Description>
</Incident>
</TestFunction>
<TestFunction name="xfailWithQString">
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="99">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="105">
<Description><![CDATA[A string]]></Description>
</Incident>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="104">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="110">
<Description><![CDATA[Bug 5 (The message)]]></Description>
</Incident>
<Incident type="pass" file="" line="0" />
</TestFunction>
-<TestFunction name="xfailDataDriven">
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="133">
+<TestFunction name="xfailDataDrivenWithQVerify">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 2]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="139">
<DataTag><![CDATA[Abort]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="133">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Abort]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="139">
<DataTag><![CDATA[Continue]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Continue]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="xfailDataDrivenWithQCompare">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 2]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="173">
+ <DataTag><![CDATA[Abort]]></DataTag>
+ <Description><![CDATA[This test should xfail]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Abort]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="173">
+ <DataTag><![CDATA[Continue]]></DataTag>
+ <Description><![CDATA[This test should xfail]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Continue]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="xfailOnWrongRow">
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[right row]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="xfailOnAnyRow">
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="168">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="208">
<DataTag><![CDATA[first row]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="168">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="208">
<DataTag><![CDATA[second row]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="xfailWithoutVerify">
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[QEXPECT_FAIL was called without any subsequent verification statements]]></Description>
+</Incident>
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[QEXPECT_FAIL was called without any subsequent verification statements]]></Description>
+</Incident>
</TestFunction>
<TestFunction name="xpass">
-<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="174">
- <Description><![CDATA['true' returned FALSE. ()]]></Description>
+<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="228">
+ <Description><![CDATA['true' returned TRUE unexpectedly. ()]]></Description>
</Incident>
</TestFunction>
-<TestFunction name="xpassDataDriven">
-<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="196">
+<TestFunction name="xpassDataDrivenWithQVerify">
+<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="250">
<DataTag><![CDATA[XPass]]></DataTag>
- <Description><![CDATA['true' returned FALSE. ()]]></Description>
+ <Description><![CDATA['true' returned TRUE unexpectedly. ()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="xpassDataDrivenWithQCompare">
+<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="271">
+ <DataTag><![CDATA[XPass]]></DataTag>
+ <Description><![CDATA[COMPARE()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass]]></DataTag>
</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
diff --git a/tests/auto/testlib/selftests/expected_expectfail.txt b/tests/auto/testlib/selftests/expected_expectfail.txt
index 1b98b6b561..bd4e2172d6 100644
--- a/tests/auto/testlib/selftests/expected_expectfail.txt
+++ b/tests/auto/testlib/selftests/expected_expectfail.txt
@@ -3,35 +3,53 @@ Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE
PASS : tst_ExpectFail::initTestCase()
QDEBUG : tst_ExpectFail::xfailAndContinue() begin
XFAIL : tst_ExpectFail::xfailAndContinue() This should xfail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(72)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(78)]
QDEBUG : tst_ExpectFail::xfailAndContinue() after
PASS : tst_ExpectFail::xfailAndContinue()
QDEBUG : tst_ExpectFail::xfailAndAbort() begin
XFAIL : tst_ExpectFail::xfailAndAbort() This should xfail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(80)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(86)]
PASS : tst_ExpectFail::xfailAndAbort()
FAIL! : tst_ExpectFail::xfailTwice() Already expecting a fail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(90)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(96)]
XFAIL : tst_ExpectFail::xfailWithQString() A string
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(99)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(105)]
XFAIL : tst_ExpectFail::xfailWithQString() Bug 5 (The message)
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(104)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(110)]
PASS : tst_ExpectFail::xfailWithQString()
-XFAIL : tst_ExpectFail::xfailDataDriven(Abort) This test should xfail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(133)]
-XFAIL : tst_ExpectFail::xfailDataDriven(Continue) This test should xfail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(133)]
-PASS : tst_ExpectFail::xfailDataDriven()
-PASS : tst_ExpectFail::xfailOnWrongRow()
+PASS : tst_ExpectFail::xfailDataDrivenWithQVerify(Pass 1)
+PASS : tst_ExpectFail::xfailDataDrivenWithQVerify(Pass 2)
+XFAIL : tst_ExpectFail::xfailDataDrivenWithQVerify(Abort) This test should xfail
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(139)]
+PASS : tst_ExpectFail::xfailDataDrivenWithQVerify(Abort)
+XFAIL : tst_ExpectFail::xfailDataDrivenWithQVerify(Continue) This test should xfail
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(139)]
+PASS : tst_ExpectFail::xfailDataDrivenWithQVerify(Continue)
+PASS : tst_ExpectFail::xfailDataDrivenWithQCompare(Pass 1)
+PASS : tst_ExpectFail::xfailDataDrivenWithQCompare(Pass 2)
+XFAIL : tst_ExpectFail::xfailDataDrivenWithQCompare(Abort) This test should xfail
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(173)]
+PASS : tst_ExpectFail::xfailDataDrivenWithQCompare(Abort)
+XFAIL : tst_ExpectFail::xfailDataDrivenWithQCompare(Continue) This test should xfail
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(173)]
+PASS : tst_ExpectFail::xfailDataDrivenWithQCompare(Continue)
+PASS : tst_ExpectFail::xfailOnWrongRow(right row)
XFAIL : tst_ExpectFail::xfailOnAnyRow(first row) This test should xfail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(168)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(208)]
+PASS : tst_ExpectFail::xfailOnAnyRow(first row)
XFAIL : tst_ExpectFail::xfailOnAnyRow(second row) This test should xfail
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(168)]
-PASS : tst_ExpectFail::xfailOnAnyRow()
-XPASS : tst_ExpectFail::xpass() 'true' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(172)]
-XPASS : tst_ExpectFail::xpassDataDriven(XPass) 'true' returned FALSE. ()
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(196)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(208)]
+PASS : tst_ExpectFail::xfailOnAnyRow(second row)
+FAIL! : tst_ExpectFail::xfailWithoutVerify(first row) QEXPECT_FAIL was called without any subsequent verification statements
+FAIL! : tst_ExpectFail::xfailWithoutVerify(second row) QEXPECT_FAIL was called without any subsequent verification statements
+XPASS : tst_ExpectFail::xpass() 'true' returned TRUE unexpectedly. ()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(228)]
+XPASS : tst_ExpectFail::xpassDataDrivenWithQVerify(XPass) 'true' returned TRUE unexpectedly. ()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(250)]
+PASS : tst_ExpectFail::xpassDataDrivenWithQVerify(Pass)
+XPASS : tst_ExpectFail::xpassDataDrivenWithQCompare(XPass) COMPARE()
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp(271)]
+PASS : tst_ExpectFail::xpassDataDrivenWithQCompare(Pass)
PASS : tst_ExpectFail::cleanupTestCase()
-Totals: 8 passed, 3 failed, 0 skipped
+Totals: 18 passed, 6 failed, 0 skipped
********* Finished testing of tst_ExpectFail *********
diff --git a/tests/auto/testlib/selftests/expected_expectfail.xml b/tests/auto/testlib/selftests/expected_expectfail.xml
index 74b11fb0e5..ff870a6a68 100644
--- a/tests/auto/testlib/selftests/expected_expectfail.xml
+++ b/tests/auto/testlib/selftests/expected_expectfail.xml
@@ -11,7 +11,7 @@
<Message type="qdebug" file="" line="0">
<Description><![CDATA[begin]]></Description>
</Message>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="72">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="78">
<Description><![CDATA[This should xfail]]></Description>
</Incident>
<Message type="qdebug" file="" line="0">
@@ -23,59 +23,121 @@
<Message type="qdebug" file="" line="0">
<Description><![CDATA[begin]]></Description>
</Message>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="80">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="86">
<Description><![CDATA[This should xfail]]></Description>
</Incident>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="xfailTwice">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="90">
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="96">
<Description><![CDATA[Already expecting a fail]]></Description>
</Incident>
</TestFunction>
<TestFunction name="xfailWithQString">
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="99">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="105">
<Description><![CDATA[A string]]></Description>
</Incident>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="104">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="110">
<Description><![CDATA[Bug 5 (The message)]]></Description>
</Incident>
<Incident type="pass" file="" line="0" />
</TestFunction>
-<TestFunction name="xfailDataDriven">
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="133">
+<TestFunction name="xfailDataDrivenWithQVerify">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 2]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="139">
<DataTag><![CDATA[Abort]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="133">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Abort]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="139">
<DataTag><![CDATA[Continue]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Continue]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="xfailDataDrivenWithQCompare">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 1]]></DataTag>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass 2]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="173">
+ <DataTag><![CDATA[Abort]]></DataTag>
+ <Description><![CDATA[This test should xfail]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Abort]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="173">
+ <DataTag><![CDATA[Continue]]></DataTag>
+ <Description><![CDATA[This test should xfail]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Continue]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="xfailOnWrongRow">
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[right row]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="xfailOnAnyRow">
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="168">
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="208">
<DataTag><![CDATA[first row]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="168">
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+</Incident>
+<Incident type="xfail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="208">
<DataTag><![CDATA[second row]]></DataTag>
<Description><![CDATA[This test should xfail]]></Description>
</Incident>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="xfailWithoutVerify">
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[QEXPECT_FAIL was called without any subsequent verification statements]]></Description>
+</Incident>
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[QEXPECT_FAIL was called without any subsequent verification statements]]></Description>
+</Incident>
</TestFunction>
<TestFunction name="xpass">
-<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="174">
- <Description><![CDATA['true' returned FALSE. ()]]></Description>
+<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="228">
+ <Description><![CDATA['true' returned TRUE unexpectedly. ()]]></Description>
</Incident>
</TestFunction>
-<TestFunction name="xpassDataDriven">
-<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="196">
+<TestFunction name="xpassDataDrivenWithQVerify">
+<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="250">
<DataTag><![CDATA[XPass]]></DataTag>
- <Description><![CDATA['true' returned FALSE. ()]]></Description>
+ <Description><![CDATA['true' returned TRUE unexpectedly. ()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass]]></DataTag>
+</Incident>
+</TestFunction>
+<TestFunction name="xpassDataDrivenWithQCompare">
+<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp" line="271">
+ <DataTag><![CDATA[XPass]]></DataTag>
+ <Description><![CDATA[COMPARE()]]></Description>
+</Incident>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[Pass]]></DataTag>
</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
diff --git a/tests/auto/testlib/selftests/expected_expectfail.xunitxml b/tests/auto/testlib/selftests/expected_expectfail.xunitxml
index 017e4501c1..6040af41ff 100644
--- a/tests/auto/testlib/selftests/expected_expectfail.xunitxml
+++ b/tests/auto/testlib/selftests/expected_expectfail.xunitxml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="11" failures="3" tests="11" name="tst_ExpectFail">
+<testsuite errors="13" failures="6" tests="14" name="tst_ExpectFail">
<properties>
- <property value="5.0.0" name="QTestVersion"/>
- <property value="5.0.0" name="QtVersion"/>
+ <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+ <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
</properties>
<testcase result="pass" name="initTestCase"/>
<testcase result="xfail" name="xfailAndContinue">
@@ -21,7 +21,11 @@
<!-- message="A string" type="info" -->
<!-- message="Bug 5 (The message)" type="info" -->
</testcase>
- <testcase result="xfail" name="xfailDataDriven">
+ <testcase result="xfail" name="xfailDataDrivenWithQVerify">
+ <!-- tag="Abort" message="This test should xfail" type="info" -->
+ <!-- tag="Continue" message="This test should xfail" type="info" -->
+ </testcase>
+ <testcase result="xfail" name="xfailDataDrivenWithQCompare">
<!-- tag="Abort" message="This test should xfail" type="info" -->
<!-- tag="Continue" message="This test should xfail" type="info" -->
</testcase>
@@ -30,11 +34,18 @@
<!-- tag="first row" message="This test should xfail" type="info" -->
<!-- tag="second row" message="This test should xfail" type="info" -->
</testcase>
+ <testcase result="fail" name="xfailWithoutVerify">
+ <failure tag="first row" message="QEXPECT_FAIL was called without any subsequent verification statements" result="fail"/>
+ <failure tag="second row" message="QEXPECT_FAIL was called without any subsequent verification statements" result="fail"/>
+ </testcase>
<testcase result="xpass" name="xpass">
- <failure message="&apos;true&apos; returned FALSE. ()" result="xpass"/>
+ <failure message="&apos;true&apos; returned TRUE unexpectedly. ()" result="xpass"/>
</testcase>
- <testcase result="xpass" name="xpassDataDriven">
- <failure tag="XPass" message="&apos;true&apos; returned FALSE. ()" result="xpass"/>
+ <testcase result="xpass" name="xpassDataDrivenWithQVerify">
+ <failure tag="XPass" message="&apos;true&apos; returned TRUE unexpectedly. ()" result="xpass"/>
+ </testcase>
+ <testcase result="xpass" name="xpassDataDrivenWithQCompare">
+ <failure tag="XPass" message="COMPARE()" result="xpass"/>
</testcase>
<testcase result="pass" name="cleanupTestCase"/>
<system-err>
@@ -49,5 +60,7 @@
<![CDATA[This test should xfail]]>
<![CDATA[This test should xfail]]>
<![CDATA[This test should xfail]]>
+<![CDATA[This test should xfail]]>
+<![CDATA[This test should xfail]]>
</system-err>
</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_benchliboptions.lightxml b/tests/auto/testlib/selftests/expected_failcleanup.lightxml
index 63d0218b2c..83ce7a7b15 100644
--- a/tests/auto/testlib/selftests/expected_benchliboptions.lightxml
+++ b/tests/auto/testlib/selftests/expected_failcleanup.lightxml
@@ -5,11 +5,11 @@
<TestFunction name="initTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
-<TestFunction name="threeEvents">
-<Incident type="pass" file="" line="0">
-<BenchmarkResult metric="walltime" tag="" value="210" iterations="4194304" />
-</Incident>
+<TestFunction name="aTestFunction">
+<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp" line="59">
+ <Description><![CDATA['false' returned FALSE. (Fail inside cleanupTestCase)]]></Description>
+</Incident>
</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_failcleanup.txt b/tests/auto/testlib/selftests/expected_failcleanup.txt
new file mode 100644
index 0000000000..08c10b1823
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_failcleanup.txt
@@ -0,0 +1,8 @@
+********* Start testing of tst_FailCleanup *********
+Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
+PASS : tst_FailCleanup::initTestCase()
+PASS : tst_FailCleanup::aTestFunction()
+FAIL! : tst_FailCleanup::cleanupTestCase() 'false' returned FALSE. (Fail inside cleanupTestCase)
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp(59)]
+Totals: 2 passed, 1 failed, 0 skipped
+********* Finished testing of tst_FailCleanup *********
diff --git a/tests/auto/testlib/selftests/expected_benchlibcallgrind.xml b/tests/auto/testlib/selftests/expected_failcleanup.xml
index b29b9c569e..5d0d2c5751 100644
--- a/tests/auto/testlib/selftests/expected_benchlibcallgrind.xml
+++ b/tests/auto/testlib/selftests/expected_failcleanup.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<TestCase name="tst_BenchlibCallgrind">
+<TestCase name="tst_FailCleanup">
<Environment>
<QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
<QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
@@ -7,11 +7,12 @@
<TestFunction name="initTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
-<TestFunction name="twoHundredMillionInstructions">
-<BenchmarkResult metric="InstructionReads" tag="" value="200000000" iterations="1" />
+<TestFunction name="aTestFunction">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
+<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp" line="59">
+ <Description><![CDATA['false' returned FALSE. (Fail inside cleanupTestCase)]]></Description>
+</Incident>
</TestFunction>
</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_benchlibcallgrind.xunitxml b/tests/auto/testlib/selftests/expected_failcleanup.xunitxml
index cc58f7fdd4..6e35566be8 100644
--- a/tests/auto/testlib/selftests/expected_benchlibcallgrind.xunitxml
+++ b/tests/auto/testlib/selftests/expected_failcleanup.xunitxml
@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="0" tests="3" name="tst_BenchlibCallgrind">
+<testsuite errors="0" failures="1" tests="3" name="tst_FailCleanup">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
</properties>
<testcase result="pass" name="initTestCase"/>
- <testcase result="pass" name="twoHundredMillionInstructions">
+ <testcase result="pass" name="aTestFunction"/>
+ <testcase result="fail" name="cleanupTestCase">
+ <failure message="&apos;false&apos; returned FALSE. (Fail inside cleanupTestCase)" result="fail"/>
</testcase>
- <testcase result="pass" name="cleanupTestCase"/>
<system-err/>
</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_float.lightxml b/tests/auto/testlib/selftests/expected_float.lightxml
deleted file mode 100644
index a34618cf02..0000000000
--- a/tests/auto/testlib/selftests/expected_float.lightxml
+++ /dev/null
@@ -1,44 +0,0 @@
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="floatComparisons">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="61">
- <DataTag><![CDATA[should FAIL]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (operandLeft): 1
- Expected (operandRight): 3]]></Description>
-</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="61">
- <DataTag><![CDATA[should FAIL]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (operandLeft): 1e-07
- Expected (operandRight): 3e-07]]></Description>
-</Incident>
-</TestFunction>
-<TestFunction name="compareFloatTests">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="100">
- <DataTag><![CDATA[1e0]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (t1): 1
- Expected (t3): 3]]></Description>
-</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="100">
- <DataTag><![CDATA[1e-7]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (t1): 1e-07
- Expected (t3): 3e-07]]></Description>
-</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="100">
- <DataTag><![CDATA[1e+7]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (t1): 1e+07
- Expected (t3): 3e+07]]></Description>
-</Incident>
-</TestFunction>
-<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_float.txt b/tests/auto/testlib/selftests/expected_float.txt
index acd0aaa54a..6ebbeffde5 100644
--- a/tests/auto/testlib/selftests/expected_float.txt
+++ b/tests/auto/testlib/selftests/expected_float.txt
@@ -1,26 +1,32 @@
********* Start testing of tst_float *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_float::initTestCase()
-FAIL! : tst_float::floatComparisons(should FAIL) Compared floats are not the same (fuzzy compare)
+PASS : tst_float::floatComparisons(should SUCCEED 1)
+FAIL! : tst_float::floatComparisons(should FAIL 1) Compared floats are not the same (fuzzy compare)
Actual (operandLeft): 1
Expected (operandRight): 3
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(61)]
-FAIL! : tst_float::floatComparisons(should FAIL) Compared floats are not the same (fuzzy compare)
+FAIL! : tst_float::floatComparisons(should FAIL 2) Compared floats are not the same (fuzzy compare)
Actual (operandLeft): 1e-07
Expected (operandRight): 3e-07
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(61)]
+FAIL! : tst_float::floatComparisons(should FAIL 3) Compared floats are not the same (fuzzy compare)
+ Actual (operandLeft): 99998
+ Expected (operandRight): 99999
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(61)]
+PASS : tst_float::floatComparisons(should SUCCEED 2)
FAIL! : tst_float::compareFloatTests(1e0) Compared floats are not the same (fuzzy compare)
Actual (t1): 1
Expected (t3): 3
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(100)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(104)]
FAIL! : tst_float::compareFloatTests(1e-7) Compared floats are not the same (fuzzy compare)
Actual (t1): 1e-07
Expected (t3): 3e-07
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(100)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(104)]
FAIL! : tst_float::compareFloatTests(1e+7) Compared floats are not the same (fuzzy compare)
Actual (t1): 1e+07
Expected (t3): 3e+07
- Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(100)]
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp(104)]
PASS : tst_float::cleanupTestCase()
-Totals: 2 passed, 5 failed, 0 skipped
+Totals: 4 passed, 6 failed, 0 skipped
********* Finished testing of tst_float *********
diff --git a/tests/auto/testlib/selftests/expected_float.xml b/tests/auto/testlib/selftests/expected_float.xml
deleted file mode 100644
index a9c7428250..0000000000
--- a/tests/auto/testlib/selftests/expected_float.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<TestCase name="tst_float">
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="floatComparisons">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="61">
- <DataTag><![CDATA[should FAIL]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (operandLeft): 1
- Expected (operandRight): 3]]></Description>
-</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="61">
- <DataTag><![CDATA[should FAIL]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (operandLeft): 1e-07
- Expected (operandRight): 3e-07]]></Description>
-</Incident>
-</TestFunction>
-<TestFunction name="compareFloatTests">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="100">
- <DataTag><![CDATA[1e0]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (t1): 1
- Expected (t3): 3]]></Description>
-</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="100">
- <DataTag><![CDATA[1e-7]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (t1): 1e-07
- Expected (t3): 3e-07]]></Description>
-</Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/float/tst_float.cpp" line="100">
- <DataTag><![CDATA[1e+7]]></DataTag>
- <Description><![CDATA[Compared floats are not the same (fuzzy compare)
- Actual (t1): 1e+07
- Expected (t3): 3e+07]]></Description>
-</Incident>
-</TestFunction>
-<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_float.xunitxml b/tests/auto/testlib/selftests/expected_float.xunitxml
deleted file mode 100644
index f88e5e410e..0000000000
--- a/tests/auto/testlib/selftests/expected_float.xunitxml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="5" tests="4" name="tst_float">
- <properties>
- <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
- <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
- </properties>
- <testcase result="pass" name="initTestCase"/>
- <testcase result="fail" name="floatComparisons">
- <failure tag="should FAIL" message="Compared floats are not the same (fuzzy compare)
- Actual (operandLeft): 1
- Expected (operandRight): 3" result="fail"/>
- <failure tag="should FAIL" message="Compared floats are not the same (fuzzy compare)
- Actual (operandLeft): 1e&#x002D;07
- Expected (operandRight): 3e&#x002D;07" result="fail"/>
- </testcase>
- <testcase result="fail" name="compareFloatTests">
- <failure tag="1e0" message="Compared floats are not the same (fuzzy compare)
- Actual (t1): 1
- Expected (t3): 3" result="fail"/>
- <failure tag="1e&#x002D;7" message="Compared floats are not the same (fuzzy compare)
- Actual (t1): 1e&#x002D;07
- Expected (t3): 3e&#x002D;07" result="fail"/>
- <failure tag="1e+7" message="Compared floats are not the same (fuzzy compare)
- Actual (t1): 1e+07
- Expected (t3): 3e+07" result="fail"/>
- </testcase>
- <testcase result="pass" name="cleanupTestCase"/>
- <system-err/>
-</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_globaldata.lightxml b/tests/auto/testlib/selftests/expected_globaldata.lightxml
index 7a50f01cb8..6d68bfbdb5 100644
--- a/tests/auto/testlib/selftests/expected_globaldata.lightxml
+++ b/tests/auto/testlib/selftests/expected_globaldata.lightxml
@@ -25,6 +25,9 @@
<DataTag><![CDATA[1:local 1]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[init testGlobal local 2 ]]></Description>
@@ -41,6 +44,9 @@
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 2 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 2]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[2:local 1]]></DataTag>
<Description><![CDATA[init testGlobal local 1 ]]></Description>
@@ -57,6 +63,9 @@
<DataTag><![CDATA[2:local 1]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[2:local 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[2:local 2]]></DataTag>
<Description><![CDATA[init testGlobal local 2 ]]></Description>
@@ -73,7 +82,9 @@
<DataTag><![CDATA[2:local 2]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 2 ]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[2:local 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="skip">
<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/globaldata/tst_globaldata.cpp" line="129">
@@ -120,6 +131,9 @@
<DataTag><![CDATA[1:local 1]]></DataTag>
<Description><![CDATA[cleanup skipSingle local 1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[init skipSingle local 2 ]]></Description>
@@ -132,6 +146,9 @@
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[cleanup skipSingle local 2 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 2]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[2:local 1]]></DataTag>
<Description><![CDATA[init skipSingle local 1 ]]></Description>
@@ -156,7 +173,9 @@
<DataTag><![CDATA[2:local 2]]></DataTag>
<Description><![CDATA[cleanup skipSingle local 2 ]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[2:local 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Message type="qdebug" file="" line="0">
diff --git a/tests/auto/testlib/selftests/expected_globaldata.txt b/tests/auto/testlib/selftests/expected_globaldata.txt
index e3905e2fa3..59b95fa253 100644
--- a/tests/auto/testlib/selftests/expected_globaldata.txt
+++ b/tests/auto/testlib/selftests/expected_globaldata.txt
@@ -6,19 +6,22 @@ QDEBUG : tst_globaldata::testGlobal(1:local 1) init testGlobal local 1
QDEBUG : tst_globaldata::testGlobal(1:local 1) global: false
QDEBUG : tst_globaldata::testGlobal(1:local 1) local: false
QDEBUG : tst_globaldata::testGlobal(1:local 1) cleanup testGlobal local 1
+PASS : tst_globaldata::testGlobal(1:local 1)
QDEBUG : tst_globaldata::testGlobal(1:local 2) init testGlobal local 2
QDEBUG : tst_globaldata::testGlobal(1:local 2) global: false
QDEBUG : tst_globaldata::testGlobal(1:local 2) local: true
QDEBUG : tst_globaldata::testGlobal(1:local 2) cleanup testGlobal local 2
+PASS : tst_globaldata::testGlobal(1:local 2)
QDEBUG : tst_globaldata::testGlobal(2:local 1) init testGlobal local 1
QDEBUG : tst_globaldata::testGlobal(2:local 1) global: true
QDEBUG : tst_globaldata::testGlobal(2:local 1) local: false
QDEBUG : tst_globaldata::testGlobal(2:local 1) cleanup testGlobal local 1
+PASS : tst_globaldata::testGlobal(2:local 1)
QDEBUG : tst_globaldata::testGlobal(2:local 2) init testGlobal local 2
QDEBUG : tst_globaldata::testGlobal(2:local 2) global: true
QDEBUG : tst_globaldata::testGlobal(2:local 2) local: true
QDEBUG : tst_globaldata::testGlobal(2:local 2) cleanup testGlobal local 2
-PASS : tst_globaldata::testGlobal()
+PASS : tst_globaldata::testGlobal(2:local 2)
SKIP : tst_globaldata::skip(1) skipping
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/globaldata/tst_globaldata.cpp(129)]
QDEBUG : tst_globaldata::skipLocal(1:local 1) init skipLocal local 1
@@ -32,9 +35,11 @@ QDEBUG : tst_globaldata::skipLocal(1:local 2) cleanup skipLocal local 2
QDEBUG : tst_globaldata::skipSingle(1:local 1) init skipSingle local 1
QDEBUG : tst_globaldata::skipSingle(1:local 1) global: false local: false
QDEBUG : tst_globaldata::skipSingle(1:local 1) cleanup skipSingle local 1
+PASS : tst_globaldata::skipSingle(1:local 1)
QDEBUG : tst_globaldata::skipSingle(1:local 2) init skipSingle local 2
QDEBUG : tst_globaldata::skipSingle(1:local 2) global: false local: true
QDEBUG : tst_globaldata::skipSingle(1:local 2) cleanup skipSingle local 2
+PASS : tst_globaldata::skipSingle(1:local 2)
QDEBUG : tst_globaldata::skipSingle(2:local 1) init skipSingle local 1
SKIP : tst_globaldata::skipSingle(2:local 1) skipping
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/globaldata/tst_globaldata.cpp(143)]
@@ -42,8 +47,8 @@ QDEBUG : tst_globaldata::skipSingle(2:local 1) cleanup skipSingle local 1
QDEBUG : tst_globaldata::skipSingle(2:local 2) init skipSingle local 2
QDEBUG : tst_globaldata::skipSingle(2:local 2) global: true local: true
QDEBUG : tst_globaldata::skipSingle(2:local 2) cleanup skipSingle local 2
-PASS : tst_globaldata::skipSingle()
+PASS : tst_globaldata::skipSingle(2:local 2)
QDEBUG : tst_globaldata::cleanupTestCase() cleanupTestCase cleanupTestCase (null)
PASS : tst_globaldata::cleanupTestCase()
-Totals: 4 passed, 0 failed, 4 skipped
+Totals: 9 passed, 0 failed, 4 skipped
********* Finished testing of tst_globaldata *********
diff --git a/tests/auto/testlib/selftests/expected_globaldata.xml b/tests/auto/testlib/selftests/expected_globaldata.xml
index 9abbeeef35..09edaacd43 100644
--- a/tests/auto/testlib/selftests/expected_globaldata.xml
+++ b/tests/auto/testlib/selftests/expected_globaldata.xml
@@ -27,6 +27,9 @@
<DataTag><![CDATA[1:local 1]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[init testGlobal local 2 ]]></Description>
@@ -43,6 +46,9 @@
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 2 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 2]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[2:local 1]]></DataTag>
<Description><![CDATA[init testGlobal local 1 ]]></Description>
@@ -59,6 +65,9 @@
<DataTag><![CDATA[2:local 1]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[2:local 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[2:local 2]]></DataTag>
<Description><![CDATA[init testGlobal local 2 ]]></Description>
@@ -75,7 +84,9 @@
<DataTag><![CDATA[2:local 2]]></DataTag>
<Description><![CDATA[cleanup testGlobal local 2 ]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[2:local 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="skip">
<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/globaldata/tst_globaldata.cpp" line="129">
@@ -122,6 +133,9 @@
<DataTag><![CDATA[1:local 1]]></DataTag>
<Description><![CDATA[cleanup skipSingle local 1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[init skipSingle local 2 ]]></Description>
@@ -134,6 +148,9 @@
<DataTag><![CDATA[1:local 2]]></DataTag>
<Description><![CDATA[cleanup skipSingle local 2 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[1:local 2]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[2:local 1]]></DataTag>
<Description><![CDATA[init skipSingle local 1 ]]></Description>
@@ -158,7 +175,9 @@
<DataTag><![CDATA[2:local 2]]></DataTag>
<Description><![CDATA[cleanup skipSingle local 2 ]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[2:local 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Message type="qdebug" file="" line="0">
diff --git a/tests/auto/testlib/selftests/expected_multiexec.lightxml b/tests/auto/testlib/selftests/expected_multiexec.lightxml
deleted file mode 100644
index 1a66e92f8f..0000000000
--- a/tests/auto/testlib/selftests/expected_multiexec.lightxml
+++ /dev/null
@@ -1,13 +0,0 @@
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="nothing">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_multiexec.xunitxml b/tests/auto/testlib/selftests/expected_multiexec.xunitxml
deleted file mode 100644
index 6bc04c3ddd..0000000000
--- a/tests/auto/testlib/selftests/expected_multiexec.xunitxml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="0" tests="3" name="tst_Nothing">
- <properties>
- <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
- <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
- </properties>
- <testcase result="pass" name="initTestCase"/>
- <testcase result="pass" name="nothing"/>
- <testcase result="pass" name="cleanupTestCase"/>
- <system-err/>
-</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_qexecstringlist.txt b/tests/auto/testlib/selftests/expected_qexecstringlist.txt
index 87df97af48..da283e106f 100644
--- a/tests/auto/testlib/selftests/expected_qexecstringlist.txt
+++ b/tests/auto/testlib/selftests/expected_qexecstringlist.txt
@@ -2,19 +2,23 @@
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_QExecStringList::initTestCase()
PASS : tst_QExecStringList::testA()
-PASS : tst_QExecStringList::testB()
+PASS : tst_QExecStringList::testB(Data1)
+PASS : tst_QExecStringList::testB(Data2)
+PASS : tst_QExecStringList::testB(Data3)
PASS : tst_QExecStringList::testC()
PASS : tst_QExecStringList::cleanupTestCase()
-Totals: 5 passed, 0 failed, 0 skipped
+Totals: 7 passed, 0 failed, 0 skipped
********* Finished testing of tst_QExecStringList *********
********* Start testing of tst_QExecStringList *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_QExecStringList::initTestCase()
PASS : tst_QExecStringList::testA()
-PASS : tst_QExecStringList::testB()
+PASS : tst_QExecStringList::testB(Data1)
+PASS : tst_QExecStringList::testB(Data2)
+PASS : tst_QExecStringList::testB(Data3)
PASS : tst_QExecStringList::testC()
PASS : tst_QExecStringList::cleanupTestCase()
-Totals: 5 passed, 0 failed, 0 skipped
+Totals: 7 passed, 0 failed, 0 skipped
********* Finished testing of tst_QExecStringList *********
********* Start testing of tst_QExecStringList *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
@@ -26,14 +30,16 @@ Totals: 3 passed, 0 failed, 0 skipped
********* Start testing of tst_QExecStringList *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_QExecStringList::initTestCase()
-PASS : tst_QExecStringList::testB()
+PASS : tst_QExecStringList::testB(Data1)
+PASS : tst_QExecStringList::testB(Data2)
+PASS : tst_QExecStringList::testB(Data3)
PASS : tst_QExecStringList::cleanupTestCase()
-Totals: 3 passed, 0 failed, 0 skipped
+Totals: 5 passed, 0 failed, 0 skipped
********* Finished testing of tst_QExecStringList *********
********* Start testing of tst_QExecStringList *********
Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_QExecStringList::initTestCase()
-PASS : tst_QExecStringList::testB()
+PASS : tst_QExecStringList::testB(Data2)
PASS : tst_QExecStringList::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of tst_QExecStringList *********
diff --git a/tests/auto/testlib/selftests/expected_skip.lightxml b/tests/auto/testlib/selftests/expected_skip.lightxml
index 8399a76fa2..b01570e275 100644
--- a/tests/auto/testlib/selftests/expected_skip.lightxml
+++ b/tests/auto/testlib/selftests/expected_skip.lightxml
@@ -24,7 +24,9 @@
<DataTag><![CDATA[local 2]]></DataTag>
<Description><![CDATA[this line should only be reached once (true)]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[local 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_skip.txt b/tests/auto/testlib/selftests/expected_skip.txt
index e18386e109..fadbc966f0 100644
--- a/tests/auto/testlib/selftests/expected_skip.txt
+++ b/tests/auto/testlib/selftests/expected_skip.txt
@@ -8,7 +8,7 @@ SKIP : tst_Skip::emptytest() skipping all
SKIP : tst_Skip::singleSkip(local 1) skipping one
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/skip/tst_skip.cpp(97)]
QDEBUG : tst_Skip::singleSkip(local 2) this line should only be reached once (true)
-PASS : tst_Skip::singleSkip()
+PASS : tst_Skip::singleSkip(local 2)
PASS : tst_Skip::cleanupTestCase()
Totals: 3 passed, 0 failed, 3 skipped
********* Finished testing of tst_Skip *********
diff --git a/tests/auto/testlib/selftests/expected_skip.xml b/tests/auto/testlib/selftests/expected_skip.xml
index d0e45d0ff8..6609c0464a 100644
--- a/tests/auto/testlib/selftests/expected_skip.xml
+++ b/tests/auto/testlib/selftests/expected_skip.xml
@@ -26,7 +26,9 @@
<DataTag><![CDATA[local 2]]></DataTag>
<Description><![CDATA[this line should only be reached once (true)]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[local 2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
diff --git a/tests/auto/testlib/selftests/expected_benchlibcallgrind.lightxml b/tests/auto/testlib/selftests/expected_skipcleanup.lightxml
index c2394e545e..d2bc3b766e 100644
--- a/tests/auto/testlib/selftests/expected_benchlibcallgrind.lightxml
+++ b/tests/auto/testlib/selftests/expected_skipcleanup.lightxml
@@ -5,10 +5,11 @@
<TestFunction name="initTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
-<TestFunction name="twoHundredMillionInstructions">
-<BenchmarkResult metric="InstructionReads" tag="" value="200000000" iterations="1" />
+<TestFunction name="aTestFunction">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp" line="59">
+ <Description><![CDATA[Skip inside cleanupTestCase.]]></Description>
+</Message>
</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_skipcleanup.txt b/tests/auto/testlib/selftests/expected_skipcleanup.txt
new file mode 100644
index 0000000000..c97f31c2a9
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_skipcleanup.txt
@@ -0,0 +1,8 @@
+********* Start testing of tst_SkipCleanup *********
+Config: Using QTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
+PASS : tst_SkipCleanup::initTestCase()
+PASS : tst_SkipCleanup::aTestFunction()
+SKIP : tst_SkipCleanup::cleanupTestCase() Skip inside cleanupTestCase.
+ Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp(59)]
+Totals: 2 passed, 0 failed, 1 skipped
+********* Finished testing of tst_SkipCleanup *********
diff --git a/tests/auto/testlib/selftests/expected_multiexec.xml b/tests/auto/testlib/selftests/expected_skipcleanup.xml
index 7f71f6edac..8fbfc7711c 100644
--- a/tests/auto/testlib/selftests/expected_multiexec.xml
+++ b/tests/auto/testlib/selftests/expected_skipcleanup.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<TestCase name="tst_Nothing">
+<TestCase name="tst_SkipCleanup">
<Environment>
<QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
<QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
@@ -7,10 +7,12 @@
<TestFunction name="initTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
-<TestFunction name="nothing">
+<TestFunction name="aTestFunction">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
+<Message type="skip" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp" line="59">
+ <Description><![CDATA[Skip inside cleanupTestCase.]]></Description>
+</Message>
</TestFunction>
</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_crashes.xunitxml b/tests/auto/testlib/selftests/expected_skipcleanup.xunitxml
index 558491c598..b8f67e2d07 100644
--- a/tests/auto/testlib/selftests/expected_crashes.xunitxml
+++ b/tests/auto/testlib/selftests/expected_skipcleanup.xunitxml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="1" failures="1" tests="2" name="tst_Crashes">
+<testsuite errors="1" failures="0" tests="3" name="tst_SkipCleanup">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
</properties>
<testcase result="pass" name="initTestCase"/>
- <testcase result="fail" name="crash">
- <!-- message="Received signal 11" type="qfatal" -->
- <failure message="Received a fatal error." result="fail"/>
+ <testcase result="pass" name="aTestFunction"/>
+ <testcase name="cleanupTestCase">
+ <!-- message="Skip inside cleanupTestCase." type="skip" -->
</testcase>
<system-err>
-<![CDATA[Received signal 11]]>
+<![CDATA[Skip inside cleanupTestCase.]]>
</system-err>
</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_sleep.lightxml b/tests/auto/testlib/selftests/expected_sleep.lightxml
deleted file mode 100644
index 1a056c8562..0000000000
--- a/tests/auto/testlib/selftests/expected_sleep.lightxml
+++ /dev/null
@@ -1,13 +0,0 @@
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="sleep">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_sleep.xml b/tests/auto/testlib/selftests/expected_sleep.xml
deleted file mode 100644
index cbc4d14004..0000000000
--- a/tests/auto/testlib/selftests/expected_sleep.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<TestCase name="tst_Sleep">
-<Environment>
- <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
- <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
-</Environment>
-<TestFunction name="initTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="sleep">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-<TestFunction name="cleanupTestCase">
-<Incident type="pass" file="" line="0" />
-</TestFunction>
-</TestCase>
diff --git a/tests/auto/testlib/selftests/expected_sleep.xunitxml b/tests/auto/testlib/selftests/expected_sleep.xunitxml
deleted file mode 100644
index 409621e6bc..0000000000
--- a/tests/auto/testlib/selftests/expected_sleep.xunitxml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="0" tests="3" name="tst_Sleep">
- <properties>
- <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
- <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
- </properties>
- <testcase result="pass" name="initTestCase"/>
- <testcase result="pass" name="sleep"/>
- <testcase result="pass" name="cleanupTestCase"/>
- <system-err/>
-</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_subtest.lightxml b/tests/auto/testlib/selftests/expected_subtest.lightxml
index d76ec131de..e7d8d53efc 100644
--- a/tests/auto/testlib/selftests/expected_subtest.lightxml
+++ b/tests/auto/testlib/selftests/expected_subtest.lightxml
@@ -43,6 +43,9 @@
<DataTag><![CDATA[data0]]></DataTag>
<Description><![CDATA[cleanup test2 data0 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data0]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[data1]]></DataTag>
<Description><![CDATA[init test2 data1 ]]></Description>
@@ -59,6 +62,9 @@
<DataTag><![CDATA[data1]]></DataTag>
<Description><![CDATA[cleanup test2 data1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[data2]]></DataTag>
<Description><![CDATA[init test2 data2 ]]></Description>
@@ -75,7 +81,9 @@
<DataTag><![CDATA[data2]]></DataTag>
<Description><![CDATA[cleanup test2 data2 ]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="test3">
<Message type="qdebug" file="" line="0">
@@ -100,6 +108,9 @@
<DataTag><![CDATA[data0]]></DataTag>
<Description><![CDATA[cleanup test3 data0 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data0]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[data1]]></DataTag>
<Description><![CDATA[init test3 data1 ]]></Description>
diff --git a/tests/auto/testlib/selftests/expected_subtest.txt b/tests/auto/testlib/selftests/expected_subtest.txt
index e35fb805e0..7b29bfc8c3 100644
--- a/tests/auto/testlib/selftests/expected_subtest.txt
+++ b/tests/auto/testlib/selftests/expected_subtest.txt
@@ -12,21 +12,24 @@ QDEBUG : tst_Subtest::test2(data0) init test2 data0
QDEBUG : tst_Subtest::test2(data0) test2 test2 data0
QDEBUG : tst_Subtest::test2(data0) test2 end
QDEBUG : tst_Subtest::test2(data0) cleanup test2 data0
+PASS : tst_Subtest::test2(data0)
QDEBUG : tst_Subtest::test2(data1) init test2 data1
QDEBUG : tst_Subtest::test2(data1) test2 test2 data1
QDEBUG : tst_Subtest::test2(data1) test2 end
QDEBUG : tst_Subtest::test2(data1) cleanup test2 data1
+PASS : tst_Subtest::test2(data1)
QDEBUG : tst_Subtest::test2(data2) init test2 data2
QDEBUG : tst_Subtest::test2(data2) test2 test2 data2
QDEBUG : tst_Subtest::test2(data2) test2 end
QDEBUG : tst_Subtest::test2(data2) cleanup test2 data2
-PASS : tst_Subtest::test2()
+PASS : tst_Subtest::test2(data2)
QDEBUG : tst_Subtest::test3() test3_data test3 (null)
QDEBUG : tst_Subtest::test3() test3_data end
QDEBUG : tst_Subtest::test3(data0) init test3 data0
QDEBUG : tst_Subtest::test3(data0) test2 test3 data0
QDEBUG : tst_Subtest::test3(data0) test2 end
QDEBUG : tst_Subtest::test3(data0) cleanup test3 data0
+PASS : tst_Subtest::test3(data0)
QDEBUG : tst_Subtest::test3(data1) init test3 data1
QDEBUG : tst_Subtest::test3(data1) test2 test3 data1
FAIL! : tst_Subtest::test3(data1) Compared values are not the same
@@ -43,5 +46,5 @@ FAIL! : tst_Subtest::test3(data2) Compared values are not the same
QDEBUG : tst_Subtest::test3(data2) cleanup test3 data2
QDEBUG : tst_Subtest::cleanupTestCase() cleanupTestCase cleanupTestCase (null)
PASS : tst_Subtest::cleanupTestCase()
-Totals: 4 passed, 2 failed, 0 skipped
+Totals: 7 passed, 2 failed, 0 skipped
********* Finished testing of tst_Subtest *********
diff --git a/tests/auto/testlib/selftests/expected_subtest.xml b/tests/auto/testlib/selftests/expected_subtest.xml
index d79242f061..8a3846599c 100644
--- a/tests/auto/testlib/selftests/expected_subtest.xml
+++ b/tests/auto/testlib/selftests/expected_subtest.xml
@@ -45,6 +45,9 @@
<DataTag><![CDATA[data0]]></DataTag>
<Description><![CDATA[cleanup test2 data0 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data0]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[data1]]></DataTag>
<Description><![CDATA[init test2 data1 ]]></Description>
@@ -61,6 +64,9 @@
<DataTag><![CDATA[data1]]></DataTag>
<Description><![CDATA[cleanup test2 data1 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data1]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[data2]]></DataTag>
<Description><![CDATA[init test2 data2 ]]></Description>
@@ -77,7 +83,9 @@
<DataTag><![CDATA[data2]]></DataTag>
<Description><![CDATA[cleanup test2 data2 ]]></Description>
</Message>
-<Incident type="pass" file="" line="0" />
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data2]]></DataTag>
+</Incident>
</TestFunction>
<TestFunction name="test3">
<Message type="qdebug" file="" line="0">
@@ -102,6 +110,9 @@
<DataTag><![CDATA[data0]]></DataTag>
<Description><![CDATA[cleanup test3 data0 ]]></Description>
</Message>
+<Incident type="pass" file="" line="0">
+ <DataTag><![CDATA[data0]]></DataTag>
+</Incident>
<Message type="qdebug" file="" line="0">
<DataTag><![CDATA[data1]]></DataTag>
<Description><![CDATA[init test3 data1 ]]></Description>
diff --git a/tests/auto/testlib/selftests/expected_warnings.lightxml b/tests/auto/testlib/selftests/expected_warnings.lightxml
index 116156ed8a..ad786832ca 100644
--- a/tests/auto/testlib/selftests/expected_warnings.lightxml
+++ b/tests/auto/testlib/selftests/expected_warnings.lightxml
@@ -37,6 +37,32 @@
<Description><![CDATA[Not all expected messages were received]]></Description>
</Incident>
</TestFunction>
+<TestFunction name="testMissingWarningsWithData">
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning0"]]></Description>
+</Message>
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning1"]]></Description>
+</Message>
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[Not all expected messages were received]]></Description>
+</Incident>
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning0"]]></Description>
+</Message>
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning1"]]></Description>
+</Message>
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[Not all expected messages were received]]></Description>
+</Incident>
+</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_warnings.txt b/tests/auto/testlib/selftests/expected_warnings.txt
index 6f7d0f491b..6196ec0261 100644
--- a/tests/auto/testlib/selftests/expected_warnings.txt
+++ b/tests/auto/testlib/selftests/expected_warnings.txt
@@ -11,6 +11,12 @@ PASS : tst_Warnings::testWarnings()
INFO : tst_Warnings::testMissingWarnings() Did not receive message: "Warning0"
INFO : tst_Warnings::testMissingWarnings() Did not receive message: "Warning1"
FAIL! : tst_Warnings::testMissingWarnings() Not all expected messages were received
+INFO : tst_Warnings::testMissingWarningsWithData(first row) Did not receive message: "Warning0"
+INFO : tst_Warnings::testMissingWarningsWithData(first row) Did not receive message: "Warning1"
+FAIL! : tst_Warnings::testMissingWarningsWithData(first row) Not all expected messages were received
+INFO : tst_Warnings::testMissingWarningsWithData(second row) Did not receive message: "Warning0"
+INFO : tst_Warnings::testMissingWarningsWithData(second row) Did not receive message: "Warning1"
+FAIL! : tst_Warnings::testMissingWarningsWithData(second row) Not all expected messages were received
PASS : tst_Warnings::cleanupTestCase()
-Totals: 3 passed, 1 failed, 0 skipped
+Totals: 3 passed, 3 failed, 0 skipped
********* Finished testing of tst_Warnings *********
diff --git a/tests/auto/testlib/selftests/expected_warnings.xml b/tests/auto/testlib/selftests/expected_warnings.xml
index 13e6c1df79..12cff7c13d 100644
--- a/tests/auto/testlib/selftests/expected_warnings.xml
+++ b/tests/auto/testlib/selftests/expected_warnings.xml
@@ -39,6 +39,32 @@
<Description><![CDATA[Not all expected messages were received]]></Description>
</Incident>
</TestFunction>
+<TestFunction name="testMissingWarningsWithData">
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning0"]]></Description>
+</Message>
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning1"]]></Description>
+</Message>
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[first row]]></DataTag>
+ <Description><![CDATA[Not all expected messages were received]]></Description>
+</Incident>
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning0"]]></Description>
+</Message>
+<Message type="info" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[Did not receive message: "Warning1"]]></Description>
+</Message>
+<Incident type="fail" file="" line="0">
+ <DataTag><![CDATA[second row]]></DataTag>
+ <Description><![CDATA[Not all expected messages were received]]></Description>
+</Incident>
+</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
diff --git a/tests/auto/testlib/selftests/expected_warnings.xunitxml b/tests/auto/testlib/selftests/expected_warnings.xunitxml
index a96393d648..3e3b9ce18e 100644
--- a/tests/auto/testlib/selftests/expected_warnings.xunitxml
+++ b/tests/auto/testlib/selftests/expected_warnings.xunitxml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="8" failures="1" tests="4" name="tst_Warnings">
+<testsuite errors="12" failures="3" tests="5" name="tst_Warnings">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
@@ -18,6 +18,14 @@
<!-- message="Did not receive message: &quot;Warning1&quot;" type="info" -->
<failure message="Not all expected messages were received" result="fail"/>
</testcase>
+ <testcase result="fail" name="testMissingWarningsWithData">
+ <!-- tag="first row" message="Did not receive message: &quot;Warning0&quot;" type="info" -->
+ <!-- tag="first row" message="Did not receive message: &quot;Warning1&quot;" type="info" -->
+ <failure tag="first row" message="Not all expected messages were received" result="fail"/>
+ <!-- tag="second row" message="Did not receive message: &quot;Warning0&quot;" type="info" -->
+ <!-- tag="second row" message="Did not receive message: &quot;Warning1&quot;" type="info" -->
+ <failure tag="second row" message="Not all expected messages were received" result="fail"/>
+ </testcase>
<testcase result="pass" name="cleanupTestCase"/>
<system-err>
<![CDATA[Warning]]>
@@ -28,5 +36,9 @@
<![CDATA[Baba]]>
<![CDATA[Did not receive message: "Warning0"]]>
<![CDATA[Did not receive message: "Warning1"]]>
+<![CDATA[Did not receive message: "Warning0"]]>
+<![CDATA[Did not receive message: "Warning1"]]>
+<![CDATA[Did not receive message: "Warning0"]]>
+<![CDATA[Did not receive message: "Warning1"]]>
</system-err>
</testsuite>
diff --git a/tests/auto/testlib/selftests/expected_xunit.lightxml b/tests/auto/testlib/selftests/expected_xunit.lightxml
index 35108fc410..71a57373d6 100644
--- a/tests/auto/testlib/selftests/expected_xunit.lightxml
+++ b/tests/auto/testlib/selftests/expected_xunit.lightxml
@@ -45,7 +45,7 @@
</TestFunction>
<TestFunction name="testFunc7">
<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/xunit/tst_xunit.cpp" line="110">
- <Description><![CDATA['true' returned FALSE. ()]]></Description>
+ <Description><![CDATA['true' returned TRUE unexpectedly. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
diff --git a/tests/auto/testlib/selftests/expected_xunit.txt b/tests/auto/testlib/selftests/expected_xunit.txt
index ae2508c590..51c8f89599 100644
--- a/tests/auto/testlib/selftests/expected_xunit.txt
+++ b/tests/auto/testlib/selftests/expected_xunit.txt
@@ -19,7 +19,7 @@ PASS : tst_Xunit::testFunc5()
XFAIL : tst_Xunit::testFunc6() this failure is also expected
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/xunit/tst_xunit.cpp(104)]
PASS : tst_Xunit::testFunc6()
-XPASS : tst_Xunit::testFunc7() 'true' returned FALSE. ()
+XPASS : tst_Xunit::testFunc7() 'true' returned TRUE unexpectedly. ()
Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/xunit/tst_xunit.cpp(110)]
PASS : tst_Xunit::cleanupTestCase()
Totals: 5 passed, 3 failed, 1 skipped
diff --git a/tests/auto/testlib/selftests/expected_xunit.xml b/tests/auto/testlib/selftests/expected_xunit.xml
index 0fe9735f71..a1e6b20963 100644
--- a/tests/auto/testlib/selftests/expected_xunit.xml
+++ b/tests/auto/testlib/selftests/expected_xunit.xml
@@ -47,7 +47,7 @@
</TestFunction>
<TestFunction name="testFunc7">
<Incident type="xpass" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/xunit/tst_xunit.cpp" line="110">
- <Description><![CDATA['true' returned FALSE. ()]]></Description>
+ <Description><![CDATA['true' returned TRUE unexpectedly. ()]]></Description>
</Incident>
</TestFunction>
<TestFunction name="cleanupTestCase">
diff --git a/tests/auto/testlib/selftests/expected_xunit.xunitxml b/tests/auto/testlib/selftests/expected_xunit.xunitxml
index e77004f819..e7403443ea 100644
--- a/tests/auto/testlib/selftests/expected_xunit.xunitxml
+++ b/tests/auto/testlib/selftests/expected_xunit.xunitxml
@@ -27,7 +27,7 @@
<!-- message="this failure is also expected" type="info" -->
</testcase>
<testcase result="xpass" name="testFunc7">
- <failure message="&apos;true&apos; returned FALSE. ()" result="xpass"/>
+ <failure message="&apos;true&apos; returned TRUE unexpectedly. ()" result="xpass"/>
</testcase>
<testcase result="pass" name="cleanupTestCase"/>
<system-err>
diff --git a/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp b/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp
index 3a000ba182..794b109924 100644
--- a/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp
+++ b/tests/auto/testlib/selftests/expectfail/tst_expectfail.cpp
@@ -54,15 +54,21 @@ private slots:
void xfailAndAbort() const;
void xfailTwice() const;
void xfailWithQString() const;
- void xfailDataDriven_data() const;
- void xfailDataDriven() const;
+ void xfailDataDrivenWithQVerify_data() const;
+ void xfailDataDrivenWithQVerify() const;
+ void xfailDataDrivenWithQCompare_data() const;
+ void xfailDataDrivenWithQCompare() const;
void xfailOnWrongRow_data() const;
void xfailOnWrongRow() const;
void xfailOnAnyRow_data() const;
void xfailOnAnyRow() const;
+ void xfailWithoutVerify_data() const;
+ void xfailWithoutVerify() const;
void xpass() const;
- void xpassDataDriven_data() const;
- void xpassDataDriven() const;
+ void xpassDataDrivenWithQVerify_data() const;
+ void xpassDataDrivenWithQVerify() const;
+ void xpassDataDrivenWithQCompare_data() const;
+ void xpassDataDrivenWithQCompare() const;
};
void tst_ExpectFail::xfailAndContinue() const
@@ -104,7 +110,7 @@ void tst_ExpectFail::xfailWithQString() const
QVERIFY(false);
}
-void tst_ExpectFail::xfailDataDriven_data() const
+void tst_ExpectFail::xfailDataDrivenWithQVerify_data() const
{
QTest::addColumn<bool>("shouldPass");
QTest::addColumn<QTest::TestFailMode>("failMode");
@@ -115,7 +121,7 @@ void tst_ExpectFail::xfailDataDriven_data() const
QTest::newRow("Continue") << false << QTest::Continue;
}
-void tst_ExpectFail::xfailDataDriven() const
+void tst_ExpectFail::xfailDataDrivenWithQVerify() const
{
QFETCH(bool, shouldPass);
QFETCH(QTest::TestFailMode, failMode);
@@ -138,6 +144,40 @@ void tst_ExpectFail::xfailDataDriven() const
QCOMPARE(failMode, QTest::Continue);
}
+void tst_ExpectFail::xfailDataDrivenWithQCompare_data() const
+{
+ QTest::addColumn<bool>("shouldPass");
+ QTest::addColumn<QTest::TestFailMode>("failMode");
+
+ QTest::newRow("Pass 1") << true << QTest::Abort;
+ QTest::newRow("Pass 2") << true << QTest::Continue;
+ QTest::newRow("Abort") << false << QTest::Abort;
+ QTest::newRow("Continue") << false << QTest::Continue;
+}
+
+void tst_ExpectFail::xfailDataDrivenWithQCompare() const
+{
+ QFETCH(bool, shouldPass);
+ QFETCH(QTest::TestFailMode, failMode);
+
+ // You can't pass a variable as the last parameter of QEXPECT_FAIL,
+ // because the macro adds "QTest::" in front of the last parameter.
+ // That is why the following code appears to be a little strange.
+ if (!shouldPass) {
+ if (failMode == QTest::Abort)
+ QEXPECT_FAIL(QTest::currentDataTag(), "This test should xfail", Abort);
+ else
+ QEXPECT_FAIL(QTest::currentDataTag(), "This test should xfail", Continue);
+ }
+
+ QCOMPARE(1, shouldPass ? 1 : 2);
+
+ // If we get here, we either expected to pass or we expected to
+ // fail and the failure mode was Continue.
+ if (!shouldPass)
+ QCOMPARE(failMode, QTest::Continue);
+}
+
void tst_ExpectFail::xfailOnWrongRow_data() const
{
QTest::addColumn<int>("dummy");
@@ -168,6 +208,20 @@ void tst_ExpectFail::xfailOnAnyRow() const
QVERIFY(false);
}
+void tst_ExpectFail::xfailWithoutVerify_data() const
+{
+ QTest::addColumn<int>("dummy");
+
+ QTest::newRow("first row") << 0;
+ QTest::newRow("second row") << 1;
+}
+
+void tst_ExpectFail::xfailWithoutVerify() const
+{
+ QVERIFY(true);
+ QEXPECT_FAIL("", "This expected failure should be ignored", Abort);
+}
+
void tst_ExpectFail::xpass() const
{
QEXPECT_FAIL("", "This test should xpass", Abort);
@@ -178,7 +232,7 @@ void tst_ExpectFail::xpass() const
QVERIFY2(false, "This should not be reached");
}
-void tst_ExpectFail::xpassDataDriven_data() const
+void tst_ExpectFail::xpassDataDrivenWithQVerify_data() const
{
QTest::addColumn<bool>("shouldXPass");
@@ -186,7 +240,7 @@ void tst_ExpectFail::xpassDataDriven_data() const
QTest::newRow("Pass") << false;
}
-void tst_ExpectFail::xpassDataDriven() const
+void tst_ExpectFail::xpassDataDrivenWithQVerify() const
{
QFETCH(bool, shouldXPass);
@@ -199,5 +253,26 @@ void tst_ExpectFail::xpassDataDriven() const
QVERIFY2(!shouldXPass, "Test failed to terminate on XPASS");
}
+void tst_ExpectFail::xpassDataDrivenWithQCompare_data() const
+{
+ QTest::addColumn<bool>("shouldXPass");
+
+ QTest::newRow("XPass") << true;
+ QTest::newRow("Pass") << false;
+}
+
+void tst_ExpectFail::xpassDataDrivenWithQCompare() const
+{
+ QFETCH(bool, shouldXPass);
+
+ if (shouldXPass)
+ QEXPECT_FAIL(QTest::currentDataTag(), "This test should xpass", Abort);
+
+ QCOMPARE(1, 1);
+
+ // We should only get here if the test wasn't supposed to xpass.
+ QVERIFY2(!shouldXPass, "Test failed to terminate on XPASS");
+}
+
QTEST_MAIN(tst_ExpectFail)
#include "tst_expectfail.moc"
diff --git a/tests/auto/testlib/selftests/failcleanup/failcleanup.pro b/tests/auto/testlib/selftests/failcleanup/failcleanup.pro
new file mode 100644
index 0000000000..426d7cc45b
--- /dev/null
+++ b/tests/auto/testlib/selftests/failcleanup/failcleanup.pro
@@ -0,0 +1,7 @@
+SOURCES += tst_failcleanup.cpp
+QT = core testlib
+
+mac:CONFIG -= app_bundle
+CONFIG -= debug_and_release_target
+
+TARGET = failcleanup
diff --git a/tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp b/tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp
new file mode 100644
index 0000000000..a1b3b2d15a
--- /dev/null
+++ b/tests/auto/testlib/selftests/failcleanup/tst_failcleanup.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+
+class tst_FailCleanup: public QObject
+{
+Q_OBJECT
+private slots:
+ void aTestFunction() const;
+ void cleanupTestCase() const;
+};
+
+void tst_FailCleanup::aTestFunction() const
+{
+ QVERIFY(true);
+}
+
+void tst_FailCleanup::cleanupTestCase() const
+{
+ QVERIFY2(false, "Fail inside cleanupTestCase");
+}
+
+QTEST_APPLESS_MAIN(tst_FailCleanup)
+#include "tst_failcleanup.moc"
diff --git a/tests/auto/testlib/selftests/float/tst_float.cpp b/tests/auto/testlib/selftests/float/tst_float.cpp
index 9b7865ed25..fb10521604 100644
--- a/tests/auto/testlib/selftests/float/tst_float.cpp
+++ b/tests/auto/testlib/selftests/float/tst_float.cpp
@@ -66,19 +66,28 @@ void tst_float::floatComparisons_data() const
QTest::addColumn<float>("operandLeft");
QTest::addColumn<float>("operandRight");
- QTest::newRow("should SUCCEED")
+ QTest::newRow("should SUCCEED 1")
<< float(0)
<< float(0);
- QTest::newRow("should FAIL")
+ QTest::newRow("should FAIL 1")
<< float(1.00000)
<< float(3.00000);
- QTest::newRow("should FAIL")
+ QTest::newRow("should FAIL 2")
<< float(1.00000e-7f)
<< float(3.00000e-7f);
- QTest::newRow("should FAIL")
+ // QCOMPARE for floats uses qFuzzyCompare(), which succeeds if the numbers
+ // differ by no more than 1/100,000th of the smaller value. Thus
+ // QCOMPARE(99998, 99999) should fail, while QCOMPARE(100001, 100002)
+ // should pass.
+
+ QTest::newRow("should FAIL 3")
+ << float(99998)
+ << float(99999);
+
+ QTest::newRow("should SUCCEED 2")
<< float(100001)
<< float(100002);
}
diff --git a/tests/auto/testlib/selftests/selftests.pri b/tests/auto/testlib/selftests/selftests.pri
index 95664c3793..0809c4d497 100644
--- a/tests/auto/testlib/selftests/selftests.pri
+++ b/tests/auto/testlib/selftests/selftests.pri
@@ -1,7 +1,42 @@
-SUBPROGRAMS = subtest warnings maxwarnings cmptest globaldata skip \
- strcmp expectfail sleep fetchbogus crashes multiexec failinit failinitdata \
- skipinit skipinitdata datetime singleskip assert differentexec \
- exceptionthrow qexecstringlist datatable commandlinedata\
- benchlibwalltime benchlibcallgrind benchlibeventcounter benchlibtickcounter \
- benchliboptions xunit badxml longstring float printdatatags \
- printdatatagswithglobaltags findtestdata counting
+SUBPROGRAMS = \
+ #alive \
+ assert \
+ badxml \
+ benchlibcallgrind \
+ benchlibcounting \
+ benchlibeventcounter \
+ benchliboptions \
+ benchlibtickcounter \
+ benchlibwalltime \
+ cmptest \
+ commandlinedata \
+ counting \
+ crashes \
+ datatable \
+ datetime \
+ differentexec \
+ exceptionthrow \
+ expectfail \
+ failcleanup \
+ failinit \
+ failinitdata \
+ fetchbogus \
+ findtestdata \
+ float \
+ globaldata \
+ longstring \
+ maxwarnings \
+ multiexec \
+ printdatatags \
+ printdatatagswithglobaltags \
+ qexecstringlist \
+ singleskip \
+ skip \
+ skipcleanup \
+ skipinit \
+ skipinitdata \
+ sleep \
+ strcmp \
+ subtest \
+ warnings \
+ xunit
diff --git a/tests/auto/testlib/selftests/selftests.qrc b/tests/auto/testlib/selftests/selftests.qrc
index d10aa56ceb..baa539a259 100644
--- a/tests/auto/testlib/selftests/selftests.qrc
+++ b/tests/auto/testlib/selftests/selftests.qrc
@@ -9,18 +9,16 @@
<file>expected_badxml.txt</file>
<file>expected_badxml.xml</file>
<file>expected_badxml.xunitxml</file>
- <file>expected_benchlibcallgrind.lightxml</file>
<file>expected_benchlibcallgrind.txt</file>
- <file>expected_benchlibcallgrind.xml</file>
- <file>expected_benchlibcallgrind.xunitxml</file>
+ <file>expected_benchlibcounting.lightxml</file>
+ <file>expected_benchlibcounting.txt</file>
+ <file>expected_benchlibcounting.xml</file>
+ <file>expected_benchlibcounting.xunitxml</file>
<file>expected_benchlibeventcounter.lightxml</file>
<file>expected_benchlibeventcounter.txt</file>
<file>expected_benchlibeventcounter.xml</file>
<file>expected_benchlibeventcounter.xunitxml</file>
- <file>expected_benchliboptions.lightxml</file>
<file>expected_benchliboptions.txt</file>
- <file>expected_benchliboptions.xml</file>
- <file>expected_benchliboptions.xunitxml</file>
<file>expected_benchlibtickcounter.lightxml</file>
<file>expected_benchlibtickcounter.txt</file>
<file>expected_benchlibtickcounter.xml</file>
@@ -41,9 +39,6 @@
<file>expected_counting.txt</file>
<file>expected_counting.xml</file>
<file>expected_counting.xunitxml</file>
- <file>expected_crashes.lightxml</file>
- <file>expected_crashes.xml</file>
- <file>expected_crashes.xunitxml</file>
<file>expected_crashes_1.txt</file>
<file>expected_crashes_2.txt</file>
<file>expected_crashes_3.txt</file>
@@ -64,6 +59,10 @@
<file>expected_expectfail.txt</file>
<file>expected_expectfail.xml</file>
<file>expected_expectfail.xunitxml</file>
+ <file>expected_failcleanup.lightxml</file>
+ <file>expected_failcleanup.txt</file>
+ <file>expected_failcleanup.xml</file>
+ <file>expected_failcleanup.xunitxml</file>
<file>expected_failinit.lightxml</file>
<file>expected_failinit.txt</file>
<file>expected_failinit.xml</file>
@@ -77,10 +76,7 @@
<file>expected_fetchbogus.txt</file>
<file>expected_fetchbogus.xml</file>
<file>expected_fetchbogus.xunitxml</file>
- <file>expected_float.lightxml</file>
<file>expected_float.txt</file>
- <file>expected_float.xml</file>
- <file>expected_float.xunitxml</file>
<file>expected_globaldata.lightxml</file>
<file>expected_globaldata.txt</file>
<file>expected_globaldata.xml</file>
@@ -93,10 +89,7 @@
<file>expected_maxwarnings.txt</file>
<file>expected_maxwarnings.xml</file>
<file>expected_maxwarnings.xunitxml</file>
- <file>expected_multiexec.lightxml</file>
<file>expected_multiexec.txt</file>
- <file>expected_multiexec.xml</file>
- <file>expected_multiexec.xunitxml</file>
<file>expected_printdatatags.txt</file>
<file>expected_printdatatagswithglobaltags.txt</file>
<file>expected_qexecstringlist.txt</file>
@@ -108,6 +101,10 @@
<file>expected_skip.txt</file>
<file>expected_skip.xml</file>
<file>expected_skip.xunitxml</file>
+ <file>expected_skipcleanup.lightxml</file>
+ <file>expected_skipcleanup.txt</file>
+ <file>expected_skipcleanup.xml</file>
+ <file>expected_skipcleanup.xunitxml</file>
<file>expected_skipinit.lightxml</file>
<file>expected_skipinit.txt</file>
<file>expected_skipinit.xml</file>
@@ -116,10 +113,7 @@
<file>expected_skipinitdata.txt</file>
<file>expected_skipinitdata.xml</file>
<file>expected_skipinitdata.xunitxml</file>
- <file>expected_sleep.lightxml</file>
<file>expected_sleep.txt</file>
- <file>expected_sleep.xml</file>
- <file>expected_sleep.xunitxml</file>
<file>expected_strcmp.lightxml</file>
<file>expected_strcmp.txt</file>
<file>expected_strcmp.xml</file>
diff --git a/tests/auto/testlib/selftests/skipcleanup/skipcleanup.pro b/tests/auto/testlib/selftests/skipcleanup/skipcleanup.pro
new file mode 100644
index 0000000000..f98cda7596
--- /dev/null
+++ b/tests/auto/testlib/selftests/skipcleanup/skipcleanup.pro
@@ -0,0 +1,7 @@
+SOURCES += tst_skipcleanup.cpp
+QT = core testlib
+
+mac:CONFIG -= app_bundle
+CONFIG -= debug_and_release_target
+
+TARGET = skipcleanup
diff --git a/tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp b/tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp
new file mode 100644
index 0000000000..262aefa982
--- /dev/null
+++ b/tests/auto/testlib/selftests/skipcleanup/tst_skipcleanup.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+
+class tst_SkipCleanup: public QObject
+{
+Q_OBJECT
+private slots:
+ void aTestFunction() const;
+ void cleanupTestCase() const;
+};
+
+void tst_SkipCleanup::aTestFunction() const
+{
+ QVERIFY(true);
+}
+
+void tst_SkipCleanup::cleanupTestCase() const
+{
+ QSKIP("Skip inside cleanupTestCase.");
+}
+
+QTEST_APPLESS_MAIN(tst_SkipCleanup)
+#include "tst_skipcleanup.moc"
diff --git a/tests/auto/testlib/selftests/tst_selftests.cpp b/tests/auto/testlib/selftests/tst_selftests.cpp
index aaa58e092c..decaa55386 100644
--- a/tests/auto/testlib/selftests/tst_selftests.cpp
+++ b/tests/auto/testlib/selftests/tst_selftests.cpp
@@ -323,6 +323,7 @@ void tst_Selftests::runSubTest_data()
// Only run on platforms where callgrind is available.
<< "benchlibcallgrind"
#endif
+ << "benchlibcounting"
<< "benchlibeventcounter"
<< "benchliboptions"
<< "cmptest"
@@ -338,6 +339,7 @@ void tst_Selftests::runSubTest_data()
<< "exceptionthrow"
#endif
<< "expectfail"
+ << "failcleanup"
<< "failinit"
<< "failinitdata"
#if !defined(Q_OS_WIN)
@@ -354,6 +356,7 @@ void tst_Selftests::runSubTest_data()
<< "qexecstringlist"
<< "singleskip"
<< "skip"
+ << "skipcleanup"
<< "skipinit"
<< "skipinitdata"
<< "sleep"
@@ -397,6 +400,9 @@ void tst_Selftests::runSubTest_data()
else if (subtest == "badxml") {
arguments << "-eventcounter";
}
+ else if (subtest == "benchlibcounting") {
+ arguments << "-eventcounter";
+ }
else if (subtest == "printdatatags") {
arguments << "-datatags";
}
@@ -454,23 +460,26 @@ void tst_Selftests::runSubTest_data()
}
}
+static void insertEnvironmentVariable(QString const& name, QProcessEnvironment &result)
+{
+ const QProcessEnvironment systemEnvironment = QProcessEnvironment::systemEnvironment();
+ const QString value = systemEnvironment.value(name);
+ if (!value.isEmpty())
+ result.insert(name, value);
+}
+
static inline QProcessEnvironment processEnvironment()
{
QProcessEnvironment result;
- const QString path = QStringLiteral("PATH");
- const QProcessEnvironment systemEnvironment = QProcessEnvironment::systemEnvironment();
- result.insert(path, systemEnvironment.value(path));
+ insertEnvironmentVariable(QStringLiteral("PATH"), result);
// Preserve DISPLAY for X11 as some tests use QtGui.
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
- const QString display = QStringLiteral("DISPLAY");
- const QString displayValue = systemEnvironment.value(display);
- if (!displayValue.isEmpty())
- result.insert(display, displayValue);
+ insertEnvironmentVariable(QStringLiteral("DISPLAY"), result);
+#endif
+ insertEnvironmentVariable(QStringLiteral("QT_QPA_PLATFORM"), result);
+#ifdef __COVERAGESCANNER__
+ insertEnvironmentVariable(QStringLiteral("QT_TESTCOCOON_ACTIVE"), result);
#endif
- const QString platform = QStringLiteral("QT_QPA_PLATFORM");
- const QString platformValue = systemEnvironment.value(platform);
- if (!platformValue.isEmpty())
- result.insert(platform, platformValue);
return result;
}
diff --git a/tests/auto/testlib/selftests/warnings/tst_warnings.cpp b/tests/auto/testlib/selftests/warnings/tst_warnings.cpp
index 933d0cc6ce..e53869e18e 100644
--- a/tests/auto/testlib/selftests/warnings/tst_warnings.cpp
+++ b/tests/auto/testlib/selftests/warnings/tst_warnings.cpp
@@ -49,6 +49,8 @@ class tst_Warnings: public QObject
private slots:
void testWarnings();
void testMissingWarnings();
+ void testMissingWarningsWithData_data();
+ void testMissingWarningsWithData();
};
void tst_Warnings::testWarnings()
@@ -82,6 +84,23 @@ void tst_Warnings::testMissingWarnings()
qWarning("Warning2");
}
+void tst_Warnings::testMissingWarningsWithData_data()
+{
+ QTest::addColumn<int>("dummy");
+
+ QTest::newRow("first row") << 0;
+ QTest::newRow("second row") << 1;
+}
+
+void tst_Warnings::testMissingWarningsWithData()
+{
+ QTest::ignoreMessage(QtWarningMsg, "Warning0");
+ QTest::ignoreMessage(QtWarningMsg, "Warning1");
+ QTest::ignoreMessage(QtWarningMsg, "Warning2");
+
+ qWarning("Warning2");
+}
+
QTEST_MAIN(tst_Warnings)
#include "tst_warnings.moc"
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index 7c47d60e81..27db6cc59c 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -614,7 +614,7 @@ void tst_Moc::oldStyleCasts()
QStringList args;
args << "-c" << "-x" << "c++" << "-Wold-style-cast" << "-I" << "."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIE" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -683,7 +683,7 @@ void tst_Moc::inputFileNameWithDotsButNoExtension()
QStringList args;
args << "-c" << "-x" << "c++" << "-I" << ".."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIE" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -1623,7 +1623,7 @@ void tst_Moc::warnings_data()
<< QString("standard input:1: Warning: Property declaration x has no READ accessor function. The property will be invalid.");
// Passing "-nn" should NOT suppress the warning
- QTest::newRow("Invalid property warning")
+ QTest::newRow("Invalid property warning with -nn")
<< QByteArray("class X : public QObject { Q_OBJECT Q_PROPERTY(int x) };")
<< (QStringList() << "-nn")
<< 0
@@ -1631,7 +1631,7 @@ void tst_Moc::warnings_data()
<< QString("standard input:1: Warning: Property declaration x has no READ accessor function. The property will be invalid.");
// Passing "-nw" should suppress the warning
- QTest::newRow("Invalid property warning")
+ QTest::newRow("Invalid property warning with -nw")
<< QByteArray("class X : public QObject { Q_OBJECT Q_PROPERTY(int x) };")
<< (QStringList() << "-nw")
<< 0
@@ -1655,7 +1655,7 @@ void tst_Moc::warnings_data()
<< QString("standard input:1: Error: Class contains Q_OBJECT macro but does not inherit from QObject");
// "-nw" should not suppress the error
- QTest::newRow("Does not inherit QObject with -nn")
+ QTest::newRow("Does not inherit QObject with -nw")
<< QByteArray("class X { Q_OBJECT };")
<< (QStringList() << "-nw")
<< 1
diff --git a/tests/auto/tools/qmake/testdata/substitutes/copy.txt b/tests/auto/tools/qmake/testdata/substitutes/copy.txt
new file mode 100644
index 0000000000..65e5840739
--- /dev/null
+++ b/tests/auto/tools/qmake/testdata/substitutes/copy.txt
@@ -0,0 +1,3 @@
+This file is $processed verbatim. It's not going to "warn about
+
+anything that is usually substituted in qmake such as $${PWD}.
diff --git a/tests/auto/tools/qmake/testdata/substitutes/test.pro b/tests/auto/tools/qmake/testdata/substitutes/test.pro
index 26b02722e8..65bb2d85bf 100644
--- a/tests/auto/tools/qmake/testdata/substitutes/test.pro
+++ b/tests/auto/tools/qmake/testdata/substitutes/test.pro
@@ -1,5 +1,8 @@
-QMAKE_SUBSTITUTES += test.in sub/test2.in indirect
+QMAKE_SUBSTITUTES += test.in sub/test2.in indirect copy
indirect.input = $$PWD/test3.txt
indirect.output = $$OUT_PWD/sub/indirect_test.txt
+copy.input = $$PWD/copy.txt
+copy.output = $$OUT_PWD/copy_test.txt
+copy.config = verbatim
diff --git a/tests/auto/tools/qmake/tst_qmake.cpp b/tests/auto/tools/qmake/tst_qmake.cpp
index fcebd6b821..4da781f763 100644
--- a/tests/auto/tools/qmake/tst_qmake.cpp
+++ b/tests/auto/tools/qmake/tst_qmake.cpp
@@ -510,6 +510,14 @@ void tst_qmake::substitutes()
QVERIFY( test_compiler.exists( buildDir, "test", Plain, "" ));
QVERIFY( test_compiler.exists( buildDir, "sub/test2", Plain, "" ));
QVERIFY( test_compiler.exists( buildDir, "sub/indirect_test.txt", Plain, "" ));
+
+ QFile copySource(workDir + "/copy.txt");
+ QFile copyDestination(buildDir + "/copy_test.txt");
+
+ QVERIFY(copySource.open(QFile::ReadOnly));
+ QVERIFY(copyDestination.open(QFile::ReadOnly));
+ QCOMPARE(copySource.readAll(), copyDestination.readAll());
+
QVERIFY( test_compiler.makeDistClean( buildDir ));
}
diff --git a/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Bottom.ui.h b/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Bottom.ui.h
index b5b2bb82ea..1725fd6ece 100644
--- a/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Bottom.ui.h
+++ b/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Bottom.ui.h
@@ -28,10 +28,10 @@ public:
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
- Dialog->setObjectName(QString::fromUtf8("Dialog"));
+ Dialog->setObjectName(QStringLiteral("Dialog"));
Dialog->resize(400, 300);
buttonBox = new QDialogButtonBox(Dialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setGeometry(QRect(30, 240, 341, 32));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Right.ui.h b/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Right.ui.h
index 3d5eabaace..4b25efe6cf 100644
--- a/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Right.ui.h
+++ b/tests/auto/tools/uic/baseline/Dialog_with_Buttons_Right.ui.h
@@ -28,10 +28,10 @@ public:
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
- Dialog->setObjectName(QString::fromUtf8("Dialog"));
+ Dialog->setObjectName(QStringLiteral("Dialog"));
Dialog->resize(400, 300);
buttonBox = new QDialogButtonBox(Dialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setGeometry(QRect(290, 20, 81, 241));
buttonBox->setOrientation(Qt::Vertical);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/Dialog_without_Buttons.ui.h b/tests/auto/tools/uic/baseline/Dialog_without_Buttons.ui.h
index 267646692d..21b34f86e1 100644
--- a/tests/auto/tools/uic/baseline/Dialog_without_Buttons.ui.h
+++ b/tests/auto/tools/uic/baseline/Dialog_without_Buttons.ui.h
@@ -26,7 +26,7 @@ public:
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
- Dialog->setObjectName(QString::fromUtf8("Dialog"));
+ Dialog->setObjectName(QStringLiteral("Dialog"));
Dialog->resize(400, 300);
retranslateUi(Dialog);
diff --git a/tests/auto/tools/uic/baseline/Main_Window.ui.h b/tests/auto/tools/uic/baseline/Main_Window.ui.h
index d6e0ee4a42..d579688a17 100644
--- a/tests/auto/tools/uic/baseline/Main_Window.ui.h
+++ b/tests/auto/tools/uic/baseline/Main_Window.ui.h
@@ -32,16 +32,16 @@ public:
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
- MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(800, 600);
menubar = new QMenuBar(MainWindow);
- menubar->setObjectName(QString::fromUtf8("menubar"));
+ menubar->setObjectName(QStringLiteral("menubar"));
MainWindow->setMenuBar(menubar);
centralwidget = new QWidget(MainWindow);
- centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
+ centralwidget->setObjectName(QStringLiteral("centralwidget"));
MainWindow->setCentralWidget(centralwidget);
statusbar = new QStatusBar(MainWindow);
- statusbar->setObjectName(QString::fromUtf8("statusbar"));
+ statusbar->setObjectName(QStringLiteral("statusbar"));
MainWindow->setStatusBar(statusbar);
retranslateUi(MainWindow);
diff --git a/tests/auto/tools/uic/baseline/Widget.ui.h b/tests/auto/tools/uic/baseline/Widget.ui.h
index 5dcca86903..1ccf8e8d52 100644
--- a/tests/auto/tools/uic/baseline/Widget.ui.h
+++ b/tests/auto/tools/uic/baseline/Widget.ui.h
@@ -34,22 +34,22 @@ public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
- Form->setObjectName(QString::fromUtf8("Form"));
+ Form->setObjectName(QStringLiteral("Form"));
Form->resize(400, 300);
vboxLayout = new QVBoxLayout(Form);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
Alabel = new QLabel(Form);
- Alabel->setObjectName(QString::fromUtf8("Alabel"));
+ Alabel->setObjectName(QStringLiteral("Alabel"));
vboxLayout->addWidget(Alabel);
groupBox = new QGroupBox(Form);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
vboxLayout->addWidget(groupBox);
pushButton = new QPushButton(Form);
- pushButton->setObjectName(QString::fromUtf8("pushButton"));
+ pushButton->setObjectName(QStringLiteral("pushButton"));
vboxLayout->addWidget(pushButton);
diff --git a/tests/auto/tools/uic/baseline/addlinkdialog.ui.h b/tests/auto/tools/uic/baseline/addlinkdialog.ui.h
index 79262a1ae6..537fa2d8b1 100644
--- a/tests/auto/tools/uic/baseline/addlinkdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/addlinkdialog.ui.h
@@ -42,31 +42,31 @@ public:
void setupUi(QDialog *AddLinkDialog)
{
if (AddLinkDialog->objectName().isEmpty())
- AddLinkDialog->setObjectName(QString::fromUtf8("AddLinkDialog"));
+ AddLinkDialog->setObjectName(QStringLiteral("AddLinkDialog"));
AddLinkDialog->setSizeGripEnabled(false);
AddLinkDialog->setModal(true);
verticalLayout = new QVBoxLayout(AddLinkDialog);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
formLayout = new QFormLayout();
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
label = new QLabel(AddLinkDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
formLayout->setWidget(0, QFormLayout::LabelRole, label);
titleInput = new QLineEdit(AddLinkDialog);
- titleInput->setObjectName(QString::fromUtf8("titleInput"));
+ titleInput->setObjectName(QStringLiteral("titleInput"));
titleInput->setMinimumSize(QSize(337, 0));
formLayout->setWidget(0, QFormLayout::FieldRole, titleInput);
label_2 = new QLabel(AddLinkDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
formLayout->setWidget(1, QFormLayout::LabelRole, label_2);
urlInput = new QLineEdit(AddLinkDialog);
- urlInput->setObjectName(QString::fromUtf8("urlInput"));
+ urlInput->setObjectName(QStringLiteral("urlInput"));
formLayout->setWidget(1, QFormLayout::FieldRole, urlInput);
@@ -78,14 +78,14 @@ public:
verticalLayout->addItem(verticalSpacer);
line = new QFrame(AddLinkDialog);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
verticalLayout->addWidget(line);
buttonBox = new QDialogButtonBox(AddLinkDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/addtorrentform.ui.h b/tests/auto/tools/uic/baseline/addtorrentform.ui.h
index a1cb6c56d4..dfca1699ae 100644
--- a/tests/auto/tools/uic/baseline/addtorrentform.ui.h
+++ b/tests/auto/tools/uic/baseline/addtorrentform.ui.h
@@ -60,7 +60,7 @@ public:
void setupUi(QDialog *AddTorrentFile)
{
if (AddTorrentFile->objectName().isEmpty())
- AddTorrentFile->setObjectName(QString::fromUtf8("AddTorrentFile"));
+ AddTorrentFile->setObjectName(QStringLiteral("AddTorrentFile"));
AddTorrentFile->resize(464, 385);
AddTorrentFile->setSizeGripEnabled(false);
AddTorrentFile->setModal(true);
@@ -69,57 +69,57 @@ public:
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(8, 8, 8, 8);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(AddTorrentFile);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
widget = new QWidget(groupBox);
- widget->setObjectName(QString::fromUtf8("widget"));
+ widget->setObjectName(QStringLiteral("widget"));
widget->setGeometry(QRect(10, 40, 364, 33));
gridLayout = new QGridLayout(groupBox);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(8, 8, 8, 8);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label_4 = new QLabel(groupBox);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
gridLayout->addWidget(label_4, 6, 0, 1, 1);
torrentFile = new QLineEdit(groupBox);
- torrentFile->setObjectName(QString::fromUtf8("torrentFile"));
+ torrentFile->setObjectName(QStringLiteral("torrentFile"));
gridLayout->addWidget(torrentFile, 0, 1, 1, 2);
label_2 = new QLabel(groupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 1, 0, 1, 1);
browseTorrents = new QPushButton(groupBox);
- browseTorrents->setObjectName(QString::fromUtf8("browseTorrents"));
+ browseTorrents->setObjectName(QStringLiteral("browseTorrents"));
browseTorrents->setDefault(true);
gridLayout->addWidget(browseTorrents, 0, 3, 1, 1);
label_5 = new QLabel(groupBox);
- label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setObjectName(QStringLiteral("label_5"));
label_5->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);
gridLayout->addWidget(label_5, 5, 0, 1, 1);
label_3 = new QLabel(groupBox);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout->addWidget(label_3, 4, 0, 1, 1);
label_6 = new QLabel(groupBox);
- label_6->setObjectName(QString::fromUtf8("label_6"));
+ label_6->setObjectName(QStringLiteral("label_6"));
gridLayout->addWidget(label_6, 2, 0, 1, 1);
torrentContents = new QTextEdit(groupBox);
- torrentContents->setObjectName(QString::fromUtf8("torrentContents"));
+ torrentContents->setObjectName(QStringLiteral("torrentContents"));
torrentContents->setFocusPolicy(Qt::NoFocus);
torrentContents->setTabChangesFocus(true);
torrentContents->setLineWrapMode(QTextEdit::NoWrap);
@@ -128,43 +128,43 @@ public:
gridLayout->addWidget(torrentContents, 5, 1, 1, 3);
destinationFolder = new QLineEdit(groupBox);
- destinationFolder->setObjectName(QString::fromUtf8("destinationFolder"));
+ destinationFolder->setObjectName(QStringLiteral("destinationFolder"));
destinationFolder->setFocusPolicy(Qt::StrongFocus);
gridLayout->addWidget(destinationFolder, 6, 1, 1, 2);
announceUrl = new QLabel(groupBox);
- announceUrl->setObjectName(QString::fromUtf8("announceUrl"));
+ announceUrl->setObjectName(QStringLiteral("announceUrl"));
gridLayout->addWidget(announceUrl, 1, 1, 1, 3);
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
browseDestination = new QPushButton(groupBox);
- browseDestination->setObjectName(QString::fromUtf8("browseDestination"));
+ browseDestination->setObjectName(QStringLiteral("browseDestination"));
gridLayout->addWidget(browseDestination, 6, 3, 1, 1);
label_7 = new QLabel(groupBox);
- label_7->setObjectName(QString::fromUtf8("label_7"));
+ label_7->setObjectName(QStringLiteral("label_7"));
gridLayout->addWidget(label_7, 3, 0, 1, 1);
commentLabel = new QLabel(groupBox);
- commentLabel->setObjectName(QString::fromUtf8("commentLabel"));
+ commentLabel->setObjectName(QStringLiteral("commentLabel"));
gridLayout->addWidget(commentLabel, 3, 1, 1, 3);
creatorLabel = new QLabel(groupBox);
- creatorLabel->setObjectName(QString::fromUtf8("creatorLabel"));
+ creatorLabel->setObjectName(QStringLiteral("creatorLabel"));
gridLayout->addWidget(creatorLabel, 2, 1, 1, 3);
sizeLabel = new QLabel(groupBox);
- sizeLabel->setObjectName(QString::fromUtf8("sizeLabel"));
+ sizeLabel->setObjectName(QStringLiteral("sizeLabel"));
gridLayout->addWidget(sizeLabel, 4, 1, 1, 3);
@@ -176,19 +176,19 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
spacerItem = new QSpacerItem(131, 31, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem);
okButton = new QPushButton(AddTorrentFile);
- okButton->setObjectName(QString::fromUtf8("okButton"));
+ okButton->setObjectName(QStringLiteral("okButton"));
okButton->setEnabled(false);
hboxLayout->addWidget(okButton);
cancelButton = new QPushButton(AddTorrentFile);
- cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+ cancelButton->setObjectName(QStringLiteral("cancelButton"));
hboxLayout->addWidget(cancelButton);
diff --git a/tests/auto/tools/uic/baseline/authenticationdialog.ui.h b/tests/auto/tools/uic/baseline/authenticationdialog.ui.h
index def597f64f..1aef4729f6 100644
--- a/tests/auto/tools/uic/baseline/authenticationdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/authenticationdialog.ui.h
@@ -41,50 +41,50 @@ public:
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
- Dialog->setObjectName(QString::fromUtf8("Dialog"));
+ Dialog->setObjectName(QStringLiteral("Dialog"));
Dialog->resize(389, 243);
gridLayout = new QGridLayout(Dialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(Dialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setWordWrap(false);
gridLayout->addWidget(label, 0, 0, 1, 2);
label_2 = new QLabel(Dialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 2, 0, 1, 1);
userEdit = new QLineEdit(Dialog);
- userEdit->setObjectName(QString::fromUtf8("userEdit"));
+ userEdit->setObjectName(QStringLiteral("userEdit"));
gridLayout->addWidget(userEdit, 2, 1, 1, 1);
label_3 = new QLabel(Dialog);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout->addWidget(label_3, 3, 0, 1, 1);
passwordEdit = new QLineEdit(Dialog);
- passwordEdit->setObjectName(QString::fromUtf8("passwordEdit"));
+ passwordEdit->setObjectName(QStringLiteral("passwordEdit"));
gridLayout->addWidget(passwordEdit, 3, 1, 1, 1);
buttonBox = new QDialogButtonBox(Dialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
gridLayout->addWidget(buttonBox, 5, 0, 1, 2);
label_4 = new QLabel(Dialog);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
gridLayout->addWidget(label_4, 1, 0, 1, 1);
siteDescription = new QLabel(Dialog);
- siteDescription->setObjectName(QString::fromUtf8("siteDescription"));
+ siteDescription->setObjectName(QStringLiteral("siteDescription"));
QFont font;
font.setBold(true);
font.setWeight(75);
diff --git a/tests/auto/tools/uic/baseline/backside.ui.h b/tests/auto/tools/uic/baseline/backside.ui.h
index f09c468a34..7e25775c98 100644
--- a/tests/auto/tools/uic/baseline/backside.ui.h
+++ b/tests/auto/tools/uic/baseline/backside.ui.h
@@ -50,47 +50,47 @@ public:
void setupUi(QWidget *BackSide)
{
if (BackSide->objectName().isEmpty())
- BackSide->setObjectName(QString::fromUtf8("BackSide"));
+ BackSide->setObjectName(QStringLiteral("BackSide"));
BackSide->resize(378, 385);
verticalLayout_2 = new QVBoxLayout(BackSide);
- verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
+ verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2"));
groupBox = new QGroupBox(BackSide);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
groupBox->setFlat(true);
groupBox->setCheckable(true);
gridLayout = new QGridLayout(groupBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
hostName = new QLineEdit(groupBox);
- hostName->setObjectName(QString::fromUtf8("hostName"));
+ hostName->setObjectName(QStringLiteral("hostName"));
gridLayout->addWidget(hostName, 0, 1, 1, 1);
label_2 = new QLabel(groupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 1, 0, 1, 1);
label_3 = new QLabel(groupBox);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout->addWidget(label_3, 2, 0, 1, 1);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
horizontalSlider = new QSlider(groupBox);
- horizontalSlider->setObjectName(QString::fromUtf8("horizontalSlider"));
+ horizontalSlider->setObjectName(QStringLiteral("horizontalSlider"));
horizontalSlider->setValue(42);
horizontalSlider->setOrientation(Qt::Horizontal);
horizontalLayout->addWidget(horizontalSlider);
spinBox = new QSpinBox(groupBox);
- spinBox->setObjectName(QString::fromUtf8("spinBox"));
+ spinBox->setObjectName(QStringLiteral("spinBox"));
spinBox->setValue(42);
horizontalLayout->addWidget(spinBox);
@@ -99,7 +99,7 @@ public:
gridLayout->addLayout(horizontalLayout, 2, 1, 1, 1);
dateTimeEdit = new QDateTimeEdit(groupBox);
- dateTimeEdit->setObjectName(QString::fromUtf8("dateTimeEdit"));
+ dateTimeEdit->setObjectName(QStringLiteral("dateTimeEdit"));
gridLayout->addWidget(dateTimeEdit, 1, 1, 1, 1);
@@ -107,11 +107,11 @@ public:
verticalLayout_2->addWidget(groupBox);
groupBox_2 = new QGroupBox(BackSide);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
groupBox_2->setFlat(true);
groupBox_2->setCheckable(true);
horizontalLayout_2 = new QHBoxLayout(groupBox_2);
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
treeWidget = new QTreeWidget(groupBox_2);
QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem(treeWidget);
QTreeWidgetItem *__qtreewidgetitem1 = new QTreeWidgetItem(__qtreewidgetitem);
@@ -124,7 +124,7 @@ public:
QTreeWidgetItem *__qtreewidgetitem4 = new QTreeWidgetItem(treeWidget);
QTreeWidgetItem *__qtreewidgetitem5 = new QTreeWidgetItem(__qtreewidgetitem4);
new QTreeWidgetItem(__qtreewidgetitem5);
- treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
+ treeWidget->setObjectName(QStringLiteral("treeWidget"));
horizontalLayout_2->addWidget(treeWidget);
diff --git a/tests/auto/tools/uic/baseline/batchtranslation.ui.h b/tests/auto/tools/uic/baseline/batchtranslation.ui.h
index 302dbc2cb4..b1ba5bee31 100644
--- a/tests/auto/tools/uic/baseline/batchtranslation.ui.h
+++ b/tests/auto/tools/uic/baseline/batchtranslation.ui.h
@@ -95,7 +95,7 @@ public:
void setupUi(QDialog *databaseTranslationDialog)
{
if (databaseTranslationDialog->objectName().isEmpty())
- databaseTranslationDialog->setObjectName(QString::fromUtf8("databaseTranslationDialog"));
+ databaseTranslationDialog->setObjectName(QStringLiteral("databaseTranslationDialog"));
databaseTranslationDialog->resize(425, 370);
vboxLayout = new QVBoxLayout(databaseTranslationDialog);
#ifndef Q_OS_MAC
@@ -104,9 +104,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(databaseTranslationDialog);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(4));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -119,15 +119,15 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
ckOnlyUntranslated = new QCheckBox(groupBox);
- ckOnlyUntranslated->setObjectName(QString::fromUtf8("ckOnlyUntranslated"));
+ ckOnlyUntranslated->setObjectName(QStringLiteral("ckOnlyUntranslated"));
ckOnlyUntranslated->setChecked(true);
vboxLayout1->addWidget(ckOnlyUntranslated);
ckMarkFinished = new QCheckBox(groupBox);
- ckMarkFinished->setObjectName(QString::fromUtf8("ckMarkFinished"));
+ ckMarkFinished->setObjectName(QStringLiteral("ckMarkFinished"));
ckMarkFinished->setChecked(true);
vboxLayout1->addWidget(ckMarkFinished);
@@ -136,7 +136,7 @@ public:
vboxLayout->addWidget(groupBox);
groupBox_2 = new QGroupBox(databaseTranslationDialog);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(1));
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -149,7 +149,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout2->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -157,9 +157,9 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
phrasebookList = new QListView(groupBox_2);
- phrasebookList->setObjectName(QString::fromUtf8("phrasebookList"));
+ phrasebookList->setObjectName(QStringLiteral("phrasebookList"));
phrasebookList->setUniformItemSizes(true);
hboxLayout->addWidget(phrasebookList);
@@ -169,14 +169,14 @@ public:
vboxLayout3->setSpacing(6);
#endif
vboxLayout3->setContentsMargins(0, 0, 0, 0);
- vboxLayout3->setObjectName(QString::fromUtf8("vboxLayout3"));
+ vboxLayout3->setObjectName(QStringLiteral("vboxLayout3"));
moveUpButton = new QPushButton(groupBox_2);
- moveUpButton->setObjectName(QString::fromUtf8("moveUpButton"));
+ moveUpButton->setObjectName(QStringLiteral("moveUpButton"));
vboxLayout3->addWidget(moveUpButton);
moveDownButton = new QPushButton(groupBox_2);
- moveDownButton->setObjectName(QString::fromUtf8("moveDownButton"));
+ moveDownButton->setObjectName(QStringLiteral("moveDownButton"));
vboxLayout3->addWidget(moveDownButton);
@@ -191,7 +191,7 @@ public:
vboxLayout2->addLayout(hboxLayout);
label = new QLabel(groupBox_2);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setWordWrap(true);
vboxLayout2->addWidget(label);
@@ -204,18 +204,18 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
spacerItem1 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout1->addItem(spacerItem1);
runButton = new QPushButton(databaseTranslationDialog);
- runButton->setObjectName(QString::fromUtf8("runButton"));
+ runButton->setObjectName(QStringLiteral("runButton"));
hboxLayout1->addWidget(runButton);
cancelButton = new QPushButton(databaseTranslationDialog);
- cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+ cancelButton->setObjectName(QStringLiteral("cancelButton"));
hboxLayout1->addWidget(cancelButton);
diff --git a/tests/auto/tools/uic/baseline/bookmarkdialog.ui.h b/tests/auto/tools/uic/baseline/bookmarkdialog.ui.h
index a178497e26..33c0d19ee2 100644
--- a/tests/auto/tools/uic/baseline/bookmarkdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/bookmarkdialog.ui.h
@@ -51,7 +51,7 @@ public:
void setupUi(QDialog *BookmarkDialog)
{
if (BookmarkDialog->objectName().isEmpty())
- BookmarkDialog->setObjectName(QString::fromUtf8("BookmarkDialog"));
+ BookmarkDialog->setObjectName(QStringLiteral("BookmarkDialog"));
BookmarkDialog->resize(450, 135);
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
@@ -59,18 +59,18 @@ public:
sizePolicy.setHeightForWidth(BookmarkDialog->sizePolicy().hasHeightForWidth());
BookmarkDialog->setSizePolicy(sizePolicy);
verticalLayout_3 = new QVBoxLayout(BookmarkDialog);
- verticalLayout_3->setObjectName(QString::fromUtf8("verticalLayout_3"));
+ verticalLayout_3->setObjectName(QStringLiteral("verticalLayout_3"));
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
verticalLayout_2 = new QVBoxLayout();
- verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
+ verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2"));
label = new QLabel(BookmarkDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
verticalLayout_2->addWidget(label);
label_2 = new QLabel(BookmarkDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
verticalLayout_2->addWidget(label_2);
@@ -78,14 +78,14 @@ public:
horizontalLayout->addLayout(verticalLayout_2);
verticalLayout = new QVBoxLayout();
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
bookmarkEdit = new QLineEdit(BookmarkDialog);
- bookmarkEdit->setObjectName(QString::fromUtf8("bookmarkEdit"));
+ bookmarkEdit->setObjectName(QStringLiteral("bookmarkEdit"));
verticalLayout->addWidget(bookmarkEdit);
bookmarkFolders = new QComboBox(BookmarkDialog);
- bookmarkFolders->setObjectName(QString::fromUtf8("bookmarkFolders"));
+ bookmarkFolders->setObjectName(QStringLiteral("bookmarkFolders"));
verticalLayout->addWidget(bookmarkFolders);
@@ -96,15 +96,15 @@ public:
verticalLayout_3->addLayout(horizontalLayout);
horizontalLayout_3 = new QHBoxLayout();
- horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
+ horizontalLayout_3->setObjectName(QStringLiteral("horizontalLayout_3"));
toolButton = new QToolButton(BookmarkDialog);
- toolButton->setObjectName(QString::fromUtf8("toolButton"));
+ toolButton->setObjectName(QStringLiteral("toolButton"));
toolButton->setMinimumSize(QSize(25, 20));
horizontalLayout_3->addWidget(toolButton);
line = new QFrame(BookmarkDialog);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
@@ -114,7 +114,7 @@ public:
verticalLayout_3->addLayout(horizontalLayout_3);
bookmarkWidget = new BookmarkWidget(BookmarkDialog);
- bookmarkWidget->setObjectName(QString::fromUtf8("bookmarkWidget"));
+ bookmarkWidget->setObjectName(QStringLiteral("bookmarkWidget"));
bookmarkWidget->setEnabled(true);
QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Ignored);
sizePolicy1.setHorizontalStretch(0);
@@ -125,14 +125,14 @@ public:
verticalLayout_3->addWidget(bookmarkWidget);
horizontalLayout_4 = new QHBoxLayout();
- horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
+ horizontalLayout_4->setObjectName(QStringLiteral("horizontalLayout_4"));
newFolderButton = new QPushButton(BookmarkDialog);
- newFolderButton->setObjectName(QString::fromUtf8("newFolderButton"));
+ newFolderButton->setObjectName(QStringLiteral("newFolderButton"));
horizontalLayout_4->addWidget(newFolderButton);
buttonBox = new QDialogButtonBox(BookmarkDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/bookwindow.ui.h b/tests/auto/tools/uic/baseline/bookwindow.ui.h
index 0463aeb8c9..d27717296c 100644
--- a/tests/auto/tools/uic/baseline/bookwindow.ui.h
+++ b/tests/auto/tools/uic/baseline/bookwindow.ui.h
@@ -52,10 +52,10 @@ public:
void setupUi(QMainWindow *BookWindow)
{
if (BookWindow->objectName().isEmpty())
- BookWindow->setObjectName(QString::fromUtf8("BookWindow"));
+ BookWindow->setObjectName(QStringLiteral("BookWindow"));
BookWindow->resize(601, 420);
centralWidget = new QWidget(BookWindow);
- centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+ centralWidget->setObjectName(QStringLiteral("centralWidget"));
vboxLayout = new QVBoxLayout(centralWidget);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
@@ -63,9 +63,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(centralWidget);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
vboxLayout1 = new QVBoxLayout(groupBox);
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
@@ -73,57 +73,57 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
bookTable = new QTableView(groupBox);
- bookTable->setObjectName(QString::fromUtf8("bookTable"));
+ bookTable->setObjectName(QStringLiteral("bookTable"));
bookTable->setSelectionBehavior(QAbstractItemView::SelectRows);
vboxLayout1->addWidget(bookTable);
groupBox_2 = new QGroupBox(groupBox);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
formLayout = new QFormLayout(groupBox_2);
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
label_5 = new QLabel(groupBox_2);
- label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setObjectName(QStringLiteral("label_5"));
formLayout->setWidget(0, QFormLayout::LabelRole, label_5);
titleEdit = new QLineEdit(groupBox_2);
- titleEdit->setObjectName(QString::fromUtf8("titleEdit"));
+ titleEdit->setObjectName(QStringLiteral("titleEdit"));
titleEdit->setEnabled(true);
formLayout->setWidget(0, QFormLayout::FieldRole, titleEdit);
label_2_2_2_2 = new QLabel(groupBox_2);
- label_2_2_2_2->setObjectName(QString::fromUtf8("label_2_2_2_2"));
+ label_2_2_2_2->setObjectName(QStringLiteral("label_2_2_2_2"));
formLayout->setWidget(1, QFormLayout::LabelRole, label_2_2_2_2);
authorEdit = new QComboBox(groupBox_2);
- authorEdit->setObjectName(QString::fromUtf8("authorEdit"));
+ authorEdit->setObjectName(QStringLiteral("authorEdit"));
authorEdit->setEnabled(true);
formLayout->setWidget(1, QFormLayout::FieldRole, authorEdit);
label_3 = new QLabel(groupBox_2);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
formLayout->setWidget(2, QFormLayout::LabelRole, label_3);
genreEdit = new QComboBox(groupBox_2);
- genreEdit->setObjectName(QString::fromUtf8("genreEdit"));
+ genreEdit->setObjectName(QStringLiteral("genreEdit"));
genreEdit->setEnabled(true);
formLayout->setWidget(2, QFormLayout::FieldRole, genreEdit);
label_4 = new QLabel(groupBox_2);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
formLayout->setWidget(3, QFormLayout::LabelRole, label_4);
yearEdit = new QSpinBox(groupBox_2);
- yearEdit->setObjectName(QString::fromUtf8("yearEdit"));
+ yearEdit->setObjectName(QStringLiteral("yearEdit"));
yearEdit->setEnabled(true);
yearEdit->setMaximum(2100);
yearEdit->setMinimum(-1000);
@@ -131,12 +131,12 @@ public:
formLayout->setWidget(3, QFormLayout::FieldRole, yearEdit);
label = new QLabel(groupBox_2);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
formLayout->setWidget(4, QFormLayout::LabelRole, label);
ratingEdit = new QSpinBox(groupBox_2);
- ratingEdit->setObjectName(QString::fromUtf8("ratingEdit"));
+ ratingEdit->setObjectName(QStringLiteral("ratingEdit"));
ratingEdit->setMaximum(5);
formLayout->setWidget(4, QFormLayout::FieldRole, ratingEdit);
diff --git a/tests/auto/tools/uic/baseline/browserwidget.ui.h b/tests/auto/tools/uic/baseline/browserwidget.ui.h
index 7214898a4f..9d7a648b21 100644
--- a/tests/auto/tools/uic/baseline/browserwidget.ui.h
+++ b/tests/auto/tools/uic/baseline/browserwidget.ui.h
@@ -48,22 +48,22 @@ public:
void setupUi(QWidget *Browser)
{
if (Browser->objectName().isEmpty())
- Browser->setObjectName(QString::fromUtf8("Browser"));
+ Browser->setObjectName(QStringLiteral("Browser"));
Browser->resize(765, 515);
insertRowAction = new QAction(Browser);
- insertRowAction->setObjectName(QString::fromUtf8("insertRowAction"));
+ insertRowAction->setObjectName(QStringLiteral("insertRowAction"));
insertRowAction->setEnabled(false);
deleteRowAction = new QAction(Browser);
- deleteRowAction->setObjectName(QString::fromUtf8("deleteRowAction"));
+ deleteRowAction->setObjectName(QStringLiteral("deleteRowAction"));
deleteRowAction->setEnabled(false);
vboxLayout = new QVBoxLayout(Browser);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(8, 8, 8, 8);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
splitter_2 = new QSplitter(Browser);
- splitter_2->setObjectName(QString::fromUtf8("splitter_2"));
+ splitter_2->setObjectName(QStringLiteral("splitter_2"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(7));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -71,7 +71,7 @@ public:
splitter_2->setSizePolicy(sizePolicy);
splitter_2->setOrientation(Qt::Horizontal);
connectionWidget = new ConnectionWidget(splitter_2);
- connectionWidget->setObjectName(QString::fromUtf8("connectionWidget"));
+ connectionWidget->setObjectName(QStringLiteral("connectionWidget"));
QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(13), static_cast<QSizePolicy::Policy>(7));
sizePolicy1.setHorizontalStretch(1);
sizePolicy1.setVerticalStretch(0);
@@ -79,7 +79,7 @@ public:
connectionWidget->setSizePolicy(sizePolicy1);
splitter_2->addWidget(connectionWidget);
table = new QTableView(splitter_2);
- table->setObjectName(QString::fromUtf8("table"));
+ table->setObjectName(QStringLiteral("table"));
QSizePolicy sizePolicy2(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(7));
sizePolicy2.setHorizontalStretch(2);
sizePolicy2.setVerticalStretch(0);
@@ -92,7 +92,7 @@ public:
vboxLayout->addWidget(splitter_2);
groupBox = new QGroupBox(Browser);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
QSizePolicy sizePolicy3(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(3));
sizePolicy3.setHorizontalStretch(0);
sizePolicy3.setVerticalStretch(0);
@@ -106,9 +106,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
sqlEdit = new QTextEdit(groupBox);
- sqlEdit->setObjectName(QString::fromUtf8("sqlEdit"));
+ sqlEdit->setObjectName(QStringLiteral("sqlEdit"));
QSizePolicy sizePolicy4(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(3));
sizePolicy4.setHorizontalStretch(0);
sizePolicy4.setVerticalStretch(0);
@@ -124,18 +124,18 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(1, 1, 1, 1);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem);
clearButton = new QPushButton(groupBox);
- clearButton->setObjectName(QString::fromUtf8("clearButton"));
+ clearButton->setObjectName(QStringLiteral("clearButton"));
hboxLayout->addWidget(clearButton);
submitButton = new QPushButton(groupBox);
- submitButton->setObjectName(QString::fromUtf8("submitButton"));
+ submitButton->setObjectName(QStringLiteral("submitButton"));
hboxLayout->addWidget(submitButton);
diff --git a/tests/auto/tools/uic/baseline/calculator.ui.h b/tests/auto/tools/uic/baseline/calculator.ui.h
index 3d69c9fdfd..8a33fcbbd9 100644
--- a/tests/auto/tools/uic/baseline/calculator.ui.h
+++ b/tests/auto/tools/uic/baseline/calculator.ui.h
@@ -56,7 +56,7 @@ public:
void setupUi(QWidget *Calculator)
{
if (Calculator->objectName().isEmpty())
- Calculator->setObjectName(QString::fromUtf8("Calculator"));
+ Calculator->setObjectName(QStringLiteral("Calculator"));
Calculator->resize(314, 301);
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
@@ -66,88 +66,88 @@ public:
Calculator->setMinimumSize(QSize(314, 301));
Calculator->setMaximumSize(QSize(314, 301));
backspaceButton = new QToolButton(Calculator);
- backspaceButton->setObjectName(QString::fromUtf8("backspaceButton"));
+ backspaceButton->setObjectName(QStringLiteral("backspaceButton"));
backspaceButton->setGeometry(QRect(10, 50, 91, 41));
clearButton = new QToolButton(Calculator);
- clearButton->setObjectName(QString::fromUtf8("clearButton"));
+ clearButton->setObjectName(QStringLiteral("clearButton"));
clearButton->setGeometry(QRect(110, 50, 91, 41));
clearAllButton = new QToolButton(Calculator);
- clearAllButton->setObjectName(QString::fromUtf8("clearAllButton"));
+ clearAllButton->setObjectName(QStringLiteral("clearAllButton"));
clearAllButton->setGeometry(QRect(210, 50, 91, 41));
clearMemoryButton = new QToolButton(Calculator);
- clearMemoryButton->setObjectName(QString::fromUtf8("clearMemoryButton"));
+ clearMemoryButton->setObjectName(QStringLiteral("clearMemoryButton"));
clearMemoryButton->setGeometry(QRect(10, 100, 41, 41));
readMemoryButton = new QToolButton(Calculator);
- readMemoryButton->setObjectName(QString::fromUtf8("readMemoryButton"));
+ readMemoryButton->setObjectName(QStringLiteral("readMemoryButton"));
readMemoryButton->setGeometry(QRect(10, 150, 41, 41));
setMemoryButton = new QToolButton(Calculator);
- setMemoryButton->setObjectName(QString::fromUtf8("setMemoryButton"));
+ setMemoryButton->setObjectName(QStringLiteral("setMemoryButton"));
setMemoryButton->setGeometry(QRect(10, 200, 41, 41));
addToMemoryButton = new QToolButton(Calculator);
- addToMemoryButton->setObjectName(QString::fromUtf8("addToMemoryButton"));
+ addToMemoryButton->setObjectName(QStringLiteral("addToMemoryButton"));
addToMemoryButton->setGeometry(QRect(10, 250, 41, 41));
sevenButton = new QToolButton(Calculator);
- sevenButton->setObjectName(QString::fromUtf8("sevenButton"));
+ sevenButton->setObjectName(QStringLiteral("sevenButton"));
sevenButton->setGeometry(QRect(60, 100, 41, 41));
eightButton = new QToolButton(Calculator);
- eightButton->setObjectName(QString::fromUtf8("eightButton"));
+ eightButton->setObjectName(QStringLiteral("eightButton"));
eightButton->setGeometry(QRect(110, 100, 41, 41));
nineButton = new QToolButton(Calculator);
- nineButton->setObjectName(QString::fromUtf8("nineButton"));
+ nineButton->setObjectName(QStringLiteral("nineButton"));
nineButton->setGeometry(QRect(160, 100, 41, 41));
fourButton = new QToolButton(Calculator);
- fourButton->setObjectName(QString::fromUtf8("fourButton"));
+ fourButton->setObjectName(QStringLiteral("fourButton"));
fourButton->setGeometry(QRect(60, 150, 41, 41));
fiveButton = new QToolButton(Calculator);
- fiveButton->setObjectName(QString::fromUtf8("fiveButton"));
+ fiveButton->setObjectName(QStringLiteral("fiveButton"));
fiveButton->setGeometry(QRect(110, 150, 41, 41));
sixButton = new QToolButton(Calculator);
- sixButton->setObjectName(QString::fromUtf8("sixButton"));
+ sixButton->setObjectName(QStringLiteral("sixButton"));
sixButton->setGeometry(QRect(160, 150, 41, 41));
oneButton = new QToolButton(Calculator);
- oneButton->setObjectName(QString::fromUtf8("oneButton"));
+ oneButton->setObjectName(QStringLiteral("oneButton"));
oneButton->setGeometry(QRect(60, 200, 41, 41));
twoButton = new QToolButton(Calculator);
- twoButton->setObjectName(QString::fromUtf8("twoButton"));
+ twoButton->setObjectName(QStringLiteral("twoButton"));
twoButton->setGeometry(QRect(110, 200, 41, 41));
threeButton = new QToolButton(Calculator);
- threeButton->setObjectName(QString::fromUtf8("threeButton"));
+ threeButton->setObjectName(QStringLiteral("threeButton"));
threeButton->setGeometry(QRect(160, 200, 41, 41));
zeroButton = new QToolButton(Calculator);
- zeroButton->setObjectName(QString::fromUtf8("zeroButton"));
+ zeroButton->setObjectName(QStringLiteral("zeroButton"));
zeroButton->setGeometry(QRect(60, 250, 41, 41));
pointButton = new QToolButton(Calculator);
- pointButton->setObjectName(QString::fromUtf8("pointButton"));
+ pointButton->setObjectName(QStringLiteral("pointButton"));
pointButton->setGeometry(QRect(110, 250, 41, 41));
changeSignButton = new QToolButton(Calculator);
- changeSignButton->setObjectName(QString::fromUtf8("changeSignButton"));
+ changeSignButton->setObjectName(QStringLiteral("changeSignButton"));
changeSignButton->setGeometry(QRect(160, 250, 41, 41));
plusButton = new QToolButton(Calculator);
- plusButton->setObjectName(QString::fromUtf8("plusButton"));
+ plusButton->setObjectName(QStringLiteral("plusButton"));
plusButton->setGeometry(QRect(210, 250, 41, 41));
divisionButton = new QToolButton(Calculator);
- divisionButton->setObjectName(QString::fromUtf8("divisionButton"));
+ divisionButton->setObjectName(QStringLiteral("divisionButton"));
divisionButton->setGeometry(QRect(210, 100, 41, 41));
timesButton = new QToolButton(Calculator);
- timesButton->setObjectName(QString::fromUtf8("timesButton"));
+ timesButton->setObjectName(QStringLiteral("timesButton"));
timesButton->setGeometry(QRect(210, 150, 41, 41));
minusButton = new QToolButton(Calculator);
- minusButton->setObjectName(QString::fromUtf8("minusButton"));
+ minusButton->setObjectName(QStringLiteral("minusButton"));
minusButton->setGeometry(QRect(210, 200, 41, 41));
squareRootButton = new QToolButton(Calculator);
- squareRootButton->setObjectName(QString::fromUtf8("squareRootButton"));
+ squareRootButton->setObjectName(QStringLiteral("squareRootButton"));
squareRootButton->setGeometry(QRect(260, 100, 41, 41));
powerButton = new QToolButton(Calculator);
- powerButton->setObjectName(QString::fromUtf8("powerButton"));
+ powerButton->setObjectName(QStringLiteral("powerButton"));
powerButton->setGeometry(QRect(260, 150, 41, 41));
reciprocalButton = new QToolButton(Calculator);
- reciprocalButton->setObjectName(QString::fromUtf8("reciprocalButton"));
+ reciprocalButton->setObjectName(QStringLiteral("reciprocalButton"));
reciprocalButton->setGeometry(QRect(260, 200, 41, 41));
equalButton = new QToolButton(Calculator);
- equalButton->setObjectName(QString::fromUtf8("equalButton"));
+ equalButton->setObjectName(QStringLiteral("equalButton"));
equalButton->setGeometry(QRect(260, 250, 41, 41));
display = new QLineEdit(Calculator);
- display->setObjectName(QString::fromUtf8("display"));
+ display->setObjectName(QStringLiteral("display"));
display->setGeometry(QRect(10, 10, 291, 31));
display->setMaxLength(15);
display->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
diff --git a/tests/auto/tools/uic/baseline/calculatorform.ui.h b/tests/auto/tools/uic/baseline/calculatorform.ui.h
index b38a940448..cbc62367e0 100644
--- a/tests/auto/tools/uic/baseline/calculatorform.ui.h
+++ b/tests/auto/tools/uic/baseline/calculatorform.ui.h
@@ -47,7 +47,7 @@ public:
void setupUi(QWidget *CalculatorForm)
{
if (CalculatorForm->objectName().isEmpty())
- CalculatorForm->setObjectName(QString::fromUtf8("CalculatorForm"));
+ CalculatorForm->setObjectName(QStringLiteral("CalculatorForm"));
CalculatorForm->resize(276, 98);
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(5));
sizePolicy.setHorizontalStretch(0);
@@ -61,30 +61,30 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
- gridLayout->setObjectName(QString::fromUtf8(""));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral(""));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(1, 1, 1, 1);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
- hboxLayout->setObjectName(QString::fromUtf8(""));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral(""));
vboxLayout = new QVBoxLayout();
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(1, 1, 1, 1);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
- vboxLayout->setObjectName(QString::fromUtf8(""));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral(""));
label = new QLabel(CalculatorForm);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setGeometry(QRect(1, 1, 45, 19));
vboxLayout->addWidget(label);
inputSpinBox1 = new QSpinBox(CalculatorForm);
- inputSpinBox1->setObjectName(QString::fromUtf8("inputSpinBox1"));
+ inputSpinBox1->setObjectName(QStringLiteral("inputSpinBox1"));
inputSpinBox1->setGeometry(QRect(1, 26, 45, 25));
inputSpinBox1->setMouseTracking(true);
@@ -94,7 +94,7 @@ public:
hboxLayout->addLayout(vboxLayout);
label_3 = new QLabel(CalculatorForm);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
label_3->setGeometry(QRect(54, 1, 7, 52));
label_3->setAlignment(Qt::AlignCenter);
@@ -105,16 +105,16 @@ public:
vboxLayout1->setSpacing(6);
#endif
vboxLayout1->setContentsMargins(1, 1, 1, 1);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
- vboxLayout1->setObjectName(QString::fromUtf8(""));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral(""));
label_2 = new QLabel(CalculatorForm);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
label_2->setGeometry(QRect(1, 1, 45, 19));
vboxLayout1->addWidget(label_2);
inputSpinBox2 = new QSpinBox(CalculatorForm);
- inputSpinBox2->setObjectName(QString::fromUtf8("inputSpinBox2"));
+ inputSpinBox2->setObjectName(QStringLiteral("inputSpinBox2"));
inputSpinBox2->setGeometry(QRect(1, 26, 45, 25));
inputSpinBox2->setMouseTracking(true);
@@ -124,7 +124,7 @@ public:
hboxLayout->addLayout(vboxLayout1);
label_3_2 = new QLabel(CalculatorForm);
- label_3_2->setObjectName(QString::fromUtf8("label_3_2"));
+ label_3_2->setObjectName(QStringLiteral("label_3_2"));
label_3_2->setGeometry(QRect(120, 1, 7, 52));
label_3_2->setAlignment(Qt::AlignCenter);
@@ -135,16 +135,16 @@ public:
vboxLayout2->setSpacing(6);
#endif
vboxLayout2->setContentsMargins(1, 1, 1, 1);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
- vboxLayout2->setObjectName(QString::fromUtf8(""));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral(""));
label_2_2_2 = new QLabel(CalculatorForm);
- label_2_2_2->setObjectName(QString::fromUtf8("label_2_2_2"));
+ label_2_2_2->setObjectName(QStringLiteral("label_2_2_2"));
label_2_2_2->setGeometry(QRect(1, 1, 37, 17));
vboxLayout2->addWidget(label_2_2_2);
outputWidget = new QLabel(CalculatorForm);
- outputWidget->setObjectName(QString::fromUtf8("outputWidget"));
+ outputWidget->setObjectName(QStringLiteral("outputWidget"));
outputWidget->setGeometry(QRect(1, 24, 37, 27));
outputWidget->setFrameShape(QFrame::Box);
outputWidget->setFrameShadow(QFrame::Sunken);
diff --git a/tests/auto/tools/uic/baseline/certificateinfo.ui.h b/tests/auto/tools/uic/baseline/certificateinfo.ui.h
index e047aeddc0..8ea1ebebf7 100644
--- a/tests/auto/tools/uic/baseline/certificateinfo.ui.h
+++ b/tests/auto/tools/uic/baseline/certificateinfo.ui.h
@@ -42,16 +42,16 @@ public:
void setupUi(QDialog *CertificateInfo)
{
if (CertificateInfo->objectName().isEmpty())
- CertificateInfo->setObjectName(QString::fromUtf8("CertificateInfo"));
+ CertificateInfo->setObjectName(QStringLiteral("CertificateInfo"));
CertificateInfo->resize(400, 397);
vboxLayout = new QVBoxLayout(CertificateInfo);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(CertificateInfo);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
hboxLayout = new QHBoxLayout(groupBox);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
certificationPathView = new QListWidget(groupBox);
- certificationPathView->setObjectName(QString::fromUtf8("certificationPathView"));
+ certificationPathView->setObjectName(QStringLiteral("certificationPathView"));
hboxLayout->addWidget(certificationPathView);
@@ -59,11 +59,11 @@ public:
vboxLayout->addWidget(groupBox);
groupBox_2 = new QGroupBox(CertificateInfo);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
hboxLayout1 = new QHBoxLayout(groupBox_2);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
certificateInfoView = new QListWidget(groupBox_2);
- certificateInfoView->setObjectName(QString::fromUtf8("certificateInfoView"));
+ certificateInfoView->setObjectName(QStringLiteral("certificateInfoView"));
hboxLayout1->addWidget(certificateInfoView);
@@ -71,13 +71,13 @@ public:
vboxLayout->addWidget(groupBox_2);
hboxLayout2 = new QHBoxLayout();
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout2->addItem(spacerItem);
buttonBox = new QDialogButtonBox(CertificateInfo);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setStandardButtons(QDialogButtonBox::Close);
hboxLayout2->addWidget(buttonBox);
diff --git a/tests/auto/tools/uic/baseline/chatdialog.ui.h b/tests/auto/tools/uic/baseline/chatdialog.ui.h
index 216e627e76..473d20de70 100644
--- a/tests/auto/tools/uic/baseline/chatdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/chatdialog.ui.h
@@ -39,7 +39,7 @@ public:
void setupUi(QDialog *ChatDialog)
{
if (ChatDialog->objectName().isEmpty())
- ChatDialog->setObjectName(QString::fromUtf8("ChatDialog"));
+ ChatDialog->setObjectName(QStringLiteral("ChatDialog"));
ChatDialog->resize(513, 349);
vboxLayout = new QVBoxLayout(ChatDialog);
#ifndef Q_OS_MAC
@@ -48,7 +48,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -56,16 +56,16 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
textEdit = new QTextEdit(ChatDialog);
- textEdit->setObjectName(QString::fromUtf8("textEdit"));
+ textEdit->setObjectName(QStringLiteral("textEdit"));
textEdit->setFocusPolicy(Qt::NoFocus);
textEdit->setReadOnly(true);
hboxLayout->addWidget(textEdit);
listWidget = new QListWidget(ChatDialog);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
listWidget->setMaximumSize(QSize(180, 16777215));
listWidget->setFocusPolicy(Qt::NoFocus);
@@ -79,14 +79,14 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
label = new QLabel(ChatDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout1->addWidget(label);
lineEdit = new QLineEdit(ChatDialog);
- lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
+ lineEdit->setObjectName(QStringLiteral("lineEdit"));
hboxLayout1->addWidget(lineEdit);
diff --git a/tests/auto/tools/uic/baseline/chatmainwindow.ui.h b/tests/auto/tools/uic/baseline/chatmainwindow.ui.h
index 1001e85931..c077dd7501 100644
--- a/tests/auto/tools/uic/baseline/chatmainwindow.ui.h
+++ b/tests/auto/tools/uic/baseline/chatmainwindow.ui.h
@@ -51,16 +51,16 @@ public:
void setupUi(QMainWindow *ChatMainWindow)
{
if (ChatMainWindow->objectName().isEmpty())
- ChatMainWindow->setObjectName(QString::fromUtf8("ChatMainWindow"));
+ ChatMainWindow->setObjectName(QStringLiteral("ChatMainWindow"));
ChatMainWindow->resize(800, 600);
actionQuit = new QAction(ChatMainWindow);
- actionQuit->setObjectName(QString::fromUtf8("actionQuit"));
+ actionQuit->setObjectName(QStringLiteral("actionQuit"));
actionAboutQt = new QAction(ChatMainWindow);
- actionAboutQt->setObjectName(QString::fromUtf8("actionAboutQt"));
+ actionAboutQt->setObjectName(QStringLiteral("actionAboutQt"));
actionChangeNickname = new QAction(ChatMainWindow);
- actionChangeNickname->setObjectName(QString::fromUtf8("actionChangeNickname"));
+ actionChangeNickname->setObjectName(QStringLiteral("actionChangeNickname"));
centralwidget = new QWidget(ChatMainWindow);
- centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
+ centralwidget->setObjectName(QStringLiteral("centralwidget"));
hboxLayout = new QHBoxLayout(centralwidget);
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -68,7 +68,7 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
vboxLayout = new QVBoxLayout();
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
@@ -76,9 +76,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
chatHistory = new QTextBrowser(centralwidget);
- chatHistory->setObjectName(QString::fromUtf8("chatHistory"));
+ chatHistory->setObjectName(QStringLiteral("chatHistory"));
chatHistory->setAcceptDrops(false);
chatHistory->setAcceptRichText(true);
@@ -89,19 +89,19 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
label = new QLabel(centralwidget);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout1->addWidget(label);
messageLineEdit = new QLineEdit(centralwidget);
- messageLineEdit->setObjectName(QString::fromUtf8("messageLineEdit"));
+ messageLineEdit->setObjectName(QStringLiteral("messageLineEdit"));
hboxLayout1->addWidget(messageLineEdit);
sendButton = new QPushButton(centralwidget);
- sendButton->setObjectName(QString::fromUtf8("sendButton"));
+ sendButton->setObjectName(QStringLiteral("sendButton"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(1), static_cast<QSizePolicy::Policy>(0));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -118,15 +118,15 @@ public:
ChatMainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(ChatMainWindow);
- menubar->setObjectName(QString::fromUtf8("menubar"));
+ menubar->setObjectName(QStringLiteral("menubar"));
menubar->setGeometry(QRect(0, 0, 800, 31));
menuQuit = new QMenu(menubar);
- menuQuit->setObjectName(QString::fromUtf8("menuQuit"));
+ menuQuit->setObjectName(QStringLiteral("menuQuit"));
menuFile = new QMenu(menubar);
- menuFile->setObjectName(QString::fromUtf8("menuFile"));
+ menuFile->setObjectName(QStringLiteral("menuFile"));
ChatMainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(ChatMainWindow);
- statusbar->setObjectName(QString::fromUtf8("statusbar"));
+ statusbar->setObjectName(QStringLiteral("statusbar"));
ChatMainWindow->setStatusBar(statusbar);
#ifndef QT_NO_SHORTCUT
label->setBuddy(messageLineEdit);
diff --git a/tests/auto/tools/uic/baseline/chatsetnickname.ui.h b/tests/auto/tools/uic/baseline/chatsetnickname.ui.h
index ee69d36476..e0de690715 100644
--- a/tests/auto/tools/uic/baseline/chatsetnickname.ui.h
+++ b/tests/auto/tools/uic/baseline/chatsetnickname.ui.h
@@ -41,7 +41,7 @@ public:
void setupUi(QDialog *NicknameDialog)
{
if (NicknameDialog->objectName().isEmpty())
- NicknameDialog->setObjectName(QString::fromUtf8("NicknameDialog"));
+ NicknameDialog->setObjectName(QStringLiteral("NicknameDialog"));
NicknameDialog->resize(396, 105);
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(1), static_cast<QSizePolicy::Policy>(1));
sizePolicy.setHorizontalStretch(0);
@@ -55,7 +55,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout1 = new QVBoxLayout();
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
@@ -63,16 +63,16 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(0, 0, 0, 0);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
label = new QLabel(NicknameDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
sizePolicy.setHeightForWidth(label->sizePolicy().hasHeightForWidth());
label->setSizePolicy(sizePolicy);
vboxLayout1->addWidget(label);
nickname = new QLineEdit(NicknameDialog);
- nickname->setObjectName(QString::fromUtf8("nickname"));
+ nickname->setObjectName(QStringLiteral("nickname"));
vboxLayout1->addWidget(nickname);
@@ -84,18 +84,18 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
spacerItem = new QSpacerItem(131, 31, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem);
okButton = new QPushButton(NicknameDialog);
- okButton->setObjectName(QString::fromUtf8("okButton"));
+ okButton->setObjectName(QStringLiteral("okButton"));
hboxLayout->addWidget(okButton);
cancelButton = new QPushButton(NicknameDialog);
- cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+ cancelButton->setObjectName(QStringLiteral("cancelButton"));
hboxLayout->addWidget(cancelButton);
diff --git a/tests/auto/tools/uic/baseline/config.ui.h b/tests/auto/tools/uic/baseline/config.ui.h
index 5606978f09..cf21fd8c6f 100644
--- a/tests/auto/tools/uic/baseline/config.ui.h
+++ b/tests/auto/tools/uic/baseline/config.ui.h
@@ -135,20 +135,20 @@ public:
void setupUi(QDialog *Config)
{
if (Config->objectName().isEmpty())
- Config->setObjectName(QString::fromUtf8("Config"));
+ Config->setObjectName(QStringLiteral("Config"));
Config->resize(600, 650);
Config->setSizeGripEnabled(true);
vboxLayout = new QVBoxLayout(Config);
vboxLayout->setSpacing(6);
vboxLayout->setContentsMargins(11, 11, 11, 11);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(8, 8, 8, 8);
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(6);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
hboxLayout->setContentsMargins(0, 0, 0, 0);
ButtonGroup1 = new QGroupBox(Config);
- ButtonGroup1->setObjectName(QString::fromUtf8("ButtonGroup1"));
+ ButtonGroup1->setObjectName(QStringLiteral("ButtonGroup1"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -157,44 +157,44 @@ public:
vboxLayout1 = new QVBoxLayout(ButtonGroup1);
vboxLayout1->setSpacing(6);
vboxLayout1->setContentsMargins(11, 11, 11, 11);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
vboxLayout1->setContentsMargins(11, 11, 11, 11);
size_176_220 = new QRadioButton(ButtonGroup1);
- size_176_220->setObjectName(QString::fromUtf8("size_176_220"));
+ size_176_220->setObjectName(QStringLiteral("size_176_220"));
vboxLayout1->addWidget(size_176_220);
size_240_320 = new QRadioButton(ButtonGroup1);
- size_240_320->setObjectName(QString::fromUtf8("size_240_320"));
+ size_240_320->setObjectName(QStringLiteral("size_240_320"));
vboxLayout1->addWidget(size_240_320);
size_320_240 = new QRadioButton(ButtonGroup1);
- size_320_240->setObjectName(QString::fromUtf8("size_320_240"));
+ size_320_240->setObjectName(QStringLiteral("size_320_240"));
vboxLayout1->addWidget(size_320_240);
size_640_480 = new QRadioButton(ButtonGroup1);
- size_640_480->setObjectName(QString::fromUtf8("size_640_480"));
+ size_640_480->setObjectName(QStringLiteral("size_640_480"));
vboxLayout1->addWidget(size_640_480);
size_800_600 = new QRadioButton(ButtonGroup1);
- size_800_600->setObjectName(QString::fromUtf8("size_800_600"));
+ size_800_600->setObjectName(QStringLiteral("size_800_600"));
vboxLayout1->addWidget(size_800_600);
size_1024_768 = new QRadioButton(ButtonGroup1);
- size_1024_768->setObjectName(QString::fromUtf8("size_1024_768"));
+ size_1024_768->setObjectName(QStringLiteral("size_1024_768"));
vboxLayout1->addWidget(size_1024_768);
hboxLayout1 = new QHBoxLayout();
hboxLayout1->setSpacing(6);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
hboxLayout1->setContentsMargins(0, 0, 0, 0);
size_custom = new QRadioButton(ButtonGroup1);
- size_custom->setObjectName(QString::fromUtf8("size_custom"));
+ size_custom->setObjectName(QStringLiteral("size_custom"));
QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -204,7 +204,7 @@ public:
hboxLayout1->addWidget(size_custom);
size_width = new QSpinBox(ButtonGroup1);
- size_width->setObjectName(QString::fromUtf8("size_width"));
+ size_width->setObjectName(QStringLiteral("size_width"));
size_width->setMinimum(1);
size_width->setMaximum(1280);
size_width->setSingleStep(16);
@@ -213,7 +213,7 @@ public:
hboxLayout1->addWidget(size_width);
size_height = new QSpinBox(ButtonGroup1);
- size_height->setObjectName(QString::fromUtf8("size_height"));
+ size_height->setObjectName(QStringLiteral("size_height"));
size_height->setMinimum(1);
size_height->setMaximum(1024);
size_height->setSingleStep(16);
@@ -228,59 +228,59 @@ public:
hboxLayout->addWidget(ButtonGroup1);
ButtonGroup2 = new QGroupBox(Config);
- ButtonGroup2->setObjectName(QString::fromUtf8("ButtonGroup2"));
+ ButtonGroup2->setObjectName(QStringLiteral("ButtonGroup2"));
vboxLayout2 = new QVBoxLayout(ButtonGroup2);
vboxLayout2->setSpacing(6);
vboxLayout2->setContentsMargins(11, 11, 11, 11);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
vboxLayout2->setContentsMargins(11, 11, 11, 11);
depth_1 = new QRadioButton(ButtonGroup2);
- depth_1->setObjectName(QString::fromUtf8("depth_1"));
+ depth_1->setObjectName(QStringLiteral("depth_1"));
vboxLayout2->addWidget(depth_1);
depth_4gray = new QRadioButton(ButtonGroup2);
- depth_4gray->setObjectName(QString::fromUtf8("depth_4gray"));
+ depth_4gray->setObjectName(QStringLiteral("depth_4gray"));
vboxLayout2->addWidget(depth_4gray);
depth_8 = new QRadioButton(ButtonGroup2);
- depth_8->setObjectName(QString::fromUtf8("depth_8"));
+ depth_8->setObjectName(QStringLiteral("depth_8"));
vboxLayout2->addWidget(depth_8);
depth_12 = new QRadioButton(ButtonGroup2);
- depth_12->setObjectName(QString::fromUtf8("depth_12"));
+ depth_12->setObjectName(QStringLiteral("depth_12"));
vboxLayout2->addWidget(depth_12);
depth_15 = new QRadioButton(ButtonGroup2);
- depth_15->setObjectName(QString::fromUtf8("depth_15"));
+ depth_15->setObjectName(QStringLiteral("depth_15"));
vboxLayout2->addWidget(depth_15);
depth_16 = new QRadioButton(ButtonGroup2);
- depth_16->setObjectName(QString::fromUtf8("depth_16"));
+ depth_16->setObjectName(QStringLiteral("depth_16"));
vboxLayout2->addWidget(depth_16);
depth_18 = new QRadioButton(ButtonGroup2);
- depth_18->setObjectName(QString::fromUtf8("depth_18"));
+ depth_18->setObjectName(QStringLiteral("depth_18"));
vboxLayout2->addWidget(depth_18);
depth_24 = new QRadioButton(ButtonGroup2);
- depth_24->setObjectName(QString::fromUtf8("depth_24"));
+ depth_24->setObjectName(QStringLiteral("depth_24"));
vboxLayout2->addWidget(depth_24);
depth_32 = new QRadioButton(ButtonGroup2);
- depth_32->setObjectName(QString::fromUtf8("depth_32"));
+ depth_32->setObjectName(QStringLiteral("depth_32"));
vboxLayout2->addWidget(depth_32);
depth_32_argb = new QRadioButton(ButtonGroup2);
- depth_32_argb->setObjectName(QString::fromUtf8("depth_32_argb"));
+ depth_32_argb->setObjectName(QStringLiteral("depth_32_argb"));
vboxLayout2->addWidget(depth_32_argb);
@@ -292,15 +292,15 @@ public:
hboxLayout2 = new QHBoxLayout();
hboxLayout2->setSpacing(6);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
hboxLayout2->setContentsMargins(0, 0, 0, 0);
TextLabel1_3 = new QLabel(Config);
- TextLabel1_3->setObjectName(QString::fromUtf8("TextLabel1_3"));
+ TextLabel1_3->setObjectName(QStringLiteral("TextLabel1_3"));
hboxLayout2->addWidget(TextLabel1_3);
skin = new QComboBox(Config);
- skin->setObjectName(QString::fromUtf8("skin"));
+ skin->setObjectName(QStringLiteral("skin"));
QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Fixed);
sizePolicy2.setHorizontalStretch(0);
sizePolicy2.setVerticalStretch(0);
@@ -313,12 +313,12 @@ public:
vboxLayout->addLayout(hboxLayout2);
touchScreen = new QCheckBox(Config);
- touchScreen->setObjectName(QString::fromUtf8("touchScreen"));
+ touchScreen->setObjectName(QStringLiteral("touchScreen"));
vboxLayout->addWidget(touchScreen);
lcdScreen = new QCheckBox(Config);
- lcdScreen->setObjectName(QString::fromUtf8("lcdScreen"));
+ lcdScreen->setObjectName(QStringLiteral("lcdScreen"));
vboxLayout->addWidget(lcdScreen);
@@ -327,7 +327,7 @@ public:
vboxLayout->addItem(spacerItem);
TextLabel1 = new QLabel(Config);
- TextLabel1->setObjectName(QString::fromUtf8("TextLabel1"));
+ TextLabel1->setObjectName(QStringLiteral("TextLabel1"));
sizePolicy.setHeightForWidth(TextLabel1->sizePolicy().hasHeightForWidth());
TextLabel1->setSizePolicy(sizePolicy);
TextLabel1->setWordWrap(true);
@@ -335,21 +335,21 @@ public:
vboxLayout->addWidget(TextLabel1);
GroupBox1 = new QGroupBox(Config);
- GroupBox1->setObjectName(QString::fromUtf8("GroupBox1"));
+ GroupBox1->setObjectName(QStringLiteral("GroupBox1"));
gridLayout = new QGridLayout(GroupBox1);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
gridLayout->setHorizontalSpacing(6);
gridLayout->setVerticalSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
TextLabel3 = new QLabel(GroupBox1);
- TextLabel3->setObjectName(QString::fromUtf8("TextLabel3"));
+ TextLabel3->setObjectName(QStringLiteral("TextLabel3"));
gridLayout->addWidget(TextLabel3, 6, 0, 1, 1);
bslider = new QSlider(GroupBox1);
- bslider->setObjectName(QString::fromUtf8("bslider"));
+ bslider->setObjectName(QStringLiteral("bslider"));
QPalette palette;
QBrush brush(QColor(128, 128, 128, 255));
brush.setStyle(Qt::SolidPattern);
@@ -432,17 +432,17 @@ public:
gridLayout->addWidget(bslider, 6, 1, 1, 1);
blabel = new QLabel(GroupBox1);
- blabel->setObjectName(QString::fromUtf8("blabel"));
+ blabel->setObjectName(QStringLiteral("blabel"));
gridLayout->addWidget(blabel, 6, 2, 1, 1);
TextLabel2 = new QLabel(GroupBox1);
- TextLabel2->setObjectName(QString::fromUtf8("TextLabel2"));
+ TextLabel2->setObjectName(QStringLiteral("TextLabel2"));
gridLayout->addWidget(TextLabel2, 4, 0, 1, 1);
gslider = new QSlider(GroupBox1);
- gslider->setObjectName(QString::fromUtf8("gslider"));
+ gslider->setObjectName(QStringLiteral("gslider"));
QPalette palette1;
palette1.setBrush(QPalette::Active, QPalette::WindowText, brush);
QBrush brush11(QColor(0, 255, 0, 255));
@@ -513,22 +513,22 @@ public:
gridLayout->addWidget(gslider, 4, 1, 1, 1);
glabel = new QLabel(GroupBox1);
- glabel->setObjectName(QString::fromUtf8("glabel"));
+ glabel->setObjectName(QStringLiteral("glabel"));
gridLayout->addWidget(glabel, 4, 2, 1, 1);
TextLabel7 = new QLabel(GroupBox1);
- TextLabel7->setObjectName(QString::fromUtf8("TextLabel7"));
+ TextLabel7->setObjectName(QStringLiteral("TextLabel7"));
gridLayout->addWidget(TextLabel7, 0, 0, 1, 1);
TextLabel8 = new QLabel(GroupBox1);
- TextLabel8->setObjectName(QString::fromUtf8("TextLabel8"));
+ TextLabel8->setObjectName(QStringLiteral("TextLabel8"));
gridLayout->addWidget(TextLabel8, 0, 2, 1, 1);
gammaslider = new QSlider(GroupBox1);
- gammaslider->setObjectName(QString::fromUtf8("gammaslider"));
+ gammaslider->setObjectName(QStringLiteral("gammaslider"));
QPalette palette2;
palette2.setBrush(QPalette::Active, QPalette::WindowText, brush);
palette2.setBrush(QPalette::Active, QPalette::Button, brush7);
@@ -593,17 +593,17 @@ public:
gridLayout->addWidget(gammaslider, 0, 1, 1, 1);
TextLabel1_2 = new QLabel(GroupBox1);
- TextLabel1_2->setObjectName(QString::fromUtf8("TextLabel1_2"));
+ TextLabel1_2->setObjectName(QStringLiteral("TextLabel1_2"));
gridLayout->addWidget(TextLabel1_2, 2, 0, 1, 1);
rlabel = new QLabel(GroupBox1);
- rlabel->setObjectName(QString::fromUtf8("rlabel"));
+ rlabel->setObjectName(QStringLiteral("rlabel"));
gridLayout->addWidget(rlabel, 2, 2, 1, 1);
rslider = new QSlider(GroupBox1);
- rslider->setObjectName(QString::fromUtf8("rslider"));
+ rslider->setObjectName(QStringLiteral("rslider"));
QPalette palette3;
palette3.setBrush(QPalette::Active, QPalette::WindowText, brush);
QBrush brush18(QColor(255, 0, 0, 255));
@@ -674,12 +674,12 @@ public:
gridLayout->addWidget(rslider, 2, 1, 1, 1);
PushButton3 = new QPushButton(GroupBox1);
- PushButton3->setObjectName(QString::fromUtf8("PushButton3"));
+ PushButton3->setObjectName(QStringLiteral("PushButton3"));
gridLayout->addWidget(PushButton3, 8, 0, 1, 3);
MyCustomWidget1 = new GammaView(GroupBox1);
- MyCustomWidget1->setObjectName(QString::fromUtf8("MyCustomWidget1"));
+ MyCustomWidget1->setObjectName(QStringLiteral("MyCustomWidget1"));
gridLayout->addWidget(MyCustomWidget1, 0, 3, 9, 1);
@@ -688,21 +688,21 @@ public:
hboxLayout3 = new QHBoxLayout();
hboxLayout3->setSpacing(6);
- hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3"));
+ hboxLayout3->setObjectName(QStringLiteral("hboxLayout3"));
hboxLayout3->setContentsMargins(0, 0, 0, 0);
spacerItem1 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout3->addItem(spacerItem1);
buttonOk = new QPushButton(Config);
- buttonOk->setObjectName(QString::fromUtf8("buttonOk"));
+ buttonOk->setObjectName(QStringLiteral("buttonOk"));
buttonOk->setAutoDefault(true);
buttonOk->setDefault(true);
hboxLayout3->addWidget(buttonOk);
buttonCancel = new QPushButton(Config);
- buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+ buttonCancel->setObjectName(QStringLiteral("buttonCancel"));
buttonCancel->setAutoDefault(true);
hboxLayout3->addWidget(buttonCancel);
diff --git a/tests/auto/tools/uic/baseline/connectdialog.ui.h b/tests/auto/tools/uic/baseline/connectdialog.ui.h
index 71ed1bb87f..9c46bb851d 100644
--- a/tests/auto/tools/uic/baseline/connectdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/connectdialog.ui.h
@@ -50,24 +50,24 @@ public:
void setupUi(QDialog *ConnectDialog)
{
if (ConnectDialog->objectName().isEmpty())
- ConnectDialog->setObjectName(QString::fromUtf8("ConnectDialog"));
+ ConnectDialog->setObjectName(QStringLiteral("ConnectDialog"));
ConnectDialog->resize(585, 361);
gridLayout = new QGridLayout(ConnectDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
signalGroupBox = new QGroupBox(ConnectDialog);
- signalGroupBox->setObjectName(QString::fromUtf8("signalGroupBox"));
+ signalGroupBox->setObjectName(QStringLiteral("signalGroupBox"));
vboxLayout = new QVBoxLayout(signalGroupBox);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
signalList = new QListWidget(signalGroupBox);
- signalList->setObjectName(QString::fromUtf8("signalList"));
+ signalList->setObjectName(QStringLiteral("signalList"));
signalList->setTextElideMode(Qt::ElideMiddle);
vboxLayout->addWidget(signalList);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
editSignalsButton = new QToolButton(signalGroupBox);
- editSignalsButton->setObjectName(QString::fromUtf8("editSignalsButton"));
+ editSignalsButton->setObjectName(QStringLiteral("editSignalsButton"));
hboxLayout->addWidget(editSignalsButton);
@@ -82,19 +82,19 @@ public:
gridLayout->addWidget(signalGroupBox, 0, 0, 1, 2);
slotGroupBox = new QGroupBox(ConnectDialog);
- slotGroupBox->setObjectName(QString::fromUtf8("slotGroupBox"));
+ slotGroupBox->setObjectName(QStringLiteral("slotGroupBox"));
vboxLayout1 = new QVBoxLayout(slotGroupBox);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
slotList = new QListWidget(slotGroupBox);
- slotList->setObjectName(QString::fromUtf8("slotList"));
+ slotList->setObjectName(QStringLiteral("slotList"));
slotList->setTextElideMode(Qt::ElideMiddle);
vboxLayout1->addWidget(slotList);
hboxLayout1 = new QHBoxLayout();
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
editSlotsButton = new QToolButton(slotGroupBox);
- editSlotsButton->setObjectName(QString::fromUtf8("editSlotsButton"));
+ editSlotsButton->setObjectName(QStringLiteral("editSlotsButton"));
hboxLayout1->addWidget(editSlotsButton);
@@ -109,12 +109,12 @@ public:
gridLayout->addWidget(slotGroupBox, 0, 2, 1, 1);
showAllCheckBox = new QCheckBox(ConnectDialog);
- showAllCheckBox->setObjectName(QString::fromUtf8("showAllCheckBox"));
+ showAllCheckBox->setObjectName(QStringLiteral("showAllCheckBox"));
gridLayout->addWidget(showAllCheckBox, 1, 0, 1, 1);
buttonBox = new QDialogButtonBox(ConnectDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/controller.ui.h b/tests/auto/tools/uic/baseline/controller.ui.h
index 1c79f03f56..2758f1a7de 100644
--- a/tests/auto/tools/uic/baseline/controller.ui.h
+++ b/tests/auto/tools/uic/baseline/controller.ui.h
@@ -35,7 +35,7 @@ public:
void setupUi(QWidget *Controller)
{
if (Controller->objectName().isEmpty())
- Controller->setObjectName(QString::fromUtf8("Controller"));
+ Controller->setObjectName(QStringLiteral("Controller"));
Controller->resize(255, 111);
gridLayout = new QGridLayout(Controller);
#ifndef Q_OS_MAC
@@ -44,30 +44,30 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(Controller);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setAlignment(Qt::AlignCenter);
gridLayout->addWidget(label, 1, 1, 1, 1);
decelerate = new QPushButton(Controller);
- decelerate->setObjectName(QString::fromUtf8("decelerate"));
+ decelerate->setObjectName(QStringLiteral("decelerate"));
gridLayout->addWidget(decelerate, 2, 1, 1, 1);
accelerate = new QPushButton(Controller);
- accelerate->setObjectName(QString::fromUtf8("accelerate"));
+ accelerate->setObjectName(QStringLiteral("accelerate"));
gridLayout->addWidget(accelerate, 0, 1, 1, 1);
right = new QPushButton(Controller);
- right->setObjectName(QString::fromUtf8("right"));
+ right->setObjectName(QStringLiteral("right"));
gridLayout->addWidget(right, 1, 2, 1, 1);
left = new QPushButton(Controller);
- left->setObjectName(QString::fromUtf8("left"));
+ left->setObjectName(QStringLiteral("left"));
gridLayout->addWidget(left, 1, 0, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/cookies.ui.h b/tests/auto/tools/uic/baseline/cookies.ui.h
index f866645dd8..201687c210 100644
--- a/tests/auto/tools/uic/baseline/cookies.ui.h
+++ b/tests/auto/tools/uic/baseline/cookies.ui.h
@@ -42,33 +42,33 @@ public:
void setupUi(QDialog *CookiesDialog)
{
if (CookiesDialog->objectName().isEmpty())
- CookiesDialog->setObjectName(QString::fromUtf8("CookiesDialog"));
+ CookiesDialog->setObjectName(QStringLiteral("CookiesDialog"));
CookiesDialog->resize(550, 370);
gridLayout = new QGridLayout(CookiesDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem = new QSpacerItem(252, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(spacerItem, 0, 0, 1, 1);
search = new SearchLineEdit(CookiesDialog);
- search->setObjectName(QString::fromUtf8("search"));
+ search->setObjectName(QStringLiteral("search"));
gridLayout->addWidget(search, 0, 1, 1, 1);
cookiesTable = new EditTableView(CookiesDialog);
- cookiesTable->setObjectName(QString::fromUtf8("cookiesTable"));
+ cookiesTable->setObjectName(QStringLiteral("cookiesTable"));
gridLayout->addWidget(cookiesTable, 1, 0, 1, 2);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
removeButton = new QPushButton(CookiesDialog);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
hboxLayout->addWidget(removeButton);
removeAllButton = new QPushButton(CookiesDialog);
- removeAllButton->setObjectName(QString::fromUtf8("removeAllButton"));
+ removeAllButton->setObjectName(QStringLiteral("removeAllButton"));
hboxLayout->addWidget(removeAllButton);
@@ -77,7 +77,7 @@ public:
hboxLayout->addItem(spacerItem1);
buttonBox = new QDialogButtonBox(CookiesDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setStandardButtons(QDialogButtonBox::Ok);
hboxLayout->addWidget(buttonBox);
diff --git a/tests/auto/tools/uic/baseline/cookiesexceptions.ui.h b/tests/auto/tools/uic/baseline/cookiesexceptions.ui.h
index 776afc51c8..ca4ac682ce 100644
--- a/tests/auto/tools/uic/baseline/cookiesexceptions.ui.h
+++ b/tests/auto/tools/uic/baseline/cookiesexceptions.ui.h
@@ -57,23 +57,23 @@ public:
void setupUi(QDialog *CookiesExceptionsDialog)
{
if (CookiesExceptionsDialog->objectName().isEmpty())
- CookiesExceptionsDialog->setObjectName(QString::fromUtf8("CookiesExceptionsDialog"));
+ CookiesExceptionsDialog->setObjectName(QStringLiteral("CookiesExceptionsDialog"));
CookiesExceptionsDialog->resize(466, 446);
vboxLayout = new QVBoxLayout(CookiesExceptionsDialog);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
newExceptionGroupBox = new QGroupBox(CookiesExceptionsDialog);
- newExceptionGroupBox->setObjectName(QString::fromUtf8("newExceptionGroupBox"));
+ newExceptionGroupBox->setObjectName(QStringLiteral("newExceptionGroupBox"));
gridLayout = new QGridLayout(newExceptionGroupBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
label = new QLabel(newExceptionGroupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout->addWidget(label);
domainLineEdit = new QLineEdit(newExceptionGroupBox);
- domainLineEdit->setObjectName(QString::fromUtf8("domainLineEdit"));
+ domainLineEdit->setObjectName(QStringLiteral("domainLineEdit"));
hboxLayout->addWidget(domainLineEdit);
@@ -81,25 +81,25 @@ public:
gridLayout->addLayout(hboxLayout, 0, 0, 1, 1);
hboxLayout1 = new QHBoxLayout();
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
spacerItem = new QSpacerItem(81, 25, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout1->addItem(spacerItem);
blockButton = new QPushButton(newExceptionGroupBox);
- blockButton->setObjectName(QString::fromUtf8("blockButton"));
+ blockButton->setObjectName(QStringLiteral("blockButton"));
blockButton->setEnabled(false);
hboxLayout1->addWidget(blockButton);
allowForSessionButton = new QPushButton(newExceptionGroupBox);
- allowForSessionButton->setObjectName(QString::fromUtf8("allowForSessionButton"));
+ allowForSessionButton->setObjectName(QStringLiteral("allowForSessionButton"));
allowForSessionButton->setEnabled(false);
hboxLayout1->addWidget(allowForSessionButton);
allowButton = new QPushButton(newExceptionGroupBox);
- allowButton->setObjectName(QString::fromUtf8("allowButton"));
+ allowButton->setObjectName(QStringLiteral("allowButton"));
allowButton->setEnabled(false);
hboxLayout1->addWidget(allowButton);
@@ -111,30 +111,30 @@ public:
vboxLayout->addWidget(newExceptionGroupBox);
ExceptionsGroupBox = new QGroupBox(CookiesExceptionsDialog);
- ExceptionsGroupBox->setObjectName(QString::fromUtf8("ExceptionsGroupBox"));
+ ExceptionsGroupBox->setObjectName(QStringLiteral("ExceptionsGroupBox"));
gridLayout1 = new QGridLayout(ExceptionsGroupBox);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
spacerItem1 = new QSpacerItem(252, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout1->addItem(spacerItem1, 0, 0, 1, 3);
search = new SearchLineEdit(ExceptionsGroupBox);
- search->setObjectName(QString::fromUtf8("search"));
+ search->setObjectName(QStringLiteral("search"));
gridLayout1->addWidget(search, 0, 3, 1, 1);
exceptionTable = new EditTableView(ExceptionsGroupBox);
- exceptionTable->setObjectName(QString::fromUtf8("exceptionTable"));
+ exceptionTable->setObjectName(QStringLiteral("exceptionTable"));
gridLayout1->addWidget(exceptionTable, 1, 0, 1, 4);
removeButton = new QPushButton(ExceptionsGroupBox);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
gridLayout1->addWidget(removeButton, 2, 0, 1, 1);
removeAllButton = new QPushButton(ExceptionsGroupBox);
- removeAllButton->setObjectName(QString::fromUtf8("removeAllButton"));
+ removeAllButton->setObjectName(QStringLiteral("removeAllButton"));
gridLayout1->addWidget(removeAllButton, 2, 1, 1, 1);
@@ -146,7 +146,7 @@ public:
vboxLayout->addWidget(ExceptionsGroupBox);
buttonBox = new QDialogButtonBox(CookiesExceptionsDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/default.ui.h b/tests/auto/tools/uic/baseline/default.ui.h
index 685fa0b476..0bde249375 100644
--- a/tests/auto/tools/uic/baseline/default.ui.h
+++ b/tests/auto/tools/uic/baseline/default.ui.h
@@ -66,18 +66,18 @@ public:
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
- MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(388, 413);
exitAction = new QAction(MainWindow);
- exitAction->setObjectName(QString::fromUtf8("exitAction"));
+ exitAction->setObjectName(QStringLiteral("exitAction"));
aboutQtAction = new QAction(MainWindow);
- aboutQtAction->setObjectName(QString::fromUtf8("aboutQtAction"));
+ aboutQtAction->setObjectName(QStringLiteral("aboutQtAction"));
editStyleAction = new QAction(MainWindow);
- editStyleAction->setObjectName(QString::fromUtf8("editStyleAction"));
+ editStyleAction->setObjectName(QStringLiteral("editStyleAction"));
aboutAction = new QAction(MainWindow);
- aboutAction->setObjectName(QString::fromUtf8("aboutAction"));
+ aboutAction->setObjectName(QStringLiteral("aboutAction"));
centralwidget = new QWidget(MainWindow);
- centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
+ centralwidget->setObjectName(QStringLiteral("centralwidget"));
gridLayout = new QGridLayout(centralwidget);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
@@ -85,14 +85,14 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
nameLabel = new QLabel(centralwidget);
- nameLabel->setObjectName(QString::fromUtf8("nameLabel"));
+ nameLabel->setObjectName(QStringLiteral("nameLabel"));
gridLayout->addWidget(nameLabel, 0, 0, 1, 1);
nameCombo = new QComboBox(centralwidget);
- nameCombo->setObjectName(QString::fromUtf8("nameCombo"));
+ nameCombo->setObjectName(QStringLiteral("nameCombo"));
nameCombo->setEditable(true);
gridLayout->addWidget(nameCombo, 0, 1, 1, 3);
@@ -102,62 +102,62 @@ public:
gridLayout->addItem(spacerItem, 1, 3, 1, 1);
femaleRadioButton = new QRadioButton(centralwidget);
- femaleRadioButton->setObjectName(QString::fromUtf8("femaleRadioButton"));
+ femaleRadioButton->setObjectName(QStringLiteral("femaleRadioButton"));
gridLayout->addWidget(femaleRadioButton, 1, 2, 1, 1);
agreeCheckBox = new QCheckBox(centralwidget);
- agreeCheckBox->setObjectName(QString::fromUtf8("agreeCheckBox"));
+ agreeCheckBox->setObjectName(QStringLiteral("agreeCheckBox"));
gridLayout->addWidget(agreeCheckBox, 6, 0, 1, 4);
maleRadioButton = new QRadioButton(centralwidget);
- maleRadioButton->setObjectName(QString::fromUtf8("maleRadioButton"));
+ maleRadioButton->setObjectName(QStringLiteral("maleRadioButton"));
gridLayout->addWidget(maleRadioButton, 1, 1, 1, 1);
genderLabel = new QLabel(centralwidget);
- genderLabel->setObjectName(QString::fromUtf8("genderLabel"));
+ genderLabel->setObjectName(QStringLiteral("genderLabel"));
gridLayout->addWidget(genderLabel, 1, 0, 1, 1);
ageSpinBox = new QSpinBox(centralwidget);
- ageSpinBox->setObjectName(QString::fromUtf8("ageSpinBox"));
+ ageSpinBox->setObjectName(QStringLiteral("ageSpinBox"));
ageSpinBox->setMinimum(12);
ageSpinBox->setValue(22);
gridLayout->addWidget(ageSpinBox, 2, 1, 1, 3);
buttonBox = new QDialogButtonBox(centralwidget);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
gridLayout->addWidget(buttonBox, 7, 2, 1, 2);
ageLabel = new QLabel(centralwidget);
- ageLabel->setObjectName(QString::fromUtf8("ageLabel"));
+ ageLabel->setObjectName(QStringLiteral("ageLabel"));
gridLayout->addWidget(ageLabel, 2, 0, 1, 1);
passwordLabel = new QLabel(centralwidget);
- passwordLabel->setObjectName(QString::fromUtf8("passwordLabel"));
+ passwordLabel->setObjectName(QStringLiteral("passwordLabel"));
gridLayout->addWidget(passwordLabel, 3, 0, 1, 1);
passwordEdit = new QLineEdit(centralwidget);
- passwordEdit->setObjectName(QString::fromUtf8("passwordEdit"));
+ passwordEdit->setObjectName(QStringLiteral("passwordEdit"));
passwordEdit->setEchoMode(QLineEdit::Password);
gridLayout->addWidget(passwordEdit, 3, 1, 1, 3);
label = new QLabel(centralwidget);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 5, 0, 1, 1);
countryLabel = new QLabel(centralwidget);
- countryLabel->setObjectName(QString::fromUtf8("countryLabel"));
+ countryLabel->setObjectName(QStringLiteral("countryLabel"));
gridLayout->addWidget(countryLabel, 4, 0, 1, 1);
@@ -165,26 +165,26 @@ public:
new QListWidgetItem(professionList);
new QListWidgetItem(professionList);
new QListWidgetItem(professionList);
- professionList->setObjectName(QString::fromUtf8("professionList"));
+ professionList->setObjectName(QStringLiteral("professionList"));
gridLayout->addWidget(professionList, 5, 1, 1, 3);
countryCombo = new QComboBox(centralwidget);
- countryCombo->setObjectName(QString::fromUtf8("countryCombo"));
+ countryCombo->setObjectName(QStringLiteral("countryCombo"));
gridLayout->addWidget(countryCombo, 4, 1, 1, 3);
MainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(MainWindow);
- menubar->setObjectName(QString::fromUtf8("menubar"));
+ menubar->setObjectName(QStringLiteral("menubar"));
menubar->setGeometry(QRect(0, 0, 388, 21));
menu_File = new QMenu(menubar);
- menu_File->setObjectName(QString::fromUtf8("menu_File"));
+ menu_File->setObjectName(QStringLiteral("menu_File"));
menu_Help = new QMenu(menubar);
- menu_Help->setObjectName(QString::fromUtf8("menu_Help"));
+ menu_Help->setObjectName(QStringLiteral("menu_Help"));
MainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(MainWindow);
- statusbar->setObjectName(QString::fromUtf8("statusbar"));
+ statusbar->setObjectName(QStringLiteral("statusbar"));
MainWindow->setStatusBar(statusbar);
#ifndef QT_NO_SHORTCUT
nameLabel->setBuddy(nameCombo);
diff --git a/tests/auto/tools/uic/baseline/dialog.ui.h b/tests/auto/tools/uic/baseline/dialog.ui.h
index d4860bf071..6e3e3fdc36 100644
--- a/tests/auto/tools/uic/baseline/dialog.ui.h
+++ b/tests/auto/tools/uic/baseline/dialog.ui.h
@@ -33,24 +33,24 @@ public:
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
- Dialog->setObjectName(QString::fromUtf8("Dialog"));
+ Dialog->setObjectName(QStringLiteral("Dialog"));
Dialog->resize(451, 322);
gridLayout = new QGridLayout(Dialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
loadFromFileButton = new QPushButton(Dialog);
- loadFromFileButton->setObjectName(QString::fromUtf8("loadFromFileButton"));
+ loadFromFileButton->setObjectName(QStringLiteral("loadFromFileButton"));
gridLayout->addWidget(loadFromFileButton, 0, 0, 1, 1);
label = new QLabel(Dialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setAlignment(Qt::AlignCenter);
label->setWordWrap(true);
gridLayout->addWidget(label, 1, 0, 1, 1);
loadFromSharedMemoryButton = new QPushButton(Dialog);
- loadFromSharedMemoryButton->setObjectName(QString::fromUtf8("loadFromSharedMemoryButton"));
+ loadFromSharedMemoryButton->setObjectName(QStringLiteral("loadFromSharedMemoryButton"));
gridLayout->addWidget(loadFromSharedMemoryButton, 2, 0, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/downloaditem.ui.h b/tests/auto/tools/uic/baseline/downloaditem.ui.h
index 33442342b5..9aac86eb87 100644
--- a/tests/auto/tools/uic/baseline/downloaditem.ui.h
+++ b/tests/auto/tools/uic/baseline/downloaditem.ui.h
@@ -45,13 +45,13 @@ public:
void setupUi(QWidget *DownloadItem)
{
if (DownloadItem->objectName().isEmpty())
- DownloadItem->setObjectName(QString::fromUtf8("DownloadItem"));
+ DownloadItem->setObjectName(QStringLiteral("DownloadItem"));
DownloadItem->resize(423, 110);
horizontalLayout = new QHBoxLayout(DownloadItem);
horizontalLayout->setContentsMargins(0, 0, 0, 0);
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
fileIcon = new QLabel(DownloadItem);
- fileIcon->setObjectName(QString::fromUtf8("fileIcon"));
+ fileIcon->setObjectName(QStringLiteral("fileIcon"));
QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -61,9 +61,9 @@ public:
horizontalLayout->addWidget(fileIcon);
verticalLayout_2 = new QVBoxLayout();
- verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
+ verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2"));
fileNameLabel = new SqueezeLabel(DownloadItem);
- fileNameLabel->setObjectName(QString::fromUtf8("fileNameLabel"));
+ fileNameLabel->setObjectName(QStringLiteral("fileNameLabel"));
QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Preferred);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -73,13 +73,13 @@ public:
verticalLayout_2->addWidget(fileNameLabel);
progressBar = new QProgressBar(DownloadItem);
- progressBar->setObjectName(QString::fromUtf8("progressBar"));
+ progressBar->setObjectName(QStringLiteral("progressBar"));
progressBar->setValue(0);
verticalLayout_2->addWidget(progressBar);
downloadInfoLabel = new SqueezeLabel(DownloadItem);
- downloadInfoLabel->setObjectName(QString::fromUtf8("downloadInfoLabel"));
+ downloadInfoLabel->setObjectName(QStringLiteral("downloadInfoLabel"));
QSizePolicy sizePolicy2(QSizePolicy::Minimum, QSizePolicy::Preferred);
sizePolicy2.setHorizontalStretch(0);
sizePolicy2.setVerticalStretch(0);
@@ -92,24 +92,24 @@ public:
horizontalLayout->addLayout(verticalLayout_2);
verticalLayout = new QVBoxLayout();
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
verticalSpacer = new QSpacerItem(17, 1, QSizePolicy::Minimum, QSizePolicy::Expanding);
verticalLayout->addItem(verticalSpacer);
tryAgainButton = new QPushButton(DownloadItem);
- tryAgainButton->setObjectName(QString::fromUtf8("tryAgainButton"));
+ tryAgainButton->setObjectName(QStringLiteral("tryAgainButton"));
tryAgainButton->setEnabled(false);
verticalLayout->addWidget(tryAgainButton);
stopButton = new QPushButton(DownloadItem);
- stopButton->setObjectName(QString::fromUtf8("stopButton"));
+ stopButton->setObjectName(QStringLiteral("stopButton"));
verticalLayout->addWidget(stopButton);
openButton = new QPushButton(DownloadItem);
- openButton->setObjectName(QString::fromUtf8("openButton"));
+ openButton->setObjectName(QStringLiteral("openButton"));
verticalLayout->addWidget(openButton);
diff --git a/tests/auto/tools/uic/baseline/downloads.ui.h b/tests/auto/tools/uic/baseline/downloads.ui.h
index 32b534393a..f88b6d75e7 100644
--- a/tests/auto/tools/uic/baseline/downloads.ui.h
+++ b/tests/auto/tools/uic/baseline/downloads.ui.h
@@ -39,21 +39,21 @@ public:
void setupUi(QDialog *DownloadDialog)
{
if (DownloadDialog->objectName().isEmpty())
- DownloadDialog->setObjectName(QString::fromUtf8("DownloadDialog"));
+ DownloadDialog->setObjectName(QStringLiteral("DownloadDialog"));
DownloadDialog->resize(332, 252);
gridLayout = new QGridLayout(DownloadDialog);
gridLayout->setSpacing(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
downloadsView = new EditTableView(DownloadDialog);
- downloadsView->setObjectName(QString::fromUtf8("downloadsView"));
+ downloadsView->setObjectName(QStringLiteral("downloadsView"));
gridLayout->addWidget(downloadsView, 0, 0, 1, 3);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
cleanupButton = new QPushButton(DownloadDialog);
- cleanupButton->setObjectName(QString::fromUtf8("cleanupButton"));
+ cleanupButton->setObjectName(QStringLiteral("cleanupButton"));
cleanupButton->setEnabled(false);
horizontalLayout->addWidget(cleanupButton);
@@ -66,7 +66,7 @@ public:
gridLayout->addLayout(horizontalLayout, 1, 0, 1, 1);
itemCount = new QLabel(DownloadDialog);
- itemCount->setObjectName(QString::fromUtf8("itemCount"));
+ itemCount->setObjectName(QStringLiteral("itemCount"));
gridLayout->addWidget(itemCount, 1, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/embeddeddialog.ui.h b/tests/auto/tools/uic/baseline/embeddeddialog.ui.h
index 3728e764a3..40634692fa 100644
--- a/tests/auto/tools/uic/baseline/embeddeddialog.ui.h
+++ b/tests/auto/tools/uic/baseline/embeddeddialog.ui.h
@@ -40,47 +40,47 @@ public:
void setupUi(QDialog *embeddedDialog)
{
if (embeddedDialog->objectName().isEmpty())
- embeddedDialog->setObjectName(QString::fromUtf8("embeddedDialog"));
+ embeddedDialog->setObjectName(QStringLiteral("embeddedDialog"));
embeddedDialog->resize(407, 134);
formLayout = new QFormLayout(embeddedDialog);
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
label = new QLabel(embeddedDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
formLayout->setWidget(0, QFormLayout::LabelRole, label);
layoutDirection = new QComboBox(embeddedDialog);
- layoutDirection->setObjectName(QString::fromUtf8("layoutDirection"));
+ layoutDirection->setObjectName(QStringLiteral("layoutDirection"));
formLayout->setWidget(0, QFormLayout::FieldRole, layoutDirection);
label_2 = new QLabel(embeddedDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
formLayout->setWidget(1, QFormLayout::LabelRole, label_2);
fontComboBox = new QFontComboBox(embeddedDialog);
- fontComboBox->setObjectName(QString::fromUtf8("fontComboBox"));
+ fontComboBox->setObjectName(QStringLiteral("fontComboBox"));
formLayout->setWidget(1, QFormLayout::FieldRole, fontComboBox);
label_3 = new QLabel(embeddedDialog);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
formLayout->setWidget(2, QFormLayout::LabelRole, label_3);
style = new QComboBox(embeddedDialog);
- style->setObjectName(QString::fromUtf8("style"));
+ style->setObjectName(QStringLiteral("style"));
formLayout->setWidget(2, QFormLayout::FieldRole, style);
label_4 = new QLabel(embeddedDialog);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
formLayout->setWidget(3, QFormLayout::LabelRole, label_4);
spacing = new QSlider(embeddedDialog);
- spacing->setObjectName(QString::fromUtf8("spacing"));
+ spacing->setObjectName(QStringLiteral("spacing"));
spacing->setOrientation(Qt::Horizontal);
formLayout->setWidget(3, QFormLayout::FieldRole, spacing);
diff --git a/tests/auto/tools/uic/baseline/filespage.ui.h b/tests/auto/tools/uic/baseline/filespage.ui.h
index f8dd925df8..430e5350c8 100644
--- a/tests/auto/tools/uic/baseline/filespage.ui.h
+++ b/tests/auto/tools/uic/baseline/filespage.ui.h
@@ -38,23 +38,23 @@ public:
void setupUi(QWidget *FilesPage)
{
if (FilesPage->objectName().isEmpty())
- FilesPage->setObjectName(QString::fromUtf8("FilesPage"));
+ FilesPage->setObjectName(QStringLiteral("FilesPage"));
FilesPage->resize(417, 242);
gridLayout = new QGridLayout(FilesPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
fileLabel = new QLabel(FilesPage);
- fileLabel->setObjectName(QString::fromUtf8("fileLabel"));
+ fileLabel->setObjectName(QStringLiteral("fileLabel"));
fileLabel->setWordWrap(true);
gridLayout->addWidget(fileLabel, 0, 0, 1, 2);
fileListWidget = new QListWidget(FilesPage);
- fileListWidget->setObjectName(QString::fromUtf8("fileListWidget"));
+ fileListWidget->setObjectName(QStringLiteral("fileListWidget"));
gridLayout->addWidget(fileListWidget, 1, 0, 3, 1);
removeButton = new QPushButton(FilesPage);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -64,7 +64,7 @@ public:
gridLayout->addWidget(removeButton, 1, 1, 1, 1);
removeAllButton = new QPushButton(FilesPage);
- removeAllButton->setObjectName(QString::fromUtf8("removeAllButton"));
+ removeAllButton->setObjectName(QStringLiteral("removeAllButton"));
gridLayout->addWidget(removeAllButton, 2, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/filternamedialog.ui.h b/tests/auto/tools/uic/baseline/filternamedialog.ui.h
index 703c552b4a..dd84725e0d 100644
--- a/tests/auto/tools/uic/baseline/filternamedialog.ui.h
+++ b/tests/auto/tools/uic/baseline/filternamedialog.ui.h
@@ -38,24 +38,24 @@ public:
void setupUi(QDialog *FilterNameDialogClass)
{
if (FilterNameDialogClass->objectName().isEmpty())
- FilterNameDialogClass->setObjectName(QString::fromUtf8("FilterNameDialogClass"));
+ FilterNameDialogClass->setObjectName(QStringLiteral("FilterNameDialogClass"));
FilterNameDialogClass->resize(312, 95);
gridLayout = new QGridLayout(FilterNameDialogClass);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(9, 9, 9, 9);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(FilterNameDialogClass);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
lineEdit = new QLineEdit(FilterNameDialogClass);
- lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
+ lineEdit->setObjectName(QStringLiteral("lineEdit"));
gridLayout->addWidget(lineEdit, 0, 1, 1, 2);
line = new QFrame(FilterNameDialogClass);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
@@ -66,7 +66,7 @@ public:
gridLayout->addItem(spacerItem, 2, 0, 1, 2);
buttonBox = new QDialogButtonBox(FilterNameDialogClass);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/filterpage.ui.h b/tests/auto/tools/uic/baseline/filterpage.ui.h
index ab1fcf12a1..23a9c38140 100644
--- a/tests/auto/tools/uic/baseline/filterpage.ui.h
+++ b/tests/auto/tools/uic/baseline/filterpage.ui.h
@@ -45,37 +45,37 @@ public:
void setupUi(QWidget *FilterPage)
{
if (FilterPage->objectName().isEmpty())
- FilterPage->setObjectName(QString::fromUtf8("FilterPage"));
+ FilterPage->setObjectName(QStringLiteral("FilterPage"));
FilterPage->resize(419, 243);
gridLayout = new QGridLayout(FilterPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(FilterPage);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 1, 0, 1, 1);
filterLineEdit = new QLineEdit(FilterPage);
- filterLineEdit->setObjectName(QString::fromUtf8("filterLineEdit"));
+ filterLineEdit->setObjectName(QStringLiteral("filterLineEdit"));
gridLayout->addWidget(filterLineEdit, 2, 0, 1, 1);
groupBox = new QGroupBox(FilterPage);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout1 = new QGridLayout(groupBox);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
customFilterWidget = new QTreeWidget(groupBox);
- customFilterWidget->setObjectName(QString::fromUtf8("customFilterWidget"));
+ customFilterWidget->setObjectName(QStringLiteral("customFilterWidget"));
customFilterWidget->setColumnCount(2);
gridLayout1->addWidget(customFilterWidget, 0, 0, 3, 1);
addButton = new QPushButton(groupBox);
- addButton->setObjectName(QString::fromUtf8("addButton"));
+ addButton->setObjectName(QStringLiteral("addButton"));
gridLayout1->addWidget(addButton, 0, 1, 1, 1);
removeButton = new QPushButton(groupBox);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
gridLayout1->addWidget(removeButton, 1, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/finddialog.ui.h b/tests/auto/tools/uic/baseline/finddialog.ui.h
index 12f5514d41..fdf2cd4e1f 100644
--- a/tests/auto/tools/uic/baseline/finddialog.ui.h
+++ b/tests/auto/tools/uic/baseline/finddialog.ui.h
@@ -94,7 +94,7 @@ public:
void setupUi(QDialog *FindDialog)
{
if (FindDialog->objectName().isEmpty())
- FindDialog->setObjectName(QString::fromUtf8("FindDialog"));
+ FindDialog->setObjectName(QStringLiteral("FindDialog"));
FindDialog->resize(414, 170);
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
sizePolicy.setHorizontalStretch(0);
@@ -104,22 +104,22 @@ public:
hboxLayout = new QHBoxLayout(FindDialog);
hboxLayout->setSpacing(6);
hboxLayout->setContentsMargins(11, 11, 11, 11);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
vboxLayout = new QVBoxLayout();
vboxLayout->setSpacing(6);
vboxLayout->setContentsMargins(0, 0, 0, 0);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
hboxLayout1 = new QHBoxLayout();
hboxLayout1->setSpacing(6);
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
findWhat = new QLabel(FindDialog);
- findWhat->setObjectName(QString::fromUtf8("findWhat"));
+ findWhat->setObjectName(QStringLiteral("findWhat"));
hboxLayout1->addWidget(findWhat);
led = new QLineEdit(FindDialog);
- led->setObjectName(QString::fromUtf8("led"));
+ led->setObjectName(QStringLiteral("led"));
hboxLayout1->addWidget(led);
@@ -127,36 +127,36 @@ public:
vboxLayout->addLayout(hboxLayout1);
groupBox = new QGroupBox(FindDialog);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout = new QGridLayout(groupBox);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(9, 9, 9, 9);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
sourceText = new QCheckBox(groupBox);
- sourceText->setObjectName(QString::fromUtf8("sourceText"));
+ sourceText->setObjectName(QStringLiteral("sourceText"));
sourceText->setChecked(true);
gridLayout->addWidget(sourceText, 1, 0, 1, 1);
translations = new QCheckBox(groupBox);
- translations->setObjectName(QString::fromUtf8("translations"));
+ translations->setObjectName(QStringLiteral("translations"));
translations->setChecked(true);
gridLayout->addWidget(translations, 2, 0, 1, 1);
matchCase = new QCheckBox(groupBox);
- matchCase->setObjectName(QString::fromUtf8("matchCase"));
+ matchCase->setObjectName(QStringLiteral("matchCase"));
gridLayout->addWidget(matchCase, 0, 1, 1, 1);
comments = new QCheckBox(groupBox);
- comments->setObjectName(QString::fromUtf8("comments"));
+ comments->setObjectName(QStringLiteral("comments"));
comments->setChecked(true);
gridLayout->addWidget(comments, 0, 0, 1, 1);
ignoreAccelerators = new QCheckBox(groupBox);
- ignoreAccelerators->setObjectName(QString::fromUtf8("ignoreAccelerators"));
+ ignoreAccelerators->setObjectName(QStringLiteral("ignoreAccelerators"));
ignoreAccelerators->setChecked(true);
gridLayout->addWidget(ignoreAccelerators, 1, 1, 1, 1);
@@ -170,16 +170,16 @@ public:
vboxLayout1 = new QVBoxLayout();
vboxLayout1->setSpacing(6);
vboxLayout1->setContentsMargins(0, 0, 0, 0);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
findNxt = new QPushButton(FindDialog);
- findNxt->setObjectName(QString::fromUtf8("findNxt"));
+ findNxt->setObjectName(QStringLiteral("findNxt"));
findNxt->setDefault(true);
findNxt->setFlat(false);
vboxLayout1->addWidget(findNxt);
cancel = new QPushButton(FindDialog);
- cancel->setObjectName(QString::fromUtf8("cancel"));
+ cancel->setObjectName(QStringLiteral("cancel"));
vboxLayout1->addWidget(cancel);
diff --git a/tests/auto/tools/uic/baseline/form.ui.h b/tests/auto/tools/uic/baseline/form.ui.h
index 6aca98a1e9..cbae1567e9 100644
--- a/tests/auto/tools/uic/baseline/form.ui.h
+++ b/tests/auto/tools/uic/baseline/form.ui.h
@@ -44,7 +44,7 @@ public:
void setupUi(QWidget *WorldTimeForm)
{
if (WorldTimeForm->objectName().isEmpty())
- WorldTimeForm->setObjectName(QString::fromUtf8("WorldTimeForm"));
+ WorldTimeForm->setObjectName(QStringLiteral("WorldTimeForm"));
WorldTimeForm->resize(400, 300);
hboxLayout = new QHBoxLayout(WorldTimeForm);
#ifndef Q_OS_MAC
@@ -53,9 +53,9 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
worldTimeClock = new WorldTimeClock(WorldTimeForm);
- worldTimeClock->setObjectName(QString::fromUtf8("worldTimeClock"));
+ worldTimeClock->setObjectName(QStringLiteral("worldTimeClock"));
hboxLayout->addWidget(worldTimeClock);
@@ -64,7 +64,7 @@ public:
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(1, 1, 1, 1);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
spacerItem = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
vboxLayout->addItem(spacerItem);
@@ -74,14 +74,14 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(1, 1, 1, 1);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
label = new QLabel(WorldTimeForm);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout1->addWidget(label);
timeEdit = new QTimeEdit(WorldTimeForm);
- timeEdit->setObjectName(QString::fromUtf8("timeEdit"));
+ timeEdit->setObjectName(QStringLiteral("timeEdit"));
timeEdit->setReadOnly(true);
hboxLayout1->addWidget(timeEdit);
@@ -94,14 +94,14 @@ public:
hboxLayout2->setSpacing(6);
#endif
hboxLayout2->setContentsMargins(1, 1, 1, 1);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
label_2 = new QLabel(WorldTimeForm);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
hboxLayout2->addWidget(label_2);
spinBox = new QSpinBox(WorldTimeForm);
- spinBox->setObjectName(QString::fromUtf8("spinBox"));
+ spinBox->setObjectName(QStringLiteral("spinBox"));
spinBox->setMaximum(12);
spinBox->setMinimum(-12);
diff --git a/tests/auto/tools/uic/baseline/formwindowsettings.ui.h b/tests/auto/tools/uic/baseline/formwindowsettings.ui.h
index ffc1e1ad39..75d4d437bb 100644
--- a/tests/auto/tools/uic/baseline/formwindowsettings.ui.h
+++ b/tests/auto/tools/uic/baseline/formwindowsettings.ui.h
@@ -109,19 +109,19 @@ public:
void setupUi(QDialog *FormWindowSettings)
{
if (FormWindowSettings->objectName().isEmpty())
- FormWindowSettings->setObjectName(QString::fromUtf8("FormWindowSettings"));
+ FormWindowSettings->setObjectName(QStringLiteral("FormWindowSettings"));
FormWindowSettings->resize(433, 465);
gridLayout = new QGridLayout(FormWindowSettings);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
buttonBox = new QDialogButtonBox(FormWindowSettings);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
gridLayout->addWidget(buttonBox, 6, 0, 1, 2);
line = new QFrame(FormWindowSettings);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
@@ -132,33 +132,33 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
layoutDefaultGroupBox = new QGroupBox(FormWindowSettings);
- layoutDefaultGroupBox->setObjectName(QString::fromUtf8("layoutDefaultGroupBox"));
+ layoutDefaultGroupBox->setObjectName(QStringLiteral("layoutDefaultGroupBox"));
layoutDefaultGroupBox->setCheckable(true);
gridLayout1 = new QGridLayout(layoutDefaultGroupBox);
#ifndef Q_OS_MAC
gridLayout1->setSpacing(6);
#endif
gridLayout1->setContentsMargins(8, 8, 8, 8);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
label_2 = new QLabel(layoutDefaultGroupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout1->addWidget(label_2, 1, 0, 1, 1);
label = new QLabel(layoutDefaultGroupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout1->addWidget(label, 0, 0, 1, 1);
defaultSpacingSpinBox = new QSpinBox(layoutDefaultGroupBox);
- defaultSpacingSpinBox->setObjectName(QString::fromUtf8("defaultSpacingSpinBox"));
+ defaultSpacingSpinBox->setObjectName(QStringLiteral("defaultSpacingSpinBox"));
gridLayout1->addWidget(defaultSpacingSpinBox, 1, 1, 1, 1);
defaultMarginSpinBox = new QSpinBox(layoutDefaultGroupBox);
- defaultMarginSpinBox->setObjectName(QString::fromUtf8("defaultMarginSpinBox"));
+ defaultMarginSpinBox->setObjectName(QStringLiteral("defaultMarginSpinBox"));
gridLayout1->addWidget(defaultMarginSpinBox, 0, 1, 1, 1);
@@ -166,31 +166,31 @@ public:
hboxLayout->addWidget(layoutDefaultGroupBox);
layoutFunctionGroupBox = new QGroupBox(FormWindowSettings);
- layoutFunctionGroupBox->setObjectName(QString::fromUtf8("layoutFunctionGroupBox"));
+ layoutFunctionGroupBox->setObjectName(QStringLiteral("layoutFunctionGroupBox"));
layoutFunctionGroupBox->setCheckable(true);
gridLayout2 = new QGridLayout(layoutFunctionGroupBox);
#ifndef Q_OS_MAC
gridLayout2->setSpacing(6);
#endif
gridLayout2->setContentsMargins(8, 8, 8, 8);
- gridLayout2->setObjectName(QString::fromUtf8("gridLayout2"));
+ gridLayout2->setObjectName(QStringLiteral("gridLayout2"));
spacingFunctionLineEdit = new QLineEdit(layoutFunctionGroupBox);
- spacingFunctionLineEdit->setObjectName(QString::fromUtf8("spacingFunctionLineEdit"));
+ spacingFunctionLineEdit->setObjectName(QStringLiteral("spacingFunctionLineEdit"));
gridLayout2->addWidget(spacingFunctionLineEdit, 1, 1, 1, 1);
marginFunctionLineEdit = new QLineEdit(layoutFunctionGroupBox);
- marginFunctionLineEdit->setObjectName(QString::fromUtf8("marginFunctionLineEdit"));
+ marginFunctionLineEdit->setObjectName(QStringLiteral("marginFunctionLineEdit"));
gridLayout2->addWidget(marginFunctionLineEdit, 0, 1, 1, 1);
label_3 = new QLabel(layoutFunctionGroupBox);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout2->addWidget(label_3, 0, 0, 1, 1);
label_3_2 = new QLabel(layoutFunctionGroupBox);
- label_3_2->setObjectName(QString::fromUtf8("label_3_2"));
+ label_3_2->setObjectName(QStringLiteral("label_3_2"));
gridLayout2->addWidget(label_3_2, 1, 0, 1, 1);
@@ -201,15 +201,15 @@ public:
gridLayout->addLayout(hboxLayout, 2, 0, 1, 2);
pixmapFunctionGroupBox_2 = new QGroupBox(FormWindowSettings);
- pixmapFunctionGroupBox_2->setObjectName(QString::fromUtf8("pixmapFunctionGroupBox_2"));
+ pixmapFunctionGroupBox_2->setObjectName(QStringLiteral("pixmapFunctionGroupBox_2"));
vboxLayout = new QVBoxLayout(pixmapFunctionGroupBox_2);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(8, 8, 8, 8);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
authorLineEdit = new QLineEdit(pixmapFunctionGroupBox_2);
- authorLineEdit->setObjectName(QString::fromUtf8("authorLineEdit"));
+ authorLineEdit->setObjectName(QStringLiteral("authorLineEdit"));
vboxLayout->addWidget(authorLineEdit);
@@ -217,15 +217,15 @@ public:
gridLayout->addWidget(pixmapFunctionGroupBox_2, 0, 0, 1, 2);
includeHintsGroupBox = new QGroupBox(FormWindowSettings);
- includeHintsGroupBox->setObjectName(QString::fromUtf8("includeHintsGroupBox"));
+ includeHintsGroupBox->setObjectName(QStringLiteral("includeHintsGroupBox"));
vboxLayout1 = new QVBoxLayout(includeHintsGroupBox);
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
#endif
vboxLayout1->setContentsMargins(8, 8, 8, 8);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
includeHintsTextEdit = new QTextEdit(includeHintsGroupBox);
- includeHintsTextEdit->setObjectName(QString::fromUtf8("includeHintsTextEdit"));
+ includeHintsTextEdit->setObjectName(QStringLiteral("includeHintsTextEdit"));
vboxLayout1->addWidget(includeHintsTextEdit);
@@ -237,18 +237,18 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
pixmapFunctionGroupBox = new QGroupBox(FormWindowSettings);
- pixmapFunctionGroupBox->setObjectName(QString::fromUtf8("pixmapFunctionGroupBox"));
+ pixmapFunctionGroupBox->setObjectName(QStringLiteral("pixmapFunctionGroupBox"));
pixmapFunctionGroupBox->setCheckable(true);
vboxLayout2 = new QVBoxLayout(pixmapFunctionGroupBox);
#ifndef Q_OS_MAC
vboxLayout2->setSpacing(6);
#endif
vboxLayout2->setContentsMargins(8, 8, 8, 8);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
pixmapFunctionLineEdit = new QLineEdit(pixmapFunctionGroupBox);
- pixmapFunctionLineEdit->setObjectName(QString::fromUtf8("pixmapFunctionLineEdit"));
+ pixmapFunctionLineEdit->setObjectName(QStringLiteral("pixmapFunctionLineEdit"));
vboxLayout2->addWidget(pixmapFunctionLineEdit);
@@ -263,7 +263,7 @@ public:
gridLayout->addItem(spacerItem, 4, 1, 1, 1);
gridPanel = new qdesigner_internal::GridPanel(FormWindowSettings);
- gridPanel->setObjectName(QString::fromUtf8("gridPanel"));
+ gridPanel->setObjectName(QStringLiteral("gridPanel"));
gridLayout->addWidget(gridPanel, 1, 0, 1, 2);
diff --git a/tests/auto/tools/uic/baseline/generalpage.ui.h b/tests/auto/tools/uic/baseline/generalpage.ui.h
index a4d72117eb..f496cb834c 100644
--- a/tests/auto/tools/uic/baseline/generalpage.ui.h
+++ b/tests/auto/tools/uic/baseline/generalpage.ui.h
@@ -37,27 +37,27 @@ public:
void setupUi(QWidget *GeneralPage)
{
if (GeneralPage->objectName().isEmpty())
- GeneralPage->setObjectName(QString::fromUtf8("GeneralPage"));
+ GeneralPage->setObjectName(QStringLiteral("GeneralPage"));
GeneralPage->resize(417, 243);
gridLayout = new QGridLayout(GeneralPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(GeneralPage);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 1, 0, 1, 1);
namespaceLineEdit = new QLineEdit(GeneralPage);
- namespaceLineEdit->setObjectName(QString::fromUtf8("namespaceLineEdit"));
+ namespaceLineEdit->setObjectName(QStringLiteral("namespaceLineEdit"));
gridLayout->addWidget(namespaceLineEdit, 1, 1, 1, 1);
label_2 = new QLabel(GeneralPage);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 2, 0, 1, 1);
folderLineEdit = new QLineEdit(GeneralPage);
- folderLineEdit->setObjectName(QString::fromUtf8("folderLineEdit"));
+ folderLineEdit->setObjectName(QStringLiteral("folderLineEdit"));
gridLayout->addWidget(folderLineEdit, 2, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/gridalignment.ui.h b/tests/auto/tools/uic/baseline/gridalignment.ui.h
index 7a3291dc8c..8d9a556164 100644
--- a/tests/auto/tools/uic/baseline/gridalignment.ui.h
+++ b/tests/auto/tools/uic/baseline/gridalignment.ui.h
@@ -33,27 +33,27 @@ public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
- Form->setObjectName(QString::fromUtf8("Form"));
+ Form->setObjectName(QStringLiteral("Form"));
Form->resize(279, 163);
gridLayout = new QGridLayout(Form);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
pushButton = new QPushButton(Form);
- pushButton->setObjectName(QString::fromUtf8("pushButton"));
+ pushButton->setObjectName(QStringLiteral("pushButton"));
gridLayout->addWidget(pushButton, 0, 0, 1, 1, Qt::AlignLeft);
pushButton_3 = new QPushButton(Form);
- pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
+ pushButton_3->setObjectName(QStringLiteral("pushButton_3"));
gridLayout->addWidget(pushButton_3, 0, 1, 1, 1, Qt::AlignTop);
pushButton_2 = new QPushButton(Form);
- pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
+ pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
gridLayout->addWidget(pushButton_2, 1, 0, 1, 1, Qt::AlignRight);
pushButton_4 = new QPushButton(Form);
- pushButton_4->setObjectName(QString::fromUtf8("pushButton_4"));
+ pushButton_4->setObjectName(QStringLiteral("pushButton_4"));
gridLayout->addWidget(pushButton_4, 1, 1, 1, 1, Qt::AlignBottom);
diff --git a/tests/auto/tools/uic/baseline/gridpanel.ui.h b/tests/auto/tools/uic/baseline/gridpanel.ui.h
index 21e703b95b..abe260e601 100644
--- a/tests/auto/tools/uic/baseline/gridpanel.ui.h
+++ b/tests/auto/tools/uic/baseline/gridpanel.ui.h
@@ -50,17 +50,17 @@ public:
void setupUi(QWidget *qdesigner_internal__GridPanel)
{
if (qdesigner_internal__GridPanel->objectName().isEmpty())
- qdesigner_internal__GridPanel->setObjectName(QString::fromUtf8("qdesigner_internal__GridPanel"));
+ qdesigner_internal__GridPanel->setObjectName(QStringLiteral("qdesigner_internal__GridPanel"));
qdesigner_internal__GridPanel->resize(393, 110);
vboxLayout = new QVBoxLayout(qdesigner_internal__GridPanel);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(0, 0, 0, 0);
m_gridGroupBox = new QGroupBox(qdesigner_internal__GridPanel);
- m_gridGroupBox->setObjectName(QString::fromUtf8("m_gridGroupBox"));
+ m_gridGroupBox->setObjectName(QStringLiteral("m_gridGroupBox"));
gridLayout = new QGridLayout(m_gridGroupBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
m_visibleCheckBox = new QCheckBox(m_gridGroupBox);
- m_visibleCheckBox->setObjectName(QString::fromUtf8("m_visibleCheckBox"));
+ m_visibleCheckBox->setObjectName(QStringLiteral("m_visibleCheckBox"));
QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -70,28 +70,28 @@ public:
gridLayout->addWidget(m_visibleCheckBox, 0, 0, 1, 1);
label = new QLabel(m_gridGroupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 1, 1, 1);
m_deltaXSpinBox = new QSpinBox(m_gridGroupBox);
- m_deltaXSpinBox->setObjectName(QString::fromUtf8("m_deltaXSpinBox"));
+ m_deltaXSpinBox->setObjectName(QStringLiteral("m_deltaXSpinBox"));
m_deltaXSpinBox->setMinimum(2);
m_deltaXSpinBox->setMaximum(100);
gridLayout->addWidget(m_deltaXSpinBox, 0, 2, 1, 1);
m_snapXCheckBox = new QCheckBox(m_gridGroupBox);
- m_snapXCheckBox->setObjectName(QString::fromUtf8("m_snapXCheckBox"));
+ m_snapXCheckBox->setObjectName(QStringLiteral("m_snapXCheckBox"));
sizePolicy.setHeightForWidth(m_snapXCheckBox->sizePolicy().hasHeightForWidth());
m_snapXCheckBox->setSizePolicy(sizePolicy);
gridLayout->addWidget(m_snapXCheckBox, 0, 3, 1, 1);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
m_resetButton = new QPushButton(m_gridGroupBox);
- m_resetButton->setObjectName(QString::fromUtf8("m_resetButton"));
+ m_resetButton->setObjectName(QStringLiteral("m_resetButton"));
hboxLayout->addWidget(m_resetButton);
@@ -103,19 +103,19 @@ public:
gridLayout->addLayout(hboxLayout, 1, 0, 1, 1);
label_2 = new QLabel(m_gridGroupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 1, 1, 1, 1);
m_deltaYSpinBox = new QSpinBox(m_gridGroupBox);
- m_deltaYSpinBox->setObjectName(QString::fromUtf8("m_deltaYSpinBox"));
+ m_deltaYSpinBox->setObjectName(QStringLiteral("m_deltaYSpinBox"));
m_deltaYSpinBox->setMinimum(2);
m_deltaYSpinBox->setMaximum(100);
gridLayout->addWidget(m_deltaYSpinBox, 1, 2, 1, 1);
m_snapYCheckBox = new QCheckBox(m_gridGroupBox);
- m_snapYCheckBox->setObjectName(QString::fromUtf8("m_snapYCheckBox"));
+ m_snapYCheckBox->setObjectName(QStringLiteral("m_snapYCheckBox"));
sizePolicy.setHeightForWidth(m_snapYCheckBox->sizePolicy().hasHeightForWidth());
m_snapYCheckBox->setSizePolicy(sizePolicy);
diff --git a/tests/auto/tools/uic/baseline/helpdialog.ui.h b/tests/auto/tools/uic/baseline/helpdialog.ui.h
index b16632fe00..ac482ba139 100644
--- a/tests/auto/tools/uic/baseline/helpdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/helpdialog.ui.h
@@ -114,26 +114,26 @@ public:
void setupUi(QWidget *HelpDialog)
{
if (HelpDialog->objectName().isEmpty())
- HelpDialog->setObjectName(QString::fromUtf8("HelpDialog"));
+ HelpDialog->setObjectName(QStringLiteral("HelpDialog"));
HelpDialog->resize(274, 417);
vboxLayout = new QVBoxLayout(HelpDialog);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(0, 0, 0, 0);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
tabWidget = new QTabWidget(HelpDialog);
- tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
+ tabWidget->setObjectName(QStringLiteral("tabWidget"));
contentPage = new QWidget();
- contentPage->setObjectName(QString::fromUtf8("contentPage"));
+ contentPage->setObjectName(QStringLiteral("contentPage"));
vboxLayout1 = new QVBoxLayout(contentPage);
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
#endif
vboxLayout1->setContentsMargins(5, 5, 5, 5);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
listContents = new QTreeWidget(contentPage);
- listContents->setObjectName(QString::fromUtf8("listContents"));
+ listContents->setObjectName(QStringLiteral("listContents"));
listContents->setContextMenuPolicy(Qt::CustomContextMenu);
listContents->setRootIsDecorated(true);
listContents->setUniformRowHeights(true);
@@ -142,40 +142,40 @@ public:
tabWidget->addTab(contentPage, QString());
indexPage = new QWidget();
- indexPage->setObjectName(QString::fromUtf8("indexPage"));
+ indexPage->setObjectName(QStringLiteral("indexPage"));
vboxLayout2 = new QVBoxLayout(indexPage);
#ifndef Q_OS_MAC
vboxLayout2->setSpacing(6);
#endif
vboxLayout2->setContentsMargins(5, 5, 5, 5);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
TextLabel1 = new QLabel(indexPage);
- TextLabel1->setObjectName(QString::fromUtf8("TextLabel1"));
+ TextLabel1->setObjectName(QStringLiteral("TextLabel1"));
vboxLayout2->addWidget(TextLabel1);
editIndex = new QLineEdit(indexPage);
- editIndex->setObjectName(QString::fromUtf8("editIndex"));
+ editIndex->setObjectName(QStringLiteral("editIndex"));
vboxLayout2->addWidget(editIndex);
listIndex = new QListView(indexPage);
- listIndex->setObjectName(QString::fromUtf8("listIndex"));
+ listIndex->setObjectName(QStringLiteral("listIndex"));
listIndex->setContextMenuPolicy(Qt::CustomContextMenu);
vboxLayout2->addWidget(listIndex);
tabWidget->addTab(indexPage, QString());
bookmarkPage = new QWidget();
- bookmarkPage->setObjectName(QString::fromUtf8("bookmarkPage"));
+ bookmarkPage->setObjectName(QStringLiteral("bookmarkPage"));
vboxLayout3 = new QVBoxLayout(bookmarkPage);
#ifndef Q_OS_MAC
vboxLayout3->setSpacing(6);
#endif
vboxLayout3->setContentsMargins(5, 5, 5, 5);
- vboxLayout3->setObjectName(QString::fromUtf8("vboxLayout3"));
+ vboxLayout3->setObjectName(QStringLiteral("vboxLayout3"));
listBookmarks = new QTreeWidget(bookmarkPage);
- listBookmarks->setObjectName(QString::fromUtf8("listBookmarks"));
+ listBookmarks->setObjectName(QStringLiteral("listBookmarks"));
listBookmarks->setContextMenuPolicy(Qt::CustomContextMenu);
listBookmarks->setUniformRowHeights(true);
@@ -186,18 +186,18 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
spacerItem = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem);
buttonAdd = new QPushButton(bookmarkPage);
- buttonAdd->setObjectName(QString::fromUtf8("buttonAdd"));
+ buttonAdd->setObjectName(QStringLiteral("buttonAdd"));
hboxLayout->addWidget(buttonAdd);
buttonRemove = new QPushButton(bookmarkPage);
- buttonRemove->setObjectName(QString::fromUtf8("buttonRemove"));
+ buttonRemove->setObjectName(QStringLiteral("buttonRemove"));
hboxLayout->addWidget(buttonRemove);
@@ -206,35 +206,35 @@ public:
tabWidget->addTab(bookmarkPage, QString());
searchPage = new QWidget();
- searchPage->setObjectName(QString::fromUtf8("searchPage"));
+ searchPage->setObjectName(QStringLiteral("searchPage"));
gridLayout = new QGridLayout(searchPage);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(5, 5, 5, 5);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem1 = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed);
gridLayout->addItem(spacerItem1, 3, 0, 1, 1);
TextLabel1_2 = new QLabel(searchPage);
- TextLabel1_2->setObjectName(QString::fromUtf8("TextLabel1_2"));
+ TextLabel1_2->setObjectName(QStringLiteral("TextLabel1_2"));
gridLayout->addWidget(TextLabel1_2, 0, 0, 1, 1);
termsEdit = new QLineEdit(searchPage);
- termsEdit->setObjectName(QString::fromUtf8("termsEdit"));
+ termsEdit->setObjectName(QStringLiteral("termsEdit"));
gridLayout->addWidget(termsEdit, 1, 0, 1, 1);
resultBox = new QListWidget(searchPage);
- resultBox->setObjectName(QString::fromUtf8("resultBox"));
+ resultBox->setObjectName(QStringLiteral("resultBox"));
resultBox->setContextMenuPolicy(Qt::CustomContextMenu);
gridLayout->addWidget(resultBox, 5, 0, 1, 1);
TextLabel2 = new QLabel(searchPage);
- TextLabel2->setObjectName(QString::fromUtf8("TextLabel2"));
+ TextLabel2->setObjectName(QStringLiteral("TextLabel2"));
gridLayout->addWidget(TextLabel2, 4, 0, 1, 1);
@@ -243,9 +243,9 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(1, 1, 1, 1);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
helpButton = new QPushButton(searchPage);
- helpButton->setObjectName(QString::fromUtf8("helpButton"));
+ helpButton->setObjectName(QStringLiteral("helpButton"));
hboxLayout1->addWidget(helpButton);
@@ -254,7 +254,7 @@ public:
hboxLayout1->addItem(spacerItem2);
searchButton = new QPushButton(searchPage);
- searchButton->setObjectName(QString::fromUtf8("searchButton"));
+ searchButton->setObjectName(QStringLiteral("searchButton"));
searchButton->setEnabled(false);
hboxLayout1->addWidget(searchButton);
@@ -267,7 +267,7 @@ public:
vboxLayout->addWidget(tabWidget);
framePrepare = new QFrame(HelpDialog);
- framePrepare->setObjectName(QString::fromUtf8("framePrepare"));
+ framePrepare->setObjectName(QStringLiteral("framePrepare"));
framePrepare->setFrameShape(QFrame::StyledPanel);
framePrepare->setFrameShadow(QFrame::Raised);
hboxLayout2 = new QHBoxLayout(framePrepare);
@@ -275,14 +275,14 @@ public:
hboxLayout2->setSpacing(6);
#endif
hboxLayout2->setContentsMargins(3, 3, 3, 3);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
labelPrepare = new QLabel(framePrepare);
- labelPrepare->setObjectName(QString::fromUtf8("labelPrepare"));
+ labelPrepare->setObjectName(QStringLiteral("labelPrepare"));
hboxLayout2->addWidget(labelPrepare);
progressPrepare = new QProgressBar(framePrepare);
- progressPrepare->setObjectName(QString::fromUtf8("progressPrepare"));
+ progressPrepare->setObjectName(QStringLiteral("progressPrepare"));
hboxLayout2->addWidget(progressPrepare);
diff --git a/tests/auto/tools/uic/baseline/history.ui.h b/tests/auto/tools/uic/baseline/history.ui.h
index 1784b216e3..57007e5280 100644
--- a/tests/auto/tools/uic/baseline/history.ui.h
+++ b/tests/auto/tools/uic/baseline/history.ui.h
@@ -42,33 +42,33 @@ public:
void setupUi(QDialog *HistoryDialog)
{
if (HistoryDialog->objectName().isEmpty())
- HistoryDialog->setObjectName(QString::fromUtf8("HistoryDialog"));
+ HistoryDialog->setObjectName(QStringLiteral("HistoryDialog"));
HistoryDialog->resize(758, 450);
gridLayout = new QGridLayout(HistoryDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem = new QSpacerItem(252, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(spacerItem, 0, 0, 1, 1);
search = new SearchLineEdit(HistoryDialog);
- search->setObjectName(QString::fromUtf8("search"));
+ search->setObjectName(QStringLiteral("search"));
gridLayout->addWidget(search, 0, 1, 1, 1);
tree = new EditTreeView(HistoryDialog);
- tree->setObjectName(QString::fromUtf8("tree"));
+ tree->setObjectName(QStringLiteral("tree"));
gridLayout->addWidget(tree, 1, 0, 1, 2);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
removeButton = new QPushButton(HistoryDialog);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
hboxLayout->addWidget(removeButton);
removeAllButton = new QPushButton(HistoryDialog);
- removeAllButton->setObjectName(QString::fromUtf8("removeAllButton"));
+ removeAllButton->setObjectName(QStringLiteral("removeAllButton"));
hboxLayout->addWidget(removeAllButton);
@@ -77,7 +77,7 @@ public:
hboxLayout->addItem(spacerItem1);
buttonBox = new QDialogButtonBox(HistoryDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setStandardButtons(QDialogButtonBox::Ok);
hboxLayout->addWidget(buttonBox);
diff --git a/tests/auto/tools/uic/baseline/icontheme.ui.h b/tests/auto/tools/uic/baseline/icontheme.ui.h
index 78c90838ab..f3f8f634f9 100644
--- a/tests/auto/tools/uic/baseline/icontheme.ui.h
+++ b/tests/auto/tools/uic/baseline/icontheme.ui.h
@@ -32,39 +32,39 @@ public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
- Form->setObjectName(QString::fromUtf8("Form"));
+ Form->setObjectName(QStringLiteral("Form"));
Form->resize(122, 117);
verticalLayout = new QVBoxLayout(Form);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
fileicon = new QPushButton(Form);
- fileicon->setObjectName(QString::fromUtf8("fileicon"));
+ fileicon->setObjectName(QStringLiteral("fileicon"));
QIcon icon;
- icon.addFile(QString::fromUtf8("image1.png"), QSize(), QIcon::Normal, QIcon::Off);
+ icon.addFile(QStringLiteral("image1.png"), QSize(), QIcon::Normal, QIcon::Off);
fileicon->setIcon(icon);
verticalLayout->addWidget(fileicon);
fileandthemeicon = new QPushButton(Form);
- fileandthemeicon->setObjectName(QString::fromUtf8("fileandthemeicon"));
+ fileandthemeicon->setObjectName(QStringLiteral("fileandthemeicon"));
QIcon icon1;
- QString iconThemeName = QString::fromUtf8("edit-copy");
+ QString iconThemeName = QStringLiteral("edit-copy");
if (QIcon::hasThemeIcon(iconThemeName)) {
icon1 = QIcon::fromTheme(iconThemeName);
} else {
- icon1.addFile(QString::fromUtf8("image7.png"), QSize(), QIcon::Normal, QIcon::Off);
+ icon1.addFile(QStringLiteral("image7.png"), QSize(), QIcon::Normal, QIcon::Off);
}
fileandthemeicon->setIcon(icon1);
verticalLayout->addWidget(fileandthemeicon);
themeicon = new QPushButton(Form);
- themeicon->setObjectName(QString::fromUtf8("themeicon"));
+ themeicon->setObjectName(QStringLiteral("themeicon"));
QIcon icon2;
- iconThemeName = QString::fromUtf8("edit-copy");
+ iconThemeName = QStringLiteral("edit-copy");
if (QIcon::hasThemeIcon(iconThemeName)) {
icon2 = QIcon::fromTheme(iconThemeName);
} else {
- icon2.addFile(QString::fromUtf8(""), QSize(), QIcon::Normal, QIcon::Off);
+ icon2.addFile(QStringLiteral(""), QSize(), QIcon::Normal, QIcon::Off);
}
themeicon->setIcon(icon2);
diff --git a/tests/auto/tools/uic/baseline/identifierpage.ui.h b/tests/auto/tools/uic/baseline/identifierpage.ui.h
index 1088ee33da..3f0cd1a4f5 100644
--- a/tests/auto/tools/uic/baseline/identifierpage.ui.h
+++ b/tests/auto/tools/uic/baseline/identifierpage.ui.h
@@ -40,16 +40,16 @@ public:
void setupUi(QWidget *IdentifierPage)
{
if (IdentifierPage->objectName().isEmpty())
- IdentifierPage->setObjectName(QString::fromUtf8("IdentifierPage"));
+ IdentifierPage->setObjectName(QStringLiteral("IdentifierPage"));
IdentifierPage->resize(417, 242);
gridLayout = new QGridLayout(IdentifierPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed);
gridLayout->addItem(spacerItem, 0, 1, 1, 1);
identifierCheckBox = new QCheckBox(IdentifierPage);
- identifierCheckBox->setObjectName(QString::fromUtf8("identifierCheckBox"));
+ identifierCheckBox->setObjectName(QStringLiteral("identifierCheckBox"));
gridLayout->addWidget(identifierCheckBox, 1, 0, 1, 3);
@@ -62,20 +62,20 @@ public:
gridLayout->addItem(spacerItem2, 2, 0, 1, 1);
globalButton = new QRadioButton(IdentifierPage);
- globalButton->setObjectName(QString::fromUtf8("globalButton"));
+ globalButton->setObjectName(QStringLiteral("globalButton"));
globalButton->setEnabled(false);
globalButton->setChecked(true);
gridLayout->addWidget(globalButton, 2, 1, 1, 1);
prefixLineEdit = new QLineEdit(IdentifierPage);
- prefixLineEdit->setObjectName(QString::fromUtf8("prefixLineEdit"));
+ prefixLineEdit->setObjectName(QStringLiteral("prefixLineEdit"));
prefixLineEdit->setEnabled(false);
gridLayout->addWidget(prefixLineEdit, 2, 2, 1, 1);
fileNameButton = new QRadioButton(IdentifierPage);
- fileNameButton->setObjectName(QString::fromUtf8("fileNameButton"));
+ fileNameButton->setObjectName(QStringLiteral("fileNameButton"));
fileNameButton->setEnabled(false);
gridLayout->addWidget(fileNameButton, 3, 1, 1, 2);
diff --git a/tests/auto/tools/uic/baseline/imagedialog.ui.h b/tests/auto/tools/uic/baseline/imagedialog.ui.h
index 1728cac952..c09363d3ec 100644
--- a/tests/auto/tools/uic/baseline/imagedialog.ui.h
+++ b/tests/auto/tools/uic/baseline/imagedialog.ui.h
@@ -50,8 +50,8 @@ public:
void setupUi(QDialog *dialog)
{
if (dialog->objectName().isEmpty())
- dialog->setObjectName(QString::fromUtf8("dialog"));
- dialog->setObjectName(QString::fromUtf8("ImageDialog"));
+ dialog->setObjectName(QStringLiteral("dialog"));
+ dialog->setObjectName(QStringLiteral("ImageDialog"));
dialog->resize(320, 180);
vboxLayout = new QVBoxLayout(dialog);
#ifndef Q_OS_MAC
@@ -60,17 +60,17 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
- vboxLayout->setObjectName(QString::fromUtf8(""));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral(""));
gridLayout = new QGridLayout();
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(1, 1, 1, 1);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
- gridLayout->setObjectName(QString::fromUtf8(""));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral(""));
widthLabel = new QLabel(dialog);
- widthLabel->setObjectName(QString::fromUtf8("widthLabel"));
+ widthLabel->setObjectName(QStringLiteral("widthLabel"));
widthLabel->setGeometry(QRect(1, 27, 67, 22));
widthLabel->setFrameShape(QFrame::NoFrame);
widthLabel->setFrameShadow(QFrame::Plain);
@@ -79,7 +79,7 @@ public:
gridLayout->addWidget(widthLabel, 1, 0, 1, 1);
heightLabel = new QLabel(dialog);
- heightLabel->setObjectName(QString::fromUtf8("heightLabel"));
+ heightLabel->setObjectName(QStringLiteral("heightLabel"));
heightLabel->setGeometry(QRect(1, 55, 67, 22));
heightLabel->setFrameShape(QFrame::NoFrame);
heightLabel->setFrameShadow(QFrame::Plain);
@@ -88,7 +88,7 @@ public:
gridLayout->addWidget(heightLabel, 2, 0, 1, 1);
colorDepthCombo = new QComboBox(dialog);
- colorDepthCombo->setObjectName(QString::fromUtf8("colorDepthCombo"));
+ colorDepthCombo->setObjectName(QStringLiteral("colorDepthCombo"));
colorDepthCombo->setGeometry(QRect(74, 83, 227, 22));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(0));
sizePolicy.setHorizontalStretch(0);
@@ -100,7 +100,7 @@ public:
gridLayout->addWidget(colorDepthCombo, 3, 1, 1, 1);
nameLineEdit = new QLineEdit(dialog);
- nameLineEdit->setObjectName(QString::fromUtf8("nameLineEdit"));
+ nameLineEdit->setObjectName(QStringLiteral("nameLineEdit"));
nameLineEdit->setGeometry(QRect(74, 83, 227, 22));
QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(0));
sizePolicy1.setHorizontalStretch(1);
@@ -112,7 +112,7 @@ public:
gridLayout->addWidget(nameLineEdit, 0, 1, 1, 1);
spinBox = new QSpinBox(dialog);
- spinBox->setObjectName(QString::fromUtf8("spinBox"));
+ spinBox->setObjectName(QStringLiteral("spinBox"));
spinBox->setGeometry(QRect(74, 1, 227, 20));
sizePolicy.setHeightForWidth(spinBox->sizePolicy().hasHeightForWidth());
spinBox->setSizePolicy(sizePolicy);
@@ -124,7 +124,7 @@ public:
gridLayout->addWidget(spinBox, 1, 1, 1, 1);
spinBox_2 = new QSpinBox(dialog);
- spinBox_2->setObjectName(QString::fromUtf8("spinBox_2"));
+ spinBox_2->setObjectName(QStringLiteral("spinBox_2"));
spinBox_2->setGeometry(QRect(74, 27, 227, 22));
sizePolicy.setHeightForWidth(spinBox_2->sizePolicy().hasHeightForWidth());
spinBox_2->setSizePolicy(sizePolicy);
@@ -136,7 +136,7 @@ public:
gridLayout->addWidget(spinBox_2, 2, 1, 1, 1);
nameLabel = new QLabel(dialog);
- nameLabel->setObjectName(QString::fromUtf8("nameLabel"));
+ nameLabel->setObjectName(QStringLiteral("nameLabel"));
nameLabel->setGeometry(QRect(1, 1, 67, 20));
nameLabel->setFrameShape(QFrame::NoFrame);
nameLabel->setFrameShadow(QFrame::Plain);
@@ -145,7 +145,7 @@ public:
gridLayout->addWidget(nameLabel, 0, 0, 1, 1);
colorDepthLabel = new QLabel(dialog);
- colorDepthLabel->setObjectName(QString::fromUtf8("colorDepthLabel"));
+ colorDepthLabel->setObjectName(QStringLiteral("colorDepthLabel"));
colorDepthLabel->setGeometry(QRect(1, 83, 67, 22));
colorDepthLabel->setFrameShape(QFrame::NoFrame);
colorDepthLabel->setFrameShadow(QFrame::Plain);
@@ -165,20 +165,20 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(1, 1, 1, 1);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
- hboxLayout->setObjectName(QString::fromUtf8(""));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral(""));
spacerItem1 = new QSpacerItem(QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem1);
okButton = new QPushButton(dialog);
- okButton->setObjectName(QString::fromUtf8("okButton"));
+ okButton->setObjectName(QStringLiteral("okButton"));
okButton->setGeometry(QRect(135, 1, 80, 24));
hboxLayout->addWidget(okButton);
cancelButton = new QPushButton(dialog);
- cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+ cancelButton->setObjectName(QStringLiteral("cancelButton"));
cancelButton->setGeometry(QRect(221, 1, 80, 24));
hboxLayout->addWidget(cancelButton);
diff --git a/tests/auto/tools/uic/baseline/inputpage.ui.h b/tests/auto/tools/uic/baseline/inputpage.ui.h
index 90ff131d1d..d52d1ae93b 100644
--- a/tests/auto/tools/uic/baseline/inputpage.ui.h
+++ b/tests/auto/tools/uic/baseline/inputpage.ui.h
@@ -39,16 +39,16 @@ public:
void setupUi(QWidget *InputPage)
{
if (InputPage->objectName().isEmpty())
- InputPage->setObjectName(QString::fromUtf8("InputPage"));
+ InputPage->setObjectName(QStringLiteral("InputPage"));
InputPage->resize(417, 242);
gridLayout = new QGridLayout(InputPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed);
gridLayout->addItem(spacerItem, 0, 2, 1, 1);
label = new QLabel(InputPage);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -59,14 +59,14 @@ public:
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
fileLineEdit = new QLineEdit(InputPage);
- fileLineEdit->setObjectName(QString::fromUtf8("fileLineEdit"));
+ fileLineEdit->setObjectName(QStringLiteral("fileLineEdit"));
hboxLayout->addWidget(fileLineEdit);
browseButton = new QToolButton(InputPage);
- browseButton->setObjectName(QString::fromUtf8("browseButton"));
+ browseButton->setObjectName(QStringLiteral("browseButton"));
hboxLayout->addWidget(browseButton);
diff --git a/tests/auto/tools/uic/baseline/installdialog.ui.h b/tests/auto/tools/uic/baseline/installdialog.ui.h
index d58986f98a..519a71005e 100644
--- a/tests/auto/tools/uic/baseline/installdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/installdialog.ui.h
@@ -48,32 +48,32 @@ public:
void setupUi(QDialog *InstallDialog)
{
if (InstallDialog->objectName().isEmpty())
- InstallDialog->setObjectName(QString::fromUtf8("InstallDialog"));
+ InstallDialog->setObjectName(QStringLiteral("InstallDialog"));
InstallDialog->resize(436, 245);
gridLayout = new QGridLayout(InstallDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(InstallDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 4);
listWidget = new QListWidget(InstallDialog);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
gridLayout->addWidget(listWidget, 1, 0, 4, 4);
installButton = new QPushButton(InstallDialog);
- installButton->setObjectName(QString::fromUtf8("installButton"));
+ installButton->setObjectName(QStringLiteral("installButton"));
gridLayout->addWidget(installButton, 1, 4, 1, 1);
cancelButton = new QPushButton(InstallDialog);
- cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+ cancelButton->setObjectName(QStringLiteral("cancelButton"));
gridLayout->addWidget(cancelButton, 2, 4, 1, 1);
closeButton = new QPushButton(InstallDialog);
- closeButton->setObjectName(QString::fromUtf8("closeButton"));
+ closeButton->setObjectName(QStringLiteral("closeButton"));
gridLayout->addWidget(closeButton, 3, 4, 1, 1);
@@ -82,34 +82,34 @@ public:
gridLayout->addItem(spacerItem, 4, 4, 1, 1);
label_4 = new QLabel(InstallDialog);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
gridLayout->addWidget(label_4, 5, 0, 1, 1);
pathLineEdit = new QLineEdit(InstallDialog);
- pathLineEdit->setObjectName(QString::fromUtf8("pathLineEdit"));
+ pathLineEdit->setObjectName(QStringLiteral("pathLineEdit"));
gridLayout->addWidget(pathLineEdit, 5, 1, 1, 2);
browseButton = new QToolButton(InstallDialog);
- browseButton->setObjectName(QString::fromUtf8("browseButton"));
+ browseButton->setObjectName(QStringLiteral("browseButton"));
gridLayout->addWidget(browseButton, 5, 3, 1, 1);
line = new QFrame(InstallDialog);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
gridLayout->addWidget(line, 6, 0, 1, 5);
statusLabel = new QLabel(InstallDialog);
- statusLabel->setObjectName(QString::fromUtf8("statusLabel"));
+ statusLabel->setObjectName(QStringLiteral("statusLabel"));
gridLayout->addWidget(statusLabel, 7, 0, 1, 2);
progressBar = new QProgressBar(InstallDialog);
- progressBar->setObjectName(QString::fromUtf8("progressBar"));
+ progressBar->setObjectName(QStringLiteral("progressBar"));
progressBar->setValue(0);
progressBar->setOrientation(Qt::Horizontal);
diff --git a/tests/auto/tools/uic/baseline/languagesdialog.ui.h b/tests/auto/tools/uic/baseline/languagesdialog.ui.h
index 58d299096a..0419f18ecf 100644
--- a/tests/auto/tools/uic/baseline/languagesdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/languagesdialog.ui.h
@@ -41,50 +41,50 @@ public:
void setupUi(QDialog *LanguagesDialog)
{
if (LanguagesDialog->objectName().isEmpty())
- LanguagesDialog->setObjectName(QString::fromUtf8("LanguagesDialog"));
+ LanguagesDialog->setObjectName(QStringLiteral("LanguagesDialog"));
LanguagesDialog->resize(400, 300);
verticalLayout = new QVBoxLayout(LanguagesDialog);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
languagesList = new QTreeWidget(LanguagesDialog);
- languagesList->setObjectName(QString::fromUtf8("languagesList"));
+ languagesList->setObjectName(QStringLiteral("languagesList"));
languagesList->setIndentation(0);
verticalLayout->addWidget(languagesList);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
upButton = new QToolButton(LanguagesDialog);
- upButton->setObjectName(QString::fromUtf8("upButton"));
+ upButton->setObjectName(QStringLiteral("upButton"));
upButton->setEnabled(false);
QIcon icon;
- icon.addFile(QString::fromUtf8(":/images/up.png"), QSize(), QIcon::Normal, QIcon::Off);
+ icon.addFile(QStringLiteral(":/images/up.png"), QSize(), QIcon::Normal, QIcon::Off);
upButton->setIcon(icon);
hboxLayout->addWidget(upButton);
downButton = new QToolButton(LanguagesDialog);
- downButton->setObjectName(QString::fromUtf8("downButton"));
+ downButton->setObjectName(QStringLiteral("downButton"));
downButton->setEnabled(false);
QIcon icon1;
- icon1.addFile(QString::fromUtf8(":/images/down.png"), QSize(), QIcon::Normal, QIcon::Off);
+ icon1.addFile(QStringLiteral(":/images/down.png"), QSize(), QIcon::Normal, QIcon::Off);
downButton->setIcon(icon1);
hboxLayout->addWidget(downButton);
removeButton = new QToolButton(LanguagesDialog);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
removeButton->setEnabled(false);
QIcon icon2;
- icon2.addFile(QString::fromUtf8(":/images/editdelete.png"), QSize(), QIcon::Normal, QIcon::Off);
+ icon2.addFile(QStringLiteral(":/images/editdelete.png"), QSize(), QIcon::Normal, QIcon::Off);
removeButton->setIcon(icon2);
hboxLayout->addWidget(removeButton);
openFileButton = new QToolButton(LanguagesDialog);
- openFileButton->setObjectName(QString::fromUtf8("openFileButton"));
+ openFileButton->setObjectName(QStringLiteral("openFileButton"));
openFileButton->setEnabled(true);
QIcon icon3;
- icon3.addFile(QString::fromUtf8(":/images/mac/fileopen.png"), QSize(), QIcon::Normal, QIcon::Off);
+ icon3.addFile(QStringLiteral(":/images/mac/fileopen.png"), QSize(), QIcon::Normal, QIcon::Off);
openFileButton->setIcon(icon3);
hboxLayout->addWidget(openFileButton);
@@ -94,7 +94,7 @@ public:
hboxLayout->addItem(spacerItem);
okButton = new QPushButton(LanguagesDialog);
- okButton->setObjectName(QString::fromUtf8("okButton"));
+ okButton->setObjectName(QStringLiteral("okButton"));
hboxLayout->addWidget(okButton);
diff --git a/tests/auto/tools/uic/baseline/listwidgeteditor.ui.h b/tests/auto/tools/uic/baseline/listwidgeteditor.ui.h
index 1cca34b1fa..5ea1c43458 100644
--- a/tests/auto/tools/uic/baseline/listwidgeteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/listwidgeteditor.ui.h
@@ -96,7 +96,7 @@ public:
void setupUi(QDialog *qdesigner_internal__ListWidgetEditor)
{
if (qdesigner_internal__ListWidgetEditor->objectName().isEmpty())
- qdesigner_internal__ListWidgetEditor->setObjectName(QString::fromUtf8("qdesigner_internal__ListWidgetEditor"));
+ qdesigner_internal__ListWidgetEditor->setObjectName(QStringLiteral("qdesigner_internal__ListWidgetEditor"));
qdesigner_internal__ListWidgetEditor->resize(223, 245);
vboxLayout = new QVBoxLayout(qdesigner_internal__ListWidgetEditor);
#ifndef Q_OS_MAC
@@ -105,25 +105,25 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(qdesigner_internal__ListWidgetEditor);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout = new QGridLayout(groupBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
listWidget = new QListWidget(groupBox);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
gridLayout->addWidget(listWidget, 0, 0, 1, 1);
horizontalLayout_2 = new QHBoxLayout();
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
newItemButton = new QToolButton(groupBox);
- newItemButton->setObjectName(QString::fromUtf8("newItemButton"));
+ newItemButton->setObjectName(QStringLiteral("newItemButton"));
horizontalLayout_2->addWidget(newItemButton);
deleteItemButton = new QToolButton(groupBox);
- deleteItemButton->setObjectName(QString::fromUtf8("deleteItemButton"));
+ deleteItemButton->setObjectName(QStringLiteral("deleteItemButton"));
horizontalLayout_2->addWidget(deleteItemButton);
@@ -132,12 +132,12 @@ public:
horizontalLayout_2->addItem(spacerItem);
moveItemUpButton = new QToolButton(groupBox);
- moveItemUpButton->setObjectName(QString::fromUtf8("moveItemUpButton"));
+ moveItemUpButton->setObjectName(QStringLiteral("moveItemUpButton"));
horizontalLayout_2->addWidget(moveItemUpButton);
moveItemDownButton = new QToolButton(groupBox);
- moveItemDownButton->setObjectName(QString::fromUtf8("moveItemDownButton"));
+ moveItemDownButton->setObjectName(QStringLiteral("moveItemDownButton"));
horizontalLayout_2->addWidget(moveItemDownButton);
@@ -145,14 +145,14 @@ public:
gridLayout->addLayout(horizontalLayout_2, 1, 0, 1, 1);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
horizontalLayout->addWidget(label);
itemIconSelector = new qdesigner_internal::IconSelector(groupBox);
- itemIconSelector->setObjectName(QString::fromUtf8("itemIconSelector"));
+ itemIconSelector->setObjectName(QStringLiteral("itemIconSelector"));
horizontalLayout->addWidget(itemIconSelector);
@@ -167,7 +167,7 @@ public:
vboxLayout->addWidget(groupBox);
buttonBox = new QDialogButtonBox(qdesigner_internal__ListWidgetEditor);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/mainwindow.ui.h b/tests/auto/tools/uic/baseline/mainwindow.ui.h
index ef6f4cfe9c..4e336a4262 100644
--- a/tests/auto/tools/uic/baseline/mainwindow.ui.h
+++ b/tests/auto/tools/uic/baseline/mainwindow.ui.h
@@ -89,14 +89,14 @@ public:
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
- MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(829, 813);
actionAdd_Custom_Font = new QAction(MainWindow);
- actionAdd_Custom_Font->setObjectName(QString::fromUtf8("actionAdd_Custom_Font"));
+ actionAdd_Custom_Font->setObjectName(QStringLiteral("actionAdd_Custom_Font"));
action_Exit = new QAction(MainWindow);
- action_Exit->setObjectName(QString::fromUtf8("action_Exit"));
+ action_Exit->setObjectName(QStringLiteral("action_Exit"));
centralwidget = new QWidget(MainWindow);
- centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
+ centralwidget->setObjectName(QStringLiteral("centralwidget"));
vboxLayout = new QVBoxLayout(centralwidget);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
@@ -104,9 +104,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(centralwidget);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
hboxLayout = new QHBoxLayout(groupBox);
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -114,40 +114,40 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout->addWidget(label);
fontComboBox = new QFontComboBox(groupBox);
- fontComboBox->setObjectName(QString::fromUtf8("fontComboBox"));
+ fontComboBox->setObjectName(QStringLiteral("fontComboBox"));
hboxLayout->addWidget(fontComboBox);
label_2 = new QLabel(groupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
hboxLayout->addWidget(label_2);
pixelSize = new QSpinBox(groupBox);
- pixelSize->setObjectName(QString::fromUtf8("pixelSize"));
+ pixelSize->setObjectName(QStringLiteral("pixelSize"));
pixelSize->setMinimum(1);
hboxLayout->addWidget(pixelSize);
label_7 = new QLabel(groupBox);
- label_7->setObjectName(QString::fromUtf8("label_7"));
+ label_7->setObjectName(QStringLiteral("label_7"));
hboxLayout->addWidget(label_7);
weightCombo = new QComboBox(groupBox);
- weightCombo->setObjectName(QString::fromUtf8("weightCombo"));
+ weightCombo->setObjectName(QStringLiteral("weightCombo"));
hboxLayout->addWidget(weightCombo);
italic = new QCheckBox(groupBox);
- italic->setObjectName(QString::fromUtf8("italic"));
+ italic->setObjectName(QStringLiteral("italic"));
hboxLayout->addWidget(italic);
@@ -159,7 +159,7 @@ public:
vboxLayout->addWidget(groupBox);
groupBox_2 = new QGroupBox(centralwidget);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
vboxLayout1 = new QVBoxLayout(groupBox_2);
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
@@ -167,9 +167,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
chooseFromCodePoints = new QRadioButton(groupBox_2);
- chooseFromCodePoints->setObjectName(QString::fromUtf8("chooseFromCodePoints"));
+ chooseFromCodePoints->setObjectName(QStringLiteral("chooseFromCodePoints"));
chooseFromCodePoints->setChecked(true);
vboxLayout1->addWidget(chooseFromCodePoints);
@@ -179,9 +179,9 @@ public:
vboxLayout2->setSpacing(6);
#endif
vboxLayout2->setContentsMargins(0, 0, 0, 0);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
characterRangeView = new QListWidget(groupBox_2);
- characterRangeView->setObjectName(QString::fromUtf8("characterRangeView"));
+ characterRangeView->setObjectName(QStringLiteral("characterRangeView"));
vboxLayout2->addWidget(characterRangeView);
@@ -190,19 +190,19 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
selectAll = new QPushButton(groupBox_2);
- selectAll->setObjectName(QString::fromUtf8("selectAll"));
+ selectAll->setObjectName(QStringLiteral("selectAll"));
hboxLayout1->addWidget(selectAll);
deselectAll = new QPushButton(groupBox_2);
- deselectAll->setObjectName(QString::fromUtf8("deselectAll"));
+ deselectAll->setObjectName(QStringLiteral("deselectAll"));
hboxLayout1->addWidget(deselectAll);
invertSelection = new QPushButton(groupBox_2);
- invertSelection->setObjectName(QString::fromUtf8("invertSelection"));
+ invertSelection->setObjectName(QStringLiteral("invertSelection"));
hboxLayout1->addWidget(invertSelection);
@@ -217,7 +217,7 @@ public:
vboxLayout1->addLayout(vboxLayout2);
chooseFromSampleFile = new QRadioButton(groupBox_2);
- chooseFromSampleFile->setObjectName(QString::fromUtf8("chooseFromSampleFile"));
+ chooseFromSampleFile->setObjectName(QStringLiteral("chooseFromSampleFile"));
vboxLayout1->addWidget(chooseFromSampleFile);
@@ -226,27 +226,27 @@ public:
hboxLayout2->setSpacing(6);
#endif
hboxLayout2->setContentsMargins(0, 0, 0, 0);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
label_5 = new QLabel(groupBox_2);
- label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setObjectName(QStringLiteral("label_5"));
label_5->setEnabled(false);
hboxLayout2->addWidget(label_5);
sampleFile = new QLineEdit(groupBox_2);
- sampleFile->setObjectName(QString::fromUtf8("sampleFile"));
+ sampleFile->setObjectName(QStringLiteral("sampleFile"));
sampleFile->setEnabled(false);
hboxLayout2->addWidget(sampleFile);
browseSampleFile = new QPushButton(groupBox_2);
- browseSampleFile->setObjectName(QString::fromUtf8("browseSampleFile"));
+ browseSampleFile->setObjectName(QStringLiteral("browseSampleFile"));
browseSampleFile->setEnabled(false);
hboxLayout2->addWidget(browseSampleFile);
charCount = new QLabel(groupBox_2);
- charCount->setObjectName(QString::fromUtf8("charCount"));
+ charCount->setObjectName(QStringLiteral("charCount"));
charCount->setEnabled(false);
hboxLayout2->addWidget(charCount);
@@ -258,7 +258,7 @@ public:
vboxLayout->addWidget(groupBox_2);
groupBox_3 = new QGroupBox(centralwidget);
- groupBox_3->setObjectName(QString::fromUtf8("groupBox_3"));
+ groupBox_3->setObjectName(QStringLiteral("groupBox_3"));
hboxLayout3 = new QHBoxLayout(groupBox_3);
#ifndef Q_OS_MAC
hboxLayout3->setSpacing(6);
@@ -266,9 +266,9 @@ public:
#ifndef Q_OS_MAC
hboxLayout3->setContentsMargins(9, 9, 9, 9);
#endif
- hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3"));
+ hboxLayout3->setObjectName(QStringLiteral("hboxLayout3"));
preview = new QLineEdit(groupBox_3);
- preview->setObjectName(QString::fromUtf8("preview"));
+ preview->setObjectName(QStringLiteral("preview"));
hboxLayout3->addWidget(preview);
@@ -276,7 +276,7 @@ public:
vboxLayout->addWidget(groupBox_3);
groupBox_4 = new QGroupBox(centralwidget);
- groupBox_4->setObjectName(QString::fromUtf8("groupBox_4"));
+ groupBox_4->setObjectName(QStringLiteral("groupBox_4"));
hboxLayout4 = new QHBoxLayout(groupBox_4);
#ifndef Q_OS_MAC
hboxLayout4->setSpacing(6);
@@ -284,29 +284,29 @@ public:
#ifndef Q_OS_MAC
hboxLayout4->setContentsMargins(9, 9, 9, 9);
#endif
- hboxLayout4->setObjectName(QString::fromUtf8("hboxLayout4"));
+ hboxLayout4->setObjectName(QStringLiteral("hboxLayout4"));
label_3 = new QLabel(groupBox_4);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
hboxLayout4->addWidget(label_3);
path = new QLineEdit(groupBox_4);
- path->setObjectName(QString::fromUtf8("path"));
+ path->setObjectName(QStringLiteral("path"));
hboxLayout4->addWidget(path);
browsePath = new QPushButton(groupBox_4);
- browsePath->setObjectName(QString::fromUtf8("browsePath"));
+ browsePath->setObjectName(QStringLiteral("browsePath"));
hboxLayout4->addWidget(browsePath);
label_4 = new QLabel(groupBox_4);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
hboxLayout4->addWidget(label_4);
fileName = new QLineEdit(groupBox_4);
- fileName->setObjectName(QString::fromUtf8("fileName"));
+ fileName->setObjectName(QStringLiteral("fileName"));
fileName->setEnabled(false);
hboxLayout4->addWidget(fileName);
@@ -319,9 +319,9 @@ public:
hboxLayout5->setSpacing(6);
#endif
hboxLayout5->setContentsMargins(0, 0, 0, 0);
- hboxLayout5->setObjectName(QString::fromUtf8("hboxLayout5"));
+ hboxLayout5->setObjectName(QStringLiteral("hboxLayout5"));
generate = new QPushButton(centralwidget);
- generate->setObjectName(QString::fromUtf8("generate"));
+ generate->setObjectName(QStringLiteral("generate"));
hboxLayout5->addWidget(generate);
@@ -334,13 +334,13 @@ public:
MainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(MainWindow);
- menubar->setObjectName(QString::fromUtf8("menubar"));
+ menubar->setObjectName(QStringLiteral("menubar"));
menubar->setGeometry(QRect(0, 0, 829, 29));
menuFile = new QMenu(menubar);
- menuFile->setObjectName(QString::fromUtf8("menuFile"));
+ menuFile->setObjectName(QStringLiteral("menuFile"));
MainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(MainWindow);
- statusbar->setObjectName(QString::fromUtf8("statusbar"));
+ statusbar->setObjectName(QStringLiteral("statusbar"));
MainWindow->setStatusBar(statusbar);
menubar->addAction(menuFile->menuAction());
diff --git a/tests/auto/tools/uic/baseline/mydialog.ui.h b/tests/auto/tools/uic/baseline/mydialog.ui.h
index a8750d4514..ffb49e5d97 100644
--- a/tests/auto/tools/uic/baseline/mydialog.ui.h
+++ b/tests/auto/tools/uic/baseline/mydialog.ui.h
@@ -32,7 +32,7 @@ public:
void setupUi(QDialog *MyDialog)
{
if (MyDialog->objectName().isEmpty())
- MyDialog->setObjectName(QString::fromUtf8("MyDialog"));
+ MyDialog->setObjectName(QStringLiteral("MyDialog"));
MyDialog->resize(401, 70);
vboxLayout = new QVBoxLayout(MyDialog);
#ifndef Q_OS_MAC
@@ -41,14 +41,14 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
aLabel = new QLabel(MyDialog);
- aLabel->setObjectName(QString::fromUtf8("aLabel"));
+ aLabel->setObjectName(QStringLiteral("aLabel"));
vboxLayout->addWidget(aLabel);
aButton = new QPushButton(MyDialog);
- aButton->setObjectName(QString::fromUtf8("aButton"));
+ aButton->setObjectName(QStringLiteral("aButton"));
vboxLayout->addWidget(aButton);
diff --git a/tests/auto/tools/uic/baseline/myform.ui.h b/tests/auto/tools/uic/baseline/myform.ui.h
index a5ff7bcc11..140225abbe 100644
--- a/tests/auto/tools/uic/baseline/myform.ui.h
+++ b/tests/auto/tools/uic/baseline/myform.ui.h
@@ -45,35 +45,35 @@ public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
- Form->setObjectName(QString::fromUtf8("Form"));
+ Form->setObjectName(QStringLiteral("Form"));
Form->resize(258, 224);
vboxLayout = new QVBoxLayout(Form);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(8, 8, 8, 8);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(Form);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout = new QGridLayout(groupBox);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(8, 8, 8, 8);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
radioButton_2 = new QRadioButton(groupBox);
- radioButton_2->setObjectName(QString::fromUtf8("radioButton_2"));
+ radioButton_2->setObjectName(QStringLiteral("radioButton_2"));
gridLayout->addWidget(radioButton_2, 1, 0, 1, 1);
radioButton = new QRadioButton(groupBox);
- radioButton->setObjectName(QString::fromUtf8("radioButton"));
+ radioButton->setObjectName(QStringLiteral("radioButton"));
radioButton->setChecked(true);
gridLayout->addWidget(radioButton, 0, 0, 1, 1);
checkBox_2 = new QCheckBox(groupBox);
- checkBox_2->setObjectName(QString::fromUtf8("checkBox_2"));
+ checkBox_2->setObjectName(QStringLiteral("checkBox_2"));
checkBox_2->setChecked(true);
gridLayout->addWidget(checkBox_2, 1, 1, 1, 1);
@@ -83,32 +83,32 @@ public:
gridLayout->addItem(spacerItem, 5, 0, 1, 1);
checkBox = new QCheckBox(groupBox);
- checkBox->setObjectName(QString::fromUtf8("checkBox"));
+ checkBox->setObjectName(QStringLiteral("checkBox"));
gridLayout->addWidget(checkBox, 0, 1, 1, 1);
radioButton_2_2 = new QRadioButton(groupBox);
- radioButton_2_2->setObjectName(QString::fromUtf8("radioButton_2_2"));
+ radioButton_2_2->setObjectName(QStringLiteral("radioButton_2_2"));
gridLayout->addWidget(radioButton_2_2, 2, 0, 1, 1);
radioButton_3 = new QRadioButton(groupBox);
- radioButton_3->setObjectName(QString::fromUtf8("radioButton_3"));
+ radioButton_3->setObjectName(QStringLiteral("radioButton_3"));
gridLayout->addWidget(radioButton_3, 3, 0, 1, 1);
radioButton_4 = new QRadioButton(groupBox);
- radioButton_4->setObjectName(QString::fromUtf8("radioButton_4"));
+ radioButton_4->setObjectName(QStringLiteral("radioButton_4"));
gridLayout->addWidget(radioButton_4, 4, 0, 1, 1);
checkBox_3 = new QCheckBox(groupBox);
- checkBox_3->setObjectName(QString::fromUtf8("checkBox_3"));
+ checkBox_3->setObjectName(QStringLiteral("checkBox_3"));
gridLayout->addWidget(checkBox_3, 2, 1, 1, 1);
checkBox_4 = new QCheckBox(groupBox);
- checkBox_4->setObjectName(QString::fromUtf8("checkBox_4"));
+ checkBox_4->setObjectName(QStringLiteral("checkBox_4"));
checkBox_4->setChecked(true);
gridLayout->addWidget(checkBox_4, 3, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/newactiondialog.ui.h b/tests/auto/tools/uic/baseline/newactiondialog.ui.h
index b69e1581f9..5b9fef13f8 100644
--- a/tests/auto/tools/uic/baseline/newactiondialog.ui.h
+++ b/tests/auto/tools/uic/baseline/newactiondialog.ui.h
@@ -93,42 +93,42 @@ public:
void setupUi(QDialog *qdesigner_internal__NewActionDialog)
{
if (qdesigner_internal__NewActionDialog->objectName().isEmpty())
- qdesigner_internal__NewActionDialog->setObjectName(QString::fromUtf8("qdesigner_internal__NewActionDialog"));
+ qdesigner_internal__NewActionDialog->setObjectName(QStringLiteral("qdesigner_internal__NewActionDialog"));
qdesigner_internal__NewActionDialog->resize(363, 156);
verticalLayout = new QVBoxLayout(qdesigner_internal__NewActionDialog);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
formLayout = new QFormLayout();
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
label = new QLabel(qdesigner_internal__NewActionDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
formLayout->setWidget(0, QFormLayout::LabelRole, label);
editActionText = new QLineEdit(qdesigner_internal__NewActionDialog);
- editActionText->setObjectName(QString::fromUtf8("editActionText"));
+ editActionText->setObjectName(QStringLiteral("editActionText"));
editActionText->setMinimumSize(QSize(255, 0));
formLayout->setWidget(0, QFormLayout::FieldRole, editActionText);
label_3 = new QLabel(qdesigner_internal__NewActionDialog);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
formLayout->setWidget(1, QFormLayout::LabelRole, label_3);
editObjectName = new QLineEdit(qdesigner_internal__NewActionDialog);
- editObjectName->setObjectName(QString::fromUtf8("editObjectName"));
+ editObjectName->setObjectName(QStringLiteral("editObjectName"));
formLayout->setWidget(1, QFormLayout::FieldRole, editObjectName);
label_2 = new QLabel(qdesigner_internal__NewActionDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
formLayout->setWidget(2, QFormLayout::LabelRole, label_2);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
iconSelector = new qdesigner_internal::IconSelector(qdesigner_internal__NewActionDialog);
- iconSelector->setObjectName(QString::fromUtf8("iconSelector"));
+ iconSelector->setObjectName(QStringLiteral("iconSelector"));
horizontalLayout->addWidget(iconSelector);
@@ -147,14 +147,14 @@ public:
verticalLayout->addItem(verticalSpacer);
line = new QFrame(qdesigner_internal__NewActionDialog);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
verticalLayout->addWidget(line);
buttonBox = new QDialogButtonBox(qdesigner_internal__NewActionDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h b/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h
index f3296421b2..ba9ba5dcfd 100644
--- a/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h
+++ b/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h
@@ -46,20 +46,20 @@ public:
void setupUi(QDialog *qdesigner_internal__NewDynamicPropertyDialog)
{
if (qdesigner_internal__NewDynamicPropertyDialog->objectName().isEmpty())
- qdesigner_internal__NewDynamicPropertyDialog->setObjectName(QString::fromUtf8("qdesigner_internal__NewDynamicPropertyDialog"));
+ qdesigner_internal__NewDynamicPropertyDialog->setObjectName(QStringLiteral("qdesigner_internal__NewDynamicPropertyDialog"));
qdesigner_internal__NewDynamicPropertyDialog->resize(340, 118);
verticalLayout = new QVBoxLayout(qdesigner_internal__NewDynamicPropertyDialog);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
formLayout = new QFormLayout();
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
m_lineEdit = new QLineEdit(qdesigner_internal__NewDynamicPropertyDialog);
- m_lineEdit->setObjectName(QString::fromUtf8("m_lineEdit"));
+ m_lineEdit->setObjectName(QStringLiteral("m_lineEdit"));
m_lineEdit->setMinimumSize(QSize(220, 0));
formLayout->setWidget(0, QFormLayout::FieldRole, m_lineEdit);
label = new QLabel(qdesigner_internal__NewDynamicPropertyDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -69,9 +69,9 @@ public:
formLayout->setWidget(0, QFormLayout::LabelRole, label);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
m_comboBox = new QComboBox(qdesigner_internal__NewDynamicPropertyDialog);
- m_comboBox->setObjectName(QString::fromUtf8("m_comboBox"));
+ m_comboBox->setObjectName(QStringLiteral("m_comboBox"));
horizontalLayout->addWidget(m_comboBox);
@@ -83,7 +83,7 @@ public:
formLayout->setLayout(1, QFormLayout::FieldRole, horizontalLayout);
label_2 = new QLabel(qdesigner_internal__NewDynamicPropertyDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
sizePolicy.setHeightForWidth(label_2->sizePolicy().hasHeightForWidth());
label_2->setSizePolicy(sizePolicy);
@@ -97,7 +97,7 @@ public:
verticalLayout->addItem(spacerItem);
m_buttonBox = new QDialogButtonBox(qdesigner_internal__NewDynamicPropertyDialog);
- m_buttonBox->setObjectName(QString::fromUtf8("m_buttonBox"));
+ m_buttonBox->setObjectName(QStringLiteral("m_buttonBox"));
m_buttonBox->setOrientation(Qt::Horizontal);
m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
m_buttonBox->setCenterButtons(false);
diff --git a/tests/auto/tools/uic/baseline/newform.ui.h b/tests/auto/tools/uic/baseline/newform.ui.h
index e985c3bf26..007b2680aa 100644
--- a/tests/auto/tools/uic/baseline/newform.ui.h
+++ b/tests/auto/tools/uic/baseline/newform.ui.h
@@ -83,7 +83,7 @@ public:
void setupUi(QDialog *NewForm)
{
if (NewForm->objectName().isEmpty())
- NewForm->setObjectName(QString::fromUtf8("NewForm"));
+ NewForm->setObjectName(QStringLiteral("NewForm"));
NewForm->resize(495, 319);
vboxLayout = new QVBoxLayout(NewForm);
#ifndef Q_OS_MAC
@@ -92,15 +92,15 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(1, 1, 1, 1);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
treeWidget = new QTreeWidget(NewForm);
- treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
+ treeWidget->setObjectName(QStringLiteral("treeWidget"));
treeWidget->setIconSize(QSize(128, 128));
treeWidget->setRootIsDecorated(false);
treeWidget->setColumnCount(1);
@@ -108,7 +108,7 @@ public:
hboxLayout->addWidget(treeWidget);
lblPreview = new QLabel(NewForm);
- lblPreview->setObjectName(QString::fromUtf8("lblPreview"));
+ lblPreview->setObjectName(QStringLiteral("lblPreview"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(5));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -124,19 +124,19 @@ public:
vboxLayout->addLayout(hboxLayout);
horizontalLine = new QFrame(NewForm);
- horizontalLine->setObjectName(QString::fromUtf8("horizontalLine"));
+ horizontalLine->setObjectName(QStringLiteral("horizontalLine"));
horizontalLine->setFrameShape(QFrame::HLine);
horizontalLine->setFrameShadow(QFrame::Sunken);
vboxLayout->addWidget(horizontalLine);
chkShowOnStartup = new QCheckBox(NewForm);
- chkShowOnStartup->setObjectName(QString::fromUtf8("chkShowOnStartup"));
+ chkShowOnStartup->setObjectName(QStringLiteral("chkShowOnStartup"));
vboxLayout->addWidget(chkShowOnStartup);
buttonBox = new QDialogButtonBox(NewForm);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
vboxLayout->addWidget(buttonBox);
diff --git a/tests/auto/tools/uic/baseline/orderdialog.ui.h b/tests/auto/tools/uic/baseline/orderdialog.ui.h
index 017222da50..494f3e6894 100644
--- a/tests/auto/tools/uic/baseline/orderdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/orderdialog.ui.h
@@ -87,18 +87,18 @@ public:
void setupUi(QDialog *qdesigner_internal__OrderDialog)
{
if (qdesigner_internal__OrderDialog->objectName().isEmpty())
- qdesigner_internal__OrderDialog->setObjectName(QString::fromUtf8("qdesigner_internal__OrderDialog"));
+ qdesigner_internal__OrderDialog->setObjectName(QStringLiteral("qdesigner_internal__OrderDialog"));
qdesigner_internal__OrderDialog->resize(467, 310);
vboxLayout = new QVBoxLayout(qdesigner_internal__OrderDialog);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(qdesigner_internal__OrderDialog);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
hboxLayout = new QHBoxLayout(groupBox);
hboxLayout->setSpacing(6);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
hboxLayout->setContentsMargins(9, 9, 9, 9);
pageList = new QListWidget(groupBox);
- pageList->setObjectName(QString::fromUtf8("pageList"));
+ pageList->setObjectName(QStringLiteral("pageList"));
pageList->setMinimumSize(QSize(344, 0));
pageList->setDragDropMode(QAbstractItemView::InternalMove);
pageList->setSelectionMode(QAbstractItemView::ContiguousSelection);
@@ -108,15 +108,15 @@ public:
vboxLayout1 = new QVBoxLayout();
vboxLayout1->setSpacing(6);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
vboxLayout1->setContentsMargins(0, 0, 0, 0);
upButton = new QToolButton(groupBox);
- upButton->setObjectName(QString::fromUtf8("upButton"));
+ upButton->setObjectName(QStringLiteral("upButton"));
vboxLayout1->addWidget(upButton);
downButton = new QToolButton(groupBox);
- downButton->setObjectName(QString::fromUtf8("downButton"));
+ downButton->setObjectName(QStringLiteral("downButton"));
vboxLayout1->addWidget(downButton);
@@ -131,7 +131,7 @@ public:
vboxLayout->addWidget(groupBox);
buttonBox = new QDialogButtonBox(qdesigner_internal__OrderDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset);
diff --git a/tests/auto/tools/uic/baseline/outputpage.ui.h b/tests/auto/tools/uic/baseline/outputpage.ui.h
index 5e8332ea93..20fbf93b17 100644
--- a/tests/auto/tools/uic/baseline/outputpage.ui.h
+++ b/tests/auto/tools/uic/baseline/outputpage.ui.h
@@ -37,16 +37,16 @@ public:
void setupUi(QWidget *OutputPage)
{
if (OutputPage->objectName().isEmpty())
- OutputPage->setObjectName(QString::fromUtf8("OutputPage"));
+ OutputPage->setObjectName(QStringLiteral("OutputPage"));
OutputPage->resize(417, 242);
gridLayout = new QGridLayout(OutputPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed);
gridLayout->addItem(spacerItem, 0, 1, 1, 1);
label = new QLabel(OutputPage);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -56,7 +56,7 @@ public:
gridLayout->addWidget(label, 1, 0, 1, 1);
projectLineEdit = new QLineEdit(OutputPage);
- projectLineEdit->setObjectName(QString::fromUtf8("projectLineEdit"));
+ projectLineEdit->setObjectName(QStringLiteral("projectLineEdit"));
QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -66,14 +66,14 @@ public:
gridLayout->addWidget(projectLineEdit, 1, 1, 1, 1);
label_2 = new QLabel(OutputPage);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
sizePolicy.setHeightForWidth(label_2->sizePolicy().hasHeightForWidth());
label_2->setSizePolicy(sizePolicy);
gridLayout->addWidget(label_2, 2, 0, 1, 1);
collectionLineEdit = new QLineEdit(OutputPage);
- collectionLineEdit->setObjectName(QString::fromUtf8("collectionLineEdit"));
+ collectionLineEdit->setObjectName(QStringLiteral("collectionLineEdit"));
sizePolicy1.setHeightForWidth(collectionLineEdit->sizePolicy().hasHeightForWidth());
collectionLineEdit->setSizePolicy(sizePolicy1);
diff --git a/tests/auto/tools/uic/baseline/pagefold.ui.h b/tests/auto/tools/uic/baseline/pagefold.ui.h
index a58c4f4976..ede9a51d7c 100644
--- a/tests/auto/tools/uic/baseline/pagefold.ui.h
+++ b/tests/auto/tools/uic/baseline/pagefold.ui.h
@@ -70,18 +70,18 @@ public:
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
- MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(392, 412);
exitAction = new QAction(MainWindow);
- exitAction->setObjectName(QString::fromUtf8("exitAction"));
+ exitAction->setObjectName(QStringLiteral("exitAction"));
aboutQtAction = new QAction(MainWindow);
- aboutQtAction->setObjectName(QString::fromUtf8("aboutQtAction"));
+ aboutQtAction->setObjectName(QStringLiteral("aboutQtAction"));
editStyleAction = new QAction(MainWindow);
- editStyleAction->setObjectName(QString::fromUtf8("editStyleAction"));
+ editStyleAction->setObjectName(QStringLiteral("editStyleAction"));
aboutAction = new QAction(MainWindow);
- aboutAction->setObjectName(QString::fromUtf8("aboutAction"));
+ aboutAction->setObjectName(QStringLiteral("aboutAction"));
centralwidget = new QWidget(MainWindow);
- centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
+ centralwidget->setObjectName(QStringLiteral("centralwidget"));
vboxLayout = new QVBoxLayout(centralwidget);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
@@ -89,9 +89,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
mainFrame = new QFrame(centralwidget);
- mainFrame->setObjectName(QString::fromUtf8("mainFrame"));
+ mainFrame->setObjectName(QStringLiteral("mainFrame"));
mainFrame->setFrameShape(QFrame::StyledPanel);
mainFrame->setFrameShadow(QFrame::Raised);
gridLayout = new QGridLayout(mainFrame);
@@ -101,9 +101,9 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
nameCombo = new QComboBox(mainFrame);
- nameCombo->setObjectName(QString::fromUtf8("nameCombo"));
+ nameCombo->setObjectName(QStringLiteral("nameCombo"));
nameCombo->setEditable(true);
gridLayout->addWidget(nameCombo, 0, 1, 1, 3);
@@ -113,56 +113,56 @@ public:
gridLayout->addItem(spacerItem, 1, 3, 1, 1);
femaleRadioButton = new QRadioButton(mainFrame);
- femaleRadioButton->setObjectName(QString::fromUtf8("femaleRadioButton"));
+ femaleRadioButton->setObjectName(QStringLiteral("femaleRadioButton"));
gridLayout->addWidget(femaleRadioButton, 1, 2, 1, 1);
genderLabel = new QLabel(mainFrame);
- genderLabel->setObjectName(QString::fromUtf8("genderLabel"));
+ genderLabel->setObjectName(QStringLiteral("genderLabel"));
gridLayout->addWidget(genderLabel, 1, 0, 1, 1);
ageLabel = new QLabel(mainFrame);
- ageLabel->setObjectName(QString::fromUtf8("ageLabel"));
+ ageLabel->setObjectName(QStringLiteral("ageLabel"));
gridLayout->addWidget(ageLabel, 2, 0, 1, 1);
maleRadioButton = new QRadioButton(mainFrame);
- maleRadioButton->setObjectName(QString::fromUtf8("maleRadioButton"));
+ maleRadioButton->setObjectName(QStringLiteral("maleRadioButton"));
gridLayout->addWidget(maleRadioButton, 1, 1, 1, 1);
nameLabel = new QLabel(mainFrame);
- nameLabel->setObjectName(QString::fromUtf8("nameLabel"));
+ nameLabel->setObjectName(QStringLiteral("nameLabel"));
gridLayout->addWidget(nameLabel, 0, 0, 1, 1);
passwordLabel = new QLabel(mainFrame);
- passwordLabel->setObjectName(QString::fromUtf8("passwordLabel"));
+ passwordLabel->setObjectName(QStringLiteral("passwordLabel"));
gridLayout->addWidget(passwordLabel, 3, 0, 1, 1);
ageSpinBox = new QSpinBox(mainFrame);
- ageSpinBox->setObjectName(QString::fromUtf8("ageSpinBox"));
+ ageSpinBox->setObjectName(QStringLiteral("ageSpinBox"));
ageSpinBox->setMinimum(12);
ageSpinBox->setValue(22);
gridLayout->addWidget(ageSpinBox, 2, 1, 1, 3);
buttonBox = new QDialogButtonBox(mainFrame);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
gridLayout->addWidget(buttonBox, 7, 2, 1, 2);
agreeCheckBox = new QCheckBox(mainFrame);
- agreeCheckBox->setObjectName(QString::fromUtf8("agreeCheckBox"));
+ agreeCheckBox->setObjectName(QStringLiteral("agreeCheckBox"));
gridLayout->addWidget(agreeCheckBox, 6, 0, 1, 4);
passwordEdit = new QLineEdit(mainFrame);
- passwordEdit->setObjectName(QString::fromUtf8("passwordEdit"));
+ passwordEdit->setObjectName(QStringLiteral("passwordEdit"));
passwordEdit->setEchoMode(QLineEdit::Password);
gridLayout->addWidget(passwordEdit, 3, 1, 1, 3);
@@ -171,22 +171,22 @@ public:
new QListWidgetItem(professionList);
new QListWidgetItem(professionList);
new QListWidgetItem(professionList);
- professionList->setObjectName(QString::fromUtf8("professionList"));
+ professionList->setObjectName(QStringLiteral("professionList"));
gridLayout->addWidget(professionList, 5, 1, 1, 3);
label = new QLabel(mainFrame);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 5, 0, 1, 1);
countryCombo = new QComboBox(mainFrame);
- countryCombo->setObjectName(QString::fromUtf8("countryCombo"));
+ countryCombo->setObjectName(QStringLiteral("countryCombo"));
gridLayout->addWidget(countryCombo, 4, 1, 1, 3);
countryLabel = new QLabel(mainFrame);
- countryLabel->setObjectName(QString::fromUtf8("countryLabel"));
+ countryLabel->setObjectName(QStringLiteral("countryLabel"));
gridLayout->addWidget(countryLabel, 4, 0, 1, 1);
@@ -195,15 +195,15 @@ public:
MainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(MainWindow);
- menubar->setObjectName(QString::fromUtf8("menubar"));
+ menubar->setObjectName(QStringLiteral("menubar"));
menubar->setGeometry(QRect(0, 0, 392, 25));
menu_File = new QMenu(menubar);
- menu_File->setObjectName(QString::fromUtf8("menu_File"));
+ menu_File->setObjectName(QStringLiteral("menu_File"));
menu_Help = new QMenu(menubar);
- menu_Help->setObjectName(QString::fromUtf8("menu_Help"));
+ menu_Help->setObjectName(QStringLiteral("menu_Help"));
MainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(MainWindow);
- statusbar->setObjectName(QString::fromUtf8("statusbar"));
+ statusbar->setObjectName(QStringLiteral("statusbar"));
MainWindow->setStatusBar(statusbar);
#ifndef QT_NO_SHORTCUT
ageLabel->setBuddy(ageSpinBox);
diff --git a/tests/auto/tools/uic/baseline/paletteeditor.ui.h b/tests/auto/tools/uic/baseline/paletteeditor.ui.h
index de57468b9d..67f74c1546 100644
--- a/tests/auto/tools/uic/baseline/paletteeditor.ui.h
+++ b/tests/auto/tools/uic/baseline/paletteeditor.ui.h
@@ -95,7 +95,7 @@ public:
void setupUi(QDialog *qdesigner_internal__PaletteEditor)
{
if (qdesigner_internal__PaletteEditor->objectName().isEmpty())
- qdesigner_internal__PaletteEditor->setObjectName(QString::fromUtf8("qdesigner_internal__PaletteEditor"));
+ qdesigner_internal__PaletteEditor->setObjectName(QStringLiteral("qdesigner_internal__PaletteEditor"));
qdesigner_internal__PaletteEditor->resize(365, 409);
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(7));
sizePolicy.setHorizontalStretch(0);
@@ -109,9 +109,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
advancedBox = new QGroupBox(qdesigner_internal__PaletteEditor);
- advancedBox->setObjectName(QString::fromUtf8("advancedBox"));
+ advancedBox->setObjectName(QStringLiteral("advancedBox"));
advancedBox->setMinimumSize(QSize(0, 0));
advancedBox->setMaximumSize(QSize(16777215, 16777215));
gridLayout = new QGridLayout(advancedBox);
@@ -121,9 +121,9 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
buildButton = new QtColorButton(advancedBox);
- buildButton->setObjectName(QString::fromUtf8("buildButton"));
+ buildButton->setObjectName(QStringLiteral("buildButton"));
QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(13));
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -133,24 +133,24 @@ public:
gridLayout->addWidget(buildButton, 0, 1, 1, 1);
paletteView = new QTreeView(advancedBox);
- paletteView->setObjectName(QString::fromUtf8("paletteView"));
+ paletteView->setObjectName(QStringLiteral("paletteView"));
paletteView->setMinimumSize(QSize(0, 200));
gridLayout->addWidget(paletteView, 1, 0, 1, 4);
detailsRadio = new QRadioButton(advancedBox);
- detailsRadio->setObjectName(QString::fromUtf8("detailsRadio"));
+ detailsRadio->setObjectName(QStringLiteral("detailsRadio"));
gridLayout->addWidget(detailsRadio, 0, 3, 1, 1);
computeRadio = new QRadioButton(advancedBox);
- computeRadio->setObjectName(QString::fromUtf8("computeRadio"));
+ computeRadio->setObjectName(QStringLiteral("computeRadio"));
computeRadio->setChecked(true);
gridLayout->addWidget(computeRadio, 0, 2, 1, 1);
label = new QLabel(advancedBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
@@ -158,7 +158,7 @@ public:
vboxLayout->addWidget(advancedBox);
GroupBox126 = new QGroupBox(qdesigner_internal__PaletteEditor);
- GroupBox126->setObjectName(QString::fromUtf8("GroupBox126"));
+ GroupBox126->setObjectName(QStringLiteral("GroupBox126"));
QSizePolicy sizePolicy2(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(7));
sizePolicy2.setHorizontalStretch(0);
sizePolicy2.setVerticalStretch(0);
@@ -169,25 +169,25 @@ public:
gridLayout1->setSpacing(6);
#endif
gridLayout1->setContentsMargins(8, 8, 8, 8);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
disabledRadio = new QRadioButton(GroupBox126);
- disabledRadio->setObjectName(QString::fromUtf8("disabledRadio"));
+ disabledRadio->setObjectName(QStringLiteral("disabledRadio"));
gridLayout1->addWidget(disabledRadio, 0, 2, 1, 1);
inactiveRadio = new QRadioButton(GroupBox126);
- inactiveRadio->setObjectName(QString::fromUtf8("inactiveRadio"));
+ inactiveRadio->setObjectName(QStringLiteral("inactiveRadio"));
gridLayout1->addWidget(inactiveRadio, 0, 1, 1, 1);
activeRadio = new QRadioButton(GroupBox126);
- activeRadio->setObjectName(QString::fromUtf8("activeRadio"));
+ activeRadio->setObjectName(QStringLiteral("activeRadio"));
activeRadio->setChecked(true);
gridLayout1->addWidget(activeRadio, 0, 0, 1, 1);
previewFrame = new qdesigner_internal::PreviewFrame(GroupBox126);
- previewFrame->setObjectName(QString::fromUtf8("previewFrame"));
+ previewFrame->setObjectName(QStringLiteral("previewFrame"));
sizePolicy.setHeightForWidth(previewFrame->sizePolicy().hasHeightForWidth());
previewFrame->setSizePolicy(sizePolicy);
@@ -197,7 +197,7 @@ public:
vboxLayout->addWidget(GroupBox126);
buttonBox = new QDialogButtonBox(qdesigner_internal__PaletteEditor);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/passworddialog.ui.h b/tests/auto/tools/uic/baseline/passworddialog.ui.h
index f6579dac7b..be763cf040 100644
--- a/tests/auto/tools/uic/baseline/passworddialog.ui.h
+++ b/tests/auto/tools/uic/baseline/passworddialog.ui.h
@@ -40,19 +40,19 @@ public:
void setupUi(QDialog *PasswordDialog)
{
if (PasswordDialog->objectName().isEmpty())
- PasswordDialog->setObjectName(QString::fromUtf8("PasswordDialog"));
+ PasswordDialog->setObjectName(QStringLiteral("PasswordDialog"));
PasswordDialog->resize(399, 148);
gridLayout = new QGridLayout(PasswordDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
iconLabel = new QLabel(PasswordDialog);
- iconLabel->setObjectName(QString::fromUtf8("iconLabel"));
+ iconLabel->setObjectName(QStringLiteral("iconLabel"));
hboxLayout->addWidget(iconLabel);
introLabel = new QLabel(PasswordDialog);
- introLabel->setObjectName(QString::fromUtf8("introLabel"));
+ introLabel->setObjectName(QStringLiteral("introLabel"));
QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -65,28 +65,28 @@ public:
gridLayout->addLayout(hboxLayout, 0, 0, 1, 2);
label = new QLabel(PasswordDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 1, 0, 1, 1);
userNameLineEdit = new QLineEdit(PasswordDialog);
- userNameLineEdit->setObjectName(QString::fromUtf8("userNameLineEdit"));
+ userNameLineEdit->setObjectName(QStringLiteral("userNameLineEdit"));
gridLayout->addWidget(userNameLineEdit, 1, 1, 1, 1);
lblPassword = new QLabel(PasswordDialog);
- lblPassword->setObjectName(QString::fromUtf8("lblPassword"));
+ lblPassword->setObjectName(QStringLiteral("lblPassword"));
gridLayout->addWidget(lblPassword, 2, 0, 1, 1);
passwordLineEdit = new QLineEdit(PasswordDialog);
- passwordLineEdit->setObjectName(QString::fromUtf8("passwordLineEdit"));
+ passwordLineEdit->setObjectName(QStringLiteral("passwordLineEdit"));
passwordLineEdit->setEchoMode(QLineEdit::Password);
gridLayout->addWidget(passwordLineEdit, 2, 1, 1, 1);
buttonBox = new QDialogButtonBox(PasswordDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/pathpage.ui.h b/tests/auto/tools/uic/baseline/pathpage.ui.h
index 5edca08fac..8d75297ff4 100644
--- a/tests/auto/tools/uic/baseline/pathpage.ui.h
+++ b/tests/auto/tools/uic/baseline/pathpage.ui.h
@@ -42,12 +42,12 @@ public:
void setupUi(QWidget *PathPage)
{
if (PathPage->objectName().isEmpty())
- PathPage->setObjectName(QString::fromUtf8("PathPage"));
+ PathPage->setObjectName(QStringLiteral("PathPage"));
PathPage->resize(417, 243);
gridLayout = new QGridLayout(PathPage);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label_2 = new QLabel(PathPage);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -57,7 +57,7 @@ public:
gridLayout->addWidget(label_2, 0, 0, 1, 1);
filterLineEdit = new QLineEdit(PathPage);
- filterLineEdit->setObjectName(QString::fromUtf8("filterLineEdit"));
+ filterLineEdit->setObjectName(QStringLiteral("filterLineEdit"));
gridLayout->addWidget(filterLineEdit, 0, 1, 1, 2);
@@ -66,17 +66,17 @@ public:
gridLayout->addItem(spacerItem, 1, 1, 1, 1);
label = new QLabel(PathPage);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 2, 0, 1, 3);
pathListWidget = new QListWidget(PathPage);
- pathListWidget->setObjectName(QString::fromUtf8("pathListWidget"));
+ pathListWidget->setObjectName(QStringLiteral("pathListWidget"));
gridLayout->addWidget(pathListWidget, 3, 0, 3, 3);
addButton = new QPushButton(PathPage);
- addButton->setObjectName(QString::fromUtf8("addButton"));
+ addButton->setObjectName(QStringLiteral("addButton"));
QSizePolicy sizePolicy1(QSizePolicy::Maximum, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -86,7 +86,7 @@ public:
gridLayout->addWidget(addButton, 3, 3, 1, 1);
removeButton = new QPushButton(PathPage);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
sizePolicy1.setHeightForWidth(removeButton->sizePolicy().hasHeightForWidth());
removeButton->setSizePolicy(sizePolicy1);
diff --git a/tests/auto/tools/uic/baseline/phrasebookbox.ui.h b/tests/auto/tools/uic/baseline/phrasebookbox.ui.h
index ad7f916f56..ecc7190ff1 100644
--- a/tests/auto/tools/uic/baseline/phrasebookbox.ui.h
+++ b/tests/auto/tools/uic/baseline/phrasebookbox.ui.h
@@ -93,45 +93,45 @@ public:
void setupUi(QDialog *PhraseBookBox)
{
if (PhraseBookBox->objectName().isEmpty())
- PhraseBookBox->setObjectName(QString::fromUtf8("PhraseBookBox"));
+ PhraseBookBox->setObjectName(QStringLiteral("PhraseBookBox"));
PhraseBookBox->resize(596, 454);
unnamed = new QHBoxLayout(PhraseBookBox);
unnamed->setSpacing(6);
unnamed->setContentsMargins(11, 11, 11, 11);
- unnamed->setObjectName(QString::fromUtf8("unnamed"));
+ unnamed->setObjectName(QStringLiteral("unnamed"));
inputsLayout = new QVBoxLayout();
inputsLayout->setSpacing(6);
- inputsLayout->setObjectName(QString::fromUtf8("inputsLayout"));
+ inputsLayout->setObjectName(QStringLiteral("inputsLayout"));
gridLayout = new QGridLayout();
gridLayout->setSpacing(6);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
target = new QLabel(PhraseBookBox);
- target->setObjectName(QString::fromUtf8("target"));
+ target->setObjectName(QStringLiteral("target"));
gridLayout->addWidget(target, 1, 0, 1, 1);
targetLed = new QLineEdit(PhraseBookBox);
- targetLed->setObjectName(QString::fromUtf8("targetLed"));
+ targetLed->setObjectName(QStringLiteral("targetLed"));
gridLayout->addWidget(targetLed, 1, 1, 1, 1);
source = new QLabel(PhraseBookBox);
- source->setObjectName(QString::fromUtf8("source"));
+ source->setObjectName(QStringLiteral("source"));
gridLayout->addWidget(source, 0, 0, 1, 1);
definitionLed = new QLineEdit(PhraseBookBox);
- definitionLed->setObjectName(QString::fromUtf8("definitionLed"));
+ definitionLed->setObjectName(QStringLiteral("definitionLed"));
gridLayout->addWidget(definitionLed, 2, 1, 1, 1);
sourceLed = new QLineEdit(PhraseBookBox);
- sourceLed->setObjectName(QString::fromUtf8("sourceLed"));
+ sourceLed->setObjectName(QStringLiteral("sourceLed"));
gridLayout->addWidget(sourceLed, 0, 1, 1, 1);
definition = new QLabel(PhraseBookBox);
- definition->setObjectName(QString::fromUtf8("definition"));
+ definition->setObjectName(QStringLiteral("definition"));
gridLayout->addWidget(definition, 2, 0, 1, 1);
@@ -139,7 +139,7 @@ public:
inputsLayout->addLayout(gridLayout);
phraseList = new QTreeView(PhraseBookBox);
- phraseList->setObjectName(QString::fromUtf8("phraseList"));
+ phraseList->setObjectName(QStringLiteral("phraseList"));
phraseList->setRootIsDecorated(false);
phraseList->setUniformRowHeights(true);
phraseList->setItemsExpandable(false);
@@ -153,24 +153,24 @@ public:
buttonLayout = new QVBoxLayout();
buttonLayout->setSpacing(6);
- buttonLayout->setObjectName(QString::fromUtf8("buttonLayout"));
+ buttonLayout->setObjectName(QStringLiteral("buttonLayout"));
newBut = new QPushButton(PhraseBookBox);
- newBut->setObjectName(QString::fromUtf8("newBut"));
+ newBut->setObjectName(QStringLiteral("newBut"));
buttonLayout->addWidget(newBut);
removeBut = new QPushButton(PhraseBookBox);
- removeBut->setObjectName(QString::fromUtf8("removeBut"));
+ removeBut->setObjectName(QStringLiteral("removeBut"));
buttonLayout->addWidget(removeBut);
saveBut = new QPushButton(PhraseBookBox);
- saveBut->setObjectName(QString::fromUtf8("saveBut"));
+ saveBut->setObjectName(QStringLiteral("saveBut"));
buttonLayout->addWidget(saveBut);
closeBut = new QPushButton(PhraseBookBox);
- closeBut->setObjectName(QString::fromUtf8("closeBut"));
+ closeBut->setObjectName(QStringLiteral("closeBut"));
buttonLayout->addWidget(closeBut);
diff --git a/tests/auto/tools/uic/baseline/plugindialog.ui.h b/tests/auto/tools/uic/baseline/plugindialog.ui.h
index 24453cb47c..770bb82b55 100644
--- a/tests/auto/tools/uic/baseline/plugindialog.ui.h
+++ b/tests/auto/tools/uic/baseline/plugindialog.ui.h
@@ -80,39 +80,39 @@ public:
void setupUi(QDialog *PluginDialog)
{
if (PluginDialog->objectName().isEmpty())
- PluginDialog->setObjectName(QString::fromUtf8("PluginDialog"));
+ PluginDialog->setObjectName(QStringLiteral("PluginDialog"));
PluginDialog->resize(401, 331);
vboxLayout = new QVBoxLayout(PluginDialog);
vboxLayout->setSpacing(6);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(8, 8, 8, 8);
label = new QLabel(PluginDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setWordWrap(true);
vboxLayout->addWidget(label);
treeWidget = new QTreeWidget(PluginDialog);
- treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
+ treeWidget->setObjectName(QStringLiteral("treeWidget"));
treeWidget->setTextElideMode(Qt::ElideNone);
vboxLayout->addWidget(treeWidget);
message = new QLabel(PluginDialog);
- message->setObjectName(QString::fromUtf8("message"));
+ message->setObjectName(QStringLiteral("message"));
message->setWordWrap(true);
vboxLayout->addWidget(message);
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(6);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
hboxLayout->setContentsMargins(0, 0, 0, 0);
vboxLayout->addLayout(hboxLayout);
buttonBox = new QDialogButtonBox(PluginDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Close);
diff --git a/tests/auto/tools/uic/baseline/preferencesdialog.ui.h b/tests/auto/tools/uic/baseline/preferencesdialog.ui.h
index 65ecc359b4..287ccd730d 100644
--- a/tests/auto/tools/uic/baseline/preferencesdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/preferencesdialog.ui.h
@@ -57,21 +57,21 @@ public:
void setupUi(QDialog *PreferencesDialog)
{
if (PreferencesDialog->objectName().isEmpty())
- PreferencesDialog->setObjectName(QString::fromUtf8("PreferencesDialog"));
+ PreferencesDialog->setObjectName(QStringLiteral("PreferencesDialog"));
PreferencesDialog->resize(455, 359);
PreferencesDialog->setModal(true);
vboxLayout = new QVBoxLayout(PreferencesDialog);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
vboxLayout1 = new QVBoxLayout();
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
m_uiModeGroupBox = new QGroupBox(PreferencesDialog);
- m_uiModeGroupBox->setObjectName(QString::fromUtf8("m_uiModeGroupBox"));
+ m_uiModeGroupBox->setObjectName(QStringLiteral("m_uiModeGroupBox"));
vboxLayout2 = new QVBoxLayout(m_uiModeGroupBox);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
m_uiModeCombo = new QComboBox(m_uiModeGroupBox);
- m_uiModeCombo->setObjectName(QString::fromUtf8("m_uiModeCombo"));
+ m_uiModeCombo->setObjectName(QStringLiteral("m_uiModeCombo"));
vboxLayout2->addWidget(m_uiModeCombo);
@@ -79,12 +79,12 @@ public:
vboxLayout1->addWidget(m_uiModeGroupBox);
m_fontPanel = new FontPanel(PreferencesDialog);
- m_fontPanel->setObjectName(QString::fromUtf8("m_fontPanel"));
+ m_fontPanel->setObjectName(QStringLiteral("m_fontPanel"));
vboxLayout1->addWidget(m_fontPanel);
m_previewConfigurationWidget = new qdesigner_internal::PreviewConfigurationWidget(PreferencesDialog);
- m_previewConfigurationWidget->setObjectName(QString::fromUtf8("m_previewConfigurationWidget"));
+ m_previewConfigurationWidget->setObjectName(QStringLiteral("m_previewConfigurationWidget"));
vboxLayout1->addWidget(m_previewConfigurationWidget);
@@ -92,23 +92,23 @@ public:
hboxLayout->addLayout(vboxLayout1);
vboxLayout3 = new QVBoxLayout();
- vboxLayout3->setObjectName(QString::fromUtf8("vboxLayout3"));
+ vboxLayout3->setObjectName(QStringLiteral("vboxLayout3"));
m_templatePathGroupBox = new QGroupBox(PreferencesDialog);
- m_templatePathGroupBox->setObjectName(QString::fromUtf8("m_templatePathGroupBox"));
+ m_templatePathGroupBox->setObjectName(QStringLiteral("m_templatePathGroupBox"));
gridLayout = new QGridLayout(m_templatePathGroupBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
m_templatePathListWidget = new QListWidget(m_templatePathGroupBox);
- m_templatePathListWidget->setObjectName(QString::fromUtf8("m_templatePathListWidget"));
+ m_templatePathListWidget->setObjectName(QStringLiteral("m_templatePathListWidget"));
gridLayout->addWidget(m_templatePathListWidget, 0, 0, 1, 3);
m_addTemplatePathButton = new QToolButton(m_templatePathGroupBox);
- m_addTemplatePathButton->setObjectName(QString::fromUtf8("m_addTemplatePathButton"));
+ m_addTemplatePathButton->setObjectName(QStringLiteral("m_addTemplatePathButton"));
gridLayout->addWidget(m_addTemplatePathButton, 1, 0, 1, 1);
m_removeTemplatePathButton = new QToolButton(m_templatePathGroupBox);
- m_removeTemplatePathButton->setObjectName(QString::fromUtf8("m_removeTemplatePathButton"));
+ m_removeTemplatePathButton->setObjectName(QStringLiteral("m_removeTemplatePathButton"));
gridLayout->addWidget(m_removeTemplatePathButton, 1, 1, 1, 1);
@@ -120,7 +120,7 @@ public:
vboxLayout3->addWidget(m_templatePathGroupBox);
m_gridPanel = new qdesigner_internal::GridPanel(PreferencesDialog);
- m_gridPanel->setObjectName(QString::fromUtf8("m_gridPanel"));
+ m_gridPanel->setObjectName(QStringLiteral("m_gridPanel"));
vboxLayout3->addWidget(m_gridPanel);
@@ -131,14 +131,14 @@ public:
vboxLayout->addLayout(hboxLayout);
line = new QFrame(PreferencesDialog);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
vboxLayout->addWidget(line);
m_dialogButtonBox = new QDialogButtonBox(PreferencesDialog);
- m_dialogButtonBox->setObjectName(QString::fromUtf8("m_dialogButtonBox"));
+ m_dialogButtonBox->setObjectName(QStringLiteral("m_dialogButtonBox"));
m_dialogButtonBox->setOrientation(Qt::Horizontal);
m_dialogButtonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/previewconfigurationwidget.ui.h b/tests/auto/tools/uic/baseline/previewconfigurationwidget.ui.h
index 3392d6f220..1bdf1a049b 100644
--- a/tests/auto/tools/uic/baseline/previewconfigurationwidget.ui.h
+++ b/tests/auto/tools/uic/baseline/previewconfigurationwidget.ui.h
@@ -44,40 +44,40 @@ public:
void setupUi(QGroupBox *PreviewConfigurationWidget)
{
if (PreviewConfigurationWidget->objectName().isEmpty())
- PreviewConfigurationWidget->setObjectName(QString::fromUtf8("PreviewConfigurationWidget"));
+ PreviewConfigurationWidget->setObjectName(QStringLiteral("PreviewConfigurationWidget"));
PreviewConfigurationWidget->setCheckable(true);
formLayout = new QFormLayout(PreviewConfigurationWidget);
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
m_styleLabel = new QLabel(PreviewConfigurationWidget);
- m_styleLabel->setObjectName(QString::fromUtf8("m_styleLabel"));
+ m_styleLabel->setObjectName(QStringLiteral("m_styleLabel"));
formLayout->setWidget(0, QFormLayout::LabelRole, m_styleLabel);
m_styleCombo = new QComboBox(PreviewConfigurationWidget);
- m_styleCombo->setObjectName(QString::fromUtf8("m_styleCombo"));
+ m_styleCombo->setObjectName(QStringLiteral("m_styleCombo"));
formLayout->setWidget(0, QFormLayout::FieldRole, m_styleCombo);
m_appStyleSheetLabel = new QLabel(PreviewConfigurationWidget);
- m_appStyleSheetLabel->setObjectName(QString::fromUtf8("m_appStyleSheetLabel"));
+ m_appStyleSheetLabel->setObjectName(QStringLiteral("m_appStyleSheetLabel"));
formLayout->setWidget(1, QFormLayout::LabelRole, m_appStyleSheetLabel);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
m_appStyleSheetLineEdit = new qdesigner_internal::TextPropertyEditor(PreviewConfigurationWidget);
- m_appStyleSheetLineEdit->setObjectName(QString::fromUtf8("m_appStyleSheetLineEdit"));
+ m_appStyleSheetLineEdit->setObjectName(QStringLiteral("m_appStyleSheetLineEdit"));
m_appStyleSheetLineEdit->setMinimumSize(QSize(149, 0));
hboxLayout->addWidget(m_appStyleSheetLineEdit);
m_appStyleSheetChangeButton = new QToolButton(PreviewConfigurationWidget);
- m_appStyleSheetChangeButton->setObjectName(QString::fromUtf8("m_appStyleSheetChangeButton"));
+ m_appStyleSheetChangeButton->setObjectName(QStringLiteral("m_appStyleSheetChangeButton"));
hboxLayout->addWidget(m_appStyleSheetChangeButton);
m_appStyleSheetClearButton = new QToolButton(PreviewConfigurationWidget);
- m_appStyleSheetClearButton->setObjectName(QString::fromUtf8("m_appStyleSheetClearButton"));
+ m_appStyleSheetClearButton->setObjectName(QStringLiteral("m_appStyleSheetClearButton"));
hboxLayout->addWidget(m_appStyleSheetClearButton);
@@ -85,19 +85,19 @@ public:
formLayout->setLayout(1, QFormLayout::FieldRole, hboxLayout);
m_skinLabel = new QLabel(PreviewConfigurationWidget);
- m_skinLabel->setObjectName(QString::fromUtf8("m_skinLabel"));
+ m_skinLabel->setObjectName(QStringLiteral("m_skinLabel"));
formLayout->setWidget(2, QFormLayout::LabelRole, m_skinLabel);
hboxLayout1 = new QHBoxLayout();
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
m_skinCombo = new QComboBox(PreviewConfigurationWidget);
- m_skinCombo->setObjectName(QString::fromUtf8("m_skinCombo"));
+ m_skinCombo->setObjectName(QStringLiteral("m_skinCombo"));
hboxLayout1->addWidget(m_skinCombo);
m_skinRemoveButton = new QToolButton(PreviewConfigurationWidget);
- m_skinRemoveButton->setObjectName(QString::fromUtf8("m_skinRemoveButton"));
+ m_skinRemoveButton->setObjectName(QStringLiteral("m_skinRemoveButton"));
hboxLayout1->addWidget(m_skinRemoveButton);
diff --git a/tests/auto/tools/uic/baseline/previewdialogbase.ui.h b/tests/auto/tools/uic/baseline/previewdialogbase.ui.h
index 43cd278d55..c577324b5e 100644
--- a/tests/auto/tools/uic/baseline/previewdialogbase.ui.h
+++ b/tests/auto/tools/uic/baseline/previewdialogbase.ui.h
@@ -48,7 +48,7 @@ public:
void setupUi(QDialog *PreviewDialogBase)
{
if (PreviewDialogBase->objectName().isEmpty())
- PreviewDialogBase->setObjectName(QString::fromUtf8("PreviewDialogBase"));
+ PreviewDialogBase->setObjectName(QStringLiteral("PreviewDialogBase"));
PreviewDialogBase->resize(733, 479);
vboxLayout = new QVBoxLayout(PreviewDialogBase);
#ifndef Q_OS_MAC
@@ -57,7 +57,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -65,14 +65,14 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
label = new QLabel(PreviewDialogBase);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout->addWidget(label);
paperSizeCombo = new QComboBox(PreviewDialogBase);
- paperSizeCombo->setObjectName(QString::fromUtf8("paperSizeCombo"));
+ paperSizeCombo->setObjectName(QStringLiteral("paperSizeCombo"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(1), static_cast<QSizePolicy::Policy>(0));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -82,12 +82,12 @@ public:
hboxLayout->addWidget(paperSizeCombo);
label_2 = new QLabel(PreviewDialogBase);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
hboxLayout->addWidget(label_2);
paperOrientationCombo = new QComboBox(PreviewDialogBase);
- paperOrientationCombo->setObjectName(QString::fromUtf8("paperOrientationCombo"));
+ paperOrientationCombo->setObjectName(QStringLiteral("paperOrientationCombo"));
sizePolicy.setHeightForWidth(paperOrientationCombo->sizePolicy().hasHeightForWidth());
paperOrientationCombo->setSizePolicy(sizePolicy);
@@ -105,9 +105,9 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
pageList = new QTreeWidget(PreviewDialogBase);
- pageList->setObjectName(QString::fromUtf8("pageList"));
+ pageList->setObjectName(QStringLiteral("pageList"));
pageList->setIndentation(0);
pageList->setRootIsDecorated(false);
pageList->setUniformRowHeights(true);
@@ -117,7 +117,7 @@ public:
hboxLayout1->addWidget(pageList);
previewArea = new QScrollArea(PreviewDialogBase);
- previewArea->setObjectName(QString::fromUtf8("previewArea"));
+ previewArea->setObjectName(QStringLiteral("previewArea"));
QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(5));
sizePolicy1.setHorizontalStretch(1);
sizePolicy1.setVerticalStretch(0);
@@ -134,9 +134,9 @@ public:
hboxLayout2->setSpacing(6);
#endif
hboxLayout2->setContentsMargins(0, 0, 0, 0);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
progressBar = new QProgressBar(PreviewDialogBase);
- progressBar->setObjectName(QString::fromUtf8("progressBar"));
+ progressBar->setObjectName(QStringLiteral("progressBar"));
progressBar->setEnabled(false);
QSizePolicy sizePolicy2(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(0));
sizePolicy2.setHorizontalStretch(1);
@@ -150,7 +150,7 @@ public:
hboxLayout2->addWidget(progressBar);
buttonBox = new QDialogButtonBox(PreviewDialogBase);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/previewwidget.ui.h b/tests/auto/tools/uic/baseline/previewwidget.ui.h
index 9fd79688f2..9997353ac8 100644
--- a/tests/auto/tools/uic/baseline/previewwidget.ui.h
+++ b/tests/auto/tools/uic/baseline/previewwidget.ui.h
@@ -107,7 +107,7 @@ public:
void setupUi(QWidget *qdesigner_internal__PreviewWidget)
{
if (qdesigner_internal__PreviewWidget->objectName().isEmpty())
- qdesigner_internal__PreviewWidget->setObjectName(QString::fromUtf8("qdesigner_internal__PreviewWidget"));
+ qdesigner_internal__PreviewWidget->setObjectName(QStringLiteral("qdesigner_internal__PreviewWidget"));
qdesigner_internal__PreviewWidget->resize(471, 251);
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(1), static_cast<QSizePolicy::Policy>(1));
sizePolicy.setHorizontalStretch(0);
@@ -121,7 +121,7 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
vboxLayout = new QVBoxLayout();
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
@@ -129,14 +129,14 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
LineEdit1 = new QLineEdit(qdesigner_internal__PreviewWidget);
- LineEdit1->setObjectName(QString::fromUtf8("LineEdit1"));
+ LineEdit1->setObjectName(QStringLiteral("LineEdit1"));
vboxLayout->addWidget(LineEdit1);
ComboBox1 = new QComboBox(qdesigner_internal__PreviewWidget);
- ComboBox1->setObjectName(QString::fromUtf8("ComboBox1"));
+ ComboBox1->setObjectName(QStringLiteral("ComboBox1"));
vboxLayout->addWidget(ComboBox1);
@@ -145,14 +145,14 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
SpinBox1 = new QSpinBox(qdesigner_internal__PreviewWidget);
- SpinBox1->setObjectName(QString::fromUtf8("SpinBox1"));
+ SpinBox1->setObjectName(QStringLiteral("SpinBox1"));
hboxLayout->addWidget(SpinBox1);
PushButton1 = new QPushButton(qdesigner_internal__PreviewWidget);
- PushButton1->setObjectName(QString::fromUtf8("PushButton1"));
+ PushButton1->setObjectName(QStringLiteral("PushButton1"));
hboxLayout->addWidget(PushButton1);
@@ -160,19 +160,19 @@ public:
vboxLayout->addLayout(hboxLayout);
ScrollBar1 = new QScrollBar(qdesigner_internal__PreviewWidget);
- ScrollBar1->setObjectName(QString::fromUtf8("ScrollBar1"));
+ ScrollBar1->setObjectName(QStringLiteral("ScrollBar1"));
ScrollBar1->setOrientation(Qt::Horizontal);
vboxLayout->addWidget(ScrollBar1);
Slider1 = new QSlider(qdesigner_internal__PreviewWidget);
- Slider1->setObjectName(QString::fromUtf8("Slider1"));
+ Slider1->setObjectName(QStringLiteral("Slider1"));
Slider1->setOrientation(Qt::Horizontal);
vboxLayout->addWidget(Slider1);
listWidget = new QListWidget(qdesigner_internal__PreviewWidget);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
listWidget->setMaximumSize(QSize(32767, 50));
vboxLayout->addWidget(listWidget);
@@ -185,13 +185,13 @@ public:
gridLayout->addItem(spacerItem, 3, 0, 1, 2);
ProgressBar1 = new QProgressBar(qdesigner_internal__PreviewWidget);
- ProgressBar1->setObjectName(QString::fromUtf8("ProgressBar1"));
+ ProgressBar1->setObjectName(QStringLiteral("ProgressBar1"));
ProgressBar1->setOrientation(Qt::Horizontal);
gridLayout->addWidget(ProgressBar1, 2, 0, 1, 1);
ButtonGroup2 = new QGroupBox(qdesigner_internal__PreviewWidget);
- ButtonGroup2->setObjectName(QString::fromUtf8("ButtonGroup2"));
+ ButtonGroup2->setObjectName(QStringLiteral("ButtonGroup2"));
vboxLayout1 = new QVBoxLayout(ButtonGroup2);
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
@@ -199,15 +199,15 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
CheckBox1 = new QCheckBox(ButtonGroup2);
- CheckBox1->setObjectName(QString::fromUtf8("CheckBox1"));
+ CheckBox1->setObjectName(QStringLiteral("CheckBox1"));
CheckBox1->setChecked(true);
vboxLayout1->addWidget(CheckBox1);
CheckBox2 = new QCheckBox(ButtonGroup2);
- CheckBox2->setObjectName(QString::fromUtf8("CheckBox2"));
+ CheckBox2->setObjectName(QStringLiteral("CheckBox2"));
vboxLayout1->addWidget(CheckBox2);
@@ -215,7 +215,7 @@ public:
gridLayout->addWidget(ButtonGroup2, 1, 0, 1, 1);
ButtonGroup1 = new QGroupBox(qdesigner_internal__PreviewWidget);
- ButtonGroup1->setObjectName(QString::fromUtf8("ButtonGroup1"));
+ ButtonGroup1->setObjectName(QStringLiteral("ButtonGroup1"));
vboxLayout2 = new QVBoxLayout(ButtonGroup1);
#ifndef Q_OS_MAC
vboxLayout2->setSpacing(6);
@@ -223,20 +223,20 @@ public:
#ifndef Q_OS_MAC
vboxLayout2->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
RadioButton1 = new QRadioButton(ButtonGroup1);
- RadioButton1->setObjectName(QString::fromUtf8("RadioButton1"));
+ RadioButton1->setObjectName(QStringLiteral("RadioButton1"));
RadioButton1->setChecked(true);
vboxLayout2->addWidget(RadioButton1);
RadioButton2 = new QRadioButton(ButtonGroup1);
- RadioButton2->setObjectName(QString::fromUtf8("RadioButton2"));
+ RadioButton2->setObjectName(QStringLiteral("RadioButton2"));
vboxLayout2->addWidget(RadioButton2);
RadioButton3 = new QRadioButton(ButtonGroup1);
- RadioButton3->setObjectName(QString::fromUtf8("RadioButton3"));
+ RadioButton3->setObjectName(QStringLiteral("RadioButton3"));
vboxLayout2->addWidget(RadioButton3);
diff --git a/tests/auto/tools/uic/baseline/proxy.ui.h b/tests/auto/tools/uic/baseline/proxy.ui.h
index 592f1a91e3..9be6b97b81 100644
--- a/tests/auto/tools/uic/baseline/proxy.ui.h
+++ b/tests/auto/tools/uic/baseline/proxy.ui.h
@@ -38,44 +38,44 @@ public:
void setupUi(QDialog *ProxyDialog)
{
if (ProxyDialog->objectName().isEmpty())
- ProxyDialog->setObjectName(QString::fromUtf8("ProxyDialog"));
+ ProxyDialog->setObjectName(QStringLiteral("ProxyDialog"));
ProxyDialog->resize(369, 144);
gridLayout = new QGridLayout(ProxyDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
iconLabel = new QLabel(ProxyDialog);
- iconLabel->setObjectName(QString::fromUtf8("iconLabel"));
+ iconLabel->setObjectName(QStringLiteral("iconLabel"));
gridLayout->addWidget(iconLabel, 0, 0, 1, 1);
introLabel = new QLabel(ProxyDialog);
- introLabel->setObjectName(QString::fromUtf8("introLabel"));
+ introLabel->setObjectName(QStringLiteral("introLabel"));
introLabel->setWordWrap(true);
gridLayout->addWidget(introLabel, 0, 1, 1, 2);
usernameLabel = new QLabel(ProxyDialog);
- usernameLabel->setObjectName(QString::fromUtf8("usernameLabel"));
+ usernameLabel->setObjectName(QStringLiteral("usernameLabel"));
gridLayout->addWidget(usernameLabel, 1, 0, 1, 2);
userNameLineEdit = new QLineEdit(ProxyDialog);
- userNameLineEdit->setObjectName(QString::fromUtf8("userNameLineEdit"));
+ userNameLineEdit->setObjectName(QStringLiteral("userNameLineEdit"));
gridLayout->addWidget(userNameLineEdit, 1, 2, 1, 1);
passwordLabel = new QLabel(ProxyDialog);
- passwordLabel->setObjectName(QString::fromUtf8("passwordLabel"));
+ passwordLabel->setObjectName(QStringLiteral("passwordLabel"));
gridLayout->addWidget(passwordLabel, 2, 0, 1, 2);
passwordLineEdit = new QLineEdit(ProxyDialog);
- passwordLineEdit->setObjectName(QString::fromUtf8("passwordLineEdit"));
+ passwordLineEdit->setObjectName(QStringLiteral("passwordLineEdit"));
passwordLineEdit->setEchoMode(QLineEdit::Password);
gridLayout->addWidget(passwordLineEdit, 2, 2, 1, 1);
buttonBox = new QDialogButtonBox(ProxyDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/qfiledialog.ui.h b/tests/auto/tools/uic/baseline/qfiledialog.ui.h
index 62030018cb..848e07db97 100644
--- a/tests/auto/tools/uic/baseline/qfiledialog.ui.h
+++ b/tests/auto/tools/uic/baseline/qfiledialog.ui.h
@@ -108,20 +108,20 @@ public:
void setupUi(QDialog *QFileDialog)
{
if (QFileDialog->objectName().isEmpty())
- QFileDialog->setObjectName(QString::fromUtf8("QFileDialog"));
+ QFileDialog->setObjectName(QStringLiteral("QFileDialog"));
QFileDialog->resize(521, 316);
QFileDialog->setSizeGripEnabled(true);
gridLayout = new QGridLayout(QFileDialog);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
lookInLabel = new QLabel(QFileDialog);
- lookInLabel->setObjectName(QString::fromUtf8("lookInLabel"));
+ lookInLabel->setObjectName(QStringLiteral("lookInLabel"));
gridLayout->addWidget(lookInLabel, 0, 0, 1, 1);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
lookInCombo = new QFileDialogComboBox(QFileDialog);
- lookInCombo->setObjectName(QString::fromUtf8("lookInCombo"));
+ lookInCombo->setObjectName(QStringLiteral("lookInCombo"));
QSizePolicy sizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(1);
sizePolicy.setVerticalStretch(0);
@@ -132,32 +132,32 @@ public:
hboxLayout->addWidget(lookInCombo);
backButton = new QToolButton(QFileDialog);
- backButton->setObjectName(QString::fromUtf8("backButton"));
+ backButton->setObjectName(QStringLiteral("backButton"));
hboxLayout->addWidget(backButton);
forwardButton = new QToolButton(QFileDialog);
- forwardButton->setObjectName(QString::fromUtf8("forwardButton"));
+ forwardButton->setObjectName(QStringLiteral("forwardButton"));
hboxLayout->addWidget(forwardButton);
toParentButton = new QToolButton(QFileDialog);
- toParentButton->setObjectName(QString::fromUtf8("toParentButton"));
+ toParentButton->setObjectName(QStringLiteral("toParentButton"));
hboxLayout->addWidget(toParentButton);
newFolderButton = new QToolButton(QFileDialog);
- newFolderButton->setObjectName(QString::fromUtf8("newFolderButton"));
+ newFolderButton->setObjectName(QStringLiteral("newFolderButton"));
hboxLayout->addWidget(newFolderButton);
listModeButton = new QToolButton(QFileDialog);
- listModeButton->setObjectName(QString::fromUtf8("listModeButton"));
+ listModeButton->setObjectName(QStringLiteral("listModeButton"));
hboxLayout->addWidget(listModeButton);
detailModeButton = new QToolButton(QFileDialog);
- detailModeButton->setObjectName(QString::fromUtf8("detailModeButton"));
+ detailModeButton->setObjectName(QStringLiteral("detailModeButton"));
hboxLayout->addWidget(detailModeButton);
@@ -165,7 +165,7 @@ public:
gridLayout->addLayout(hboxLayout, 0, 1, 1, 2);
splitter = new QSplitter(QFileDialog);
- splitter->setObjectName(QString::fromUtf8("splitter"));
+ splitter->setObjectName(QStringLiteral("splitter"));
QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -173,38 +173,38 @@ public:
splitter->setSizePolicy(sizePolicy1);
splitter->setOrientation(Qt::Horizontal);
sidebar = new QSidebar(splitter);
- sidebar->setObjectName(QString::fromUtf8("sidebar"));
+ sidebar->setObjectName(QStringLiteral("sidebar"));
splitter->addWidget(sidebar);
frame = new QFrame(splitter);
- frame->setObjectName(QString::fromUtf8("frame"));
+ frame->setObjectName(QStringLiteral("frame"));
frame->setFrameShape(QFrame::NoFrame);
frame->setFrameShadow(QFrame::Raised);
vboxLayout = new QVBoxLayout(frame);
vboxLayout->setSpacing(0);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(0, 0, 0, 0);
stackedWidget = new QStackedWidget(frame);
- stackedWidget->setObjectName(QString::fromUtf8("stackedWidget"));
+ stackedWidget->setObjectName(QStringLiteral("stackedWidget"));
page = new QWidget();
- page->setObjectName(QString::fromUtf8("page"));
+ page->setObjectName(QStringLiteral("page"));
vboxLayout1 = new QVBoxLayout(page);
vboxLayout1->setSpacing(0);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
vboxLayout1->setContentsMargins(0, 0, 0, 0);
listView = new QFileDialogListView(page);
- listView->setObjectName(QString::fromUtf8("listView"));
+ listView->setObjectName(QStringLiteral("listView"));
vboxLayout1->addWidget(listView);
stackedWidget->addWidget(page);
page_2 = new QWidget();
- page_2->setObjectName(QString::fromUtf8("page_2"));
+ page_2->setObjectName(QStringLiteral("page_2"));
vboxLayout2 = new QVBoxLayout(page_2);
vboxLayout2->setSpacing(0);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
vboxLayout2->setContentsMargins(0, 0, 0, 0);
treeView = new QFileDialogTreeView(page_2);
- treeView->setObjectName(QString::fromUtf8("treeView"));
+ treeView->setObjectName(QStringLiteral("treeView"));
vboxLayout2->addWidget(treeView);
@@ -217,7 +217,7 @@ public:
gridLayout->addWidget(splitter, 1, 0, 1, 3);
fileNameLabel = new QLabel(QFileDialog);
- fileNameLabel->setObjectName(QString::fromUtf8("fileNameLabel"));
+ fileNameLabel->setObjectName(QStringLiteral("fileNameLabel"));
QSizePolicy sizePolicy2(QSizePolicy::Minimum, QSizePolicy::Preferred);
sizePolicy2.setHorizontalStretch(0);
sizePolicy2.setVerticalStretch(0);
@@ -228,7 +228,7 @@ public:
gridLayout->addWidget(fileNameLabel, 2, 0, 1, 1);
fileNameEdit = new QFileDialogLineEdit(QFileDialog);
- fileNameEdit->setObjectName(QString::fromUtf8("fileNameEdit"));
+ fileNameEdit->setObjectName(QStringLiteral("fileNameEdit"));
QSizePolicy sizePolicy3(QSizePolicy::Expanding, QSizePolicy::Fixed);
sizePolicy3.setHorizontalStretch(1);
sizePolicy3.setVerticalStretch(0);
@@ -238,14 +238,14 @@ public:
gridLayout->addWidget(fileNameEdit, 2, 1, 1, 1);
buttonBox = new QDialogButtonBox(QFileDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Vertical);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
gridLayout->addWidget(buttonBox, 2, 2, 2, 1);
fileTypeLabel = new QLabel(QFileDialog);
- fileTypeLabel->setObjectName(QString::fromUtf8("fileTypeLabel"));
+ fileTypeLabel->setObjectName(QStringLiteral("fileTypeLabel"));
QSizePolicy sizePolicy4(QSizePolicy::Preferred, QSizePolicy::Fixed);
sizePolicy4.setHorizontalStretch(0);
sizePolicy4.setVerticalStretch(0);
@@ -255,7 +255,7 @@ public:
gridLayout->addWidget(fileTypeLabel, 3, 0, 1, 1);
fileTypeCombo = new QComboBox(QFileDialog);
- fileTypeCombo->setObjectName(QString::fromUtf8("fileTypeCombo"));
+ fileTypeCombo->setObjectName(QStringLiteral("fileTypeCombo"));
QSizePolicy sizePolicy5(QSizePolicy::Expanding, QSizePolicy::Fixed);
sizePolicy5.setHorizontalStretch(0);
sizePolicy5.setVerticalStretch(0);
diff --git a/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h b/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h
index 8e0cc0a82a..5a14eafc90 100644
--- a/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h
+++ b/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h
@@ -73,15 +73,15 @@ public:
void setupUi(QWidget *QPageSetupWidget)
{
if (QPageSetupWidget->objectName().isEmpty())
- QPageSetupWidget->setObjectName(QString::fromUtf8("QPageSetupWidget"));
+ QPageSetupWidget->setObjectName(QStringLiteral("QPageSetupWidget"));
QPageSetupWidget->resize(416, 488);
gridLayout_3 = new QGridLayout(QPageSetupWidget);
gridLayout_3->setContentsMargins(0, 0, 0, 0);
- gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3"));
+ gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
horizontalLayout_4 = new QHBoxLayout();
- horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
+ horizontalLayout_4->setObjectName(QStringLiteral("horizontalLayout_4"));
unit = new QComboBox(QPageSetupWidget);
- unit->setObjectName(QString::fromUtf8("unit"));
+ unit->setObjectName(QStringLiteral("unit"));
horizontalLayout_4->addWidget(unit);
@@ -93,39 +93,39 @@ public:
gridLayout_3->addLayout(horizontalLayout_4, 0, 0, 1, 2);
groupBox_2 = new QGroupBox(QPageSetupWidget);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
gridLayout_2 = new QGridLayout(groupBox_2);
- gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
+ gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
pageSizeLabel = new QLabel(groupBox_2);
- pageSizeLabel->setObjectName(QString::fromUtf8("pageSizeLabel"));
+ pageSizeLabel->setObjectName(QStringLiteral("pageSizeLabel"));
gridLayout_2->addWidget(pageSizeLabel, 0, 0, 1, 1);
paperSize = new QComboBox(groupBox_2);
- paperSize->setObjectName(QString::fromUtf8("paperSize"));
+ paperSize->setObjectName(QStringLiteral("paperSize"));
gridLayout_2->addWidget(paperSize, 0, 1, 1, 1);
widthLabel = new QLabel(groupBox_2);
- widthLabel->setObjectName(QString::fromUtf8("widthLabel"));
+ widthLabel->setObjectName(QStringLiteral("widthLabel"));
gridLayout_2->addWidget(widthLabel, 1, 0, 1, 1);
horizontalLayout_3 = new QHBoxLayout();
- horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
+ horizontalLayout_3->setObjectName(QStringLiteral("horizontalLayout_3"));
paperWidth = new QDoubleSpinBox(groupBox_2);
- paperWidth->setObjectName(QString::fromUtf8("paperWidth"));
+ paperWidth->setObjectName(QStringLiteral("paperWidth"));
paperWidth->setMaximum(9999.99);
horizontalLayout_3->addWidget(paperWidth);
heightLabel = new QLabel(groupBox_2);
- heightLabel->setObjectName(QString::fromUtf8("heightLabel"));
+ heightLabel->setObjectName(QStringLiteral("heightLabel"));
horizontalLayout_3->addWidget(heightLabel);
paperHeight = new QDoubleSpinBox(groupBox_2);
- paperHeight->setObjectName(QString::fromUtf8("paperHeight"));
+ paperHeight->setObjectName(QStringLiteral("paperHeight"));
paperHeight->setMaximum(9999.99);
horizontalLayout_3->addWidget(paperHeight);
@@ -134,12 +134,12 @@ public:
gridLayout_2->addLayout(horizontalLayout_3, 1, 1, 1, 1);
paperSourceLabel = new QLabel(groupBox_2);
- paperSourceLabel->setObjectName(QString::fromUtf8("paperSourceLabel"));
+ paperSourceLabel->setObjectName(QStringLiteral("paperSourceLabel"));
gridLayout_2->addWidget(paperSourceLabel, 2, 0, 1, 1);
paperSource = new QComboBox(groupBox_2);
- paperSource->setObjectName(QString::fromUtf8("paperSource"));
+ paperSource->setObjectName(QStringLiteral("paperSource"));
gridLayout_2->addWidget(paperSource, 2, 1, 1, 1);
@@ -151,27 +151,27 @@ public:
gridLayout_3->addWidget(groupBox_2, 1, 0, 1, 2);
groupBox_3 = new QGroupBox(QPageSetupWidget);
- groupBox_3->setObjectName(QString::fromUtf8("groupBox_3"));
+ groupBox_3->setObjectName(QStringLiteral("groupBox_3"));
verticalLayout = new QVBoxLayout(groupBox_3);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
portrait = new QRadioButton(groupBox_3);
- portrait->setObjectName(QString::fromUtf8("portrait"));
+ portrait->setObjectName(QStringLiteral("portrait"));
portrait->setChecked(true);
verticalLayout->addWidget(portrait);
landscape = new QRadioButton(groupBox_3);
- landscape->setObjectName(QString::fromUtf8("landscape"));
+ landscape->setObjectName(QStringLiteral("landscape"));
verticalLayout->addWidget(landscape);
reverseLandscape = new QRadioButton(groupBox_3);
- reverseLandscape->setObjectName(QString::fromUtf8("reverseLandscape"));
+ reverseLandscape->setObjectName(QStringLiteral("reverseLandscape"));
verticalLayout->addWidget(reverseLandscape);
reversePortrait = new QRadioButton(groupBox_3);
- reversePortrait->setObjectName(QString::fromUtf8("reversePortrait"));
+ reversePortrait->setObjectName(QStringLiteral("reversePortrait"));
verticalLayout->addWidget(reversePortrait);
@@ -183,31 +183,31 @@ public:
gridLayout_3->addWidget(groupBox_3, 2, 0, 1, 1);
preview = new QWidget(QPageSetupWidget);
- preview->setObjectName(QString::fromUtf8("preview"));
+ preview->setObjectName(QStringLiteral("preview"));
gridLayout_3->addWidget(preview, 2, 1, 2, 1);
groupBox = new QGroupBox(QPageSetupWidget);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
horizontalLayout_2 = new QHBoxLayout(groupBox);
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
gridLayout = new QGridLayout();
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
topMargin = new QDoubleSpinBox(groupBox);
- topMargin->setObjectName(QString::fromUtf8("topMargin"));
+ topMargin->setObjectName(QStringLiteral("topMargin"));
topMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
topMargin->setMaximum(999.99);
gridLayout->addWidget(topMargin, 0, 1, 1, 1);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
horizontalSpacer_7 = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
horizontalLayout->addItem(horizontalSpacer_7);
leftMargin = new QDoubleSpinBox(groupBox);
- leftMargin->setObjectName(QString::fromUtf8("leftMargin"));
+ leftMargin->setObjectName(QStringLiteral("leftMargin"));
leftMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
leftMargin->setMaximum(999.99);
@@ -218,7 +218,7 @@ public:
horizontalLayout->addItem(horizontalSpacer);
rightMargin = new QDoubleSpinBox(groupBox);
- rightMargin->setObjectName(QString::fromUtf8("rightMargin"));
+ rightMargin->setObjectName(QStringLiteral("rightMargin"));
rightMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
rightMargin->setMaximum(999.99);
@@ -232,7 +232,7 @@ public:
gridLayout->addLayout(horizontalLayout, 1, 0, 1, 3);
bottomMargin = new QDoubleSpinBox(groupBox);
- bottomMargin->setObjectName(QString::fromUtf8("bottomMargin"));
+ bottomMargin->setObjectName(QStringLiteral("bottomMargin"));
bottomMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
bottomMargin->setMaximum(999.99);
diff --git a/tests/auto/tools/uic/baseline/qprintpropertieswidget.ui.h b/tests/auto/tools/uic/baseline/qprintpropertieswidget.ui.h
index dd9b68f1c4..5cf337e75e 100644
--- a/tests/auto/tools/uic/baseline/qprintpropertieswidget.ui.h
+++ b/tests/auto/tools/uic/baseline/qprintpropertieswidget.ui.h
@@ -39,30 +39,30 @@ public:
void setupUi(QWidget *QPrintPropertiesWidget)
{
if (QPrintPropertiesWidget->objectName().isEmpty())
- QPrintPropertiesWidget->setObjectName(QString::fromUtf8("QPrintPropertiesWidget"));
+ QPrintPropertiesWidget->setObjectName(QStringLiteral("QPrintPropertiesWidget"));
QPrintPropertiesWidget->resize(396, 288);
verticalLayout_4 = new QVBoxLayout(QPrintPropertiesWidget);
verticalLayout_4->setContentsMargins(0, 0, 0, 0);
- verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4"));
+ verticalLayout_4->setObjectName(QStringLiteral("verticalLayout_4"));
tabs = new QTabWidget(QPrintPropertiesWidget);
- tabs->setObjectName(QString::fromUtf8("tabs"));
+ tabs->setObjectName(QStringLiteral("tabs"));
tabPage = new QWidget();
- tabPage->setObjectName(QString::fromUtf8("tabPage"));
+ tabPage->setObjectName(QStringLiteral("tabPage"));
tabPage->setGeometry(QRect(0, 0, 392, 261));
horizontalLayout = new QHBoxLayout(tabPage);
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
pageSetup = new QPageSetupWidget(tabPage);
- pageSetup->setObjectName(QString::fromUtf8("pageSetup"));
+ pageSetup->setObjectName(QStringLiteral("pageSetup"));
horizontalLayout->addWidget(pageSetup);
tabs->addTab(tabPage, QString());
cupsPropertiesPage = new QWidget();
- cupsPropertiesPage->setObjectName(QString::fromUtf8("cupsPropertiesPage"));
+ cupsPropertiesPage->setObjectName(QStringLiteral("cupsPropertiesPage"));
horizontalLayout_2 = new QHBoxLayout(cupsPropertiesPage);
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
treeView = new QTreeView(cupsPropertiesPage);
- treeView->setObjectName(QString::fromUtf8("treeView"));
+ treeView->setObjectName(QStringLiteral("treeView"));
treeView->setAlternatingRowColors(true);
horizontalLayout_2->addWidget(treeView);
diff --git a/tests/auto/tools/uic/baseline/qprintsettingsoutput.ui.h b/tests/auto/tools/uic/baseline/qprintsettingsoutput.ui.h
index 2051c8b04d..b10e44725b 100644
--- a/tests/auto/tools/uic/baseline/qprintsettingsoutput.ui.h
+++ b/tests/auto/tools/uic/baseline/qprintsettingsoutput.ui.h
@@ -74,20 +74,20 @@ public:
void setupUi(QWidget *QPrintSettingsOutput)
{
if (QPrintSettingsOutput->objectName().isEmpty())
- QPrintSettingsOutput->setObjectName(QString::fromUtf8("QPrintSettingsOutput"));
+ QPrintSettingsOutput->setObjectName(QStringLiteral("QPrintSettingsOutput"));
QPrintSettingsOutput->resize(416, 166);
horizontalLayout_2 = new QHBoxLayout(QPrintSettingsOutput);
horizontalLayout_2->setContentsMargins(0, 0, 0, 0);
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
tabs = new QTabWidget(QPrintSettingsOutput);
- tabs->setObjectName(QString::fromUtf8("tabs"));
+ tabs->setObjectName(QStringLiteral("tabs"));
copiesTab = new QWidget();
- copiesTab->setObjectName(QString::fromUtf8("copiesTab"));
+ copiesTab->setObjectName(QStringLiteral("copiesTab"));
copiesTab->setGeometry(QRect(0, 0, 412, 139));
horizontalLayout = new QHBoxLayout(copiesTab);
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
gbPrintRange = new QGroupBox(copiesTab);
- gbPrintRange->setObjectName(QString::fromUtf8("gbPrintRange"));
+ gbPrintRange->setObjectName(QStringLiteral("gbPrintRange"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -96,9 +96,9 @@ public:
_3 = new QVBoxLayout(gbPrintRange);
_3->setSpacing(4);
_3->setContentsMargins(6, 6, 6, 6);
- _3->setObjectName(QString::fromUtf8("_3"));
+ _3->setObjectName(QStringLiteral("_3"));
printAll = new QRadioButton(gbPrintRange);
- printAll->setObjectName(QString::fromUtf8("printAll"));
+ printAll->setObjectName(QStringLiteral("printAll"));
printAll->setChecked(true);
_3->addWidget(printAll);
@@ -108,14 +108,14 @@ public:
_4->setSpacing(6);
#endif
_4->setContentsMargins(0, 0, 0, 0);
- _4->setObjectName(QString::fromUtf8("_4"));
+ _4->setObjectName(QStringLiteral("_4"));
printRange = new QRadioButton(gbPrintRange);
- printRange->setObjectName(QString::fromUtf8("printRange"));
+ printRange->setObjectName(QStringLiteral("printRange"));
_4->addWidget(printRange);
from = new QSpinBox(gbPrintRange);
- from->setObjectName(QString::fromUtf8("from"));
+ from->setObjectName(QStringLiteral("from"));
from->setEnabled(false);
from->setMinimum(1);
from->setMaximum(999);
@@ -123,12 +123,12 @@ public:
_4->addWidget(from);
label_3 = new QLabel(gbPrintRange);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
_4->addWidget(label_3);
to = new QSpinBox(gbPrintRange);
- to->setObjectName(QString::fromUtf8("to"));
+ to->setObjectName(QStringLiteral("to"));
to->setEnabled(false);
to->setMinimum(1);
to->setMaximum(999);
@@ -143,7 +143,7 @@ public:
_3->addLayout(_4);
printSelection = new QRadioButton(gbPrintRange);
- printSelection->setObjectName(QString::fromUtf8("printSelection"));
+ printSelection->setObjectName(QStringLiteral("printSelection"));
_3->addWidget(printSelection);
@@ -155,16 +155,16 @@ public:
horizontalLayout->addWidget(gbPrintRange);
groupBox = new QGroupBox(copiesTab);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout = new QGridLayout(groupBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
copies = new QSpinBox(groupBox);
- copies->setObjectName(QString::fromUtf8("copies"));
+ copies->setObjectName(QStringLiteral("copies"));
copies->setMinimum(1);
copies->setMaximum(999);
@@ -175,12 +175,12 @@ public:
gridLayout->addItem(horizontalSpacer, 0, 3, 1, 1);
collate = new QCheckBox(groupBox);
- collate->setObjectName(QString::fromUtf8("collate"));
+ collate->setObjectName(QStringLiteral("collate"));
gridLayout->addWidget(collate, 1, 0, 1, 2);
outputIcon = new QLabel(groupBox);
- outputIcon->setObjectName(QString::fromUtf8("outputIcon"));
+ outputIcon->setObjectName(QStringLiteral("outputIcon"));
QSizePolicy sizePolicy1(QSizePolicy::Ignored, QSizePolicy::Ignored);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -190,7 +190,7 @@ public:
gridLayout->addWidget(outputIcon, 1, 2, 2, 2);
reverse = new QCheckBox(groupBox);
- reverse->setObjectName(QString::fromUtf8("reverse"));
+ reverse->setObjectName(QStringLiteral("reverse"));
gridLayout->addWidget(reverse, 2, 0, 1, 2);
@@ -203,30 +203,30 @@ public:
tabs->addTab(copiesTab, QString());
optionsTab = new QWidget();
- optionsTab->setObjectName(QString::fromUtf8("optionsTab"));
+ optionsTab->setObjectName(QStringLiteral("optionsTab"));
optionsTab->setGeometry(QRect(0, 0, 412, 139));
gridLayout_2 = new QGridLayout(optionsTab);
- gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
+ gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
colorMode = new QGroupBox(optionsTab);
- colorMode->setObjectName(QString::fromUtf8("colorMode"));
+ colorMode->setObjectName(QStringLiteral("colorMode"));
gridLayout_4 = new QGridLayout(colorMode);
- gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));
+ gridLayout_4->setObjectName(QStringLiteral("gridLayout_4"));
verticalSpacer_6 = new QSpacerItem(1, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
gridLayout_4->addItem(verticalSpacer_6, 2, 0, 1, 1);
color = new QRadioButton(colorMode);
- color->setObjectName(QString::fromUtf8("color"));
+ color->setObjectName(QStringLiteral("color"));
gridLayout_4->addWidget(color, 0, 0, 1, 1);
colorIcon = new QLabel(colorMode);
- colorIcon->setObjectName(QString::fromUtf8("colorIcon"));
+ colorIcon->setObjectName(QStringLiteral("colorIcon"));
gridLayout_4->addWidget(colorIcon, 0, 1, 3, 1);
grayscale = new QRadioButton(colorMode);
- grayscale->setObjectName(QString::fromUtf8("grayscale"));
+ grayscale->setObjectName(QStringLiteral("grayscale"));
gridLayout_4->addWidget(grayscale, 1, 0, 1, 1);
@@ -234,22 +234,22 @@ public:
gridLayout_2->addWidget(colorMode, 0, 1, 1, 1);
duplex = new QGroupBox(optionsTab);
- duplex->setObjectName(QString::fromUtf8("duplex"));
+ duplex->setObjectName(QStringLiteral("duplex"));
verticalLayout = new QVBoxLayout(duplex);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
noDuplex = new QRadioButton(duplex);
- noDuplex->setObjectName(QString::fromUtf8("noDuplex"));
+ noDuplex->setObjectName(QStringLiteral("noDuplex"));
noDuplex->setChecked(true);
verticalLayout->addWidget(noDuplex);
duplexLong = new QRadioButton(duplex);
- duplexLong->setObjectName(QString::fromUtf8("duplexLong"));
+ duplexLong->setObjectName(QStringLiteral("duplexLong"));
verticalLayout->addWidget(duplexLong);
duplexShort = new QRadioButton(duplex);
- duplexShort->setObjectName(QString::fromUtf8("duplexShort"));
+ duplexShort->setObjectName(QStringLiteral("duplexShort"));
verticalLayout->addWidget(duplexShort);
diff --git a/tests/auto/tools/uic/baseline/qprintwidget.ui.h b/tests/auto/tools/uic/baseline/qprintwidget.ui.h
index 6389b61fc2..206556cb1b 100644
--- a/tests/auto/tools/uic/baseline/qprintwidget.ui.h
+++ b/tests/auto/tools/uic/baseline/qprintwidget.ui.h
@@ -50,22 +50,22 @@ public:
void setupUi(QWidget *QPrintWidget)
{
if (QPrintWidget->objectName().isEmpty())
- QPrintWidget->setObjectName(QString::fromUtf8("QPrintWidget"));
+ QPrintWidget->setObjectName(QStringLiteral("QPrintWidget"));
QPrintWidget->resize(443, 175);
horizontalLayout_2 = new QHBoxLayout(QPrintWidget);
horizontalLayout_2->setContentsMargins(0, 0, 0, 0);
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
printerGroup = new QGroupBox(QPrintWidget);
- printerGroup->setObjectName(QString::fromUtf8("printerGroup"));
+ printerGroup->setObjectName(QStringLiteral("printerGroup"));
gridLayout = new QGridLayout(printerGroup);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(printerGroup);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
printers = new QComboBox(printerGroup);
- printers->setObjectName(QString::fromUtf8("printers"));
+ printers->setObjectName(QStringLiteral("printers"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(3);
sizePolicy.setVerticalStretch(0);
@@ -75,7 +75,7 @@ public:
gridLayout->addWidget(printers, 0, 1, 1, 1);
properties = new QPushButton(printerGroup);
- properties->setObjectName(QString::fromUtf8("properties"));
+ properties->setObjectName(QStringLiteral("properties"));
QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(1);
sizePolicy1.setVerticalStretch(0);
@@ -85,44 +85,44 @@ public:
gridLayout->addWidget(properties, 0, 2, 1, 1);
label_2 = new QLabel(printerGroup);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 1, 0, 1, 1);
location = new QLabel(printerGroup);
- location->setObjectName(QString::fromUtf8("location"));
+ location->setObjectName(QStringLiteral("location"));
gridLayout->addWidget(location, 1, 1, 1, 1);
preview = new QCheckBox(printerGroup);
- preview->setObjectName(QString::fromUtf8("preview"));
+ preview->setObjectName(QStringLiteral("preview"));
gridLayout->addWidget(preview, 1, 2, 1, 1);
label_3 = new QLabel(printerGroup);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout->addWidget(label_3, 2, 0, 1, 1);
type = new QLabel(printerGroup);
- type->setObjectName(QString::fromUtf8("type"));
+ type->setObjectName(QStringLiteral("type"));
gridLayout->addWidget(type, 2, 1, 1, 1);
lOutput = new QLabel(printerGroup);
- lOutput->setObjectName(QString::fromUtf8("lOutput"));
+ lOutput->setObjectName(QStringLiteral("lOutput"));
gridLayout->addWidget(lOutput, 3, 0, 1, 1);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
filename = new QLineEdit(printerGroup);
- filename->setObjectName(QString::fromUtf8("filename"));
+ filename->setObjectName(QStringLiteral("filename"));
horizontalLayout->addWidget(filename);
fileBrowser = new QToolButton(printerGroup);
- fileBrowser->setObjectName(QString::fromUtf8("fileBrowser"));
+ fileBrowser->setObjectName(QStringLiteral("fileBrowser"));
horizontalLayout->addWidget(fileBrowser);
diff --git a/tests/auto/tools/uic/baseline/qsqlconnectiondialog.ui.h b/tests/auto/tools/uic/baseline/qsqlconnectiondialog.ui.h
index f784785ce0..ea957f16c8 100644
--- a/tests/auto/tools/uic/baseline/qsqlconnectiondialog.ui.h
+++ b/tests/auto/tools/uic/baseline/qsqlconnectiondialog.ui.h
@@ -59,44 +59,44 @@ public:
void setupUi(QDialog *QSqlConnectionDialogUi)
{
if (QSqlConnectionDialogUi->objectName().isEmpty())
- QSqlConnectionDialogUi->setObjectName(QString::fromUtf8("QSqlConnectionDialogUi"));
+ QSqlConnectionDialogUi->setObjectName(QStringLiteral("QSqlConnectionDialogUi"));
QSqlConnectionDialogUi->resize(315, 302);
vboxLayout = new QVBoxLayout(QSqlConnectionDialogUi);
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(8, 8, 8, 8);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
connGroupBox = new QGroupBox(QSqlConnectionDialogUi);
- connGroupBox->setObjectName(QString::fromUtf8("connGroupBox"));
+ connGroupBox->setObjectName(QStringLiteral("connGroupBox"));
gridLayout = new QGridLayout(connGroupBox);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(8, 8, 8, 8);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
comboDriver = new QComboBox(connGroupBox);
- comboDriver->setObjectName(QString::fromUtf8("comboDriver"));
+ comboDriver->setObjectName(QStringLiteral("comboDriver"));
gridLayout->addWidget(comboDriver, 0, 1, 1, 1);
textLabel4 = new QLabel(connGroupBox);
- textLabel4->setObjectName(QString::fromUtf8("textLabel4"));
+ textLabel4->setObjectName(QStringLiteral("textLabel4"));
gridLayout->addWidget(textLabel4, 2, 0, 1, 1);
textLabel2 = new QLabel(connGroupBox);
- textLabel2->setObjectName(QString::fromUtf8("textLabel2"));
+ textLabel2->setObjectName(QStringLiteral("textLabel2"));
gridLayout->addWidget(textLabel2, 0, 0, 1, 1);
editDatabase = new QLineEdit(connGroupBox);
- editDatabase->setObjectName(QString::fromUtf8("editDatabase"));
+ editDatabase->setObjectName(QStringLiteral("editDatabase"));
gridLayout->addWidget(editDatabase, 1, 1, 1, 1);
portSpinBox = new QSpinBox(connGroupBox);
- portSpinBox->setObjectName(QString::fromUtf8("portSpinBox"));
+ portSpinBox->setObjectName(QStringLiteral("portSpinBox"));
portSpinBox->setMaximum(65535);
portSpinBox->setMinimum(-1);
portSpinBox->setValue(-1);
@@ -104,38 +104,38 @@ public:
gridLayout->addWidget(portSpinBox, 5, 1, 1, 1);
textLabel3 = new QLabel(connGroupBox);
- textLabel3->setObjectName(QString::fromUtf8("textLabel3"));
+ textLabel3->setObjectName(QStringLiteral("textLabel3"));
gridLayout->addWidget(textLabel3, 1, 0, 1, 1);
editPassword = new QLineEdit(connGroupBox);
- editPassword->setObjectName(QString::fromUtf8("editPassword"));
+ editPassword->setObjectName(QStringLiteral("editPassword"));
editPassword->setEchoMode(QLineEdit::Password);
gridLayout->addWidget(editPassword, 3, 1, 1, 1);
editUsername = new QLineEdit(connGroupBox);
- editUsername->setObjectName(QString::fromUtf8("editUsername"));
+ editUsername->setObjectName(QStringLiteral("editUsername"));
gridLayout->addWidget(editUsername, 2, 1, 1, 1);
editHostname = new QLineEdit(connGroupBox);
- editHostname->setObjectName(QString::fromUtf8("editHostname"));
+ editHostname->setObjectName(QStringLiteral("editHostname"));
gridLayout->addWidget(editHostname, 4, 1, 1, 1);
textLabel5 = new QLabel(connGroupBox);
- textLabel5->setObjectName(QString::fromUtf8("textLabel5"));
+ textLabel5->setObjectName(QStringLiteral("textLabel5"));
gridLayout->addWidget(textLabel5, 4, 0, 1, 1);
textLabel5_2 = new QLabel(connGroupBox);
- textLabel5_2->setObjectName(QString::fromUtf8("textLabel5_2"));
+ textLabel5_2->setObjectName(QStringLiteral("textLabel5_2"));
gridLayout->addWidget(textLabel5_2, 5, 0, 1, 1);
textLabel4_2 = new QLabel(connGroupBox);
- textLabel4_2->setObjectName(QString::fromUtf8("textLabel4_2"));
+ textLabel4_2->setObjectName(QStringLiteral("textLabel4_2"));
gridLayout->addWidget(textLabel4_2, 3, 0, 1, 1);
@@ -147,13 +147,13 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem);
dbCheckBox = new QCheckBox(QSqlConnectionDialogUi);
- dbCheckBox->setObjectName(QString::fromUtf8("dbCheckBox"));
+ dbCheckBox->setObjectName(QStringLiteral("dbCheckBox"));
hboxLayout->addWidget(dbCheckBox);
@@ -165,19 +165,19 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
spacerItem1 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout1->addItem(spacerItem1);
okButton = new QPushButton(QSqlConnectionDialogUi);
- okButton->setObjectName(QString::fromUtf8("okButton"));
+ okButton->setObjectName(QStringLiteral("okButton"));
okButton->setDefault(true);
hboxLayout1->addWidget(okButton);
cancelButton = new QPushButton(QSqlConnectionDialogUi);
- cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+ cancelButton->setObjectName(QStringLiteral("cancelButton"));
hboxLayout1->addWidget(cancelButton);
diff --git a/tests/auto/tools/uic/baseline/qtgradientdialog.ui.h b/tests/auto/tools/uic/baseline/qtgradientdialog.ui.h
index d9c27a769e..45660d9224 100644
--- a/tests/auto/tools/uic/baseline/qtgradientdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/qtgradientdialog.ui.h
@@ -75,12 +75,12 @@ public:
void setupUi(QDialog *QtGradientDialog)
{
if (QtGradientDialog->objectName().isEmpty())
- QtGradientDialog->setObjectName(QString::fromUtf8("QtGradientDialog"));
+ QtGradientDialog->setObjectName(QStringLiteral("QtGradientDialog"));
QtGradientDialog->resize(178, 81);
vboxLayout = new QVBoxLayout(QtGradientDialog);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
gradientEditor = new QtGradientEditor(QtGradientDialog);
- gradientEditor->setObjectName(QString::fromUtf8("gradientEditor"));
+ gradientEditor->setObjectName(QStringLiteral("gradientEditor"));
QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -90,7 +90,7 @@ public:
vboxLayout->addWidget(gradientEditor);
buttonBox = new QDialogButtonBox(QtGradientDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h b/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h
index c344d006b5..d94670d2ff 100644
--- a/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h
@@ -162,10 +162,10 @@ public:
void setupUi(QWidget *QtGradientEditor)
{
if (QtGradientEditor->objectName().isEmpty())
- QtGradientEditor->setObjectName(QString::fromUtf8("QtGradientEditor"));
+ QtGradientEditor->setObjectName(QStringLiteral("QtGradientEditor"));
QtGradientEditor->resize(364, 518);
frame = new QFrame(QtGradientEditor);
- frame->setObjectName(QString::fromUtf8("frame"));
+ frame->setObjectName(QStringLiteral("frame"));
frame->setGeometry(QRect(10, 69, 193, 150));
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy.setHorizontalStretch(0);
@@ -176,73 +176,73 @@ public:
frame->setFrameShadow(QFrame::Raised);
vboxLayout = new QVBoxLayout(frame);
vboxLayout->setSpacing(6);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(0, 0, 0, 0);
gradientWidget = new QtGradientWidget(frame);
- gradientWidget->setObjectName(QString::fromUtf8("gradientWidget"));
+ gradientWidget->setObjectName(QStringLiteral("gradientWidget"));
sizePolicy.setHeightForWidth(gradientWidget->sizePolicy().hasHeightForWidth());
gradientWidget->setSizePolicy(sizePolicy);
vboxLayout->addWidget(gradientWidget);
label1 = new QLabel(QtGradientEditor);
- label1->setObjectName(QString::fromUtf8("label1"));
+ label1->setObjectName(QStringLiteral("label1"));
label1->setGeometry(QRect(209, 69, 64, 23));
spinBox1 = new QDoubleSpinBox(QtGradientEditor);
- spinBox1->setObjectName(QString::fromUtf8("spinBox1"));
+ spinBox1->setObjectName(QStringLiteral("spinBox1"));
spinBox1->setGeometry(QRect(279, 69, 73, 23));
spinBox1->setKeyboardTracking(false);
spinBox1->setDecimals(3);
spinBox1->setMaximum(1);
spinBox1->setSingleStep(0.01);
label2 = new QLabel(QtGradientEditor);
- label2->setObjectName(QString::fromUtf8("label2"));
+ label2->setObjectName(QStringLiteral("label2"));
label2->setGeometry(QRect(209, 99, 64, 23));
spinBox2 = new QDoubleSpinBox(QtGradientEditor);
- spinBox2->setObjectName(QString::fromUtf8("spinBox2"));
+ spinBox2->setObjectName(QStringLiteral("spinBox2"));
spinBox2->setGeometry(QRect(279, 99, 73, 23));
spinBox2->setKeyboardTracking(false);
spinBox2->setDecimals(3);
spinBox2->setMaximum(1);
spinBox2->setSingleStep(0.01);
label3 = new QLabel(QtGradientEditor);
- label3->setObjectName(QString::fromUtf8("label3"));
+ label3->setObjectName(QStringLiteral("label3"));
label3->setGeometry(QRect(209, 129, 64, 23));
spinBox3 = new QDoubleSpinBox(QtGradientEditor);
- spinBox3->setObjectName(QString::fromUtf8("spinBox3"));
+ spinBox3->setObjectName(QStringLiteral("spinBox3"));
spinBox3->setGeometry(QRect(279, 129, 73, 23));
spinBox3->setKeyboardTracking(false);
spinBox3->setDecimals(3);
spinBox3->setMaximum(1);
spinBox3->setSingleStep(0.01);
label4 = new QLabel(QtGradientEditor);
- label4->setObjectName(QString::fromUtf8("label4"));
+ label4->setObjectName(QStringLiteral("label4"));
label4->setGeometry(QRect(209, 159, 64, 23));
spinBox4 = new QDoubleSpinBox(QtGradientEditor);
- spinBox4->setObjectName(QString::fromUtf8("spinBox4"));
+ spinBox4->setObjectName(QStringLiteral("spinBox4"));
spinBox4->setGeometry(QRect(279, 159, 73, 23));
spinBox4->setKeyboardTracking(false);
spinBox4->setDecimals(3);
spinBox4->setMaximum(1);
spinBox4->setSingleStep(0.01);
label5 = new QLabel(QtGradientEditor);
- label5->setObjectName(QString::fromUtf8("label5"));
+ label5->setObjectName(QStringLiteral("label5"));
label5->setGeometry(QRect(209, 189, 64, 23));
spinBox5 = new QDoubleSpinBox(QtGradientEditor);
- spinBox5->setObjectName(QString::fromUtf8("spinBox5"));
+ spinBox5->setObjectName(QStringLiteral("spinBox5"));
spinBox5->setGeometry(QRect(279, 189, 73, 23));
spinBox5->setKeyboardTracking(false);
spinBox5->setDecimals(3);
spinBox5->setMaximum(1);
spinBox5->setSingleStep(0.01);
gradientStopsWidget = new QtGradientStopsWidget(QtGradientEditor);
- gradientStopsWidget->setObjectName(QString::fromUtf8("gradientStopsWidget"));
+ gradientStopsWidget->setObjectName(QStringLiteral("gradientStopsWidget"));
gradientStopsWidget->setGeometry(QRect(10, 225, 193, 67));
zoomLabel = new QLabel(QtGradientEditor);
- zoomLabel->setObjectName(QString::fromUtf8("zoomLabel"));
+ zoomLabel->setObjectName(QStringLiteral("zoomLabel"));
zoomLabel->setGeometry(QRect(209, 231, 64, 23));
zoomAllButton = new QToolButton(QtGradientEditor);
- zoomAllButton->setObjectName(QString::fromUtf8("zoomAllButton"));
+ zoomAllButton->setObjectName(QStringLiteral("zoomAllButton"));
zoomAllButton->setGeometry(QRect(279, 260, 72, 26));
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(0);
@@ -250,15 +250,15 @@ public:
sizePolicy1.setHeightForWidth(zoomAllButton->sizePolicy().hasHeightForWidth());
zoomAllButton->setSizePolicy(sizePolicy1);
positionLabel = new QLabel(QtGradientEditor);
- positionLabel->setObjectName(QString::fromUtf8("positionLabel"));
+ positionLabel->setObjectName(QStringLiteral("positionLabel"));
positionLabel->setGeometry(QRect(209, 304, 64, 23));
hLabel = new QLabel(QtGradientEditor);
- hLabel->setObjectName(QString::fromUtf8("hLabel"));
+ hLabel->setObjectName(QStringLiteral("hLabel"));
hLabel->setGeometry(QRect(10, 335, 32, 18));
sizePolicy1.setHeightForWidth(hLabel->sizePolicy().hasHeightForWidth());
hLabel->setSizePolicy(sizePolicy1);
frame_2 = new QFrame(QtGradientEditor);
- frame_2->setObjectName(QString::fromUtf8("frame_2"));
+ frame_2->setObjectName(QStringLiteral("frame_2"));
frame_2->setGeometry(QRect(48, 333, 155, 23));
QSizePolicy sizePolicy2(QSizePolicy::Ignored, QSizePolicy::Preferred);
sizePolicy2.setHorizontalStretch(0);
@@ -268,10 +268,10 @@ public:
frame_2->setFrameShape(QFrame::StyledPanel);
frame_2->setFrameShadow(QFrame::Raised);
hboxLayout = new QHBoxLayout(frame_2);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
hboxLayout->setContentsMargins(0, 0, 0, 0);
hueColorLine = new QtColorLine(frame_2);
- hueColorLine->setObjectName(QString::fromUtf8("hueColorLine"));
+ hueColorLine->setObjectName(QStringLiteral("hueColorLine"));
QSizePolicy sizePolicy3(QSizePolicy::Expanding, QSizePolicy::Preferred);
sizePolicy3.setHorizontalStretch(0);
sizePolicy3.setVerticalStretch(0);
@@ -281,99 +281,99 @@ public:
hboxLayout->addWidget(hueColorLine);
hueLabel = new QLabel(QtGradientEditor);
- hueLabel->setObjectName(QString::fromUtf8("hueLabel"));
+ hueLabel->setObjectName(QStringLiteral("hueLabel"));
hueLabel->setGeometry(QRect(209, 335, 64, 18));
sizePolicy1.setHeightForWidth(hueLabel->sizePolicy().hasHeightForWidth());
hueLabel->setSizePolicy(sizePolicy1);
sLabel = new QLabel(QtGradientEditor);
- sLabel->setObjectName(QString::fromUtf8("sLabel"));
+ sLabel->setObjectName(QStringLiteral("sLabel"));
sLabel->setGeometry(QRect(10, 364, 32, 18));
sizePolicy1.setHeightForWidth(sLabel->sizePolicy().hasHeightForWidth());
sLabel->setSizePolicy(sizePolicy1);
frame_5 = new QFrame(QtGradientEditor);
- frame_5->setObjectName(QString::fromUtf8("frame_5"));
+ frame_5->setObjectName(QStringLiteral("frame_5"));
frame_5->setGeometry(QRect(48, 362, 155, 23));
sizePolicy2.setHeightForWidth(frame_5->sizePolicy().hasHeightForWidth());
frame_5->setSizePolicy(sizePolicy2);
frame_5->setFrameShape(QFrame::StyledPanel);
frame_5->setFrameShadow(QFrame::Raised);
hboxLayout1 = new QHBoxLayout(frame_5);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
hboxLayout1->setContentsMargins(0, 0, 0, 0);
saturationColorLine = new QtColorLine(frame_5);
- saturationColorLine->setObjectName(QString::fromUtf8("saturationColorLine"));
+ saturationColorLine->setObjectName(QStringLiteral("saturationColorLine"));
sizePolicy3.setHeightForWidth(saturationColorLine->sizePolicy().hasHeightForWidth());
saturationColorLine->setSizePolicy(sizePolicy3);
hboxLayout1->addWidget(saturationColorLine);
saturationLabel = new QLabel(QtGradientEditor);
- saturationLabel->setObjectName(QString::fromUtf8("saturationLabel"));
+ saturationLabel->setObjectName(QStringLiteral("saturationLabel"));
saturationLabel->setGeometry(QRect(209, 364, 64, 18));
sizePolicy1.setHeightForWidth(saturationLabel->sizePolicy().hasHeightForWidth());
saturationLabel->setSizePolicy(sizePolicy1);
vLabel = new QLabel(QtGradientEditor);
- vLabel->setObjectName(QString::fromUtf8("vLabel"));
+ vLabel->setObjectName(QStringLiteral("vLabel"));
vLabel->setGeometry(QRect(10, 393, 32, 18));
sizePolicy1.setHeightForWidth(vLabel->sizePolicy().hasHeightForWidth());
vLabel->setSizePolicy(sizePolicy1);
frame_3 = new QFrame(QtGradientEditor);
- frame_3->setObjectName(QString::fromUtf8("frame_3"));
+ frame_3->setObjectName(QStringLiteral("frame_3"));
frame_3->setGeometry(QRect(48, 391, 155, 23));
sizePolicy2.setHeightForWidth(frame_3->sizePolicy().hasHeightForWidth());
frame_3->setSizePolicy(sizePolicy2);
frame_3->setFrameShape(QFrame::StyledPanel);
frame_3->setFrameShadow(QFrame::Raised);
hboxLayout2 = new QHBoxLayout(frame_3);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
hboxLayout2->setContentsMargins(0, 0, 0, 0);
valueColorLine = new QtColorLine(frame_3);
- valueColorLine->setObjectName(QString::fromUtf8("valueColorLine"));
+ valueColorLine->setObjectName(QStringLiteral("valueColorLine"));
sizePolicy3.setHeightForWidth(valueColorLine->sizePolicy().hasHeightForWidth());
valueColorLine->setSizePolicy(sizePolicy3);
hboxLayout2->addWidget(valueColorLine);
valueLabel = new QLabel(QtGradientEditor);
- valueLabel->setObjectName(QString::fromUtf8("valueLabel"));
+ valueLabel->setObjectName(QStringLiteral("valueLabel"));
valueLabel->setGeometry(QRect(209, 393, 64, 18));
sizePolicy1.setHeightForWidth(valueLabel->sizePolicy().hasHeightForWidth());
valueLabel->setSizePolicy(sizePolicy1);
aLabel = new QLabel(QtGradientEditor);
- aLabel->setObjectName(QString::fromUtf8("aLabel"));
+ aLabel->setObjectName(QStringLiteral("aLabel"));
aLabel->setGeometry(QRect(10, 422, 32, 18));
sizePolicy1.setHeightForWidth(aLabel->sizePolicy().hasHeightForWidth());
aLabel->setSizePolicy(sizePolicy1);
frame_4 = new QFrame(QtGradientEditor);
- frame_4->setObjectName(QString::fromUtf8("frame_4"));
+ frame_4->setObjectName(QStringLiteral("frame_4"));
frame_4->setGeometry(QRect(48, 420, 155, 23));
sizePolicy2.setHeightForWidth(frame_4->sizePolicy().hasHeightForWidth());
frame_4->setSizePolicy(sizePolicy2);
frame_4->setFrameShape(QFrame::StyledPanel);
frame_4->setFrameShadow(QFrame::Raised);
hboxLayout3 = new QHBoxLayout(frame_4);
- hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3"));
+ hboxLayout3->setObjectName(QStringLiteral("hboxLayout3"));
hboxLayout3->setContentsMargins(0, 0, 0, 0);
alphaColorLine = new QtColorLine(frame_4);
- alphaColorLine->setObjectName(QString::fromUtf8("alphaColorLine"));
+ alphaColorLine->setObjectName(QStringLiteral("alphaColorLine"));
sizePolicy3.setHeightForWidth(alphaColorLine->sizePolicy().hasHeightForWidth());
alphaColorLine->setSizePolicy(sizePolicy3);
hboxLayout3->addWidget(alphaColorLine);
alphaLabel = new QLabel(QtGradientEditor);
- alphaLabel->setObjectName(QString::fromUtf8("alphaLabel"));
+ alphaLabel->setObjectName(QStringLiteral("alphaLabel"));
alphaLabel->setGeometry(QRect(209, 422, 64, 18));
sizePolicy1.setHeightForWidth(alphaLabel->sizePolicy().hasHeightForWidth());
alphaLabel->setSizePolicy(sizePolicy1);
typeComboBox = new QComboBox(QtGradientEditor);
- typeComboBox->setObjectName(QString::fromUtf8("typeComboBox"));
+ typeComboBox->setObjectName(QStringLiteral("typeComboBox"));
typeComboBox->setGeometry(QRect(10, 40, 79, 22));
spreadComboBox = new QComboBox(QtGradientEditor);
- spreadComboBox->setObjectName(QString::fromUtf8("spreadComboBox"));
+ spreadComboBox->setObjectName(QStringLiteral("spreadComboBox"));
spreadComboBox->setGeometry(QRect(96, 40, 72, 22));
colorLabel = new QLabel(QtGradientEditor);
- colorLabel->setObjectName(QString::fromUtf8("colorLabel"));
+ colorLabel->setObjectName(QStringLiteral("colorLabel"));
colorLabel->setGeometry(QRect(10, 298, 32, 29));
QSizePolicy sizePolicy4(QSizePolicy::Fixed, QSizePolicy::Preferred);
sizePolicy4.setHorizontalStretch(0);
@@ -381,10 +381,10 @@ public:
sizePolicy4.setHeightForWidth(colorLabel->sizePolicy().hasHeightForWidth());
colorLabel->setSizePolicy(sizePolicy4);
colorButton = new QtColorButton(QtGradientEditor);
- colorButton->setObjectName(QString::fromUtf8("colorButton"));
+ colorButton->setObjectName(QStringLiteral("colorButton"));
colorButton->setGeometry(QRect(48, 300, 26, 25));
hsvRadioButton = new QRadioButton(QtGradientEditor);
- hsvRadioButton->setObjectName(QString::fromUtf8("hsvRadioButton"));
+ hsvRadioButton->setObjectName(QStringLiteral("hsvRadioButton"));
hsvRadioButton->setGeometry(QRect(80, 301, 49, 23));
QSizePolicy sizePolicy5(QSizePolicy::Fixed, QSizePolicy::Fixed);
sizePolicy5.setHorizontalStretch(0);
@@ -393,18 +393,18 @@ public:
hsvRadioButton->setSizePolicy(sizePolicy5);
hsvRadioButton->setChecked(true);
rgbRadioButton = new QRadioButton(QtGradientEditor);
- rgbRadioButton->setObjectName(QString::fromUtf8("rgbRadioButton"));
+ rgbRadioButton->setObjectName(QStringLiteral("rgbRadioButton"));
rgbRadioButton->setGeometry(QRect(135, 301, 49, 23));
sizePolicy5.setHeightForWidth(rgbRadioButton->sizePolicy().hasHeightForWidth());
rgbRadioButton->setSizePolicy(sizePolicy5);
positionWidget = new QWidget(QtGradientEditor);
- positionWidget->setObjectName(QString::fromUtf8("positionWidget"));
+ positionWidget->setObjectName(QStringLiteral("positionWidget"));
positionWidget->setGeometry(QRect(279, 304, 73, 23));
vboxLayout1 = new QVBoxLayout(positionWidget);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
vboxLayout1->setContentsMargins(0, 0, 0, 0);
positionSpinBox = new QDoubleSpinBox(positionWidget);
- positionSpinBox->setObjectName(QString::fromUtf8("positionSpinBox"));
+ positionSpinBox->setObjectName(QStringLiteral("positionSpinBox"));
positionSpinBox->setKeyboardTracking(false);
positionSpinBox->setDecimals(3);
positionSpinBox->setMinimum(0);
@@ -415,65 +415,65 @@ public:
vboxLayout1->addWidget(positionSpinBox);
hueWidget = new QWidget(QtGradientEditor);
- hueWidget->setObjectName(QString::fromUtf8("hueWidget"));
+ hueWidget->setObjectName(QStringLiteral("hueWidget"));
hueWidget->setGeometry(QRect(279, 333, 73, 23));
vboxLayout2 = new QVBoxLayout(hueWidget);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
vboxLayout2->setContentsMargins(0, 0, 0, 0);
hueSpinBox = new QSpinBox(hueWidget);
- hueSpinBox->setObjectName(QString::fromUtf8("hueSpinBox"));
+ hueSpinBox->setObjectName(QStringLiteral("hueSpinBox"));
hueSpinBox->setKeyboardTracking(false);
hueSpinBox->setMaximum(359);
vboxLayout2->addWidget(hueSpinBox);
saturationWidget = new QWidget(QtGradientEditor);
- saturationWidget->setObjectName(QString::fromUtf8("saturationWidget"));
+ saturationWidget->setObjectName(QStringLiteral("saturationWidget"));
saturationWidget->setGeometry(QRect(279, 362, 73, 23));
vboxLayout3 = new QVBoxLayout(saturationWidget);
- vboxLayout3->setObjectName(QString::fromUtf8("vboxLayout3"));
+ vboxLayout3->setObjectName(QStringLiteral("vboxLayout3"));
vboxLayout3->setContentsMargins(0, 0, 0, 0);
saturationSpinBox = new QSpinBox(saturationWidget);
- saturationSpinBox->setObjectName(QString::fromUtf8("saturationSpinBox"));
+ saturationSpinBox->setObjectName(QStringLiteral("saturationSpinBox"));
saturationSpinBox->setKeyboardTracking(false);
saturationSpinBox->setMaximum(255);
vboxLayout3->addWidget(saturationSpinBox);
valueWidget = new QWidget(QtGradientEditor);
- valueWidget->setObjectName(QString::fromUtf8("valueWidget"));
+ valueWidget->setObjectName(QStringLiteral("valueWidget"));
valueWidget->setGeometry(QRect(279, 391, 73, 23));
vboxLayout4 = new QVBoxLayout(valueWidget);
- vboxLayout4->setObjectName(QString::fromUtf8("vboxLayout4"));
+ vboxLayout4->setObjectName(QStringLiteral("vboxLayout4"));
vboxLayout4->setContentsMargins(0, 0, 0, 0);
valueSpinBox = new QSpinBox(valueWidget);
- valueSpinBox->setObjectName(QString::fromUtf8("valueSpinBox"));
+ valueSpinBox->setObjectName(QStringLiteral("valueSpinBox"));
valueSpinBox->setKeyboardTracking(false);
valueSpinBox->setMaximum(255);
vboxLayout4->addWidget(valueSpinBox);
alphaWidget = new QWidget(QtGradientEditor);
- alphaWidget->setObjectName(QString::fromUtf8("alphaWidget"));
+ alphaWidget->setObjectName(QStringLiteral("alphaWidget"));
alphaWidget->setGeometry(QRect(279, 420, 73, 23));
vboxLayout5 = new QVBoxLayout(alphaWidget);
- vboxLayout5->setObjectName(QString::fromUtf8("vboxLayout5"));
+ vboxLayout5->setObjectName(QStringLiteral("vboxLayout5"));
vboxLayout5->setContentsMargins(0, 0, 0, 0);
alphaSpinBox = new QSpinBox(alphaWidget);
- alphaSpinBox->setObjectName(QString::fromUtf8("alphaSpinBox"));
+ alphaSpinBox->setObjectName(QStringLiteral("alphaSpinBox"));
alphaSpinBox->setKeyboardTracking(false);
alphaSpinBox->setMaximum(255);
vboxLayout5->addWidget(alphaSpinBox);
zoomWidget = new QWidget(QtGradientEditor);
- zoomWidget->setObjectName(QString::fromUtf8("zoomWidget"));
+ zoomWidget->setObjectName(QStringLiteral("zoomWidget"));
zoomWidget->setGeometry(QRect(279, 231, 73, 23));
vboxLayout6 = new QVBoxLayout(zoomWidget);
- vboxLayout6->setObjectName(QString::fromUtf8("vboxLayout6"));
+ vboxLayout6->setObjectName(QStringLiteral("vboxLayout6"));
vboxLayout6->setContentsMargins(0, 0, 0, 0);
zoomSpinBox = new QSpinBox(zoomWidget);
- zoomSpinBox->setObjectName(QString::fromUtf8("zoomSpinBox"));
+ zoomSpinBox->setObjectName(QStringLiteral("zoomSpinBox"));
zoomSpinBox->setKeyboardTracking(false);
zoomSpinBox->setMinimum(100);
zoomSpinBox->setMaximum(10000);
@@ -483,33 +483,33 @@ public:
vboxLayout6->addWidget(zoomSpinBox);
line1Widget = new QWidget(QtGradientEditor);
- line1Widget->setObjectName(QString::fromUtf8("line1Widget"));
+ line1Widget->setObjectName(QStringLiteral("line1Widget"));
line1Widget->setGeometry(QRect(209, 219, 143, 16));
vboxLayout7 = new QVBoxLayout(line1Widget);
- vboxLayout7->setObjectName(QString::fromUtf8("vboxLayout7"));
+ vboxLayout7->setObjectName(QStringLiteral("vboxLayout7"));
vboxLayout7->setContentsMargins(0, 0, 0, 0);
line1 = new QFrame(line1Widget);
- line1->setObjectName(QString::fromUtf8("line1"));
+ line1->setObjectName(QStringLiteral("line1"));
line1->setFrameShape(QFrame::HLine);
line1->setFrameShadow(QFrame::Sunken);
vboxLayout7->addWidget(line1);
line2Widget = new QWidget(QtGradientEditor);
- line2Widget->setObjectName(QString::fromUtf8("line2Widget"));
+ line2Widget->setObjectName(QStringLiteral("line2Widget"));
line2Widget->setGeometry(QRect(209, 292, 143, 16));
vboxLayout8 = new QVBoxLayout(line2Widget);
- vboxLayout8->setObjectName(QString::fromUtf8("vboxLayout8"));
+ vboxLayout8->setObjectName(QStringLiteral("vboxLayout8"));
vboxLayout8->setContentsMargins(0, 0, 0, 0);
line2 = new QFrame(line2Widget);
- line2->setObjectName(QString::fromUtf8("line2"));
+ line2->setObjectName(QStringLiteral("line2"));
line2->setFrameShape(QFrame::HLine);
line2->setFrameShadow(QFrame::Sunken);
vboxLayout8->addWidget(line2);
zoomButtonsWidget = new QWidget(QtGradientEditor);
- zoomButtonsWidget->setObjectName(QString::fromUtf8("zoomButtonsWidget"));
+ zoomButtonsWidget->setObjectName(QStringLiteral("zoomButtonsWidget"));
zoomButtonsWidget->setGeometry(QRect(209, 260, 64, 26));
QSizePolicy sizePolicy6(QSizePolicy::Maximum, QSizePolicy::Preferred);
sizePolicy6.setHorizontalStretch(0);
@@ -517,15 +517,15 @@ public:
sizePolicy6.setHeightForWidth(zoomButtonsWidget->sizePolicy().hasHeightForWidth());
zoomButtonsWidget->setSizePolicy(sizePolicy6);
hboxLayout4 = new QHBoxLayout(zoomButtonsWidget);
- hboxLayout4->setObjectName(QString::fromUtf8("hboxLayout4"));
+ hboxLayout4->setObjectName(QStringLiteral("hboxLayout4"));
hboxLayout4->setContentsMargins(0, 0, 0, 0);
zoomInButton = new QToolButton(zoomButtonsWidget);
- zoomInButton->setObjectName(QString::fromUtf8("zoomInButton"));
+ zoomInButton->setObjectName(QStringLiteral("zoomInButton"));
hboxLayout4->addWidget(zoomInButton);
zoomOutButton = new QToolButton(zoomButtonsWidget);
- zoomOutButton->setObjectName(QString::fromUtf8("zoomOutButton"));
+ zoomOutButton->setObjectName(QStringLiteral("zoomOutButton"));
hboxLayout4->addWidget(zoomOutButton);
@@ -534,7 +534,7 @@ public:
hboxLayout4->addItem(spacerItem);
detailsButton = new QToolButton(QtGradientEditor);
- detailsButton->setObjectName(QString::fromUtf8("detailsButton"));
+ detailsButton->setObjectName(QStringLiteral("detailsButton"));
detailsButton->setGeometry(QRect(176, 40, 25, 22));
QSizePolicy sizePolicy7(QSizePolicy::Fixed, QSizePolicy::Ignored);
sizePolicy7.setHorizontalStretch(0);
@@ -544,32 +544,32 @@ public:
detailsButton->setCheckable(true);
detailsButton->setAutoRaise(true);
linearButton = new QToolButton(QtGradientEditor);
- linearButton->setObjectName(QString::fromUtf8("linearButton"));
+ linearButton->setObjectName(QStringLiteral("linearButton"));
linearButton->setGeometry(QRect(10, 10, 30, 26));
linearButton->setCheckable(true);
linearButton->setAutoRaise(true);
radialButton = new QToolButton(QtGradientEditor);
- radialButton->setObjectName(QString::fromUtf8("radialButton"));
+ radialButton->setObjectName(QStringLiteral("radialButton"));
radialButton->setGeometry(QRect(40, 10, 30, 26));
radialButton->setCheckable(true);
radialButton->setAutoRaise(true);
conicalButton = new QToolButton(QtGradientEditor);
- conicalButton->setObjectName(QString::fromUtf8("conicalButton"));
+ conicalButton->setObjectName(QStringLiteral("conicalButton"));
conicalButton->setGeometry(QRect(70, 10, 30, 26));
conicalButton->setCheckable(true);
conicalButton->setAutoRaise(true);
padButton = new QToolButton(QtGradientEditor);
- padButton->setObjectName(QString::fromUtf8("padButton"));
+ padButton->setObjectName(QStringLiteral("padButton"));
padButton->setGeometry(QRect(110, 10, 30, 26));
padButton->setCheckable(true);
padButton->setAutoRaise(true);
repeatButton = new QToolButton(QtGradientEditor);
- repeatButton->setObjectName(QString::fromUtf8("repeatButton"));
+ repeatButton->setObjectName(QStringLiteral("repeatButton"));
repeatButton->setGeometry(QRect(140, 10, 30, 26));
repeatButton->setCheckable(true);
repeatButton->setAutoRaise(true);
reflectButton = new QToolButton(QtGradientEditor);
- reflectButton->setObjectName(QString::fromUtf8("reflectButton"));
+ reflectButton->setObjectName(QStringLiteral("reflectButton"));
reflectButton->setGeometry(QRect(170, 10, 30, 26));
reflectButton->setCheckable(true);
reflectButton->setAutoRaise(true);
diff --git a/tests/auto/tools/uic/baseline/qtgradientview.ui.h b/tests/auto/tools/uic/baseline/qtgradientview.ui.h
index 52512c4a5b..62136c3890 100644
--- a/tests/auto/tools/uic/baseline/qtgradientview.ui.h
+++ b/tests/auto/tools/uic/baseline/qtgradientview.ui.h
@@ -39,15 +39,15 @@ public:
void setupUi(QWidget *QtGradientView)
{
if (QtGradientView->objectName().isEmpty())
- QtGradientView->setObjectName(QString::fromUtf8("QtGradientView"));
+ QtGradientView->setObjectName(QStringLiteral("QtGradientView"));
QtGradientView->resize(484, 228);
vboxLayout = new QVBoxLayout(QtGradientView);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(0, 0, 0, 0);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
newButton = new QToolButton(QtGradientView);
- newButton->setObjectName(QString::fromUtf8("newButton"));
+ newButton->setObjectName(QStringLiteral("newButton"));
QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -59,7 +59,7 @@ public:
hboxLayout->addWidget(newButton);
editButton = new QToolButton(QtGradientView);
- editButton->setObjectName(QString::fromUtf8("editButton"));
+ editButton->setObjectName(QStringLiteral("editButton"));
sizePolicy.setHeightForWidth(editButton->sizePolicy().hasHeightForWidth());
editButton->setSizePolicy(sizePolicy);
editButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
@@ -68,7 +68,7 @@ public:
hboxLayout->addWidget(editButton);
renameButton = new QToolButton(QtGradientView);
- renameButton->setObjectName(QString::fromUtf8("renameButton"));
+ renameButton->setObjectName(QStringLiteral("renameButton"));
sizePolicy.setHeightForWidth(renameButton->sizePolicy().hasHeightForWidth());
renameButton->setSizePolicy(sizePolicy);
renameButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
@@ -77,7 +77,7 @@ public:
hboxLayout->addWidget(renameButton);
removeButton = new QToolButton(QtGradientView);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
sizePolicy.setHeightForWidth(removeButton->sizePolicy().hasHeightForWidth());
removeButton->setSizePolicy(sizePolicy);
removeButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
@@ -93,7 +93,7 @@ public:
vboxLayout->addLayout(hboxLayout);
listWidget = new QListWidget(QtGradientView);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
vboxLayout->addWidget(listWidget);
diff --git a/tests/auto/tools/uic/baseline/qtgradientviewdialog.ui.h b/tests/auto/tools/uic/baseline/qtgradientviewdialog.ui.h
index d93dfd605c..cc7912d4c2 100644
--- a/tests/auto/tools/uic/baseline/qtgradientviewdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/qtgradientviewdialog.ui.h
@@ -75,12 +75,12 @@ public:
void setupUi(QDialog *QtGradientViewDialog)
{
if (QtGradientViewDialog->objectName().isEmpty())
- QtGradientViewDialog->setObjectName(QString::fromUtf8("QtGradientViewDialog"));
+ QtGradientViewDialog->setObjectName(QStringLiteral("QtGradientViewDialog"));
QtGradientViewDialog->resize(178, 72);
vboxLayout = new QVBoxLayout(QtGradientViewDialog);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
gradientView = new QtGradientView(QtGradientViewDialog);
- gradientView->setObjectName(QString::fromUtf8("gradientView"));
+ gradientView->setObjectName(QStringLiteral("gradientView"));
QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -90,7 +90,7 @@ public:
vboxLayout->addWidget(gradientView);
buttonBox = new QDialogButtonBox(QtGradientViewDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/qtresourceeditordialog.ui.h b/tests/auto/tools/uic/baseline/qtresourceeditordialog.ui.h
index b34f246c34..72cef5353a 100644
--- a/tests/auto/tools/uic/baseline/qtresourceeditordialog.ui.h
+++ b/tests/auto/tools/uic/baseline/qtresourceeditordialog.ui.h
@@ -52,20 +52,20 @@ public:
void setupUi(QDialog *QtResourceEditorDialog)
{
if (QtResourceEditorDialog->objectName().isEmpty())
- QtResourceEditorDialog->setObjectName(QString::fromUtf8("QtResourceEditorDialog"));
+ QtResourceEditorDialog->setObjectName(QStringLiteral("QtResourceEditorDialog"));
QtResourceEditorDialog->resize(469, 317);
verticalLayout = new QVBoxLayout(QtResourceEditorDialog);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
splitter = new QSplitter(QtResourceEditorDialog);
- splitter->setObjectName(QString::fromUtf8("splitter"));
+ splitter->setObjectName(QStringLiteral("splitter"));
splitter->setOrientation(Qt::Horizontal);
layoutWidget = new QWidget(splitter);
- layoutWidget->setObjectName(QString::fromUtf8("layoutWidget"));
+ layoutWidget->setObjectName(QStringLiteral("layoutWidget"));
gridLayout = new QGridLayout(layoutWidget);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
gridLayout->setContentsMargins(0, 0, 0, 0);
qrcFileList = new QListWidget(layoutWidget);
- qrcFileList->setObjectName(QString::fromUtf8("qrcFileList"));
+ qrcFileList->setObjectName(QStringLiteral("qrcFileList"));
QSizePolicy sizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -75,12 +75,12 @@ public:
gridLayout->addWidget(qrcFileList, 0, 0, 1, 4);
newQrcButton = new QToolButton(layoutWidget);
- newQrcButton->setObjectName(QString::fromUtf8("newQrcButton"));
+ newQrcButton->setObjectName(QStringLiteral("newQrcButton"));
gridLayout->addWidget(newQrcButton, 1, 0, 1, 1);
removeQrcButton = new QToolButton(layoutWidget);
- removeQrcButton->setObjectName(QString::fromUtf8("removeQrcButton"));
+ removeQrcButton->setObjectName(QStringLiteral("removeQrcButton"));
gridLayout->addWidget(removeQrcButton, 1, 2, 1, 1);
@@ -89,33 +89,33 @@ public:
gridLayout->addItem(spacerItem, 1, 3, 1, 1);
importQrcButton = new QToolButton(layoutWidget);
- importQrcButton->setObjectName(QString::fromUtf8("importQrcButton"));
+ importQrcButton->setObjectName(QStringLiteral("importQrcButton"));
gridLayout->addWidget(importQrcButton, 1, 1, 1, 1);
splitter->addWidget(layoutWidget);
widget = new QWidget(splitter);
- widget->setObjectName(QString::fromUtf8("widget"));
+ widget->setObjectName(QStringLiteral("widget"));
gridLayout1 = new QGridLayout(widget);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
gridLayout1->setContentsMargins(0, 0, 0, 0);
resourceTreeView = new QTreeView(widget);
- resourceTreeView->setObjectName(QString::fromUtf8("resourceTreeView"));
+ resourceTreeView->setObjectName(QStringLiteral("resourceTreeView"));
gridLayout1->addWidget(resourceTreeView, 0, 0, 1, 4);
newResourceButton = new QToolButton(widget);
- newResourceButton->setObjectName(QString::fromUtf8("newResourceButton"));
+ newResourceButton->setObjectName(QStringLiteral("newResourceButton"));
gridLayout1->addWidget(newResourceButton, 1, 0, 1, 1);
addResourceButton = new QToolButton(widget);
- addResourceButton->setObjectName(QString::fromUtf8("addResourceButton"));
+ addResourceButton->setObjectName(QStringLiteral("addResourceButton"));
gridLayout1->addWidget(addResourceButton, 1, 1, 1, 1);
removeResourceButton = new QToolButton(widget);
- removeResourceButton->setObjectName(QString::fromUtf8("removeResourceButton"));
+ removeResourceButton->setObjectName(QStringLiteral("removeResourceButton"));
gridLayout1->addWidget(removeResourceButton, 1, 2, 1, 1);
@@ -128,7 +128,7 @@ public:
verticalLayout->addWidget(splitter);
buttonBox = new QDialogButtonBox(QtResourceEditorDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/qttoolbardialog.ui.h b/tests/auto/tools/uic/baseline/qttoolbardialog.ui.h
index 463961452f..5b6ec991b9 100644
--- a/tests/auto/tools/uic/baseline/qttoolbardialog.ui.h
+++ b/tests/auto/tools/uic/baseline/qttoolbardialog.ui.h
@@ -53,21 +53,21 @@ public:
void setupUi(QDialog *QtToolBarDialog)
{
if (QtToolBarDialog->objectName().isEmpty())
- QtToolBarDialog->setObjectName(QString::fromUtf8("QtToolBarDialog"));
+ QtToolBarDialog->setObjectName(QStringLiteral("QtToolBarDialog"));
QtToolBarDialog->resize(583, 508);
gridLayout = new QGridLayout(QtToolBarDialog);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(8, 8, 8, 8);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
actionTree = new QTreeWidget(QtToolBarDialog);
- actionTree->setObjectName(QString::fromUtf8("actionTree"));
+ actionTree->setObjectName(QStringLiteral("actionTree"));
gridLayout->addWidget(actionTree, 1, 0, 3, 1);
label = new QLabel(QtToolBarDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
@@ -76,24 +76,24 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
label_2 = new QLabel(QtToolBarDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
hboxLayout->addWidget(label_2);
newButton = new QToolButton(QtToolBarDialog);
- newButton->setObjectName(QString::fromUtf8("newButton"));
+ newButton->setObjectName(QStringLiteral("newButton"));
hboxLayout->addWidget(newButton);
removeButton = new QToolButton(QtToolBarDialog);
- removeButton->setObjectName(QString::fromUtf8("removeButton"));
+ removeButton->setObjectName(QStringLiteral("removeButton"));
hboxLayout->addWidget(removeButton);
renameButton = new QToolButton(QtToolBarDialog);
- renameButton->setObjectName(QString::fromUtf8("renameButton"));
+ renameButton->setObjectName(QStringLiteral("renameButton"));
hboxLayout->addWidget(renameButton);
@@ -105,9 +105,9 @@ public:
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(0, 0, 0, 0);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
upButton = new QToolButton(QtToolBarDialog);
- upButton->setObjectName(QString::fromUtf8("upButton"));
+ upButton->setObjectName(QStringLiteral("upButton"));
QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -117,21 +117,21 @@ public:
vboxLayout->addWidget(upButton);
leftButton = new QToolButton(QtToolBarDialog);
- leftButton->setObjectName(QString::fromUtf8("leftButton"));
+ leftButton->setObjectName(QStringLiteral("leftButton"));
sizePolicy.setHeightForWidth(leftButton->sizePolicy().hasHeightForWidth());
leftButton->setSizePolicy(sizePolicy);
vboxLayout->addWidget(leftButton);
rightButton = new QToolButton(QtToolBarDialog);
- rightButton->setObjectName(QString::fromUtf8("rightButton"));
+ rightButton->setObjectName(QStringLiteral("rightButton"));
sizePolicy.setHeightForWidth(rightButton->sizePolicy().hasHeightForWidth());
rightButton->setSizePolicy(sizePolicy);
vboxLayout->addWidget(rightButton);
downButton = new QToolButton(QtToolBarDialog);
- downButton->setObjectName(QString::fromUtf8("downButton"));
+ downButton->setObjectName(QStringLiteral("downButton"));
sizePolicy.setHeightForWidth(downButton->sizePolicy().hasHeightForWidth());
downButton->setSizePolicy(sizePolicy);
@@ -145,22 +145,22 @@ public:
gridLayout->addLayout(vboxLayout, 3, 1, 1, 1);
currentToolBarList = new QListWidget(QtToolBarDialog);
- currentToolBarList->setObjectName(QString::fromUtf8("currentToolBarList"));
+ currentToolBarList->setObjectName(QStringLiteral("currentToolBarList"));
gridLayout->addWidget(currentToolBarList, 3, 2, 1, 1);
label_3 = new QLabel(QtToolBarDialog);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout->addWidget(label_3, 2, 1, 1, 2);
toolBarList = new QListWidget(QtToolBarDialog);
- toolBarList->setObjectName(QString::fromUtf8("toolBarList"));
+ toolBarList->setObjectName(QStringLiteral("toolBarList"));
gridLayout->addWidget(toolBarList, 1, 1, 1, 2);
buttonBox = new QDialogButtonBox(QtToolBarDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setStandardButtons(QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults);
gridLayout->addWidget(buttonBox, 5, 0, 1, 3);
diff --git a/tests/auto/tools/uic/baseline/querywidget.ui.h b/tests/auto/tools/uic/baseline/querywidget.ui.h
index c355f7c4f1..5a2eef793b 100644
--- a/tests/auto/tools/uic/baseline/querywidget.ui.h
+++ b/tests/auto/tools/uic/baseline/querywidget.ui.h
@@ -50,13 +50,13 @@ public:
void setupUi(QMainWindow *QueryWidget)
{
if (QueryWidget->objectName().isEmpty())
- QueryWidget->setObjectName(QString::fromUtf8("QueryWidget"));
+ QueryWidget->setObjectName(QStringLiteral("QueryWidget"));
QueryWidget->resize(545, 531);
centralwidget = new QWidget(QueryWidget);
- centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
+ centralwidget->setObjectName(QStringLiteral("centralwidget"));
centralwidget->setGeometry(QRect(0, 29, 545, 480));
verticalLayout = new QVBoxLayout(centralwidget);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
vboxLayout = new QVBoxLayout();
#ifndef Q_OS_MAC
vboxLayout->setSpacing(6);
@@ -64,12 +64,12 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
inputGroupBox = new QGroupBox(centralwidget);
- inputGroupBox->setObjectName(QString::fromUtf8("inputGroupBox"));
+ inputGroupBox->setObjectName(QStringLiteral("inputGroupBox"));
inputGroupBox->setMinimumSize(QSize(550, 120));
verticalLayout_4 = new QVBoxLayout(inputGroupBox);
- verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4"));
+ verticalLayout_4->setObjectName(QStringLiteral("verticalLayout_4"));
_2 = new QVBoxLayout();
#ifndef Q_OS_MAC
_2->setSpacing(6);
@@ -77,9 +77,9 @@ public:
#ifndef Q_OS_MAC
_2->setContentsMargins(0, 0, 0, 0);
#endif
- _2->setObjectName(QString::fromUtf8("_2"));
+ _2->setObjectName(QStringLiteral("_2"));
inputTextEdit = new QTextEdit(inputGroupBox);
- inputTextEdit->setObjectName(QString::fromUtf8("inputTextEdit"));
+ inputTextEdit->setObjectName(QStringLiteral("inputTextEdit"));
_2->addWidget(inputTextEdit);
@@ -90,17 +90,17 @@ public:
vboxLayout->addWidget(inputGroupBox);
queryGroupBox = new QGroupBox(centralwidget);
- queryGroupBox->setObjectName(QString::fromUtf8("queryGroupBox"));
+ queryGroupBox->setObjectName(QStringLiteral("queryGroupBox"));
queryGroupBox->setMinimumSize(QSize(550, 120));
verticalLayout_5 = new QVBoxLayout(queryGroupBox);
- verticalLayout_5->setObjectName(QString::fromUtf8("verticalLayout_5"));
+ verticalLayout_5->setObjectName(QStringLiteral("verticalLayout_5"));
defaultQueries = new QComboBox(queryGroupBox);
- defaultQueries->setObjectName(QString::fromUtf8("defaultQueries"));
+ defaultQueries->setObjectName(QStringLiteral("defaultQueries"));
verticalLayout_5->addWidget(defaultQueries);
queryTextEdit = new QTextEdit(queryGroupBox);
- queryTextEdit->setObjectName(QString::fromUtf8("queryTextEdit"));
+ queryTextEdit->setObjectName(QStringLiteral("queryTextEdit"));
queryTextEdit->setMinimumSize(QSize(400, 60));
queryTextEdit->setReadOnly(true);
queryTextEdit->setAcceptRichText(false);
@@ -111,10 +111,10 @@ public:
vboxLayout->addWidget(queryGroupBox);
outputGroupBox = new QGroupBox(centralwidget);
- outputGroupBox->setObjectName(QString::fromUtf8("outputGroupBox"));
+ outputGroupBox->setObjectName(QStringLiteral("outputGroupBox"));
outputGroupBox->setMinimumSize(QSize(550, 120));
verticalLayout_6 = new QVBoxLayout(outputGroupBox);
- verticalLayout_6->setObjectName(QString::fromUtf8("verticalLayout_6"));
+ verticalLayout_6->setObjectName(QStringLiteral("verticalLayout_6"));
_3 = new QVBoxLayout();
#ifndef Q_OS_MAC
_3->setSpacing(6);
@@ -122,9 +122,9 @@ public:
#ifndef Q_OS_MAC
_3->setContentsMargins(0, 0, 0, 0);
#endif
- _3->setObjectName(QString::fromUtf8("_3"));
+ _3->setObjectName(QStringLiteral("_3"));
outputTextEdit = new QTextEdit(outputGroupBox);
- outputTextEdit->setObjectName(QString::fromUtf8("outputTextEdit"));
+ outputTextEdit->setObjectName(QStringLiteral("outputTextEdit"));
outputTextEdit->setMinimumSize(QSize(500, 80));
outputTextEdit->setReadOnly(true);
outputTextEdit->setAcceptRichText(false);
@@ -142,11 +142,11 @@ public:
QueryWidget->setCentralWidget(centralwidget);
menubar = new QMenuBar(QueryWidget);
- menubar->setObjectName(QString::fromUtf8("menubar"));
+ menubar->setObjectName(QStringLiteral("menubar"));
menubar->setGeometry(QRect(0, 0, 545, 29));
QueryWidget->setMenuBar(menubar);
statusbar = new QStatusBar(QueryWidget);
- statusbar->setObjectName(QString::fromUtf8("statusbar"));
+ statusbar->setObjectName(QStringLiteral("statusbar"));
statusbar->setGeometry(QRect(0, 509, 545, 22));
QueryWidget->setStatusBar(statusbar);
diff --git a/tests/auto/tools/uic/baseline/remotecontrol.ui.h b/tests/auto/tools/uic/baseline/remotecontrol.ui.h
index 52ab1678cc..5a4910d635 100644
--- a/tests/auto/tools/uic/baseline/remotecontrol.ui.h
+++ b/tests/auto/tools/uic/baseline/remotecontrol.ui.h
@@ -69,28 +69,28 @@ public:
void setupUi(QMainWindow *RemoteControlClass)
{
if (RemoteControlClass->objectName().isEmpty())
- RemoteControlClass->setObjectName(QString::fromUtf8("RemoteControlClass"));
+ RemoteControlClass->setObjectName(QStringLiteral("RemoteControlClass"));
RemoteControlClass->resize(344, 364);
actionQuit = new QAction(RemoteControlClass);
- actionQuit->setObjectName(QString::fromUtf8("actionQuit"));
+ actionQuit->setObjectName(QStringLiteral("actionQuit"));
centralWidget = new QWidget(RemoteControlClass);
- centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+ centralWidget->setObjectName(QStringLiteral("centralWidget"));
gridLayout = new QGridLayout(centralWidget);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(centralWidget);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
startUrlLineEdit = new QLineEdit(centralWidget);
- startUrlLineEdit->setObjectName(QString::fromUtf8("startUrlLineEdit"));
+ startUrlLineEdit->setObjectName(QStringLiteral("startUrlLineEdit"));
gridLayout->addWidget(startUrlLineEdit, 0, 1, 1, 2);
launchButton = new QPushButton(centralWidget);
- launchButton->setObjectName(QString::fromUtf8("launchButton"));
+ launchButton->setObjectName(QStringLiteral("launchButton"));
gridLayout->addWidget(launchButton, 1, 1, 1, 1);
@@ -103,27 +103,27 @@ public:
gridLayout->addItem(spacerItem1, 2, 1, 1, 1);
actionGroupBox = new QGroupBox(centralWidget);
- actionGroupBox->setObjectName(QString::fromUtf8("actionGroupBox"));
+ actionGroupBox->setObjectName(QStringLiteral("actionGroupBox"));
actionGroupBox->setEnabled(false);
gridLayout1 = new QGridLayout(actionGroupBox);
gridLayout1->setSpacing(6);
gridLayout1->setContentsMargins(11, 11, 11, 11);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
label_2 = new QLabel(actionGroupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout1->addWidget(label_2, 0, 0, 1, 1);
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
indexLineEdit = new QLineEdit(actionGroupBox);
- indexLineEdit->setObjectName(QString::fromUtf8("indexLineEdit"));
+ indexLineEdit->setObjectName(QStringLiteral("indexLineEdit"));
hboxLayout->addWidget(indexLineEdit);
indexButton = new QToolButton(actionGroupBox);
- indexButton->setObjectName(QString::fromUtf8("indexButton"));
+ indexButton->setObjectName(QStringLiteral("indexButton"));
const QIcon icon = QIcon(QString::fromUtf8(":/remotecontrol/enter.png"));
indexButton->setIcon(icon);
@@ -133,20 +133,20 @@ public:
gridLayout1->addLayout(hboxLayout, 0, 1, 1, 2);
label_4 = new QLabel(actionGroupBox);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
gridLayout1->addWidget(label_4, 1, 0, 1, 1);
hboxLayout1 = new QHBoxLayout();
hboxLayout1->setSpacing(0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
identifierLineEdit = new QLineEdit(actionGroupBox);
- identifierLineEdit->setObjectName(QString::fromUtf8("identifierLineEdit"));
+ identifierLineEdit->setObjectName(QStringLiteral("identifierLineEdit"));
hboxLayout1->addWidget(identifierLineEdit);
identifierButton = new QToolButton(actionGroupBox);
- identifierButton->setObjectName(QString::fromUtf8("identifierButton"));
+ identifierButton->setObjectName(QStringLiteral("identifierButton"));
identifierButton->setIcon(icon);
hboxLayout1->addWidget(identifierButton);
@@ -155,20 +155,20 @@ public:
gridLayout1->addLayout(hboxLayout1, 1, 1, 1, 2);
label_3 = new QLabel(actionGroupBox);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout1->addWidget(label_3, 2, 0, 1, 1);
hboxLayout2 = new QHBoxLayout();
hboxLayout2->setSpacing(0);
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
urlLineEdit = new QLineEdit(actionGroupBox);
- urlLineEdit->setObjectName(QString::fromUtf8("urlLineEdit"));
+ urlLineEdit->setObjectName(QStringLiteral("urlLineEdit"));
hboxLayout2->addWidget(urlLineEdit);
urlButton = new QToolButton(actionGroupBox);
- urlButton->setObjectName(QString::fromUtf8("urlButton"));
+ urlButton->setObjectName(QStringLiteral("urlButton"));
urlButton->setIcon(icon);
hboxLayout2->addWidget(urlButton);
@@ -177,7 +177,7 @@ public:
gridLayout1->addLayout(hboxLayout2, 2, 1, 1, 2);
syncContentsButton = new QPushButton(actionGroupBox);
- syncContentsButton->setObjectName(QString::fromUtf8("syncContentsButton"));
+ syncContentsButton->setObjectName(QStringLiteral("syncContentsButton"));
gridLayout1->addWidget(syncContentsButton, 3, 1, 1, 1);
@@ -186,17 +186,17 @@ public:
gridLayout1->addItem(spacerItem2, 3, 2, 1, 1);
contentsCheckBox = new QCheckBox(actionGroupBox);
- contentsCheckBox->setObjectName(QString::fromUtf8("contentsCheckBox"));
+ contentsCheckBox->setObjectName(QStringLiteral("contentsCheckBox"));
gridLayout1->addWidget(contentsCheckBox, 4, 0, 1, 3);
indexCheckBox = new QCheckBox(actionGroupBox);
- indexCheckBox->setObjectName(QString::fromUtf8("indexCheckBox"));
+ indexCheckBox->setObjectName(QStringLiteral("indexCheckBox"));
gridLayout1->addWidget(indexCheckBox, 5, 0, 1, 1);
bookmarksCheckBox = new QCheckBox(actionGroupBox);
- bookmarksCheckBox->setObjectName(QString::fromUtf8("bookmarksCheckBox"));
+ bookmarksCheckBox->setObjectName(QStringLiteral("bookmarksCheckBox"));
gridLayout1->addWidget(bookmarksCheckBox, 6, 0, 1, 3);
@@ -205,13 +205,13 @@ public:
RemoteControlClass->setCentralWidget(centralWidget);
menuBar = new QMenuBar(RemoteControlClass);
- menuBar->setObjectName(QString::fromUtf8("menuBar"));
+ menuBar->setObjectName(QStringLiteral("menuBar"));
menuBar->setGeometry(QRect(0, 0, 344, 21));
menuFile = new QMenu(menuBar);
- menuFile->setObjectName(QString::fromUtf8("menuFile"));
+ menuFile->setObjectName(QStringLiteral("menuFile"));
RemoteControlClass->setMenuBar(menuBar);
statusBar = new QStatusBar(RemoteControlClass);
- statusBar->setObjectName(QString::fromUtf8("statusBar"));
+ statusBar->setObjectName(QStringLiteral("statusBar"));
RemoteControlClass->setStatusBar(statusBar);
menuBar->addAction(menuFile->menuAction());
diff --git a/tests/auto/tools/uic/baseline/saveformastemplate.ui.h b/tests/auto/tools/uic/baseline/saveformastemplate.ui.h
index 32597cd6ff..dba7834c96 100644
--- a/tests/auto/tools/uic/baseline/saveformastemplate.ui.h
+++ b/tests/auto/tools/uic/baseline/saveformastemplate.ui.h
@@ -84,13 +84,13 @@ public:
void setupUi(QDialog *SaveFormAsTemplate)
{
if (SaveFormAsTemplate->objectName().isEmpty())
- SaveFormAsTemplate->setObjectName(QString::fromUtf8("SaveFormAsTemplate"));
+ SaveFormAsTemplate->setObjectName(QStringLiteral("SaveFormAsTemplate"));
vboxLayout = new QVBoxLayout(SaveFormAsTemplate);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
formLayout = new QFormLayout();
- formLayout->setObjectName(QString::fromUtf8("formLayout"));
+ formLayout->setObjectName(QStringLiteral("formLayout"));
label = new QLabel(SaveFormAsTemplate);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setFrameShape(QFrame::NoFrame);
label->setFrameShadow(QFrame::Plain);
label->setTextFormat(Qt::AutoText);
@@ -98,14 +98,14 @@ public:
formLayout->setWidget(0, QFormLayout::LabelRole, label);
templateNameEdit = new QLineEdit(SaveFormAsTemplate);
- templateNameEdit->setObjectName(QString::fromUtf8("templateNameEdit"));
+ templateNameEdit->setObjectName(QStringLiteral("templateNameEdit"));
templateNameEdit->setMinimumSize(QSize(222, 0));
templateNameEdit->setEchoMode(QLineEdit::Normal);
formLayout->setWidget(0, QFormLayout::FieldRole, templateNameEdit);
label_2 = new QLabel(SaveFormAsTemplate);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
label_2->setFrameShape(QFrame::NoFrame);
label_2->setFrameShadow(QFrame::Plain);
label_2->setTextFormat(Qt::AutoText);
@@ -113,7 +113,7 @@ public:
formLayout->setWidget(1, QFormLayout::LabelRole, label_2);
categoryCombo = new QComboBox(SaveFormAsTemplate);
- categoryCombo->setObjectName(QString::fromUtf8("categoryCombo"));
+ categoryCombo->setObjectName(QStringLiteral("categoryCombo"));
formLayout->setWidget(1, QFormLayout::FieldRole, categoryCombo);
@@ -121,14 +121,14 @@ public:
vboxLayout->addLayout(formLayout);
horizontalLine = new QFrame(SaveFormAsTemplate);
- horizontalLine->setObjectName(QString::fromUtf8("horizontalLine"));
+ horizontalLine->setObjectName(QStringLiteral("horizontalLine"));
horizontalLine->setFrameShape(QFrame::HLine);
horizontalLine->setFrameShadow(QFrame::Sunken);
vboxLayout->addWidget(horizontalLine);
buttonBox = new QDialogButtonBox(SaveFormAsTemplate);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/settings.ui.h b/tests/auto/tools/uic/baseline/settings.ui.h
index 0f87a29a65..3fc9bad710 100644
--- a/tests/auto/tools/uic/baseline/settings.ui.h
+++ b/tests/auto/tools/uic/baseline/settings.ui.h
@@ -51,14 +51,14 @@ public:
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
- Dialog->setObjectName(QString::fromUtf8("Dialog"));
+ Dialog->setObjectName(QStringLiteral("Dialog"));
Dialog->resize(392, 176);
verticalLayout = new QVBoxLayout(Dialog);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
label = new QLabel(Dialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -70,7 +70,7 @@ public:
hboxLayout->addWidget(label);
deviceCombo = new QComboBox(Dialog);
- deviceCombo->setObjectName(QString::fromUtf8("deviceCombo"));
+ deviceCombo->setObjectName(QStringLiteral("deviceCombo"));
QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -83,9 +83,9 @@ public:
verticalLayout->addLayout(hboxLayout);
hboxLayout1 = new QHBoxLayout();
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
label_6 = new QLabel(Dialog);
- label_6->setObjectName(QString::fromUtf8("label_6"));
+ label_6->setObjectName(QStringLiteral("label_6"));
sizePolicy.setHeightForWidth(label_6->sizePolicy().hasHeightForWidth());
label_6->setSizePolicy(sizePolicy);
label_6->setMinimumSize(QSize(90, 0));
@@ -94,7 +94,7 @@ public:
hboxLayout1->addWidget(label_6);
audioEffectsCombo = new QComboBox(Dialog);
- audioEffectsCombo->setObjectName(QString::fromUtf8("audioEffectsCombo"));
+ audioEffectsCombo->setObjectName(QStringLiteral("audioEffectsCombo"));
sizePolicy1.setHeightForWidth(audioEffectsCombo->sizePolicy().hasHeightForWidth());
audioEffectsCombo->setSizePolicy(sizePolicy1);
@@ -104,9 +104,9 @@ public:
verticalLayout->addLayout(hboxLayout1);
hboxLayout2 = new QHBoxLayout();
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
crossFadeLabel = new QLabel(Dialog);
- crossFadeLabel->setObjectName(QString::fromUtf8("crossFadeLabel"));
+ crossFadeLabel->setObjectName(QStringLiteral("crossFadeLabel"));
sizePolicy.setHeightForWidth(crossFadeLabel->sizePolicy().hasHeightForWidth());
crossFadeLabel->setSizePolicy(sizePolicy);
crossFadeLabel->setMinimumSize(QSize(90, 0));
@@ -115,9 +115,9 @@ public:
hboxLayout2->addWidget(crossFadeLabel);
vboxLayout = new QVBoxLayout();
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
crossFadeSlider = new QSlider(Dialog);
- crossFadeSlider->setObjectName(QString::fromUtf8("crossFadeSlider"));
+ crossFadeSlider->setObjectName(QStringLiteral("crossFadeSlider"));
sizePolicy1.setHeightForWidth(crossFadeSlider->sizePolicy().hasHeightForWidth());
crossFadeSlider->setSizePolicy(sizePolicy1);
crossFadeSlider->setMinimum(-20);
@@ -131,9 +131,9 @@ public:
vboxLayout->addWidget(crossFadeSlider);
hboxLayout3 = new QHBoxLayout();
- hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3"));
+ hboxLayout3->setObjectName(QStringLiteral("hboxLayout3"));
label_3 = new QLabel(Dialog);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
QFont font;
font.setPointSize(9);
label_3->setFont(font);
@@ -145,7 +145,7 @@ public:
hboxLayout3->addItem(spacerItem);
label_5 = new QLabel(Dialog);
- label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setObjectName(QStringLiteral("label_5"));
label_5->setFont(font);
hboxLayout3->addWidget(label_5);
@@ -155,7 +155,7 @@ public:
hboxLayout3->addItem(spacerItem1);
label_4 = new QLabel(Dialog);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
label_4->setFont(font);
hboxLayout3->addWidget(label_4);
@@ -170,7 +170,7 @@ public:
verticalLayout->addLayout(hboxLayout2);
buttonBox = new QDialogButtonBox(Dialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/signalslotdialog.ui.h b/tests/auto/tools/uic/baseline/signalslotdialog.ui.h
index 3027ac93f2..ea253fa729 100644
--- a/tests/auto/tools/uic/baseline/signalslotdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/signalslotdialog.ui.h
@@ -49,33 +49,33 @@ public:
void setupUi(QDialog *SignalSlotDialogClass)
{
if (SignalSlotDialogClass->objectName().isEmpty())
- SignalSlotDialogClass->setObjectName(QString::fromUtf8("SignalSlotDialogClass"));
+ SignalSlotDialogClass->setObjectName(QStringLiteral("SignalSlotDialogClass"));
SignalSlotDialogClass->resize(617, 535);
vboxLayout = new QVBoxLayout(SignalSlotDialogClass);
vboxLayout->setSpacing(6);
vboxLayout->setContentsMargins(11, 11, 11, 11);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
slotGroupBox = new QGroupBox(SignalSlotDialogClass);
- slotGroupBox->setObjectName(QString::fromUtf8("slotGroupBox"));
+ slotGroupBox->setObjectName(QStringLiteral("slotGroupBox"));
vboxLayout1 = new QVBoxLayout(slotGroupBox);
vboxLayout1->setSpacing(6);
vboxLayout1->setContentsMargins(11, 11, 11, 11);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
slotListView = new QListView(slotGroupBox);
- slotListView->setObjectName(QString::fromUtf8("slotListView"));
+ slotListView->setObjectName(QStringLiteral("slotListView"));
vboxLayout1->addWidget(slotListView);
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(6);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
addSlotButton = new QToolButton(slotGroupBox);
- addSlotButton->setObjectName(QString::fromUtf8("addSlotButton"));
+ addSlotButton->setObjectName(QStringLiteral("addSlotButton"));
hboxLayout->addWidget(addSlotButton);
removeSlotButton = new QToolButton(slotGroupBox);
- removeSlotButton->setObjectName(QString::fromUtf8("removeSlotButton"));
+ removeSlotButton->setObjectName(QStringLiteral("removeSlotButton"));
hboxLayout->addWidget(removeSlotButton);
@@ -90,26 +90,26 @@ public:
vboxLayout->addWidget(slotGroupBox);
signalGroupBox = new QGroupBox(SignalSlotDialogClass);
- signalGroupBox->setObjectName(QString::fromUtf8("signalGroupBox"));
+ signalGroupBox->setObjectName(QStringLiteral("signalGroupBox"));
vboxLayout2 = new QVBoxLayout(signalGroupBox);
vboxLayout2->setSpacing(6);
vboxLayout2->setContentsMargins(11, 11, 11, 11);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
signalListView = new QListView(signalGroupBox);
- signalListView->setObjectName(QString::fromUtf8("signalListView"));
+ signalListView->setObjectName(QStringLiteral("signalListView"));
vboxLayout2->addWidget(signalListView);
hboxLayout1 = new QHBoxLayout();
hboxLayout1->setSpacing(6);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
addSignalButton = new QToolButton(signalGroupBox);
- addSignalButton->setObjectName(QString::fromUtf8("addSignalButton"));
+ addSignalButton->setObjectName(QStringLiteral("addSignalButton"));
hboxLayout1->addWidget(addSignalButton);
removeSignalButton = new QToolButton(signalGroupBox);
- removeSignalButton->setObjectName(QString::fromUtf8("removeSignalButton"));
+ removeSignalButton->setObjectName(QStringLiteral("removeSignalButton"));
hboxLayout1->addWidget(removeSignalButton);
@@ -124,7 +124,7 @@ public:
vboxLayout->addWidget(signalGroupBox);
buttonBox = new QDialogButtonBox(SignalSlotDialogClass);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
vboxLayout->addWidget(buttonBox);
diff --git a/tests/auto/tools/uic/baseline/sslclient.ui.h b/tests/auto/tools/uic/baseline/sslclient.ui.h
index 4dce9be2c3..7d5b83b5db 100644
--- a/tests/auto/tools/uic/baseline/sslclient.ui.h
+++ b/tests/auto/tools/uic/baseline/sslclient.ui.h
@@ -52,29 +52,29 @@ public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
- Form->setObjectName(QString::fromUtf8("Form"));
+ Form->setObjectName(QStringLiteral("Form"));
Form->resize(343, 320);
vboxLayout = new QVBoxLayout(Form);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
gridLayout = new QGridLayout();
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
hostNameLabel = new QLabel(Form);
- hostNameLabel->setObjectName(QString::fromUtf8("hostNameLabel"));
+ hostNameLabel->setObjectName(QStringLiteral("hostNameLabel"));
gridLayout->addWidget(hostNameLabel, 0, 0, 1, 1);
hostNameEdit = new QLineEdit(Form);
- hostNameEdit->setObjectName(QString::fromUtf8("hostNameEdit"));
+ hostNameEdit->setObjectName(QStringLiteral("hostNameEdit"));
gridLayout->addWidget(hostNameEdit, 0, 1, 1, 1);
portLabel = new QLabel(Form);
- portLabel->setObjectName(QString::fromUtf8("portLabel"));
+ portLabel->setObjectName(QStringLiteral("portLabel"));
gridLayout->addWidget(portLabel, 1, 0, 1, 1);
portBox = new QSpinBox(Form);
- portBox->setObjectName(QString::fromUtf8("portBox"));
+ portBox->setObjectName(QStringLiteral("portBox"));
portBox->setMinimum(1);
portBox->setMaximum(65535);
portBox->setValue(993);
@@ -85,26 +85,26 @@ public:
vboxLayout->addLayout(gridLayout);
connectButton = new QPushButton(Form);
- connectButton->setObjectName(QString::fromUtf8("connectButton"));
+ connectButton->setObjectName(QStringLiteral("connectButton"));
connectButton->setEnabled(true);
connectButton->setDefault(true);
vboxLayout->addWidget(connectButton);
sessionBox = new QGroupBox(Form);
- sessionBox->setObjectName(QString::fromUtf8("sessionBox"));
+ sessionBox->setObjectName(QStringLiteral("sessionBox"));
sessionBox->setEnabled(false);
vboxLayout1 = new QVBoxLayout(sessionBox);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
cipherText = new QLabel(sessionBox);
- cipherText->setObjectName(QString::fromUtf8("cipherText"));
+ cipherText->setObjectName(QStringLiteral("cipherText"));
hboxLayout->addWidget(cipherText);
cipherLabel = new QLabel(sessionBox);
- cipherLabel->setObjectName(QString::fromUtf8("cipherLabel"));
+ cipherLabel->setObjectName(QStringLiteral("cipherLabel"));
cipherLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
hboxLayout->addWidget(cipherLabel);
@@ -113,7 +113,7 @@ public:
vboxLayout1->addLayout(hboxLayout);
sessionOutput = new QTextEdit(sessionBox);
- sessionOutput->setObjectName(QString::fromUtf8("sessionOutput"));
+ sessionOutput->setObjectName(QStringLiteral("sessionOutput"));
sessionOutput->setEnabled(false);
sessionOutput->setFocusPolicy(Qt::NoFocus);
sessionOutput->setReadOnly(true);
@@ -121,20 +121,20 @@ public:
vboxLayout1->addWidget(sessionOutput);
hboxLayout1 = new QHBoxLayout();
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
sessionInputLabel = new QLabel(sessionBox);
- sessionInputLabel->setObjectName(QString::fromUtf8("sessionInputLabel"));
+ sessionInputLabel->setObjectName(QStringLiteral("sessionInputLabel"));
hboxLayout1->addWidget(sessionInputLabel);
sessionInput = new QLineEdit(sessionBox);
- sessionInput->setObjectName(QString::fromUtf8("sessionInput"));
+ sessionInput->setObjectName(QStringLiteral("sessionInput"));
sessionInput->setEnabled(false);
hboxLayout1->addWidget(sessionInput);
sendButton = new QPushButton(sessionBox);
- sendButton->setObjectName(QString::fromUtf8("sendButton"));
+ sendButton->setObjectName(QStringLiteral("sendButton"));
sendButton->setEnabled(false);
sendButton->setFocusPolicy(Qt::TabFocus);
sendButton->setDefault(true);
diff --git a/tests/auto/tools/uic/baseline/sslerrors.ui.h b/tests/auto/tools/uic/baseline/sslerrors.ui.h
index 2c3ade77bc..c542baab3c 100644
--- a/tests/auto/tools/uic/baseline/sslerrors.ui.h
+++ b/tests/auto/tools/uic/baseline/sslerrors.ui.h
@@ -40,25 +40,25 @@ public:
void setupUi(QDialog *SslErrors)
{
if (SslErrors->objectName().isEmpty())
- SslErrors->setObjectName(QString::fromUtf8("SslErrors"));
+ SslErrors->setObjectName(QStringLiteral("SslErrors"));
SslErrors->resize(371, 216);
vboxLayout = new QVBoxLayout(SslErrors);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
label = new QLabel(SslErrors);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setWordWrap(true);
vboxLayout->addWidget(label);
sslErrorList = new QListWidget(SslErrors);
- sslErrorList->setObjectName(QString::fromUtf8("sslErrorList"));
+ sslErrorList->setObjectName(QStringLiteral("sslErrorList"));
vboxLayout->addWidget(sslErrorList);
hboxLayout = new QHBoxLayout();
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
certificateChainButton = new QPushButton(SslErrors);
- certificateChainButton->setObjectName(QString::fromUtf8("certificateChainButton"));
+ certificateChainButton->setObjectName(QStringLiteral("certificateChainButton"));
certificateChainButton->setAutoDefault(false);
hboxLayout->addWidget(certificateChainButton);
@@ -68,12 +68,12 @@ public:
hboxLayout->addItem(spacerItem);
pushButton = new QPushButton(SslErrors);
- pushButton->setObjectName(QString::fromUtf8("pushButton"));
+ pushButton->setObjectName(QStringLiteral("pushButton"));
hboxLayout->addWidget(pushButton);
pushButton_2 = new QPushButton(SslErrors);
- pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
+ pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
hboxLayout->addWidget(pushButton_2);
diff --git a/tests/auto/tools/uic/baseline/statistics.ui.h b/tests/auto/tools/uic/baseline/statistics.ui.h
index b6e14b5dda..a812fb443f 100644
--- a/tests/auto/tools/uic/baseline/statistics.ui.h
+++ b/tests/auto/tools/uic/baseline/statistics.ui.h
@@ -93,24 +93,24 @@ public:
void setupUi(QDialog *Statistics)
{
if (Statistics->objectName().isEmpty())
- Statistics->setObjectName(QString::fromUtf8("Statistics"));
- Statistics->setObjectName(QString::fromUtf8("linguist_stats"));
+ Statistics->setObjectName(QStringLiteral("Statistics"));
+ Statistics->setObjectName(QStringLiteral("linguist_stats"));
Statistics->resize(336, 164);
gridLayout = new QGridLayout(Statistics);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
- gridLayout->setObjectName(QString::fromUtf8("unnamed"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("unnamed"));
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(6);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
- hboxLayout->setObjectName(QString::fromUtf8("unnamed"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("unnamed"));
spacer4_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacer4_2);
closeBtn = new QPushButton(Statistics);
- closeBtn->setObjectName(QString::fromUtf8("closeBtn"));
+ closeBtn->setObjectName(QStringLiteral("closeBtn"));
hboxLayout->addWidget(closeBtn);
@@ -122,66 +122,66 @@ public:
gridLayout->addLayout(hboxLayout, 1, 0, 1, 1);
frame4 = new QFrame(Statistics);
- frame4->setObjectName(QString::fromUtf8("frame4"));
+ frame4->setObjectName(QStringLiteral("frame4"));
frame4->setFrameShape(QFrame::StyledPanel);
frame4->setFrameShadow(QFrame::Raised);
gridLayout1 = new QGridLayout(frame4);
gridLayout1->setSpacing(6);
gridLayout1->setContentsMargins(11, 11, 11, 11);
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
- gridLayout1->setObjectName(QString::fromUtf8("unnamed"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("unnamed"));
textLabel4 = new QLabel(frame4);
- textLabel4->setObjectName(QString::fromUtf8("textLabel4"));
+ textLabel4->setObjectName(QStringLiteral("textLabel4"));
gridLayout1->addWidget(textLabel4, 0, 2, 1, 1);
textLabel5 = new QLabel(frame4);
- textLabel5->setObjectName(QString::fromUtf8("textLabel5"));
+ textLabel5->setObjectName(QStringLiteral("textLabel5"));
gridLayout1->addWidget(textLabel5, 0, 1, 1, 1);
untrWords = new QLabel(frame4);
- untrWords->setObjectName(QString::fromUtf8("untrWords"));
+ untrWords->setObjectName(QStringLiteral("untrWords"));
gridLayout1->addWidget(untrWords, 1, 1, 1, 1);
trWords = new QLabel(frame4);
- trWords->setObjectName(QString::fromUtf8("trWords"));
+ trWords->setObjectName(QStringLiteral("trWords"));
gridLayout1->addWidget(trWords, 1, 2, 1, 1);
textLabel1 = new QLabel(frame4);
- textLabel1->setObjectName(QString::fromUtf8("textLabel1"));
+ textLabel1->setObjectName(QStringLiteral("textLabel1"));
gridLayout1->addWidget(textLabel1, 1, 0, 1, 1);
trChars = new QLabel(frame4);
- trChars->setObjectName(QString::fromUtf8("trChars"));
+ trChars->setObjectName(QStringLiteral("trChars"));
gridLayout1->addWidget(trChars, 2, 2, 1, 1);
untrChars = new QLabel(frame4);
- untrChars->setObjectName(QString::fromUtf8("untrChars"));
+ untrChars->setObjectName(QStringLiteral("untrChars"));
gridLayout1->addWidget(untrChars, 2, 1, 1, 1);
textLabel3 = new QLabel(frame4);
- textLabel3->setObjectName(QString::fromUtf8("textLabel3"));
+ textLabel3->setObjectName(QStringLiteral("textLabel3"));
gridLayout1->addWidget(textLabel3, 2, 0, 1, 1);
textLabel6 = new QLabel(frame4);
- textLabel6->setObjectName(QString::fromUtf8("textLabel6"));
+ textLabel6->setObjectName(QStringLiteral("textLabel6"));
gridLayout1->addWidget(textLabel6, 3, 0, 1, 1);
trCharsSpc = new QLabel(frame4);
- trCharsSpc->setObjectName(QString::fromUtf8("trCharsSpc"));
+ trCharsSpc->setObjectName(QStringLiteral("trCharsSpc"));
gridLayout1->addWidget(trCharsSpc, 3, 2, 1, 1);
untrCharsSpc = new QLabel(frame4);
- untrCharsSpc->setObjectName(QString::fromUtf8("untrCharsSpc"));
+ untrCharsSpc->setObjectName(QStringLiteral("untrCharsSpc"));
gridLayout1->addWidget(untrCharsSpc, 3, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/stringlisteditor.ui.h b/tests/auto/tools/uic/baseline/stringlisteditor.ui.h
index 7624eaec58..d3033dc594 100644
--- a/tests/auto/tools/uic/baseline/stringlisteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/stringlisteditor.ui.h
@@ -99,7 +99,7 @@ public:
void setupUi(QDialog *qdesigner_internal__Dialog)
{
if (qdesigner_internal__Dialog->objectName().isEmpty())
- qdesigner_internal__Dialog->setObjectName(QString::fromUtf8("qdesigner_internal__Dialog"));
+ qdesigner_internal__Dialog->setObjectName(QStringLiteral("qdesigner_internal__Dialog"));
qdesigner_internal__Dialog->resize(400, 300);
vboxLayout = new QVBoxLayout(qdesigner_internal__Dialog);
#ifndef Q_OS_MAC
@@ -108,9 +108,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(qdesigner_internal__Dialog);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout = new QGridLayout(groupBox);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
@@ -118,7 +118,7 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
vboxLayout1 = new QVBoxLayout();
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
@@ -126,7 +126,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(0, 0, 0, 0);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -134,15 +134,15 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
newButton = new QToolButton(groupBox);
- newButton->setObjectName(QString::fromUtf8("newButton"));
+ newButton->setObjectName(QStringLiteral("newButton"));
newButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
hboxLayout->addWidget(newButton);
deleteButton = new QToolButton(groupBox);
- deleteButton->setObjectName(QString::fromUtf8("deleteButton"));
+ deleteButton->setObjectName(QStringLiteral("deleteButton"));
deleteButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
hboxLayout->addWidget(deleteButton);
@@ -159,14 +159,14 @@ public:
hboxLayout1->setSpacing(6);
#endif
hboxLayout1->setContentsMargins(0, 0, 0, 0);
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
hboxLayout1->addWidget(label);
valueEdit = new QLineEdit(groupBox);
- valueEdit->setObjectName(QString::fromUtf8("valueEdit"));
+ valueEdit->setObjectName(QStringLiteral("valueEdit"));
hboxLayout1->addWidget(valueEdit);
@@ -181,18 +181,18 @@ public:
vboxLayout2->setSpacing(6);
#endif
vboxLayout2->setContentsMargins(0, 0, 0, 0);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
spacerItem1 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
vboxLayout2->addItem(spacerItem1);
upButton = new QToolButton(groupBox);
- upButton->setObjectName(QString::fromUtf8("upButton"));
+ upButton->setObjectName(QStringLiteral("upButton"));
vboxLayout2->addWidget(upButton);
downButton = new QToolButton(groupBox);
- downButton->setObjectName(QString::fromUtf8("downButton"));
+ downButton->setObjectName(QStringLiteral("downButton"));
vboxLayout2->addWidget(downButton);
@@ -204,7 +204,7 @@ public:
gridLayout->addLayout(vboxLayout2, 0, 1, 1, 1);
listView = new QListView(groupBox);
- listView->setObjectName(QString::fromUtf8("listView"));
+ listView->setObjectName(QStringLiteral("listView"));
gridLayout->addWidget(listView, 0, 0, 1, 1);
@@ -212,7 +212,7 @@ public:
vboxLayout->addWidget(groupBox);
buttonBox = new QDialogButtonBox(qdesigner_internal__Dialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/stylesheeteditor.ui.h b/tests/auto/tools/uic/baseline/stylesheeteditor.ui.h
index f5e8e2ea98..e4b2deb498 100644
--- a/tests/auto/tools/uic/baseline/stylesheeteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/stylesheeteditor.ui.h
@@ -45,7 +45,7 @@ public:
void setupUi(QWidget *StyleSheetEditor)
{
if (StyleSheetEditor->objectName().isEmpty())
- StyleSheetEditor->setObjectName(QString::fromUtf8("StyleSheetEditor"));
+ StyleSheetEditor->setObjectName(QStringLiteral("StyleSheetEditor"));
StyleSheetEditor->resize(445, 289);
gridLayout = new QGridLayout(StyleSheetEditor);
#ifndef Q_OS_MAC
@@ -54,7 +54,7 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
spacerItem = new QSpacerItem(32, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
gridLayout->addItem(spacerItem, 0, 6, 1, 1);
@@ -64,7 +64,7 @@ public:
gridLayout->addItem(spacerItem1, 0, 0, 1, 1);
styleSheetCombo = new QComboBox(StyleSheetEditor);
- styleSheetCombo->setObjectName(QString::fromUtf8("styleSheetCombo"));
+ styleSheetCombo->setObjectName(QStringLiteral("styleSheetCombo"));
gridLayout->addWidget(styleSheetCombo, 0, 5, 1, 1);
@@ -73,7 +73,7 @@ public:
gridLayout->addItem(spacerItem2, 0, 3, 1, 1);
styleCombo = new QComboBox(StyleSheetEditor);
- styleCombo->setObjectName(QString::fromUtf8("styleCombo"));
+ styleCombo->setObjectName(QStringLiteral("styleCombo"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(5), static_cast<QSizePolicy::Policy>(0));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -83,7 +83,7 @@ public:
gridLayout->addWidget(styleCombo, 0, 2, 1, 1);
label_7 = new QLabel(StyleSheetEditor);
- label_7->setObjectName(QString::fromUtf8("label_7"));
+ label_7->setObjectName(QStringLiteral("label_7"));
QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(0), static_cast<QSizePolicy::Policy>(5));
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -97,13 +97,13 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
spacerItem3 = new QSpacerItem(321, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem3);
applyButton = new QPushButton(StyleSheetEditor);
- applyButton->setObjectName(QString::fromUtf8("applyButton"));
+ applyButton->setObjectName(QStringLiteral("applyButton"));
applyButton->setEnabled(false);
hboxLayout->addWidget(applyButton);
@@ -112,12 +112,12 @@ public:
gridLayout->addLayout(hboxLayout, 2, 0, 1, 7);
styleTextEdit = new QTextEdit(StyleSheetEditor);
- styleTextEdit->setObjectName(QString::fromUtf8("styleTextEdit"));
+ styleTextEdit->setObjectName(QStringLiteral("styleTextEdit"));
gridLayout->addWidget(styleTextEdit, 1, 0, 1, 7);
label_8 = new QLabel(StyleSheetEditor);
- label_8->setObjectName(QString::fromUtf8("label_8"));
+ label_8->setObjectName(QStringLiteral("label_8"));
sizePolicy1.setHeightForWidth(label_8->sizePolicy().hasHeightForWidth());
label_8->setSizePolicy(sizePolicy1);
diff --git a/tests/auto/tools/uic/baseline/tabbedbrowser.ui.h b/tests/auto/tools/uic/baseline/tabbedbrowser.ui.h
index 424871f688..1e99c41312 100644
--- a/tests/auto/tools/uic/baseline/tabbedbrowser.ui.h
+++ b/tests/auto/tools/uic/baseline/tabbedbrowser.ui.h
@@ -93,28 +93,28 @@ public:
void setupUi(QWidget *TabbedBrowser)
{
if (TabbedBrowser->objectName().isEmpty())
- TabbedBrowser->setObjectName(QString::fromUtf8("TabbedBrowser"));
+ TabbedBrowser->setObjectName(QStringLiteral("TabbedBrowser"));
TabbedBrowser->resize(710, 664);
vboxLayout = new QVBoxLayout(TabbedBrowser);
vboxLayout->setSpacing(0);
vboxLayout->setContentsMargins(0, 0, 0, 0);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
tab = new QTabWidget(TabbedBrowser);
- tab->setObjectName(QString::fromUtf8("tab"));
+ tab->setObjectName(QStringLiteral("tab"));
frontpage = new QWidget();
- frontpage->setObjectName(QString::fromUtf8("frontpage"));
+ frontpage->setObjectName(QStringLiteral("frontpage"));
gridLayout = new QGridLayout(frontpage);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
#endif
gridLayout->setContentsMargins(8, 8, 8, 8);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
tab->addTab(frontpage, QString());
vboxLayout->addWidget(tab);
frameFind = new QFrame(TabbedBrowser);
- frameFind->setObjectName(QString::fromUtf8("frameFind"));
+ frameFind->setObjectName(QStringLiteral("frameFind"));
frameFind->setFrameShape(QFrame::StyledPanel);
frameFind->setFrameShadow(QFrame::Raised);
hboxLayout = new QHBoxLayout(frameFind);
@@ -122,9 +122,9 @@ public:
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
toolClose = new QToolButton(frameFind);
- toolClose->setObjectName(QString::fromUtf8("toolClose"));
+ toolClose->setObjectName(QStringLiteral("toolClose"));
const QIcon icon = QIcon(QString::fromUtf8(":/trolltech/assistant/images/close.png"));
toolClose->setIcon(icon);
toolClose->setAutoRaise(true);
@@ -132,7 +132,7 @@ public:
hboxLayout->addWidget(toolClose);
editFind = new QLineEdit(frameFind);
- editFind->setObjectName(QString::fromUtf8("editFind"));
+ editFind->setObjectName(QStringLiteral("editFind"));
QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(0), static_cast<QSizePolicy::Policy>(0));
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -143,7 +143,7 @@ public:
hboxLayout->addWidget(editFind);
toolPrevious = new QToolButton(frameFind);
- toolPrevious->setObjectName(QString::fromUtf8("toolPrevious"));
+ toolPrevious->setObjectName(QStringLiteral("toolPrevious"));
const QIcon icon1 = QIcon(QString::fromUtf8(":/trolltech/assistant/images/win/previous.png"));
toolPrevious->setIcon(icon1);
toolPrevious->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
@@ -152,7 +152,7 @@ public:
hboxLayout->addWidget(toolPrevious);
toolNext = new QToolButton(frameFind);
- toolNext->setObjectName(QString::fromUtf8("toolNext"));
+ toolNext->setObjectName(QStringLiteral("toolNext"));
toolNext->setMinimumSize(QSize(0, 0));
const QIcon icon2 = QIcon(QString::fromUtf8(":/trolltech/assistant/images/win/next.png"));
toolNext->setIcon(icon2);
@@ -163,17 +163,17 @@ public:
hboxLayout->addWidget(toolNext);
checkCase = new QCheckBox(frameFind);
- checkCase->setObjectName(QString::fromUtf8("checkCase"));
+ checkCase->setObjectName(QStringLiteral("checkCase"));
hboxLayout->addWidget(checkCase);
checkWholeWords = new QCheckBox(frameFind);
- checkWholeWords->setObjectName(QString::fromUtf8("checkWholeWords"));
+ checkWholeWords->setObjectName(QStringLiteral("checkWholeWords"));
hboxLayout->addWidget(checkWholeWords);
labelWrapped = new QLabel(frameFind);
- labelWrapped->setObjectName(QString::fromUtf8("labelWrapped"));
+ labelWrapped->setObjectName(QStringLiteral("labelWrapped"));
labelWrapped->setMinimumSize(QSize(0, 20));
labelWrapped->setMaximumSize(QSize(105, 20));
labelWrapped->setTextFormat(Qt::RichText);
diff --git a/tests/auto/tools/uic/baseline/tablewidgeteditor.ui.h b/tests/auto/tools/uic/baseline/tablewidgeteditor.ui.h
index da5357d1fd..50542353c4 100644
--- a/tests/auto/tools/uic/baseline/tablewidgeteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/tablewidgeteditor.ui.h
@@ -120,28 +120,28 @@ public:
void setupUi(QDialog *qdesigner_internal__TableWidgetEditor)
{
if (qdesigner_internal__TableWidgetEditor->objectName().isEmpty())
- qdesigner_internal__TableWidgetEditor->setObjectName(QString::fromUtf8("qdesigner_internal__TableWidgetEditor"));
+ qdesigner_internal__TableWidgetEditor->setObjectName(QStringLiteral("qdesigner_internal__TableWidgetEditor"));
qdesigner_internal__TableWidgetEditor->resize(591, 455);
gridLayout_4 = new QGridLayout(qdesigner_internal__TableWidgetEditor);
- gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));
+ gridLayout_4->setObjectName(QStringLiteral("gridLayout_4"));
itemsBox = new QGroupBox(qdesigner_internal__TableWidgetEditor);
- itemsBox->setObjectName(QString::fromUtf8("itemsBox"));
+ itemsBox->setObjectName(QStringLiteral("itemsBox"));
gridLayout = new QGridLayout(itemsBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
tableWidget = new QTableWidget(itemsBox);
- tableWidget->setObjectName(QString::fromUtf8("tableWidget"));
+ tableWidget->setObjectName(QStringLiteral("tableWidget"));
gridLayout->addWidget(tableWidget, 0, 0, 1, 1);
horizontalLayout_5 = new QHBoxLayout();
- horizontalLayout_5->setObjectName(QString::fromUtf8("horizontalLayout_5"));
+ horizontalLayout_5->setObjectName(QStringLiteral("horizontalLayout_5"));
label_3 = new QLabel(itemsBox);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
horizontalLayout_5->addWidget(label_3);
itemIconSelector = new qdesigner_internal::IconSelector(itemsBox);
- itemIconSelector->setObjectName(QString::fromUtf8("itemIconSelector"));
+ itemIconSelector->setObjectName(QStringLiteral("itemIconSelector"));
horizontalLayout_5->addWidget(itemIconSelector);
@@ -156,14 +156,14 @@ public:
gridLayout_4->addWidget(itemsBox, 0, 0, 1, 1);
buttonBox = new QDialogButtonBox(qdesigner_internal__TableWidgetEditor);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
gridLayout_4->addWidget(buttonBox, 1, 0, 1, 2);
widget = new QWidget(qdesigner_internal__TableWidgetEditor);
- widget->setObjectName(QString::fromUtf8("widget"));
+ widget->setObjectName(QStringLiteral("widget"));
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -171,13 +171,13 @@ public:
widget->setSizePolicy(sizePolicy);
verticalLayout = new QVBoxLayout(widget);
verticalLayout->setContentsMargins(0, 0, 0, 0);
- verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
columnsBox = new QGroupBox(widget);
- columnsBox->setObjectName(QString::fromUtf8("columnsBox"));
+ columnsBox->setObjectName(QStringLiteral("columnsBox"));
gridLayout_2 = new QGridLayout(columnsBox);
- gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
+ gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
columnsListWidget = new QListWidget(columnsBox);
- columnsListWidget->setObjectName(QString::fromUtf8("columnsListWidget"));
+ columnsListWidget->setObjectName(QStringLiteral("columnsListWidget"));
QSizePolicy sizePolicy1(QSizePolicy::Ignored, QSizePolicy::Expanding);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -188,14 +188,14 @@ public:
gridLayout_2->addWidget(columnsListWidget, 0, 0, 1, 1);
horizontalLayout_3 = new QHBoxLayout();
- horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
+ horizontalLayout_3->setObjectName(QStringLiteral("horizontalLayout_3"));
newColumnButton = new QToolButton(columnsBox);
- newColumnButton->setObjectName(QString::fromUtf8("newColumnButton"));
+ newColumnButton->setObjectName(QStringLiteral("newColumnButton"));
horizontalLayout_3->addWidget(newColumnButton);
deleteColumnButton = new QToolButton(columnsBox);
- deleteColumnButton->setObjectName(QString::fromUtf8("deleteColumnButton"));
+ deleteColumnButton->setObjectName(QStringLiteral("deleteColumnButton"));
horizontalLayout_3->addWidget(deleteColumnButton);
@@ -204,12 +204,12 @@ public:
horizontalLayout_3->addItem(spacerItem);
moveColumnUpButton = new QToolButton(columnsBox);
- moveColumnUpButton->setObjectName(QString::fromUtf8("moveColumnUpButton"));
+ moveColumnUpButton->setObjectName(QStringLiteral("moveColumnUpButton"));
horizontalLayout_3->addWidget(moveColumnUpButton);
moveColumnDownButton = new QToolButton(columnsBox);
- moveColumnDownButton->setObjectName(QString::fromUtf8("moveColumnDownButton"));
+ moveColumnDownButton->setObjectName(QStringLiteral("moveColumnDownButton"));
horizontalLayout_3->addWidget(moveColumnDownButton);
@@ -217,14 +217,14 @@ public:
gridLayout_2->addLayout(horizontalLayout_3, 1, 0, 1, 1);
horizontalLayout_2 = new QHBoxLayout();
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
label = new QLabel(columnsBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
horizontalLayout_2->addWidget(label);
columnIconSelector = new qdesigner_internal::IconSelector(columnsBox);
- columnIconSelector->setObjectName(QString::fromUtf8("columnIconSelector"));
+ columnIconSelector->setObjectName(QStringLiteral("columnIconSelector"));
horizontalLayout_2->addWidget(columnIconSelector);
@@ -239,11 +239,11 @@ public:
verticalLayout->addWidget(columnsBox);
rowsBox = new QGroupBox(widget);
- rowsBox->setObjectName(QString::fromUtf8("rowsBox"));
+ rowsBox->setObjectName(QStringLiteral("rowsBox"));
gridLayout_3 = new QGridLayout(rowsBox);
- gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3"));
+ gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
rowsListWidget = new QListWidget(rowsBox);
- rowsListWidget->setObjectName(QString::fromUtf8("rowsListWidget"));
+ rowsListWidget->setObjectName(QStringLiteral("rowsListWidget"));
sizePolicy1.setHeightForWidth(rowsListWidget->sizePolicy().hasHeightForWidth());
rowsListWidget->setSizePolicy(sizePolicy1);
rowsListWidget->setFocusPolicy(Qt::TabFocus);
@@ -251,14 +251,14 @@ public:
gridLayout_3->addWidget(rowsListWidget, 0, 0, 1, 1);
horizontalLayout_4 = new QHBoxLayout();
- horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
+ horizontalLayout_4->setObjectName(QStringLiteral("horizontalLayout_4"));
newRowButton = new QToolButton(rowsBox);
- newRowButton->setObjectName(QString::fromUtf8("newRowButton"));
+ newRowButton->setObjectName(QStringLiteral("newRowButton"));
horizontalLayout_4->addWidget(newRowButton);
deleteRowButton = new QToolButton(rowsBox);
- deleteRowButton->setObjectName(QString::fromUtf8("deleteRowButton"));
+ deleteRowButton->setObjectName(QStringLiteral("deleteRowButton"));
horizontalLayout_4->addWidget(deleteRowButton);
@@ -267,12 +267,12 @@ public:
horizontalLayout_4->addItem(spacerItem2);
moveRowUpButton = new QToolButton(rowsBox);
- moveRowUpButton->setObjectName(QString::fromUtf8("moveRowUpButton"));
+ moveRowUpButton->setObjectName(QStringLiteral("moveRowUpButton"));
horizontalLayout_4->addWidget(moveRowUpButton);
moveRowDownButton = new QToolButton(rowsBox);
- moveRowDownButton->setObjectName(QString::fromUtf8("moveRowDownButton"));
+ moveRowDownButton->setObjectName(QStringLiteral("moveRowDownButton"));
horizontalLayout_4->addWidget(moveRowDownButton);
@@ -280,14 +280,14 @@ public:
gridLayout_3->addLayout(horizontalLayout_4, 1, 0, 1, 1);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
label_2 = new QLabel(rowsBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
horizontalLayout->addWidget(label_2);
rowIconSelector = new qdesigner_internal::IconSelector(rowsBox);
- rowIconSelector->setObjectName(QString::fromUtf8("rowIconSelector"));
+ rowIconSelector->setObjectName(QStringLiteral("rowIconSelector"));
horizontalLayout->addWidget(rowIconSelector);
diff --git a/tests/auto/tools/uic/baseline/tetrixwindow.ui.h b/tests/auto/tools/uic/baseline/tetrixwindow.ui.h
index 7d29265ba3..48d6a4e6a3 100644
--- a/tests/auto/tools/uic/baseline/tetrixwindow.ui.h
+++ b/tests/auto/tools/uic/baseline/tetrixwindow.ui.h
@@ -46,7 +46,7 @@ public:
void setupUi(QWidget *TetrixWindow)
{
if (TetrixWindow->objectName().isEmpty())
- TetrixWindow->setObjectName(QString::fromUtf8("TetrixWindow"));
+ TetrixWindow->setObjectName(QStringLiteral("TetrixWindow"));
TetrixWindow->resize(537, 475);
vboxLayout = new QVBoxLayout(TetrixWindow);
#ifndef Q_OS_MAC
@@ -55,7 +55,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
gridLayout = new QGridLayout();
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
@@ -63,39 +63,39 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(0, 0, 0, 0);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
startButton = new QPushButton(TetrixWindow);
- startButton->setObjectName(QString::fromUtf8("startButton"));
+ startButton->setObjectName(QStringLiteral("startButton"));
startButton->setFocusPolicy(Qt::NoFocus);
gridLayout->addWidget(startButton, 4, 0, 1, 1);
linesLcd = new QLCDNumber(TetrixWindow);
- linesLcd->setObjectName(QString::fromUtf8("linesLcd"));
+ linesLcd->setObjectName(QStringLiteral("linesLcd"));
linesLcd->setSegmentStyle(QLCDNumber::Filled);
gridLayout->addWidget(linesLcd, 3, 2, 1, 1);
linesRemovedLabel = new QLabel(TetrixWindow);
- linesRemovedLabel->setObjectName(QString::fromUtf8("linesRemovedLabel"));
+ linesRemovedLabel->setObjectName(QStringLiteral("linesRemovedLabel"));
linesRemovedLabel->setAlignment(Qt::AlignBottom|Qt::AlignHCenter);
gridLayout->addWidget(linesRemovedLabel, 2, 2, 1, 1);
pauseButton = new QPushButton(TetrixWindow);
- pauseButton->setObjectName(QString::fromUtf8("pauseButton"));
+ pauseButton->setObjectName(QStringLiteral("pauseButton"));
pauseButton->setFocusPolicy(Qt::NoFocus);
gridLayout->addWidget(pauseButton, 5, 2, 1, 1);
scoreLcd = new QLCDNumber(TetrixWindow);
- scoreLcd->setObjectName(QString::fromUtf8("scoreLcd"));
+ scoreLcd->setObjectName(QStringLiteral("scoreLcd"));
scoreLcd->setSegmentStyle(QLCDNumber::Filled);
gridLayout->addWidget(scoreLcd, 1, 2, 1, 1);
board = new TetrixBoard(TetrixWindow);
- board->setObjectName(QString::fromUtf8("board"));
+ board->setObjectName(QStringLiteral("board"));
board->setFocusPolicy(Qt::StrongFocus);
board->setFrameShape(QFrame::Panel);
board->setFrameShadow(QFrame::Sunken);
@@ -103,31 +103,31 @@ public:
gridLayout->addWidget(board, 0, 1, 6, 1);
levelLabel = new QLabel(TetrixWindow);
- levelLabel->setObjectName(QString::fromUtf8("levelLabel"));
+ levelLabel->setObjectName(QStringLiteral("levelLabel"));
levelLabel->setAlignment(Qt::AlignBottom|Qt::AlignHCenter);
gridLayout->addWidget(levelLabel, 2, 0, 1, 1);
nextLabel = new QLabel(TetrixWindow);
- nextLabel->setObjectName(QString::fromUtf8("nextLabel"));
+ nextLabel->setObjectName(QStringLiteral("nextLabel"));
nextLabel->setAlignment(Qt::AlignBottom|Qt::AlignHCenter);
gridLayout->addWidget(nextLabel, 0, 0, 1, 1);
levelLcd = new QLCDNumber(TetrixWindow);
- levelLcd->setObjectName(QString::fromUtf8("levelLcd"));
+ levelLcd->setObjectName(QStringLiteral("levelLcd"));
levelLcd->setSegmentStyle(QLCDNumber::Filled);
gridLayout->addWidget(levelLcd, 3, 0, 1, 1);
scoreLabel = new QLabel(TetrixWindow);
- scoreLabel->setObjectName(QString::fromUtf8("scoreLabel"));
+ scoreLabel->setObjectName(QStringLiteral("scoreLabel"));
scoreLabel->setAlignment(Qt::AlignBottom|Qt::AlignHCenter);
gridLayout->addWidget(scoreLabel, 0, 2, 1, 1);
nextPieceLabel = new QLabel(TetrixWindow);
- nextPieceLabel->setObjectName(QString::fromUtf8("nextPieceLabel"));
+ nextPieceLabel->setObjectName(QStringLiteral("nextPieceLabel"));
nextPieceLabel->setFrameShape(QFrame::Box);
nextPieceLabel->setFrameShadow(QFrame::Raised);
nextPieceLabel->setAlignment(Qt::AlignCenter);
@@ -135,7 +135,7 @@ public:
gridLayout->addWidget(nextPieceLabel, 1, 0, 1, 1);
quitButton = new QPushButton(TetrixWindow);
- quitButton->setObjectName(QString::fromUtf8("quitButton"));
+ quitButton->setObjectName(QStringLiteral("quitButton"));
quitButton->setFocusPolicy(Qt::NoFocus);
gridLayout->addWidget(quitButton, 4, 2, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/textfinder.ui.h b/tests/auto/tools/uic/baseline/textfinder.ui.h
index 4d6e57b3f9..9a5641c3de 100644
--- a/tests/auto/tools/uic/baseline/textfinder.ui.h
+++ b/tests/auto/tools/uic/baseline/textfinder.ui.h
@@ -40,7 +40,7 @@ public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
- Form->setObjectName(QString::fromUtf8("Form"));
+ Form->setObjectName(QStringLiteral("Form"));
Form->resize(378, 158);
vboxLayout = new QVBoxLayout(Form);
#ifndef Q_OS_MAC
@@ -49,7 +49,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
gridLayout = new QGridLayout();
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
@@ -57,19 +57,19 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(0, 0, 0, 0);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
lineEdit = new QLineEdit(Form);
- lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
+ lineEdit->setObjectName(QStringLiteral("lineEdit"));
gridLayout->addWidget(lineEdit, 0, 1, 1, 1);
searchLabel = new QLabel(Form);
- searchLabel->setObjectName(QString::fromUtf8("searchLabel"));
+ searchLabel->setObjectName(QStringLiteral("searchLabel"));
gridLayout->addWidget(searchLabel, 0, 0, 1, 1);
findButton = new QPushButton(Form);
- findButton->setObjectName(QString::fromUtf8("findButton"));
+ findButton->setObjectName(QStringLiteral("findButton"));
gridLayout->addWidget(findButton, 0, 2, 1, 1);
@@ -77,7 +77,7 @@ public:
vboxLayout->addLayout(gridLayout);
textEdit = new QTextEdit(Form);
- textEdit->setObjectName(QString::fromUtf8("textEdit"));
+ textEdit->setObjectName(QStringLiteral("textEdit"));
vboxLayout->addWidget(textEdit);
diff --git a/tests/auto/tools/uic/baseline/topicchooser.ui.h b/tests/auto/tools/uic/baseline/topicchooser.ui.h
index cf3186c1d9..3b16d5a627 100644
--- a/tests/auto/tools/uic/baseline/topicchooser.ui.h
+++ b/tests/auto/tools/uic/baseline/topicchooser.ui.h
@@ -41,7 +41,7 @@ public:
void setupUi(QDialog *TopicChooser)
{
if (TopicChooser->objectName().isEmpty())
- TopicChooser->setObjectName(QString::fromUtf8("TopicChooser"));
+ TopicChooser->setObjectName(QStringLiteral("TopicChooser"));
TopicChooser->resize(391, 223);
TopicChooser->setSizeGripEnabled(true);
vboxLayout = new QVBoxLayout(TopicChooser);
@@ -49,41 +49,41 @@ public:
vboxLayout->setSpacing(6);
#endif
vboxLayout->setContentsMargins(11, 11, 11, 11);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
- vboxLayout->setObjectName(QString::fromUtf8("unnamed"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("unnamed"));
label = new QLabel(TopicChooser);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
vboxLayout->addWidget(label);
listWidget = new QListWidget(TopicChooser);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
vboxLayout->addWidget(listWidget);
Layout16 = new QWidget(TopicChooser);
- Layout16->setObjectName(QString::fromUtf8("Layout16"));
+ Layout16->setObjectName(QStringLiteral("Layout16"));
hboxLayout = new QHBoxLayout(Layout16);
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
#endif
hboxLayout->setContentsMargins(0, 0, 0, 0);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
- hboxLayout->setObjectName(QString::fromUtf8("unnamed"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("unnamed"));
hboxLayout->setContentsMargins(0, 0, 0, 0);
Horizontal_Spacing2 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(Horizontal_Spacing2);
buttonDisplay = new QPushButton(Layout16);
- buttonDisplay->setObjectName(QString::fromUtf8("buttonDisplay"));
+ buttonDisplay->setObjectName(QStringLiteral("buttonDisplay"));
buttonDisplay->setAutoDefault(true);
buttonDisplay->setDefault(true);
hboxLayout->addWidget(buttonDisplay);
buttonCancel = new QPushButton(Layout16);
- buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+ buttonCancel->setObjectName(QStringLiteral("buttonCancel"));
buttonCancel->setAutoDefault(true);
hboxLayout->addWidget(buttonCancel);
diff --git a/tests/auto/tools/uic/baseline/translatedialog.ui.h b/tests/auto/tools/uic/baseline/translatedialog.ui.h
index 8ff12becc9..d811b13720 100644
--- a/tests/auto/tools/uic/baseline/translatedialog.ui.h
+++ b/tests/auto/tools/uic/baseline/translatedialog.ui.h
@@ -96,7 +96,7 @@ public:
void setupUi(QDialog *TranslateDialog)
{
if (TranslateDialog->objectName().isEmpty())
- TranslateDialog->setObjectName(QString::fromUtf8("TranslateDialog"));
+ TranslateDialog->setObjectName(QStringLiteral("TranslateDialog"));
TranslateDialog->resize(407, 145);
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
sizePolicy.setHorizontalStretch(0);
@@ -106,35 +106,35 @@ public:
hboxLayout = new QHBoxLayout(TranslateDialog);
hboxLayout->setSpacing(6);
hboxLayout->setContentsMargins(11, 11, 11, 11);
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
hboxLayout->setContentsMargins(9, 9, 9, 9);
vboxLayout = new QVBoxLayout();
vboxLayout->setSpacing(6);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
vboxLayout->setContentsMargins(0, 0, 0, 0);
gridLayout = new QGridLayout();
gridLayout->setSpacing(6);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
gridLayout->setHorizontalSpacing(6);
gridLayout->setVerticalSpacing(6);
gridLayout->setContentsMargins(0, 0, 0, 0);
ledTranslateTo = new QLineEdit(TranslateDialog);
- ledTranslateTo->setObjectName(QString::fromUtf8("ledTranslateTo"));
+ ledTranslateTo->setObjectName(QStringLiteral("ledTranslateTo"));
gridLayout->addWidget(ledTranslateTo, 1, 1, 1, 1);
findWhat = new QLabel(TranslateDialog);
- findWhat->setObjectName(QString::fromUtf8("findWhat"));
+ findWhat->setObjectName(QStringLiteral("findWhat"));
gridLayout->addWidget(findWhat, 0, 0, 1, 1);
translateTo = new QLabel(TranslateDialog);
- translateTo->setObjectName(QString::fromUtf8("translateTo"));
+ translateTo->setObjectName(QStringLiteral("translateTo"));
gridLayout->addWidget(translateTo, 1, 0, 1, 1);
ledFindWhat = new QLineEdit(TranslateDialog);
- ledFindWhat->setObjectName(QString::fromUtf8("ledFindWhat"));
+ ledFindWhat->setObjectName(QStringLiteral("ledFindWhat"));
gridLayout->addWidget(ledFindWhat, 0, 1, 1, 1);
@@ -142,18 +142,18 @@ public:
vboxLayout->addLayout(gridLayout);
groupBox = new QGroupBox(TranslateDialog);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
vboxLayout1 = new QVBoxLayout(groupBox);
vboxLayout1->setSpacing(6);
vboxLayout1->setContentsMargins(11, 11, 11, 11);
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
ckMatchCase = new QCheckBox(groupBox);
- ckMatchCase->setObjectName(QString::fromUtf8("ckMatchCase"));
+ ckMatchCase->setObjectName(QStringLiteral("ckMatchCase"));
vboxLayout1->addWidget(ckMatchCase);
ckMarkFinished = new QCheckBox(groupBox);
- ckMarkFinished->setObjectName(QString::fromUtf8("ckMarkFinished"));
+ ckMarkFinished->setObjectName(QStringLiteral("ckMarkFinished"));
vboxLayout1->addWidget(ckMarkFinished);
@@ -169,27 +169,27 @@ public:
vboxLayout2 = new QVBoxLayout();
vboxLayout2->setSpacing(6);
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
vboxLayout2->setContentsMargins(0, 0, 0, 0);
findNxt = new QPushButton(TranslateDialog);
- findNxt->setObjectName(QString::fromUtf8("findNxt"));
+ findNxt->setObjectName(QStringLiteral("findNxt"));
findNxt->setDefault(true);
findNxt->setFlat(false);
vboxLayout2->addWidget(findNxt);
translate = new QPushButton(TranslateDialog);
- translate->setObjectName(QString::fromUtf8("translate"));
+ translate->setObjectName(QStringLiteral("translate"));
vboxLayout2->addWidget(translate);
translateAll = new QPushButton(TranslateDialog);
- translateAll->setObjectName(QString::fromUtf8("translateAll"));
+ translateAll->setObjectName(QStringLiteral("translateAll"));
vboxLayout2->addWidget(translateAll);
cancel = new QPushButton(TranslateDialog);
- cancel->setObjectName(QString::fromUtf8("cancel"));
+ cancel->setObjectName(QStringLiteral("cancel"));
vboxLayout2->addWidget(cancel);
diff --git a/tests/auto/tools/uic/baseline/translationsettings.ui.h b/tests/auto/tools/uic/baseline/translationsettings.ui.h
index 770d43216b..22d764a67a 100644
--- a/tests/auto/tools/uic/baseline/translationsettings.ui.h
+++ b/tests/auto/tools/uic/baseline/translationsettings.ui.h
@@ -40,7 +40,7 @@ public:
void setupUi(QDialog *TranslationSettings)
{
if (TranslationSettings->objectName().isEmpty())
- TranslationSettings->setObjectName(QString::fromUtf8("TranslationSettings"));
+ TranslationSettings->setObjectName(QStringLiteral("TranslationSettings"));
TranslationSettings->resize(346, 125);
vboxLayout = new QVBoxLayout(TranslationSettings);
#ifndef Q_OS_MAC
@@ -49,9 +49,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
groupBox = new QGroupBox(TranslationSettings);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
gridLayout = new QGridLayout(groupBox);
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
@@ -59,24 +59,24 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(9, 9, 9, 9);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
cbLanguageList = new QComboBox(groupBox);
- cbLanguageList->setObjectName(QString::fromUtf8("cbLanguageList"));
+ cbLanguageList->setObjectName(QStringLiteral("cbLanguageList"));
gridLayout->addWidget(cbLanguageList, 0, 1, 1, 1);
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 0, 0, 1, 1);
cbCountryList = new QComboBox(groupBox);
- cbCountryList->setObjectName(QString::fromUtf8("cbCountryList"));
+ cbCountryList->setObjectName(QStringLiteral("cbCountryList"));
gridLayout->addWidget(cbCountryList, 1, 1, 1, 1);
lblCountry = new QLabel(groupBox);
- lblCountry->setObjectName(QString::fromUtf8("lblCountry"));
+ lblCountry->setObjectName(QStringLiteral("lblCountry"));
gridLayout->addWidget(lblCountry, 1, 0, 1, 1);
@@ -84,7 +84,7 @@ public:
vboxLayout->addWidget(groupBox);
buttonBox = new QDialogButtonBox(TranslationSettings);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/treewidgeteditor.ui.h b/tests/auto/tools/uic/baseline/treewidgeteditor.ui.h
index 843737fe59..3f94c2117e 100644
--- a/tests/auto/tools/uic/baseline/treewidgeteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/treewidgeteditor.ui.h
@@ -112,34 +112,34 @@ public:
void setupUi(QDialog *qdesigner_internal__TreeWidgetEditor)
{
if (qdesigner_internal__TreeWidgetEditor->objectName().isEmpty())
- qdesigner_internal__TreeWidgetEditor->setObjectName(QString::fromUtf8("qdesigner_internal__TreeWidgetEditor"));
+ qdesigner_internal__TreeWidgetEditor->setObjectName(QStringLiteral("qdesigner_internal__TreeWidgetEditor"));
qdesigner_internal__TreeWidgetEditor->resize(619, 321);
gridLayout_3 = new QGridLayout(qdesigner_internal__TreeWidgetEditor);
- gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3"));
+ gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
itemsBox = new QGroupBox(qdesigner_internal__TreeWidgetEditor);
- itemsBox->setObjectName(QString::fromUtf8("itemsBox"));
+ itemsBox->setObjectName(QStringLiteral("itemsBox"));
gridLayout = new QGridLayout(itemsBox);
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
treeWidget = new QTreeWidget(itemsBox);
- treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
+ treeWidget->setObjectName(QStringLiteral("treeWidget"));
treeWidget->setFocusPolicy(Qt::TabFocus);
gridLayout->addWidget(treeWidget, 0, 0, 1, 1);
horizontalLayout_4 = new QHBoxLayout();
- horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
+ horizontalLayout_4->setObjectName(QStringLiteral("horizontalLayout_4"));
newItemButton = new QToolButton(itemsBox);
- newItemButton->setObjectName(QString::fromUtf8("newItemButton"));
+ newItemButton->setObjectName(QStringLiteral("newItemButton"));
horizontalLayout_4->addWidget(newItemButton);
newSubItemButton = new QToolButton(itemsBox);
- newSubItemButton->setObjectName(QString::fromUtf8("newSubItemButton"));
+ newSubItemButton->setObjectName(QStringLiteral("newSubItemButton"));
horizontalLayout_4->addWidget(newSubItemButton);
deleteItemButton = new QToolButton(itemsBox);
- deleteItemButton->setObjectName(QString::fromUtf8("deleteItemButton"));
+ deleteItemButton->setObjectName(QStringLiteral("deleteItemButton"));
horizontalLayout_4->addWidget(deleteItemButton);
@@ -148,22 +148,22 @@ public:
horizontalLayout_4->addItem(spacerItem);
moveItemLeftButton = new QToolButton(itemsBox);
- moveItemLeftButton->setObjectName(QString::fromUtf8("moveItemLeftButton"));
+ moveItemLeftButton->setObjectName(QStringLiteral("moveItemLeftButton"));
horizontalLayout_4->addWidget(moveItemLeftButton);
moveItemRightButton = new QToolButton(itemsBox);
- moveItemRightButton->setObjectName(QString::fromUtf8("moveItemRightButton"));
+ moveItemRightButton->setObjectName(QStringLiteral("moveItemRightButton"));
horizontalLayout_4->addWidget(moveItemRightButton);
moveItemUpButton = new QToolButton(itemsBox);
- moveItemUpButton->setObjectName(QString::fromUtf8("moveItemUpButton"));
+ moveItemUpButton->setObjectName(QStringLiteral("moveItemUpButton"));
horizontalLayout_4->addWidget(moveItemUpButton);
moveItemDownButton = new QToolButton(itemsBox);
- moveItemDownButton->setObjectName(QString::fromUtf8("moveItemDownButton"));
+ moveItemDownButton->setObjectName(QStringLiteral("moveItemDownButton"));
horizontalLayout_4->addWidget(moveItemDownButton);
@@ -171,14 +171,14 @@ public:
gridLayout->addLayout(horizontalLayout_4, 1, 0, 1, 1);
horizontalLayout_2 = new QHBoxLayout();
- horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
label_2 = new QLabel(itemsBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
horizontalLayout_2->addWidget(label_2);
itemIconSelector = new qdesigner_internal::IconSelector(itemsBox);
- itemIconSelector->setObjectName(QString::fromUtf8("itemIconSelector"));
+ itemIconSelector->setObjectName(QStringLiteral("itemIconSelector"));
horizontalLayout_2->addWidget(itemIconSelector);
@@ -193,16 +193,16 @@ public:
gridLayout_3->addWidget(itemsBox, 0, 0, 1, 1);
columnsBox = new QGroupBox(qdesigner_internal__TreeWidgetEditor);
- columnsBox->setObjectName(QString::fromUtf8("columnsBox"));
+ columnsBox->setObjectName(QStringLiteral("columnsBox"));
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(columnsBox->sizePolicy().hasHeightForWidth());
columnsBox->setSizePolicy(sizePolicy);
gridLayout_2 = new QGridLayout(columnsBox);
- gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
+ gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
listWidget = new QListWidget(columnsBox);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
+ listWidget->setObjectName(QStringLiteral("listWidget"));
QSizePolicy sizePolicy1(QSizePolicy::Ignored, QSizePolicy::Expanding);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -213,14 +213,14 @@ public:
gridLayout_2->addWidget(listWidget, 0, 0, 1, 1);
horizontalLayout_3 = new QHBoxLayout();
- horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
+ horizontalLayout_3->setObjectName(QStringLiteral("horizontalLayout_3"));
newColumnButton = new QToolButton(columnsBox);
- newColumnButton->setObjectName(QString::fromUtf8("newColumnButton"));
+ newColumnButton->setObjectName(QStringLiteral("newColumnButton"));
horizontalLayout_3->addWidget(newColumnButton);
deleteColumnButton = new QToolButton(columnsBox);
- deleteColumnButton->setObjectName(QString::fromUtf8("deleteColumnButton"));
+ deleteColumnButton->setObjectName(QStringLiteral("deleteColumnButton"));
horizontalLayout_3->addWidget(deleteColumnButton);
@@ -229,12 +229,12 @@ public:
horizontalLayout_3->addItem(spacerItem1);
moveColumnUpButton = new QToolButton(columnsBox);
- moveColumnUpButton->setObjectName(QString::fromUtf8("moveColumnUpButton"));
+ moveColumnUpButton->setObjectName(QStringLiteral("moveColumnUpButton"));
horizontalLayout_3->addWidget(moveColumnUpButton);
moveColumnDownButton = new QToolButton(columnsBox);
- moveColumnDownButton->setObjectName(QString::fromUtf8("moveColumnDownButton"));
+ moveColumnDownButton->setObjectName(QStringLiteral("moveColumnDownButton"));
horizontalLayout_3->addWidget(moveColumnDownButton);
@@ -242,14 +242,14 @@ public:
gridLayout_2->addLayout(horizontalLayout_3, 1, 0, 1, 1);
horizontalLayout = new QHBoxLayout();
- horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
label = new QLabel(columnsBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
horizontalLayout->addWidget(label);
columnIconSelector = new qdesigner_internal::IconSelector(columnsBox);
- columnIconSelector->setObjectName(QString::fromUtf8("columnIconSelector"));
+ columnIconSelector->setObjectName(QStringLiteral("columnIconSelector"));
horizontalLayout->addWidget(columnIconSelector);
@@ -264,7 +264,7 @@ public:
gridLayout_3->addWidget(columnsBox, 0, 1, 1, 1);
buttonBox = new QDialogButtonBox(qdesigner_internal__TreeWidgetEditor);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
diff --git a/tests/auto/tools/uic/baseline/trpreviewtool.ui.h b/tests/auto/tools/uic/baseline/trpreviewtool.ui.h
index a26ff1c828..6a705ad455 100644
--- a/tests/auto/tools/uic/baseline/trpreviewtool.ui.h
+++ b/tests/auto/tools/uic/baseline/trpreviewtool.ui.h
@@ -95,58 +95,58 @@ public:
void setupUi(QMainWindow *TrPreviewToolClass)
{
if (TrPreviewToolClass->objectName().isEmpty())
- TrPreviewToolClass->setObjectName(QString::fromUtf8("TrPreviewToolClass"));
+ TrPreviewToolClass->setObjectName(QStringLiteral("TrPreviewToolClass"));
TrPreviewToolClass->resize(593, 466);
actionOpenForm = new QAction(TrPreviewToolClass);
- actionOpenForm->setObjectName(QString::fromUtf8("actionOpenForm"));
+ actionOpenForm->setObjectName(QStringLiteral("actionOpenForm"));
const QIcon icon = QIcon(QString::fromUtf8(":/images/open_form.png"));
actionOpenForm->setIcon(icon);
actionLoadTranslation = new QAction(TrPreviewToolClass);
- actionLoadTranslation->setObjectName(QString::fromUtf8("actionLoadTranslation"));
+ actionLoadTranslation->setObjectName(QStringLiteral("actionLoadTranslation"));
const QIcon icon1 = QIcon(QString::fromUtf8(":/images/load_translation.png"));
actionLoadTranslation->setIcon(icon1);
actionReloadTranslations = new QAction(TrPreviewToolClass);
- actionReloadTranslations->setObjectName(QString::fromUtf8("actionReloadTranslations"));
+ actionReloadTranslations->setObjectName(QStringLiteral("actionReloadTranslations"));
const QIcon icon2 = QIcon(QString::fromUtf8(":/images/reload_translations.png"));
actionReloadTranslations->setIcon(icon2);
actionClose = new QAction(TrPreviewToolClass);
- actionClose->setObjectName(QString::fromUtf8("actionClose"));
+ actionClose->setObjectName(QStringLiteral("actionClose"));
actionAbout = new QAction(TrPreviewToolClass);
- actionAbout->setObjectName(QString::fromUtf8("actionAbout"));
+ actionAbout->setObjectName(QStringLiteral("actionAbout"));
actionAbout_Qt = new QAction(TrPreviewToolClass);
- actionAbout_Qt->setObjectName(QString::fromUtf8("actionAbout_Qt"));
+ actionAbout_Qt->setObjectName(QStringLiteral("actionAbout_Qt"));
centralWidget = new QWidget(TrPreviewToolClass);
- centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+ centralWidget->setObjectName(QStringLiteral("centralWidget"));
TrPreviewToolClass->setCentralWidget(centralWidget);
menuBar = new QMenuBar(TrPreviewToolClass);
- menuBar->setObjectName(QString::fromUtf8("menuBar"));
+ menuBar->setObjectName(QStringLiteral("menuBar"));
menuBar->setGeometry(QRect(0, 0, 593, 21));
menuView = new QMenu(menuBar);
- menuView->setObjectName(QString::fromUtf8("menuView"));
+ menuView->setObjectName(QStringLiteral("menuView"));
menuViewViews = new QMenu(menuView);
- menuViewViews->setObjectName(QString::fromUtf8("menuViewViews"));
+ menuViewViews->setObjectName(QStringLiteral("menuViewViews"));
menuHelp = new QMenu(menuBar);
- menuHelp->setObjectName(QString::fromUtf8("menuHelp"));
+ menuHelp->setObjectName(QStringLiteral("menuHelp"));
menuFile = new QMenu(menuBar);
- menuFile->setObjectName(QString::fromUtf8("menuFile"));
+ menuFile->setObjectName(QStringLiteral("menuFile"));
TrPreviewToolClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(TrPreviewToolClass);
- mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
+ mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
mainToolBar->setOrientation(Qt::Horizontal);
TrPreviewToolClass->addToolBar(static_cast<Qt::ToolBarArea>(4), mainToolBar);
statusBar = new QStatusBar(TrPreviewToolClass);
- statusBar->setObjectName(QString::fromUtf8("statusBar"));
+ statusBar->setObjectName(QStringLiteral("statusBar"));
TrPreviewToolClass->setStatusBar(statusBar);
dwForms = new QDockWidget(TrPreviewToolClass);
- dwForms->setObjectName(QString::fromUtf8("dwForms"));
+ dwForms->setObjectName(QStringLiteral("dwForms"));
dockWidgetContents = new QWidget();
- dockWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents"));
+ dockWidgetContents->setObjectName(QStringLiteral("dockWidgetContents"));
vboxLayout = new QVBoxLayout(dockWidgetContents);
vboxLayout->setSpacing(0);
vboxLayout->setContentsMargins(0, 0, 0, 0);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
viewForms = new QListView(dockWidgetContents);
- viewForms->setObjectName(QString::fromUtf8("viewForms"));
+ viewForms->setObjectName(QStringLiteral("viewForms"));
viewForms->setEditTriggers(QAbstractItemView::NoEditTriggers);
viewForms->setAlternatingRowColors(true);
viewForms->setUniformItemSizes(true);
diff --git a/tests/auto/tools/uic/baseline/validators.ui.h b/tests/auto/tools/uic/baseline/validators.ui.h
index 12b8ff09f3..374f547cc6 100644
--- a/tests/auto/tools/uic/baseline/validators.ui.h
+++ b/tests/auto/tools/uic/baseline/validators.ui.h
@@ -80,7 +80,7 @@ public:
void setupUi(QWidget *ValidatorsForm)
{
if (ValidatorsForm->objectName().isEmpty())
- ValidatorsForm->setObjectName(QString::fromUtf8("ValidatorsForm"));
+ ValidatorsForm->setObjectName(QStringLiteral("ValidatorsForm"));
ValidatorsForm->resize(526, 668);
vboxLayout = new QVBoxLayout(ValidatorsForm);
#ifndef Q_OS_MAC
@@ -89,7 +89,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
hboxLayout = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout->setSpacing(6);
@@ -97,9 +97,9 @@ public:
#ifndef Q_OS_MAC
hboxLayout->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
localeSelector = new LocaleSelector(ValidatorsForm);
- localeSelector->setObjectName(QString::fromUtf8("localeSelector"));
+ localeSelector->setObjectName(QStringLiteral("localeSelector"));
hboxLayout->addWidget(localeSelector);
@@ -111,7 +111,7 @@ public:
vboxLayout->addLayout(hboxLayout);
groupBox = new QGroupBox(ValidatorsForm);
- groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setObjectName(QStringLiteral("groupBox"));
vboxLayout1 = new QVBoxLayout(groupBox);
#ifndef Q_OS_MAC
vboxLayout1->setSpacing(6);
@@ -119,7 +119,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout1->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ vboxLayout1->setObjectName(QStringLiteral("vboxLayout1"));
hboxLayout1 = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout1->setSpacing(6);
@@ -127,7 +127,7 @@ public:
#ifndef Q_OS_MAC
hboxLayout1->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ hboxLayout1->setObjectName(QStringLiteral("hboxLayout1"));
gridLayout = new QGridLayout();
#ifndef Q_OS_MAC
gridLayout->setSpacing(6);
@@ -135,15 +135,15 @@ public:
#ifndef Q_OS_MAC
gridLayout->setContentsMargins(0, 0, 0, 0);
#endif
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label = new QLabel(groupBox);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
label->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
gridLayout->addWidget(label, 0, 0, 1, 1);
minVal = new QSpinBox(groupBox);
- minVal->setObjectName(QString::fromUtf8("minVal"));
+ minVal->setObjectName(QStringLiteral("minVal"));
QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(1);
sizePolicy.setVerticalStretch(0);
@@ -155,13 +155,13 @@ public:
gridLayout->addWidget(minVal, 0, 1, 1, 1);
label_2 = new QLabel(groupBox);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
label_2->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
gridLayout->addWidget(label_2, 1, 0, 1, 1);
maxVal = new QSpinBox(groupBox);
- maxVal->setObjectName(QString::fromUtf8("maxVal"));
+ maxVal->setObjectName(QStringLiteral("maxVal"));
sizePolicy.setHeightForWidth(maxVal->sizePolicy().hasHeightForWidth());
maxVal->setSizePolicy(sizePolicy);
maxVal->setMinimum(-1000000);
@@ -174,7 +174,7 @@ public:
hboxLayout1->addLayout(gridLayout);
frame = new QFrame(groupBox);
- frame->setObjectName(QString::fromUtf8("frame"));
+ frame->setObjectName(QStringLiteral("frame"));
frame->setFrameShape(QFrame::StyledPanel);
frame->setFrameShadow(QFrame::Sunken);
vboxLayout2 = new QVBoxLayout(frame);
@@ -184,9 +184,9 @@ public:
#ifndef Q_OS_MAC
vboxLayout2->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ vboxLayout2->setObjectName(QStringLiteral("vboxLayout2"));
ledWidget = new LEDWidget(frame);
- ledWidget->setObjectName(QString::fromUtf8("ledWidget"));
+ ledWidget->setObjectName(QStringLiteral("ledWidget"));
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Fixed);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
@@ -198,7 +198,7 @@ public:
vboxLayout2->addWidget(ledWidget);
label_7 = new QLabel(frame);
- label_7->setObjectName(QString::fromUtf8("label_7"));
+ label_7->setObjectName(QStringLiteral("label_7"));
vboxLayout2->addWidget(label_7);
@@ -213,7 +213,7 @@ public:
vboxLayout1->addItem(spacerItem1);
editor = new QLineEdit(groupBox);
- editor->setObjectName(QString::fromUtf8("editor"));
+ editor->setObjectName(QStringLiteral("editor"));
vboxLayout1->addWidget(editor);
@@ -221,7 +221,7 @@ public:
vboxLayout->addWidget(groupBox);
groupBox_2 = new QGroupBox(ValidatorsForm);
- groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
vboxLayout3 = new QVBoxLayout(groupBox_2);
#ifndef Q_OS_MAC
vboxLayout3->setSpacing(6);
@@ -229,7 +229,7 @@ public:
#ifndef Q_OS_MAC
vboxLayout3->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout3->setObjectName(QString::fromUtf8("vboxLayout3"));
+ vboxLayout3->setObjectName(QStringLiteral("vboxLayout3"));
hboxLayout2 = new QHBoxLayout();
#ifndef Q_OS_MAC
hboxLayout2->setSpacing(6);
@@ -237,7 +237,7 @@ public:
#ifndef Q_OS_MAC
hboxLayout2->setContentsMargins(0, 0, 0, 0);
#endif
- hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ hboxLayout2->setObjectName(QStringLiteral("hboxLayout2"));
gridLayout1 = new QGridLayout();
#ifndef Q_OS_MAC
gridLayout1->setSpacing(6);
@@ -245,15 +245,15 @@ public:
#ifndef Q_OS_MAC
gridLayout1->setContentsMargins(0, 0, 0, 0);
#endif
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
label_3 = new QLabel(groupBox_2);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
label_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
gridLayout1->addWidget(label_3, 0, 0, 1, 1);
doubleMinVal = new QDoubleSpinBox(groupBox_2);
- doubleMinVal->setObjectName(QString::fromUtf8("doubleMinVal"));
+ doubleMinVal->setObjectName(QStringLiteral("doubleMinVal"));
sizePolicy.setHeightForWidth(doubleMinVal->sizePolicy().hasHeightForWidth());
doubleMinVal->setSizePolicy(sizePolicy);
doubleMinVal->setMinimum(-100000);
@@ -263,24 +263,24 @@ public:
gridLayout1->addWidget(doubleMinVal, 0, 1, 1, 1);
label_5 = new QLabel(groupBox_2);
- label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setObjectName(QStringLiteral("label_5"));
label_5->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
gridLayout1->addWidget(label_5, 0, 2, 1, 1);
doubleFormat = new QComboBox(groupBox_2);
- doubleFormat->setObjectName(QString::fromUtf8("doubleFormat"));
+ doubleFormat->setObjectName(QStringLiteral("doubleFormat"));
gridLayout1->addWidget(doubleFormat, 0, 3, 1, 1);
label_4 = new QLabel(groupBox_2);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
label_4->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
gridLayout1->addWidget(label_4, 1, 0, 1, 1);
doubleMaxVal = new QDoubleSpinBox(groupBox_2);
- doubleMaxVal->setObjectName(QString::fromUtf8("doubleMaxVal"));
+ doubleMaxVal->setObjectName(QStringLiteral("doubleMaxVal"));
sizePolicy.setHeightForWidth(doubleMaxVal->sizePolicy().hasHeightForWidth());
doubleMaxVal->setSizePolicy(sizePolicy);
doubleMaxVal->setMinimum(-100000);
@@ -290,13 +290,13 @@ public:
gridLayout1->addWidget(doubleMaxVal, 1, 1, 1, 1);
label_6 = new QLabel(groupBox_2);
- label_6->setObjectName(QString::fromUtf8("label_6"));
+ label_6->setObjectName(QStringLiteral("label_6"));
label_6->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
gridLayout1->addWidget(label_6, 1, 2, 1, 1);
doubleDecimals = new QSpinBox(groupBox_2);
- doubleDecimals->setObjectName(QString::fromUtf8("doubleDecimals"));
+ doubleDecimals->setObjectName(QStringLiteral("doubleDecimals"));
doubleDecimals->setValue(2);
gridLayout1->addWidget(doubleDecimals, 1, 3, 1, 1);
@@ -305,7 +305,7 @@ public:
hboxLayout2->addLayout(gridLayout1);
frame_2 = new QFrame(groupBox_2);
- frame_2->setObjectName(QString::fromUtf8("frame_2"));
+ frame_2->setObjectName(QStringLiteral("frame_2"));
frame_2->setFrameShape(QFrame::StyledPanel);
frame_2->setFrameShadow(QFrame::Sunken);
vboxLayout4 = new QVBoxLayout(frame_2);
@@ -315,16 +315,16 @@ public:
#ifndef Q_OS_MAC
vboxLayout4->setContentsMargins(9, 9, 9, 9);
#endif
- vboxLayout4->setObjectName(QString::fromUtf8("vboxLayout4"));
+ vboxLayout4->setObjectName(QStringLiteral("vboxLayout4"));
doubleLedWidget = new LEDWidget(frame_2);
- doubleLedWidget->setObjectName(QString::fromUtf8("doubleLedWidget"));
+ doubleLedWidget->setObjectName(QStringLiteral("doubleLedWidget"));
doubleLedWidget->setPixmap(QPixmap(QString::fromUtf8(":/ledoff.png")));
doubleLedWidget->setAlignment(Qt::AlignCenter);
vboxLayout4->addWidget(doubleLedWidget);
label_8 = new QLabel(frame_2);
- label_8->setObjectName(QString::fromUtf8("label_8"));
+ label_8->setObjectName(QStringLiteral("label_8"));
vboxLayout4->addWidget(label_8);
@@ -339,7 +339,7 @@ public:
vboxLayout3->addItem(spacerItem2);
doubleEditor = new QLineEdit(groupBox_2);
- doubleEditor->setObjectName(QString::fromUtf8("doubleEditor"));
+ doubleEditor->setObjectName(QStringLiteral("doubleEditor"));
vboxLayout3->addWidget(doubleEditor);
@@ -355,13 +355,13 @@ public:
hboxLayout3->setSpacing(6);
#endif
hboxLayout3->setContentsMargins(0, 0, 0, 0);
- hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3"));
+ hboxLayout3->setObjectName(QStringLiteral("hboxLayout3"));
spacerItem4 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout3->addItem(spacerItem4);
pushButton = new QPushButton(ValidatorsForm);
- pushButton->setObjectName(QString::fromUtf8("pushButton"));
+ pushButton->setObjectName(QStringLiteral("pushButton"));
hboxLayout3->addWidget(pushButton);
diff --git a/tests/auto/tools/uic/baseline/wateringconfigdialog.ui.h b/tests/auto/tools/uic/baseline/wateringconfigdialog.ui.h
index 1a17d16efe..f03ac32151 100644
--- a/tests/auto/tools/uic/baseline/wateringconfigdialog.ui.h
+++ b/tests/auto/tools/uic/baseline/wateringconfigdialog.ui.h
@@ -68,19 +68,19 @@ public:
void setupUi(QDialog *WateringConfigDialog)
{
if (WateringConfigDialog->objectName().isEmpty())
- WateringConfigDialog->setObjectName(QString::fromUtf8("WateringConfigDialog"));
+ WateringConfigDialog->setObjectName(QStringLiteral("WateringConfigDialog"));
WateringConfigDialog->resize(334, 550);
vboxLayout = new QVBoxLayout(WateringConfigDialog);
- vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
gridLayout = new QGridLayout();
- gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ gridLayout->setObjectName(QStringLiteral("gridLayout"));
label_3 = new QLabel(WateringConfigDialog);
- label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setObjectName(QStringLiteral("label_3"));
gridLayout->addWidget(label_3, 0, 0, 1, 1);
plantComboBox = new QComboBox(WateringConfigDialog);
- plantComboBox->setObjectName(QString::fromUtf8("plantComboBox"));
+ plantComboBox->setObjectName(QStringLiteral("plantComboBox"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
@@ -94,12 +94,12 @@ public:
gridLayout->addItem(spacerItem, 1, 0, 1, 1);
label_2 = new QLabel(WateringConfigDialog);
- label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setObjectName(QStringLiteral("label_2"));
gridLayout->addWidget(label_2, 2, 0, 1, 1);
temperatureCheckBox = new QCheckBox(WateringConfigDialog);
- temperatureCheckBox->setObjectName(QString::fromUtf8("temperatureCheckBox"));
+ temperatureCheckBox->setObjectName(QStringLiteral("temperatureCheckBox"));
gridLayout->addWidget(temperatureCheckBox, 3, 1, 1, 3);
@@ -108,7 +108,7 @@ public:
gridLayout->addItem(spacerItem1, 4, 1, 1, 1);
temperatureSpinBox = new QSpinBox(WateringConfigDialog);
- temperatureSpinBox->setObjectName(QString::fromUtf8("temperatureSpinBox"));
+ temperatureSpinBox->setObjectName(QStringLiteral("temperatureSpinBox"));
temperatureSpinBox->setEnabled(false);
temperatureSpinBox->setMinimum(10);
temperatureSpinBox->setMaximum(60);
@@ -121,7 +121,7 @@ public:
gridLayout->addItem(spacerItem2, 4, 3, 1, 1);
rainCheckBox = new QCheckBox(WateringConfigDialog);
- rainCheckBox->setObjectName(QString::fromUtf8("rainCheckBox"));
+ rainCheckBox->setObjectName(QStringLiteral("rainCheckBox"));
gridLayout->addWidget(rainCheckBox, 5, 1, 1, 3);
@@ -130,7 +130,7 @@ public:
gridLayout->addItem(spacerItem3, 6, 1, 1, 1);
rainSpinBox = new QSpinBox(WateringConfigDialog);
- rainSpinBox->setObjectName(QString::fromUtf8("rainSpinBox"));
+ rainSpinBox->setObjectName(QStringLiteral("rainSpinBox"));
rainSpinBox->setEnabled(false);
rainSpinBox->setMinimum(1);
@@ -145,22 +145,22 @@ public:
gridLayout->addItem(spacerItem5, 7, 2, 1, 1);
label = new QLabel(WateringConfigDialog);
- label->setObjectName(QString::fromUtf8("label"));
+ label->setObjectName(QStringLiteral("label"));
gridLayout->addWidget(label, 8, 0, 1, 1);
startTimeEdit = new QTimeEdit(WateringConfigDialog);
- startTimeEdit->setObjectName(QString::fromUtf8("startTimeEdit"));
+ startTimeEdit->setObjectName(QStringLiteral("startTimeEdit"));
gridLayout->addWidget(startTimeEdit, 8, 1, 1, 3);
label_4 = new QLabel(WateringConfigDialog);
- label_4->setObjectName(QString::fromUtf8("label_4"));
+ label_4->setObjectName(QStringLiteral("label_4"));
gridLayout->addWidget(label_4, 9, 0, 1, 1);
amountSpinBox = new QSpinBox(WateringConfigDialog);
- amountSpinBox->setObjectName(QString::fromUtf8("amountSpinBox"));
+ amountSpinBox->setObjectName(QStringLiteral("amountSpinBox"));
amountSpinBox->setMinimum(100);
amountSpinBox->setMaximum(10000);
amountSpinBox->setSingleStep(100);
@@ -169,22 +169,22 @@ public:
gridLayout->addWidget(amountSpinBox, 9, 1, 1, 3);
label_5 = new QLabel(WateringConfigDialog);
- label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setObjectName(QStringLiteral("label_5"));
gridLayout->addWidget(label_5, 10, 0, 1, 1);
sourceComboBox = new QComboBox(WateringConfigDialog);
- sourceComboBox->setObjectName(QString::fromUtf8("sourceComboBox"));
+ sourceComboBox->setObjectName(QStringLiteral("sourceComboBox"));
gridLayout->addWidget(sourceComboBox, 10, 1, 1, 3);
label_6 = new QLabel(WateringConfigDialog);
- label_6->setObjectName(QString::fromUtf8("label_6"));
+ label_6->setObjectName(QStringLiteral("label_6"));
gridLayout->addWidget(label_6, 11, 0, 1, 1);
filterCheckBox = new QCheckBox(WateringConfigDialog);
- filterCheckBox->setObjectName(QString::fromUtf8("filterCheckBox"));
+ filterCheckBox->setObjectName(QStringLiteral("filterCheckBox"));
gridLayout->addWidget(filterCheckBox, 11, 1, 1, 2);
@@ -200,18 +200,18 @@ public:
vboxLayout->addLayout(gridLayout);
gridLayout1 = new QGridLayout();
- gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ gridLayout1->setObjectName(QStringLiteral("gridLayout1"));
spacerItem8 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout1->addItem(spacerItem8, 0, 1, 1, 1);
helpBrowser = new HelpBrowser(WateringConfigDialog);
- helpBrowser->setObjectName(QString::fromUtf8("helpBrowser"));
+ helpBrowser->setObjectName(QStringLiteral("helpBrowser"));
gridLayout1->addWidget(helpBrowser, 1, 0, 1, 2);
helpLabel = new QLabel(WateringConfigDialog);
- helpLabel->setObjectName(QString::fromUtf8("helpLabel"));
+ helpLabel->setObjectName(QStringLiteral("helpLabel"));
gridLayout1->addWidget(helpLabel, 0, 0, 1, 1);
@@ -219,14 +219,14 @@ public:
vboxLayout->addLayout(gridLayout1);
line = new QFrame(WateringConfigDialog);
- line->setObjectName(QString::fromUtf8("line"));
+ line->setObjectName(QStringLiteral("line"));
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
vboxLayout->addWidget(line);
buttonBox = new QDialogButtonBox(WateringConfigDialog);
- buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
diff --git a/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp b/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp
index 31fab971a0..ff34b009e9 100644
--- a/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp
+++ b/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp
@@ -100,6 +100,9 @@ tst_QColorDialog::~tst_QColorDialog()
void tst_QColorDialog::native_activeModalWidget()
{
+#ifdef Q_OS_MAC
+ QSKIP("Test hangs on Mac OS X, see QTBUG-24320");
+#endif
// Check that QApplication::activeModalWidget retruns the
// color dialog when it is executing, even when using a native
// dialog:
@@ -153,6 +156,9 @@ void tst_QColorDialog::task247349_alpha()
dialog.setOption(QColorDialog::ShowAlphaChannel, true);
int alpha = 0x17;
dialog.setCurrentColor(QColor(0x01, 0x02, 0x03, alpha));
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "Fails on Mac OS X, see QTBUG-24320", Abort);
+#endif
QCOMPARE(alpha, dialog.currentColor().alpha());
QCOMPARE(alpha, qAlpha(dialog.currentColor().rgba()));
}
diff --git a/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp b/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp
index b332fb40f8..e46d905022 100644
--- a/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp
+++ b/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp
@@ -440,7 +440,7 @@ public slots:
void tst_QDialog::throwInExec()
{
-#if defined(Q_OS_MAC) || (defined(Q_WS_WINCE) && defined(_ARM_))
+#if defined(Q_OS_MAC) || (defined(Q_OS_WINCE) && defined(_ARM_))
QSKIP("Throwing exceptions in exec() is not supported on this platform.");
#endif
#if defined(Q_OS_LINUX)
diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
index 472469e797..7ab3100cab 100644
--- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
@@ -559,9 +559,39 @@ void tst_QFileDialog2::completionOnLevelAfterRoot()
{
QNonNativeFileDialog fd;
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- fd.setDirectory("C:");
+ fd.setDirectory("C:/");
QDir current = fd.directory();
- current.mkdir("completionOnLevelAfterRootTest");
+ QStringList entryList = current.entryList(QStringList(), QDir::Dirs);
+ // Find a suitable test dir under c:-root:
+ // - At least 6 characters long
+ // - Ascii, letters only
+ // - No another dir with same start
+ QString testDir;
+ foreach (const QString &entry, entryList) {
+ if (entry.size() > 5 && QString(entry.toAscii()).compare(entry) == 0) {
+ bool invalid = false;
+ for (int i = 0; i < 5; i++) {
+ if (!entry.at(i).isLetter()) {
+ invalid = true;
+ break;
+ }
+ }
+ if (!invalid) {
+ foreach (const QString &check, entryList) {
+ if (check.startsWith(entry.left(5)) && check != entry) {
+ invalid = true;
+ break;
+ }
+ }
+ }
+ if (!invalid) {
+ testDir = entry;
+ break;
+ }
+ }
+ }
+ if (testDir.isEmpty())
+ QSKIP("This test requires to have an unique directory of at least six ascii characters under c:/");
#else
fd.setFilter(QDir::Hidden | QDir::AllDirs | QDir::Files | QDir::System);
fd.setDirectory("/");
@@ -574,11 +604,8 @@ void tst_QFileDialog2::completionOnLevelAfterRoot()
QTest::qWait(2000);
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
//I love testlib :D
- QTest::keyClick(edit, Qt::Key_C);
- QTest::keyClick(edit, Qt::Key_O);
- QTest::keyClick(edit, Qt::Key_M);
- QTest::keyClick(edit, Qt::Key_P);
- QTest::keyClick(edit, Qt::Key_L);
+ for (int i = 0; i < 5; i++)
+ QTest::keyClick(edit, testDir.at(i).toLower().toAscii() - 'a' + Qt::Key_A);
#else
QTest::keyClick(edit, Qt::Key_E);
QTest::keyClick(edit, Qt::Key_T);
@@ -587,8 +614,7 @@ void tst_QFileDialog2::completionOnLevelAfterRoot()
QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
QTest::qWait(200);
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- QCOMPARE(edit->text(), QString("completionOnLevelAfterRootTest"));
- current.rmdir("completionOnLevelAfterRootTest");
+ QCOMPARE(edit->text(), testDir);
#else
QTRY_COMPARE(edit->text(), QString("etc"));
#endif
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro b/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro
index 166306757c..6e08e2d02b 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro
@@ -5,3 +5,5 @@ QT += core-private gui testlib
SOURCES += tst_qfilesystemmodel.cpp
TARGET = tst_qfilesystemmodel
+
+win32:CONFIG += insignificant_test # QTBUG-24291
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
index ea4eed54d2..8724bf63c8 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -240,6 +240,9 @@ void tst_QFileSystemModel::naturalCompare_data()
QTest::addColumn<int>("caseSensitive");
QTest::addColumn<int>("result");
QTest::addColumn<int>("swap");
+
+#define ROWNAME(name) (qPrintable(QString("prefix=%1, postfix=%2, num=%3, i=%4, test=%5").arg(prefix).arg(postfix).arg(num).arg(i).arg(name)))
+
for (int j = 0; j < 4; ++j) { // <- set a prefix and a postfix string (not numbers)
QString prefix = (j == 0 || j == 1) ? "b" : "";
QString postfix = (j == 1 || j == 2) ? "y" : "";
@@ -248,32 +251,33 @@ void tst_QFileSystemModel::naturalCompare_data()
QString num = QString("%1").arg(k);
QString nump = QString("%1").arg(k + 1);
for (int i = 10; i < 12; ++i) { // <- swap s1 and s2 and reverse the result
- QTest::newRow("basic") << prefix + "0" + postfix << prefix + "0" + postfix << int(Qt::CaseInsensitive) << 0;
+ QTest::newRow(ROWNAME("basic")) << prefix + "0" + postfix << prefix + "0" + postfix << int(Qt::CaseInsensitive) << 0;
// s1 should always be less then s2
- QTest::newRow("just text") << prefix + "fred" + postfix << prefix + "jane" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("just numbers") << prefix + num + postfix << prefix + "9" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("zero") << prefix + num + postfix << prefix + "0" + nump + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("space b") << prefix + num + postfix << prefix + " " + nump + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("space a") << prefix + num + postfix << prefix + nump + " " + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("tab b") << prefix + num + postfix << prefix + " " + nump + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("tab a") << prefix + num + postfix << prefix + nump + " " + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("10 vs 2") << prefix + num + postfix << prefix + "10" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("diff len") << prefix + num + postfix << prefix + nump + postfix + "x" << int(Qt::CaseInsensitive) << i;
- QTest::newRow("01 before 1") << prefix + "0" + num + postfix << prefix + nump + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums 2nd") << prefix + "1-" + num + postfix << prefix + "1-" + nump + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums 2nd") << prefix + "10-" + num + postfix<< prefix + "10-10" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums 2nd") << prefix + "10-0"+ num + postfix<< prefix + "10-10" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums 2nd") << prefix + "10-" + num + postfix<< prefix + "10-010" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums big") << prefix + "10-" + num + postfix<< prefix + "20-0" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums big") << prefix + "2-" + num + postfix << prefix + "10-0" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul alphabet") << prefix + num + "-a" + postfix << prefix + num + "-c" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul alphabet2")<< prefix + num + "-a9" + postfix<< prefix + num + "-c0" + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("mul nums w\\0")<< prefix + num + "-"+ num + postfix<< prefix + num+"-0"+nump + postfix << int(Qt::CaseInsensitive) << i;
- QTest::newRow("num first") << prefix + num + postfix << prefix + "a" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("just text")) << prefix + "fred" + postfix << prefix + "jane" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("just numbers")) << prefix + num + postfix << prefix + "9" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("zero")) << prefix + num + postfix << prefix + "0" + nump + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("space b")) << prefix + num + postfix << prefix + " " + nump + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("space a")) << prefix + num + postfix << prefix + nump + " " + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("tab b")) << prefix + num + postfix << prefix + " " + nump + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("tab a")) << prefix + num + postfix << prefix + nump + " " + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("10 vs 2")) << prefix + num + postfix << prefix + "10" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("diff len")) << prefix + num + postfix << prefix + nump + postfix + "x" << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("01 before 1")) << prefix + "0" + num + postfix << prefix + nump + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums 2nd 1")) << prefix + "1-" + num + postfix << prefix + "1-" + nump + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums 2nd 2")) << prefix + "10-" + num + postfix<< prefix + "10-10" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums 2nd 3")) << prefix + "10-0"+ num + postfix<< prefix + "10-10" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums 2nd 4")) << prefix + "10-" + num + postfix<< prefix + "10-010" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums big 1")) << prefix + "10-" + num + postfix<< prefix + "20-0" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums big 2")) << prefix + "2-" + num + postfix << prefix + "10-0" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul alphabet 1")) << prefix + num + "-a" + postfix << prefix + num + "-c" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul alphabet 2")) << prefix + num + "-a9" + postfix<< prefix + num + "-c0" + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("mul nums w\\0")) << prefix + num + "-"+ num + postfix<< prefix + num+"-0"+nump + postfix << int(Qt::CaseInsensitive) << i;
+ QTest::newRow(ROWNAME("num first")) << prefix + num + postfix << prefix + "a" + postfix << int(Qt::CaseInsensitive) << i;
}
}
}
+#undef ROWNAME
}
void tst_QFileSystemModel::naturalCompare()
diff --git a/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp b/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp
index f5c3e08217..6b2caf17d7 100644
--- a/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp
+++ b/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp
@@ -114,6 +114,9 @@ void tst_QFontDialog::postKeyReturn() {
void tst_QFontDialog::defaultOkButton()
{
+#ifdef Q_OS_MAC
+ QSKIP("Test hangs on Mac OS X, see QTBUG-24321");
+#endif
bool ok = false;
QTimer::singleShot(2000, this, SLOT(postKeyReturn()));
QFontDialog::getFont(&ok);
@@ -123,6 +126,9 @@ void tst_QFontDialog::defaultOkButton()
void tst_QFontDialog::setFont()
{
+#ifdef Q_OS_MAC
+ QSKIP("Test hangs on Mac OS X, see QTBUG-24321");
+#endif
/* The font should be the same before as it is after if nothing changed
while the font dialog was open.
Task #27662
@@ -154,6 +160,10 @@ class FriendlyFontDialog : public QFontDialog
void tst_QFontDialog::task256466_wrongStyle()
{
+#ifdef Q_OS_MAC
+ QSKIP("Test crashes on Mac OS X, see QTBUG-24321");
+#endif
+
QFontDatabase fdb;
FriendlyFontDialog dialog;
QListView *familyList = reinterpret_cast<QListView*>(dialog.d_func()->familyList);
diff --git a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
index 9e965ff235..7fc752488d 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
@@ -411,8 +411,10 @@ void tst_QMessageBox::staticSourceCompat()
if (qobject_cast<QMacStyle *>(qApp->style()))
expectedButton = int(QMessageBox::No);
#elif !defined(QT_NO_STYLE_CLEANLOOKS)
- if (qobject_cast<QCleanlooksStyle *>(qApp->style()))
+ if (qobject_cast<QCleanlooksStyle *>(qApp->style())) {
+ QEXPECT_FAIL("", "Special handling of QMessageBox::information buttons for Cleanlooks not implemented yet, QTBUG-24315", Continue);
expectedButton = int(QMessageBox::No);
+ }
#endif
QCOMPARE(ret, expectedButton);
QCOMPARE(keyToSend, -1);
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
index 3a8e109d80..97feb642dc 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
@@ -1835,15 +1835,6 @@ void tst_QGraphicsAnchorLayout1::testCenterAnchors_data()
theResult
<< BasicResult(0, QRectF(5, 5, 10, 10) );
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor edges of different orientations");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor edges of different orientations");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor edges of different orientations");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
QTest::newRow("center, basic with invalid") << QSizeF(20, 20) << theData << theResult;
}
@@ -1975,9 +1966,6 @@ void tst_QGraphicsAnchorLayout1::testCenterAnchors_data()
<< BasicResult(1, QRectF(20, 0, 30, 10))
<< BasicResult(2, QRectF(60, 15, 40, 10));
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
-
QTest::newRow("center, three") << QSizeF(100, 50) << theData << theResult;
}
@@ -2062,6 +2050,21 @@ void tst_QGraphicsAnchorLayout1::testCenterAnchors_data()
void tst_QGraphicsAnchorLayout1::testCenterAnchors()
{
+ if (strcmp(QTest::currentDataTag(), "center, basic with invalid") == 0) {
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor edges of different orientations");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor edges of different orientations");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor edges of different orientations");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ } else if (strcmp(QTest::currentDataTag(), "center, three") == 0) {
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ }
+
// use the same frame
testBasicLayout();
}
@@ -2144,11 +2147,6 @@ void tst_QGraphicsAnchorLayout1::testRemoveCenterAnchor_data()
<< BasicResult(1, QRectF(20, 0, 30, 10))
<< BasicResult(2, QRectF(60, 15, 40, 10));
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
-
QTest::newRow("remove, center, three") << QSizeF(100, 50) << theData << theRemoveData << theResult;
}
@@ -2183,8 +2181,6 @@ void tst_QGraphicsAnchorLayout1::testRemoveCenterAnchor_data()
theResult
<< BasicResult(0, QRectF(5, 5, 10, 10) );
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
- QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
QTest::newRow("remove, center, basic 2") << QSizeF(20, 20) << theData
<< theRemoveData << theResult;
}
@@ -2193,6 +2189,16 @@ void tst_QGraphicsAnchorLayout1::testRemoveCenterAnchor_data()
void tst_QGraphicsAnchorLayout1::testRemoveCenterAnchor()
{
+ if (strcmp(QTest::currentDataTag(), "remove, center, three") == 0) {
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ } else if (strcmp(QTest::currentDataTag(), "remove, center, basic 2") == 0) {
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsAnchorLayout::addAnchor(): Cannot anchor the item to itself");
+ }
+
QFETCH(QSizeF, size);
QFETCH(BasicLayoutTestDataList, data);
QFETCH(BasicLayoutTestDataList, removeData);
diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index bbe7062507..51ce7f909c 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -454,7 +454,6 @@ void tst_QGraphicsGridLayout::addItem_data()
for (int b = -1; b < 2; ++b) {
for (int c = -1; c < 2; ++c) {
for (int d = -1; d < 2; ++d) {
- for (int e = 0; e < 9; ++e) {
int row = a;
int column = b;
int rowSpan = c;
@@ -462,7 +461,7 @@ void tst_QGraphicsGridLayout::addItem_data()
QString name = QString::fromAscii("(%1,%2,%3,%4").arg(a).arg(b).arg(c).arg(d);
Qt::Alignment alignment = Qt::AlignLeft;
QTest::newRow(name.toLatin1()) << row << column << rowSpan << columnSpan << alignment;
- }}}}}
+ }}}}
}
// public void addItem(QGraphicsLayoutItem* item, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
diff --git a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index c30701e0f9..35b67d4451 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -152,7 +152,7 @@ void tst_QGraphicsLinearLayout::initTestCase()
{
// since the style will influence the results, we have to ensure
// that the tests are run using the same style on all platforms
-#if defined (Q_WS_WINCE)
+#if defined (Q_OS_WINCE)
QApplication::setStyle(new QWindowsStyle);
#else
QApplication::setStyle(new QPlastiqueStyle);
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
index 50f4f7ab74..f2bd7bde70 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
@@ -8,3 +8,5 @@ SOURCES += tst_qgraphicsproxywidget.cpp
# ### fixme: QTBUG-20756 crashes on xcb
contains(QT_CONFIG,xcb):CONFIG+=insignificant_test
+
+win32:CONFIG += insignificant_test # QTBUG-24294
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index 3ccc533086..ca5b992012 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -1574,7 +1574,7 @@ void tst_QGraphicsProxyWidget::resize_simple_data()
QTest::addColumn<QSizeF>("size");
QTest::newRow("200, 200") << QSizeF(200, 200);
-#if !defined(QT_ARCH_ARM) && !defined(Q_OS_WINCE)
+#if !defined(Q_PROCESSOR_ARM) && !defined(Q_OS_WINCE)
QTest::newRow("1000, 1000") << QSizeF(1000, 1000);
// Since 4.5, 10000x10000 runs out of memory.
// QTest::newRow("10000, 10000") << QSizeF(10000, 10000);
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
index 8a084472b8..c0a9075d10 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -17,3 +17,5 @@ wince* {
DEPLOYMENT += rootFiles renderFiles
DEFINES += SRCDIR=\\\".\\\"
}
+
+win32:CONFIG += insignificant_test # QTBUG-24295
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index f103d3d529..3257e7efea 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -365,7 +365,7 @@ void tst_QGraphicsScene::itemIndexMethod()
QGraphicsScene scene;
QCOMPARE(scene.itemIndexMethod(), QGraphicsScene::BspTreeIndex);
-#ifdef QT_ARCH_ARM
+#ifdef Q_PROCESSOR_ARM
const int minY = -500;
const int maxY = 500;
const int minX = -500;
@@ -426,7 +426,7 @@ void tst_QGraphicsScene::bspTreeDepth()
void tst_QGraphicsScene::items()
{
-#ifdef QT_ARCH_ARM
+#ifdef Q_PROCESSOR_ARM
const int minY = -500;
const int maxY = 500;
const int minX = -500;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
index e3a6edd682..439cf547ef 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -8,3 +8,5 @@ SOURCES += tst_qgraphicsview.cpp tst_qgraphicsview_2.cpp
DEFINES += QT_NO_CAST_TO_ASCII
linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG+=insignificant_test
+
+win32:CONFIG += insignificant_test # QTBUG-24296
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index 7681b3c787..7ceeaaa0d3 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -1656,7 +1656,7 @@ void tst_QGraphicsView::mapToScene()
QCOMPARE(view.size(), viewSize);
// First once without setting the scene rect
-#ifdef QT_ARCH_ARM
+#ifdef Q_PROCESSOR_ARM
const int step = 20;
#else
const int step = 1;
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
index 0607d2ab30..0a2d0cd2f8 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -1157,8 +1157,10 @@ void tst_QGraphicsWidget::initStyleOption()
bool hasFocus = option.state & QStyle::State_HasFocus;
QCOMPARE(hasFocus, focus);
bool isUnderMouse = option.state & QStyle::State_MouseOver;
-#if !defined(Q_OS_WINCE) && !defined(Q_OS_MAC)
+#ifndef Q_OS_WINCE
+# if !defined(Q_OS_MAC) && !defined(Q_OS_WIN)
QEXPECT_FAIL("all", "QTBUG-22457", Abort);
+# endif
QCOMPARE(isUnderMouse, underMouse);
#endif
// if (layoutDirection != Qt::LeftToRight)
diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
index 75a72a754f..4dd57e1b90 100644
--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
@@ -204,6 +204,7 @@ private slots:
void QTBUG8650_crashOnInsertSections();
void QTBUG12268_hiddenMovedSectionSorting();
void QTBUG14242_hideSectionAutoSize();
+ void ensureNoIndexAtLength();
void initialSortOrderRole();
@@ -2156,6 +2157,17 @@ void tst_QHeaderView::QTBUG14242_hideSectionAutoSize()
QVERIFY(calced_length == afterlength);
}
+void tst_QHeaderView::ensureNoIndexAtLength()
+{
+ QTableView qtv;
+ QStandardItemModel amodel(4, 4);
+ qtv.setModel(&amodel);
+ QHeaderView *hv = qtv.verticalHeader();
+ QVERIFY(hv->visualIndexAt(hv->length()) == -1);
+ hv->resizeSection(hv->count() - 1, 0);
+ QVERIFY(hv->visualIndexAt(hv->length()) == -1);
+}
+
void tst_QHeaderView::initialSortOrderRole()
{
QTableView view; // ### Shadowing member view (of type QHeaderView)
@@ -2341,8 +2353,8 @@ void tst_QHeaderView::calculateAndCheck(int cppline, const int precalced_compare
QVERIFY2(chk_logical == x[1], verifytext);
QVERIFY2(chk_sizes == x[2], verifytext);
QVERIFY2(chk_hidden_size == x[3], verifytext);
- QVERIFY2(chk_lookup_visual == x[4], verifytext); // Here the semantic can change. See final note (*).
- QVERIFY2(chk_lookup_logical == x[5], verifytext); // Here the semantic can change. See final note (*).
+ QVERIFY2(chk_lookup_visual == x[4], verifytext);
+ QVERIFY2(chk_lookup_logical == x[5], verifytext);
QVERIFY2(header_lenght == x[6], verifytext);
}
@@ -2353,16 +2365,16 @@ void tst_QHeaderView::setupTestData(bool also_use_reset_model)
QTest::addColumn<bool>("reset_model");
if (also_use_reset_model) {
- QTest::newRow("no_updates+normal") << false << false << true;
- QTest::newRow("hasupdates+normal") << true << false << true;
- QTest::newRow("no_updates+special") << false << true << true;
- QTest::newRow("no_updates+special") << true << true << true;
+ QTest::newRow("no_updates+normal+reset") << false << false << true;
+ QTest::newRow("hasupdates+normal+reset") << true << false << true;
+ QTest::newRow("no_updates+special+reset") << false << true << true;
+ QTest::newRow("hasupdates+special+reset") << true << true << true;
}
QTest::newRow("no_updates+normal") << false << false << false;
QTest::newRow("hasupdates+normal") << true << false << false;
QTest::newRow("no_updates+special") << false << true << false;
- QTest::newRow("no_updates+special") << true << true << false;
+ QTest::newRow("hasupdates+special") << true << true << false;
}
void tst_QHeaderView::additionalInit()
@@ -2438,10 +2450,10 @@ void tst_QHeaderView::logicalIndexAtTest()
//qDebug() << "logicalIndexAtTest" << check1 << check2;
const int precalced_check1 = 106327;
const int precalced_check2 = 29856418;
- QVERIFY(precalced_check1 == check1); // Here the semantic can change. See final note (*)
- QVERIFY(precalced_check2 == check2); // Here the semantic can change. See final note (*)
+ QVERIFY(precalced_check1 == check1);
+ QVERIFY(precalced_check2 == check2);
- const int precalced_results[] = { 1145298384, -1710423344, -650981936, 372919464, 2139446944, 854793816, 12124 };
+ const int precalced_results[] = { 1145298384, -1710423344, -650981936, 372919464, -1544372176, -426463328, 12124 };
calculateAndCheck(__LINE__, precalced_results);
}
@@ -2466,10 +2478,10 @@ void tst_QHeaderView::visualIndexAtTest()
//qDebug() << "visualIndexAtTest" << check1 << check2;
const int precalced_check1 = 72665;
const int precalced_check2 = 14015890;
- QVERIFY(precalced_check1 == check1); // Here the semantic can change. See final note (*)
- QVERIFY(precalced_check2 == check2); // Here the semantic can change. See final note (*)
+ QVERIFY(precalced_check1 == check1);
+ QVERIFY(precalced_check2 == check2);
- const int precalced_results[] = { 1145298384, -1710423344, -1457520212, 169223959, 726651072, -2105938696, 5453 };
+ const int precalced_results[] = { 1145298384, -1710423344, -1457520212, 169223959, 557466160, -324939600, 5453 };
calculateAndCheck(__LINE__, precalced_results);
}
@@ -2598,7 +2610,7 @@ void tst_QHeaderView::mixedTests()
model->setRowCount(model->rowCount() - 10);
if (m_using_reset_model) {
- const int precalced_results[] = { 898296472, 337096378, -543340640, 1, 703951756, 250831536, 9250 };
+ const int precalced_results[] = { 898296472, 337096378, -543340640, 1, -1251526424, -568618976, 9250 };
calculateAndCheck(__LINE__, precalced_results);
} else {
const int precalced_results[] = { 1911338224, 1693514365, -613398968, -1912534953, 1582159424, -1851079000, 9300 };
@@ -2633,8 +2645,5 @@ void tst_QHeaderView::resizeToContentTest()
calculateAndCheck(__LINE__, precalced_results);
}
-// (*) Currently qheaderview position lookup acts a bit strange. It can return sections with size 0.
-// This could be changed in the future.
-
QTEST_MAIN(tst_QHeaderView)
#include "tst_qheaderview.moc"
diff --git a/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp b/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
index 04b32d1e56..4e71bf964c 100644
--- a/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
+++ b/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
@@ -286,7 +286,7 @@ void tst_QItemView::populate()
{
treeModel = new CheckerModel;
QModelIndex parent;
-#if defined(QT_ARCH_ARM)
+#if defined(Q_PROCESSOR_ARM)
const int baseInsert = 4;
#else
const int baseInsert = 26;
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 523516a4b4..f139eac275 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -970,7 +970,7 @@ void tst_QListView::selection_data()
<< QRect(300, 10, 1, 1) // selection rectangle
<< IntList(); // expected items
- QTest::newRow("select to the right, (on viewport)")
+ QTest::newRow("select to the right 2, (on viewport)")
<< 40 // itemCount
<< int(QListView::ListMode)
<< int(QListView::TopToBottom)
diff --git a/tests/auto/widgets/itemviews/qlistwidget/qlistwidget.pro b/tests/auto/widgets/itemviews/qlistwidget/qlistwidget.pro
index f397957609..8821ac7038 100644
--- a/tests/auto/widgets/itemviews/qlistwidget/qlistwidget.pro
+++ b/tests/auto/widgets/itemviews/qlistwidget/qlistwidget.pro
@@ -5,3 +5,5 @@ QT += core-private gui-private
SOURCES += tst_qlistwidget.cpp
contains(QT_CONFIG,xcb):CONFIG+=insignificant_test # QTBUG-21098, fails unstably
+
+win32:CONFIG += insignificant_test # QTBUG-24299
diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
index 586c2efd8f..9144a023d7 100644
--- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
+++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
@@ -1204,7 +1204,7 @@ void tst_QTableView::moveCursorStrikesBack_data()
<< 0 << 5 << (IntList() << int(QtTestTableView::MoveNext))
<< 1 << 0;
- QTest::newRow("Last column disabled. Task QTBUG-3878") << -1 << -1
+ QTest::newRow("Last column disabled 2. Task QTBUG-3878") << -1 << -1
<< IntList()
<< (IntList() << 6)
<< QRect()
diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
index 0e518b3e16..14c61c7932 100644
--- a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
+++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
@@ -1014,13 +1014,13 @@ void tst_QTreeWidgetItemIterator::minus_eq_data()
QTest::addColumn<int>("iteratorflags");
QTest::addColumn<QString>("expecteditem");
- QTest::newRow("-=0") << 0 << 0 << (int)QTreeWidgetItemIterator::All << QString("top0");
- QTest::newRow("-=1") << 2 << 1 << (int)QTreeWidgetItemIterator::All << QString("top0,child0");
- QTest::newRow("-=2") << 4 << 2 << (int)QTreeWidgetItemIterator::All << QString("top0,child1");
- QTest::newRow("-=(-1)") << 0 << -1 << (int)QTreeWidgetItemIterator::All << QString("top0,child0");
- QTest::newRow("-=(-2)") << 0 << -2 << (int)QTreeWidgetItemIterator::All << QString("top0,child1");
- QTest::newRow("-=1)") << 18 << 1 << (int)QTreeWidgetItemIterator::All << QString("top0,child16");
- QTest::newRow("-=1)") << 1 << 1 << (int)QTreeWidgetItemIterator::All << QString("top0");
+ QTest::newRow("0-=0") << 0 << 0 << (int)QTreeWidgetItemIterator::All << QString("top0");
+ QTest::newRow("2-=1") << 2 << 1 << (int)QTreeWidgetItemIterator::All << QString("top0,child0");
+ QTest::newRow("4-=2") << 4 << 2 << (int)QTreeWidgetItemIterator::All << QString("top0,child1");
+ QTest::newRow("0-=(-1)") << 0 << -1 << (int)QTreeWidgetItemIterator::All << QString("top0,child0");
+ QTest::newRow("0-=(-2)") << 0 << -2 << (int)QTreeWidgetItemIterator::All << QString("top0,child1");
+ QTest::newRow("18-=1") << 18 << 1 << (int)QTreeWidgetItemIterator::All << QString("top0,child16");
+ QTest::newRow("1-=1") << 1 << 1 << (int)QTreeWidgetItemIterator::All << QString("top0");
}
void tst_QTreeWidgetItemIterator::minus_eq()
diff --git a/tests/auto/widgets/kernel/qapplication/test/test.pro b/tests/auto/widgets/kernel/qapplication/test/test.pro
index 9f6db3cd3e..61035cc24b 100644
--- a/tests/auto/widgets/kernel/qapplication/test/test.pro
+++ b/tests/auto/widgets/kernel/qapplication/test/test.pro
@@ -14,8 +14,6 @@ win32 {
}
}
-mac*:CONFIG+=insignificant_test
-
TESTDATA = ../test/test.pro ../tmp/README
SUBPROGRAMS = desktopsettingsaware modal
diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
index d9f4081ed3..98872cb2f6 100644
--- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
+++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
@@ -69,6 +69,10 @@
#include <windows.h>
#endif
+QT_BEGIN_NAMESPACE
+extern bool Q_GUI_EXPORT qt_tab_all_widgets; // from qapplication.cpp
+QT_END_NAMESPACE
+
class tst_QApplication : public QObject
{
Q_OBJECT
@@ -137,18 +141,11 @@ private slots:
void touchEventPropagation();
void qtbug_12673();
-
- void testQuitLockRef();
- void testQuitLock1();
- void testQuitLock2();
- void testQuitLock3();
- void testQuitLock4();
- void testQuitLock5();
- void testQuitLock6();
- void testQuitLock7();
- void testQuitLock8();
+ void noQuitOnHide();
void globalStaticObjectDestruction(); // run this last
+
+ void abortQuitOnShow();
};
class EventSpy : public QObject
@@ -380,16 +377,16 @@ void tst_QApplication::setFont_data()
++cnt;
}
- QTest::newRow("nonexistingfont") << "nosuchfont_probably_quiteunlikely"
+ QTest::newRow("nonexistingfont after") << "nosuchfont_probably_quiteunlikely"
<< 0 << false;
- QTest::newRow("nonexistingfont") << "nosuchfont_probably_quiteunlikely"
+ QTest::newRow("nonexistingfont before") << "nosuchfont_probably_quiteunlikely"
<< 0 << true;
- QTest::newRow("largescaleable") << "smoothtimes" << 100 << false;
- QTest::newRow("largescaleable") << "smoothtimes" << 100 << true;
+ QTest::newRow("largescaleable after") << "smoothtimes" << 100 << false;
+ QTest::newRow("largescaleable before") << "smoothtimes" << 100 << true;
- QTest::newRow("largeunscaleale") << "helvetica" << 100 << false;
- QTest::newRow("largeunscaleale") << "helvetica" << 100 << true;
+ QTest::newRow("largeunscaleale after") << "helvetica" << 100 << false;
+ QTest::newRow("largeunscaleale before") << "helvetica" << 100 << true;
}
void tst_QApplication::setFont()
@@ -608,6 +605,11 @@ public slots:
void tst_QApplication::quitOnLastWindowClosed()
{
+#ifdef Q_OS_WIN32
+ QSKIP("This test crashes on Windows. Remove skip once the issue causing the crash is fixed (QTBUG-24300).");
+#endif
+#ifndef Q_OS_MAC
+ // Test hangs on Mac OS X, see QTBUG-24319
{
int argc = 0;
QApplication app(argc, 0, QApplication::GuiServer);
@@ -622,6 +624,7 @@ void tst_QApplication::quitOnLastWindowClosed()
// lastWindowClosed() signal should only be sent after the last dialog is closed
QCOMPARE(appSpy.count(), 2);
}
+#endif
{
int argc = 0;
QApplication app(argc, 0, QApplication::GuiServer);
@@ -1211,6 +1214,9 @@ void DeleteLaterWidget::checkDeleteLater()
void tst_QApplication::testDeleteLater()
{
+#ifdef Q_OS_MAC
+ QSKIP("This test fails and then hangs on Mac OS X, see QTBUG-24318");
+#endif
int argc = 0;
QApplication app(argc, 0, QApplication::GuiServer);
connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
@@ -1392,12 +1398,21 @@ void tst_QApplication::testDeleteLaterProcessEvents()
void tst_QApplication::desktopSettingsAware()
{
#ifndef QT_NO_PROCESS
- QProcess testProcess;
- const QString path = QStringLiteral("desktopsettingsaware/desktopsettingsaware");
+ QString path;
+ {
+ // We need an application object for QFINDTESTDATA to work
+ // properly in all cases.
+ int argc = 0;
+ QCoreApplication app(argc, 0);
+ path = QFINDTESTDATA("desktopsettingsaware/");
+ }
+ QVERIFY2(!path.isEmpty(), "Cannot locate desktopsettingsaware helper application");
+ path += "desktopsettingsaware";
#ifdef Q_OS_WINCE
int argc = 0;
QApplication tmpApp(argc, 0, QApplication::GuiServer);
#endif
+ QProcess testProcess;
testProcess.start(path);
QVERIFY2(testProcess.waitForStarted(),
qPrintable(QString::fromLatin1("Cannot start '%1': %2").arg(path, testProcess.errorString())));
@@ -1523,8 +1538,15 @@ void tst_QApplication::focusChanged()
QSettings appleSettings(QLatin1String("apple.com"));
QVariant appleValue = appleSettings.value(QLatin1String("AppleKeyboardUIMode"), 0);
tabAllControls = (appleValue.toInt() & 0x2);
+ if (!tabAllControls) {
+ QEXPECT_FAIL("", "QTBUG-24372 Mac tab key \"Text boxes and lists only\" vs "
+ "\"All controls\" setting is not respected in Qt5", Abort);
+ }
#endif
+ // make sure Qt's idea of tabbing between widgets matches what we think it should
+ QCOMPARE(qt_tab_all_widgets, tabAllControls);
+
tab.simulate(now);
if (!tabAllControls) {
QVERIFY(spy.count() == 0);
@@ -2048,9 +2070,19 @@ void tst_QApplication::touchEventPropagation()
void tst_QApplication::qtbug_12673()
{
+ QString path;
+ {
+ // We need an application object for QFINDTESTDATA to work
+ // properly in all cases.
+ int argc = 0;
+ QCoreApplication app(argc, 0);
+ path = QFINDTESTDATA("modal/");
+ }
+ QVERIFY2(!path.isEmpty(), "Cannot locate modal helper application");
+ path += "modal";
+
QProcess testProcess;
QStringList arguments;
- const QString path = QStringLiteral("modal/modal");
testProcess.start(path, arguments);
QVERIFY2(testProcess.waitForStarted(),
qPrintable(QString::fromLatin1("Cannot start '%1': %2").arg(path, testProcess.errorString())));
@@ -2058,509 +2090,71 @@ void tst_QApplication::qtbug_12673()
QCOMPARE(testProcess.exitStatus(), QProcess::NormalExit);
}
-class JobObject : public QObject
+class NoQuitOnHideWidget : public QWidget
{
Q_OBJECT
public:
- JobObject(int milliseconds, QObject *parent = 0)
- : QObject(parent)
- {
- QTimer::singleShot(milliseconds, this, SLOT(timeout()));
- }
-
- JobObject(QObject *parent = 0)
- : QObject(parent)
+ explicit NoQuitOnHideWidget(QWidget *parent = 0)
+ : QWidget(parent)
{
- QTimer::singleShot(1000, this, SLOT(timeout()));
+ QTimer::singleShot(0, this, SLOT(hide()));
+ QTimer::singleShot(500, this, SLOT(exitApp()));
}
private slots:
- void timeout()
- {
- emit done();
- deleteLater();
+ void exitApp() {
+ qApp->exit(1);
}
-
-signals:
- void done();
-
-private:
- QEventLoopLocker locker;
};
-class QuitLockRefTester : public QObject
+void tst_QApplication::noQuitOnHide()
{
- Q_OBJECT
-public:
- QuitLockRefTester(QObject *parent = 0)
- : QObject(parent)
- {
- QTimer::singleShot(0, this, SLOT(doTest()));
- }
-
-private slots:
- void doTest()
- {
- QApplicationPrivate *privateClass = static_cast<QApplicationPrivate*>(QObjectPrivate::get(qApp));
-
- {
- QDialog *win1 = new QDialog;
-
- // Test with a lock active so that the refcount doesn't drop to zero during these tests, causing a quit.
- // (until we exit the scope)
- QEventLoopLocker locker;
-
- QCOMPARE(privateClass->quitLockRef.load(), 1);
-
- win1->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QDialog *win2 = new QDialog;
-
- win2->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 3);
-
- delete win1;
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- delete win2;
-
- QCOMPARE(privateClass->quitLockRef.load(), 1);
-
- win1 = new QDialog;
-
- win1->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- JobObject *job1 = new JobObject(this);
-
- QCOMPARE(privateClass->quitLockRef.load(), 3);
-
- delete win1;
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- delete job1;
-
- QCOMPARE(privateClass->quitLockRef.load(), 1);
-
- QWidget *w1 = new QWidget;
-
- w1->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QWidget *w2 = new QMainWindow;
-
- w2->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 3);
-
- QWidget *w3 = new QWidget(0, Qt::Dialog);
-
- w3->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 4);
-
- delete w3;
-
- QCOMPARE(privateClass->quitLockRef.load(), 3);
-
- delete w2;
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QWidget *subWidget1 = new QWidget(w1, Qt::Window);
-
- // Even though We create a new widget and show it,
- // the ref count does not go up because it is a child of
- // w1, which is the top-level, and what we are actually
- // refcounting.
- subWidget1->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- // When we use setParent(0) and re-show, the
- // ref count does increase:
- QCOMPARE(subWidget1->isVisible(), true);
- subWidget1->setParent(0);
- QCOMPARE(subWidget1->isVisible(), false);
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- subWidget1->show();
- QCOMPARE(subWidget1->isVisible(), true);
- QCOMPARE(privateClass->quitLockRef.load(), 3);
-
- subWidget1->setParent(w1);
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QWidget *subWidget2 = new QWidget(w1);
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- subWidget2->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- delete subWidget2;
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QWidget *subWidget3 = new QWidget(w1);
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- subWidget3->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- subWidget3->hide();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- delete subWidget3;
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QWidget *subWidget4 = new QWidget(subWidget1);
- QWidget *subWidget5 = new QWidget(subWidget1);
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- QWidget *subWidget6 = new QWidget(subWidget4, Qt::Window);
-
- subWidget6->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- delete w1;
-
- QCOMPARE(privateClass->quitLockRef.load(), 1);
-
- w1 = new QWidget;
- w2 = new QWidget;
- w3 = new QWidget;
-
- QHBoxLayout *layout = new QHBoxLayout(w1);
-
- layout->addWidget(w2);
- layout->addWidget(w3);
-
- QCOMPARE(privateClass->quitLockRef.load(), 1);
-
- w1->show();
-
- QCOMPARE(privateClass->quitLockRef.load(), 2);
-
- w1->hide();
- QCOMPARE(privateClass->quitLockRef.load(), 1);
-
- delete w1;
-
- }
- QCOMPARE(privateClass->quitLockRef.load(), 0);
- }
-};
-
-void tst_QApplication::testQuitLockRef()
-{
- int argc = 1;
- char *argv[] = { "tst_qapplication" };
- QApplication app(argc, argv);
-
- QuitLockRefTester tester;
-
- app.exec();
-}
-
-void tst_QApplication::testQuitLock1()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- QWidget *w = new QWidget;
-
- w->show();
-
- QMetaObject::invokeMethod(w, "close", Qt::QueuedConnection);
-
- app.exec();
-
- // No hang = pass.
-}
-
-void tst_QApplication::testQuitLock2()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- QWidget *w1 = new QWidget;
-
- w1->show();
-
- QWidget *w2 = new QWidget;
-
- w2->show();
-
- QMetaObject::invokeMethod(w1, "deleteLater", Qt::QueuedConnection);
- QMetaObject::invokeMethod(w2, "hide", Qt::QueuedConnection);
-
- app.exec();
-
- // No hang = pass.
-}
-
-class Result : public QObject
-{
- Q_OBJECT
-public:
- Result(QObject *parent = 0)
- : QObject(parent), m_passes(false)
- {
-
- }
-
- bool result() const
- {
- return m_passes;
- }
-
-public slots:
-
- void setPasses()
- {
- setResult(true);
- }
-
- void setFails()
- {
- setResult(false);
- }
-
- void setResult(bool result)
- {
- m_passes = result;
- }
-
-private:
- bool m_passes;
-};
-
-void tst_QApplication::testQuitLock3()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- Result *result = new Result(&app);
-
- JobObject *job = new JobObject(&app);
-
- QObject::connect(job, SIGNAL(done()), result, SLOT(setPasses()));
-
- app.exec();
-
- QVERIFY(result->result());
-}
-
-void tst_QApplication::testQuitLock4()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- QWidget *w = new QWidget;
-
- w->show();
-
- Result *result = new Result(&app);
- JobObject *job = new JobObject(1000, &app);
-
- QTimer::singleShot(500, w, SLOT(deleteLater()));
-
- QObject::connect(w, SIGNAL(destroyed()), result, SLOT(setFails()));
- QObject::connect(job, SIGNAL(done()), result, SLOT(setPasses()));
-
- app.exec();
-
- QVERIFY(result->result());
+ int argc = 0;
+ QApplication app(argc, 0);
+ QWidget *window1 = new NoQuitOnHideWidget;
+ window1->show();
+ QCOMPARE(app.exec(), 1);
}
-class JobBeforeWindowRunner : public QObject
+class ShowCloseShowWidget : public QWidget
{
Q_OBJECT
public:
- JobBeforeWindowRunner(QObject *parent = 0)
- : QObject(parent), m_result(new Result(this))
- {
-
- }
-
- void start()
+ ShowCloseShowWidget(bool showAgain, QWidget *parent = 0)
+ : QWidget(parent), showAgain(showAgain)
{
- JobObject *job = new JobObject(this);
- connect(job, SIGNAL(done()), m_result, SLOT(setFails()));
- connect(job, SIGNAL(destroyed()), SLOT(showWindowDelayed()), Qt::QueuedConnection);
+ QTimer::singleShot(0, this, SLOT(doClose()));
+ QTimer::singleShot(500, this, SLOT(exitApp()));
}
- bool result() const { return m_result->result(); }
-
private slots:
- void showWindowDelayed()
- {
- qApp->setQuitLockEnabled(true);
- QTimer::singleShot(500, this, SLOT(showWindow()));
- }
-
- void showWindow()
- {
- QWidget *w = new QWidget;
- w->show();
- w->deleteLater();
- connect(w, SIGNAL(destroyed()), m_result, SLOT(setPasses()));
- }
-
-private:
- Result * const m_result;
-};
-
-void tst_QApplication::testQuitLock5()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
- app.setQuitLockEnabled(false);
- // Run a job before showing a window, and only enable the refcounting
- // after doing so.
- // Although the job brings the refcount to zero, the app does not exit
- // until setQuitLockEnabled is called and the feature re-enabled.
-
- JobBeforeWindowRunner *eventRunner = new JobBeforeWindowRunner(&app);
-
- eventRunner->start();
-
- app.exec();
-
- QVERIFY(eventRunner->result());
-}
-
-class JobDuringWindowRunner : public QObject
-{
- Q_OBJECT
-public:
- JobDuringWindowRunner(QObject *parent = 0)
- : QObject(parent), m_result(new Result(this))
- {
-
- }
-
- void start()
- {
- JobObject *job = new JobObject(this);
-
- QWidget *w = new QWidget;
- w->show();
- w->deleteLater();
-
- QObject::connect(w, SIGNAL(destroyed()), m_result, SLOT(setFails()));
- QObject::connect(job, SIGNAL(done()), m_result, SLOT(setPasses()));
- }
-
- bool result() const { return m_result->result(); }
-
-private:
- Result * const m_result;
-};
-
-void tst_QApplication::testQuitLock6()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- // A job runs, and while it is running, a window is shown and closed,
- // then the job ends, which causes the quit.
-
- JobDuringWindowRunner *eventRunner = new JobDuringWindowRunner(&app);
-
- eventRunner->start();
-
- app.exec();
-
- QVERIFY(eventRunner->result());
-}
-class JobWindowJobWindowRunner : public QObject
-{
- Q_OBJECT
-public:
- JobWindowJobWindowRunner(QObject *parent = 0)
- : QObject(parent), m_result(new Result(this))
- {
-
+ void doClose() {
+ close();
+ if (showAgain)
+ show();
}
- void start()
- {
- JobObject *job = new JobObject(500, this);
-
- QWidget *w = new QWidget;
- w->show();
- QTimer::singleShot(1000, w, SLOT(deleteLater()));
-
- QObject::connect(w, SIGNAL(destroyed()), m_result, SLOT(setPasses()));
- QObject::connect(job, SIGNAL(done()), m_result, SLOT(setFails()));
+ void exitApp() {
+ qApp->exit(1);
}
- bool result() const { return m_result->result(); }
private:
- Result * const m_result;
+ bool showAgain;
};
-void tst_QApplication::testQuitLock7()
+void tst_QApplication::abortQuitOnShow()
{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- // A job runs, and while it is running, a window is shown
- // then the job ends, then the window is closed, which causes the quit.
-
- JobWindowJobWindowRunner *eventRunner = new JobWindowJobWindowRunner(&app);
-
- eventRunner->start();
-
- app.exec();
-
- QVERIFY(eventRunner->result());
-}
-
-void tst_QApplication::testQuitLock8()
-{
- int argc = 1;
- char *argv[] = { "tst_qcoreapplication" };
- QApplication app(argc, argv);
-
- QMainWindow *mw1 = new QMainWindow;
- mw1->show();
- QMainWindow *mw2 = new QMainWindow;
- mw2->show();
-
- QMetaObject::invokeMethod(mw1, "close", Qt::QueuedConnection);
- QMetaObject::invokeMethod(mw2, "close", Qt::QueuedConnection);
-
- app.exec();
-
- // No hang = pass
+ int argc = 0;
+ QApplication app(argc, 0);
+ QWidget *window1 = new ShowCloseShowWidget(false);
+ window1->show();
+ QCOMPARE(app.exec(), 0);
+
+ QWidget *window2 = new ShowCloseShowWidget(true);
+ window2->show();
+ QCOMPARE(app.exec(), 1);
}
-
/*
This test is meant to ensure that certain objects (public & commonly used)
can safely be used in a Q_GLOBAL_STATIC such that their destructors are
diff --git a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
index c8e5591f8b..c43ea065f3 100644
--- a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
+++ b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
@@ -797,6 +797,16 @@ void tst_QGridLayout::minMaxSize_data()
<< SizeInfo(QPoint(10, 10), QSize( 90, 90), QSize(100,100))
<< SizeInfo(QPoint(10 + 100 + 1, 10), QSize( 90, 90))
);
+ QTest::newRow("2x1 grid, extend to minimumSize, motif") << QString::fromAscii("motif") << 2 << 1
+ << int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
+ << SizeInfo(QPoint(11, 11), QSize( 90, 90), QSize(100,100))
+ << SizeInfo(QPoint(11 + 100 + 6, 11), QSize( 90, 90))
+ );
+ QTest::newRow("2x1 grid, extend to minimumSize, windows") << QString::fromAscii("windows") << 2 << 1
+ << int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
+ << SizeInfo(QPoint(11, 11), QSize( 90, 90), QSize(100,100))
+ << SizeInfo(QPoint(11 + 100 + 6, 11), QSize( 90, 90))
+ );
QTest::newRow("1x2 grid, extend to minimumSize") << QString() << 1 << 2
<< int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
<< SizeInfo(QPoint(10, 10), QSize( 90, 90), QSize(100,100))
@@ -818,17 +828,6 @@ void tst_QGridLayout::minMaxSize_data()
<< SizeInfo(QPoint(10, 10 + 100 + 1), QSize(100,100), QSize(), QSize(), 100*100)
<< SizeInfo(QPoint(10, 10 + 100 + 1 + 50 + 1), QSize(100,100), QSize(), QSize(100, 100))
);
- QTest::newRow("2x1 grid, extend to minimumSize") << QString::fromAscii("motif") << 2 << 1
- << int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
- << SizeInfo(QPoint(11, 11), QSize( 90, 90), QSize(100,100))
- << SizeInfo(QPoint(11 + 100 + 6, 11), QSize( 90, 90))
- );
- QTest::newRow("2x1 grid, extend to minimumSize") << QString::fromAscii("windows") << 2 << 1
- << int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
- << SizeInfo(QPoint(11, 11), QSize( 90, 90), QSize(100,100))
- << SizeInfo(QPoint(11 + 100 + 6, 11), QSize( 90, 90))
- );
-
}
void tst_QGridLayout::minMaxSize()
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro b/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro
index 137d6a2bc5..f908c3ab7d 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro
+++ b/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro
@@ -6,3 +6,5 @@ QT += gui-private
SOURCES += tst_qstylesheetstyle.cpp
RESOURCES += resources.qrc
requires(contains(QT_CONFIG,private_tests))
+
+win32:CONFIG += insignificant_test # QTBUG-24323
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
index 2dc985439d..1201b0f1da 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
+++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
@@ -881,6 +881,11 @@ void tst_QStyleSheetStyle::hoverColors()
QVERIFY2(testForColors(image, QColor(0xe8, 0xff, 0x66)),
(QString::fromLatin1(widget->metaObject()->className())
+ " did not contain background color #e8ff66").toLocal8Bit().constData());
+#ifdef Q_OS_MAC
+ if (qobject_cast<QPushButton *>(widget)
+ || qobject_cast<QComboBox *>(widget))
+ QEXPECT_FAIL("", "Failure only for QPushButton and QComboBox, see QTBUG-23686", Continue);
+#endif
QVERIFY2(testForColors(image, QColor(0xff, 0x00, 0x84)),
(QString::fromLatin1(widget->metaObject()->className())
+ " did not contain text color #ff0084").toLocal8Bit().constData());
diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
index 228ff40ee5..a257eb1798 100644
--- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
+++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
@@ -367,40 +367,42 @@ void tst_QCompleter::csMatchingOnCsSortedModel_data()
QTest::addColumn<QString>("completion");
QTest::addColumn<QString>("completionText");
+#define ROWNAME(name) (qPrintable(QString("%1 %2").arg(name).arg(i)))
+
for (int i = 0; i < 2; i++) {
if (i == 1)
QTest::newRow("FILTERING_OFF") << "FILTERING_OFF" << "" << "" << "";
// Plain text filter
- QTest::newRow("()") << "" << "" << "P0" << "P0";
- QTest::newRow("()F") << "" << "F" << "P0" << "P0";
- QTest::newRow("()L") << "" << "L" << "p4" << "p4";
- QTest::newRow("()L") << "" << "L" << "p4" << "p4";
- QTest::newRow("()N") << "" << "N" << "P1" << "P1";
- QTest::newRow("(P)") << "P" << "" << "P0" << "P0";
- QTest::newRow("(P)F") << "P" << "" << "P0" << "P0";
- QTest::newRow("(P)L") << "P" << "L" << "P4" << "P4";
- QTest::newRow("(p)") << "p" << "" << "p0" << "p0";
- QTest::newRow("(p)N") << "p" << "N" << "p1" << "p1";
- QTest::newRow("(p)NN") << "p" << "NN" << "p2" << "p2";
- QTest::newRow("(p)NNN") << "p" << "NNN" << "p3" << "p3";
- QTest::newRow("(p)NNNN") << "p" << "NNNN" << "p4" << "p4";
- QTest::newRow("(p1)") << "p1" << "" << "p1" << "p1";
- QTest::newRow("(p11)") << "p11" << "" << "" << "";
+ QTest::newRow(ROWNAME("()")) << "" << "" << "P0" << "P0";
+ QTest::newRow(ROWNAME("()F")) << "" << "F" << "P0" << "P0";
+ QTest::newRow(ROWNAME("()L")) << "" << "L" << "p4" << "p4";
+ QTest::newRow(ROWNAME("()N")) << "" << "N" << "P1" << "P1";
+ QTest::newRow(ROWNAME("(P)")) << "P" << "" << "P0" << "P0";
+ QTest::newRow(ROWNAME("(P)F")) << "P" << "" << "P0" << "P0";
+ QTest::newRow(ROWNAME("(P)L")) << "P" << "L" << "P4" << "P4";
+ QTest::newRow(ROWNAME("(p)")) << "p" << "" << "p0" << "p0";
+ QTest::newRow(ROWNAME("(p)N")) << "p" << "N" << "p1" << "p1";
+ QTest::newRow(ROWNAME("(p)NN")) << "p" << "NN" << "p2" << "p2";
+ QTest::newRow(ROWNAME("(p)NNN")) << "p" << "NNN" << "p3" << "p3";
+ QTest::newRow(ROWNAME("(p)NNNN")) << "p" << "NNNN" << "p4" << "p4";
+ QTest::newRow(ROWNAME("(p1)")) << "p1" << "" << "p1" << "p1";
+ QTest::newRow(ROWNAME("(p11)")) << "p11" << "" << "" << "";
// Tree filter
- QTest::newRow("(P0,)") << "P0," << "" << "c0P0" << "P0,c0P0";
- QTest::newRow("(P0,c)") << "P0,c" << "" << "c0P0" << "P0,c0P0";
- QTest::newRow("(P0,c1)") << "P0,c1" << "" << "c1P0" << "P0,c1P0";
- QTest::newRow("(P0,c3P0)") << "P0,c3P0" << "" << "c3P0" << "P0,c3P0";
- QTest::newRow("(P3,c)F") << "P3,c" << "F" << "c0P3" << "P3,c0P3";
- QTest::newRow("(P3,c)L") << "P3,c" << "L" << "c4P3" << "P3,c4P3";
- QTest::newRow("(P3,c)N") << "P3,c" << "N" << "c1P3" << "P3,c1P3";
- QTest::newRow("(P3,c)NN") << "P3,c" << "NN" << "c2P3" << "P3,c2P3";
- QTest::newRow("(P3,,c)") << "P3,,c" << "" << "" << "";
- QTest::newRow("(P3,c0P3,)") << "P3,c0P3," << "" << "" << "";
- QTest::newRow("(P,)") << "P," << "" << "" << "";
+ QTest::newRow(ROWNAME("(P0,)")) << "P0," << "" << "c0P0" << "P0,c0P0";
+ QTest::newRow(ROWNAME("(P0,c)")) << "P0,c" << "" << "c0P0" << "P0,c0P0";
+ QTest::newRow(ROWNAME("(P0,c1)")) << "P0,c1" << "" << "c1P0" << "P0,c1P0";
+ QTest::newRow(ROWNAME("(P0,c3P0)")) << "P0,c3P0" << "" << "c3P0" << "P0,c3P0";
+ QTest::newRow(ROWNAME("(P3,c)F")) << "P3,c" << "F" << "c0P3" << "P3,c0P3";
+ QTest::newRow(ROWNAME("(P3,c)L")) << "P3,c" << "L" << "c4P3" << "P3,c4P3";
+ QTest::newRow(ROWNAME("(P3,c)N")) << "P3,c" << "N" << "c1P3" << "P3,c1P3";
+ QTest::newRow(ROWNAME("(P3,c)NN")) << "P3,c" << "NN" << "c2P3" << "P3,c2P3";
+ QTest::newRow(ROWNAME("(P3,,c)")) << "P3,,c" << "" << "" << "";
+ QTest::newRow(ROWNAME("(P3,c0P3,)")) << "P3,c0P3," << "" << "" << "";
+ QTest::newRow(ROWNAME("(P,)")) << "P," << "" << "" << "";
}
+#undef ROWNAME
}
void tst_QCompleter::csMatchingOnCsSortedModel()
diff --git a/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp b/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp
index 5695834e61..85cd2a8d92 100644
--- a/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp
+++ b/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp
@@ -229,13 +229,13 @@ void tst_QAbstractButton::onReleased()
void tst_QAbstractButton::setAutoRepeat_data()
{
QTest::addColumn<int>("mode");
- QTest::newRow( "" ) << 0;
- QTest::newRow( "" ) << 1;
- QTest::newRow( "" ) << 2;
- QTest::newRow( "" ) << 3;
- QTest::newRow( "" ) << 4;
- QTest::newRow( "" ) << 5;
- QTest::newRow( "" ) << 6;
+ QTest::newRow("mode 0") << 0;
+ QTest::newRow("mode 1") << 1;
+ QTest::newRow("mode 2") << 2;
+ QTest::newRow("mode 3") << 3;
+ QTest::newRow("mode 4") << 4;
+ QTest::newRow("mode 5") << 5;
+ QTest::newRow("mode 6") << 6;
}
#define REPEAT_DELAY 1000
diff --git a/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp b/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp
index 6ed5d59db0..6021f90ed4 100644
--- a/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp
+++ b/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp
@@ -482,7 +482,7 @@ void tst_QAbstractSlider::keyPressed_data()
QList<Qt::Key> list;
list << Qt::Key_Down;
- QTest::newRow("Step down once") << 10 // initial position
+ QTest::newRow("Step down once 1") << 10 // initial position
<< 0 // minimum
<< 100 // maximum
<< 3 // single step size
@@ -495,7 +495,7 @@ void tst_QAbstractSlider::keyPressed_data()
list = QList<Qt::Key>();
list << Qt::Key_Up;
- QTest::newRow("Step down once") << 10 // initial position
+ QTest::newRow("Step down once 2") << 10 // initial position
<< 0 // minimum
<< 100 // maximum
<< 3 // single step size
diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
index 80285ded78..907a239912 100644
--- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
+++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
@@ -765,7 +765,7 @@ void tst_QComboBox::virtualAutocompletion()
// We need to set the keyboard input interval to a higher value
// as the processEvent() call takes too much time, so it restarts
// the keyboard search then
-#if defined(QT_ARCH_ARM) || defined(QT_ARCH_MIPS)
+#if defined(Q_PROCESSOR_ARM) || defined(Q_PROCESSOR_MIPS)
int oldInterval = QApplication::keyboardInputInterval();
QApplication::setKeyboardInputInterval(1500);
#endif
@@ -797,7 +797,7 @@ void tst_QComboBox::virtualAutocompletion()
QApplication::sendEvent(testWidget, &kr2);
qApp->processEvents(); // Process events to trigger autocompletion
QTRY_COMPARE(testWidget->currentIndex(), 3);
-#if defined(QT_ARCH_ARM) || defined(QT_ARCH_MIPS)
+#if defined(Q_PROCESSOR_ARM) || defined(Q_PROCESSOR_MIPS)
QApplication::setKeyboardInputInterval(oldInterval);
#endif
}
diff --git a/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp
index deb8a3bb6f..474acc0a78 100644
--- a/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp
+++ b/tests/auto/widgets/widgets/qdoublevalidator/tst_qdoublevalidator.cpp
@@ -360,11 +360,11 @@ void tst_QDoubleValidator::validateIntEquiv_data()
QTest::newRow("4.6") << 0.0 << 10.0 << QString(".1") << INV;
QTest::newRow("4.7") << 0.0 << 10.0 << QString("-1.0") << INV;
- QTest::newRow("5.1") << 6.0 << 8.0 << QString("5") << ITM;
- QTest::newRow("5.1") << 6.0 << 8.0 << QString("56") << INV;
+ QTest::newRow("5.1a") << 6.0 << 8.0 << QString("5") << ITM;
+ QTest::newRow("5.1b") << 6.0 << 8.0 << QString("56") << INV;
QTest::newRow("5.2") << 6.0 << 8.0 << QString("7") << ACC;
- QTest::newRow("5.3") << 6.0 << 8.0 << QString("9") << ITM;
- QTest::newRow("5.3") << 6.0 << 8.0 << QString("-") << INV;
+ QTest::newRow("5.3a") << 6.0 << 8.0 << QString("9") << ITM;
+ QTest::newRow("5.3b") << 6.0 << 8.0 << QString("-") << INV;
QTest::newRow("5.4a") << -8.0 << -6.0 << QString("+") << INV;
QTest::newRow("5.4b") << -8.0 << -6.0 << QString("+5") << INV;
QTest::newRow("5.4c") << -8.0 << -6.0 << QString("-5") << ITM;
diff --git a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
index e773607164..3832d39d6f 100644
--- a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
+++ b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
@@ -256,7 +256,7 @@ void tst_QFontComboBox::writingSystem_data()
QTest::newRow("Runic") << QFontDatabase::Runic;
for (int i = 0; i < 31; ++i)
- QTest::newRow("enum") << (QFontDatabase::WritingSystem)i;
+ QTest::newRow(qPrintable(QString("enum %1").arg(i))) << (QFontDatabase::WritingSystem)i;
}
// public QFontDatabase::WritingSystem writingSystem() const
diff --git a/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp b/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp
index 6aec414ae6..99d8ded15c 100644
--- a/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp
+++ b/tests/auto/widgets/widgets/qintvalidator/tst_qintvalidator.cpp
@@ -70,8 +70,8 @@ void tst_QIntValidator::validate_data()
QTest::newRow("data1") << 0 << 100 << QString("500") << INV;
QTest::newRow("data1a") << 0 << 100 << QString("5000") << INV;
QTest::newRow("data1b") << -100 << 0 << QString("50") << INT;
- QTest::newRow("data1b") << -100 << 0 << QString("500") << INV;
- QTest::newRow("data1c") << -100 << 0 << QString("5000") << INV;
+ QTest::newRow("data1c") << -100 << 0 << QString("500") << INV;
+ QTest::newRow("data1d") << -100 << 0 << QString("5000") << INV;
QTest::newRow("data2") << 0 << 100 << QString("-35") << INV;
QTest::newRow("data3") << 0 << 100 << QString("a") << INV;
QTest::newRow("data4") << 0 << 100 << QString("-") << INV;
diff --git a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp
index 6d6b9384b9..d8b2a800b9 100644
--- a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp
+++ b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp
@@ -312,7 +312,7 @@ void tst_QLabel::eventPropagation_data()
QTest::newRow("rich text2") << QString("<b>rich text</b>") << (int)Qt::TextSelectableByKeyboard << (int)Qt::ClickFocus << true;
QTest::newRow("rich text3") << QString("<b>rich text</b>") << (int)Qt::TextSelectableByMouse << (int)Qt::ClickFocus << false;
QTest::newRow("rich text4") << QString("<b>rich text</b>") << (int)Qt::NoTextInteraction << (int)Qt::NoFocus << true;
- QTest::newRow("rich text4") << QString("<b>rich text</b>") << (int)Qt::LinksAccessibleByKeyboard << (int)Qt::StrongFocus << true;
+ QTest::newRow("rich text5") << QString("<b>rich text</b>") << (int)Qt::LinksAccessibleByKeyboard << (int)Qt::StrongFocus << true;
if (!test_box)
test_box = new Widget;
diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
index b004efd07c..645f47fc72 100644
--- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
@@ -647,22 +647,21 @@ void tst_QLineEdit::inputMask_data()
QTest::addColumn<QString>("expectedMask");
// if no mask is set a nul string should be returned
- QTest::newRow("") << QString("") << QString();
- QTest::newRow("") << QString() << QString();
+ QTest::newRow("nul 1") << QString("") << QString();
+ QTest::newRow("nul 2") << QString() << QString();
// try different masks
- QTest::newRow("") << QString("000.000.000.000") << QString("000.000.000.000; ");
- QTest::newRow("") << QString("000.000.000.000;#") << QString("000.000.000.000;#");
- QTest::newRow("") << QString("AAA.aa.999.###;") << QString("AAA.aa.999.###; ");
- QTest::newRow("") << QString(">abcdef<GHIJK") << QString(">abcdef<GHIJK; ");
-// QTest::newRow("") << QString() << QString();
+ QTest::newRow("mask 1") << QString("000.000.000.000") << QString("000.000.000.000; ");
+ QTest::newRow("mask 2") << QString("000.000.000.000;#") << QString("000.000.000.000;#");
+ QTest::newRow("mask 3") << QString("AAA.aa.999.###;") << QString("AAA.aa.999.###; ");
+ QTest::newRow("mask 4") << QString(">abcdef<GHIJK") << QString(">abcdef<GHIJK; ");
// set an invalid input mask...
// the current behaviour is that this exact (faulty) string is returned.
- QTest::newRow("") << QString("ABCDEFGHIKLMNOP;") << QString("ABCDEFGHIKLMNOP; ");
+ QTest::newRow("invalid") << QString("ABCDEFGHIKLMNOP;") << QString("ABCDEFGHIKLMNOP; ");
// verify that we can unset the mask again
- QTest::newRow("") << QString("") << QString();
+ QTest::newRow("unset") << QString("") << QString();
}
void tst_QLineEdit::inputMask()
@@ -3441,32 +3440,32 @@ void tst_QLineEdit::task233101_cursorPosAfterInputMethod_data()
QTest::addColumn<int>("replacementLength");
QTest::addColumn<QString>("commitString");
- QTest::newRow("") << 4 << 4 << 0 << 0 << QString("");
- QTest::newRow("") << 4 << 4 << 0 << 0 << QString("x");
- QTest::newRow("") << 4 << 4 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
- QTest::newRow("") << 4 << 3 << 0 << 0 << QString("");
- QTest::newRow("") << 4 << 3 << 0 << 0 << QString("x");
- QTest::newRow("") << 4 << 3 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
- QTest::newRow("") << 4 << 0 << 0 << 0 << QString("");
- QTest::newRow("") << 4 << 0 << 0 << 0 << QString("x");
- QTest::newRow("") << 4 << 0 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
-
- QTest::newRow("") << 4 << 4 << -4 << 4 << QString("");
- QTest::newRow("") << 4 << 4 << -4 << 4 << QString("x");
- QTest::newRow("") << 4 << 4 << -4 << 4 << QString("xxxxxxxxxxxxxxxx");
- QTest::newRow("") << 4 << 3 << -3 << 4 << QString("");
- QTest::newRow("") << 4 << 3 << -3 << 4 << QString("x");
- QTest::newRow("") << 4 << 3 << -3 << 4 << QString("xxxxxxxxxxxxxxxx");
- QTest::newRow("") << 4 << 0 << 0 << 4 << QString("");
- QTest::newRow("") << 4 << 0 << 0 << 4 << QString("x");
- QTest::newRow("") << 4 << 0 << 0 << 4 << QString("xxxxxxxxxxxxxxxx");
-
- QTest::newRow("") << 4 << 4 << -4 << 0 << QString("");
- QTest::newRow("") << 4 << 4 << -4 << 0 << QString("x");
- QTest::newRow("") << 4 << 4 << -4 << 0 << QString("xxxxxxxxxxxxxxxx");
- QTest::newRow("") << 4 << 3 << -3 << 0 << QString("");
- QTest::newRow("") << 4 << 3 << -3 << 0 << QString("x");
- QTest::newRow("") << 4 << 3 << -3 << 0 << QString("xxxxxxxxxxxxxxxx");
+ QTest::newRow("data1") << 4 << 4 << 0 << 0 << QString("");
+ QTest::newRow("data2") << 4 << 4 << 0 << 0 << QString("x");
+ QTest::newRow("data3") << 4 << 4 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
+ QTest::newRow("data4") << 4 << 3 << 0 << 0 << QString("");
+ QTest::newRow("data5") << 4 << 3 << 0 << 0 << QString("x");
+ QTest::newRow("data6") << 4 << 3 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
+ QTest::newRow("data7") << 4 << 0 << 0 << 0 << QString("");
+ QTest::newRow("data8") << 4 << 0 << 0 << 0 << QString("x");
+ QTest::newRow("data9") << 4 << 0 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
+
+ QTest::newRow("data10") << 4 << 4 << -4 << 4 << QString("");
+ QTest::newRow("data11") << 4 << 4 << -4 << 4 << QString("x");
+ QTest::newRow("data12") << 4 << 4 << -4 << 4 << QString("xxxxxxxxxxxxxxxx");
+ QTest::newRow("data13") << 4 << 3 << -3 << 4 << QString("");
+ QTest::newRow("data14") << 4 << 3 << -3 << 4 << QString("x");
+ QTest::newRow("data15") << 4 << 3 << -3 << 4 << QString("xxxxxxxxxxxxxxxx");
+ QTest::newRow("data16") << 4 << 0 << 0 << 4 << QString("");
+ QTest::newRow("data17") << 4 << 0 << 0 << 4 << QString("x");
+ QTest::newRow("data18") << 4 << 0 << 0 << 4 << QString("xxxxxxxxxxxxxxxx");
+
+ QTest::newRow("data19") << 4 << 4 << -4 << 0 << QString("");
+ QTest::newRow("data20") << 4 << 4 << -4 << 0 << QString("x");
+ QTest::newRow("data21") << 4 << 4 << -4 << 0 << QString("xxxxxxxxxxxxxxxx");
+ QTest::newRow("data22") << 4 << 3 << -3 << 0 << QString("");
+ QTest::newRow("data23") << 4 << 3 << -3 << 0 << QString("x");
+ QTest::newRow("data24") << 4 << 3 << -3 << 0 << QString("xxxxxxxxxxxxxxxx");
}
void tst_QLineEdit::task233101_cursorPosAfterInputMethod()
diff --git a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
index 33b7ade715..13540355c7 100644
--- a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
+++ b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
@@ -538,7 +538,7 @@ void tst_QMainWindow::menuBar()
mw.setMenuBar(mb1);
QVERIFY(mw.menuBar() != 0);
QCOMPARE(mw.menuBar(), (QMenuBar *)mb1);
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
QSKIP("With native menubar integration the menubar is not a child");
#endif
QCOMPARE(mb1->parentWidget(), (QWidget *)&mw);
diff --git a/tests/auto/widgets/widgets/qmenu/qmenu.pro b/tests/auto/widgets/widgets/qmenu/qmenu.pro
index f919c12cb5..55099f1c54 100644
--- a/tests/auto/widgets/widgets/qmenu/qmenu.pro
+++ b/tests/auto/widgets/widgets/qmenu/qmenu.pro
@@ -2,3 +2,5 @@ CONFIG += testcase
TARGET = tst_qmenu
QT += widgets testlib
SOURCES += tst_qmenu.cpp
+
+win32:CONFIG += insignificant_test # QTBUG-24325
diff --git a/tests/auto/widgets/widgets/qmenubar/qmenubar.pro b/tests/auto/widgets/widgets/qmenubar/qmenubar.pro
index 6bacaa0d37..6f35d4516f 100644
--- a/tests/auto/widgets/widgets/qmenubar/qmenubar.pro
+++ b/tests/auto/widgets/widgets/qmenubar/qmenubar.pro
@@ -5,3 +5,5 @@ SOURCES += tst_qmenubar.cpp
# QTBUG-4965, QTBUG-11823 - unstable tests
linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG += insignificant_test
+
+win32:CONFIG += insignificant_test # QTBUG-24326
diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
index 1b483512e3..4019faf428 100644
--- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
+++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
@@ -219,7 +219,7 @@ void tst_QPlainTextEdit::getSetCheck()
QCOMPARE(0, obj1.tabStopWidth());
obj1.setTabStopWidth(INT_MIN);
QCOMPARE(0, obj1.tabStopWidth()); // Makes no sense to set a negative tabstop value
-#if defined(QT_ARCH_WINDOWSCE)
+#if defined(Q_OS_WINCE)
// due to rounding error in qRound when qreal==float
// we cannot use INT_MAX for this check
obj1.setTabStopWidth(SHRT_MAX*2);
@@ -1474,11 +1474,11 @@ void tst_QPlainTextEdit::selectionChanged()
QCOMPARE(selectionChangedSpy.count(), 3);
QTest::keyClick(ed, Qt::Key_Right);
- QCOMPARE(ed->textCursor().position(), 5);
+ QCOMPARE(ed->textCursor().position(), 4);
QCOMPARE(selectionChangedSpy.count(), 4);
QTest::keyClick(ed, Qt::Key_Right);
- QCOMPARE(ed->textCursor().position(), 6);
+ QCOMPARE(ed->textCursor().position(), 5);
QCOMPARE(selectionChangedSpy.count(), 4);
}
diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp
index c3d982388d..07efb60b49 100644
--- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp
+++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp
@@ -657,22 +657,22 @@ void tst_QSpinBox::valueFromTextAndValidate_data()
QTest::newRow("data3") << QString("2") << Acceptable << 0 << 100 << QString();
QTest::newRow("data4") << QString() << Intermediate << 0 << 1 << QString();
QTest::newRow("data5") << QString() << Invalid << 0 << 0 << QString();
- QTest::newRow("data5") << QString("5") << Intermediate << 2004 << 2005 << QString();
- QTest::newRow("data6") << QString("50") << Intermediate << 2004 << 2005 << QString();
- QTest::newRow("data7") << QString("205") << Intermediate << 2004 << 2005 << QString();
- QTest::newRow("data8") << QString("2005") << Acceptable << 2004 << 2005 << QString();
- QTest::newRow("data9") << QString("3") << Intermediate << 2004 << 2005 << QString();
- QTest::newRow("data10") << QString("-") << Intermediate << -20 << -10 << QString();
- QTest::newRow("data11") << QString("-1") << Intermediate << -20 << -10 << QString();
- QTest::newRow("data12") << QString("-5") << Intermediate << -20 << -10 << QString();
- QTest::newRow("data13") << QString("-5") << Intermediate << -20 << -16 << QString();
- QTest::newRow("data14") << QString("-2") << Intermediate << -20 << -16 << QString();
- QTest::newRow("data15") << QString("2") << Invalid << -20 << -16 << QString();
- QTest::newRow("data16") << QString() << Intermediate << -20 << -16 << QString();
- QTest::newRow("data17") << QString(" 22") << Acceptable << 0 << 1000 << QString("22");
- QTest::newRow("data18") << QString("22 ") << Acceptable << 0 << 1000 << QString("22");
- QTest::newRow("data19") << QString(" 22 ") << Acceptable << 0 << 1000 << QString("22");
- QTest::newRow("data20") << QString("2 2") << Invalid << 0 << 1000 << QString();
+ QTest::newRow("data6") << QString("5") << Intermediate << 2004 << 2005 << QString();
+ QTest::newRow("data7") << QString("50") << Intermediate << 2004 << 2005 << QString();
+ QTest::newRow("data8") << QString("205") << Intermediate << 2004 << 2005 << QString();
+ QTest::newRow("data9") << QString("2005") << Acceptable << 2004 << 2005 << QString();
+ QTest::newRow("data10") << QString("3") << Intermediate << 2004 << 2005 << QString();
+ QTest::newRow("data11") << QString("-") << Intermediate << -20 << -10 << QString();
+ QTest::newRow("data12") << QString("-1") << Intermediate << -20 << -10 << QString();
+ QTest::newRow("data13") << QString("-5") << Intermediate << -20 << -10 << QString();
+ QTest::newRow("data14") << QString("-5") << Intermediate << -20 << -16 << QString();
+ QTest::newRow("data15") << QString("-2") << Intermediate << -20 << -16 << QString();
+ QTest::newRow("data16") << QString("2") << Invalid << -20 << -16 << QString();
+ QTest::newRow("data17") << QString() << Intermediate << -20 << -16 << QString();
+ QTest::newRow("data18") << QString(" 22") << Acceptable << 0 << 1000 << QString("22");
+ QTest::newRow("data19") << QString("22 ") << Acceptable << 0 << 1000 << QString("22");
+ QTest::newRow("data20") << QString(" 22 ") << Acceptable << 0 << 1000 << QString("22");
+ QTest::newRow("data21") << QString("2 2") << Invalid << 0 << 1000 << QString();
}
static QString stateName(int state)
diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
index 048f1441a2..294a656482 100644
--- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
+++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
@@ -507,7 +507,7 @@ void tst_QSplitter::setStretchFactor_data()
QTest::newRow("ok06") << int(Qt::Vertical) << 1 << 1 << 1 << 1;
QTest::newRow("ok07") << int(Qt::Vertical) << 2 << 2 << 2 << 2;
QTest::newRow("ok08") << int(Qt::Vertical) << 3 << 5 << 5 << 5;
- QTest::newRow("ok08") << int(Qt::Vertical) << -1 << 5 << 0 << 0;
+ QTest::newRow("ok09") << int(Qt::Vertical) << -1 << 5 << 0 << 0;
}
void tst_QSplitter::setStretchFactor()
diff --git a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro
index 85658c222e..294f1d84e7 100644
--- a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro
+++ b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro
@@ -17,3 +17,5 @@ wince* {
}
contains(QT_CONFIG,xcb):CONFIG+=insignificant_test # QTBUG-20756 crashes on xcb
+
+win32:CONFIG += insignificant_test # QTBUG-24348
diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
index 47eb3a59a3..249e9d7fbe 100644
--- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
+++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
@@ -288,7 +288,7 @@ void tst_QTextEdit::getSetCheck()
QCOMPARE(0, obj1.tabStopWidth());
obj1.setTabStopWidth(INT_MIN);
QCOMPARE(0, obj1.tabStopWidth()); // Makes no sense to set a negative tabstop value
-#if defined(QT_ARCH_WINDOWSCE)
+#if defined(Q_OS_WINCE)
// due to rounding error in qRound when qreal==float
// we cannot use INT_MAX for this check
obj1.setTabStopWidth(SHRT_MAX*2);
@@ -1840,11 +1840,11 @@ void tst_QTextEdit::selectionChanged()
QCOMPARE(selectionChangedSpy.count(), 3);
QTest::keyClick(ed, Qt::Key_Right);
- QCOMPARE(ed->textCursor().position(), 5);
+ QCOMPARE(ed->textCursor().position(), 4);
QCOMPARE(selectionChangedSpy.count(), 4);
QTest::keyClick(ed, Qt::Key_Right);
- QCOMPARE(ed->textCursor().position(), 6);
+ QCOMPARE(ed->textCursor().position(), 5);
QCOMPARE(selectionChangedSpy.count(), 4);
}
diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp
index 48b68d1795..df4efd658a 100644
--- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp
+++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp
@@ -142,6 +142,10 @@ void tst_QToolButton::triggered()
QCOMPARE(spy.count(),1);
QCOMPARE(qvariant_cast<QAction *>(spy.at(0).at(0)), def);
+#ifdef Q_OS_MAC
+ QSKIP("QTBUG-24374 - This test hangs here on Mac OSX");
+#endif
+
w = menu;
QTimer::singleShot(30, this, SLOT(sendMouseClick()));
tb.showMenu();
diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp
index f9570f7631..d79044157a 100644
--- a/tests/auto/xml/dom/qdom/tst_qdom.cpp
+++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp
@@ -555,7 +555,6 @@ void tst_QDom::saveWithSerialization_data() const
if (prefix.isEmpty())
QFAIL("Cannot find testdata!");
QTest::newRow("doc01.xml") << QString(prefix + "/doc01.xml");
- QTest::newRow("doc01.xml") << QString(prefix + "/doc01.xml");
QTest::newRow("doc02.xml") << QString(prefix + "/doc02.xml");
QTest::newRow("doc03.xml") << QString(prefix + "/doc03.xml");
QTest::newRow("doc04.xml") << QString(prefix + "/doc04.xml");
@@ -1868,34 +1867,34 @@ void tst_QDom::setContentWhitespace_data() const
QTest::addColumn<QString>("doc");
QTest::addColumn<bool>("expectedValidity");
- QTest::newRow("") << QString::fromLatin1(" <e/>") << true;
- QTest::newRow("") << QString::fromLatin1(" <e/>") << true;
- QTest::newRow("") << QString::fromLatin1(" <e/>") << true;
- QTest::newRow("") << QString::fromLatin1(" <e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\n<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\n\n<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\n\n\n<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\n\n\n\n<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\t<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\t\t<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\t\t\t<e/>") << true;
- QTest::newRow("") << QString::fromLatin1("\t\t\t\t<e/>") << true;
+ QTest::newRow("data1") << QString::fromLatin1(" <e/>") << true;
+ QTest::newRow("data2") << QString::fromLatin1(" <e/>") << true;
+ QTest::newRow("data3") << QString::fromLatin1(" <e/>") << true;
+ QTest::newRow("data4") << QString::fromLatin1(" <e/>") << true;
+ QTest::newRow("data5") << QString::fromLatin1("\n<e/>") << true;
+ QTest::newRow("data6") << QString::fromLatin1("\n\n<e/>") << true;
+ QTest::newRow("data7") << QString::fromLatin1("\n\n\n<e/>") << true;
+ QTest::newRow("data8") << QString::fromLatin1("\n\n\n\n<e/>") << true;
+ QTest::newRow("data9") << QString::fromLatin1("\t<e/>") << true;
+ QTest::newRow("data10") << QString::fromLatin1("\t\t<e/>") << true;
+ QTest::newRow("data11") << QString::fromLatin1("\t\t\t<e/>") << true;
+ QTest::newRow("data12") << QString::fromLatin1("\t\t\t\t<e/>") << true;
/* With XML prolog. */
- QTest::newRow("") << QString::fromLatin1("<?xml version='1.0' ?><e/>") << true;
-
- QTest::newRow("") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\n<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\n\n<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\n\n\n<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\n\n\n\n<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\t<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\t\t<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\t\t\t<?xml version='1.0' ?><e/>") << false;
- QTest::newRow("") << QString::fromLatin1("\t\t\t\t<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data13") << QString::fromLatin1("<?xml version='1.0' ?><e/>") << true;
+
+ QTest::newRow("data14") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data15") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data16") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data17") << QString::fromLatin1(" <?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data18") << QString::fromLatin1("\n<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data19") << QString::fromLatin1("\n\n<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data20") << QString::fromLatin1("\n\n\n<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data21") << QString::fromLatin1("\n\n\n\n<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data22") << QString::fromLatin1("\t<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data23") << QString::fromLatin1("\t\t<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data24") << QString::fromLatin1("\t\t\t<?xml version='1.0' ?><e/>") << false;
+ QTest::newRow("data25") << QString::fromLatin1("\t\t\t\t<?xml version='1.0' ?><e/>") << false;
}
void tst_QDom::taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() const
diff --git a/tests/benchmarks/corelib/io/qfile/main.cpp b/tests/benchmarks/corelib/io/qfile/main.cpp
index 92edd43060..3d16921b7f 100644
--- a/tests/benchmarks/corelib/io/qfile/main.cpp
+++ b/tests/benchmarks/corelib/io/qfile/main.cpp
@@ -542,7 +542,7 @@ void tst_qfile::createSmallFiles()
dir.cd("tst");
tmpDirName = dir.absolutePath();
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
for (int i = 0; i < 100; ++i)
#else
for (int i = 0; i < 1000; ++i)
diff --git a/tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp
index 14895863e4..a3cdd38e56 100644
--- a/tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp
+++ b/tests/benchmarks/corelib/kernel/qmetatype/tst_qmetatype.cpp
@@ -72,6 +72,8 @@ private slots:
void constructCoreType_data();
void constructCoreType();
+ void constructCoreTypeStaticLess_data();
+ void constructCoreTypeStaticLess();
void constructCoreTypeCopy_data();
void constructCoreTypeCopy();
@@ -79,6 +81,8 @@ private slots:
void constructInPlace();
void constructInPlaceCopy_data();
void constructInPlaceCopy();
+ void constructInPlaceCopyStaticLess_data();
+ void constructInPlaceCopyStaticLess();
};
tst_QMetaType::tst_QMetaType()
@@ -89,6 +93,12 @@ tst_QMetaType::~tst_QMetaType()
{
}
+struct BigClass
+{
+ double n,i,e,r,o,b;
+};
+Q_DECLARE_METATYPE(BigClass);
+
void tst_QMetaType::typeBuiltin_data()
{
QTest::addColumn<QByteArray>("typeName");
@@ -240,7 +250,7 @@ void tst_QMetaType::isRegisteredNotRegistered()
void tst_QMetaType::constructCoreType_data()
{
QTest::addColumn<int>("typeId");
- for (int i = 0; i <= QMetaType::LastCoreType; ++i)
+ for (int i = QMetaType::FirstCoreType; i <= QMetaType::LastCoreType; ++i)
QTest::newRow(QMetaType::typeName(i)) << i;
// GUI types are tested in tst_QGuiMetaType.
}
@@ -260,6 +270,23 @@ void tst_QMetaType::constructCoreType()
}
}
+void tst_QMetaType::constructCoreTypeStaticLess_data()
+{
+ constructCoreType_data();
+}
+
+void tst_QMetaType::constructCoreTypeStaticLess()
+{
+ QFETCH(int, typeId);
+ QBENCHMARK {
+ QMetaType type(typeId);
+ for (int i = 0; i < 100000; ++i) {
+ void *data = type.create((void *)0);
+ type.destroy(data);
+ }
+ }
+}
+
void tst_QMetaType::constructCoreTypeCopy_data()
{
constructCoreType_data();
@@ -285,6 +312,7 @@ void tst_QMetaType::constructCoreTypeCopy()
void tst_QMetaType::constructInPlace_data()
{
constructCoreType_data();
+ QTest::newRow("custom") << qMetaTypeId<BigClass>();
}
void tst_QMetaType::constructInPlace()
@@ -305,7 +333,7 @@ void tst_QMetaType::constructInPlace()
void tst_QMetaType::constructInPlaceCopy_data()
{
- constructCoreType_data();
+ constructInPlace_data();
}
void tst_QMetaType::constructInPlaceCopy()
@@ -326,5 +354,29 @@ void tst_QMetaType::constructInPlaceCopy()
qFreeAligned(storage);
}
+void tst_QMetaType::constructInPlaceCopyStaticLess_data()
+{
+ constructInPlaceCopy_data();
+}
+
+void tst_QMetaType::constructInPlaceCopyStaticLess()
+{
+ QFETCH(int, typeId);
+ int size = QMetaType::sizeOf(typeId);
+ void *storage = qMallocAligned(size, 2 * sizeof(qlonglong));
+ void *other = QMetaType::create(typeId);
+ QCOMPARE(QMetaType::construct(typeId, storage, other), storage);
+ QMetaType::destruct(typeId, storage);
+ QBENCHMARK {
+ QMetaType type(typeId);
+ for (int i = 0; i < 100000; ++i) {
+ type.construct(storage, other);
+ type.destruct(storage);
+ }
+ }
+ QMetaType::destroy(typeId, other);
+ qFreeAligned(storage);
+}
+
QTEST_MAIN(tst_QMetaType)
#include "tst_qmetatype.moc"
diff --git a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
index 0c4af17376..f6b4d88311 100644
--- a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -90,6 +90,7 @@ struct BigClass
double n,i,e,r,o,b;
};
Q_STATIC_ASSERT(sizeof(BigClass) > sizeof(QVariant::Private::Data));
+Q_DECLARE_TYPEINFO(BigClass, Q_MOVABLE_TYPE);
Q_DECLARE_METATYPE(BigClass);
struct SmallClass
@@ -97,6 +98,7 @@ struct SmallClass
char s;
};
Q_STATIC_ASSERT(sizeof(SmallClass) <= sizeof(QVariant::Private::Data));
+Q_DECLARE_TYPEINFO(SmallClass, Q_MOVABLE_TYPE);
Q_DECLARE_METATYPE(SmallClass);
void tst_qvariant::testBound()
@@ -305,7 +307,7 @@ void tst_qvariant::stringVariantValue()
void tst_qvariant::createCoreType_data()
{
QTest::addColumn<int>("typeId");
- for (int i = 0; i <= QMetaType::LastCoreType; ++i)
+ for (int i = QMetaType::FirstCoreType; i <= QMetaType::LastCoreType; ++i)
QTest::newRow(QMetaType::typeName(i)) << i;
}
diff --git a/tests/benchmarks/corelib/tools/containers-sequential/main.cpp b/tests/benchmarks/corelib/tools/containers-sequential/main.cpp
index ee13a63a57..e42a40b110 100644
--- a/tests/benchmarks/corelib/tools/containers-sequential/main.cpp
+++ b/tests/benchmarks/corelib/tools/containers-sequential/main.cpp
@@ -133,7 +133,7 @@ struct Large { // A "large" item type
};
// Embedded devices typically have limited memory
-#if defined(Q_WS_WINCE)
+#if defined(Q_OS_WINCE)
# define LARGE_MAX_SIZE 2000
#else
# define LARGE_MAX_SIZE 20000
diff --git a/tests/benchmarks/corelib/tools/qhash/main.cpp b/tests/benchmarks/corelib/tools/qhash/main.cpp
index 6f3228d0eb..18138cbd47 100644
--- a/tests/benchmarks/corelib/tools/qhash/main.cpp
+++ b/tests/benchmarks/corelib/tools/qhash/main.cpp
@@ -45,7 +45,7 @@
#include <QHash>
#include <QString>
#include <QStringList>
-
+#include <QUuid>
#include <QTest>
@@ -69,12 +69,36 @@ private:
void tst_QHash::data()
{
- QFile smallPathsData("paths_small_data.txt");
- smallPathsData.open(QIODevice::ReadOnly);
-
QTest::addColumn<QStringList>("items");
- QTest::newRow("paths-small")
- << QString::fromLatin1(smallPathsData.readAll()).split(QLatin1Char('\n'));
+ static QStringList smallFilePaths;
+
+ {
+ // small list of file paths
+ if (smallFilePaths.isEmpty()) {
+ QFile smallPathsData("paths_small_data.txt");
+ QVERIFY(smallPathsData.open(QIODevice::ReadOnly));
+ smallFilePaths = QString::fromLatin1(smallPathsData.readAll()).split(QLatin1Char('\n'));
+ Q_ASSERT(!smallFilePaths.isEmpty());
+ }
+
+ QTest::newRow("paths-small") << smallFilePaths;
+ }
+
+ {
+ // list of UUIDs
+ static QStringList uuids;
+ if (uuids.isEmpty()) {
+ // guaranteed to be completely random, generated by http://xkcd.com/221/
+ QUuid ns = QUuid("{f43d2ef3-2fe9-4563-a6f5-5a0100c2d699}");
+ uuids.reserve(smallFilePaths.size());
+
+ foreach (const QString &path, smallFilePaths)
+ uuids.append(QUuid::createUuidV5(ns, path).toString());
+ }
+
+ QTest::newRow("uuids-list") << uuids;
+ }
+
}
void tst_QHash::qhash_qt4()
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index cc549f835d..8eef993c06 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -414,7 +414,7 @@ void tst_QGraphicsView::chipTester_data()
void tst_QGraphicsView::chipTester()
{
-#ifdef Q_WS_WINCE_WM
+#ifdef Q_OS_WINCE_WM
QSKIP("WinCE WM: Fails on Windows Mobile w/o OpenGL");
#endif
QFETCH(bool, antialias);
diff --git a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp
index e48172da89..829bba5c5d 100644
--- a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -565,7 +565,7 @@ void tst_qnetworkreply::uploadPerformance()
void tst_qnetworkreply::httpUploadPerformance()
{
-#if defined(Q_WS_WINCE_WM)
+#if defined(Q_OS_WINCE_WM)
// Show some mercy for non-desktop platform/s
enum {UploadSize = 4*1024*1024}; // 4 MB
#else
@@ -636,7 +636,7 @@ void tst_qnetworkreply::httpDownloadPerformance()
{
QFETCH(bool, serverSendsContentLength);
QFETCH(bool, chunkedEncoding);
-#if defined(Q_WS_WINCE_WM)
+#if defined(Q_OS_WINCE_WM)
// Show some mercy to non-desktop platform/s
enum {UploadSize = 4*1024*1024}; // 4 MB
#else
@@ -720,7 +720,7 @@ void tst_qnetworkreply::httpDownloadPerformanceDownloadBuffer()
QFETCH(HttpDownloadPerformanceDownloadBufferTestType, testType);
// On my Linux Desktop the results are already visible with 128 kB, however we use this to have good results.
-#if defined(Q_WS_WINCE_WM)
+#if defined(Q_OS_WINCE_WM)
// Show some mercy to non-desktop platform/s
enum {UploadSize = 4*1024*1024}; // 4 MB
#else
diff --git a/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp
index ea923a7fd0..2bb23e5781 100644
--- a/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp
@@ -173,7 +173,7 @@ void tst_QTcpServer::ipv6LoopbackPerformanceTest()
QFETCH_GLOBAL(bool, setProxy);
if (setProxy)
return;
-#if defined(Q_WS_WINCE_WM)
+#if defined(Q_OS_WINCE_WM)
QSKIP("WinCE WM: Not yet supported");
#endif
diff --git a/tests/manual/cmake/CMakeLists.txt b/tests/manual/cmake/CMakeLists.txt
index 91ead649ec..7ec3cebf4b 100644
--- a/tests/manual/cmake/CMakeLists.txt
+++ b/tests/manual/cmake/CMakeLists.txt
@@ -1,35 +1,88 @@
+# This is an automatic test for the CMake configuration files.
+# To run it,
+# 1) mkdir build # Create a build directory
+# 2) cd build
+# 3) cmake .. # Run cmake on this directory.
+# 4) ctest # Run ctest
+#
+# The expected output is something like:
+#
+# Start 1: pass1
+# 1/7 Test #1: pass1 ............................ Passed 4.25 sec
+# Start 2: pass2
+# 2/7 Test #2: pass2 ............................ Passed 2.00 sec
+# Start 3: pass3
+# 3/7 Test #3: pass3 ............................ Passed 2.85 sec
+# Start 4: fail4
+# 4/7 Test #4: fail4 ............................ Passed 1.88 sec
+# Start 5: fail5
+# 5/7 Test #5: fail5 ............................ Passed 1.36 sec
+# Start 6: pass_needsquoting_6
+# 6/7 Test #6: pass_needsquoting_6 .............. Passed 2.88 sec
+# Start 7: pass7
+# 7/7 Test #7: pass7 ............................ Passed 0.93 sec
+#
+# Note that if Qt is not installed, or if it is installed to a
+# non-standard prefix, the environment variable CMAKE_PREFIX_PATH
+# needs to be set to the installation prefix or build prefix of Qt
+# before running these tests.
+
cmake_minimum_required(VERSION 2.8)
project(qmake_cmake_files)
-macro(_do_build _dir)
- try_compile(Result ${CMAKE_CURRENT_BINARY_DIR}/${_dir}
- ${CMAKE_CURRENT_SOURCE_DIR}/${_dir}
- ${_dir}
- OUTPUT_VARIABLE Out
- )
-endmacro()
+enable_testing()
macro(expect_pass _dir)
- _do_build(${_dir})
- if (NOT Result)
- message(SEND_ERROR "Build failed: ${Out}")
- endif()
+ string(REPLACE "(" "_" testname "${_dir}")
+ string(REPLACE ")" "_" testname "${testname}")
+ add_test(${testname} ${CMAKE_CTEST_COMMAND}
+ --build-and-test
+ "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}"
+ "${CMAKE_CURRENT_BINARY_DIR}/${_dir}"
+ --build-generator ${CMAKE_GENERATOR}
+ --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ )
endmacro()
macro(expect_fail _dir)
- _do_build(${_dir})
- if (Result)
- message(SEND_ERROR "Build should fail, but did not: ${Out}")
- endif()
+ string(REPLACE "(" "_" testname "${_dir}")
+ string(REPLACE ")" "_" testname "${testname}")
+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}")
+ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}")
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/CMakeLists.txt"
+ "
+ cmake_minimum_required(VERSION 2.8)
+ project(${_dir}_build)
+
+ try_compile(Result \${CMAKE_CURRENT_BINARY_DIR}/${_dir}
+ \${CMAKE_CURRENT_SOURCE_DIR}/${_dir}
+ ${_dir}
+ )
+ if (Result)
+ message(SEND_ERROR \"Succeeded build which should fail\")
+ endif()
+ "
+ )
+ add_test(${testname} ${CMAKE_CTEST_COMMAND}
+ --build-and-test
+ "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}"
+ "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/build"
+ --build-generator ${CMAKE_GENERATOR}
+ --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ )
endmacro()
if(${CMAKE_VERSION} VERSION_GREATER 2.8.7)
# Requires CMAKE_AUTOMOC function in CMake 2.8.7
expect_pass(pass1)
+else()
+ message("CMake version older than 2.8.7. Not running test \"pass1\"")
endif()
expect_pass(pass2)
expect_pass(pass3)
expect_fail(fail4)
expect_fail(fail5)
+expect_pass("pass(needsquoting)6")
+expect_pass(pass7)
diff --git a/tests/manual/cmake/fail4/CMakeLists.txt b/tests/manual/cmake/fail4/CMakeLists.txt
index dcd4b8bd65..2466e24d3a 100644
--- a/tests/manual/cmake/fail4/CMakeLists.txt
+++ b/tests/manual/cmake/fail4/CMakeLists.txt
@@ -7,6 +7,8 @@ find_package(Qt5Core REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS})
+add_definitions(${Qt5Core_DEFINITIONS})
+
qt5_wrap_cpp(moc_files myobject.h)
# Test options. The -binary option generates a binary to dlopen instead of
diff --git a/tests/manual/cmake/fail5/CMakeLists.txt b/tests/manual/cmake/fail5/CMakeLists.txt
index f82a62b626..9aedf4a008 100644
--- a/tests/manual/cmake/fail5/CMakeLists.txt
+++ b/tests/manual/cmake/fail5/CMakeLists.txt
@@ -7,6 +7,8 @@ find_package(Qt5Core REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS})
+add_definitions(${Qt5Core_DEFINITIONS})
+
# Test options. The -i option removes the include "myobject.h" from the moc file
# causing a compile failure. -> Options work
qt5_wrap_cpp(moc_files myobject.h OPTIONS -i)
diff --git a/tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt b/tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt
index cc1a1bc588..fb971f9ebd 100644
--- a/tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt
+++ b/tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt
@@ -9,6 +9,8 @@ find_package(Qt5Widgets REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS})
+add_definitions(${Qt5Core_DEFINITIONS})
+
set(CMAKE_INCLUDE_CURRENT_DIR ON)
qt5_wrap_cpp(moc_files mywidget.h)
diff --git a/tests/manual/cmake/pass1/CMakeLists.txt b/tests/manual/cmake/pass1/CMakeLists.txt
index f11887e545..b1922c075b 100644
--- a/tests/manual/cmake/pass1/CMakeLists.txt
+++ b/tests/manual/cmake/pass1/CMakeLists.txt
@@ -18,6 +18,7 @@ macro(qt5_use_package _target _package)
# set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Qt5${_package}_INCLUDE_DIRS})
include_directories(${Qt5${_package}_INCLUDE_DIRS})
set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${Qt5${_package}_COMPILE_DEFINITIONS})
+ set_property(TARGET ${_target} APPEND PROPERTY COMPILE_FLAGS ${Qt5${_package}_COMPILE_FLAGS})
else()
message(FATAL_ERROR "NOT FOUND: Qt5${_package}")
endif()
diff --git a/tests/manual/cmake/pass2/CMakeLists.txt b/tests/manual/cmake/pass2/CMakeLists.txt
index ac1bb15846..a52744623e 100644
--- a/tests/manual/cmake/pass2/CMakeLists.txt
+++ b/tests/manual/cmake/pass2/CMakeLists.txt
@@ -7,6 +7,8 @@ find_package(Qt5Core REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS})
+add_definitions(${Qt5Core_DEFINITIONS})
+
qt5_wrap_cpp(moc_files myobject.h)
qt5_add_resources(rcc_files "pass2.qrc")
diff --git a/tests/manual/cmake/pass3/CMakeLists.txt b/tests/manual/cmake/pass3/CMakeLists.txt
index 11402e2e18..b836161813 100644
--- a/tests/manual/cmake/pass3/CMakeLists.txt
+++ b/tests/manual/cmake/pass3/CMakeLists.txt
@@ -8,6 +8,8 @@ find_package(Qt5Widgets REQUIRED)
include_directories(${Qt5Widgets_INCLUDE_DIRS})
+add_definitions(${Qt5Core_DEFINITIONS})
+
set(CMAKE_INCLUDE_CURRENT_DIR ON)
qt5_wrap_cpp(moc_files mywidget.h)
diff --git a/tests/manual/cmake/pass7/CMakeLists.txt b/tests/manual/cmake/pass7/CMakeLists.txt
new file mode 100644
index 0000000000..e7c9b46ead
--- /dev/null
+++ b/tests/manual/cmake/pass7/CMakeLists.txt
@@ -0,0 +1,11 @@
+
+cmake_minimum_required(VERSION 2.8)
+
+project(pass7)
+
+find_package(Qt5Core REQUIRED)
+
+include_directories(${Qt5Core_INCLUDE_DIRS})
+add_definitions(${Qt5Core_DEFINITIONS})
+
+add_executable(myobject main.cpp)
diff --git a/tests/manual/cmake/pass7/main.cpp b/tests/manual/cmake/pass7/main.cpp
new file mode 100644
index 0000000000..0a6b09d877
--- /dev/null
+++ b/tests/manual/cmake/pass7/main.cpp
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplatformdefs.h"
+
+int main(int argc, char **argv)
+{
+ return 0;
+}
diff --git a/tests/manual/qnetworkconfigurationmanager/main.cpp b/tests/manual/qnetworkconfigurationmanager/main.cpp
new file mode 100644
index 0000000000..2ac33d4fe1
--- /dev/null
+++ b/tests/manual/qnetworkconfigurationmanager/main.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <qtest.h>
+#include <QtTest/QtTest>
+#include <QtNetwork/qnetworkconfigmanager.h>
+
+class tst_qnetworkconfigurationmanager : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void isOnline();
+};
+
+class SignalHandler : public QObject
+{
+ Q_OBJECT
+
+public slots:
+ void onOnlineStateChanged(bool isOnline)
+ {
+ qDebug() << "Online state changed to:" << isOnline;
+ }
+};
+
+void tst_qnetworkconfigurationmanager::isOnline()
+{
+ QNetworkConfigurationManager manager;
+ qDebug() << "Testing QNetworkConfigurationManager online status reporting functionality.";
+ qDebug() << "This should tell the current online state:" << manager.isOnline();
+ qDebug() << "Now please plug / unplug the network cable, and check the state update signal.";
+ qDebug() << "Note that there might be some delays before you see the change, depending on the backend.";
+
+ SignalHandler signalHandler;
+ connect(&manager, SIGNAL(onlineStateChanged(bool)), &signalHandler, SLOT(onOnlineStateChanged(bool)));
+
+ // event loop
+ QTestEventLoop::instance().enterLoop(30);
+ QVERIFY(QTestEventLoop::instance().timeout());
+}
+
+QTEST_MAIN(tst_qnetworkconfigurationmanager)
+
+#include "main.moc"
diff --git a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
new file mode 100644
index 0000000000..613fcd85e4
--- /dev/null
+++ b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
@@ -0,0 +1,13 @@
+CONFIG += testcase
+TEMPLATE = app
+TARGET = tst_qnetworkconfigurationmanager
+DEPENDPATH += .
+INCLUDEPATH += .
+
+QT -= gui
+QT += network testlib
+
+CONFIG += release
+
+# Input
+SOURCES += main.cpp
diff --git a/tools/configure/Makefile.mingw b/tools/configure/Makefile.mingw
new file mode 100644
index 0000000000..5951cb4e92
--- /dev/null
+++ b/tools/configure/Makefile.mingw
@@ -0,0 +1,92 @@
+CORESRC = $(QTSRC)src/corelib
+TOOLSRC = $(QTSRC)tools
+CONFSRC = $(TOOLSRC)/configure
+
+RAW_PCH = configure_pch.h
+PCH = $(RAW_PCH).gch/c++
+CXX = g++
+DEFINES = -DUNICODE -DQT_NODLL -DQT_NO_DATASTREAM -DQT_NO_CODECS -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_STL -DQT_NO_COMPRESS -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DCOMMERCIAL_VERSION
+INCPATH = -I"../../include" -I"../../include/QtCore" -I"../../include/QtCore/$(QTVERSION)" -I"../../include/QtCore/$(QTVERSION)/QtCore" -I"$(TOOLSRC)/shared" -I"$(QTSRC)mkspecs/win32-g++"
+CXXFLAGS_BARE = -fno-rtti -fno-exceptions -mthreads -Wall -Wextra $(DEFINES) $(INCPATH)
+CXXFLAGS = -include $(RAW_PCH) $(CXXFLAGS_BARE)
+LINK = g++
+LFLAGS = -Wl,-subsystem,console -mthreads
+LIBS = -lole32 -ladvapi32 -luuid
+
+TARGET = ../../configure.exe
+
+OBJECTS = \
+ main.o \
+ configureapp.o \
+ environment.o \
+ tools.o \
+ qbytearray.o \
+ qbytearraymatcher.o \
+ qhash.o \
+ qlist.o \
+ qlocale.o \
+ qlocale_win.o \
+ qlocale_tools.o \
+ qvector.o \
+ qutfcodec.o \
+ qtextcodec.o \
+ qglobal.o \
+ qnumeric.o \
+ qbuffer.o \
+ qdatastream.o \
+ qdir.o \
+ qdiriterator.o \
+ qfile.o \
+ qfileinfo.o \
+ qabstractfileengine.o \
+ qfilesystementry.o \
+ qfilesystemengine.o \
+ qfilesystemengine_win.o \
+ qfilesystemiterator_win.o \
+ qfsfileengine.o \
+ qfsfileengine_win.o \
+ qfsfileengine_iterator.o \
+ qiodevice.o \
+ qtextstream.o \
+ qlogging.o \
+ qtemporaryfile.o \
+ qsystemlibrary.o \
+ qbitarray.o \
+ qdatetime.o \
+ qmap.o \
+ qregexp.o \
+ qstring.o \
+ qstringlist.o \
+ qvsnprintf.o \
+ qvariant.o \
+ qsystemerror.o \
+ qurl.o \
+ qmetatype.o \
+ qmalloc.o \
+ qxmlstream.o \
+ qxmlutils.o \
+ quuid.o \
+ qcryptographichash.o \
+ registry.o
+
+$(TARGET): $(OBJECTS)
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
+
+$(OBJECTS): $(PCH)
+
+CHK_DIR_EXISTS = test -d
+MKDIR=mkdir -p
+$(PCH): $(CONFSRC)/configure_pch.h
+ @$(CHK_DIR_EXISTS) $(RAW_PCH).gch || $(MKDIR) $(RAW_PCH).gch
+ $(CXX) -x c++-header -c $(CXXFLAGS_BARE) -o $@ $<
+
+VPATH = $(CONFSRC):$(TOOLSRC)/shared/windows:$(CORESRC)/global:$(CORESRC)/kernel:$(CORESRC)/tools:$(CORESRC)/codecs:$(CORESRC)/io:$(CORESRC)/xml:$(CORESRC)/plugin
+
+main.o: $(CONFSRC)/configureapp.h
+configureapp.o: $(CONFSRC)/configureapp.h $(CONFSRC)/environment.h $(CONFSRC)/tools.h
+environment.o: $(CONFSRC)/environment.h
+tools.o: $(CONFSRC)/tools.h
+
+clean:
+ -rm -f *.o
+ -rm -rf *.gch
diff --git a/tools/configure/Makefile.win32 b/tools/configure/Makefile.win32
new file mode 100644
index 0000000000..92de55f137
--- /dev/null
+++ b/tools/configure/Makefile.win32
@@ -0,0 +1,157 @@
+CORESRC = $(QTSRC)src\corelib
+TOOLSRC = $(QTSRC)tools
+CONFSRC = $(TOOLSRC)\configure
+
+PCH = configure_pch.pch
+DEFINES = -DUNICODE -DQT_NODLL -DQT_NO_CODECS -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_STL -DQT_NO_COMPRESS -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DCOMMERCIAL_VERSION
+INCPATH = -I"..\..\include" -I"..\..\include\QtCore" -I"..\..\include\QtCore\$(QTVERSION)" -I"..\..\include\QtCore\$(QTVERSION)\QtCore" -I"$(TOOLSRC)\shared" -I"$(QTSRC)mkspecs\win32-msvc2008"
+CXXFLAGS_BARE = -nologo -Zm200 -Zc:wchar_t -MT -W3 -GR -EHsc -w34100 -w34189 $(EXTRA_CXXFLAGS) $(DEFINES) $(INCPATH)
+CXXFLAGS = -FIconfigure_pch.h -Yuconfigure_pch.h -Fp$(PCH) -MP $(CXXFLAGS_BARE)
+LINK = link
+LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:"configure.intermediate.manifest"
+LIBS = ole32.lib advapi32.lib
+
+TARGET = ..\..\configure.exe
+
+OBJECTS = \
+ main.obj \
+ configureapp.obj \
+ environment.obj \
+ tools.obj \
+ qbytearray.obj \
+ qbytearraymatcher.obj \
+ qhash.obj \
+ qlist.obj \
+ qlocale.obj \
+ qlocale_win.obj \
+ qlocale_tools.obj \
+ qvector.obj \
+ qutfcodec.obj \
+ qtextcodec.obj \
+ qglobal.obj \
+ qnumeric.obj \
+ qbuffer.obj \
+ qdatastream.obj \
+ qdir.obj \
+ qdiriterator.obj \
+ qfile.obj \
+ qfileinfo.obj \
+ qabstractfileengine.obj \
+ qfilesystementry.obj \
+ qfilesystemengine.obj \
+ qfilesystemengine_win.obj \
+ qfilesystemiterator_win.obj \
+ qfsfileengine.obj \
+ qfsfileengine_win.obj \
+ qfsfileengine_iterator.obj \
+ qiodevice.obj \
+ qtextstream.obj \
+ qlogging.obj \
+ qtemporaryfile.obj \
+ qsystemlibrary.obj \
+ qbitarray.obj \
+ qdatetime.obj \
+ qmap.obj \
+ qregexp.obj \
+ qstring.obj \
+ qstringlist.obj \
+ qvsnprintf.obj \
+ qvariant.obj \
+ qsystemerror.obj \
+ qurl.obj \
+ qmetatype.obj \
+ qmalloc.obj \
+ qxmlstream.obj \
+ qxmlutils.obj \
+ quuid.obj \
+ qcryptographichash.obj \
+ registry.obj
+
+$(TARGET): $(OBJECTS)
+ $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
+ $(OBJECTS) $(LIBS)
+<<
+ mt.exe -nologo -manifest "configure.intermediate.manifest" -outputresource:$(TARGET);1
+
+clean:
+ -del *.obj
+ -del *.pch
+ -del configure.intermediate.manifest
+
+$(PCH): $(CONFSRC)\configure_pch.h
+ $(CXX) -c -Yc $(CXXFLAGS_BARE) -Fp$@ -Foconfigure_pch.obj -TP $**
+
+main.obj: $(CONFSRC)\main.cpp $(CONFSRC)\configureapp.h $(PCH)
+configureapp.obj: $(CONFSRC)\configureapp.cpp $(CONFSRC)\configureapp.h $(CONFSRC)\environment.h $(CONFSRC)\tools.h $(PCH)
+environment.obj: $(CONFSRC)\environment.cpp $(CONFSRC)\environment.h $(PCH)
+tools.obj: $(CONFSRC)\tools.cpp $(CONFSRC)\tools.h $(PCH)
+registry.obj: $(TOOLSRC)\shared\windows\registry.cpp $(PCH)
+qbytearray.obj: $(CORESRC)\tools\qbytearray.cpp $(PCH)
+qbytearraymatcher.obj: $(CORESRC)\tools\qbytearraymatcher.cpp $(PCH)
+qhash.obj: $(CORESRC)\tools\qhash.cpp $(PCH)
+qlist.obj: $(CORESRC)\tools\qlist.cpp $(PCH)
+qlocale.obj: $(CORESRC)\tools\qlocale.cpp $(PCH)
+qlocale_win.obj: $(CORESRC)\tools\qlocale_win.cpp $(PCH)
+qlocale_tools.obj: $(CORESRC)\tools\qlocale_tools.cpp $(PCH)
+qvector.obj: $(CORESRC)\tools\qvector.cpp $(PCH)
+qutfcodec.obj: $(CORESRC)\codecs\qutfcodec.cpp $(PCH)
+qtextcodec.obj: $(CORESRC)\codecs\qtextcodec.cpp $(PCH)
+qglobal.obj: $(CORESRC)\global\qglobal.cpp $(PCH)
+qnumeric.obj: $(CORESRC)\global\qnumeric.cpp $(PCH)
+qbuffer.obj: $(CORESRC)\io\qbuffer.cpp $(PCH)
+qdatastream.obj: $(CORESRC)\io\qdatastream.cpp $(PCH)
+qdir.obj: $(CORESRC)\io\qdir.cpp $(PCH)
+qdiriterator.obj: $(CORESRC)\io\qdiriterator.cpp $(PCH)
+qfile.obj: $(CORESRC)\io\qfile.cpp $(PCH)
+qfileinfo.obj: $(CORESRC)\io\qfileinfo.cpp $(PCH)
+qabstractfileengine.obj: $(CORESRC)\io\qabstractfileengine.cpp $(PCH)
+qfilesystementry.obj: $(CORESRC)\io\qfilesystementry.cpp $(PCH)
+qfilesystemengine.obj: $(CORESRC)\io\qfilesystemengine.cpp $(PCH)
+qfilesystemengine_win.obj: $(CORESRC)\io\qfilesystemengine_win.cpp $(PCH)
+qfilesystemiterator_win.obj: $(CORESRC)\io\qfilesystemiterator_win.cpp $(PCH)
+qfsfileengine.obj: $(CORESRC)\io\qfsfileengine.cpp $(PCH)
+qfsfileengine_win.obj: $(CORESRC)\io\qfsfileengine_win.cpp $(PCH)
+qfsfileengine_iterator.obj: $(CORESRC)\io\qfsfileengine_iterator.cpp $(PCH)
+qiodevice.obj: $(CORESRC)\io\qiodevice.cpp $(PCH)
+qtextstream.obj: $(CORESRC)\io\qtextstream.cpp $(PCH)
+qtemporaryfile.obj: $(CORESRC)\io\qtemporaryfile.cpp $(PCH)
+qsystemlibrary.obj: $(CORESRC)\plugin\qsystemlibrary.cpp $(PCH)
+qbitarray.obj: $(CORESRC)\tools\qbitarray.cpp $(PCH)
+qdatetime.obj: $(CORESRC)\tools\qdatetime.cpp $(PCH)
+qmap.obj: $(CORESRC)\tools\qmap.cpp $(PCH)
+qregexp.obj: $(CORESRC)\tools\qregexp.cpp $(PCH)
+qstring.obj: $(CORESRC)\tools\qstring.cpp $(PCH)
+qstringlist.obj: $(CORESRC)\tools\qstringlist.cpp $(PCH)
+qvsnprintf.obj: $(CORESRC)\tools\qvsnprintf.cpp $(PCH)
+qvariant.obj: $(CORESRC)\kernel\qvariant.cpp $(PCH)
+qsystemerror.obj: $(CORESRC)\kernel\qsystemerror.cpp $(PCH)
+qurl.obj: $(CORESRC)\io\qurl.cpp $(PCH)
+qline.obj: $(CORESRC)\tools\qline.cpp $(PCH)
+qsize.obj: $(CORESRC)\tools\qsize.cpp $(PCH)
+qpoint.obj: $(CORESRC)\tools\qpoint.cpp $(PCH)
+qrect.obj: $(CORESRC)\tools\qrect.cpp $(PCH)
+qmetatype.obj: $(CORESRC)\kernel\qmetatype.cpp $(PCH)
+qmalloc.obj: $(CORESRC)\global\qmalloc.cpp $(PCH)
+qxmlstream.obj: $(CORESRC)\xml\qxmlstream.cpp $(PCH)
+qxmlutils.obj: $(CORESRC)\xml\qxmlutils.cpp $(PCH)
+quuid.obj: $(CORESRC)\plugin\quuid.cpp $(PCH)
+qcryptographichash.obj: $(CORESRC)\tools\qcryptographichash.cpp $(PCH)
+
+{$(CONFSRC)}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(TOOLSRC)\shared\windows}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\tools}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\codecs}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\global}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\io}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\kernel}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\plugin}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
+{$(CORESRC)\xml}.cpp{}.obj::
+ $(CXX) -c $(CXXFLAGS) $<
diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro
index d39d9b45cc..b0224891c3 100644
--- a/tools/configure/configure.pro
+++ b/tools/configure/configure.pro
@@ -1,13 +1,12 @@
TARGET = configure
DESTDIR = $$PWD/../.. # build directly in source dir
-CONFIG += console flat
+CONFIG += console flat stl rtti_off
CONFIG -= moc qt
-DEFINES = UNICODE QT_NODLL QT_NO_CODECS QT_NO_TEXTCODEC QT_NO_UNICODETABLES QT_LITE_COMPONENT QT_NO_STL QT_NO_COMPRESS QT_NO_THREAD QT_NO_QOBJECT _CRT_SECURE_NO_DEPRECATE
+DEFINES = UNICODE QT_NODLL QT_NO_CODECS QT_NO_TEXTCODEC QT_NO_UNICODETABLES QT_LITE_COMPONENT QT_NO_STL QT_NO_COMPRESS QT_NO_THREAD QT_NO_QOBJECT QT_NO_GEOM_VARIANT _CRT_SECURE_NO_DEPRECATE
DEFINES += QT_BOOTSTRAPPED
win32 : LIBS += -lole32 -ladvapi32
-win32-msvc.net | win32-msvc2* : QMAKE_CXXFLAGS += /EHsc
win32-g++* : LIBS += -luuid
win32-msvc* {
@@ -26,8 +25,6 @@ win32-msvc* {
PRECOMPILED_HEADER = configure_pch.h
INCLUDEPATH += \
- $$QT_SOURCE_TREE/src/corelib/arch/generic \
- $$QT_SOURCE_TREE/src/corelib/global \
$$QT_BUILD_TREE/include \
$$QT_BUILD_TREE/include/QtCore \
$$QT_BUILD_TREE/include/QtCore/$$QT.core.VERSION \
@@ -46,6 +43,7 @@ HEADERS = configureapp.h environment.h tools.h\
$$QT_SOURCE_TREE/src/corelib/codecs/qtextcodec.h \
$$QT_SOURCE_TREE/src/corelib/global/qglobal.h \
$$QT_SOURCE_TREE/src/corelib/global/qnumeric.h \
+ $$QT_SOURCE_TREE/src/corelib/global/qlogging.h \
$$QT_SOURCE_TREE/src/corelib/io/qbuffer.h \
$$QT_SOURCE_TREE/src/corelib/io/qdatastream.h \
$$QT_SOURCE_TREE/src/corelib/io/qdir.h \
@@ -89,6 +87,7 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \
$$QT_SOURCE_TREE/src/corelib/codecs/qtextcodec.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qglobal.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qnumeric.cpp \
+ $$QT_SOURCE_TREE/src/corelib/global/qlogging.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qbuffer.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdatastream.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdir.cpp \
@@ -119,10 +118,6 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qvariant.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qurl.cpp \
- $$QT_SOURCE_TREE/src/corelib/tools/qline.cpp \
- $$QT_SOURCE_TREE/src/corelib/tools/qsize.cpp \
- $$QT_SOURCE_TREE/src/corelib/tools/qpoint.cpp \
- $$QT_SOURCE_TREE/src/corelib/tools/qrect.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qmetatype.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qmalloc.cpp \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.cpp \
@@ -132,7 +127,3 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \
$$QT_SOURCE_TREE/tools/shared/windows/registry.cpp
DEFINES += COMMERCIAL_VERSION
-
-INCLUDEPATH += $$QT_SOURCE_TREE/src/corelib/arch/generic \
- $$QT_SOURCE_TREE/include/QtCore \
- $$QT_SOURCE_TREE/tools/shared
diff --git a/tools/configure/configure_pch.h b/tools/configure/configure_pch.h
index 6f601c7c29..0831364fe1 100644
--- a/tools/configure/configure_pch.h
+++ b/tools/configure/configure_pch.h
@@ -39,34 +39,11 @@
**
****************************************************************************/
-#if (defined(_WIN32) || defined(__NT__))
-# define QT_UNDEF_MACROS_IN_PCH
-# define _WINSCARD_H_
-# define _POSIX_ /* Make sure PATH_MAX et al. are defined */
-# include <limits.h>
-# undef _POSIX_ /* Don't polute */
-
- /* Make sure IP v6 is defined first of all, before windows.h */
-# include <winsock2.h>
-# include <stdlib.h>
-#endif
-
-#if defined __cplusplus
+#include <qplatformdefs.h>
#include <qglobal.h>
#include <qlist.h>
#include <qvariant.h> // All moc genereated code has this include
-#include <qplatformdefs.h>
#include <qregexp.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qtextcodec.h>
-
-#include <limits.h>
-#include <stdlib.h>
-#endif
-
-#if defined(QT_UNDEF_MACROS_IN_PCH)
-# undef max /* These are defined in windef.h, but */
-# undef min /* we don't want them when building Qt */
-# undef _WINSCARD_H_
-#endif
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index fc82fe0702..b7eeea6b60 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -114,13 +114,18 @@ Configure::Configure(int& argc, char** argv)
for (i = 1; i < argc; i++)
configCmdLine += argv[ i ];
-
- // Get the path to the executable
- wchar_t module_name[MAX_PATH];
- GetModuleFileName(0, module_name, sizeof(module_name) / sizeof(wchar_t));
- QFileInfo sourcePathInfo = QString::fromWCharArray(module_name);
- sourcePath = sourcePathInfo.absolutePath();
- sourceDir = sourcePathInfo.dir();
+ if (configCmdLine.size() >= 2 && configCmdLine.at(0) == "-srcdir") {
+ sourcePath = QDir::cleanPath(configCmdLine.at(1));
+ sourceDir = QDir(sourcePath);
+ configCmdLine.erase(configCmdLine.begin(), configCmdLine.begin() + 2);
+ } else {
+ // Get the path to the executable
+ wchar_t module_name[MAX_PATH];
+ GetModuleFileName(0, module_name, sizeof(module_name) / sizeof(wchar_t));
+ QFileInfo sourcePathInfo = QString::fromWCharArray(module_name);
+ sourcePath = sourcePathInfo.absolutePath();
+ sourceDir = sourcePathInfo.dir();
+ }
buildPath = QDir::currentPath();
#if 0
const QString installPath = QString("C:\\Qt\\%1").arg(QT_VERSION_STR);
@@ -889,6 +894,9 @@ void Configure::parseCmdLine()
else if (configCmdLine.at(i) == "-internal")
dictionary[ "QMAKE_INTERNAL" ] = "yes";
+ else if (configCmdLine.at(i) == "-no-syncqt")
+ dictionary[ "SYNCQT" ] = "no";
+
else if (configCmdLine.at(i) == "-no-qmake")
dictionary[ "BUILD_QMAKE" ] = "no";
else if (configCmdLine.at(i) == "-qmake")
@@ -3188,14 +3196,7 @@ void Configure::buildHostTools()
QString pwd = QDir::currentPath();
QStringList hostToolsDirs;
hostToolsDirs
- << "src/tools"
- << "tools/linguist/lrelease";
-
- if (dictionary["XQMAKESPEC"].startsWith("wince"))
- hostToolsDirs << "tools/checksdk";
-
- if (dictionary[ "CETEST" ] == "yes")
- hostToolsDirs << "tools/qtestlib/wince/cetest";
+ << "src/tools";
for (int i = 0; i < hostToolsDirs.count(); ++i) {
cout << "Creating " << hostToolsDirs.at(i) << " ..." << endl;
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 5e0fa00c6c..80542e7697 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -42,6 +42,7 @@
#include "environment.h"
#include <process.h>
+#include <errno.h>
#include <iostream>
#include <qdebug.h>
#include <QDir>