From ba9302b8a9b6b50f37987261c1ade9af2ade2d3c Mon Sep 17 00:00:00 2001 From: Xizhi Zhu <xizhi.zhu@gmail.com> Date: Mon, 23 Jan 2012 21:25:30 +0100 Subject: [PATCH] Remove Symbian specific code from qtbase. Change-Id: I27d37d914b71e1e43c94e2a975ffec49e1ecd456 Reviewed-by: Lars Knoll <lars.knoll@nokia.com> --- INSTALL | 2 - bin/createpackage | 3 - bin/createpackage.bat | 44 -- bin/createpackage.pl | 439 ------------------ bin/elf2e32_qtwrapper | 3 - bin/elf2e32_qtwrapper.bat | 3 - bin/elf2e32_qtwrapper.pl | 325 ------------- bin/patch_capabilities | 3 - bin/patch_capabilities.bat | 1 - bin/patch_capabilities.pl | 398 ---------------- config.tests/unix/openssl/openssl.pri | 10 - config.tests/unix/openssl/openssl.pro | 1 - configure | 3 - doc/src/examples/applicationicon.qdoc | 21 - doc/src/examples/htmlinfo.qdoc | 9 +- doc/src/examples/symbianvibration.qdoc | 192 -------- doc/src/images/symbianvibration-example.png | Bin 23217 -> 0 bytes examples/embedded/raycasting/raycasting.cpp | 4 - examples/richtext/calendar/calendar.pro | 2 - examples/widgets/imageviewer/imageviewer.pro | 2 - qtbase.pro | 30 +- tests/auto/corelib/io/qdir/tst_qdir.cpp | 2 - tests/auto/network/ssl/qsslkey/qsslkey.pro | 1 - tests/auto/widgets/util/util.pro | 4 - .../corelib/thread/qmutex/tst_qmutex.cpp | 21 +- .../qnetworkaccessmanager/qget/qget.pro | 3 - 26 files changed, 4 insertions(+), 1522 deletions(-) delete mode 100755 bin/createpackage delete mode 100755 bin/createpackage.bat delete mode 100755 bin/createpackage.pl delete mode 100755 bin/elf2e32_qtwrapper delete mode 100644 bin/elf2e32_qtwrapper.bat delete mode 100755 bin/elf2e32_qtwrapper.pl delete mode 100755 bin/patch_capabilities delete mode 100644 bin/patch_capabilities.bat delete mode 100755 bin/patch_capabilities.pl delete mode 100644 config.tests/unix/openssl/openssl.pri delete mode 100644 doc/src/examples/symbianvibration.qdoc delete mode 100644 doc/src/images/symbianvibration-example.png diff --git a/INSTALL b/INSTALL index 7279f06f580..25781a48259 100644 --- a/INSTALL +++ b/INSTALL @@ -10,5 +10,3 @@ Mac OS X: http://qt.nokia.com/doc/%SHORTVERSION%/install-mac.html Windows: http://qt.nokia.com/doc/%SHORTVERSION%/install-win.html Windows CE: http://qt.nokia.com/doc/%SHORTVERSION%/install-wince.html X11 Platforms: http://qt.nokia.com/doc/%SHORTVERSION%/install-x11.html -Symbian Platform: http://qt.nokia.com/doc/%SHORTVERSION%/install-symbian.html - diff --git a/bin/createpackage b/bin/createpackage deleted file mode 100755 index fdd4eebdea0..00000000000 --- a/bin/createpackage +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -scriptpath=`dirname $0` -perl $scriptpath/createpackage.pl "$@" diff --git a/bin/createpackage.bat b/bin/createpackage.bat deleted file mode 100755 index cf815b58a4e..00000000000 --- a/bin/createpackage.bat +++ /dev/null @@ -1,44 +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$ -:: -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -@echo off -set scriptpath=%~dp0 -perl %scriptpath%createpackage.pl %* diff --git a/bin/createpackage.pl b/bin/createpackage.pl deleted file mode 100755 index d4a953dfddb..00000000000 --- a/bin/createpackage.pl +++ /dev/null @@ -1,439 +0,0 @@ -#!/usr/bin/perl -############################################################################# -## -## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -## Contact: http://www.qt-project.org/ -## -## This file is part of the S60 port 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$ -## -############################################################################# - -############################################################################################ -# -# Convenience script for creating signed packages you can install on your phone. -# -############################################################################################ - -use strict; - -# use a command-line parsing module -use Getopt::Long; -# Use file name parsing module -use File::Basename; -# Use File::Spec services mainly rel2abs -use File::Spec; -# Use File::Path - to make stub sis target directory -use File::Path; -# use CWD abs_bath, which is exported only on request -use Cwd 'abs_path'; -use File::Copy; - -sub Usage() { - print <<ENDUSAGESTRING; - -============================================================================================== -Convenience script for creating signed packages you can install on your phone. - -Usage: createpackage.pl [options] templatepkg [target]-[platform] [certificate key [passphrase]] - -Where supported options are as follows: - [-i|install] = Install the package right away using PC suite. - [-p|preprocess] = Only preprocess the template .pkg file. - [-c|certfile <file>] = The file containing certificate information for signing. - The file can have several certificates, each specified in - separate line. The certificate, key and passphrase in line - must be ';' separated. Lines starting with '#' are treated - as a comments. Also empty lines are ignored. The paths in - <file> can be absolute or relative to <file>. - [-u|unsigned] = Preserves the unsigned package. - [-o|only-unsigned] = Creates only unsigned package. - [-s|stub] = Generates stub sis for ROM. - [-n|sisname <name>] = Specifies the final sis name. - [-g|gcce-is-armv5] = Convert gcce platform to armv5. - [-d|dont-patch] = Skip automatic patching of capabilities and pkg file if default certificate - is used. Instead non-self-signable capabilities just cause warnings. - [-t|tmp-dir <path>] = Specifies temporary directory to be used for package creation. - Defaults to 'createpackage_tmp' under same directory as templatepkg. -Where parameters are as follows: - templatepkg = Name of .pkg file template - target = Either debug or release - platform = One of the supported platform - winscw | gcce | armv5 | armv6 | armv7 - Note that when packaging binaries built using gcce and symbian-sbsv2 - mkspec, armv5 must be used for platform instead of gcce. - certificate = The certificate file used for signing - key = The certificate's private key file - passphrase = The passphrase of the certificate's private key file - -Example: - createpackage.pl fluidlauncher_template.pkg release-armv5 - -Example with certfile: - createpackage.pl -c=mycerts.txt fluidlauncher_template.pkg release-armv5 - - Content of 'mycerts.txt' must be something like this: - # This is comment line, also the empty lines are ignored - rd.cer;rd-key.pem - .\\cert\\mycert.cer;.\\cert\\mykey.key;yourpassword - X:\\QtS60\\s60installs\\selfsigned.cer;X:\\QtS60\\s60installs\\selfsigned.key - -If no certificate and key files are provided, either a RnD certificate or -a self-signed certificate from QtDir\\src\\s60installs directory is used. -In the latter case the resulting package will also be automatically patched -using patch_capabilities.pl script, which makes it unsuitable for distribution. -Always specify certificates explicitly if you wish to distribute your package. - -============================================================================================== - -ENDUSAGESTRING - - exit(); -} - -# Read given options -my $install = ""; -my $preprocessonly = ""; -my $certfile = ""; -my $preserveUnsigned = ""; -my $stub = ""; -my $signed_sis_name = ""; -my $onlyUnsigned = ""; -my $convertGcce = ""; -my $dontPatchCaps = ""; -my $tempPackageDir = ""; - -unless (GetOptions('i|install' => \$install, - 'p|preprocess' => \$preprocessonly, - 'c|certfile=s' => \$certfile, - 'u|unsigned' => \$preserveUnsigned, - 'o|only-unsigned' => \$onlyUnsigned, - 's|stub' => \$stub, - 'n|sisname=s' => \$signed_sis_name, - 'g|gcce-is-armv5' => \$convertGcce, - 'd|dont-patch' => \$dontPatchCaps, - 't|tmp-dir=s' => \$tempPackageDir,)) { - Usage(); -} - -my $epocroot = $ENV{EPOCROOT}; -my $epocToolsDir = ""; -if ($epocroot ne "") { - $epocroot =~ s,\\,/,g; - if ($epocroot =~ m,[^/]$,) { - $epocroot = $epocroot."/"; - } - $epocToolsDir = "${epocroot}epoc32/tools/"; -} - -my $certfilepath = abs_path(dirname($certfile)); - -# Read params to variables -my $templatepkg = $ARGV[0]; -my $targetplatform = lc $ARGV[1]; - -if ($targetplatform eq "") { - $targetplatform = "-"; -} - -my @tmpvalues = split('-', $targetplatform); -my $target; -$target = $tmpvalues[0] or $target = ""; -my $platform; -$platform = $tmpvalues[1] or $platform = ""; - -if ($platform =~ m/^gcce$/i) { - if (($convertGcce ne "")) { - $platform = "armv5"; - } elsif ($ENV{SBS_HOME}) { - # Print a informative note in case suspected misuse is detected. - print "\nNote: You should use armv5 as platform or specify -g parameter to convert platform\n"; - print " when packaging gcce binaries built using symbian-sbsv2 mkspec.\n\n"; - } -} - -# Convert visual target to real target (debug->udeb and release->urel) -$target =~ s/debug/udeb/i; -$target =~ s/release/urel/i; - -my $certificate; -$certificate = $ARGV[2] or $certificate = ""; -my $key; -$key = $ARGV[3] or $key = ""; -my $passphrase; -$passphrase = $ARGV[4] or $passphrase = ""; - -if ($tempPackageDir eq "") { - my ($templateVolume, $templatePath, $templateFileName) = File::Spec->splitpath($templatepkg); - $tempPackageDir = File::Spec->catpath($templateVolume, $templatePath."createpackage_tmp", ""); -} - -mkpath($tempPackageDir); - -# Generate output pkg basename (i.e. file name without extension) -my $pkgoutputbasename = $templatepkg; -$pkgoutputbasename =~ s/_template/_$targetplatform/g; -$pkgoutputbasename =~ s/_installer\.pkg/_installer___temp\.pkg/g; -$pkgoutputbasename =~ s/\.pkg//g; - -# Store output file names to variables -my ($dummy1, $dummy2, $pkgoutput) = File::Spec->splitpath($pkgoutputbasename.".pkg"); -$pkgoutput = $tempPackageDir."/".$pkgoutput; -my $sisoutputbasename; -if ($signed_sis_name eq "") { - $sisoutputbasename = $pkgoutputbasename; - $sisoutputbasename =~ s/_$targetplatform//g; - $sisoutputbasename =~ s/_installer___temp/_installer/g; - $signed_sis_name = $sisoutputbasename.".sis"; -} else { - $sisoutputbasename = $signed_sis_name; - if ($sisoutputbasename =~ m/(\.sis$|\.sisx$)/i) { - $sisoutputbasename =~ s/$1//i; - } else { - $signed_sis_name = $signed_sis_name.".sis"; - } -} - -my $installer_unsigned_app_sis_name = ""; -my $installer_app_sis_name = ""; - -if ($templatepkg =~ m/_installer\.pkg$/i && $onlyUnsigned) { - $installer_unsigned_app_sis_name = $templatepkg; - $installer_unsigned_app_sis_name =~ s/_installer.pkg$/_unsigned.sis/i; - $installer_app_sis_name = $installer_unsigned_app_sis_name; - $installer_app_sis_name =~ s/_unsigned.sis$/.sis/; -} - -my $unsigned_sis_name = $sisoutputbasename."_unsigned.sis"; -my $stub_sis_name = $sisoutputbasename.".sis"; - -my $certtext = $certificate; - -# Check some pre-conditions and print error messages if needed. -unless (length($templatepkg)) { - print "\nERROR: Template PKG filename is not defined!\n"; - Usage(); -} - -# Check template exist -stat($templatepkg); -unless( -e _ ) { - print "\nERROR: Package description file '$templatepkg' does not exist!\n"; - Usage(); -} - -# Check certifcate preconditions and set default certificate variables if needed -if (length($certificate)) { - unless(length($key)) { - print "\nERROR: Custom certificate key file parameter missing.!\n"; - Usage(); - } -} else { - #If no certificate is given, check default options - my $scriptpath = dirname(__FILE__); - my $certpath = File::Spec->catdir($scriptpath, File::Spec->updir(), "src/s60installs"); - - unless (-e $certpath) { - my $qmakeCmd = File::Spec->catfile($scriptpath, "qmake"); - $certpath = `$qmakeCmd -query QT_INSTALL_PREFIX`; - $certpath =~ s/\s+$//; - $certpath = File::Spec->catdir($certpath, "src/s60installs"); - } - - $certtext = "RnD"; - $certificate = File::Spec->catfile($certpath, "rd.cer"); - $key = File::Spec->catfile($certpath, "rd-key.pem"); - - stat($certificate); - unless( -e _ ) { - $certtext = "Self Signed"; - $certificate = File::Spec->catfile($certpath, "selfsigned.cer"); - $key = File::Spec->catfile($certpath, "selfsigned.key"); - } -} - -# Read the certificates from file to two dimensional array -my @certificates; -if (length($certfile)) { - open CERTFILE, "<$certfile" or die $!; - while(<CERTFILE>){ - s/#.*//; # ignore comments by erasing them - next if /^(\s)*$/; # skip blank lines - chomp; # remove trailing newline characters - my @certinfo = split(';', $_); # split row to certinfo - - # Trim spaces - for(@certinfo) { - s/^\s+//; - s/\s+$//; - } - - # Do some validation - unless(scalar(@certinfo) >= 2 && scalar(@certinfo) <= 3 && length($certinfo[0]) && length($certinfo[1]) ) { - print "\nERROR: $certfile line '$_' does not contain valid information!\n"; - Usage(); - } - - push @certificates, [@certinfo]; # push data to two dimensional array - } -} - -# Remove any existing .sis packages -unlink $unsigned_sis_name; -if (!$onlyUnsigned) { - unlink $signed_sis_name; -} -unlink $pkgoutput; - -# Preprocess PKG - -local $/; -# read template file -open( TEMPLATE, $templatepkg) or die "ERROR: '$templatepkg': $!"; -$_=<TEMPLATE>; -close (TEMPLATE); - -# If the pkg file does not contain macros, there is no need for platform or target. -if (m/\$\(PLATFORM\)/) { - unless (length($platform) && length($target)) { - print "\nERROR: Platform or target is not defined!\n"; - Usage(); - } -} - -# replace the PKG variables -s/\$\(PLATFORM\)/$platform/gm; -s/\$\(TARGET\)/$target/gm; - -if ($installer_unsigned_app_sis_name ne "") { - s/$installer_app_sis_name\"/$installer_unsigned_app_sis_name\"/; -} - -#write the output -open( OUTPUT, ">$pkgoutput" ) or die "ERROR: '$pkgoutput' $!"; -print OUTPUT $_; -close OUTPUT; - -if ($preprocessonly) { - # Copy preprocessed file from tmp dir to pkg file dir - my ($templateVolume, $templatePath, $templateFileName) = File::Spec->splitpath($templatepkg); - my ($dummy1, $dummy2, $copyFileName) = File::Spec->splitpath($pkgoutput); - my $copyTarget = File::Spec->catpath($templateVolume, $templatePath, $copyFileName); - copy($pkgoutput, $copyTarget) or die "Preprocessed pkg file '$pkgoutput' cannot be copied."; - exit; -} - -if($stub) { - if(!($epocroot)) { die("ERROR: EPOCROOT must be set to create stub sis files"); } - my $systeminstall = "${epocroot}epoc32/data/z/system/install"; - mkpath($systeminstall); - my $stub_sis_name = $systeminstall."/".$stub_sis_name; - # Create stub SIS. - system ("${epocToolsDir}makesis -s $pkgoutput $stub_sis_name"); -} else { - if ($certtext eq "Self Signed" - && !@certificates - && $templatepkg !~ m/_installer\.pkg$/i - && !$onlyUnsigned) { - my $patch_capabilities = File::Spec->catfile(dirname($0), "patch_capabilities"); - if ($dontPatchCaps) { - system ("$patch_capabilities -c $pkgoutput") and print ("Warning: Package check for self-signing viability failed. Installing the package on a device will most likely fail!\n\n"); - } else { - print("Auto-patching self-signed package.\n"); - system ("$patch_capabilities -t $tempPackageDir $pkgoutput") and die ("ERROR: Automatic patching failed"); - } - } - - # Create SIS. - # The 'and' is because system uses 0 to indicate success. - system ("${epocToolsDir}makesis $pkgoutput $unsigned_sis_name") and die ("ERROR: makesis failed"); - - print("\n"); - - my $targetInsert = ""; - if ($targetplatform ne "-") { - $targetInsert = " for $targetplatform"; - } - - if ($onlyUnsigned) { - stat($unsigned_sis_name); - if( -e _ ) { - print ("Successfully created unsigned package ${unsigned_sis_name}${targetInsert}!\n"); - } else { - print ("\nUnsigned package creation failed!\n"); - } - - print ("\n"); - exit; - } - - # Sign SIS with certificate info given as an argument. - my $relcert = File::Spec->abs2rel($certificate); - my $relkey = File::Spec->abs2rel($key); - # The 'and' is because system uses 0 to indicate success. - system ("${epocToolsDir}signsis $unsigned_sis_name $signed_sis_name $relcert $relkey $passphrase") and die ("ERROR: signsis failed"); - - # Check if creating signed SIS Succeeded - stat($signed_sis_name); - if( -e _ ) { - print ("Successfully created signed package ${signed_sis_name}${targetInsert} using certificate: $certtext!\n"); - - # Sign with additional certificates & keys - for my $row ( @certificates ) { - # Get certificate absolute file names, relative paths are relative to certfilepath - my $relcert = File::Spec->abs2rel(File::Spec->rel2abs( $row->[0], $certfilepath)); - my $relkey = File::Spec->abs2rel(File::Spec->rel2abs( $row->[1], $certfilepath)); - - system ("${epocToolsDir}signsis $signed_sis_name $signed_sis_name $relcert $relkey $row->[2]"); - print ("\tAdditionally signed the SIS with certificate: $row->[0]!\n"); - } - - # remove temporary unsigned sis - if (!$preserveUnsigned) { - unlink $unsigned_sis_name; - } - - # Install the sis if requested - if ($install) { - print ("\nInstalling $signed_sis_name...\n"); - system ("$signed_sis_name"); - } - } else { - # Lets leave the generated PKG for problem solving purposes - print ("\nSIS creation failed!\n"); - } - print ("\n"); -} - -#end of file diff --git a/bin/elf2e32_qtwrapper b/bin/elf2e32_qtwrapper deleted file mode 100755 index a3a4065f30d..00000000000 --- a/bin/elf2e32_qtwrapper +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -scriptpath=`dirname $0` -perl $scriptpath/elf2e32_qtwrapper.pl "$@" diff --git a/bin/elf2e32_qtwrapper.bat b/bin/elf2e32_qtwrapper.bat deleted file mode 100644 index 52910df0079..00000000000 --- a/bin/elf2e32_qtwrapper.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -set scriptpath=%~dp0 -perl %scriptpath%elf2e32_qtwrapper.pl %* diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl deleted file mode 100755 index a9ea7711813..00000000000 --- a/bin/elf2e32_qtwrapper.pl +++ /dev/null @@ -1,325 +0,0 @@ -#!/usr/bin/perl -w -############################################################################# -## -## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -## Contact: http://www.qt-project.org/ -## -## This file is part of the utilities 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$ -## -############################################################################# - -# A script to get around some shortcomings in elf2e32, namely: -# - Returning 0 even when there are errors. -# - Excluding symbols from the dso file even when they are present in the ELF file. -# - Including symbols in the the dso file even when they are not present in the ELF file. -# - Overwriting the old dso file even when there are no changes (increases build time). - -use File::Copy; - -my @args = (); -my @definput; -my @defoutput; -my @dso; -my @tmpdso; -foreach (@ARGV) { - if (/^--definput/o) { - @definput = split('=', $_); - } elsif (/^--defoutput/o) { - @defoutput = split('=', $_); - } elsif (/^--dso/o) { - @dso = split('=', $_); - } elsif (/^--tmpdso/o) { - @tmpdso = split('=', $_); - $tmpdso[0] = "--dso"; - } else { - push(@args, $_); - } -} - -@definput = () if (!@definput || ! -e $definput[1]); - -if (@dso && !@tmpdso || !@dso && @tmpdso) { - print("--dso and --tmpdso must be used together.\n"); - exit 1; -} - -my $buildingLibrary = (@defoutput && @dso) ? 1 : 0; - -my $fixupFile = ""; -my $runCount = 0; -my $returnCode = 0; - -# For debugging. Make it nonzero to give verbose output. -my $debugScript = 1; -my @usedDefFiles; -sub recordDefFile { - return if (!$debugScript); - - my ($msg, $file) = @_; - my $content = "$msg, $file:\n"; - my $defFileFd; - if (!open($defFileFd, "< $file")) { - print("Warning: Could not open $file (for debug analysis)\n"); - return; - } - while (<$defFileFd>) { - $content .= $_; - } - - push(@usedDefFiles, $content); -} -sub printRecordedDefFiles { - return if (!$debugScript); - - foreach (@usedDefFiles) { - print ("$_\n"); - } -} - -sub missingSymbolMismatch -{ - my $missingSymbolSum = $_[0]; - - printRecordedDefFiles; - - print("Bug in the native elf2e32 tool: Number of missing symbols does not\n"); - print("match number of removed symbols in the output DEF file.\n\n"); - - print("Original elf2e32 output:\n"); - print(" $missingSymbolSum Frozen Export\(s\) missing from the ELF file\n\n"); - - print("However $defoutput[1] contains more missing entries than that.\n\n"); - - print("This needs to be fixed manually in the DEF file.\n"); - exit(2); -} - -if ($debugScript) { - print("PATH: $ENV{PATH}\n"); - print("EPOCROOT: $ENV{EPOCROOT}\n"); -} - -while (1) { - if (++$runCount > 2) { - printRecordedDefFiles if ($debugScript); - print("Internal error in $0, link succeeded, but exports may be wrong.\n"); - last; - } - - my $elf2e32Pipe; - my $elf2e32Cmd = "elf2e32 @args" - . " " . join("=", @definput) - . " " . join("=", @defoutput) - . " " . join("=", @tmpdso); - open($elf2e32Pipe, "$elf2e32Cmd 2>&1 |") or die ("Could not run elf2e32"); - - my %fixupSymbols; - my $foundBrokenSymbols = 0; - my $missingSymbolSum = 0; - my $missingSymbolCount = 0; - my $errors = 0; - while (<$elf2e32Pipe>) { - print; - if (/Error:/io) { - $errors = 1; - } elsif (/symbol ([a-z0-9_]+) absent in the DEF file, but present in the ELF file/io) { - $fixupSymbols{$1} = 1; - $foundBrokenSymbols = 1; - } elsif (/([0-9]+) Frozen Export\(s\) missing from the ELF file/io) { - $missingSymbolSum = $1; - $foundBrokenSymbols = 1; - } - } - close($elf2e32Pipe); - - if ($debugScript) { - recordDefFile("Run no $runCount, elf2e32 DEF file input", "$definput[1]"); - recordDefFile("Run no $runCount, elf2e32 DEF file output", "$defoutput[1]"); - } - - if ($errors) { - $returnCode = 1; - last; - } - - if ($buildingLibrary && $runCount == 1) { - my $tmpDefFile; - my $newDefFile; - my $origDefFile; - my $savedNewDefFileLine = ""; - if ($definput[1]) { - open($origDefFile, "< $definput[1]") or die("Could not open $definput[1]"); - } - open($newDefFile, "< $defoutput[1]") or die("Could not open $defoutput[1]"); - open($tmpDefFile, "> $defoutput[1].tmp") or die("Could not open $defoutput[1].tmp"); - print($tmpDefFile "EXPORTS\n") or die("Could not write to temporary DEF file: $!"); - $fixupFile = "$defoutput[1].tmp"; - while (1) { - my $origDefLine; - my $origSym; - my $origOrdinal; - my $origExtraData; - my $newDefLine; - my $newSym; - my $newOrdinal; - my $newExtraData; - my $defLine; - my $sym; - my $ordinal; - my $extraData; - if ($definput[1]) { - # Read from original def file, and skip non-symbol lines - while (1) { - $origDefLine = <$origDefFile>; - if (defined($origDefLine)) { - $origDefLine =~ s/[\n\r]//; - if ($origDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i) { - $origSym = $1; - $origOrdinal = $2; - $origExtraData = $3; - last; - } - } else { - last; - } - } - } - - if ($savedNewDefFileLine) { - # This happens if the new def file was missing an entry. - $newDefLine = $savedNewDefFileLine; - $newDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i or die("$0: Shouldn't happen"); - $newSym = $1; - $newOrdinal = $2; - $newExtraData = $3; - } else { - # Read from new def file, and skip non-symbol lines - while (1) { - $newDefLine = <$newDefFile>; - if (defined($newDefLine)) { - $newDefLine =~ s/[\n\r]//; - if ($newDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i) { - $newSym = $1; - $newOrdinal = $2; - $newExtraData = $3; - last; - } - } else { - last; - } - } - } - $savedNewDefFileLine = ""; - last if (!defined($origDefLine) && !defined($newDefLine)); - - if (defined($origOrdinal) && (!defined($newOrdinal) || $origOrdinal != $newOrdinal)) { - # If the symbol is missing from the new def file, use the original symbol. - $savedNewDefFileLine = $newDefLine; - $defLine = $origDefLine; - $sym = $origSym; - $ordinal = $origOrdinal; - $extraData = $origExtraData; - } else { - $defLine = $newDefLine; - $sym = $newSym; - $ordinal = $newOrdinal; - if ($newExtraData =~ /ABSENT/) { - # Special case to keep "DATA [0-9]+" data in absent entries. - $extraData = $origExtraData; - } else { - $extraData = $newExtraData; - } - } - if (exists($fixupSymbols{$sym})) { - # Fix symbols that have returned after first being marked ABSENT. - $extraData =~ s/ ABSENT//; - } elsif ($defLine =~ s/; MISSING://) { - # Auto-absent symbols. - $extraData .= " ABSENT"; - if (++$missingSymbolCount > $missingSymbolSum) { - missingSymbolMismatch($missingSymbolSum); - } - } - print($tmpDefFile "\t$sym \@ $ordinal $extraData\n") or die("Could not write to temporary DEF file: $!"); - } - print($tmpDefFile "\n") or die("Could not write to temporary DEF file: $!"); - close($origDefFile) if ($definput[1]); - close($newDefFile); - close($tmpDefFile); - - $definput[1] = "$defoutput[1].tmp"; - - } - if (!$foundBrokenSymbols || $errors) { - last; - } - - print("Rerunning elf2e32 due to DEF file / ELF file mismatch\n"); -}; - -if ($fixupFile) { - unlink($defoutput[1]); - move($fixupFile, $defoutput[1]); -} - -exit $returnCode if ($returnCode != 0); - -if ($buildingLibrary) { - my $differenceFound = 0; - - if (-e $dso[1]) { - my $dsoFile; - my $tmpdsoFile; - my $dsoBuf; - my $tmpdsoBuf; - open($dsoFile, "< $dso[1]") or die("Could not open $dso[1]"); - open($tmpdsoFile, "< $tmpdso[1]") or die("Could not open $tmpdso[1]"); - binmode($dsoFile); - binmode($tmpdsoFile); - while(read($dsoFile, $dsoBuf, 4096) && read($tmpdsoFile, $tmpdsoBuf, 4096)) { - if ($dsoBuf ne $tmpdsoBuf) { - $differenceFound = 1; - } - } - close($tmpdsoFile); - close($dsoFile); - } else { - $differenceFound = 1; - } - - if ($differenceFound) { - copy($tmpdso[1], $dso[1]) or die("Could not copy $tmpdso[1] to $dso[1]: $!"); - } -} diff --git a/bin/patch_capabilities b/bin/patch_capabilities deleted file mode 100755 index 0d8962260ec..00000000000 --- a/bin/patch_capabilities +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -scriptpath=`dirname $0` -perl $scriptpath/patch_capabilities.pl "$@" diff --git a/bin/patch_capabilities.bat b/bin/patch_capabilities.bat deleted file mode 100644 index 6a0c4d777ac..00000000000 --- a/bin/patch_capabilities.bat +++ /dev/null @@ -1 +0,0 @@ -@perl.exe -S %~dp0patch_capabilities.pl %* diff --git a/bin/patch_capabilities.pl b/bin/patch_capabilities.pl deleted file mode 100755 index daa5e12930c..00000000000 --- a/bin/patch_capabilities.pl +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/perl -############################################################################# -## -## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -## Contact: http://www.qt-project.org/ -## -## This file is part of the S60 port 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$ -## -############################################################################# - -####################################################################### -# -# A script for setting binary capabilities based on .pkg file contents. -# -####################################################################### - -# -# Note: Please make sure to output all changes done to the pkg file in a print statements -# starting with "Patching: " to ease integration into IDEs! -# - -use File::Copy; -use File::Spec; -use File::Path; - -sub Usage() { - print("This script can be used to set capabilities of all binaries\n"); - print("specified for deployment in a .pkg file.\n"); - print("If no capabilities are given, the binaries will be given the\n"); - print("capabilities supported by self-signed certificates.\n\n"); - print(" *** NOTE: If *_template.pkg file is given and one is using symbian-abld or\n"); - print(" symbian-sbsv2 platform, 'target-platform' is REQUIRED. ***\n\n"); - print(" *** NOTE2: When patching gcce binaries built with symbian-sbsv2 toolchain,\n"); - print(" armv5 must be specified as platform.\n"); - print("\nUsage: patch_capabilities.pl [-c|-t tmp_path] pkg_filename [target-platform [capability list]]\n"); - print("\nE.g. patch_capabilities.pl myapp_template.pkg release-armv5 \"All -TCB\"\n"); - print("\nThe parameter -c can be used to just check if package is compatible with self-signing\n"); - print("without actually doing any patching.\n"); - print("Explicit capability list cannot be used with -c parameter.\n"); - print("\nThe parameter -t can be used to specify a dir under which the temporary files are created.\n"); - print("Defaults to 'patch_capabilities_tmp' under the path to pkg file.\n"); - exit(); -} - -sub trim($) { - my $string = shift; - $string =~ s/^\s+//; - $string =~ s/\s+$//; - return $string; -} - -my $epocroot = $ENV{EPOCROOT}; -my $epocToolsDir = ""; -if ($epocroot ne "") { - $epocroot =~ s,\\,/,g; - if ($epocroot =~ m,[^/]$,) { - $epocroot = $epocroot."/"; - } - $epocToolsDir = "${epocroot}epoc32/tools/"; -} - -my $nullDevice = "/dev/null"; -$nullDevice = "NUL" if ($^O =~ /MSWin/); - -my @capabilitiesToAllow = ("LocalServices", "NetworkServices", "ReadUserData", "UserEnvironment", "WriteUserData", "Location"); -my @capabilitiesSpecified = (); - -# If arguments were given to the script, -if (@ARGV) -{ - # Parse the first given script argument as a ".pkg" file name. - my $pkgFileName = shift(@ARGV); - my $justCheck = ""; - my $msgPrefix = "Patching:"; - my $tempPatchPath = ""; - - if ($pkgFileName eq "-c") { - $pkgFileName = shift(@ARGV); - $justCheck = true; - $msgPrefix = "Warning:"; - } - - if ($pkgFileName eq "-t") { - $tempPatchPath = shift(@ARGV); - $pkgFileName = shift(@ARGV); - } - - my ($pkgVolume, $pkgPath, $pkgPlainFileName) = File::Spec->splitpath($pkgFileName); - if ($tempPatchPath eq "") { - $tempPatchPath = File::Spec->catpath($pkgVolume, $pkgPath."patch_capabilities_tmp", ""); - } - - mkpath($tempPatchPath); - - # These variables will only be set for template .pkg files. - my $target; - my $platform; - - # Check if using template .pkg and set target/platform variables - if (($pkgFileName =~ m|_template\.pkg$|i) && -r($pkgFileName)) - { - my $targetplatform; - my $templateFile; - my $templateContents; - open($templateFile, "< $pkgFileName") or die ("Could not open $pkgFileName"); - $templateContents = <$templateFile>; - close($templateFile); - unless (($targetplatform = shift(@ARGV)) || $templateContents !~ /\$\(PLATFORM\)/) - { - Usage(); - } - $targetplatform = "-" if (!$targetplatform); - my @tmpvalues = split('-', $targetplatform); - $target = $tmpvalues[0]; - $platform = $tmpvalues[1]; - - # Convert visual target to real target (debug->udeb and release->urel) - $target =~ s/debug/udeb/i; - $target =~ s/release/urel/i; - - if (($platform =~ m/^gcce$/i) && ($ENV{SBS_HOME})) { - # Print a informative note in case suspected misuse is detected. - print "\nNote: You must use armv5 as platform when packaging gcce binaries built using symbian-sbsv2 mkspec.\n"; - } - } - - # If the specified ".pkg" file exists (and can be read), - if (($pkgFileName =~ m|\.pkg$|i) && -r($pkgFileName)) - { - print ("\n"); - if ($justCheck) { - print ("Checking"); - } else { - print ("Patching"); - } - print (" package file and relevant binaries...\n"); - - if (!$justCheck) { - # If there are more arguments given, parse them as capabilities. - if (@ARGV) - { - @capabilitiesSpecified = (); - while (@ARGV) - { - push (@capabilitiesSpecified, pop(@ARGV)); - } - } - } - - # Start with no binaries listed. - my @binaries = (); - my $binariesDelimeter = "///"; - - my $tempPkgFileName = $tempPatchPath."/__TEMP__".$pkgPlainFileName; - - if (!$justCheck) { - unlink($tempPkgFileName); - open (NEW_PKG, ">>".$tempPkgFileName); - } - open (PKG, "<".$pkgFileName); - - my $checkFailed = ""; - my $somethingPatched = ""; - - # Parse each line. - while (<PKG>) - { - my $line = $_; - my $newLine = $line; - - # Patch pkg UID if it's in protected range - if ($line =~ m/^\#.*\((0x[0-7][0-9a-fA-F]*)\).*$/) - { - my $oldUID = $1; - print ("$msgPrefix UID $oldUID is not compatible with self-signing!\n"); - - if ($justCheck) { - $checkFailed = true; - } else { - my $newUID = $oldUID; - $newUID =~ s/0x./0xE/i; - $newLine =~ s/$oldUID/$newUID/; - print ("$msgPrefix Package UID changed to: $newUID.\n"); - $somethingPatched = true; - } - } - - # If the line specifies a file, parse the source and destination locations. - if ($line =~ m|^ *\"([^\"]+)\"\s*\-\s*\"([^\"]+)\"|) - { - my $sourcePath = $1; - - # If the given file is a binary, check the target and binary type (+ the actual filename) from its path. - if ($sourcePath =~ m:\w+(\.dll|\.exe)$:i) - { - # Do preprocessing for template pkg, - # In case of template pkg target and platform variables are set - if(length($target) && length($platform)) - { - $sourcePath =~ s/\$\(PLATFORM\)/$platform/gm; - $sourcePath =~ s/\$\(TARGET\)/$target/gm; - } - - my ($dummy1, $dummy2, $binaryBaseName) = File::Spec->splitpath($sourcePath); - - if ($justCheck) { - push (@binaries, $binaryBaseName.$binariesDelimeter.$sourcePath); - } else { - # Copy original files over to patching dir - # Patching dir will be flat to make it cleanable with QMAKE_CLEAN, so path - # will be collapsed into the file name to avoid name collisions in the rare - # case where custom pkg rules are used to install files with same names from - # different directories (probably using platform checks to choose only one of them.) - my $patchedSourcePath = $sourcePath; - $patchedSourcePath =~ s/[\/\\:]/_/g; - $patchedSourcePath = "$tempPatchPath/$patchedSourcePath"; - $newLine =~ s/^.*(\.dll|\.exe)(.*)(\.dll|\.exe)/\"$patchedSourcePath$2$3/i; - - copy($sourcePath, $patchedSourcePath) or die "$sourcePath cannot be copied for patching."; - push (@binaries, $binaryBaseName.$binariesDelimeter.$patchedSourcePath); - } - } - } - - print NEW_PKG $newLine; - - chomp ($line); - } - - close (PKG); - if (!$justCheck) { - close (NEW_PKG); - - unlink($pkgFileName); - rename($tempPkgFileName, $pkgFileName); - } - print ("\n"); - - my $baseCommandToExecute = "${epocToolsDir}elftran -vid 0x0 -capability \"%s\" "; - - # Actually set the capabilities of the listed binaries. - foreach my $binariesItem(@binaries) - { - $binariesItem =~ m|^(.*)$binariesDelimeter(.*)$|; - my $binaryBaseName = $1; - my $binaryPath = $2; - - # Create the command line for setting the capabilities. - my $commandToExecute = $baseCommandToExecute; - my $executeNeeded = ""; - if (@capabilitiesSpecified) - { - $commandToExecute = sprintf($baseCommandToExecute, join(" ", @capabilitiesSpecified)); - $executeNeeded = true; - my $capString = join(" ", @capabilitiesSpecified); - print ("$msgPrefix Patching the the Vendor ID to 0 and the capabilities used to: \"$capString\" in \"$binaryBaseName\".\n"); - } else { - # Test which capabilities are present and then restrict them to the allowed set. - # This avoid raising the capabilities of apps that already have none. - my $dllCaps; - open($dllCaps, "${epocToolsDir}elftran -dump s $binaryPath |") or die ("ERROR: Could not execute elftran"); - my $capsFound = 0; - my $originalVid; - my @capabilitiesToSet; - my $capabilitiesToAllow = join(" ", @capabilitiesToAllow); - my @capabilitiesToDrop; - while (<$dllCaps>) { - if (/^Secure ID: ([0-7][0-9a-fA-F]*)$/) { - my $exeSid = $1; - if ($binaryBaseName =~ /\.exe$/) { - # Installer refuses to install protected executables in a self signed package, so abort if one is detected. - # We can't simply just patch the executable SID, as any registration resources executable uses will be linked to it via SID. - print ("$msgPrefix Executable with SID in the protected range (0x$exeSid) detected: \"$binaryBaseName\". A self-signed sis with protected executables is not supported.\n\n"); - $checkFailed = true; - } - } - if (/^Vendor ID: ([0-9a-fA-F]*)$/) { - $originalVid = "$1"; - } - if (!$capsFound) { - $capsFound = 1 if (/Capabilities:/); - } else { - $_ = trim($_); - if ($capabilitiesToAllow =~ /$_/) { - push(@capabilitiesToSet, $_); - if (Location =~ /$_/i) { - print ("$msgPrefix \"Location\" capability detected for binary: \"$binaryBaseName\". This capability is not self-signable for S60 3rd edition feature pack 1 devices, so installing this package on those devices will most likely not work.\n\n"); - } - } else { - push(@capabilitiesToDrop, $_); - } - } - } - close($dllCaps); - if ($originalVid !~ "00000000") { - print ("$msgPrefix Non-zero vendor ID (0x$originalVid) is incompatible with self-signed packages in \"$binaryBaseName\""); - if ($justCheck) { - print (".\n\n"); - $checkFailed = true; - } else { - print (", setting it to zero.\n\n"); - $executeNeeded = true; - } - } - if ($#capabilitiesToDrop) { - my $capsToDropStr = join("\", \"", @capabilitiesToDrop); - $capsToDropStr =~ s/\", \"$//; - - if ($justCheck) { - print ("$msgPrefix The following capabilities used in \"$binaryBaseName\" are not compatible with a self-signed package: \"$capsToDropStr\".\n\n"); - $checkFailed = true; - } else { - if ($binaryBaseName =~ /\.exe$/) { - # While libraries often have capabilities they do not themselves need just to enable them to be loaded by wider variety of processes, - # executables are more likely to need every capability they have been assigned or they won't function correctly. - print ("$msgPrefix Executable with capabilities incompatible with self-signing detected: \"$binaryBaseName\". (Incompatible capabilities: \"$capsToDropStr\".) Reducing capabilities is only supported for libraries.\n"); - $checkFailed = true; - } else { - print ("$msgPrefix The following capabilities used in \"$binaryBaseName\" are not compatible with a self-signed package and will be removed: \"$capsToDropStr\".\n"); - $executeNeeded = true; - } - } - } - $commandToExecute = sprintf($baseCommandToExecute, join(" ", @capabilitiesToSet)); - } - $commandToExecute .= $binaryPath; - - if ($executeNeeded) { - # Actually execute the elftran command to set the capabilities. - print ("\n"); - system ("$commandToExecute > $nullDevice"); - $somethingPatched = true; - } - } - - if ($checkFailed) { - print ("\n"); - if ($justCheck) { - print ("$msgPrefix The package is not compatible with self-signing.\n"); - } else { - print ("$msgPrefix Unable to patch the package for self-singing.\n"); - } - print ("Use a proper developer certificate for signing this package.\n\n"); - exit(1); - } - - if ($justCheck) { - print ("Package is compatible with self-signing.\n"); - } else { - if ($somethingPatched) { - print ("NOTE: A patched package may not work as expected due to reduced capabilities and other modifications,\n"); - print (" so it should not be used for any kind of Symbian signing or distribution!\n"); - print (" Use a proper certificate to avoid the need to patch the package.\n"); - } else { - print ("No patching was required!\n"); - } - } - print ("\n"); - } else { - Usage(); - } -} -else -{ - Usage(); -} diff --git a/config.tests/unix/openssl/openssl.pri b/config.tests/unix/openssl/openssl.pri deleted file mode 100644 index 377d6307c89..00000000000 --- a/config.tests/unix/openssl/openssl.pri +++ /dev/null @@ -1,10 +0,0 @@ -# Empty file since Qt 4.6 -# I'm too lazy to find all places where this file is included - -symbian{ - TRY_INCLUDEPATHS = $${EPOCROOT}epoc32 $${EPOCROOT}epoc32/include $${EPOCROOT}epoc32/include/stdapis $${EPOCROOT}epoc32/include/stdapis/sys $$OS_LAYER_LIBC_SYSTEMINCLUDE $$QMAKE_INCDIR $$INCLUDEPATH - for(p, TRY_INCLUDEPATHS) { - pp = $$join(p, "", "", "/openssl") - exists($$pp):INCLUDEPATH *= $$pp - } -} diff --git a/config.tests/unix/openssl/openssl.pro b/config.tests/unix/openssl/openssl.pro index 6891e7832f0..1c537cb2b14 100644 --- a/config.tests/unix/openssl/openssl.pro +++ b/config.tests/unix/openssl/openssl.pro @@ -1,4 +1,3 @@ SOURCES = openssl.cpp CONFIG -= x11 qt mac:CONFIG -= app_bundle -include(openssl.pri) diff --git a/configure b/configure index 12a8bab375d..d49ecd673d5 100755 --- a/configure +++ b/configure @@ -7172,9 +7172,6 @@ QMakeVar set sql-plugins "$SQL_PLUGINS" [ "$CFG_SXE" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SXE" [ "$CFG_DBUS" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_DBUS" -# ATM we need this define to compile Qt. Remove later! -QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_STYLE_S60" - # X11/Unix/Mac only configs [ "$CFG_CUPS" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_CUPS" [ "$CFG_ICONV" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_ICONV" diff --git a/doc/src/examples/applicationicon.qdoc b/doc/src/examples/applicationicon.qdoc index 6e97b6b2aa0..6f54ff6bfdc 100644 --- a/doc/src/examples/applicationicon.qdoc +++ b/doc/src/examples/applicationicon.qdoc @@ -47,29 +47,8 @@ \c /usr/share/icons/hicolor/64x64/apps directory and desktop files in the \c /usr/share/applications/hildon directory. - \section1 Creating an icon for Symbian - - Symbian uses Scalable Vector Graphics (SVG Tiny 1.1+) to render - application icons in the application menu. Therefore icons could be - created manually with a text editor, since SVG files are plain text with - XML syntax, but usually you would use a vector graphics program that is - able to output SVG files. Popular graphics programs such as Adobe - Illustrator or Inkscape are able to do so. - - For best results, the icon should be created on a 44x44 pixel canvas. - Otherwise the image might be scaled in unexpected ways. - - Once you have created your icon, make sure that it is stored according to - the SVG-Tiny 1.1+ standard. Inkscape, for instance, is not able to save - images that way, but there are tools that can convert general SVG files - into the Tiny format. For instance, the svg2svgt tool that is bundled with - Symbian 3rd and 5th editon SDKs under the folder s60tools can do this - conversion to some extent. Another tool to convert SVG to SVG Tiny is SVG - Pony. - \section1 Adding the icons to the project - Edit the .pro file and specify the ICON variable for the symbian target. For Maemo, we need to add that the \c .desktop and icon file should be installed. diff --git a/doc/src/examples/htmlinfo.qdoc b/doc/src/examples/htmlinfo.qdoc index 96c61f5541d..0f55b4b28e7 100644 --- a/doc/src/examples/htmlinfo.qdoc +++ b/doc/src/examples/htmlinfo.qdoc @@ -32,14 +32,7 @@ The XML HTML Info example provides a simple command line utility that scans the current directory for HTML files and prints statistics about them to standard out. - - \note Standard out is redirected on some platforms. On Symbian using Open - C \c stdout is by default directed to the console window, but this window - may not always be visible. To redirect to a file instead, locate the \c - c:\\system\\data\\config.ini file (on either the emulator or the device) - and change \c STDOUT to point to \c MEDIA4. This will redirect the console - to \c c:\\system\\data\\out.txt. - + The files are parsed using a QXmlStreamReader object. If the file does not contain a well-formed XML document, a description of the error is printed to the standard error console. diff --git a/doc/src/examples/symbianvibration.qdoc b/doc/src/examples/symbianvibration.qdoc deleted file mode 100644 index 7c2e055f4c6..00000000000 --- a/doc/src/examples/symbianvibration.qdoc +++ /dev/null @@ -1,192 +0,0 @@ -/**************************************************************************** -** -** 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:FDL$ -** GNU Free Documentation License -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. -** -** 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$ -** -****************************************************************************/ - -/*! \example widgets/symbianvibration - \group all-examples - \title Symbian Vibration Example - - The Symbian Vibrator example shows how to get fine-grained vibration - control on Symbian devices. - - Native Symbian APIs have to be used to enable vibration, since QtMobility - doesn't provide an interface for it yet. It is, however, planned to be - included in a future release. In anticipation for that, we make use of the - \c XQVibra class that was a part of the Mobile Extensions Technology Preview - API for Qt for Symbian. The pre-compiled libraries are no longer compatible - with Qt 4.6, but we can include the source code itself with the project. - - \image symbianvibration-example.png Screenshot of the Symbian Vibration example - - The example application divides the window into rectangles, which can be - pressed to make the device vibrate. Pressing different rectangles make the - device vibrate with different intensities. Each rectangle has a different - color and its intensity number is drawn on top of it. Moving the cursor - from one rectangle to another changes the vibration intensity to that of - the new one. Vibration stops when the mouse button has been released. It - is also possible to launch a short burst of vibration through the menu. - - The example consists of four classes: - - \list - \o \c XQVibra is the vibration interface class taken from the Mobile - Extensions for Qt for Symbian. - - \o \c XQVibraPrivate is the Symbian specific private implementation of the - vibration implementation. - - \o \c VibrationSurface is a custom widget that uses a XQVibra instance to - vibrate the device depending on where the user presses. - - \o \c MainWindow inherits from QMainWindow and contains a \c VibrationSurface - as its central widget, and also has a menu from which it is possible to - make the phone vibrate. - \endlist - - \section1 XQVibra Class Definition - - The \c XQVibra class uses the pimpl-idiom to hide the platform specific - implementation behind a common interface. Technically it would be possible - to support more target platforms, with only the addition of a private - implementation. The rest of the code would work the same, since only the - common interface is used. - - \snippet examples/widgets/symbianvibration/xqvibra.h 0 - - \c XQVibra provides a very simple interface for us to use. The interesting - part are the three slots \c start(), \c stop() and \c setIntensity(). Calling the start - method initiates vibration for the specified duration. Calling it while the - device is already vibrating causes it to stop the current one and start the - new one, even if the intensities are the same. The \c setIntensity() method - should be called before starting vibration. - - - \section1 VibrationSurface Class Definition - - \c VibrationSurface inherits from QWidget and acts like a controller for a - \c XQVibra object. It responds to mouse events and performs custom painting. - - \snippet examples/widgets/symbianvibration/vibrationsurface.h 0 - - The virtual event methods are reimplemented from QWidget. As can be seen, - there is no public programmable interface beyond what QWidget provides. - - - \section1 VibrationSurface Class Implementation - - Mouse events control the intensity of the vibration. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 0 - \codeline - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 1 - \codeline - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 2 - - Presses starts the vibration, movement changes the intensity and releases - stops the vibration. To set the right amount of vibration, the private - method \c applyIntensity() is used. It sets the vibration intensity according to - which rectangle the mouse currently resides in. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 3 - - We make sure only to change the intensity if it is different than last - time, so that the vibrator isn't stopped and restarted unnecessarily. - - The range of vibration intensity ranges from 0 to XQVibra::MaxIntensity. We - divide this range into a set of levels. The number of levels and the intensity - increase for each level are stored in two constants. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 4 - - Each rectangle has an intensity of one \c IntensityPerLevel more than the - previous one. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 5 - - The rectangles are either put in a row, if the widget's width is greater - than its height (landscape), otherwise they are put in a column (portrait). - Each rectangle's size is thus dependent on the length of the width or the - height of the widget, whichever is longer. The length is then divided by - the number of levels, which gets us either the height or the width of each - rectangle. The dx and dy specify the distance from one rectangle to the - next, which is the same as either the width or height of the rectangle. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 6 - - For each level of intensity, we draw a rectangle with increasing - brightness. On top of the rectangle a text label is drawn, specifying the - intesity of this level. We use the rectangle rect as a template for - drawing, and move it down or right at each iteration. - - The intensity is calculated by dividing the greater of the width and height - into \c NumberOfLevels slices. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 7 - - In case the widget's geometry is too small to fit all the levels, the user - interface will not work. For simplicity, we just return 0. - - When we know the axis along which the rectangles lie, we can find the one - in which the mouse cursor lie. - - \snippet examples/widgets/symbianvibration/vibrationsurface.cpp 8 - - The final clamp of the intensity value at the end is necessary in case the - mouse coordinate lies outside the widget's geometry. - - - \section1 MainWindow Class Definition - - Here's the definition of the \c MainWindow class: - - \snippet examples/widgets/symbianvibration/mainwindow.h 0 - - \c MainWindow is a top level window that uses a \c XQVibra and a - \c VibrationSurface. It also adds a menu option to the menu bar which can - start a short vibration. - - \section1 MainWindow Class Implementation - - In the \c MainWindow constructor the \c XQVibra and the \c VibrationSurface - are created. An action is added to the menu and is connected to the vibrate - slot. - - \snippet examples/widgets/symbianvibration/mainwindow.cpp 0 - - The \c vibrate() slot offers a way to invoke the vibration in case no - mouse is present on the device. - - \snippet examples/widgets/symbianvibration/mainwindow.cpp 1 - - \section1 Symbian Vibration Library - - The \c XQVibra class requires a platform library to be included. It is - included in the \c .pro file for the symbian target. - - \quotefromfile examples/widgets/symbianvibration/symbianvibration.pro - \skipto /^symbian \{/ - \printuntil /^\}/ -*/ diff --git a/doc/src/images/symbianvibration-example.png b/doc/src/images/symbianvibration-example.png deleted file mode 100644 index 21461b6a19605d83925c948deb200db95b649cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23217 zcmbTe1ymf-wk_IGf_n&_;ElUW5*l}R2^yqv*Ce<HcL>r*6Wl$)-CcvbyT2m$-0{vm z_q_M-e?0~;YIjv_S#!-f*Y0Y9<YmQBkqD4LAP}mAI7ATydh!_rdiv$nQ=moA#qkjM z^Tb|J>?5dXfM^RiK(rCpum^#Vu^)e)fRa+)0F4L^5;7tPGYC%*sh+CsUJ!ynZ$T1} z56UhxyN&KK#A2QYHwE*JrWYh(*~7h2P|FBXjIWU#7_VL$kRu33B~QhbGr!Z9`i3F? z1$(EZr{8d%D5jH_+J^fL^`|uoqW7FjWwPR-Um9Lj(Tl%D<TS8+#yM5C7GTsJwUIxq zBcL<ieA8JBuRAvsC7;&UxVgC!o*C8A(TULWuHRORpdt&-%u_AEj8yD-cuRJLdA~3C z3bZL~KxVLBM$ctARbn=p<JM>u8fo80&)d?MiPv{~R_uM3=DwdlZZ4wGg^5E38nocF znyWDzr6S9W$`e(_ioC(Rt>4&j->=<B+b+{AJSS{EA|xa2cw=I+&OaEE$=rb>q7Vmr zD6G66*Sk}xwb9oH`Jw$fNg{mc4eRUUu^)(QxLf>lIZ>zu-u*J?c`@H-8QOiKt(-+K zW%7C)Lk1lDk<t5dDZrwVz>N-+@^ZJ)!aDiA!vo>%)nP08?1cZR*y>Mircf4Jq7Yq- z$XkrSt~ce@i-L=hL7A^a(0`dNS2OP~V(^GVAU79#)_j%5y|2w|#aBLhNi9O|&zMiv z`;$FM5n!mmm<qM32PT_7^F^_->Dl*lH05Sy@0EDnUE?(!`iUrrlef4Fz@#!`XnR=) zPY%2;>JiY0zDxZfees7~e}$4zY=E>>RvsxOYiym7xZZhpSd6r?><?3T=H}1x0W6;H zMM$-gIA+>!3`f{g6B52F>8idZ0`V{M9L$~23h0yJ-bz7&si>)Qb8=>ifCVSyv~&UH z?Wrc>ubkj&WhJYfz0AlEyd2KA@3JMO7wm-u%9XG;T<HiP^{B~`8YyoryD6yW(k+W@ zN$aX^zJm%mEO#p19tPL&czh}L+_U(^_X1dtllVsW3lcHbZ!7iA2RSA6wx^p4g_YI@ zMjBK_@`j=8?;AQR=zEWjY>}v<o`TYvLxnh+627Wmy&G(D{xVdgQ@_l8Zi|Y7637Tq zpg0+7kAD{}DRh=EcUARr_1TvVj{2qwi=(g3`*T}bgcJ2wH_Z<>gj`mknc~;vm70b0 zy>5++^RKViddrGE*67l2<~AT7fIFUyJ^>9X30~fi&Rv#;L3ES`@~;JWc&;k>nw@%0 ztuoMrL^gMKc~~mQ-*1vV0iEKOTHD_C6yNsLFW&95%OJdbnH}^2!g@>~qM(5D?Af!9 z1owl+i)W;lU!*U%IW}yiWo54yTU%QPCA&5#`g6sPWm6TO3XxSUlsN9pRx5s>5GFp( z`feg}wlU>tc;NkT1GZ%KSS2StLY{3P9V12TG)}xKzTYn1#37MOL~*J5C`fH~&q8hO z;^Hz}1?2;#+wA?2uOazI?6;WE@vul3e6_DH{dzIIi~-FAKtSq&hiTfznVU}18)J=N z#;)d(rtj_aeI9GEYCRve%6(6M1A#$n1bMbpIa?N}W(9VRphr6tYE7Tk$*8EoXoBkx znr=+J)=gKx_f2Amd?)q7s(Tfz_m28xD7{(4X`8)4ZjBLCN1e-MXlSUW?c}F|T8u-b zej*y{;n1X`dtMel?>MRBm8n)!ws0`|E_c7_X5W5*r_=hWYVl-xvrep13aP#55apKK zV|qIuEW9}XbNH~|XmQ}Wkvd5p++M>FV<<TOhJ+-}t1RKq)KtRH9AbQY9xFL7Bctru zZ`Ia|jLjFj)8y98OG`^S^-hj$LW|E1OCvm`zd?Z&ij3&VkxBNrwc8s=<)eh2=+wKO zm~<acO-*fX=K10i6Yseq>v2a%M`O9L2!^*C8ChC}23A35UyC}<?Me@{+P*Lb?&5yF zdt?gqVn6qBUqk+nYXBJ+F^~XZK&q%$n#Vf4=k=GmE!iP<o;#X9@S1#>X31vd=btMt zphv$2hFm=<lg!zjZm?tUNtgT9kI!j$s?<>IvI{y>VK$g1Kpb%d^ysuVv$k^72}Be> z=@@`}i_iukQ^G+ko!LIxXry>?RK?~})XGaO57BIo^^gWrr*-6#_cM^LI^&N~b)Glp zX=YkKe*ChZ-mEcN+3Xb!2ngUiN1`y-BCp>V5V)9gmz#~{T5!o)WFIP4Jeq&4vAX`y zu;fn&v8r=sSg5t%czRGo%;$7TZeX9x2|X6O&93Nvflo-d<9b+gFnHL6+$^<GKVdOy zd$4?h)%4w1tCP9+9#P0D#PA3ovDY+mnkVSBnAlCJPYJlR>)X>oT%fZR1E=Nh-qj2G z)o4GvJ;E5Ys=5UAz35d<e)KNKXckhjzVr4v^dXH=^5Qa-o3fZ{^1L}bJOl#6HFWqJ zd$vp~yUz4y?uLnr3%7@i1iA6!-$F<B_buGUF)SYaB-J!POv(ZA074JEB0P5uI~$!I z?(c}Vj@B?}lMYP%YPF2^(&R-strzHn^o*QZew`3+z3tl#C+6eb&NG!VT6!F+R<%{7 z*U->A0usc_Ki+pgaMAEzBUYoGrlAR?kwx=m$Nugc!H@jTN;8Y?nz*~zyqK(TnG!he zkM1G2gdvRHKmSmh5FhJ{^1?zeXv^i$Ly<3O0(lN*>efOZqUvwG(vIA@%vNUD86F<R zKfFut&x|+k$ew;;aD<EC_0!h?6N@A$NSXs~(41*^($6JjFDz=h!X2l8d*tAv(S5=n zOs01<4<8<8IFQZY@+@_?z60<okV?LkRd)D0%|R$p2q|FhsockE8(;L>Wj`Pw8Ximh zS}moQ<=;b<z9(BZ)dr|LRC26#F;p)s3o8_=-t?IYvT<^rM+;p=vxdxB>q%QF86=L{ z0=O(?srO7sN1qtZJP#Y}Pv+`P&q&&xsq96VsxXVLE+LJqO;1^Y8W|aNh7*r8c>5!6 z?!!}3Z1}O!m&+4~ZLV#58LC4)O)XE2v!GfCPM$i(b{?#Ayv*mQ0XO^g2Y@!6MZGgv za;Av&-dJBZF*Wr>Z%06`Z_3Kbx}SbSOdPwU_~7eXxLM*oTb_QLf`N9*Pj_kC8D7*= z?jBF7<@9T-Q{ZBu{9*X66ZN$fu{t*OW>;5NE4mOr2Z!V3;ZjggP=0>?(a}+UKG@ci zRKV?Yb2w{dWd#^+{mB5I-f>iXS35w|#B5^5yKi?LP|(qDuJEva%^u~0i8Aos&v^|R zWUZ_w5#}m8{W9xt-AKDQ^g)-Cm6at))!tm}?w;41Z?w&t=PjWkH1{};PWSkYtoz<- zgGA_<)`#9s{@!EHLhmNm`#RUoHf>{`FCy5<;njyto|8r_>o!*MO&oBiO+{ua_@>W~ zoXG0(=v8NV8nI2%(UzRo^=;${pC?gcjln1`*SrIEEeXo_&KW8prwigMq2W~lVy}R3 z?r^5sRV=%k<O^*jAs(Ju*OT=jC?+Rk-8{Zf-Fk;agMRv%v)zUIh{UT-iQH`-GXs6u z$&<k0utxrAofYsh5wYjiXG)@u1SapR-m;7MTPZ8^TAEic$jkaXb_%O|+L7fH^z@mV zTT8qgT88%)9*&$Z>k(9C$tZI_ioW)CrmyfMDcw16CeAIy3@zEc-AU#A>B8l`H|Yfh z@(vK(n6FdZ;Xq`K7T-_5mv6{0*6=z>UToOPNzOidC(H~DnyR$8Io~tjTH;S1sHhrD zxF1IBJl~rIG8sE()i<r$W^Myt(1iFXWz+Bhh0QK=8ngJE%)SC(xbUrw+-N>00DAx> zD;|G3fdU>1AXALo@%y_Q=iRAcdm|f`-{*iD_+6#2qc0wXJM&+6Wi?i#S*Cxzuk^mt zoSiCkP`ov1Zz5({-2dv8yu1%O>8IaMaHcS<m@jXyCwKKns7K^O7GOf3^y%k9PL{RV zA=XHLJ+fqVsbI9~TShK-vz(ja{Bu!jHRhz9;!;_7echSbak5Cqi!q9xesj7_(299@ zb7MYpbt)paX^p}93Z{2WX;L(~qY>9lp@1J5ySOZR*TL2Fjsb0}g`VGaOv~tEB!^Vk z-e)E^tSh~<aUM`AK7P!>1|Z|Zsjp=PgF;h2J5^aPdVOTu;f=ysIC3zz?W>j_+R#}S z4T*FfwBfU2HY*mW_Sz}rvTR(RvEWs!x$@SLTD5TY+FKX0u(tI$%_7B>+nAe6q5l|( z%6-fqzXo06Qe8cHRpth(PiVnY8+4o?F8*z`;{IBTi1m#}X7Bc$0l$VnA)_*1EuPuM zP3_9o9j39-(e%+b5=JF{t5xdKpZBhl%dfC+rJtUnaI&(J-Ce(6ys#iJc5-x<vIiox z%=PF^05&h)7il`#Ef*RjAtHY0Dc7@I?ZVW+Ox`#*k3`fU*zpc2<3Ak|)@7C57ydrQ z_L9F@eM)t${f|z|$&3A0qQ3>7b>gBmzoprQ`O}4ZUg+K9WN1i_THod$wR?B(Eg|gf zdrw4`nhugA)-RdbyfMrkR^Sa~(THQ29sHGgT5Twd(3#J6fcz!;HJaInoBK<TuYBJm z#20Zj)wypgR`%~OT3+bQdy{Zk0KRnp=&Z^WVsxSAT&>e!yV6m=Unk{8Mn<a3l%2lJ zwSGC^+(b^AdY<maH_ZD=z;AHEKn9dXw{&=L?$-&a^XX1I?hI=-Wjd(Iea%EPKJoRW zJKzQ|HH}{DpDUle!7S9SRg5d@@9z&1j+qO-(JWLg7!S@&NK4brmU9p^QhK>~{XXj% zKa;PI8)|%bczE!Wi12VmW_Oq=v#q)dDMCLR(X1`)t^HRe<j(2-<F(!hLMrV71Lqyg zCBVv@r5nJ<%{$&aEUA<AoZJE)!~J4kz~;}F=O;aOA00~)h*?0~XGeBJrGgfbzx@G& z;DOP!acn4Bg|^EQ^>O^5d#k(jAXMObDr?+W5<JaYLW6X57<DSizraR|HU<<a{*x_V z-jh11td<_|(7Ry$P78`y!FN)D7e3qA$$s95+wAz`%yt2&rIz4TwY5C9HeHzb>PLFw zQ`Oe#+T-?UZ$Ni%iO3KHObLCz;=OYE*s{bWw?m@h>fcfdtdd_l8UKEBz7f~__tgFq z{`BNzY&`$P`h*#-*Yv^5LDXrlxDb3)z6wT$9#)^$@U1@|oMaKQDp?_WS^?CBiF_xP z>m{vfJd0@hds+xHO&xIzS}hC%d`;v#TBOG}h1Q-0fxQwDT~9%>b)_e}WoQ0{C;OHQ zXS4O-m{Zk+tFm53LVWxqy|6P2qx|_h*G12Zu&^+If%yj&@<F$6e0{vyb{2In>L$Zd z_(t5DTuXMLy9=f6`-n{iSaq~5FD&ikU-*XMAXR-p0P)Ld5m5)J1@HU3%Lwmk&i$ii z2oxG$o#^cXDU>mQg8kpU264R>;yu(voUW0cU50tIkkfF1WQB@q*9rE?=Da(xd)-_$ z#N;5yrZhBVGcr|pINgU9+X_RV6j}ID-DG2UVADzJLD%sW;DzXlY7C5wR+B7>u9oqd z#RZblk5h3lLrP?pCJRweP#oA*USSVD;nq2n3AHGy&8dGfvht0|>nKD{=*~d_$9c{+ zU=dCeocUO?3Ai~JJieB9^d8)%pdYMXd>NJFKHs0Ocid5JwmkxjdbQ)u#C*N;#p`g3 z;zlRH7+ZVa%qCuC1dtqOzD*CPyFKnLu2~L_Z&;;l@*F-Y)Bye3dPh_}@1%8cG;38~ z7+~WIMYu{!UR=BVjX*jFpaq@EGj6Rn-g>Uac54JSAO8$=4dFI7)?n0Yx+Okv>4a9# zSGk>SKUzLxjUHV>V-3JEJ6-J0b1izDOq-_b;IyN1%`poK-UoPJ26!JLc)txpvrT;p zx(+WWZn~abystV~x)f~#lxOjx>B94RG@Y^cc!2LfSu!jl;>NmIf_WG8^1YCgO2hLM z=LJ{5L11HJFK{g5u11QHd|JnAzHIOFxI3HFv+Jge*Ymmx#-)o<JahmJMd-xR1ZUSD zZDvIXo=+J9wcovz1(s&hxjK$W)-X+P*|@om`(7nbQt({N*{{ux(b$5n!!)BPCbjMR z*MM8~b4*$S(*{-?DDnVdVRG%3Dr!8R0gS-yy7m3~)kgY58@60%SeU^5<qDpj#}QC> zyu<!gM;!}H@0(h~GOjaFbd8OTU0z-;G`cg@@0J0%yFXifu;G2b0n~F=TMfIw8$bc2 zTA<^7cLoIgwE1qfc@Jo8^+)wZ)CZl`MzoR((;nBF@hp$O3tt%`3@%j%U5|ARA5|;T z4%%NqqJK(6`efoAU#SCp6WacCC|3~8PFCJl{W7Bc+PWs_J&wqkpTsaSO54++Ne2&D z;Vks4@fqk;Sk3s!Ej{W^<&Sf@*7MVE4nz=i08tTg-q)kZDXB?GA2FZ&yX5%4wG9%E zNiCK=hk-!c?@IJ|K%kZ<pf5JS9vBe_^a|ncAqWEv1oC|b0xf|+@3}#L5C7?uKUcz` zWFY(UwJ}5gz=;NzAEqDyg{m~h;FKU5cmbs;B+S@l?LGJVX2rgvT_q7tB}NRBYeejq zG<Io%`bp)(Ly4G37%fk(Bab|5*~zjwhRa#V;HA5}>YDh#O-rdm9LnCP=e&&jF+ZI9 zWBI23+QNLR&Sg#H?CR-eP*h-CQHbZFk-h}98$VL$#n3XyvlE`4N1DqN&4$@7Gj75j zbes#)Bmy}Yu)D(!A<uf!pFYm#pC<5+DgRk|Y79(Uf4J+tWl^sc@z$HH7r>eH3XPpH zVYSmEf3M?}P#p{We4bC1Too2>S(hTHe+wSUl~KU?kZ!+vUmL!-w0!-Qva(}DlT%5S zl-c1&9h`^glOLh)voEe1=ilDk*aEBi*|4eKotKw>GvNz{I<T()znA>+3huC=(lvSz zh~fVlod3M{zr^p?mQ*O&rs;ZkY`IuZts(3dA2n~iXC{h6L9E1~Aw@tD$DaO^|Aa`l zU4z|q(&zb2kYt86&$W;C>ia+6*27EF=%aBX?RuEc5)uUzZ4~^vb9zSP4e=|UF`x~_ zk0qPi$c%doDFKMcNm!YPH2ADTA%i8Lf;D_>Z-~h0{4+&RK6^!^OdA#D1K%}{vWH&z zai-hUmU!HxY6_{;Vw<yK;OFV-QglvcWo((FPr%?$`9=b1kY~Lk!=>kxiT7~4kpLu? z*vW_dR9prBQ(Qlvi%UR!EcD+16Mx+~SISDv^wQrg6i}`ukU*DGnoAqxnfX=i8;fTc zXeF<DzEP2~41dvdRcQ2|c=^TVOM70&rLe2UAu!IozsGP<mQFe*xN~Tl?<W8=UxE{# z0aL===oC;9MoX&Lort_re)*pJm)XFWp{QJJ??CuQGXH{ok3W5Iv=T6eYh{ikx($wJ zJdV5a@90#!3Qdo4-+O=iT7554p@01)QE+HwcLwztgq>MgDsB=&pEL8EvIU6?$h?!X z+c_7|U%b4U#R<u%E%OgYeD#&%zoh1WqWGUv^B<Y|pV|A5Q@)HQaLbn1Q~W;zMiKyw zR#~FmxeW`KQct>qFe-f^g8*HTNa{N+v5@K9U@}9*s?(p`_#Je)#X$pZBF|t$=|p$; z+AN*-a*SOSF6TDG+W6zk=J9deVtu<xFYr{D1vFm!N39K^RdBz5U@58Ktl>R|A_!;< z5V4DNC`Ba4;*EP2K;&LS*gd>-KANztovu&`Xi~IRb|`)pOaB&ppr@*<jP6d<Z3A8N zb0j-X#Uqo9h=Ww@rogR7)HSu-RCnc`yh7N#3Af0yCzW99gea3*mPflOUHuJBs$~vE zCii#5QQDw9!MwUN5!tWz&jr!mLzIo^2aw4$z0iI>1wwnoeVQumg#yf0h<bm&1oWi{ zDIvZ#QBf}Q*;9aSLiFc*37QI6?S~+!epfm`KH7L>`V(jqGw@MUWhVN(eDM?@l~R<V z@IdjLxPX`!J&$-<t}pZ9AnTbG(-je0{_qAJ2pZW@sDBpi(HH6I&lWyiV~RX4-V*(2 ze&bDZVMt^Ap)jj`m7E8YfhS9oWL8^;9Jq5wz*scwd9>0Gx#UcmZ%xKlIVkb4SKT%g zX=oXx6>%tHZX@QBZ)q@9YtGozRTn#%!b}+Cri<ev5G;guGGV69O;S;~m6|$<eg2^Y zKvJA#R02#4WN-wq#6~XqEbkE1syT!~?=67OOa6)b|2@F|;_W}>;UA}@bhO!iOC^5- z`fU5(VEZqO^!M<eMCTE<vT6o6Pu^yZ3}qY`9pC&^<K!I}AOVL9XyD*uD~!qa>SA!I zEyq4v0(lOW3Y#=3t=xo?Fx{q$bYR~cTk;Z+d_4kW$D4}_xZ;#QRwh1^fR6E}6dido zBlSh{L}X@d*@U{k(<71)Vq|e3><%Vlp5~7P(kljUk}%YOP9qyU63zQ`);q`ti13aZ zyHI;E3-go-^%><~9T|$~BLPnx{z=N4D40zejMD|f@1er~0k4|c;ezz1z`Xiq=fqV- zM*<&-{`Ksf`uS6KE};2G?UT1ef5c|y)a%gtQEgiEpQ=B!_y=uvU2O1%lQz(0od<2e zG6?8j{AhpjTEbHzEbv%$w#&i{t^{CgNY8=EWXH+^f*L!hDA*fjtWsiG7o$WYT)_?6 z{2j%?L6+pzlD$$j92p*uePid11l;63b(nFbk#TlsNRa1MThsRCpQKlGbHJMS_4XjI zOdBKpC7Vr|>d96|^-M|&W^-iP!-fB?`Tq#&V~qb(R{kkq|LPKQS!`4EH^f1Y+WRkD z^glq;m(kcaB141xN2GN(e~=kvc*FZh7){U!qFFH8Q7dofYHDdeZhhbeCB)}?C*-d9 zJ&YRNp88xx<=eHtaKu3a1cPZ_1|=emR)j;fv4pV@ML<PXFlA6sg<TC0H3!EV9A$p> z!0FZ(n1$TU`!`hG$1?!u|5cSu$SuKHM%5kVj+FU54uHcU2|+Ea;a^dle372!YdD*7 ze^x*amrXnhU)Os+x4*Du=(ryTLQ+y=@&XgK(ynyTpYa};wf?(pDf8Ze;I^YgK^^`( zeJj>9p3iY<FIs_Y_~NQw|LGTcJTMx%fnscbDF6>C82u`57@uIE*<?;IM`%^Bf5!r{ z?nK`q_k9;&Ks5FzBCoOjGDYTeE)tpfbL{RF(Fic%wDQ(pmg7si|HN1rI&wH>XtMs} zU8aq=araDMU=9h}*64&Gtq;>ZFm&eaiAg|uYmQ?B<5GsJ92hioEs8=%j+VC&?A@5t znci%2W!ii5egK~`oaOZ7BqRprHDy;BQ0TfjZPXjtsNjspO4QO@ZWy<}INR5M1R@hK zhmh$g)9#s9#Ml_$CaC@=;P^KV4Dd5+d_MqV_WD0u=YLAuqY3>NTKP8!{Nq3&ih0Td zTiT)yHVg<JVa99^A|MGuP!s!<032^ohYp{-d|dc@#V}z*`%$?!3aDhPNfCnI13rZd zevc4}2{FF}t)Q>b2moS~emv%EpT#3PwtaT?HG=?itK04xapl=&cbQ|w+syHuospiQ z=(S7Xt5V_iKif3;9U%z7N|^Q$(`|&uR;m{g5@U?N%`~cU>X1TckwwBRY{+}Wm<`m0 z;yf1!^(kIq79}Qw`v>Kajd?*uH=1X{&?gXMkBt`q*^p*XOBFvwu8^#2?GmiCLpr5C zv^`~7#vp#9xLp3-$EP4G7Ox$-;sfY?NLF!VQ^zpE@sQRquO<;e@`(>U2uO4{XZ72_ z?owgD&<0r{g+K%x5HKh77R=}j$Kjrk?UDWW-9Sbr#Ai4{?cXD)8MZwK6e)-R!c<M8 zO#-Agy+E#^!)IULM7{~~zLu35ph;G3Nq&suNrj=E*dUk?>!lvCzs(mfBY+?uiRQ8$ zT$tte)8-@`{feb_(Z$)!`OQ#(epg|{j-UddH9!Qq?@a8P5$maSaiW%H{%m&ziBys~ zeI^F9iDS4c=Q(Vsnq5uw>;s2$sMHFKLbtJr#2;UqSmYV4waO<z<>M!i-iJIp1p~8R z+3#ViVEowm-1kQ%;=l3n|E*Se<gI@qs=vx&Xs}C!2&~|Lt!n<unIv)@48Vndp9T2e zHPOEaq0Kc`)~oBdJNMJ4red6w_ZNM?4Yq9!6{#|7@>R7lm^836K<^$IHu9jqp9FlD zPPIn9*n6h22FDv$;Ko23a`uHH$?+<XG?_A5(LUtnbtHuV=n|*y0eEeYi2mgyq#t*4 z`y8C-GSpG(;~yB8jve4#<fbrxA(KRBPRAH{2L^_87cQYOgC{ju#u{lsmDw=@uos~) z$6xJgW;@A7RPhO1H%SP58CNwO<Y2T4u-ca<yl@|pDY+*=aKl@7BQx2@v=vU$6o8fb z!!0df68L$OUU~>1^%8FB9(y+J5Ja|m0J-#awMQ<wS~viH)B{IK97ECw2k}6#=YUlS zo6eOa(=5wT4dI*5d?tm9X}m{XoJsynYDw4+=<XmFC3QTjRzc3FM--n#np*Pj=!96g zl#*gra<*#^A!A0%pV-{9OZub9+anLwP7qNyvE?s37w24lLTx1x`f)2MEzE&>1z5lc z`TYnc0pv&Z`k@C7(@7~?4Ruw~?{9yGc)kJ*TK-JgaNOS36G3V)m{}2dh8{uW-<5p- zBdF*tzu^;m3IeR&zw*$(%G$r7s+6iWnr~h?eXhp}Z0<FEN>rJesY!GeKuIx~3{7T` zCZ)+aCqz`Th66b*H6cpV=tWhxxsgQU*Q65mY%$4#m_f=g!bakXUQS3CB^6)9v4A+> zAUSzP?~)moF`e5(w(^_fKm4=p>Q{cb+684(%RH{Q@j#kn#`HQS;PZJmZ?E-Ugg_c% zCR6lyNQINIjwb$=i|gsV$MySCBj}iRP?6PNFAc$*X!Llm>=Q`PYrd1BTO%9%E_0lz z=%z`+-Wa+jQY!T5M@hGAOdW2`0DJ==^Lf_$S0TT6#h@(KV5|;m&fh1>lvhCNm}34q zY~(Fl{#s|NbDJezruJy}jlj?S*StLl^q`ciyWXhEVRK=zgF*Dg_)*VV&*(8T;7w7j zCxCM5_N3H@%X2Da8UZ@`gKHEa_$UD7g>YecKuGJwTJ%jwjfR#JCjs%J{<M$XbB=!> z=$%1z^hN?AvI)ug?p(vRI@sWuS6MIi?9tyy877itTIK|VcRePHr|N|x8JW;)x~_CD z5;4nM%hQA%Os;oCKsI`JNk#)bEb)f}zagsvSwKM-^!fJPC>;v_&K>f0leb2BlOUHs zd@j+z%G*pgCDe30cUz6JDo*#B-B;zimOpKFEJ}Vhc`HO}x|u+N*G&?oW?ePBtQ<Pp z&ompi{ZR_TGW~l@HB=`ilg;}>c3R0@)=sOBZs$5xGjTv5>gSrt|IID^8(9521!SiR z$Nv8$wf{4b)jbkf3cxy~e9Ef~RGHU5G|w`xhwAdk`%YI(mNCn1-VCWhn6BGD#C%+| z`)p}-eU#a^mu@WEiH55^@&`_X!gdt6^-9U8VHM>w0uZ)`1g|+FK4pyIy5T2gAEbq> z(yny{k4k`DkQ%|fz`QeuVa%K}2isNmtFe{#C`XYzrXR&$BC@=BoNC@?vN0B26ZZ}T zsog<R19Q@uWwm)*QHp|98}s)6njI!hF)6a`LsgW*%6_CPHaRIWb9(FY=#H|azc6KD z__0v6_48C-I%I9oGPqIE!8h_RA|qKh_Ju--UI4K8fj44<v6!2?A_s8Z57Z+o{<Frp z5Wi6P52IhUziliZ%9d}{bG(QNl97|&xgrlB1I{F&cz<U*MU4xfcCj-!s@*^VAq_sz z&K>Ub(@jBV-T2kW+-G`gLUXYF{u_@cK-nW7DH9KgsX0<pz!1=J+7z#@dBmt56-jqc z-qw25WHL|%=FB#b6y{3(CB#MB!~H%vtp1!{A7|5P95F{Esths6=_xuqGTtx%$u_44 zJe2;cb9k~MJgzXyo)}@!&3KKJSQ{6$Fr-1<1(1hNep*64#%G@WzvLN`8I8L=lyiYi zIMb#E7Ur=DG-6G>c2o|oUaX&jc>^^r`hZ=IApxQ#hp&mpU?P=fywTP>@HPJn(&ayP z`u@rF{~Oo#D5iic{IjF~WhPBTJ!SX$|Jlh=0#1$)sCTg+c*Fp}`I!uYlp+$3JgKZ% zFvk(b0Z#@q6{W^}ETgyHFDz%Fud>O#M)q~JJJ5df*7^wG8O;q*3oeut`8Pne=ORYT z<-@+dW$;T2!&LBP(-VBl5I8ZseCT;KX4pQ$7V>+1n5^~7D9I)Fbzq*X1=rYMGg%_j zuQ5ZQHkg+`<9n$lRxmkvmoMTE#PiE&0P^A#zpfszb<lBKH7QZnur9~Iit=bqFx`S1 zkzBTYdeSwG9((>biM)vroRS{P3~284H=|mBli<4(uXrlE{<Z{O>xb3l7y^O4A0umh zgb8_EIw7V)4TjZv_i}fm{bMsQ&`Q@0^O%nhhppb?eBloCMF;9v+wBHl$4do(cL{&0 zJb|WM9e@43vR7G}zzk3%2=w`x;D6sG{4Zwb|Huo#EdKSC@}~1@YU587WteD-G~{Ot znMhk(pCp)!3U-@*{zFkaPB8m!($BKKft-RRpCBHl2!V@gN5L`KFxjHv<AG9SBEdBj zur3m{9$477LrE|dED*=m40~rExSJ$6ZYmImh0VEbh#Un>W<u634L9+2&dD_~d<(lh z+IGh9$)2W)#Q{suzVNf`<)_(8@{O#RZjD;pKcyinYN=tjQLkcS8>JeQn{m)5yt5<} z@LfqcVXQGajTM$66qcG~E?302_YtRq1!Aqo&?wN7OD1T9vvI{JLXv7Tlso#cMDJt1 z+iB<LG}8uVNMz4XE4N(s-W|P_ZBMCMjQ3H7=`6JtBz@o|oX<yUl@gc8h?of2VhsE7 zGf4-Gaxk??`(#{2bsmgz0t;lvbevanoXb;7yu>1hjcMnQ%zHolrbZJyZM})0dtHJ$ zC5pbpz0q)@Yd=jG5QpYFKB4ks4oW0YzB)SQ2vwILqNwhFUQgRc04d(yIG-wW4Xy0Y zt}{UHuc-f_@|kGfWZrX;xvB_3^ac7eXM7p^v|}^6f_;w{9W$vj6+262?ze$7=>?uQ zT8o$W&dqEQM!z`q31gwk>3i<u7P>dvy$kB3H1n~N`QLb)5m_Ok`Bahbf@9%qxsv0t zv<ZncPM-{5NLTSZ&I-5?e;V7|vbPVV!0JJaVrT=g@XGDdbJ-<1e3*lI6yc0XaOL@2 zd8>^+y8T#_T5HDUHC@O|Y!c$)M@f#vtRI(_NNe1YPR*3gL33(Y2U61cb#pV6t+@>3 zl7R+60W|N(z$t$i=hw34(ie<&B#nzwvY5TnIo0^i&bj2qboGK1&opDw?H58`zBET5 z@oo_2&?hVjLz^wJP?;#waz3Igj*229Bir+$KAr^^j9WWTki;wLSm#$+tOd$t?tC@= zt%0<Rc~owKqnxle<Hx{0$-L8G{oTu550Mm}pZ!}U!aPC<*^ZdA-?DEYkWXn}*Fh4c zJ@xE>G5sUY!lrDq`;BdVDd)EWZhCvfX=3k$H0HJ68hR0&znSJ;wt`g(TE-q1cfRVA zU)Jy&lrp1aiTM}Q!!KgTbow<uvuAwhi*GBzn4j$<m8e4suN%Qo6?UF!iTS)3c;-ju zx3J){LqAl+y=J*hLSgRhQufvh2~`TIs(^@we&f(39&>XD(sJX3uRSx&l(0ze0rzOk z6&4o$q|y4fPlX+rX(EnNd{0lLXnaytzK(p2nL10x@bgkzd807bqRbyQtz5GWFUEA* zmNd5R{Y;1nRGm{YIuL3<J2lqVEn3clv-dAl<l*Ogm~Su~U7EECqKdeTW^|`DI&a{! zHuVbu3kTyT^(T*zH6~Q$MxyP;h*TAcwx`OB2|Q5-xAPQygk^VAK$1dbgSzBHlnPnB zRYDR&siK*4;a!@2aCuGR6gD;s7zHQm2oL22xdQD9f9xTaA})S!x~q?PF2s(aMzuOS z@Wh`s3CllJE?JguG+iQz!C$)vDp}E^*_V<FFFAOvlJ~ltmUTTwdgQg~aK)h9a7BL9 z&CC?mIi(>@>^2JpEIul3QPP<B2<QoQUlS~$<u3^yP?C6tpBkm=7gZKJG9f9!s=U;r zWDNgox1cY(Mvtj-WoIlUI_rx$y{dpegJk)vY8Xn$!Nju)pHt1C<Exd%g|~z8C4-Xu z6*GT-q~xhiaLh;;{rwRJfoS5v+vk3MG*`)^FfCN3GbP)jCC6<wU!!-9`M!5CUO0y@ zlM&Nni4v8jy~-nl8u<>U9HL=0=CCD)DuKzq7En-<^Nyu+EH(DI)K<1Xg_vOI97}gC zdFZMR9fvy2fJXhP_$_f~B^^S#37n*ywx1J9JL+d(Qk$Zk81g}UrXh$<4G%7Vtk30% zq(Wt~D%A>OK<?%2*1+r0{B$Grvg*m~W>r|yO)*tFyL#U1+#XY~DNLDeqvU$@$B&>H z?*J8xytQH^oJR7XF<t3>yQtNf1;-3-Q|lVp+Zm(!wS|{WZWVA^QKU>PSqo{iODhFQ zS|%yGeMVHh8b})t`fFO?N#oezOEN5<auZq}Mf{C(+cMWk?$mDoi0|1|a2K`IDqSB0 z;e`&F`1n8FKS_kZiK+wlVal-Y6{@t|8d1N2#~+Yqzd#*k{r5`gbvXH1?ViNi%4XN3 zh0J!`=Ld@0M%owE$Qu8QSte7Y?FHv3(y2m96@n#ug7U^B$8qucA|WC$M&;ik+1zaK zfxh4!tn#n`a$1S~JazmL<qrSVzzkN-5kz{!c1gvqlo<!RcM_Q+G)07Dv|);l>2|b+ z?T#?zf&6T}j-wiVo`DyHv1=5O7VZ5h?6E-xwb>HcYxGwu5K&{S*a#)t`E#i?1Uw$G zU})dSf|@ps+EZ;CS<U=yyDXeo&HQgY6x0l0)Af(wc6>a`fYTmGPjF9yIHAgO%4qyx zdoo&M4@KL^XrnO7X8c&A0E%AV=~hBz#diYRWZtJsVkSA%jW++mAWMr3u$>$%{E_9E z$c|)g9cjh0>)mO{toNSn>_O%sYF6bQNX?Tch|S(ppH%`wak+XjYKPx`;DZa9aH4~} zN{1`C68;9gnDzy0tPfni>WOqyMBy$t)^;F@FQ|=L3;Rk6Qm%4H^0uG{HK;JSd0VT; zb|jm}TKtWSCN6E|ovx%$nIfY_ihU2g#=u<Tw-|~h@W8Pk`@nDGu1==fxVabOki=up zbqeY7RUKT~wJ}_m>HR(*=r2xQXe%OuQjeLcy0@c&IN_1tj!DKy%5>^@HlZsy9gh7B zeNv*7FB{H0eN3Ur$c+5*agGFbBqx?>d1U#V0<9vEwbL#CM&Ef80i%j05=+0v$oB-u za(u_9oHGAj3N}+e^Ho%x#GG^6oD|L!u(&zQ;oGSV8}r+Ik?tmlfs*k-tYkP=^k>s$ z_~)FW<F>X+3wF+s9PdL9Mn%HHy}=#$Z_5*@BF5Dx$h|V=V&L&EjafxSaPDumXbzpC zSY=cN)w~#`eB;_UodP~3jcJyhr;jOA7ADCZNW&77Pj5WXhHPM&-hcKj;biP}%AQt^ zVvOvp<z?H{?>v7M?pV9+C>oI;t!Yq$t`~o#jV0vQB-}3&0+m0}jm&)QN%F%&up{3X ztIKM&fJSoI#W_fdU+tlUu)!!uSZ8vy!2>$`C@l6l$_8|?9wgWgpqjEMMak(nt)96O z;{@BZsQTca@yW2&N_QMe7O(7I8<X)7=;XEE>u<QbKc|bQi-GOC<5wpm3~bWiEfd8= zL3O^*9>-r2rpaxREXqk3mJ&OXziFXkJHRVD+kzw6nO~JgY@yCem03YR%o#K8NKlHS zM^H+utUAdmm_DweWc0I0X??&2Ws5uZ%`S%LfZ13SrZsUcTpp|3H>Q9>z^*E?Je%6y zY+!pv)k&I{${V_t7@}!6F<%Yq_K#`n!tjZa=;@oo5-RUUuFh^*rB~Rt*O_l`|I^!J zTtz1klcOD5t~e86waJaDWNh(Uo}e;&qO2~Cd(SY-64l>0`At-k<C-4jphKaD?<2e{ zTL)L(vVs$pu_GloU`3xs%?U@T@cb1AuqQprB$WMLKaoo0v97hXOJy~c3^+29ytZV3 zu_sa~z=J>3#)suXjReQXBK@iCrEqDLl4{#s$uMbQDlA=9-LyPqjq-TE*2I@HVx&hq znXEx7Q`~EwT|81R3v222?5HoyYq3tkL=jV>%x2i-Y4b;7%q4ZKIb%cXf2p{!!&1s= zU&i*P(wPzxZUoU*P?fPv)s?uaN!q4is8oUvs()B&!4Em;y5Dx!Jb%kLvtj#~>Zw%< zC-=qMCOL`Vc2@%xrG<B#voag|=289IKMD!0BF(N*q+C=`Br_0ReE5pN+0CwGm2V(V zrY2b*L`SPc8>%#W7=;=;ZEj_5`)Vx+^?iQ5U%!*PO6_{$UbLEPDN9IcQqG&N+P$us z!5`9@E~Wwt%$Svu=B?9T#?x}0>hPQ=ed3Q&GA(1Q%*l_DP1UFgu88;^(jOO;EmN-@ z0+m2Y6?=d6PS{<Ha{PlzQbDH{tWQ~#xJhB^rDawtr-vHsk9I|~L=5LK1e|*HF*nB2 zTE^;Udv_ZTTQw_;@He#Los5}5l2PDZ2$``7w80e?WM)pjSE@{4_j|rwU{n$%Xln}Z z8(mvAEu^5cF9n>MK&6n>qb+Kc{}Bvp=ZRULvq}PE!ak(H-{2Hh9$=Wh?_<cn9|M=h zNNXml&2(X3ct!UN9g9Yp4>96NnrY#<X72KF;v%GlFrY3<1r?aoRzjKW>7t#9t1FI7 zW+Z18qV4bokSNg!YZ1oRTjE5^kq#s~UVqzuqw@7Hdu6Tb(yoSxN+AzXD&NvbFyo5V zuPh^8P%@@X!LK@{_r-H6><6<|^pihXSzk_vr?62SM|&t*fngpNJoz0Riew{H<B*Ay z)%9@><XF4j`b`RH1M%dTx}r1Ju|2a__Hdo<?-rb<eg&YFkBX9z#1XRv^VJmGq;F=j z9|$b}<S@7%=lqeHS`0Z+RhLZa;@P<6OCjK?FGY_^^DswcucSOEit5O1AcPjlZ0nV4 z$L*n_J;q{`bFNQ;%EXEnz4o$$kf(sm-tf<a^{(gea&qjdiPij9q!tR+%zdk3iI9^x z+U8R8t_GbAt#$rNXBMZ`h(M3=moMSnxMJnzR$Fb~x%a-Aq`9;hmq_;7LaA}gNlksG zuVA?Nsmj(28{V9nL~2f$6@{`g9gK)kN3}gIp?jQaOFCJ~6AniEHN_vB*IVWrkyhN- zmuh@a5MD0LYbx?#Ed?;}*!o;8%rfCdzPa!b*LGI?LyS!N32^XMvw?-5^P^C<>ZqbI zuseS$=bZS%XP*!f!+O|9X;eg_$>Yp~>`E9K$cW91lW?M`7);CEI$VXvjWgZhF_OT^ zy<-IJ3fEVI_my0uI}1*Yj7e<}#}R*;i6op2R2B4PYTTS)1DQ5J68f;xq<yw|`w1n% z;epaEk@V(dQT()urOPR!>IIqkS;~=$A}xJ5_BpIQgjgf75+6$^&UJypXC#Fho+hCi zBf(wfFI!5bXcV}u*<0yY7zCD67FglWa1-^1uTZ@cA+pV3HI9nW7-wTe>{Oh|m&q_Q zvF&j6F{lod0tZ)8#p&05p5c}O#;zViGcv<YS(%s}tud~%(9Y5Uu}$i3lrFbS2c6H& z047+2UaoSG+;T;uBy7<89D7{&qW6GbVKy+;5rSjEDno4H+Smme^pDqVxWX%%E?H{F z+6KNKw0H*duDiH#_q6S`y*WQb4B|-i1suA=Pwb;REYx({4mv%4w{A*2>#36ay@Pv4 zMDR;xsQwNTrLmQy0xh3>JjRwf*IeYwSp%8GWD&No5tCsG7`L_2+0RHWnh9lgHW-0Z z3GJ}$3<WGkGD}$z7HeK|c23==ArO73qGP`>RBA<_C6J9HmS3pv+DRKLsj-F{tfayY zo}i$z$}-QZ%W236BAB>J-{e-w=Dko0<XA%l!wl!U2(cKtUD6bZU_lbQoDrp}K;MeZ z`QZ^fVWTF)MkdDTqVclL5MJv|Zs_ZNcsPZ$0C^ObM|4(9%{&ip1k{BUMxY=m=tpf# zm_);Z2o|w5cdiJnWR)=)2qd5ycAW3}L>Lxx)%&pFJ$uCwJmZDYc*W3MB|iJA__&It zY<mth3lCazxh%!FaColgeetvklkXz_op3h$#+<SYSz%(4+uhoM+vIDZ7lAlXm#q*k zOP8Zgp`(0(YHuY%b2ud03L{zpF`8;VJBKJ<f;&h$nY>V(<G6#`>N;=G)I3>2qQ|V} zBp=EFkQ}6d-j+lk7E@MkTlSKx3xma&)<WD`W4eIA3ZAY=%aI);i^9^)&W$J>MeAG` zC1~D))AwqXf_kG;*0WF2xC|>lA7?{alA1~atRhJ{63W#kjaW-LOFQbH;4qpO1AZry zt(-wHCk}?vQeKQ_$10$XKxDWo!S7&7&g9*EY^I_d35xI>25NuB9ABf1ie&t5Cv*Le zyeu*@b)UrP`rBj@?V-v(*tOQn)KooVa>DR=o|#cjEHJy4YLKFaWSs;powCmrg{5%5 zv}BV8yOL}pl-+0Tyad&P5CT1z(Vx7G!LuM-dM+e0!Fj*C{;+=TQGLdj4sFx5@A_Ue zTf3k1`D|#Yexb5m>ZNUL%|+7*@#1BKbv`&&loh>GR#l0`HVt04%pV(A`7XR-kE|+$ z2-8@EN~Wg3>&k8GH29Y(3y0lAscLq`Fp;eRjZ(Iuf$)g7Gztt8EX<qPCa+3uQ3e1p zRx~>_?qzNf9Tmf;ig(5<!#L5jIATA8Lk&hCL4AXzs5+|I#vQUIdB0P}*|wrhC1H^| z$v?<t{Kc0YM1L46E-xz@&E{d!!5jwQRvQ}%6n?FViZa4xZ6n0rDU3&Q!-7KN90O-C z#KzcTSf~9Phn3aH7|pVA^V{TmG{<9Ao+o3;_&Y#)FhnTQo(4<cCI;`-nFR+XdOG6h zj5hOHX646(vzf@E=GQ4wNhPYx*Nv9BO|Vm20zS=AhjN4($&$RXGMyuVZA!FFBXT-7 zYBuM*r&*F=g0sl2_bf_Q!hcG%#&EEuYM3QL7+WESmCUWZKyO`%(`m3#t#RwR^rlIw zDy+wPt|DL4YL!T5qIr#9bYLr0Mady>H<z-8AfIX@;;3J9V4jtFW54H{v($zGwMJ%i zuI0R%is(!(E?A9`H^qdIkueInUUafjE2<6dDOpKc?QD3a(IY#*H}+@jAm~rdqWXqG z>_=xjTXx0H9M*9%7Sd+8qN0rHF>+s5{q-%4XC+22&qJHSfj_PWZsJXbq6uTL?g=;T ztT@kF3UuLQ3<lSvaKfs}2x@T)fD(0b5~($B`4=oW+>KA_IFBb6HDA{erqx1S@HMA6 z4XlY}4GNz^J+|@=GH>ULbc{9+oaQ;}mS7`?E=ztJwv1j$>+wxC1qYUQJ!j4LO&3<~ zdj(9Cis*apt1I4DcsC@jz9^no$mv^`IIZyy=WLMe?VX~PhNCqd@0|n3vq~;`dI90P za%-2?!KV8#JRNQ_nbd&uy@#IWxvN3vTk;@a?~2KD$@+G~p=idV75K`M(t+pTY(N}6 zkHckGz(Z%c(COwKL^?-8+G0?*Y7hEgywVYm!l3an8;#g&JFfY@kLw;9YQV6-S{6<- zDHI>>HoO|x9oQKtUNy-Hajd@nkrvd;>_C_IEih=MXKg)I1!8G>)811ghJ&C58TnO| zq8s&cD@HP6zUf4RA5Bq)2xgQ-TlGns6$gJugW`4d$7r(Z5VaVm``#*2MsN54cq6sy zcS?;i2egM0FG^`K<eU*i1;4Q?UjVkFljXI8s-&|k*airT=8}kDO&yI;3^150|HS~I zplnsRoT{JQY=)9er!S6#&UeQ}O;TUn7r;}zxp1iOJ}TbGOvljirhWC?vO5ClLx`NW z@r4k}NuA1u*D}*X?!ox&J?Z@t>D}bRHZcVNN*TTD+d`-(iK5*qynphd0=2oTkP1F( zhkQR#$k&>WF64FyhLs7+5t-l}%&-j%(MGSe60s*&L0v~JbUneCEJq@E;d7@;=*3!< zoP|zYF|R`&1o7+{`En%rAj_pvh29%?q%H^b3yw>E<O^O*4K}Nd%}3{pt`83@oF$`6 zyg$?3SB#tQv<?V0Ss~dIg*qofLdOU@s)e|IO`9#{f=5RY&FdV+M4DxgmSQdU4r}i} zcUGfXbX6xH5CPre{{@IQzo2f8sc+9OQq`p$sGV`_v67<JTJIJGdoeh*>aHzN<j>al z%^-AW^7M8%In8p{6RMcH-M(bD0#_{NiAGD@=5VCg--y~RrRgNj6XtxrhU#m6(9s%< znzy8SH`2D(Gi*%g)br(3dyW-aiqISqKOZ*`>+gu+5Np3JHD$#g?OS?<YBo{@J5`y! zo*DLPZK_g)b0XMjk#fc?e(HmAWCxpsC<&Re&p|hFDp7BExaz;ke<tkAF|oet)58Yy z+>~24d^|pbr+d{F4+fkIuvT5@QaKHh7i4aw8=&3m{NjWQh#9+A=A4ujY1Max4E`1l z2;7Wp4TudnYC&fD95wIS&+|SZaN)9pPGz=E(re9v5z4Dz!>hrwrgSk)!$e)SHMF@I zqI;4g)#}pF(e${W#ElR&t*RNN1J}X&mZy}Ng<1<#)t6xx4atEj<4EP7Zbj?Mq(*)y zGMF^iTD4eSSi}≥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 diff --git a/examples/embedded/raycasting/raycasting.cpp b/examples/embedded/raycasting/raycasting.cpp index f98b9605f4e..1b94ab7d624 100644 --- a/examples/embedded/raycasting/raycasting.cpp +++ b/examples/embedded/raycasting/raycasting.cpp @@ -253,10 +253,6 @@ protected: void resizeEvent(QResizeEvent*) { #if defined(Q_OS_WINCE_WM) touchDevice = true; -#elif defined(Q_OS_SYMBIAN) - // FIXME: use HAL - if (width() > 480 || height() > 480) - touchDevice = true; #else touchDevice = false; #endif diff --git a/examples/richtext/calendar/calendar.pro b/examples/richtext/calendar/calendar.pro index f65e8852bde..3867a027cfd 100644 --- a/examples/richtext/calendar/calendar.pro +++ b/examples/richtext/calendar/calendar.pro @@ -2,8 +2,6 @@ HEADERS = mainwindow.h SOURCES = main.cpp \ mainwindow.cpp -# App cannot be with name "calendar" in Symbian due to same named system component. - # install target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/richtext/calendar sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS calendar.pro diff --git a/examples/widgets/imageviewer/imageviewer.pro b/examples/widgets/imageviewer/imageviewer.pro index 5468a951ca3..a8d92a6b180 100644 --- a/examples/widgets/imageviewer/imageviewer.pro +++ b/examples/widgets/imageviewer/imageviewer.pro @@ -9,8 +9,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/widgets/imageviewer INSTALLS += target sources -#Symbian has built-in component named imageviewer so we use different target - wince*: { DEPLOYMENT_PLUGIN += qjpeg qgif } diff --git a/qtbase.pro b/qtbase.pro index b766a7a776a..56f40cdb7a9 100644 --- a/qtbase.pro +++ b/qtbase.pro @@ -35,9 +35,9 @@ contains(PROJECTS, tests) { message(Unknown PROJECTS: $$PROJECTS) } -!symbian: confclean.depends += clean +confclean.depends += clean confclean.commands = -unix:!symbian { +unix { confclean.commands += (cd config.tests/unix/stl && $(MAKE) distclean); \ (cd config.tests/unix/endian && $(MAKE) distclean); \ (cd config.tests/unix/ipv6 && $(MAKE) distclean); \ @@ -88,32 +88,6 @@ win32 { -$(DEL_FILE) .qmake.cache $$escape_expand(\\n\\t) \ (cd qmake && $(MAKE) distclean) } -symbian { - confclean.depends += distclean - contains(QMAKE_HOST.os, "Windows") { - confclean.commands += \ - (cd src\\tools\\moc && $(MAKE) distclean) $$escape_expand(\\n\\t) \ - (cd src\\tools\\rcc && $(MAKE) distclean) $$escape_expand(\\n\\t) \ - (cd src\\tools\\uic && $(MAKE) distclean) $$escape_expand(\\n\\t) \ - -$(DEL_FILE) src\\corelib\\global\\qconfig.h $$escape_expand(\\n\\t) \ - -$(DEL_FILE) src\\corelib\\global\\qconfig.cpp $$escape_expand(\\n\\t) \ - -$(DEL_FILE) mkspecs\\qconfig.pri $$escape_expand(\\n\\t) \ - -$(DEL_FILE) mkspecs\\qmodule.pri $$escape_expand(\\n\\t) \ - -$(DEL_FILE) .qmake.cache $$escape_expand(\\n\\t) \ - (cd qmake && $(MAKE) distclean) - } else { - confclean.commands += \ - (cd src/tools/moc && $(MAKE) distclean) $$escape_expand(\\n\\t) \ - (cd src/tools/rcc && $(MAKE) distclean) $$escape_expand(\\n\\t) \ - (cd src/tools/uic && $(MAKE) distclean) $$escape_expand(\\n\\t) \ - -$(DEL_FILE) src/corelib/global/qconfig.h $$escape_expand(\\n\\t) \ - -$(DEL_FILE) src/corelib/global/qconfig.cpp $$escape_expand(\\n\\t) \ - -$(DEL_FILE) mkspecs/qconfig.pri $$escape_expand(\\n\\t) \ - -$(DEL_FILE) mkspecs/qmodule.pri $$escape_expand(\\n\\t) \ - -$(DEL_FILE) .qmake.cache $$escape_expand(\\n\\t) \ - (cd qmake && $(MAKE) distclean) - } -} QMAKE_EXTRA_TARGETS += confclean qmakeclean.commands += (cd qmake && $(MAKE) clean) QMAKE_EXTRA_TARGETS += qmakeclean diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp index 464e53d7488..f1c9015092e 100644 --- a/tests/auto/corelib/io/qdir/tst_qdir.cpp +++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp @@ -1848,8 +1848,6 @@ void tst_QDir::equalityOperator_data() //need a path in the root directory that is unlikely to be a symbolic link. #if defined (Q_OS_WIN) QString pathinroot("c:/windows/.."); -#elif defined (Q_OS_SYMBIAN) - QString pathinroot("c:/data/.."); #else QString pathinroot("/sbin/.."); #endif diff --git a/tests/auto/network/ssl/qsslkey/qsslkey.pro b/tests/auto/network/ssl/qsslkey/qsslkey.pro index d8823622907..4af35487cd5 100644 --- a/tests/auto/network/ssl/qsslkey/qsslkey.pro +++ b/tests/auto/network/ssl/qsslkey/qsslkey.pro @@ -25,5 +25,4 @@ wince* { DEFINES += SRCDIR=\\\".\\\" } else { DEFINES+= SRCDIR=\\\"$$PWD\\\" - TARGET.CAPABILITY = NetworkServices } diff --git a/tests/auto/widgets/util/util.pro b/tests/auto/widgets/util/util.pro index b7fe35ce4c6..33f28450019 100644 --- a/tests/auto/widgets/util/util.pro +++ b/tests/auto/widgets/util/util.pro @@ -5,7 +5,3 @@ SUBDIRS=\ qsystemtrayicon \ qundogroup \ qundostack \ - -symbian:SUBDIRS -= \ - qsystemtrayicon \ - diff --git a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp b/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp index 31783a4431d..12420e25a1e 100644 --- a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp +++ b/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp @@ -44,26 +44,7 @@ #include <math.h> -#ifdef Q_OS_SYMBIAN -# include <e32std.h> -typedef RMutex NativeMutexType; -void NativeMutexInitialize(NativeMutexType *mutex) -{ - mutex->CreateLocal(); -} -void NativeMutexDestroy(NativeMutexType *mutex) -{ - mutex->Close(); -} -void NativeMutexLock(NativeMutexType *mutex) -{ - mutex->Wait(); -} -void NativeMutexUnlock(NativeMutexType *mutex) -{ - mutex->Signal(); -} -#elif defined(Q_OS_UNIX) +#if defined(Q_OS_UNIX) # include <pthread.h> # include <errno.h> typedef pthread_mutex_t NativeMutexType; diff --git a/tests/manual/qnetworkaccessmanager/qget/qget.pro b/tests/manual/qnetworkaccessmanager/qget/qget.pro index 80af8a556f5..341f772b518 100644 --- a/tests/manual/qnetworkaccessmanager/qget/qget.pro +++ b/tests/manual/qnetworkaccessmanager/qget/qget.pro @@ -5,6 +5,3 @@ CONFIG += console # Input SOURCES += qget.cpp HEADERS += qget.h - -symbian: TARGET.CAPABILITY += ReadUserData NetworkServices - -- GitLab