diff options
author | Geir Vattekar <geir.vattekar@nokia.com> | 2010-06-17 09:16:04 (GMT) |
---|---|---|
committer | Geir Vattekar <geir.vattekar@nokia.com> | 2010-06-17 09:16:04 (GMT) |
commit | 0a852d51c6d74712cda8c7d08da4f5c90d99d5cd (patch) | |
tree | 2ac9f365b8a25738d3756d051d7ccccea27bff7e | |
parent | cf74e83d8b79c4840c073bb7dc387045b1210df8 (diff) | |
parent | e4fbdd4fde9b8d2acc13268b44caa57405c3db1a (diff) | |
download | Qt-0a852d51c6d74712cda8c7d08da4f5c90d99d5cd.zip Qt-0a852d51c6d74712cda8c7d08da4f5c90d99d5cd.tar.gz Qt-0a852d51c6d74712cda8c7d08da4f5c90d99d5cd.tar.bz2 |
Merge branch '4.7' of git@scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.7
243 files changed, 7796 insertions, 5030 deletions
@@ -6,6 +6,7 @@ examples/*/*/* !examples/*/*/README examples/*/*/*[.]app !examples/declarative/* +!examples/ja_JP/*/* demos/*/* !demos/spectrum/* demos/spectrum/bin @@ -146,12 +146,12 @@ sub shouldMasterInclude { return 0 if(basename($iheader) =~ /qconfig/); if(open(F, "<$iheader")) { while(<F>) { - chomp; - return 0 if(/^\#pragma qt_no_master_include$/); - } - close(F); + chomp; + return 0 if(/^\#pragma qt_no_master_include$/); + } + close(F); } else { - return 0; + return 0; } return 1; } @@ -168,17 +168,17 @@ sub classNames { my @ret; my ($iheader) = @_; if(basename($iheader) eq "qglobal.h") { - push @ret, "QtGlobal"; + push @ret, "QtGlobal"; } elsif(basename($iheader) eq "qendian.h") { - push @ret, "QtEndian"; + push @ret, "QtEndian"; } elsif(basename($iheader) eq "qconfig.h") { push @ret, "QtConfig"; } elsif(basename($iheader) eq "qplugin.h") { - push @ret, "QtPlugin"; + push @ret, "QtPlugin"; } elsif(basename($iheader) eq "qalgorithms.h") { - push @ret, "QtAlgorithms"; + push @ret, "QtAlgorithms"; } elsif(basename($iheader) eq "qcontainerfwd.h") { - push @ret, "QtContainerFwd"; + push @ret, "QtContainerFwd"; } elsif(basename($iheader) eq "qdebug.h") { push @ret, "QtDebug"; } elsif(basename($iheader) eq "qevent.h") { @@ -186,7 +186,7 @@ sub classNames { } elsif(basename($iheader) eq "qnamespace.h") { push @ret, "Qt" } elsif(basename($iheader) eq "qssl.h") { - push @ret, "QSsl"; + push @ret, "QSsl"; } elsif(basename($iheader) eq "qtest.h") { push @ret, "QTest" } elsif(basename($iheader) eq "qtconcurrentmap.h") { @@ -204,7 +204,7 @@ sub classNames { while(<F>) { my $line = $_; chomp $line; - chop $line if ($line =~ /\r$/); + chop $line if ($line =~ /\r$/); if($line =~ /^\#/) { if($line =~ /\\$/) { while($line = <F>) { @@ -212,18 +212,18 @@ sub classNames { last unless($line =~ /\\$/); } } - return @ret if($line =~ m/^#pragma qt_sync_stop_processing/); + return @ret if($line =~ m/^#pragma qt_sync_stop_processing/); push(@ret, "$1") if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/); - $line = 0; + $line = 0; } - if($line) { + if($line) { $line =~ s,//.*$,,; #remove c++ comments - $line .= ";" if($line =~ m/^Q_[A-Z_]*\(.*\)[\r\n]*$/); #qt macro - $line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro - $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE[\r\n]*$/); #qt macro - $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro + $line .= ";" if($line =~ m/^Q_[A-Z_]*\(.*\)[\r\n]*$/); #qt macro + $line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro + $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE[\r\n]*$/); #qt macro + $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro $parsable .= " " . $line; - } + } } close(F); } @@ -259,7 +259,7 @@ sub classNames { $i = $i2 if($end eq ";"); $last_definition = $i + 1; last BLOCK; - } + } } } } @@ -267,42 +267,42 @@ sub classNames { } elsif($character eq ";") { $definition = substr($parsable, $last_definition, $i - $last_definition + 1); $last_definition = $i + 1; - } elsif($character eq "}") { - # a naked } must be a namespace ending - # if it's not a namespace, it's eaten by the loop above - pop @namespaces; - $last_definition = $i + 1; - } + } elsif($character eq "}") { + # a naked } must be a namespace ending + # if it's not a namespace, it's eaten by the loop above + pop @namespaces; + $last_definition = $i + 1; + } - if (substr($parsable, $last_definition, $i - $last_definition + 1) =~ m/ namespace ([^ ]*) / - && substr($parsable, $i+1, 1) eq "{") { - push @namespaces, $1; + if (substr($parsable, $last_definition, $i - $last_definition + 1) =~ m/ namespace ([^ ]*) / + && substr($parsable, $i+1, 1) eq "{") { + push @namespaces, $1; - # Eat the opening { so that the condensing loop above doesn't see it - $i++; - $last_definition = $i + 1; - } + # Eat the opening { so that the condensing loop above doesn't see it + $i++; + $last_definition = $i + 1; + } if($definition) { - $definition =~ s=[\n\r]==g; + $definition =~ s=[\n\r]==g; my @symbols; if($definition =~ m/^ *typedef *.*\(\*([^\)]*)\)\(.*\);$/) { - push @symbols, $1; + push @symbols, $1; } elsif($definition =~ m/^ *typedef +(.*) +([^ ]*);$/) { - push @symbols, $2; + push @symbols, $2; } elsif($definition =~ m/^ *(template *<.*> *)?(class|struct) +([^ ]* +)?([^<\s]+) ?(<[^>]*> ?)?\s*((,|:)\s*(public|protected|private) *.*)? *\{\}$/) { - push @symbols, $4; + push @symbols, $4; } elsif($definition =~ m/^ *Q_DECLARE_.*ITERATOR\((.*)\);$/) { - push @symbols, "Q" . $1 . "Iterator"; - push @symbols, "QMutable" . $1 . "Iterator"; - } + push @symbols, "Q" . $1 . "Iterator"; + push @symbols, "QMutable" . $1 . "Iterator"; + } - foreach (@symbols) { - my $symbol = $_; - $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces); - push @ret, $symbol - if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q - || $symbol =~ /^Phonon::/); # or in the Phonon namespace + foreach (@symbols) { + my $symbol = $_; + $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces); + push @ret, $symbol + if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q + || $symbol =~ /^Phonon::/); # or in the Phonon namespace } } } @@ -453,37 +453,37 @@ sub copyFile $filecontents = <I>; close I; if ( open(I, "< " . $ifile) ) { - local $/; - binmode I; - $ifilecontents = <I>; - close I; - $copy = fileCompare($file, $ifile); - $knowdiff = 0, + local $/; + binmode I; + $ifilecontents = <I>; + close I; + $copy = fileCompare($file, $ifile); + $knowdiff = 0, } else { - $copy = -1; - $knowdiff = 1; + $copy = -1; + $knowdiff = 1; } if ( $knowdiff || ($filecontents ne $ifilecontents) ) { - if ( $copy > 0 ) { - my $file_dir = dirname($file); - mkpath $file_dir, !$quiet unless(-e "$file_dir"); - open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)"; - local $/; - binmode O; - print O $ifilecontents; - close O; - return 1; - } elsif ( $copy < 0 ) { - my $ifile_dir = dirname($ifile); - mkpath $ifile_dir, !$quiet unless(-e "$ifile_dir"); - open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)"; - local $/; - binmode O; - print O $filecontents; - close O; - return 1; - } + if ( $copy > 0 ) { + my $file_dir = dirname($file); + mkpath $file_dir, !$quiet unless(-e "$file_dir"); + open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)"; + local $/; + binmode O; + print O $ifilecontents; + close O; + return 1; + } elsif ( $copy < 0 ) { + my $ifile_dir = dirname($ifile); + mkpath $ifile_dir, !$quiet unless(-e "$ifile_dir"); + open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)"; + local $/; + binmode O; + print O $filecontents; + close O; + return 1; + } } return 0; } @@ -568,37 +568,37 @@ while ( @ARGV ) { #parse my $arg = shift @ARGV; if ("$arg" eq "-h" || "$arg" eq "-help" || "$arg" eq "?") { - $var = "show_help"; - $val = "yes"; + $var = "show_help"; + $val = "yes"; } elsif("$arg" eq "-copy") { - $var = "copy"; - $val = "yes"; + $var = "copy"; + $val = "yes"; } elsif("$arg" eq "-o" || "$arg" eq "-outdir") { - $var = "output"; - $val = shift @ARGV; + $var = "output"; + $val = shift @ARGV; } elsif("$arg" eq "-showonly" || "$arg" eq "-remove-stale" || "$arg" eq "-windows" || - "$arg" eq "-relative" || "$arg" eq "-check-includes") { - $var = substr($arg, 1); - $val = "yes"; + "$arg" eq "-relative" || "$arg" eq "-check-includes") { + $var = substr($arg, 1); + $val = "yes"; } elsif("$arg" =~ /^-no-(.*)$/) { - $var = $1; - $val = "no"; - #these are for commandline compat + $var = $1; + $val = "no"; + #these are for commandline compat } elsif("$arg" eq "-inc") { - $var = "output"; - $val = shift @ARGV; + $var = "output"; + $val = shift @ARGV; } elsif("$arg" eq "-module") { - $var = "module"; - $val = shift @ARGV; + $var = "module"; + $val = shift @ARGV; } elsif("$arg" eq "-separate-module") { - $var = "separate-module"; - $val = shift @ARGV; + $var = "separate-module"; + $val = shift @ARGV; } elsif("$arg" eq "-show") { - $var = "showonly"; - $val = "yes"; + $var = "showonly"; + $val = "yes"; } elsif("$arg" eq "-quiet") { - $var = "quiet"; - $val = "yes"; + $var = "quiet"; + $val = "yes"; } elsif("$arg" eq "-base-dir") { # skip, it's been dealt with at the top of the file shift @ARGV; @@ -607,54 +607,54 @@ while ( @ARGV ) { #do something if(!$var || "$var" eq "show_help") { - print "Unknown option: $arg\n\n" if(!$var); - showUsage(); + print "Unknown option: $arg\n\n" if(!$var); + showUsage(); } elsif ("$var" eq "copy") { - if("$val" eq "yes") { - $copy_headers++; - } elsif($showonly) { - $copy_headers--; - } + if("$val" eq "yes") { + $copy_headers++; + } elsif($showonly) { + $copy_headers--; + } } elsif ("$var" eq "showonly") { - if("$val" eq "yes") { - $showonly++; - } elsif($showonly) { - $showonly--; - } + if("$val" eq "yes") { + $showonly++; + } elsif($showonly) { + $showonly--; + } } elsif ("$var" eq "quiet") { - if("$val" eq "yes") { - $quiet++; - } elsif($quiet) { - $quiet--; - } + if("$val" eq "yes") { + $quiet++; + } elsif($quiet) { + $quiet--; + } } elsif ("$var" eq "check-includes") { - if("$val" eq "yes") { - $check_includes++; - } elsif($check_includes) { - $check_includes--; - } + if("$val" eq "yes") { + $check_includes++; + } elsif($check_includes) { + $check_includes--; + } } elsif ("$var" eq "remove-stale") { - if("$val" eq "yes") { - $remove_stale++; - } elsif($remove_stale) { - $remove_stale--; - } + if("$val" eq "yes") { + $remove_stale++; + } elsif($remove_stale) { + $remove_stale--; + } } elsif ("$var" eq "windows") { - if("$val" eq "yes") { - $force_win++; - } elsif($force_win) { - $force_win--; - } + if("$val" eq "yes") { + $force_win++; + } elsif($force_win) { + $force_win--; + } } elsif ("$var" eq "relative") { - if("$val" eq "yes") { - $force_relative++; - } elsif($force_relative) { - $force_relative--; - } + if("$val" eq "yes") { + $force_relative++; + } elsif($force_relative) { + $force_relative--; + } } elsif ("$var" eq "module") { - print "module :$val:\n" unless $quiet; - die "No such module: $val" unless(defined $modules{$val}); - push @modules_to_sync, $val; + print "module :$val:\n" unless $quiet; + die "No such module: $val" unless(defined $modules{$val}); + push @modules_to_sync, $val; } elsif ("$var" eq "separate-module") { my ($module, $prodir, $headerdir) = split(/:/, $val); $modules{$module} = $prodir; @@ -663,16 +663,16 @@ while ( @ARGV ) { $create_uic_class_map = 0; $create_private_headers = 0; } elsif ("$var" eq "output") { - my $outdir = $val; - if(checkRelative($outdir)) { - $out_basedir = getcwd(); - chomp $out_basedir; - $out_basedir .= "/" . $outdir; - } else { - $out_basedir = $outdir; - } - # \ -> / - $out_basedir =~ s=\\=/=g; + my $outdir = $val; + if(checkRelative($outdir)) { + $out_basedir = getcwd(); + chomp $out_basedir; + $out_basedir .= "/" . $outdir; + } else { + $out_basedir = $outdir; + } + # \ -> / + $out_basedir =~ s=\\=/=g; } } @modules_to_sync = keys(%modules) if($#modules_to_sync == -1); @@ -681,6 +681,7 @@ $isunix = checkUnix; #cache checkUnix # create path mkpath "$out_basedir/include", !$quiet; +mkpath "$out_basedir/include/Qt", !$quiet; my @ignore_headers = (); my $class_lib_map_contents = ""; @@ -689,6 +690,7 @@ my @ignore_for_include_check = ( "qatomic.h" ); my @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" ); my @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" ); my @ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtSql}/drivers", "$modules{QtTest}", "$modules{QtDesigner}", "$modules{QtUiTools}", "$modules{QtDBus}", "$modules{phonon}" ); +my %colliding_headers = (); foreach (@modules_to_sync) { #iteration info @@ -708,77 +710,77 @@ foreach (@modules_to_sync) { #get dependencies if(-e "$dir/" . basename($dir) . ".pro") { - if(open(F, "<$dir/" . basename($dir) . ".pro")) { - while(<F>) { - my $line = $_; - chomp $line; - if($line =~ /^ *QT *\+?= *([^\r\n]*)/) { - foreach(split(/ /, "$1")) { - $master_contents .= "#include <QtCore/QtCore>\n" if("$_" eq "core"); - $master_contents .= "#include <QtGui/QtGui>\n" if("$_" eq "gui"); - $master_contents .= "#include <QtNetwork/QtNetwork>\n" if("$_" eq "network"); - $master_contents .= "#include <QtSvg/QtSvg>\n" if("$_" eq "svg"); - $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if("$_" eq "declarative"); - $master_contents .= "#include <QtScript/QtScript>\n" if("$_" eq "script"); - $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if("$_" eq "scripttools"); - $master_contents .= "#include <Qt3Support/Qt3Support>\n" if("$_" eq "qt3support"); - $master_contents .= "#include <QtSql/QtSql>\n" if("$_" eq "sql"); - $master_contents .= "#include <QtXml/QtXml>\n" if("$_" eq "xml"); - $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if("$_" eq "xmlpatterns"); - $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if("$_" eq "opengl"); - $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if("$_" eq "openvg"); - } - } - } - close(F); - } + if(open(F, "<$dir/" . basename($dir) . ".pro")) { + while(<F>) { + my $line = $_; + chomp $line; + if($line =~ /^ *QT *\+?= *([^\r\n]*)/) { + foreach(split(/ /, "$1")) { + $master_contents .= "#include <QtCore/QtCore>\n" if("$_" eq "core"); + $master_contents .= "#include <QtGui/QtGui>\n" if("$_" eq "gui"); + $master_contents .= "#include <QtNetwork/QtNetwork>\n" if("$_" eq "network"); + $master_contents .= "#include <QtSvg/QtSvg>\n" if("$_" eq "svg"); + $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if("$_" eq "declarative"); + $master_contents .= "#include <QtScript/QtScript>\n" if("$_" eq "script"); + $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if("$_" eq "scripttools"); + $master_contents .= "#include <Qt3Support/Qt3Support>\n" if("$_" eq "qt3support"); + $master_contents .= "#include <QtSql/QtSql>\n" if("$_" eq "sql"); + $master_contents .= "#include <QtXml/QtXml>\n" if("$_" eq "xml"); + $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if("$_" eq "xmlpatterns"); + $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if("$_" eq "opengl"); + $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if("$_" eq "openvg"); + } + } + } + close(F); + } } #remove the old files if($remove_stale) { - my @subdirs = ("$out_basedir/include/$lib"); - foreach (@subdirs) { - my $subdir = "$_"; - if (opendir DIR, "$subdir") { - while(my $t = readdir(DIR)) { - my $file = "$subdir/$t"; - if(-d "$file") { - push @subdirs, "$file" unless($t eq "." || $t eq ".."); - } else { - my @files = ("$file"); - #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t"); - foreach (@files) { - my $file = $_; - my $remove_file = 0; - if(open(F, "<$file")) { - while(<F>) { - my $line = $_; - chomp $line; - if($line =~ /^\#include \"([^\"]*)\"$/) { - my $include = $1; - $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/"); - $remove_file = 1 unless(-e "$include"); - } else { - $remove_file = 0; - last; - } - } - close(F); - unlink "$file" if($remove_file); - } - } - } - } - closedir DIR; + my @subdirs = ("$out_basedir/include/$lib"); + foreach (@subdirs) { + my $subdir = "$_"; + if (opendir DIR, "$subdir") { + while(my $t = readdir(DIR)) { + my $file = "$subdir/$t"; + if(-d "$file") { + push @subdirs, "$file" unless($t eq "." || $t eq ".."); + } else { + my @files = ("$file"); + #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t"); + foreach (@files) { + my $file = $_; + my $remove_file = 0; + if(open(F, "<$file")) { + while(<F>) { + my $line = $_; + chomp $line; + if($line =~ /^\#include \"([^\"]*)\"$/) { + my $include = $1; + $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/"); + $remove_file = 1 unless(-e "$include"); + } else { + $remove_file = 0; + last; + } + } + close(F); + unlink "$file" if($remove_file); + } + } + } + } + closedir DIR; } - } + } } #create the new ones foreach (split(/;/, $dir)) { - my $current_dir = "$_"; - my $headers_dir = $current_dir; + my $current_dir = "$_"; + my $headers_dir = $current_dir; $headers_dir .= "/$pathtoheaders" if ($pathtoheaders); #calc subdirs my @subdirs = ($headers_dir); @@ -787,7 +789,7 @@ foreach (@modules_to_sync) { opendir DIR, "$subdir" or next; while(my $t = readdir(DIR)) { push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") && - !($t eq "..") && !($t eq ".obj") && + !($t eq "..") && !($t eq ".obj") && !($t eq ".moc") && !($t eq ".rcc") && !($t eq ".uic") && !($t eq "build")); } @@ -805,85 +807,105 @@ foreach (@modules_to_sync) { $header = 0 if("$header" eq "$_"); } if($header) { - my $header_copies = 0; - #figure out if it is a public header - my $public_header = $header; - if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) { - $public_header = 0; - } else { - foreach (@ignore_for_master_contents) { - $public_header = 0 if("$header" eq "$_"); - } - } + my $header_copies = 0; + #figure out if it is a public header + my $public_header = $header; + if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) { + $public_header = 0; + } else { + foreach (@ignore_for_master_contents) { + $public_header = 0 if("$header" eq "$_"); + } + } my $iheader = $subdir . "/" . $header; - my @classes = $public_header ? classNames($iheader) : (); + my @classes = $public_header ? classNames($iheader) : (); if($showonly) { print "$header [$lib]\n"; - foreach(@classes) { - print "SYMBOL: $_\n"; - } + foreach(@classes) { + print "SYMBOL: $_\n"; + } } else { - #find out all the places it goes.. - my @headers; - if ($public_header) { - @headers = ( "$out_basedir/include/$lib/$header" ); - push @headers, "$out_basedir/include/Qt/$header" - if ("$lib" ne "phonon" && "$subdir" =~ /^$basedir\/src/); + #find out all the places it goes.. + my @headers; + if ($public_header) { + @headers = ( "$out_basedir/include/$lib/$header" ); + + # write forwarding headers to include/Qt + if ("$lib" ne "phonon" && "$subdir" =~ /^$basedir\/src/) { + my $file_name = "$out_basedir/include/Qt/$header"; + my $header_content = ''; + if (exists $colliding_headers{$file_name}) { + $file_name = ">>$file_name"; + } else { + $colliding_headers{$file_name} = 1; + $file_name = ">$file_name"; + my $warning_msg = 'Inclusion of header files from include/Qt is deprecated.'; + $header_content = "#ifndef QT_NO_QT_INCLUDE_WARN\n" . + " #if defined(__GNUC__)\n" . + " #pragma warning \"$warning_msg\"\n" . + " #elif defined(_MSC_VER)\n" . + " #pragma message \"WARNING: $warning_msg\"\n" . + " #endif\n". + "#endif\n\n"; + } + $header_content .= '#include "' . "../$lib/$header" . "\"\n"; + open HEADERFILE, $file_name; + print HEADERFILE $header_content; + close HEADERFILE; + } - foreach(@classes) { - my $header_base = basename($header); - my $class = $_; - # Strip namespaces: - $class =~ s/^.*:://; -# if ($class =~ m/::/) { -# class =~ s,::,/,g; -# } - $class_lib_map_contents .= "QT_CLASS_LIB($_, $lib, $header_base)\n"; - $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0)); + foreach(@classes) { + my $header_base = basename($header); + my $class = $_; + # Strip namespaces: + $class =~ s/^.*:://; +# if ($class =~ m/::/) { +# class =~ s,::,/,g; +# } + $class_lib_map_contents .= "QT_CLASS_LIB($_, $lib, $header_base)\n"; + $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0)); - # KDE-Compat headers for Phonon - if ($lib eq "phonon") { - $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0)); - } - } - } elsif ($create_private_headers) { - @headers = ( "$out_basedir/include/$lib/private/$header" ); - push @headers, "$out_basedir/include/Qt/private/$header" - if ("$lib" ne "phonon"); - } - foreach(@headers) { #sync them - $header_copies++ if(syncHeader($_, $iheader, $copy_headers)); - } + # KDE-Compat headers for Phonon + if ($lib eq "phonon") { + $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0)); + } + } + } elsif ($create_private_headers) { + @headers = ( "$out_basedir/include/$lib/private/$header" ); + } + foreach(@headers) { #sync them + $header_copies++ if(syncHeader($_, $iheader, $copy_headers)); + } - if($public_header) { - #put it into the master file - $master_contents .= "#include \"$public_header\"\n" if(shouldMasterInclude($iheader)); + if($public_header) { + #put it into the master file + $master_contents .= "#include \"$public_header\"\n" if(shouldMasterInclude($iheader)); - #deal with the install directives - if($public_header) { - my $pri_install_iheader = fixPaths($iheader, $current_dir); - foreach(@classes) { - my $class = $_; - # Strip namespaces: - $class =~ s/^.*:://; -# if ($class =~ m/::/) { -# $class =~ s,::,/,g; -# } - my $class_header = fixPaths("$out_basedir/include/$lib/$class", - $current_dir) . " "; - $pri_install_classes .= $class_header - unless($pri_install_classes =~ $class_header); - } - $pri_install_files.= "$pri_install_iheader ";; - } - } - else { - my $pri_install_iheader = fixPaths($iheader, $current_dir); - $pri_install_pfiles.= "$pri_install_iheader ";; - } + #deal with the install directives + if($public_header) { + my $pri_install_iheader = fixPaths($iheader, $current_dir); + foreach(@classes) { + my $class = $_; + # Strip namespaces: + $class =~ s/^.*:://; +# if ($class =~ m/::/) { +# $class =~ s,::,/,g; +# } + my $class_header = fixPaths("$out_basedir/include/$lib/$class", + $current_dir) . " "; + $pri_install_classes .= $class_header + unless($pri_install_classes =~ $class_header); + } + $pri_install_files.= "$pri_install_iheader ";; + } + } + else { + my $pri_install_iheader = fixPaths($iheader, $current_dir); + $pri_install_pfiles.= "$pri_install_iheader ";; + } } - print "header created for $iheader ($header_copies)\n" if($header_copies > 0 && !$quiet); + print "header created for $iheader ($header_copies)\n" if($header_copies > 0 && !$quiet); } } } @@ -894,8 +916,8 @@ foreach (@modules_to_sync) { unless($showonly) { my @master_includes; - push @master_includes, "$out_basedir/include/$lib/$lib"; - push @master_includes, "$out_basedir/include/phonon_compat/Phonon/Phonon" if ($lib eq "phonon"); + push @master_includes, "$out_basedir/include/$lib/$lib"; + push @master_includes, "$out_basedir/include/phonon_compat/Phonon/Phonon" if ($lib eq "phonon"); foreach my $master_include (@master_includes) { #generate the "master" include file my @tmp = split(/;/,$modules{$lib}); @@ -920,10 +942,10 @@ foreach (@modules_to_sync) { } #handle the headers.pri for each module - my $headers_pri_contents = ""; - $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n"; - $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n"; - $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n"; + my $headers_pri_contents = ""; + $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n"; + $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n"; + $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n"; my $headers_pri_file = "$out_basedir/include/$lib/headers.pri"; if(-e "$headers_pri_file") { open HEADERS_PRI_FILE, "<$headers_pri_file"; @@ -947,125 +969,125 @@ foreach (@modules_to_sync) { unless($showonly || !$create_uic_class_map) { my $class_lib_map = "$out_basedir/src/tools/uic/qclass_lib_map.h"; if(-e "$class_lib_map") { - open CLASS_LIB_MAP, "<$class_lib_map"; - local $/; - binmode CLASS_LIB_MAP; - my $old_class_lib_map_contents = <CLASS_LIB_MAP>; - close CLASS_LIB_MAP; - $old_class_lib_map_contents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms - $class_lib_map = 0 if($old_class_lib_map_contents eq $class_lib_map_contents); + open CLASS_LIB_MAP, "<$class_lib_map"; + local $/; + binmode CLASS_LIB_MAP; + my $old_class_lib_map_contents = <CLASS_LIB_MAP>; + close CLASS_LIB_MAP; + $old_class_lib_map_contents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms + $class_lib_map = 0 if($old_class_lib_map_contents eq $class_lib_map_contents); } if($class_lib_map) { - my $class_lib_map_dir = dirname($class_lib_map); - mkpath $class_lib_map_dir, !$quiet; - open CLASS_LIB_MAP, ">$class_lib_map"; - print CLASS_LIB_MAP "$class_lib_map_contents"; - close CLASS_LIB_MAP; + my $class_lib_map_dir = dirname($class_lib_map); + mkpath $class_lib_map_dir, !$quiet; + open CLASS_LIB_MAP, ">$class_lib_map"; + print CLASS_LIB_MAP "$class_lib_map_contents"; + close CLASS_LIB_MAP; } } if($check_includes) { for (keys(%modules)) { - #iteration info - my $lib = $_; - my $dir = "$modules{$lib}"; - foreach (split(/;/, $dir)) { - my $current_dir = "$_"; - #calc subdirs - my @subdirs = ($current_dir); - foreach (@subdirs) { - my $subdir = "$_"; - opendir DIR, "$subdir"; - while(my $t = readdir(DIR)) { + #iteration info + my $lib = $_; + my $dir = "$modules{$lib}"; + foreach (split(/;/, $dir)) { + my $current_dir = "$_"; + #calc subdirs + my @subdirs = ($current_dir); + foreach (@subdirs) { + my $subdir = "$_"; + opendir DIR, "$subdir"; + while(my $t = readdir(DIR)) { push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") && !($t eq "..") && !($t eq ".obj") && !($t eq ".moc") && !($t eq ".rcc") && !($t eq ".uic") && !($t eq "build")); - } - closedir DIR; - } + } + closedir DIR; + } - foreach (@subdirs) { - my $subdir = "$_"; + foreach (@subdirs) { + my $subdir = "$_"; my $header_skip_qt_module_test = 0; foreach(@ignore_for_qt_module_check) { foreach (split(/;/, $_)) { $header_skip_qt_module_test = 1 if ("$subdir" =~ /^$_/); } } - my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0); - foreach (@headers) { - my $header = "$_"; + my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0); + foreach (@headers) { + my $header = "$_"; my $header_skip_qt_begin_header_test = 0; my $header_skip_qt_begin_namespace_test = 0; - $header = 0 if("$header" =~ /^ui_.*.h/); - foreach (@ignore_headers) { - $header = 0 if("$header" eq "$_"); - } - if($header) { - my $public_header = $header; - if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) { - $public_header = 0; - } else { - foreach (@ignore_for_master_contents) { - $public_header = 0 if("$header" eq "$_"); - } - if($public_header) { - foreach (@ignore_for_include_check) { - $public_header = 0 if("$header" eq "$_"); - } + $header = 0 if("$header" =~ /^ui_.*.h/); + foreach (@ignore_headers) { + $header = 0 if("$header" eq "$_"); + } + if($header) { + my $public_header = $header; + if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) { + $public_header = 0; + } else { + foreach (@ignore_for_master_contents) { + $public_header = 0 if("$header" eq "$_"); + } + if($public_header) { + foreach (@ignore_for_include_check) { + $public_header = 0 if("$header" eq "$_"); + } foreach(@ignore_for_qt_begin_header_check) { $header_skip_qt_begin_header_test = 1 if ("$header" eq "$_"); } foreach(@ignore_for_qt_begin_namespace_check) { $header_skip_qt_begin_namespace_test = 1 if ("$header" eq "$_"); } - } - } + } + } - my $iheader = $subdir . "/" . $header; - if($public_header) { - if(open(F, "<$iheader")) { + my $iheader = $subdir . "/" . $header; + if($public_header) { + if(open(F, "<$iheader")) { my $qt_module_found = 0; - my $qt_begin_header_found = 0; - my $qt_end_header_found = 0; - my $qt_begin_namespace_found = 0; - my $qt_end_namespace_found = 0; - my $line; - while($line = <F>) { - chomp $line; - my $output_line = 1; + my $qt_begin_header_found = 0; + my $qt_end_header_found = 0; + my $qt_begin_namespace_found = 0; + my $qt_end_namespace_found = 0; + my $line; + while($line = <F>) { + chomp $line; + my $output_line = 1; if($line =~ /^ *\# *pragma (qt_no_included_check|qt_sync_stop_processing)/) { - last; - } elsif($line =~ /^ *\# *include/) { - my $include = $line; - if($line =~ /<.*>/) { - $include =~ s,.*<(.*)>.*,$1,; - } elsif($line =~ /".*"/) { - $include =~ s,.*"(.*)".*,$1,; - } else { - $include = 0; - } - if($include) { - for (keys(%modules)) { - my $trylib = $_; - if(-e "$out_basedir/include/$trylib/$include") { - print "WARNING: $iheader includes $include when it should include $trylib/$include\n"; - } - } - } - } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_BEGIN_HEADER\s*$/) { - $qt_begin_header_found = 1; - } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_END_HEADER\s*$/) { - $qt_end_header_found = 1; - } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_BEGIN_NAMESPACE\s*$/) { - $qt_begin_namespace_found = 1; - } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_END_NAMESPACE\s*$/) { - $qt_end_namespace_found = 1; + last; + } elsif($line =~ /^ *\# *include/) { + my $include = $line; + if($line =~ /<.*>/) { + $include =~ s,.*<(.*)>.*,$1,; + } elsif($line =~ /".*"/) { + $include =~ s,.*"(.*)".*,$1,; + } else { + $include = 0; + } + if($include) { + for (keys(%modules)) { + my $trylib = $_; + if(-e "$out_basedir/include/$trylib/$include") { + print "WARNING: $iheader includes $include when it should include $trylib/$include\n"; + } + } + } + } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_BEGIN_HEADER\s*$/) { + $qt_begin_header_found = 1; + } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_END_HEADER\s*$/) { + $qt_end_header_found = 1; + } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_BEGIN_NAMESPACE\s*$/) { + $qt_begin_namespace_found = 1; + } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_END_NAMESPACE\s*$/) { + $qt_end_namespace_found = 1; } elsif ($header_skip_qt_module_test == 0 and $line =~ /^QT_MODULE\(.*\)\s*$/) { $qt_module_found = 1; } - } + } if ($header_skip_qt_begin_header_test == 0) { if ($qt_begin_header_found == 0) { print "WARNING: $iheader does not include QT_BEGIN_HEADER\n"; @@ -1091,13 +1113,13 @@ if($check_includes) { print "WARNING: $iheader does not include QT_MODULE\n"; } } - close(F); - } - } - } - } - } - } + close(F); + } + } + } + } + } + } } } diff --git a/config.tests/unix/compile.test b/config.tests/unix/compile.test index 67a4636..99ebfd2 100755 --- a/config.tests/unix/compile.test +++ b/config.tests/unix/compile.test @@ -65,8 +65,10 @@ test -d "$OUTDIR/$TEST" || mkdir -p "$OUTDIR/$TEST" cd "$OUTDIR/$TEST" test -r Makefile && $MAKE distclean >/dev/null 2>&1 +# Make sure output from possible previous tests is gone +rm -f "$EXE" "${EXE}.exe" -"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile" +"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG-=debug_and_release" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile" if [ "$VERBOSE" = "yes" ]; then $MAKE @@ -74,7 +76,7 @@ else $MAKE >/dev/null 2>&1 fi -[ -x "$EXE" ] && SUCCESS=yes +( [ -x "$EXE" ] || [ -x "${EXE}.exe" ] ) && SUCCESS=yes # done if [ "$SUCCESS" != "yes" ]; then diff --git a/config.tests/unix/getaddrinfo/getaddrinfotest.cpp b/config.tests/unix/getaddrinfo/getaddrinfotest.cpp index 0c482cc..df6ae10 100644 --- a/config.tests/unix/getaddrinfo/getaddrinfotest.cpp +++ b/config.tests/unix/getaddrinfo/getaddrinfotest.cpp @@ -42,9 +42,16 @@ /* Sample program for configure to test for getaddrinfo on the unix platform. we check for all structures and functions required. */ +#include <stdio.h> +#include <stdlib.h> +#ifdef __MINGW32__ +#include <winsock2.h> +#include <ws2tcpip.h> +#else #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> +#endif int main() { diff --git a/config.tests/unix/iconv/iconv.pro b/config.tests/unix/iconv/iconv.pro index 8cdc776..d642da2 100644 --- a/config.tests/unix/iconv/iconv.pro +++ b/config.tests/unix/iconv/iconv.pro @@ -1,3 +1,3 @@ SOURCES = iconv.cpp CONFIG -= qt dylib app_bundle -mac:LIBS += -liconv +mac|win32-g++*:LIBS += -liconv diff --git a/config.tests/unix/ipv6/ipv6test.cpp b/config.tests/unix/ipv6/ipv6test.cpp index 4fb27f2..4243f2d 100644 --- a/config.tests/unix/ipv6/ipv6test.cpp +++ b/config.tests/unix/ipv6/ipv6test.cpp @@ -46,9 +46,14 @@ platforms. We check for the required IPv6 data structures. */ #define _HPUX_SOURCE #endif +#ifdef __MINGW32__ +#include <winsock2.h> +#include <ws2tcpip.h> +#else #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> +#endif int main() { diff --git a/config.tests/unix/odbc/odbc.cpp b/config.tests/unix/odbc/odbc.cpp index 32602c0..98f3571 100644 --- a/config.tests/unix/odbc/odbc.cpp +++ b/config.tests/unix/odbc/odbc.cpp @@ -39,6 +39,9 @@ ** ****************************************************************************/ +#ifdef __MINGW32__ +#include <windows.h> +#endif #include <sql.h> #include <sqlext.h> diff --git a/config.tests/unix/odbc/odbc.pro b/config.tests/unix/odbc/odbc.pro index c588ede..06a548f 100644 --- a/config.tests/unix/odbc/odbc.pro +++ b/config.tests/unix/odbc/odbc.pro @@ -1,4 +1,5 @@ SOURCES = odbc.cpp CONFIG -= qt dylib mac:CONFIG -= app_bundle -LIBS += -lodbc +win32-g++*:LIBS += -lodbc32 +else:LIBS += -lodbc diff --git a/config.tests/unix/psql/psql.pro b/config.tests/unix/psql/psql.pro index 64bb3d6..38bfb3e 100644 --- a/config.tests/unix/psql/psql.pro +++ b/config.tests/unix/psql/psql.pro @@ -1,4 +1,4 @@ SOURCES = psql.cpp CONFIG -= qt dylib mac:CONFIG -= app_bundle -LIBS += -lpq +LIBS *= -lpq diff --git a/config.tests/x11/opengl/opengl.pro b/config.tests/x11/opengl/opengl.pro index 432bd8d..5fd41d3 100644 --- a/config.tests/x11/opengl/opengl.pro +++ b/config.tests/x11/opengl/opengl.pro @@ -7,4 +7,5 @@ for(p, QMAKE_LIBDIR_OPENGL) { } CONFIG -= qt -LIBS += -lGL -lGLU +win32-g++*:LIBS += -lopengl32 +else:LIBS += -lGL -lGLU @@ -779,6 +779,7 @@ RPATH_FLAGS= l_FLAGS= QCONFIG_FLAGS= XPLATFORM= # This seems to be the QMAKESPEC, like "linux-g++" or "symbian/linux-gcce" +XPLATFORM_MINGW=no # Whether target platform is MinGW (win32-g++*) PLATFORM=$QMAKESPEC QT_CROSS_COMPILE=no OPT_CONFIRM_LICENSE=no @@ -1326,7 +1327,9 @@ while [ "$#" -gt 0 ]; do fi ;; arch) - if [ "$PLATFORM_MAC" = "yes" ]; then + # if this is a Mac then "windows" probably means + # we are cross-compiling for MinGW + if [ "$PLATFORM_MAC" = "yes" ] && [ "$VAL" != "windows" ]; then CFG_MAC_ARCHS="$CFG_MAC_ARCHS $VAL" else CFG_ARCH=$VAL @@ -1444,6 +1447,7 @@ while [ "$#" -gt 0 ]; do ;; xplatform) XPLATFORM="$VAL" + case `basename "$XPLATFORM"` in win32-g++*) XPLATFORM_MINGW=yes;; esac ;; debug-and-release) if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then @@ -2578,9 +2582,13 @@ if [ -z "$PLATFORM" ]; then " ;; SunOS:5*) - #PLATFORM=solaris-g++ - PLATFORM=solaris-cc - #PLATFORM=solaris-cc64 + if [ "$XPLATFORM_MINGW" = "yes" ]; then + PLATFORM="solaris-g++" + else + #PLATFORM=solaris-g++ + PLATFORM=solaris-cc + #PLATFORM=solaris-cc64 + fi PLATFORM_NOTES=" - Also available for Solaris: solaris-g++ solaris-cc-64 " @@ -2650,6 +2658,9 @@ else fi [ -z "$XPLATFORM" ] && XPLATFORM="$PLATFORM" + +case `basename "$XPLATFORM"` in win32-g++*) XPLATFORM_MINGW=yes;; esac + if [ -d "$PLATFORM" ]; then QMAKESPEC="$PLATFORM" else @@ -2922,6 +2933,8 @@ if [ "$PLATFORM" != "$XPLATFORM" -a "$CFG_EMBEDDED" != "no" ]; then CFG_ARCH="$CFG_EMBEDDED" ;; esac +elif [ "$XPLATFORM_MINGW" = "yes" ]; then + [ -z "$CFG_ARCH" ] && CFG_ARCH="windows" elif [ "$PLATFORM_MAC" = "yes" ] || [ -z "$CFG_ARCH" ]; then CFG_ARCH=$CFG_HOST_ARCH fi @@ -4087,6 +4100,8 @@ elif [ "$PLATFORM_MAC" = "yes" ]; then Platform="Qt for Mac OS X" elif echo "$XPLATFORM" | grep "symbian" > /dev/null ; then Platform="Qt for Symbian" +elif [ "$XPLATFORM_MINGW" = "yes" ]; then + Platform="Qt for Windows" elif [ '!' -z "`getQMakeConf \"$XQMAKESPEC\" | grep QMAKE_LIBS_X11 | awk '{print $3;}'`" ]; then PLATFORM_X11=yes Platform="Qt for Linux/X11" @@ -4668,7 +4683,7 @@ if [ "$CFG_IWMMXT" = "yes" ]; then fi # detect neon support -if ([ "$CFG_ARCH" = "arm" ] || [ "$CFG_ARCH" = "armv6" ]) && [ "${CFG_NEON}" = "auto" ]; then +if ( [ "$CFG_ARCH" = "arm" ] || [ "$CFG_ARCH" = "armv6" ] ) && [ "${CFG_NEON}" = "auto" ]; then if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/neon "neon" $L_FLAGS $I_FLAGS $l_FLAGS "-mfpu=neon"; then CFG_NEON=yes else @@ -4698,6 +4713,8 @@ if [ "$CFG_ZLIB" = "auto" ]; then fi fi +[ "$XPLATFORM_MINGW" = "yes" ] && QMakeVar add styles "windowsxp windowsvista" + case "$XPLATFORM" in *symbian*) QMakeVar set styles "windows s60" #overwrite previous default CFG_LIBFREETYPE=no @@ -4897,12 +4914,15 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do ;; psql) if [ "$CFG_SQL_psql" != "no" ]; then - if "$WHICH" pg_config >/dev/null 2>&1; then + # Be careful not to use native pg_config when cross building. + if [ "$XPLATFORM_MINGW" != "yes" ] && "$WHICH" pg_config >/dev/null 2>&1; then QT_CFLAGS_PSQL=`pg_config --includedir 2>/dev/null` QT_LFLAGS_PSQL=`pg_config --libdir 2>/dev/null` fi [ -z "$QT_CFLAGS_PSQL" ] || QT_CFLAGS_PSQL="-I$QT_CFLAGS_PSQL" [ -z "$QT_LFLAGS_PSQL" ] || QT_LFLAGS_PSQL="-L$QT_LFLAGS_PSQL" + # But, respect PSQL_LIBS if set + [ -z "$PSQL_LIBS" ] || QT_LFLAGS_PSQL="$PSQL_LIBS" if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/psql "PostgreSQL" $QT_LFLAGS_PSQL $L_FLAGS $QT_CFLAGS_PSQL $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then if [ "$CFG_SQL_psql" = "auto" ]; then CFG_SQL_psql=plugin @@ -4924,7 +4944,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do ;; odbc) if [ "$CFG_SQL_odbc" != "no" ]; then - if [ "$PLATFORM_MAC" != "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 ( [ "$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 [ "$CFG_SQL_odbc" = "auto" ]; then CFG_SQL_odbc=plugin fi @@ -5190,6 +5210,7 @@ if [ "$PLATFORM_MAC" = "yes" -a ! -z "$QT_NAMESPACE" ]; then QT_NAMESPACE_MAC_CRC=`"$mactests/crc.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/mac/crc $QT_NAMESPACE $L_FLAGS $I_FLAGS $l_FLAGS` fi +# X11/QWS if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then # auto-detect Glib support @@ -5354,7 +5375,7 @@ if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then fi fi # X11/QWS -# x11 +# X11 if [ "$PLATFORM_X11" = "yes" ]; then x11tests="$relpath/config.tests/x11" X11TESTS_FLAGS= @@ -5375,7 +5396,10 @@ if [ "$PLATFORM_X11" = "yes" ]; then echo " QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in ${XQMAKESPEC}." exit 1 fi +fi +# X11/MINGW OpenGL +if [ "$PLATFORM_X11" = "yes" -o "$XPLATFORM_MINGW" = "yes" ]; then # auto-detect OpenGL support (es1 = OpenGL ES 1.x Common, es2 = OpenGL ES 2.x) if [ "$CFG_GUI" = "no" ]; then if [ "$CFG_OPENGL" = "auto" ]; then @@ -5471,7 +5495,10 @@ if [ "$PLATFORM_X11" = "yes" ]; then echo "OpenGL Graphics System is disabled due to missing OpenGL support..." CFG_GRAPHICS_SYSTEM=default fi +fi # X11/MINGW OpenGL +# X11 +if [ "$PLATFORM_X11" = "yes" ]; then # auto-detect Xcursor support if [ "$CFG_XCURSOR" != "no" ]; then if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/xcursor "Xcursor" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then @@ -5834,14 +5861,12 @@ if [ "$PLATFORM_QWS" = "yes" ]; then fi if [ "${screen}" = "directfb" ] && [ "${CFG_CONFIGURE_EXIT_ON_ERROR}" = "yes" ]; then - if [ -n "$PKG_CONFIG" ]; then - if $PKG_CONFIG --exists directfb 2>/dev/null; then - QT_CFLAGS_DIRECTFB=`$PKG_CONFIG --cflags directfb 2>/dev/null` - QT_LIBS_DIRECTFB=`$PKG_CONFIG --libs directfb 2>/dev/null` - elif directfb-config --version >/dev/null 2>&1; then - QT_CFLAGS_DIRECTFB=`directfb-config --cflags 2>/dev/null` - QT_LIBS_DIRECTFB=`directfb-config --libs 2>/dev/null` - fi + if test -n "$PKG_CONFIG" && "$PKG_CONFIG" --exists directfb 2>/dev/null; then + QT_CFLAGS_DIRECTFB=`$PKG_CONFIG --cflags directfb 2>/dev/null` + QT_LIBS_DIRECTFB=`$PKG_CONFIG --libs directfb 2>/dev/null` + elif directfb-config --version >/dev/null 2>&1; then + QT_CFLAGS_DIRECTFB=`directfb-config --cflags 2>/dev/null` + QT_LIBS_DIRECTFB=`directfb-config --libs 2>/dev/null` fi # QMake variables set here override those in the mkspec. Therefore we only set the variables here if they are not zero. @@ -5919,9 +5944,12 @@ if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then fi fi +[ "$XPLATFORM_MINGW" = "yes" ] && [ "$CFG_PHONON" != "no" ] && CFG_PHONON="yes" + # 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 CFG_LIBFREETYPE=system @@ -5931,7 +5959,9 @@ if [ "$CFG_LIBFREETYPE" = "auto" ]; then fi if [ "$CFG_ENDIAN" = "auto" ]; then - if [ "$PLATFORM_MAC" = "yes" ]; then + if [ "$XPLATFORM_MINGW" = "yes" ]; then + CFG_ENDIAN="Q_LITTLE_ENDIAN" + elif [ "$PLATFORM_MAC" = "yes" ]; then true #leave as auto elif [ "$XPLATFORM" = "symbian-sbsv2" ]; then CFG_ENDIAN="Q_LITTLE_ENDIAN" @@ -6257,6 +6287,11 @@ if [ "$CFG_AUDIO_BACKEND" = "auto" ]; then fi fi +if [ "$CFG_LARGEFILE" != "yes" ] && [ "$XPLATFORM_MINGW" = "yes" ]; then + echo "Warning: largefile support cannot be disabled for win32." + CFG_LARGEFILE="yes" +fi + #------------------------------------------------------------------------------- # ask for all that hasn't been auto-detected or specified in the arguments #------------------------------------------------------------------------------- @@ -6359,6 +6394,9 @@ if [ "$PLATFORM_MAC" = "yes" ]; then fi fi +# but disable Cocoa if cross-building for mingw +[ "$XPLATFORM_MINGW" = "yes" ] && CFG_MAC_COCOA="no" + # set the global Mac deployment target. This is overridden on an arch-by-arch basis # in some cases, see code further down case "$PLATFORM,$CFG_MAC_COCOA" in @@ -6497,7 +6535,7 @@ QMakeVar set OBJECTS_DIR ".obj/$QMAKE_OUTDIR" QMakeVar set MOC_DIR ".moc/$QMAKE_OUTDIR" QMakeVar set RCC_DIR ".rcc/$QMAKE_OUTDIR" QMakeVar set UI_DIR ".uic/$QMAKE_OUTDIR" -if [ "$CFG_LARGEFILE" = "yes" ]; then +if [ "$CFG_LARGEFILE" = "yes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then QMAKE_CONFIG="$QMAKE_CONFIG largefile" fi if [ "$CFG_STL" = "no" ]; then @@ -6613,7 +6651,7 @@ else fi -if [ "x$PLATFORM_MAC" = "xyes" ] && [ "$XPLATFORM" != "win32-g++" ]; then +if [ "x$PLATFORM_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" @@ -6752,6 +6790,12 @@ if [ "$CFG_EXCEPTIONS" != "no" ]; then QTCONFIG_CONFIG="$QTCONFIG_CONFIG exceptions" fi +if [ "$XPLATFORM_MINGW" = "yes" ]; then + # mkspecs/features/win32/default_pre.prf sets "no-rtti". + # Follow default behavior of configure.exe by overriding with "rtti". + QTCONFIG_CONFIG="$QTCONFIG_CONFIG rtti" +fi + if [ "$CFG_ALSA" = "yes" ]; then QT_CONFIG="$QT_CONFIG alsa" fi @@ -7345,7 +7389,7 @@ EOF echo '/* Compile time features */' >>"$outpath/src/corelib/global/qconfig.h.new" [ '!' -z "$LicenseKeyExt" ] && echo "#define QT_PRODUCT_LICENSEKEY \"$LicenseKeyExt\"" >>"$outpath/src/corelib/global/qconfig.h.new" -if [ "$CFG_LARGEFILE" = "yes" ]; then +if [ "$CFG_LARGEFILE" = "yes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then echo "#define QT_LARGEFILE_SUPPORT 64" >>"$outpath/src/corelib/global/qconfig.h.new" fi @@ -7690,7 +7734,7 @@ QMAKE_LIBDIR_QT = \$\$QT_BUILD_TREE/lib EOF # Ensure we can link to uninistalled libraries -if linkerSupportsFlag -rpath-link "$outpath/lib"; then +if [ "$XPLATFORM_MINGW" != "yes" ] && linkerSupportsFlag -rpath-link "$outpath/lib"; then echo "QMAKE_LFLAGS += -Wl,-rpath-link,\$\$QT_BUILD_TREE/lib" >> "$CACHEFILE.tmp" fi @@ -8228,7 +8272,9 @@ for file in .projects .projects.3; do [ "$IN_ROOT" = "no" ] && continue case $a in - *winmain/winmain.pro) continue ;; + *winmain/winmain.pro) + [ "$XPLATFORM_MINGW" = "yes" ] || continue + SPEC=$XQMAKESPEC ;; *s60main/s60main.pro) continue ;; *examples/activeqt/*) continue ;; */qmake/qmake.pro) continue ;; diff --git a/demos/spectrum/app/mainwidget.h b/demos/spectrum/app/mainwidget.h index b3dc352..ddab8b7 100644 --- a/demos/spectrum/app/mainwidget.h +++ b/demos/spectrum/app/mainwidget.h @@ -59,7 +59,6 @@ QT_FORWARD_DECLARE_CLASS(QLabel) QT_FORWARD_DECLARE_CLASS(QPushButton) QT_FORWARD_DECLARE_CLASS(QMenu) QT_FORWARD_DECLARE_CLASS(QAction) -QT_END_NAMESPACE /** * Main application widget, responsible for connecting the various UI diff --git a/dist/changes-4.6.4 b/dist/changes-4.6.4 new file mode 100644 index 0000000..381023f --- /dev/null +++ b/dist/changes-4.6.4 @@ -0,0 +1,158 @@ +Qt 4.6.4 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 4.6.0. For more details, +refer to the online documentation included in this distribution. The +documentation is also available online: + + http://qt.nokia.com/doc/4.6 + +The Qt version 4.6 series is binary compatible with the 4.5.x series. +Applications compiled for 4.5 will continue to run with 4.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker or the Merge Request queue +of the public source repository. + +Qt Bug Tracker: http://bugreports.qt.nokia.com +Merge Request: http://qt.gitorious.org + +**************************************************************************** +* General * +**************************************************************************** + +New features +------------ + + - SomeClass, SomeOtherClass + * New classes for foo, bar and baz + +Optimizations +------------- + + - Optimized foo in QSomeClass + * See list of Important Behavior Changes below + + +**************************************************************************** +* Library * +**************************************************************************** + +QtCore +------ + + - foo + * bar + +QtGui +----- + + - foo + * bar + +QtDBus +------ + + - foo + * bar + +QtNetwork +--------- + + - foo + * bar + +QtOpenGL +-------- + + - foo + * bar + +QtScript +-------- + + - foo + * bar + +QtSql +----- + + - foo + * bar + +QtXml +----- + + - foo + * bar + +Qt Plugins +---------- + + - foo + * bar + +Third party components +---------------------- + + - Updated foo to version 2.3.9. + + - Updated bar to the latest version from baz.org. + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Qt for Unix (X11 and Mac OS X) +------------------------------ + + - + +Qt for Linux/X11 +---------------- + + - + +Qt for Windows +-------------- + + - + +Qt for Mac OS X +--------------- + + - + +Qt for Embedded Linux +--------------------- + + - + +DirectFB +-------- + + - + +Qt for Windows CE +----------------- + + - + +**************************************************************************** +* Tools * +**************************************************************************** + + - Designer + * foo + + - qdoc3 + * bar + + - Linguist + * baz + +**************************************************************************** +* Important Behavior Changes * +**************************************************************************** + + - + diff --git a/doc/doc.pri b/doc/doc.pri index 3180a61..f748f3d 100644 --- a/doc/doc.pri +++ b/doc/doc.pri @@ -5,9 +5,9 @@ DOCS_GENERATION_DEFINES = GENERATOR = $$QT_BUILD_TREE/bin/qhelpgenerator -win32:!win32-g++ { +win32:!win32-g++* { unixstyle = false -} else :win32-g++:isEmpty(QMAKE_SH) { +} else :win32-g++*:isEmpty(QMAKE_SH) { unixstyle = false } else { unixstyle = true @@ -36,9 +36,15 @@ QT_ZH_CN_DOCUMENTATION = ($$QDOC qt-api-only_zh_CN.qdocconf) && \ $$GENERATOR doc-build/html-qt_zh_CN/qt.qhp -o doc/qch/qt_zh_CN.qch \ ) -win32-g++:isEmpty(QMAKE_SH) { +QT_JA_JP_DOCUMENTATION = ($$QDOC qt-api-only_ja_JP.qdocconf) && \ + (cd $$QT_BUILD_TREE && \ + $$GENERATOR doc-build/html-qt_ja_JP/qt.qhp -o doc/qch/qt_ja_JP.qch \ + ) + +win32-g++*:isEmpty(QMAKE_SH) { QT_DOCUMENTATION = $$replace(QT_DOCUMENTATION, "/", "\\\\") QT_ZH_CN_DOCUMENTATION = $$replace(QT_ZH_CN_DOCUMENTATION, "/", "\\\\") + QT_JA_JP_DOCUMENTATION = $$replace(QT_JA_JP_DOCUMENTATION, "/", "\\\\") } # Build rules: @@ -52,6 +58,9 @@ docs.depends = sub-qdoc3 adp_docs qch_docs docs_zh_CN.depends = docs docs_zh_CN.commands = $$QT_ZH_CN_DOCUMENTATION +docs_ja_JP.depends = docs +docs_ja_JP.commands = $$QT_JA_JP_DOCUMENTATION + # Install rules htmldocs.files = $$QT_BUILD_TREE/doc/html htmldocs.path = $$[QT_INSTALL_DOCS] @@ -67,5 +76,5 @@ docimages.path = $$[QT_INSTALL_DOCS]/src sub-qdoc3.depends = sub-corelib sub-xml sub-qdoc3.commands += (cd tools/qdoc3 && $(MAKE)) -QMAKE_EXTRA_TARGETS += sub-qdoc3 adp_docs qch_docs docs docs_zh_CN +QMAKE_EXTRA_TARGETS += sub-qdoc3 adp_docs qch_docs docs docs_zh_CN docs_ja_JP INSTALLS += htmldocs qchdocs docimages diff --git a/doc/src/declarative/qdeclarativedebugging.qdoc b/doc/src/declarative/qdeclarativedebugging.qdoc index 4ff7fde..99dd2d2 100644 --- a/doc/src/declarative/qdeclarativedebugging.qdoc +++ b/doc/src/declarative/qdeclarativedebugging.qdoc @@ -60,8 +60,35 @@ Rectangle { \section1 Debugging Transitions When a transition doesn't look quite right, it can be helpful to view it in slow -motion to see what is happening more clearly. The \l {Qt Declarative UI Runtime}{qml} tool provides a -"Slow Down Animations" menu option to facilitate this. +motion to see what is happening more clearly. This functionality is supported +in the \l {Qt Declarative UI Runtime}{qmlviewer} tool: to enable this, +click on the "Debugging" menu, then "Slow Down Animations". + + +\section1 Debugging module imports + +The \c QML_IMPORT_TRACE environment variable can be set to enable debug output +from QML's import loading mechanisms. + +For example, for a simple QML file like this: + +\qml +import Qt 4.7 + +Rectangle { width: 100; height: 100 } +\endqml + +If you set \c {QML_IMPORT_TRACE=1} before running the \l {Qt Declarative UI Runtime}{qmlviewer} +(or your QML C++ application), you will see output similar to this: + +\code +QDeclarativeImportDatabase::addImportPath "/qt-sdk/imports" +QDeclarativeImportDatabase::addImportPath "/qt-sdk/bin/QMLViewer.app/Contents/MacOS" +QDeclarativeImportDatabase::addToImport 0x106237370 "." -1.-1 File as "" +QDeclarativeImportDatabase::addToImport 0x106237370 "Qt" 4.7 Library as "" +QDeclarativeImportDatabase::resolveType "Rectangle" = "QDeclarativeRectangle" +\endcode + \section1 Debugging with Qt Creator diff --git a/doc/src/ja_JP/development/designer-manual.qdoc b/doc/src/ja_JP/development/designer-manual.qdoc new file mode 100644 index 0000000..585af16 --- /dev/null +++ b/doc/src/ja_JP/development/designer-manual.qdoc @@ -0,0 +1,175 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page designer-quick-start.html + + \title Qt Designer クイックガイド + + \QD を使うための基本的な手順は、以下の\bold{四つ}です。 + + \list 1 + \o フォームとオブジェクトを選択する + \o フォームにオブジェクトを配置する + \o スロットにシグナルを接続する + \o フォームをプレビューする + \endlist + + \image rgbController-screenshot.png + + Red、Green、Blue(RGB)の値を操作するために必要なコントロールを含む + 小さなウィジェット(上記スクリーンショット参照)を設計する場合を想定します。 + このウィジェットは、画像処理プログラム内のどこからでも表示できるウィジェットです。 + + \table + \row + \i \inlineimage designer-choosing-form.png + \i \bold{フォームを選択する} + + \gui{新しいフォーム} ダイアログから \gui Widget を選択して開始します。 + \endtable + + + \table + \row + \i \inlineimage rgbController-arrangement.png + \i \bold{フォームにウィジェットを配置する} + + 3つのラベル(Label)、スピンボックス(Spin Box)、垂直方向のスライダ(Vertical Slider)をフォーム上へドラッグします。 + ラベルの既定の文字列を変更するには、文字列をダブルクリックします。 + 希望するレイアウトに合わせて配置します。 + \endtable + + 画像のようにこれらのウィジェットを配置するには、 + レイアウトにウィジェットを配置する必要があります。 + これを3つグループに対して行います。 + まず "RED" ラベルを選択します。 + 次に、\key Ctrl (Mac OS X では \key Command)キーを押したまま、対応するスピンボックスとスライダを選択します。 + \gui{フォーム} メニューで、\gui{格子状に並べる}を選択します。 + + \table + \row + \i \inlineimage rgbController-form-gridLayout.png + \i \inlineimage rgbController-selectForLayout.png + \endtable + + 他の2つのラベルに対しても、対応するスピンボックスとスライダごとにこの手順を繰り返します。 + + 次の手順は、これら3つのレイアウトを組み合わせて、1つの\bold{メインレイアウト}を作成することです。 + メインレイアウトとは、トップレベルウィジェット(この場合は QWidget)のレイアウトです。 + トップレベルウィジェットにレイアウトを配置することは重要です。 + そうでなければ、ウィンドウをサイズ変更したときにウィンドウ上のウィジェットのサイズが変更されません。 + レイアウトを設定するには、フォーム上の3つのレイアウト以外の任意の場所で\gui{右クリック}し、\gui{水平に並べる}を選択します。 + または、\gui{格子状に並べる}を選択することもできます。 + そのどちらでも同じ配置(以下を参照)で表示されます。 + + \image rgbController-final-layout.png + + \note メインレイアウトはフォームに表示できません。 + メインレイアウトがインストールされているかどうかを確認するには、 + フォームをサイズ変更してみます。 + インストールされている場合は、各ウィジェットのサイズが適宜変更されます。 + または、\QD の \gui{Object Inspector} で確認することもできます。 + トップレベルウィジェットにレイアウトが配置されていない場合、 + その横に崩れたレイアウトのアイコン \inlineimage rgbController-no-toplevel-layout.png + が表示されます。 + + スライダをクリックして特定の値までドラッグするときに、 + スピンボックスにスライダの位置を反映させます。 + この操作を行うには、スライダの \l{QAbstractSlider::}{valueChanged()} + シグナルをスピンボックスの \l{QSpinBox::}{setValue()} + スロットに接続する必要があります。 + また、逆方向、すなわちスピンボックスの \l{QSpinBox::}{valueChanged()} + シグナルをスライダの \l{QAbstractSlider::value()}{setValue()} スロットに接続する必要があります。 + + この操作を行うには、\key{F4} キーを押すか、\gui{編集|シグナル/スロットの編集} を選択し、 + \gui{シグナル/スロットの編集}モードに切り替える必要があります。 + + \table + \row + \i \inlineimage rgbController-signalsAndSlots.png + \i \bold{シグナルをスロットに接続する} + + スライダをクリックし、カーソルをスピンボックスまでドラッグします。 + 以下のような \gui{シグナルスロットを設定} ダイアログがポップアップ表示されます。 + 適切なシグナルとスロットを選択し、\gui OK をクリックします。 + \endtable + + \image rgbController-configure-connection1.png + + 手順を(逆の順序で)繰り返し、 + スピンボックスをクリックしてカーソルをスライダまでドラッグし、 + スピンボックスの \l{QSpinBox::}{valueChanged()} シグナルを、 + スライダの \l{QAbstractSlider::value()}{setValue()} スロットに接続します。 + + 以下のスクリーンショットは、適切なシグナルとスロットを選択するためのガイドとして利用できます。 + + \image rgbController-configure-connection2.png + + RGBコントローラーの "RED" コンポーネントのオブジェクトが正常に接続されたので、 + "GREEN" および "BLUE" コンポーネントにも同じ手順を繰り返します。 + + RGB値の範囲は 0 ~ 255 であるため、 + スピンボックスとスライダを特定の範囲に制限する必要があります。 + + \table + \row + \i \inlineimage rgbController-property-editing.png + \i \bold{ウィジェットのプロパティを設定する} + + 最初のスピンボックスをクリックします。 + \gui{プロパティエディタ}に \l{QSpinBox} のプロパティが表示されます。 + \l{QSpinBox::}{maximum} のプロパティに、"255" と入力します。 + 次に、最初の垂直方向のスライダをクリックすると、 + \l{QAbstractSlider} のプロパティが表示されます。 + \l{QAbstractSlider::}{maximum} のプロパティにも、"255" と入力します。 + 残りのスピンボックスとスライダに対しても、この処理を繰り返します。 + \endtable + + ここで、フォームをプレビューし、アプリケーションの外観を確認します。 + この操作を行うには、\key{Ctrl + R} を押すか、 + \gui{フォーム}メニューから\gui{プレビュー}を選択します。 + スライダをドラッグすると、 + スピンボックスにその値が反映されます(逆の場合も同じ)。 + またサイズを変更し、子ウィジェットの管理に使用するレイアウトが + どのようにウィンドウのさまざまなサイズに対応しているか確認します。 +*/ + diff --git a/doc/src/ja_JP/development/qmake-manual.qdoc b/doc/src/ja_JP/development/qmake-manual.qdoc new file mode 100644 index 0000000..8c9297f --- /dev/null +++ b/doc/src/ja_JP/development/qmake-manual.qdoc @@ -0,0 +1,212 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qmake-tutorial.html + \title qmake チュートリアル + + このチュートリアルでは \c qmake の使い方を説明します。 + このチュートリアルを読み終わったら \c qmake + のユーザガイドを読むことをお勧めします。 + + \section1 簡単な例 + + アプリケーションの基本的な実装は既に完了していて、 + 次のファイルが作成されていると仮定します。 + + \list + \o hello.cpp + \o hello.h + \o main.cpp + \endlist + + これらのファイルは Qt ディストリビューションの + \c{examples/qmake/tutorial} ディレクトリにあります。 + アプリケーションの設定について知っておくべきことは、 + それが Qt で書かれているということだけです。 + まず、テキストエディタで \c{examples/qmake/tutorial} に + \c hello.pro というファイルを作成します。 + 最初にすることは、開発プロジェクトに含まれるソースファイルとヘッダファイルを + \c qmake に教える行を追加することです。 + + ソースファイルをプロジェクトファイルに追加します。 + これには \l{qmake Variable Reference#SOURCES}{SOURCES} 変数を使います。 + 新しい行を作り、\c{SOURCES +=}、続いて hello.cpp を入力します。 + つまり、以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 108 + + これを以下のようになるまでプロジェクトの各ソースファイルに対して行います: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 109 + + make に似たシンタックスを使いたい場合は、 + 以下のように改行をエスケープしてすべてのファイルを 1 行に書きます: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 110 + + ソースファイルの一覧をプロジェクトファイルに追加しました。 + 次にヘッダファイルを追加します。 + ヘッダファイルはソースファイルと全く同じ方法で追加することができます。 + ただし変数は \l{qmake Variable Reference#HEADERS}{HEADERS} + を使います。 + + これを終えると、プロジェクトファイルは以下のようになるでしょう: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 111 + + ターゲットの名前は自動的に設定され、 + プロジェクトファイルと同じ名前になります。 + ただしプラットフォームに合わせたサフィックスがつけられます。 + 例えば、プロジェクトファイルが \c hello.pro である場合、 + ターゲットは Windows では \c hello.exe 、Unix では \c hello になります。 + プロジェクトファイルで別の名前を指定することもできます: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 112 + + 最後に \l{qmake Variable Reference#CONFIG}{CONFIG} 変数を設定します。 + このアプリケーションは Qt アプリケーションなので \c CONFIG に + \c qt を追加する必要があります。 + \c qmake は リンクの必要があるライブラリを追加し、 + \c moc と \c uic の実行コマンドが Makefile に含まれるようにします。 + + 最終的なプロジェクトファイルは以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 113 + + \c qmake を使って、このアプリケーションのための Makefile を生成します。 + プロジェクトのディレクトリでコマンドラインに次のように入力します: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 114 + + そして、使用するコンパイラによって \c make または \c nmake を入力します。 + + Visual Studio ユーザの場合、\c qmake は、以下のように + \c .dsp ファイルまたは \c .vcproj ファイルも作成できます: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 115 + + \section1 アプリケーションをデバッグできるようにする + + アプリケーションのリリースバージョンはデバッグシンボルなどのデバッグ情報を含みません。 + 開発中は、関連情報を含むアプリケーションのデバッグバージョンを作成するのが便利です。 + これは、プロジェクトファイルの \c CONFIG 変数に \c debug + を追加することで簡単に実現できます。 + + たとえば: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 116 + + 直前の例と同様に、Makefile を生成するには \c qmake を使います。 + アプリケーションをデバッグ環境で実行する際に役に立つ情報を得られるようになります。 + + \section1 プラットフォーム固有のソースファイルを追加する + + 数時間コーディングをしていると、 + アプリケーションにプラットフォーム固有な部分が出てきて + プラットフォーム固有のコードを別のファイルに分けたい場合があるかもしれません。 + ここでは 2 つのファイル \c hellowin.cpp と \c hellounix.cpp があるとして、 + これをプロジェクトファイルに追加します。 + これらのファイルをそのまま \c SOURCES 変数に追加することはできません。 + なぜなら、両方のファイルが Makefile に追加されてしまうからです。 + \c qmake が実行されたプラットフォームにしたがって処理されるスコープを使う必要があります。 + + Windows 用のファイルを追加するシンプルなスコープは以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 117 + + \c qmake が Windows 上で実行されると、ソースファイルのリストに + \c hellowin.cpp が追加されます。 + \c qmake が他のプラットフォームで実行された場合、この部分は無視されます。 + 次に Unix 用ファイルのスコープを作成します。 + + これを終えると、プロジェクトファイルは以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 118 + + これまでと同様に、Makefile を生成するには \c qmake を使います。 + + \section1 ファイルが存在しない場合に qmake を中止する + + 特定のファイルが存在しない場合に Makefile を作成したくない場合、 + exists() 関数を使ってファイルが存在するかどうかを確認することができます。 + また error() 関数を使って \c qmake の処理を中止させることができます。 + これらの関数はスコープとして動作します。 + 使い方はスコープの条件をこれらの関数で置き換えるだけです。 + \c main.cpp ファイルの確認は以下のようになります : + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 119 + + 記号 \c{!} はテストを否定します。 + つまり \c{exists( main.cpp )} はファイルが存在する場合に真になり、 + \c{!exists( main.cpp )} はファイルが存在しない場合に真になります。 + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 120 + + 前と同様に、\c qmake を実行して Makefile を生成します。 + 仮に \c main.cpp の名前を変更すると、上記のメッセージが表示され、 + \c qmake は処理を中止します。 + + \section1 複数の条件をチェックする + + Windows を使っていて、 + コマンドラインからこのアプリケーションを実行したときに + qDebug() の出力を見ることができるようにしたい場合、 + アプリケーションをコンソールの設定を追加してビルドする必要があります。 + Windows で Makefile をこの設定にするには、 + \c CONFIG に \c console を追加します。 + Windows で実行されていて、\e{かつ} \c CONFIG にすでに \c debug + がある場合にのみ \c CONFIG を追加したい場合があるかもしれません。 + このような場合、2 つのスコープをネストさせて使います。 + まず 1 つのスコープを作成し、その中にもう 1 つスコープを作成します。 + そして 2 つのスコープの中に設定を書きます。例えば: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 121 + + ネストされたスコープはコロンを使ってつなぐことができます。 + 最終的なプロジェクトファイルは以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 122 + + 以上です。\c qmake のチュートリアルが終了しました。 + それでは、あなたの開発プロジェクトのプロジェクトファイルを作成してみましょう。 +*/ + diff --git a/doc/src/ja_JP/development/qtestlib.qdoc b/doc/src/ja_JP/development/qtestlib.qdoc new file mode 100644 index 0000000..65c4c3f --- /dev/null +++ b/doc/src/ja_JP/development/qtestlib.qdoc @@ -0,0 +1,432 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qtestlib-tutorial.html + \brief QTestLib を使ったテストの導入ガイド + \contentspage QTestLib マニュアル + \nextpage {第1章: ユニットテストの作成}{第1章} + + \title QTestLib チュートリアル + + このチュートリアルでは QTestLib フレームワークの機能の初歩的な使い方を説明します。 + このチュートリアルは全5章で構成されています: + + \list 1 + \o \l {第1章: ユニットテストの作成}{ユニットテストの作成} + \o \l {第2章: データドリブンテスト}{データドリブンテスト} + \o \l {第3章: GUI イベントのシミュレート}{GUI イベントのシミュレート} + \o \l {第4章: GUI イベントの再現}{GUI イベントの再現} + \o \l {第5章: ベンチマークの作成}{ベンチマークの作成} + \endlist + +*/ + + +/*! + \example qtestlib/tutorial1 + + \contentspage {QTestLib チュートリアル}{目次} + \nextpage {第2章: データドリブンテスト}{第2章} + + \title 第1章: ユニットテストの作成 + + 第1章では、クラスのテストを行うシンプルなユニットテストを作成して実行する方法を説明します。 + + \section1 テストを作成する + + QString クラスの挙動をテストすると仮定しましょう。 + まず、テスト関数を含むクラスが必要です。 + このクラスは、 QObject を継承する必要があります: + + \snippet examples/qtestlib/tutorial1/testqstring.cpp 0 + + QTest ヘッダーを include してください。 + それから、テストフレームワークがテスト関数を検索して実行できるよう、 + テスト関数を private slot として宣言する必要があります。 + + 次に、テスト関数を実装します。実装は以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 8 + + \l QVERIFY() マクロは、引数として渡される式を評価します。 + 式が真と評価されるとテスト関数の実行が継続されます。 + そうでなければ、エラーメッセージがテストログに追加されテスト関数の実行が停止します。 + + テストログに詳細情報を追加したい場合は、 + \l QCOMPARE() マクロを代わりに使用してください: + + \snippet examples/qtestlib/tutorial1/testqstring.cpp 1 + + 文字列が等しくない場合、両方の文字列の内容がテストログに追加され、 + 比較に失敗した理由を直ちに確認できます。 + + 最後に、テストケースを実行可能にするために以下の2行が必要となります: + + \snippet examples/qtestlib/tutorial1/testqstring.cpp 2 + + \l QTEST_MAIN() マクロは、すべてのテスト関数を実行するシンプルな + \c main() 関数に展開されます。 + テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、 + Qt のメタオブジェクト機能を動作させるために、 + 生成された moc ファイルを include する必要があります。 + + \section1 テストを実行する + + 作成したテストを実行してみましょう。 + テストが \c testqstring.cpp + として空のディレクトリに保存されていると仮定して、 + qmake を使用してプロジェクトを作成し、makefile を生成します。 + + \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 9 + + \bold {注:} Windows をお使いの場合、 \c make を \c nmake または、 + 任意のビルドツールに置き換えてください。 + + 作成した実行ファイルを実行すると、次の出力が表示されます: + + \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 10 + + おめでとうございます! + QTestLib フレームワークを使用して、 + 最初のユニットテストの作成と実行に成功しました。 +*/ + +/*! + \example qtestlib/tutorial2 + + \previouspage {第1章: ユニットテストの作成}{第1章} + \contentspage {QTestLib チュートリアル}{目次} + \nextpage {第3章: GUI イベントのシミュレート}{第3章} + + \title 第2章: データドリブンテスト + + 本章ではテストを複数回、それぞれ異なるテストデータを使用して行う方法について、 + 例を示しながら説明します。 + + これまでは、テストデータをテスト関数にハードコードしていました。 + この場合、テストデータを追加した関数は以下のようになります: + + \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 11 + + 関数が繰り返しを行うコードによって分散するのを防ぐために、 + QTestLib はテストデータのテスト関数への追加をサポートします。 + そのために、別の private slot をテストクラスに追加する必要があります: + + \snippet examples/qtestlib/tutorial2/testqstring.cpp 0 + + \section1 データ関数を記述する + + テスト関数に関連するデータ関数では、テスト関数と同じ関数名を使用して、 + 末尾に \c{_data} を追加します。 + データ関数は以下のようになります: + + \snippet examples/qtestlib/tutorial2/testqstring.cpp 1 + + まず、 \l QTest::addColumn() 関数を使用して、 + テストテーブルの2つの要素(テスト文字列(\c{"string"})および、 + QString::toUpper() 関数をその文字列に適用するときに予期された結果(\c{"result"})) + を定義します。 + + 次に、 \l QTest::newRow() 関数を使用して、 + データをテーブルに追加します。 + それぞれのデータセットは、テストテーブルでは別々の行(Row)になります。 + + \l QTest::newRow() は、データセット名をその引数として受け付けます。 + テストに失敗した場合、テストログでこのデータセット名が使用され、 + 失敗したデータの一覧が表示されます。 + 続いて、最初に任意の文字列(\c{"string"})を、次に + QString::toUpper() 関数をその文字列(\c{"string"})に適用するときに予期された結果(\c{"result"})の順に、 + テーブル行にデータセットをストリーミングします。 + + テストデータとは、二次元テーブルを指します。 + ここでは、\c string および \c result と呼ばれる2つの列と3つの行が含まれます。 + さらに、インデックスと同様に、各行に名前を関連付けます: + + \table + \header + \o index + \o name + \o string + \o result + \row + \o 0 + \o all lower + \o "hello" + \o HELLO + \row + \o 1 + \o mixed + \o "Hello" + \o HELLO + \row + \o 2 + \o all upper + \o "HELLO" + \o HELLO + \endtable + + \section1 テスト関数を書き換える + + ここで、テスト関数の書き換えを行います: + + \snippet examples/qtestlib/tutorial2/testqstring.cpp 2 + + TestQString::toUpper() 関数は 3 回実行されます。 + すなわち、関連する TestQString::toUpper_data() + 関数で作成したテストテーブルの各エントリ毎に一度実行されます。 + + TestQString::toUpper() 関数では + まず、 \l QFETCH() マクロを使用して、データセットの2つの要素を取得します。 + \l QFETCH() は、要素のデータタイプと要素名の、 + 2 つの引数を取ります。 + 次に \l QCOMPARE() マクロを使用して、テストを実行します。 + + このアプローチにより、テストの修正を行うことなく + テストに新規データを非常に簡単に追加できます。 + + このテストの場合も、テストケースを実行可能にするには、 + 同様に以下の2行が必要です: + + \snippet examples/qtestlib/tutorial2/testqstring.cpp 3 + + これまでと同様に、 \l QTEST_MAIN() マクロは + すべてのテスト関数を実行するシンプルな + \c main() 関数に展開されます。 + テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、 + Qt のメタオブジェクト機能を動作させるために、 + 生成された moc ファイルを include する必要があります。 + +*/ + +/*! + \example qtestlib/tutorial3 + + \previouspage {第2章: データドリブンテスト}{第2章} + \contentspage {QTestLib チュートリアル}{目次} + \nextpage {第4章: GUI イベントの再現}{第4章} + + \title 第3章: GUI イベントのシミュレート + + QTestLib にはグラフィカルユーザインターフェースをテストするための機能があります。 + QTestLib は、ネイティブなウィンドウシステムのイベントをシミュレートする代わりに、 + Qt の内部で使われるイベントを送信します。 + このため、テストが実行されるコンピュータには + 副次的な悪影響が発生しません。 + + 本章では、シンプルな GUI テストを作成する方法を確認します。 + + \section1 GUI テストを作成する + + 今回は、 QLineEdit クラスの挙動をテストすると仮定しましょう。 + これまでと同様に、テスト関数を含むクラスが必要です: + + \snippet examples/qtestlib/tutorial3/testgui.cpp 0 + + 唯一の違いは、 QTest だけでなく、 QtGui クラスの宣言を + include する必要があることです。 + + \snippet examples/qtestlib/tutorial3/testgui.cpp 1 + + テスト関数を実装する際は、最初に QLineEdit を作成します。 + 次に、 \l QTest::keyClicks() 関数を使用して、 + "hello world" をラインエディットに入力する操作をシミュレートします。 + + \note キーボードショートカットを正しくテストするには、 + ウィジェットの表示も必要になります。 + + QTest::keyClicks() は、 + ウィジェットのキーシーケンスの入力をシミュレートします。 + 必要に応じてキーボード修飾子の指定や、 + 各キー入力後の遅延(ミリ秒単位)を指定することができます。 + 同様に、 QTest::keyClick() 、 QTest::keyPress() 、 QTest::keyRelease() 、 + QTest::mouseClick() 、 QTest::mouseDClick() 、 QTest::mouseMove() 、 + QTest::mousePress() 及び QTest::mouseRelease() 関数を使用して、 + 関連付けられた GUI イベントをシミュレートできます。 + + 最後に、 \l QCOMPARE() マクロを使用して、 + ラインエディットの文字列が正しいかどうか確認します。 + + これまでと同様に、 + テストケースを実行可能にするには、 + 以下の2行が必要です: + + \snippet examples/qtestlib/tutorial3/testgui.cpp 2 + + QTEST_MAIN() マクロは + すべてのテスト関数を実行するシンプルな + \c main() 関数に展開されます。 + テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、 + Qt のメタオブジェクト機能を動作させるために、 + 生成された moc ファイルを include する必要があります。 +*/ + +/*! + \example qtestlib/tutorial4 + + \previouspage {第3章: GUI イベントのシミュレート}{第3章} + \contentspage {QTestLib チュートリアル}{目次} + \nextpage {第5章: ベンチマークの作成}{第5章} + + \title 第4章: GUI イベントの再現 + + 本章では、GUI イベントをシミュレートしたり、 + あるウィジェットで一連の GUI イベントを再生したり保存したりする方法について説明します。 + + 一連のイベントを保存して再生するアプローチは、 + \l{第2章: データドリブンテスト}{第2章} + で説明したアプローチとよく似ています。 + 必要な変更は、テストクラスにデータ関数を追加することです: + + \snippet examples/qtestlib/tutorial4/testgui.cpp 0 + + \section1 データ関数を記述する + + これまでと同様にテスト関数に関連するデータ関数では、 + テスト関数と同じ名前を使用して末尾に \c{_data} を追加します。 + + \snippet examples/qtestlib/tutorial4/testgui.cpp 1 + + まず、 QTest::addColumn() 関数を使用して、 + テーブルの2つの要素(GUI イベントのリスト(\c{"events"})および、 + QWidget のイベントのリストを適用するときに予期された結果(\c{"expected"}))を定義します。 + 最初の要素の型は \l QTestEventList であることに注意してください。 + + QTestEventList では、後で使用するテストデータの保存を行うために + GUI イベントを読み込んだり、 QWidget ウィジェットで再生したりできます。 + + 現在のデータ関数で、 \l QTestEventList を2つ作成します。 + 最初のリストには 'a' キーを一度だけ入力します。 + QTestEventList::addKeyClick() 関数を使用して、 + リストにイベントを追加します。 + 次に、QTest::newRow() 関数を使用してデータセットに名前を付けて、 + テーブルにイベントリストおよび予期された結果をストリーミングします。 + + 2つ目のリストには、2つのキー入力('a' に続いてバックスペース(Qt::Key_Backspace))を設定します。 + QTestEventList::addKeyClick() を使用してリストにイベントを追加し、 + QTest::newRow() を使用して名前を関連付けたテーブルにイベントリストおよび予期された結果を挿入します。 + + \section1 テスト関数を書き換える + + ここで、テストの書き換えを行います: + + \snippet examples/qtestlib/tutorial4/testgui.cpp 2 + + TestGui::testGui() 関数は2回実行されます。 + 関連する TestGui::testGui_data() + 関数で作成したテストデータの各エントリ毎にそれぞれ実行されます。 + + まず、\l QFETCH() マクロを使用して、データセットの2つの要素を取得します。 + \l QFETCH() は、要素のデータ型と要素名の2つの引数を取ります。 + 次に QLineEdit を作成し、 QTestEventList::simulate() 関数を使用して + ウィジェットにイベントのリストを適用します。 + + 最後に、 QCOMPARE() マクロを使用してラインエディットの文字列が正しいかどうか確認します。 + + これまでと同様に、 + テストケースを実行可能にするには、 + 以下の2行が必要です: + + \snippet examples/qtestlib/tutorial4/testgui.cpp 3 + + \l QTEST_MAIN() マクロは + すべてのテスト関数を実行するシンプルな + \c main() 関数に展開されます。 + テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、 + Qt のメタオブジェクト機能を動作させるために、 + 生成された moc ファイルを include する必要があります。 +*/ + +/*! + \example qtestlib/tutorial5 + + \previouspage {第4章: GUI イベントの再現}{第4章} + \contentspage {QTestLib チュートリアル}{目次} + + \title 第5章: ベンチマークの作成 + + 最終章となる本章では QTestLib を使ってベンチマークを作成する方法について説明します。 + + \section1 ベンチマークの作成 + ベンチマークを作成するには QBENCHMARK マクロを用いてテスト関数を拡張します。 + ベンチマークテスト関数には通常、テストの準備コードと測定するコードを含む + QBENCHMARK マクロが一つ含まれます。 + QString::localeAwareCompare() のベンチマークを行う関数は以下のようになります。 + + \snippet examples/qtestlib/tutorial5/benchmarking.cpp 0 + + 測定の準備は関数の最初に行われています。 + この時点では測定は始まっていません。 + QBENCHMARK マクロで囲まれたブロックの中身のみが計測されます。 + このブロックの内部は正確な測定を行うために、何度か繰り返し実行される場合があります。 + + \l {testlib-benchmarking-measurement}{ベンチマークの方法}(バックエンド)は何種類か用意されており、 + コマンドライン引数から選択することが出来ます。 + + \section1 データ関数 + + データ関数は複数のデータでベンチマークを行うテストを作成するのに有用です。 + たとえば、ロケール準拠と標準的な比較を行う場合は以下のようになります。 + + \snippet examples/qtestlib/tutorial5/benchmarking.cpp 1 + + テスト関数ではデータに従ってベンチマークする手法を決定します。 + + \snippet examples/qtestlib/tutorial5/benchmarking.cpp 2 + + "if (useLocaleCompare)" 文はそのオーバヘッドを測定対象外とするために + QBENCHMARK マクロのブロックの外部にあります。 + ベンチマークの実行時にはそれぞれどちらか一つの QBENCHMARK マクロが実行されます。 + + \section1 外部ツール + + テストデータの可視化を行うためのツールが Qt Labs Web サイトの + \l{qtestlib-tools} プロジェクトに含まれています。 + そこには実行したテストの結果からパフォーマンスを比較したり、 + パフォーマンスのWeb用グラフを作成するツールが含まれています。 + + それらのツールの詳細と簡単なグラフの例は + \l{qtestlib-tools Announcement} を参照してください。 + +*/ + + + diff --git a/doc/src/ja_JP/examples/arrowpad.qdoc b/doc/src/ja_JP/examples/arrowpad.qdoc new file mode 100644 index 0000000..2518264 --- /dev/null +++ b/doc/src/ja_JP/examples/arrowpad.qdoc @@ -0,0 +1,248 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example linguist/arrowpad + \title サンプル: アローパッド + + この例では、\e {Qt Linguist} の主なコンセプトである"文脈"について、 + 少し詳しく取り上げて説明します。 + また、2つ以上の言語を使用する方法についても説明します。 + + \image linguist-arrowpad_en.png + + アプリケーションで使用可能な言語の数に制限はありませんが、 + ここではフランス語とオランダ語の2言語の翻訳を使用します。 + \c arrowpad.pro の関連する行は以下のとおりです。 + + \snippet examples/linguist/arrowpad/arrowpad.pro 0 + \codeline + \snippet examples/linguist/arrowpad/arrowpad.pro 1 + + \c lupdate を実行すると、2つの類似したメッセージファイル + \c arrowpad_fr.ts と \c arrowpad_nl.ts が作成されます。 + これらのファイルにはすべてのソーステキストとその文脈が含まれます。 + それらのテキストは \c tr() の呼び出しを通じて翻訳対象として + ソースコード内でマークされているものです。 + + Qt アプリケーションの翻訳の詳細については、 + \l{Qt Linguist manual}{Qt Linguist マニュアル} をご覧ください。 + + \section1 各行の簡単な解説 + + \c arrowpad.h では、 QWidget の派生クラスである \c ArrowPad + クラスを定義します。 + 上記のスクリーンショットで + 中央の 4 つのボタンを持つウィジェットが \c ArrowPad です。 + + \snippet examples/linguist/arrowpad/arrowpad.h 0 + \snippet examples/linguist/arrowpad/arrowpad.h 1 + \snippet examples/linguist/arrowpad/arrowpad.h 2 + + \c lupdate を実行するとソーステキストの抽出だけでなく、 + 文脈へのグループ化を行うことができます。 + ソーステキストが表示されるクラスの名前が文脈となります。 + 従って、この例では、"ArrowPad" が + \c ArrowPad クラスの文字列の文脈です。 + \c Q_OBJECT のマクロは、以下の内容で + \c ArrowPad に \c tr(x) を定義します: + + \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 0 + + 各ソーステキストが表示されるクラスを把握しておくと、 + \e {Qt Linguist} で論理的に関連のある文字列をグループ化することが出来ます。 + 例えば、ダイアログ内のすべての文字列には + ダイアログのクラス名の文脈が含まれるため、同時に表示されます。 + 文字列が表示される文脈によって翻訳の内容が影響を受ける場合があるため、 + 翻訳者にとって有用な情報となります。 + 一部の翻訳では、キーボードショートカットを変更する必要があります。 + また、同じグループにまとめられた特定の文脈(クラス) + にすべてのソーステキストを含めることにより、 + 翻訳者はコンフリクトを起こすことなく、 + より簡単にショートカットを変更できます。 + + \c arrowpad.cpp で、\c ArrowPad クラスを実装します。 + + \snippet examples/linguist/arrowpad/arrowpad.cpp 0 + \snippet examples/linguist/arrowpad/arrowpad.cpp 1 + \snippet examples/linguist/arrowpad/arrowpad.cpp 2 + \snippet examples/linguist/arrowpad/arrowpad.cpp 3 + + ラベルはユーザ表示可能な文字列であるため、 + ボタンのラベルごとに \c ArrowPad::tr() を呼び出します。 + + \image linguist-arrowpad_en.png + + \snippet examples/linguist/arrowpad/mainwindow.h 0 + \snippet examples/linguist/arrowpad/mainwindow.h 1 + + 上記のスクリーンショットでは、ウィンドウ全体が \c MainWindow です。 + これは、\c mainwindow.h ヘッダーファイルで定義します。 + ここでも、\c MainWindow が \e {Qt Linguist} の文脈になるよう、 + \c Q_OBJECT を使用します。 + + \snippet examples/linguist/arrowpad/mainwindow.cpp 0 + + \c MainWindow と \c mainwindow.cpp を実装する際に、 + \c ArrowPad クラスのインスタンスを作成します。 + + \snippet examples/linguist/arrowpad/mainwindow.cpp 1 + + また、\c MainWindow::tr() を、 + アクションおよびショートカット用に、計 2 回呼び出します。 + + \c tr() を使用して、言語によって異なるキーをサポートします。 + 英語の場合、"Ctrl+Q" は Quit (終了) に適していますが、 + オランダ語の翻訳者は "Ctrl+A" (Afsluiten の場合) を、 + ドイツ語の翻訳者は "Strg+E" (Beenden の場合) を使うといいでしょう。 + \key Ctrl キーショートカットを \c tr() で使用する場合は + 引数を 2 つ使用して、 + ショートカットが実行する機能を2番目の引数に記述してください。 + + \c main.cpp で定義した標準的な \c main() 関数は、以下のようになります。 + + \snippet examples/linguist/arrowpad/main.cpp 2 + \snippet examples/linguist/arrowpad/main.cpp 3 + + 現在のロケールに基づいて、使用する翻訳を選択します。 + 例えば、QLocale::system() は、 + \c LANG 環境変数の設定によって影響を受ける場合があります。 + \c .qm メッセージファイル(および TS ファイル)の命名規則に + ロケールを使用すると、 + 簡単にロケールに基づいて翻訳ファイルを選択することが + できるようになります。 + + 選択したロケールに QM メッセージファイルが存在しない場合、 + 元のソーステキストが使用され、エラーは生成されません。 + + \section1 フランス語からオランダ語に翻訳する + + ここでは、サンプルアプリケーションをフランス語に翻訳することから始めます。 + \e {Qt Linguist} を起動し、\c arrowpad_fr.ts の作業を行います。 + 2つの文脈 ("ArrowPad" および "MainWindow") + にグループ化された7つのソーステキスト ("\&Up", "\&Left" 等) + が含まれているはずです。 + + 次に、以下の翻訳を入力します: + + \list + \o \c ArrowPad + \list + \o \&Up - \&Haut + \o \&Left - \&Gauche + \o \&Right - \&Droite + \o \&Down - \&Bas + \endlist + \o \c MainWindow + \list + \o E\&xit - \&Quitter + \o Ctrl+Q - Ctrl+Q + \o \&File - \&Fichier + \endlist + \endlist + + 翻訳の入力が終わったら、 \key{Ctrl+Return} (もしくは\gui {完了にして次へ} + ボタン)を押すと、 + 翻訳が完了とマークされ次のソーステキストに移動するため便利です。 + + ファイルを保存して、オランダ語の翻訳でも同じ手順を実行し、 + \c arrowpad_nl.ts の作業を行います: + + \list + \o \c ArrowPad + \list + \o \&Up - \&Omhoog + \o \&Left - \&Links + \o \&Right - \&Rechts + \o \&Down - Omlaa\&g + \endlist + \o \c MainWindow + \list + \o E\&xit - \&Afsluiten + \o Ctrl+Q - Ctrl+A + \o File - \&Bestand + \endlist + \endlist + + \c tt1_fr.ts と \c tt1_nl.ts の翻訳ソースファイルは + QM ファイルに変換する必要があります。 + 以前と同様の方法で \e {Qt Linguist} を使用して変換できますが、 + コマンドラインツール \c lrelease を使うと + \e {Qt Linguist} から個々の \gui {ファイル|リリース} を読み込まなくても、 + アプリケーションの\e{すべての} QM ァイルを作成できます。 + + 以下を入力します: + + \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 1 + + これにより、\c arrowpad_fr.qm と \c arrowpad_nl.qm が作成されます。 + \c LANG 環境変数を \c fr に設定します。 + Unix では、以下の2つのコマンドのいずれかが機能します。 + + \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 2 + + Windows では、\c autoexec.bat を修正するか、以下を実行します。 + + \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 3 + + プログラムを実行すると、フランス語版が表示されます: + + \image linguist-arrowpad_fr.png + + \c LANG=nl を設定し、オランダ語でも同じ手順を実行します。 + これで、オランダ語版が表示されます: + + \image linguist-arrowpad_nl.png + + \section1 エクササイズ + + \e {Qt Linguist} で未完了の翻訳を行います。 + 例えば、各テキストのチェックマークをクリックして翻訳を未完了の状態にして保存します。 + その後、 \c lupdate 、\c lrelease 、サンプルの順に実行します。 + この変更がどのような影響を及ぼしましたか。 + + \c LANG=fr_CA (フランス語(カナダ))に設定し、 + サンプルプログラムを再実行します。 + \c LANG=fr の場合と同じ結果になる理由を説明してください。 + + オランダ語翻訳のショートカットのいずれかを変更し、 + \e \&Bestand と \e \&Boven の競合を解消します。 +*/ diff --git a/doc/src/ja_JP/examples/hellotr.qdoc b/doc/src/ja_JP/examples/hellotr.qdoc new file mode 100644 index 0000000..cc01b81 --- /dev/null +++ b/doc/src/ja_JP/examples/hellotr.qdoc @@ -0,0 +1,200 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example linguist/hellotr + \title サンプル: こんにちは tr() + + これは、小さな Hello World プログラムを日本語に翻訳する例です。 + 以下のスクリーンショットは英語版です。 + + \image linguist-hellotr_en.png + + Qt アプリケーションの翻訳に関する詳細は、\l{Qt Linguist manual} + をご覧ください。 + + \section1 各行の簡単な解説 + + \snippet examples/ja_JP/linguist/hellotr/main.cpp 0 + + この行では、 QTranslator クラスの宣言を読み込みます。 + QTranslator クラスのオブジェクトは、 + ユーザに表示する文字列を翻訳します。 + + \snippet examples/ja_JP/linguist/hellotr/main.cpp 5 + + 親をもたない QTranslator オブジェクトを作成します。 + + \snippet examples/ja_JP/linguist/hellotr/main.cpp 6 + + プログラムで使用するソーステキストの日本語の翻訳を含む、 + \c hellotr_ja.qm ( \c .qm というファイル拡張子は省略します) + と呼ばれるファイルを読み込みます。 + ファイルが見つからなくてもエラーは発生しません。 + + \snippet examples/ja_JP/linguist/hellotr/main.cpp 7 + + \c hellotr_ja.qm の翻訳を、プログラムで使用する翻訳プールに追加します。 + + \snippet examples/ja_JP/linguist/hellotr/main.cpp 8 + + "Hello world!" を表示するプッシュボタンを作成します。 + 検索した \c hellotr_ja.qm に "Hello world!" の翻訳が含まれている場合、 + その翻訳が表示されます。 + 含まれていない場合、翻訳前のテキストがそのまま表示されます。 + + QObject を継承するすべてのクラスには、\c tr() 関数が含まれます。 + QObject クラスのメンバ関数内では、\c QPushButton::tr("Hello world!") + や \c QObject::tr("Hello world!") の代わりに、シンプルに + \c tr("Hello world!") を使います。 + + \section1 英語版のアプリケーションを実行する + + 翻訳ファイル \c hellotr_ja.qm の作成が終わっていないため、 + 以下のアプリケーションを起動したときに元の文字列が表示されます。 + + \image linguist-hellotr_en.png + + \section1 日本語のメッセージファイルを作成する + + 最初のステップは、プロジェクトのすべてのソースファイルを列挙する + \c hellotr.pro を作成することです。 + プロジェクトファイルは、qmake プロジェクトファイルまたは、通常の + makefile である可能性があります。 + 以下の記述を含むプロジェクトファイルを作成してください。 + + \snippet examples/ja_JP/linguist/hellotr/hellotr.pro 0 + \snippet examples/ja_JP/linguist/hellotr/hellotr.pro 1 + + \c TRANSLATIONS は、管理するメッセージファイルを指します。 + この例では、日本語の翻訳のみ管理します。 + + ファイル拡張子は、\c .qm ではなく、\c .ts であることにご注意ください。 + \c .ts は翻訳のソースファイルのフォーマットであり、 + アプリケーションの開発時に使用します。 + プログラマーまたはリリースマネージャーは \c lupdate プログラムを実行し、 + ソースコードから抽出したソーステキストを使用して + TS ファイルの生成と更新を行います。 + 翻訳者は、 \e {Qt Linguist} を使用して TS ファイルの読み取りと更新を行い、 + 翻訳の追加と編集を行います。 + + TS の形式は、ユーザが直接閲覧可能な XML 形式であるため、 + 直接Eメールで送信したり、簡単にバージョン管理の対象にすることが出来ます。 + このファイルを手動で編集する場合、XML の既定のエンコードは UTF-8 で、 + Latin1(ISO 8859-1)ではないことに気をつけてください。 + '\oslash'(ノルウェー語の o にスラッシュが付いたもの)などの + Latin1 文字を入力する1つの方法は、XML エンティティ "ø" + を使用することです。 + これはすべての Unicode 4.0 文字に対して有効です。 + + 翻訳が完了したら、\c lrelease プログラムを使用して、 + TS ファイルを QM ファイル(Qt Message ファイル)形式に変換します。 + QM 形式は、極めて高速な検索性能を実現するようにデザインされた + コンパクトなライブラリ形式です。 + \c lupdate と \c lrelease はどちらも、 + プロジェクト全体のソースファイルとヘッダーファイル + (プロジェクトファイルの HEADERS および SOURCES 行で指定されている) + を読み取り、\c tr() 関数呼び出しの際に表示される文字列を抽出します。 + + \c lupdate は、メッセージファイル(この場合は \c hellotr_ja.ts) + の作成と更新を行い、これらをソースコードと同期させるために使用します。 + \c lupdate にはデータの削除機能がないため、 + \c lupdate はいつでも安全に実行できます。 + 例えば、ソースが変更されるたびに TS ファイルが更新されるよう、 + makefile に記述できます。 + + それでは、以下のように \c lupdate を実行してみましょう: + + \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 0 + + (\c -verbose オプションは、操作を説明するメッセージを表示するよう + \c lupdate に指示します。) + 現在のディレクトリに、以下の内容で + \c hellotr_ja.ts ファイルが作成されていると思います: + + \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 1 + + ツール (\c lupdate、 \e {Qt Linguist}、\c lrelease) + を使用して読み取りと更新を行うため、 + ファイル形式を理解する必要はありません。 + + \section1 Qt Linguist を使用して日本語に翻訳する + + XML やテキストエディタを使用して、TS ファイルを翻訳することも出来ますが、 + ここでは \e {Qt Linguist} を使用して翻訳を行います。 + + \e {Qt Linguist} を起動するには、以下を入力します。 + + \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 2 + + 左上のペインに "QPushButton" が表示されるはずです。 + これをダブルクリックし、次に "Hello world!" をクリックして、 + \gui Translation ペイン (ウィンドウ右中央)に + "こんにちは、世界!" と入力します。 + 感嘆符(!)を忘れないように付けてください! + + \gui{完了} チェックボックスをオンにして、 + メニューバーから \gui{ファイル|保存} を選択します。 + TS ファイルから、以下の記述がなくなります。 + + \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 3 + + その代わりに以下が含まれます。 + + \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 4 + + \section1 日本語版のアプリケーションを実行する + + 日本語版のアプリケーションを実行する前に、 + TS ファイルから QM ファイルを生成する必要があります。 + QM ファイルは、\e {Qt Linguist}(単一の TS ファイルの場合)のメニューから、 + もしくは、コマンドラインプログラム \c lrelease を使用して生成できます。 + \c lrelease を使用する場合、 + プロジェクトファイルに列挙されている TS ファイルごとに + 1 つの QM ファイルを作成することが出来ます。 + \e {Qt Linguist} のメニューバーから \gui{ファイル|リリース} を選択し、 + ポップアップ表示される \gui{ファイルの保存} ダイアログで\gui{保存}を選択し、 + \c hellotr_ja.ts から \c hellotr_ja.qm を生成します。 + 今すぐ \c hellotr プログラムを再実行してみましょう。 + これで、ボタンに "こんにちは、世界!" と表示されます。 + + \image linguist-hellotr_ja.png +*/ diff --git a/doc/src/ja_JP/examples/trollprint.qdoc b/doc/src/ja_JP/examples/trollprint.qdoc new file mode 100644 index 0000000..1686774 --- /dev/null +++ b/doc/src/ja_JP/examples/trollprint.qdoc @@ -0,0 +1,286 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example linguist/trollprint + \title サンプル: トロールプリント + + トロールプリント(Troll Print)は、 + ユーザがプリンタの設定をするためのサンプルアプリケーションです。 + これには、英語とポルトガル語の2つのバージョンが用意されています。 + + \image linguist-trollprint_10_en.png + + この例では、いくつかのポルトガル語の翻訳を含む翻訳ファイル + \c trollprint_pt.ts を用意しました。 + + 同じアプリケーションの2つのバージョン、 + Troll Print 1.0 と 1.1 をリリースすることを想定します。 + 1つのバージョンで作成した翻訳を次のリリースで再利用する方法を習得します。 + (このチュートリアルでは、いくつかのソースファイルの編集が必要です。 + 新しい一時ディレクトリにすべてのファイルをコピーして、 + ここで作業を行うのがベストでしょう。) + + Qtアプリケーションの翻訳の詳細については、 + \l{Qt Linguist manual}{Qt Linguist マニュアル} をご覧ください。 + + \section1 各行の簡単な解説 + + \c PrintPanel クラスを \c printpanel.h で宣言します。 + + \snippet examples/linguist/trollprint/printpanel.h 0 + + \c PrintPanel は QWidget の派生クラスです。 + \c tr() が正しく動作するには、\c Q_OBJECT マクロが必要です。 + + 実装ファイルは \c printpanel.cpp です。 + + \snippet examples/linguist/trollprint/printpanel.cpp 0 + + Troll Print 1.0 で一部のコードがコメントアウトされています。 + Troll Print 1.1 にバージョンアップする際に、 + コメントから戻してください。 + + \snippet examples/linguist/trollprint/printpanel.cpp 1 + \snippet examples/linguist/trollprint/printpanel.cpp 2 + + PrintPanel では、\c tr("Enabled") と \c tr("Disabled") + を2回ずつ使用することに注意してください。 + "Enabled" と "Disabled" はどちらも同じ文脈で表示されるため、 + \e {Qt Linguist} では、それぞれ1回目の使用に対してのみ表示され、 + 2回目以降の使用に対しては翻訳が流用されるため表示されません。 + これは便利な時間短縮ツールですが、ポルトガル語などの一部の言語では、 + 2回目の使用に対して異なる翻訳が必要になります。 + これから、\e {Qt Linguist}で、 + すべての \c tr() に対して異なる翻訳を表示できるように設定する方法を学習します。 + + \c MainWindow, \c mainwindow.h はシンプルなヘッダーファイルです。 + \c mainwindow.cpp の実装には、翻訳対象としてマークする必要のある + ユーザに表示するソーステキストがあります。 + + \snippet examples/linguist/trollprint/mainwindow.cpp 0 + + ウィンドウのタイトルは翻訳する必要があります。 + + \snippet examples/linguist/trollprint/mainwindow.cpp 1 + \snippet examples/linguist/trollprint/mainwindow.cpp 3 + + また、アクションとメニューも翻訳する必要があります。 + キーボードショートカット "Ctrl+Q" に対して使用している \c tr() + の第 2 引数は、このショートカットがどのような機能を有しているかを + 翻訳者に示す唯一の情報であることに注意してください。 + + \snippet examples/linguist/trollprint/main.cpp 0 + + \c main.cpp の \c main() 関数は、 + \l{linguist/arrowpad}{アローパッド} の例の場合と同じになります。 + 具体的には、現在のロケールに基づいて、翻訳ファイルを選択します。 + + \section1 英語とポルトガル語で Troll Print 1.0 を実行する + + 既存の \c trollprint_pt.ts ファイルの翻訳を使用します。 + + \c LANG 環境変数を \c pt に設定して、\c trollprint を実行します。 + QM ファイルがないため、スクリーンショットは英語版のままです。 + ここで、\c lrelease (例: \c {lrelease trollprint.pro})を実行し、 + サンプルを再実行します。 + これで、ポルトガル語版(Troll Imprimir 1.0)になりました: + + \image linguist-trollprint_10_pt_bad.png + + 翻訳は正しく表示されていますが、誤りがあります。 + 文法的に正しいポルトガル語では、 + "Enabled" が2回目に使用されるときの正しい翻訳は、 + "Ativado" ではなく "Ativadas" であり、 + "Disabled" が2回目に翻訳されるときも、 + 語尾を同様に変化させる必要があります。 + + \e {Qt Linguist} で \c trollprint_pt.ts を開くと、 + ソースコードには "Enabled" と "Disabled" が2回ずつ使われていますが、 + 翻訳ソースファイルでは1回ずつしか使われていません。 + これは、\e {Qt Linguist} では、 + ソーステキストが重複する場合は翻訳を流用することにより、 + 翻訳者の作業を最小限に抑えようとするためです。 + このように類似した翻訳に誤りがある場合、 + プログラマは繰り返し使用する際に翻訳の曖昧さを排除する必要があります。 + これは、2個の引数を取る\c tr() を使用することにより、 + 容易に実行できます。 + + 実際には、翻訳者の"文脈"は変更する必要のある文字列が表示されるクラスに対するクラス名であるため、 + どのファイルを変更すべきか簡単に特定できます。 + この場合、ファイルは \c printpanel.cpp であり、 + 変更すべき行は4行あります。 + ラジオボタンの最初のペアの \c tr() 呼び出しに、2つ目の引数 "two-sided"(両面) をに追加します: + + \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 0 + + そして、ラジオボタンの2番目のペアの \c tr() 呼び出しに、 + 2つ目の引数 "colors"(色) を追加します。 + + \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 1 + + ここで、\c lupdate を実行し、\e {Qt Linguist} で + \c trollprint_pt.ts を開きます。2 つの変更個所がわかるはずです。 + + まず、翻訳ソースファイルには、\e{3組}の "Enabled" と + "Disabled" のペアが含まれています。 + 最初のペアは、既に利用されていないテキストであることを意味する灰色になっています。 + これは、 \c tr() 内の文字列が第二引数を追加した新たな + \c tr() の文字列で置き換えられたからです。 + 2番目のペアには、"two-sided"(両面) というコメントが含まれており、 + 3番目のペアには、"colors"(色) というコメントが含まれています。 + これらのコメントは、\e {Qt Linguist} に + \gui {開発者のコメント} として表示されます。 + + 次に、翻訳者の作業を最小限に抑えるために、 + 新たに使用される "Enabled" と "Disabled" の文字列に対して、 + 訳語 "Ativado" と "Desativado" が自動的に使用されます。 + これらの訳語は、これらの原語が2回目に使用される場合の正しい翻訳ではありません。 + ここからが、チュートリアルの出発点です。 + + 2番目の "Ativado" を "Ativadas" に、 + 2番目の "Desativado" を "Desativadas" に変更し、保存して終了します。 + \c lrelease を実行して最新のバイナリ \c trollprint_pt.qm ファイルを作成し、 + Troll Print (または Troll Imprimir) を実行します。 + + \image linguist-trollprint_10_pt_good.png + + \e {Qt Linguist} では "comments" と呼ばれる + \c tr() 呼び出しの2つ目の引数は、 + 同じ文脈(クラス)で発生する類似したソーステキストを識別します。 + コメントは、たとえば Ctrl キーによるキーボードショートカットが + ショートカットによって実行される機能を伝達する唯一の手段である場合等に、 + 翻訳者に情報を提供するのに便利です。 + + 翻訳者に情報を提供する他の手段は、 + 翻訳の必要があるソーステキストを含むアプリケーションの + 特定の部分への移動方法に関する情報を提供することです。 + これにより、翻訳者は、翻訳が表示される文脈を確認し、 + 翻訳を検索してテストを行うことができます。 + これは、ソースコードで \c TRANSLATOR + コメントを使用して行います: + + \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 2 + + 一部のソースファイル、特にダイアログクラスのコメントに + ダイアログに到達するまでに必要な操作を記述します。 + また、\c mainwindow.cpp や \c printpanel.cpp など、 + 適切なサンプルファイルにこれらを追加することもできます。 + \c lupdate を実行して \e {Qt Linguist} を起動し、 + \c trollprint_pt.ts を読み込みます。 + ソーステキストの一覧を参照する際に、 + \gui{ソーステキスト}と\gui{開発者のコメント} + の領域に表示されるコメントを確認できます。 + + 特に大きなプログラムでは、翻訳者が自分の翻訳を探し、 + それが適切かどうかを確認することが困難な場合があります。 + コメントは役立つナビゲーション情報を提供するため、 + 翻訳に要する時間を節約できます: + + \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 3 + + \section1 Troll Print 1.1 + + これから、Troll Print のバージョン 1.1 のリリースの準備を行います。 + テキストエディターを起動して、次の手順に従って変更を行ってください: + + \list + \o \c printpanel.cpp の文字列 "\<b\>TROLL PRINT\</b\>" を引数に + QLabel を作成する2つの行のコメントを解除します。 + \o ソースの変更: \c printpanel.cpp で、"2-sided" を + "Two-sided" に置き換えます。 + \o \c mainwindow.cpp で、すべての "1.0" を "1.1" に置き換えます。 + \o \c mainwindow.cpp で、著作権表示の年号を 1999-2000 に更新します。 + \endlist + + (実際のアプリケーションでは、バージョン番号と著作権表示の年号は + const または #define をつかって定義するでしょう。) + + 終了したら、\c lupdate を実行し、\e {Qt Linguist} で + \c trollprint_pt.ts を開きます。以下の項目は、特別なコンテンツです: + + \list + \o \c MainWindow + \list + \o Troll Print 1.0 - 古いテキストとして灰色でマーク + \o About Troll Print 1.0 - 古いテキストとして灰色でマーク + \o Troll Print 1.0. Copyright 1999 Software, Inc. - + 古いテキストとして灰色でマーク + \o Troll Print 1.1 - 自動的に "Troll Imprimir 1.1" に翻訳(未完了) + \o About Troll Print 1.1 - 自動的に "Troll Imprimir 1.1" に翻訳(未完了) + \o Troll Print 1.1. Copyright 1999-2000 Software, + Inc. - 自動的に "Troll Imprimir 1.1. + Copyright 1999-2000 Software, Inc." に翻訳(未完了) + \endlist + \o \c PrintPanel + \list + \o 2-sided - 古いテキストとして灰色でマーク + \o \<b\>TROLL PRINT\</b\> - 未翻訳のテキストとして"?"マーク + \o Two-sided - 未翻訳のテキストとして"?"マーク + \endlist + \endlist + + \c lupdate は、修正を容易に行い、数字の処理を効率的に行うために、 + 様々な処理を行っています。 + + \c MainWindow の翻訳の見直しを行います。 + "\<b\>TROLL PRINT\</b\>" を "\<b\>TROLL IMPRIMIR\</b\>" と翻訳します。 + "Two-sided" を翻訳する際には、\gui{フレーズと推測} の欄から + "2-lados" をダブルクリックして訳に選択した後に、 + "2" を "Dois" に変更します。 + + 保存して終了し、\c lrelease を実行します。 + ポルトガル語版の表示は以下のようになります: + + \image linguist-trollprint_11_pt.png + + \gui{Ajuda|Sobre} (\gui{Help|About}) を選択し、 + バージョン情報ボックスを確認します。 + + \gui{Ajuda|Sobre Qt} (\gui{Help|About Qt}) を選択した場合、 + 英語版のダイアログが表示されます。 + Qt の翻訳はまだ終わっていません。 + 詳細については、\l{Internationalization with Qt} を参照してください。 + + ここで、\c LANG=en を設定し、元の英語版を実行してみてください: + + \image linguist-trollprint_11_en.png +*/ diff --git a/doc/src/ja_JP/getting-started/tutorials.qdoc b/doc/src/ja_JP/getting-started/tutorials.qdoc new file mode 100644 index 0000000..701ba88 --- /dev/null +++ b/doc/src/ja_JP/getting-started/tutorials.qdoc @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page tutorials.html + \title チュートリアル + + \contentspage How to Learn Qt + \nextpage Qt Examples + + \brief Qt の学習を助けるチュートリアルやガイドの概要 + + \nextpage Qt Examples + + Qt で提供されているこれらのチュートリアルやガイドは + 新たに Qt の開発を始めるユーザの良い助けとなります。 + これらのドキュメントでは ウィジェットの基本的な使い方から始まり + ステップバイステップでアプリケーションの使い方を学ぶことが出来ます。 + + \table + \row + \o{2,1} \l{ウィジェットのチュートリアル}{\bold ウィジェット} + \o{2,1} \l{チュートリアル: アドレス帳}{\bold {アドレス帳}} + \row + \o \image widget-examples.png Widgets + \o + ウィジェットとレイアウトを使って GUI アプリケーションを作成する + 初心者向けのガイドです。 + + \o \image addressbook-tutorial.png AddressBook + \o + 完全な機能を持つアドレス帳アプリケーションを作成する 7 章で構成されたガイドです。 + + \row + \o{2,1} \l{Qt Designer クイックガイド}{\bold{Qt Designer}} + \o{2,1} \l{Qt Linguist Manual: Programmers#Tutorials}{\bold {Qt Linguist}} + \row + \o \image designer-examples.png QtDesigner + \o + \QD を使ってフォームを生成する基本的な手順を説明するクイックガイドです。 + + \o \image linguist-examples.png QtLinguist + \o + \l{サンプル: こんにちは tr()}{こんにちは tr()}、 + \l{サンプル: アローパッド}{アローパッド}、 + \l{サンプル: トロールプリント}{トロールプリント} + の三例を通じて翻訳の方法を説明します。 + + \row + \o{2,1} \l{QTestLib チュートリアル}{\bold QTestLib} + \o{2,1} \l{qmake チュートリアル}{\bold qmake} + \row + \o{2,1} + Qt のユニットテストフレームワークである QTestLib の機能の初歩的な使い方を説明するチュートリアルです。 + このチュートリアルは4章で構成されています。 + + \o{2,1} + \c qmake の使い方を説明するチュートリアルです。 + このチュートリアルを卒業した後は \l{qmake Manual}{qmake user guide}(英語) + を読むことをお勧めします。 + + \endtable +*/ diff --git a/doc/src/ja_JP/images/linguist-hellotr_en.png b/doc/src/ja_JP/images/linguist-hellotr_en.png Binary files differnew file mode 100644 index 0000000..05aa945 --- /dev/null +++ b/doc/src/ja_JP/images/linguist-hellotr_en.png diff --git a/doc/src/ja_JP/images/linguist-hellotr_ja.png b/doc/src/ja_JP/images/linguist-hellotr_ja.png Binary files differnew file mode 100644 index 0000000..d9beb01 --- /dev/null +++ b/doc/src/ja_JP/images/linguist-hellotr_ja.png diff --git a/doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc b/doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc new file mode 100644 index 0000000..e05cd12 --- /dev/null +++ b/doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//! [0] +lupdate -verbose hellotr.pro +//! [0] + + +//! [1] +<!DOCTYPE TS><TS> +<context> + <name>QPushButton</name> + <message> + <source>Hello world!</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> +//! [1] + + +//! [2] +linguist hellotr_ja.ts +//! [2] + + +//! [3] +<translation type='unfinished'></translation> +//! [3] + + +//! [4] +<translation>こんにちは、世界!</translation> +//! [4] diff --git a/doc/src/ja_JP/tutorials/addressbook.qdoc b/doc/src/ja_JP/tutorials/addressbook.qdoc new file mode 100644 index 0000000..9fb1059 --- /dev/null +++ b/doc/src/ja_JP/tutorials/addressbook.qdoc @@ -0,0 +1,1070 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page tutorials-addressbook.html + + \title チュートリアル: アドレス帳 + \brief シンプルだが、完全な機能を持つアプリケーションの作成を通じた + GUI プログラミングへの導入。 + + このチュートリアルでは、Qt クロスプラットフォームフレームワークを使用した + GUI プログラミングの概要について説明しています。 + + \image addressbook-tutorial-screenshot.png + + \omit + It doesn't cover everything; the emphasis is on teaching the programming + philosophy of GUI programming, and Qt's features are introduced as needed. + Some commonly used features are never used in this tutorial. + \endomit + + このチュートリアルでは以下に示す Qt の基本的な機能を学ぶことが出来ます: + + \list + \o ウィジェットとレイアウトマネージャ + \o コンテナクラス + \o シグナル/スロット + \o 入力デバイスと出力デバイス + \endlist + + Qt を初めて利用する方は、最初に \l{How to Learn Qt} をご覧ください。 + + チュートリアルの目次: + + \list 1 + \o \l{tutorials/addressbook/part1}{ユーザインターフェースの設計} + \o \l{tutorials/addressbook/part2}{アドレスの追加} + \o \l{tutorials/addressbook/part3}{項目間のナビゲーション} + \o \l{tutorials/addressbook/part4}{アドレスの編集と削除} + \o \l{tutorials/addressbook/part5}{検索機能の追加} + \o \l{tutorials/addressbook/part6}{読み込みと保存} + \o \l{tutorials/addressbook/part7}{その他の機能} + \endlist + + このチュートリアルのソースコードは、Qt の + \c examples/tutorials/addressbook ディレクトリに置かれています。 + + この小さなアプリケーションは本格的な最新の GUI + アプリケーションのようには見えませんが、 + 複雑なアプリケーションで使用される多くの基本的な技術が採用されています。 + このチュートリアルが終わったら、 + メニューやツールバー、ステータスバーなどを表示する + 小さな GUI アプリケーションである + \l{mainwindows/application}{Application} + のサンプルをチェックすることをお勧めします。 + +*/ + +/*! + \page tutorials-addressbook-part1.html + + \example tutorials/addressbook/part1 + \title 第1章 - ユーザインターフェースのデザイン + + 本チュートリアルの第1章では + アドレス帳アプリケーションで使用する基本的なインターフェース + (GUI) の設計について説明します。 + + GUI プログラム作成の最初のステップは、 + ユーザインターフェースを設計することです。 + 本章の目標は、基本的なアドレス帳アプリケーションを実装するのに必要な + ラベルと入力フィールドを設定することです。 + 下図は、ここで作成しようとしているアドレス帳のスクリーンショットです。 + + \image addressbook-tutorial-part1-screenshot.png + + ユーザがアドレス帳に名前や住所を入力できるようにするには、 + 2つの QLabel のオブジェクトである \c nameLabel 及び \c addressLabel と、 + 入力フィールドとして QLineEdit オブジェクトの \c nameLine と + QTextEdit オブジェクトの \c addressText が必要です。 + 使用するウィジェットとその配置は下図に示してあります。 + + \image addressbook-tutorial-part1-labeled-screenshot.png + + 以下の3つのファイルを使用してこのアドレス帳を実装します: + + \list + \o \c{addressbook.h} - \c AddressBook クラスを宣言するファイル、 + \o \c{addressbook.cpp} - \c AddressBook クラスを実装するファイル、 + \o \c{main.cpp} - \c AddressBook クラスのインスタンスを持つ + \c main() 関数を含むファイル。 + \endlist + + \section1 Qt プログラミング - 派生クラスの作成 + + Qt プログラムを作成する際は、 + 通常 Qt オブジェクトの派生クラスを作成して機能を追加します。 + これは、カスタムウィジットや標準的なウィジェットの集合体を作成する場合の + 重要なコンセプトの1つです。 + ウィジェットの挙動の拡張や変更のために派生クラスを作成することには + 以下のような利点があります: + + \list + \o 仮想関数または純粋仮想関数の実装を行って要求される機能を実装できます。 + 必要によっては基底クラスの実装にフォールバックして利用できます。 + + \o これにより、アプリケーションのその他の部分が + ユーザインターフェースの個々のウィジェットを指定する必要がないよう、 + ユーザインターフェースの一部をクラス内にカプセル化できます。 + + \o 派生クラスは、同一のアプリケーションまたはライブラリに + 複数のカスタムウィジットを作成するために使用できます。 + また、派生クラスのコードは、他のプロジェクトで再利用可能です。 + + \endlist + + Qt ではアドレス帳ウィジェットを提供していないため、 + 標準的な Qt ウィジェットクラスを継承して機能を追加します。 + 本チュートリアルで作成する \c AddressBook クラスは、 + 基本的なアドレス帳ウィジェットが必要な場合に再利用できます。 + + \section1 AddressBook クラスの宣言 + + \l{tutorials/addressbook/part1/addressbook.h}{\c addressbook.h} + ファイルは、 \c AddressBook クラスを宣言するために使用します。 + + ここでは \c AddressBook を QWidget の派生クラスとし、 + コンストラクタを宣言することから始めます。 + また、 Q_OBJECT マクロを使用して、クラスで多言語化機能及び、 + Qt のシグナル/スロット機能が使われていることを示します。 + ただし、現段階ではこれらの機能の全てを使わない場合もあります。 + + \snippet tutorials/addressbook/part1/addressbook.h class definition + + クラスは、 前述した QLineEdit と QTextEdit のプライベートなインスタンス + \c nameLine と \c addressText の宣言を保有します。 + 後述の章で、 \c nameLine 及び \c addressText に保存したデータが、 + 多くのアドレス帳の機能で必要になることがわかるでしょう。 + + 我々が使用する QLabel オブジェクトは、 + 一旦作成すると後で参照する必要がないため、宣言する必要はありません。 + Qt でオブジェクトの所有権を追跡する方法については、次節で説明します。 + + Q_OBJECT マクロ自体は、Qt のより高度な機能を実装します。 + ここでは、 Q_OBJECT マクロを、 \l{QObject::}{tr()} 及び + \l{QObject::}{connect()} 関数を使用可能にする + ショートカットとみなしたほうが良いでしょう。 + + これで、 \c addressbook.h ファイルが完成しました。 + 次は対応する \c addressbook.cpp ファイルの実装を行います。 + + \section1 AddressBook クラスの実装 + + \c AddressBook のコンストラクタは、 \a{parent} パラメータとして + QWidget を受け取ります。 + 慣例により、このパラメータを基底クラスのコンストラクタに渡します。 + 親が複数の子を所有できるというこの所有概念は、 + Qt でウィジェットのグループ化を行う場合に有用です。 + 例えば、親を削除すると、親に属する子も全て削除されます。 + + \snippet tutorials/addressbook/part1/addressbook.cpp constructor and input fields + + このコンストラクタ内で、 \c nameLine と \c addressText のインスタンスを生成し、 + 2つのローカル QLabel オブジェクトの \c nameLabel と \c addressLabel + を宣言し、そのインスタンスを生成します。 + \l{QObject::tr()}{tr()} 関数は、 + 翻訳した文字列が存在する場合にそれを返します。 + そうでない場合は、引数の文字列自体を返します。 + この関数は文字列が他の言語に翻訳されるようにマークする役目を持ちます。 + 翻訳可能な文字列を使用するたびに、マークしてください。 + + Qt を使用してプログラミングを行う場合、 + レイアウトが機能する仕組みを理解していると便利です。 + Qt は主に、以下の3つのレイアウトクラスを提供します。 + ウィジェットの配置を処理するための QHBoxLayout 、 QVBoxLayout 及び + QGridLayout です。 + + \image addressbook-tutorial-part1-labeled-layout.png + + ここでは、 QGridLayout を使って、 + ラベルと入力フィールドを配置します。 + QGridLayout は、有効なスペースを格子状に分割し、 + 行/列番号により指定するセルに、ウィジェットを配置します。 + 上図は、レイアウトセルとウィジェットの位置を示しており、 + 以下のコードを使用して、この配置を指定します: + + \snippet tutorials/addressbook/part1/addressbook.cpp layout + + \c addressLabel は、追加引数として Qt::AlignTop を用いて配置されていることに注意してください。 + これは、セル(1,0) で縦方向の中央に配置されないようにするためです。 + Qt のレイアウトにおける基本概念については、 + \l{Layout Management} のドキュメントをご覧ください。 + + ウィジェットにレイアウトオブジェクトをインストールするには、 + ウィジェットの \l{QWidget::setLayout()}{setLayout()} + 関数を呼び出す必要があります。 + + \snippet tutorials/addressbook/part1/addressbook.cpp setting the layout + + 最後に、ウィジェットのタイトルを "Simple Address Book" とします。 + + \section1 アプリケーションを実行する + + 別のファイル \c main.cpp に、 \c main() 関数に実装します。 + この関数内で、QApplication である \c app のインスタンスを生成します。 + QApplication は、既定のフォントやカーソルなど + アプリケーションに共通な複数のリソース及び、 + イベントループの実行に関与しています。 + 従って、Qt を使用する全ての GUI アプリケーションでは、 + 必ず QApplication が存在します。 + + \snippet tutorials/addressbook/part1/main.cpp main function + + スタックに新しい \c AddressBook ウィジェットを生成し、 + \l{QWidget::show()}{show()} 関数を呼び出して表示します。 + ただし、ウィジェットはアプリケーションのイベントループが + 開始されるまで表示されません。 + アプリケーションの \l{QApplication::}{exec()} 関数を呼び出して、 + イベントループを開始します。 + この関数により返された結果は、 \c main() 関数の戻り値として使用されます。 + この時点で、スタックで \c AddressBook + をインスタンス化した理由が明らかになります。 + イベントループが終了すると \c main() 関数のスコープの外に移動します。 + それに伴って \c AddressBook 及び、 + これに属する全ての子ウィジェットが削除されるため、 + メモリリークを防ぐことができます。 +*/ + +/*! + \page tutorials-addressbook-part2.html + + \example tutorials/addressbook/part2 + \title 第2章 - アドレスの追加 + + 基本的なアドレス帳アプリケーションを作成するための次の手順は、 + ユーザからの操作を可能にすることです。 + + \image addressbook-tutorial-part2-add-contact.png + + 新しい連絡先を追加するために、 + ユーザがクリックするプッシュボタンを作成します。 + また、これらの連絡先を整理して保存するために、 + 何らかのデータ構造が必要になります。 + + \section1 AddressBook クラスの宣言 + + ラベルと入力フィールドの設定が完了しているため、 + 連絡先を追加する際に必要なプッシュボタンを追加します。 + \c addressbook.h ファイルに、 + 3つの QPushButton オブジェクトを宣言し、 + 対応する3つの public slot を作成します。 + + \snippet tutorials/addressbook/part2/addressbook.h slots + + スロットとは特定のシグナルに応答して呼び出される関数をいいます。 + このコンセプトについては、 \c AddressBook + クラスを実装する際にさらに詳細に取り上げます。 + なお、Qt のシグナル/スロットのコンセプトの概要については、 + \l{Signals and Slots} のドキュメントを参照してください。 + + 3つの QPushButton オブジェクト \c addButton 、 \c submitButton 、 + \c cancelButton は、前章の \c nameLine と \c addressText とともに、 + プライベート変数宣言に含まれています。 + + \snippet tutorials/addressbook/part2/addressbook.h pushbutton declaration + + アドレス帳の連絡先を横断して表示するには、 + 連絡先保持用のコンテナが必要です。 + QMap のオブジェクトである \c contacts をこの目的に使用します。 + \c contacts にはキーとして連絡先の名前 \e key + とそれに対応する値として連絡先の住所 \e value を格納します。 + + \snippet tutorials/addressbook/part2/addressbook.h remaining private variables + + QString の2つのプライベートオブジェクトとして \c oldName と \c oldAddress + も宣言します。 + これらのオブジェクトは、ユーザが \gui Add + をクリックする前に最後に表示した連絡先の名前と住所が含まれている必要があります。 + ユーザが \gui Cancel + をクリックすると、最後に表示した連絡先の詳細に戻って表示することが出来ます。 + + \section1 AddressBook クラスの実装 + + \c AddressBook のコンストラクタ内で、連絡先の詳細を編集することなく + 表示のみを行えるよう、 \c nameLine と \c addressText + を読み取り専用に設定します。 + + \dots + \snippet tutorials/addressbook/part2/addressbook.cpp setting readonly 1 + \dots + \snippet tutorials/addressbook/part2/addressbook.cpp setting readonly 2 + + 次に、プッシュボタン \c addButton 、 \c submitButton 、 \c cancelButton + のインスタンスを生成します。 + + \snippet tutorials/addressbook/part2/addressbook.cpp pushbutton declaration + + \c addButton を、 \l{QPushButton::show()} 関数を呼び出して表示します。 + \c submitButton と \c cancelButton は、 + \l{QPushButton::hide()}{hide()} を呼び出して非表示にします。 + これら2つのプッシュボタンはユーザが \gui Add + をクリックした場合にのみ表示され、後に説明する + \c addContact() によって処理されます。 + + \snippet tutorials/addressbook/part2/addressbook.cpp connecting signals and slots + + 各プッシュボタンの \l{QPushButton::clicked()}{clicked()} を、 + それぞれのスロットに接続します。 + 下図はこれを説明したものです。 + + \image addressbook-tutorial-part2-signals-and-slots.png + + 次に、 QVBoxLayout を使用して、 + アドレス帳ウィジェットの右側にプッシュボタンを + 上下一列に配置します。 + + \snippet tutorials/addressbook/part2/addressbook.cpp vertical layout + + \l{QBoxLayout::addStretch()}{addStretch()} 関数は、 + プッシュボタンを等間隔に並べるのではなく、 + ウィジェット上部に近づけて配置するために使用します。 + 下図は、\l{QBoxLayout::addStretch()}{addStretch()} を使用した場合と、 + 使用しない場合の違いを示しています。 + + \image addressbook-tutorial-part2-stretch-effects.png + + 次に、\l{QGridLayout::addLayout()}{addLayout()} を使用して、 + \c buttonLayout1 を \c mainLayout に追加します。 + \c buttonLayout1 は \c mainLayout の子となり、 + レイアウトが入れ子になりました。 + + \snippet tutorials/addressbook/part2/addressbook.cpp grid layout + + レイアウトの配置は以下のようになります: + + \image addressbook-tutorial-part2-labeled-layout.png + + \c addContact() では、最後に表示した連絡先の詳細を、 + \c oldName と \c oldAddress に保存します。 + 次に、これらの入力フィールドをクリアし、読み取り専用モードを解除します。 + \c nameLine にフォーカスをセットして、 \c submitButton と \c cancelButton を表示します。 + + \snippet tutorials/addressbook/part2/addressbook.cpp addContact + + \c submitContact() 関数は、以下の次の3つの要素から成ります: + + \list 1 + + \o \c nameLine 及び \c addressText から連絡先の詳細を抽出し、 + QString オブジェクトに保存します。 + また、ユーザが入力フィールドに何も入力せずに + \gui Submit をクリックしないよう確認します。 + どちらかのフィールドが空であれば、ユーザに名前と住所の入力を求める + QMessageBox が表示されます。 + + \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part1 + + \o 続けて、連絡先が既に存在するかどうか確認します。 + 存在しない場合は \c contacts に連絡先を追加して QMessageBox を表示し、 + 連絡先が追加されたことをユーザに知らせます。 + + \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part2 + + 連絡先が既に存在する場合、 QMessageBox を表示し、 + 連絡先が重複して追加されないように + 連絡先が存在することをユーザに知らせます。 + \c contacts オブジェクトは、名前と住所のキー値のペアで構成されているため、 + \e key が一意であることを確認します。 + + \o 上記の両方の事例に対処したら、 + 以下のコードを使ってプッシュボタンを通常の状態に戻します: + + \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part3 + + \endlist + + 以下のスクリーンショットは、ユーザに情報メッセージを表示するために使用する + QMessageBox オブジェクトです。 + + \image addressbook-tutorial-part2-add-successful.png + + \c cancel() 関数は、最後に表示した連絡先の詳細を復元して + \c addButton を有効にし、 \c submitButton と \c cancelButton + を非表示にします。 + + \snippet tutorials/addressbook/part2/addressbook.cpp cancel + + 連絡先を追加する際の概念は、ユーザがいつでも自由に + \gui{送信} または \gui{キャンセル} をクリックできるようにすることです。 + 以下のフローチャートは、この概念を詳細に説明しています: + + \image addressbook-tutorial-part2-add-flowchart.png +*/ + +/*! + \page tutorials-addressbook-part3.html + + \example tutorials/addressbook/part3 + \title 第3章 - 項目間のナビゲーション + + アドレス帳アプリケーションは、半分完成しました。 + 次に表示する連絡先を変更するために、いくつかの関数を追加します。 + しかし、最初に、これらの連絡先を保存するために使用するデータ構造の種類を決める必要があります。 + + 第2章では、連絡先の名前 \e key 及び、連絡先の住所 \e value + の鍵と値のペアで QMap を使用しました。 + これは、この事例で使用するのに適した構造です。 + ただし、各項目間を移動して表示するには、多少の機能拡張が必要です。 + + QMap を、最初の要素と最後の要素を含むすべての要素が接続された + 循環リストに似たデータ構造に、機能拡張します。 + 下図はこのデータ構造を説明したものです。 + + \image addressbook-tutorial-part3-linkedlist.png + + \section1 AddressBook クラスの宣言 + + アドレス帳アプリケーションにナビゲーション機能を追加するには、 + \c AddressBook クラスに2つのスロットを追加する必要があります。 + next() 及び \c previous() を + \c addressbook.h ファイルに追加します。 + + \snippet tutorials/addressbook/part3/addressbook.h navigation functions + + また、新たに2つの QPushButton オブジェクトが必要になります。 + プライベート変数として + \c nextButton と \c previousButton を宣言します。 + + \snippet tutorials/addressbook/part3/addressbook.h navigation pushbuttons + + \section1 AddressBook クラスの実装 + + \c addressbook.cpp の \c AddressBook コンストラクタでは、 + \c nextButton と \c previousButton のインスタンスを生成し + 初期設定で無効にします。 + これは、アドレス帳に複数の連絡先が存在しない場合、 + ナビゲーションを有効にしないためです。 + + \snippet tutorials/addressbook/part3/addressbook.cpp navigation pushbuttons + + これらのプッシュボタンを、それぞれスロットに接続します: + + \snippet tutorials/addressbook/part3/addressbook.cpp connecting navigation signals + + 以下の画像は、ここで作成しようとしている + グラフィカルユーザインターフェースです。 + 最終アプリケーションが完成間近であることがわかるでしょう。 + + \image addressbook-tutorial-part3-screenshot.png + + \c next() と \c previous() では基本的な規約に従って、 + \c nextButton を右側に、 \c previousButton を左側に配置します。 + 直感的でわかりやすいレイアウトに仕上げるために、 + QHBoxLayout を使用してウィジェットを横に並べて配置します: + + \snippet tutorials/addressbook/part3/addressbook.cpp navigation layout + + 次に、 \c mainLayout に、QHBoxLayout のオブジェクトである + \c buttonLayout2 を追加します。 + + \snippet tutorials/addressbook/part3/addressbook.cpp adding navigation layout + + 下図は、 \c mainLayout のウィジェットの配置を示します。 + \image addressbook-tutorial-part3-labeled-layout.png + + \c addContact() 関数内部では、 + ユーザが連絡先を追加しているときに移動しないよう、 + これらのボタンを無効にする必要があります。 + + \snippet tutorials/addressbook/part3/addressbook.cpp disabling navigation + + また、 \c submitContact() 関数では、 \c contacts のサイズに応じて、 + ナビゲーションボタン \c nextButton 及び \c previousButton を有効にします。 + 前述のように、アドレス帳に複数の連絡先が存在しない場合は、 + ナビゲーションを有効にできません。 + 以下のコードは、その処理方法を示しています。 + + \snippet tutorials/addressbook/part3/addressbook.cpp enabling navigation + + \c cancel() 関数にも、これらの処理を含めます。 + + ここで、QMap のオブジェクト \c contacts を使って、 + 循環リストをエミュレートしましょう。 + \c next() 関数で、 \c contacts のイテレータを作成し、次に: + + \list + \o イテレータが \c contacts の末尾にない場合は、次の項目に移動します。 + + \o イテレータが \c contacts の末尾にある場合は、 + \c contacts の先頭に移動します。 + これによって、QMap が循環リストのように機能するという印象を与えます。 + \endlist + + \snippet tutorials/addressbook/part3/addressbook.cpp next() function + + \c contacts 内の正しいオブジェクトに移動したら、 + \c nameLine と \c addressText に内容を表示します。 + + 同様に、 \c previous() 関数で、 \c contacts のイテレータを作成し、次に: + \list + \o イテレータが \c contacts の末尾にある場合は、 + 表示をクリアして戻ります。 + + \o イテレータが \c contacts の先頭にある場合は、末尾に移動します。 + + \o イテレータを直前の項目に移動します。 + \endlist + + \snippet tutorials/addressbook/part3/addressbook.cpp previous() function + + もう一度、 \c contacts に現在のオブジェクトの内容を表示します。 +*/ + +/*! + \page tutorials-addressbook-part4.html + + \example tutorials/addressbook/part4 + \title 第4章 - アドレスの編集と削除 + + 本章では、アドレス帳アプリケーションに保存されている + 連絡先の内容を変更する方法について説明します。 + + \image addressbook-tutorial-screenshot.png + + ここでは、連絡先を整理して保存するだけでなく、 + ナビゲーションが可能なアドレス帳を作成します。 + 必要に応じて連絡先の詳細を変更できるよう、 + 編集・削除機能を追加すると便利です。 + ただし、列挙型書式の若干の改善が必要になります。 + 前章では、次の2つのモードを扱いました: + \c AddingMode 及び \c NavigationMode - + ただし、これらは列挙型として定義しませんでした。 + 代わりに、対応するボタンを手動で有効または無効にし、 + 複数行のコードを繰り返します。 + + 本章では、以下のような2つの異なる値を持つ \c Mode 列挙型を定義します: + + \list + \o \c{NavigationMode} + \o \c{AddingMode} + \o \c{EditingMode} + \endlist + + \section1 AddressBook クラスの宣言 + + \c addressbook.h ファイルをアップデートし、 \c Mode 列挙型を追加します: + + \snippet tutorials/addressbook/part4/addressbook.h Mode enum + + また、public slot として2つの新しいスロット + \c editContact() 及び \c removeContact() を追加します。 + + \snippet tutorials/addressbook/part4/addressbook.h edit and remove slots + + モードを切り替えるために、すべての QPushButton オブジェクトの + 有効化/無効化を制御する \c updateInterface() 関数を導入します。 + また、前述の編集と削除を行うスロット用に、2つの新しいボタン + \c editButton 及び \c removeButton を追加します。 + + \snippet tutorials/addressbook/part4/addressbook.h updateInterface() declaration + \dots + \snippet tutorials/addressbook/part4/addressbook.h buttons declaration + \dots + \snippet tutorials/addressbook/part4/addressbook.h mode declaration + + 最後に、現在のモードを保持する列挙型の \c currentMode を宣言します。 + + \section1 AddressBook クラスの実装 + + ここで、アドレス帳アプリケーションのモード変更機能を実装する必要があります。 + アドレス帳をはじめて起動するときは、 + メモリに連絡先が保存されていないため、 + コンストラクタでは、 \c editButton 及び \c removeButton + のインスタンスの生成と無効化を行います。 + + \snippet tutorials/addressbook/part4/addressbook.cpp edit and remove buttons + + また、ボタンをそれぞれのスロット \c editContact() 及び \c removeContact() + に接続し、 \c buttonLayout1 に追加します。 + + \snippet tutorials/addressbook/part4/addressbook.cpp connecting edit and remove + \dots + \snippet tutorials/addressbook/part4/addressbook.cpp adding edit and remove to the layout + + \c editContact() は、モードを \c EditingMode に切り替える前に、 + 連絡先の古い詳細情報を、 \c oldName と \c oldAddress に保存します。 + このモードでは、 \c submitButton と \c cancelButton + の両方が有効になるため、ユーザは連絡先の詳細を変更し、 + どちらか一方のボタンをクリックできます。 + + \snippet tutorials/addressbook/part4/addressbook.cpp editContact() function + + \c submitContact() 関数は、 \c{if-else} ステートメントにより、 + 2つの処理に分割しています。 + \c currentMode が \c AddingMode であるかどうかを確認します。 + その場合、連絡先追加の処理を行います。 + + \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function beginning + \dots + \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function part1 + + \c AddingMode でない場合、 \c currentMode が \c EditingMode + であるかどうか確認します。 + その場合、 \c oldName を \c name と比較します。 + 名前を変更した場合、 \c contacts から古い連絡先を削除し、 + 新たに更新した連絡先を挿入します。 + + \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function part2 + + 住所のみを変更した場合 (たとえば、 \c oldAddress は \c address と異なる)、 + 連絡先の住所を更新します。 + 最後に、 \c currentMode を \c NavigationMode に設定します。 + これは、無効にしたプッシュボタンをすべて再び有効にするための重要なステップです。 + + アドレス帳から連絡先の削除を行う + \c removeContact() 関数を実装します。 + この関数では、まず連絡先が \c contacts に存在するかどうか確認します。 + + \snippet tutorials/addressbook/part4/addressbook.cpp removeContact() function + + 存在する場合、ユーザに削除を確認するために、QMessageBox を表示します。 + ユーザが確認したら、 \c previous() を呼び出して、 + ユーザインターフェースで他の連絡先を表示できることを確認し、 + QMap の \l{QMap::remove()}{remove()} 関数を使用して連絡先を削除します。 + 念のため、QMessageBox を表示してユーザに知らせます。 + この関数で使用するメッセージボックスを以下に示します: + + \image addressbook-tutorial-part4-remove.png + + \section2 ユーザインターフェースを更新する + + 既に、 \c updateInterface() 関数が + 現在のモードに応じてプッシュボタンの有効化と無効化を行うための + 手段であることを説明しました。 + この関数は、渡される \c mode 引数に応じて現在のモードを更新します。 + なお、引数の値を確認する前に \c currentMode に代入しています。 + + このとき、それぞれのプッシュボタンは、 + 現在のモードに応じて有効または無効になります。 + \c AddingMode 及び \c EditingMode でのコードを以下に示します: + + \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 1 + + \c NavigationMode の場合、 QPushButton::setEnabled() + 関数のパラメータに条件を含めます。 + これは、アドレス帳に少なくとも1つ以上の連絡先が存在する場合に、 + \c editButton と \c removeButton が有効であることを確認するためのものです。 + \c nextButton と \c previousButton は、 + アドレス帳に少なくとも2つ以上の連絡先が存在する場合にのみ有効になります。 + + \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 2 + + モードの設定及び、同一関数内でのユーザインターフェースの更新を行うタスクを実行することにより、 + アプリケーションの内部状態により + ユーザインターフェースが「非同期」になる可能性を防ぎます。 +*/ + +/*! + \page tutorials-addressbook-part5.html + + \example tutorials/addressbook/part5 + \title 第5章 - 検索機能の追加 + + 本章では、アドレス帳アプリケーションの連絡先と住所を + 検索する方法について説明します。 + + \image addressbook-tutorial-part5-screenshot.png + + アドレス帳アプリケーションへ連絡先の追加を繰り返すと、 + \e Next 及び \e Previous ボタンによる連絡先のナビゲートが面倒になります。 + この場合、\e{検索(Find)}機能を使うと、 + 連絡先の検索をより効率的に行うことができます。 + 上記スクリーンショットは、\e Find ボタン及び、 + パネル上のボタンの位置を示します。 + + ユーザーが \e Find ボタンをクリックすると、 + 連絡先の名前の入力を求めるダイアログを表示します。 + Qt が提供する QDialog クラスを継承して \c FindDialog クラスを導入します。 + + \section1 FindDialog クラスの宣言 + + \image addressbook-tutorial-part5-finddialog.png + + QDialog を継承するには、最初に、QDialog のヘッダーを + \c finddialog.h ファイルで include する必要があります。 + また、これらのウィジェットをダイアログクラスで使用するため、 + 前方宣言を使用して QLineEdit と QPushButton を宣言します。 + + \c AddressBook クラスと同様に、 \c FindDialog クラスには Q_OBJECT + マクロが含まれ、ダイアログが別のウィンドウとして開かれる場合でも、 + コンストラクタは親 QWidget を取るように定義されます。 + + \snippet tutorials/addressbook/part5/finddialog.h FindDialog header + + \c FindDialog のインスタンスを保持するクラスにより使用される + パブリック関数 \c getFindText() を定義します。 + この関数を経由してユーザが入力した検索文字列を取得します。 + また、ユーザが \gui Find ボタンをクリックしたときに検索文字列を処理するために、 + public slot として \c findClicked() を定義します。 + + 最後に、\gui Find ボタンに対応するプライベート変数として \c findButton 、 + ユーザが検索文字列を入力するラインエディット \c lineEdit 及び、 + 後の作業で使用する検索文字列を保存するために使用する内部文字列として + \c findText の定義を行います。 + + \section1 FindDialog クラスの実装 + + \c FindDialog のコンストラクタ内で、プライベート変数の + \c lineEdit 、 \c findButton 及び \c findText を設定します。 + QHBoxLayout を用いてウィジェットを配置します。 + + \snippet tutorials/addressbook/part5/finddialog.cpp constructor + + シグナルをそれぞれのスロットに接続し、 + レイアウトとウィンドウのタイトルを設定します。 + \c findButton の \l{QPushButton::clicked()} シグナルは、 + \c findClicked() と \l{QDialog::accept()}{accept()} + に接続されていることがわかります。 + QDialog により提供される \l{QDialog::accept()}{accept()} スロットは + ダイアログを非表示にして、結果コードを \l{QDialog::}{Accepted} + に設定します。 + この関数を使用して、 \c AddressBook の \c findContact() 関数に、 + \c FindDialog オブジェクトが閉じていることを知らせます。 + この論理については、 \c findContact() 関数について取り上げる際に、 + さらに詳細に説明します。 + + \image addressbook-tutorial-part5-signals-and-slots.png + + \c findClicked() で、ユーザが連絡先の名前を入力せずに + \gui Find ボタンをクリックしたかどうか確認するために + \c lineEdit を検証します。 + 次に、 \c lineEdit から抽出した検索文字列を \c findText に設定します。 + その後、 \c lineEdit のコンテンツをクリアし、ダイアログを非表示にします。 + + \snippet tutorials/addressbook/part5/finddialog.cpp findClicked() function + + \c findText 変数用のパブリックな取得関数 + \c getFindText() を実装します。 + コンストラクタ及び \c findClicked() 関数でのみ + \c findText を直接設定するため、 + \c getFindText() に対応する設定関数は作成しません。 + \c getFindText() はパブリックであるため、インスタンスを生成し + \c FindDialog を使用するクラスは、 + ユーザが入力して確定した検索文字列にいつでもアクセスできます。 + + \snippet tutorials/addressbook/part5/finddialog.cpp getFindText() function + + \section1 AddressBook クラスの宣言 + + \c AddressBook クラス内部から \c FindDialog を使用できるよう、 + \c addressbook.h ファイルに \c finddialog.h を含めます。 + + \snippet tutorials/addressbook/part5/addressbook.h include finddialog's header + + これまでのところ、アドレス帳の全機能に、 + QPushButton とそのボタンに対応するスロットが含まれています。 + 同様に、\gui{検索(Find)}機能には、 + \c findButton 及び \c findContact() が含まれています。 + + \c findButton はプライベート変数として宣言され、 + \c findContact() 関数は public slot として宣言されます。 + + \snippet tutorials/addressbook/part5/addressbook.h findContact() declaration + \dots + \snippet tutorials/addressbook/part5/addressbook.h findButton declaration + + 最後に、 \c FindDialog のインスタンスを参照するためのプライベート変数 + \c dialog を宣言します。 + + \snippet tutorials/addressbook/part5/addressbook.h FindDialog declaration + + インスタンス化されたダイアログは複数回使用します。 + プライベート変数を使用すると、 + クラスの複数の場所から参照できるようになります。 + + \section1 AddressBook クラスの実装 + + \c AddressBook クラスのコンストラクタ内で、 + プライベートオブジェクトの \c findButton と \c findDialog + のインスタンスを生成します: + + \snippet tutorials/addressbook/part5/addressbook.cpp instantiating findButton + \dots + \snippet tutorials/addressbook/part5/addressbook.cpp instantiating FindDialog + + 次に、 \c findButton の \l{QPushButton::clicked()}{clicked()} シグナルを、 + \c findContact() に接続します。 + + \snippet tutorials/addressbook/part5/addressbook.cpp signals and slots for find + + 後は、 \c findContact() 関数のコードだけです: + + \snippet tutorials/addressbook/part5/addressbook.cpp findContact() function + + \c FindDialog インスタンスの \c dialog を表示することから始めます。 + これは、ユーザが検索用に連絡先の名前を入力するためのものです。 + ユーザがダイアログの \c findButton をクリックすると + ダイアログが非表示になり、結果コードが QDialog::Accepted に設定されます。 + これにより、 \c if ステートメントが常に真になります。 + + 続けて、検索文字列の抽出を行います。 + この場合、検索文字列は \c contactName で、 + \c FindDialog の \c getFindText() 関数を使用して取得します。 + アドレス帳に連絡先が存在する場合、直ちに表示します。 + 存在しない場合、検索が失敗したことを示す以下の QMessageBox が表示されます。 + + \image addressbook-tutorial-part5-notfound.png +*/ + +/*! + \page tutorials-addressbook-part6.html + + \example tutorials/addressbook/part6 + \title 第6章 - 読み込みと保存 + + 本章では、アドレス帳アプリケーションの読み込みと保存処理で使用する、 + Qt のファイル処理機能について説明します。 + + \image addressbook-tutorial-part6-screenshot.png + + 連絡先の参照及び検索機能は便利な機能ですが、 + 連絡先の保存と読み込みが可能になるまではアドレス帳は完成しません。 + + Qt は \l{Input/Output and Networking}{入出力} + 用のクラスを様々提供していますが、 + 今回は簡単に組み合わせて使用できる QFile と QDataStream の2つのクラスを選択しました。 + + QFile のオブジェクトは、 + 読み込みと書き込みが可能なディスク上のファイルを表します。 + QFile は、さまざまなデバイスを表すより一般的な QIODevice クラスの派生クラスです。 + + QDataStream オブジェクトは、バイナリデータを QIODevice に保存して、 + 後でもう一度取得できるようシリアライズするために使用します。 + パラメータとしてそれぞれのデバイスを使用すると、 + ストリームを開くのと同じくらい簡単に、 QIODevice + からの読み込みと書き込みを行うことができます。 + + \section1 AddressBook クラスの宣言 + + 2つの QPushButton オブジェクトの \c loadButton と \c saveButton + に加えて、2つの public slot の \c saveToFile() と \c loadFromFile() + を宣言します。 + + \snippet tutorials/addressbook/part6/addressbook.h save and load functions declaration + \dots + \snippet tutorials/addressbook/part6/addressbook.h save and load buttons declaration + + \section1 AddressBook クラスの実装 + + コンストラクタで、 \c loadButton と \c saveButton のインスタンスを生成します。 + 理想的には、プッシュボタンのラベルを、 + "Load contacts from a file"(「ファイルから連絡先を読み込む」)及び、 + "Save contacts to a file"(「連絡先をファイルに保存する」) + に設定するほうがよりユーザーフレンドリーです。 + ただし、他のプッシュボタンのサイズを考慮して、 + \gui{Load...}及び\gui{Save...}に設定します。 + Qt は、 \l{QWidget::setToolTip()}{setToolTip()} を使用して + ツールチップを簡単に設定する方法を提供していますので、 + 以下のコードでプッシュボタンにツールチップを設定します: + + \snippet tutorials/addressbook/part6/addressbook.cpp tooltip 1 + \dots + \snippet tutorials/addressbook/part6/addressbook.cpp tooltip 2 + + ここには記載していませんが、 + これまで実装した他の機能のように右側のレイアウトパネル + \c button1Layout にプッシュボタンを追加し、 + プッシュボタンの \l{QPushButton::clicked()}{clicked()} + シグナルをそれぞれのスロットに接続します。 + + 保存機能の場合、最初に QFileDialog::getSaveFileName() を使用して、 + \c fileName を取得します。 + これは、QFileDialog により提供される簡易関数で、 + モーダルなファイルダイアログをポップアップ表示させ、 + ユーザはファイル名を入力したり、既存の \c{.abk} ファイルを選択することが出来ます。 + \c{.abk} ファイルは、 + 連絡先を保存したときに作成されるアドレス帳の拡張子です。 + + \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part1 + + 以下のスクリーンショットのようなネイティブのファイルダイアログが表示されます: + + \image addressbook-tutorial-part6-save.png + + \c fileName が空ではない場合、 \c fileName を用いて + QFile のオブジェクト \c file を作成します。 + QFile は QIODevice の派生クラスであるため、 + QDataStream から使用できます。 + + 次に、ファイルを \l{QIODevice::}{WriteOnly} モードでオープンします。 + オープンに失敗した場合、 QMessageBox を表示してユーザに知らせます。 + + \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part2 + + オープンに成功した場合、 QDataStream のインスタンス \c out を生成して、 + 開いているファイルに書き込みます。 + QDataStream では、同じバージョンのストリームを使用して、 + 読み込みと書き込みを行う必要があります。 + \c file にシリアライズする前に、 + \l{QDataStream::Qt_4_5}{Qt 4.5で導入されたバージョン} + を今回使用するバージョンとして設定します。 + + \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part3 + + 読み込み機能の場合も QFileDialog::getOpenFileName() を使用して + \c fileName を取得します。 + この関数は QFileDialog::getSaveFileName() に対応するものであり、 + モーダルなファイルダイアログをポップアップ表示させ、 + ユーザはファイル名を入力したり、既存の \c{.abk} + ファイルを選択してアドレス帳に読み込ことができます。 + + \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part1 + + たとえば、 Windows では、この関数は、以下のスクリーンショットのような + ネイティブのファイルダイアログをポップアップ表示させます。 + + \image addressbook-tutorial-part6-load.png + + \c fileName が空ではない場合、 QFile のオブジェクト + \c file を使用して、 \l{QIODevice::}{ReadOnly} モードでオープンします。 + \c saveToFile() の実装の場合と同様に、オープンに失敗した場合は + QMessageBox を表示して、ユーザに知らせます。 + + \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part2 + + オープンに成功した場合、 + QDataStream のインスタンス \c in を生成して前記のようにバージョン設定を行い、 + シリアライズしたデータを \c contacts のデータ構造に読み込みます。 + \c contacts オブジェクトはデータが読み込まれる前に空にするので、 + ファイルの読み込みプロセスは簡素化されます。 + より高度な方法では、一時オブジェクトの QMap に読み込んで、 + 重複していない連絡先を \c contacts にコピーします。 + + \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part3 + + ファイルから読み込んだ連絡先を表示するには、 + 最初に取得したデータを検証し、 + 読み込んだファイルにアドレス帳の連絡先が実際に含まれているか確認します。 + 含まれている場合、最初の連絡先を表示します。 + 含まれていない場合、QMessageBox を表示して、 + 問題があることをユーザに知らせます。 + 最後にインターフェースを更新し、適宜 + プッシュボタンの有効化と無効化を行います。 +*/ + +/*! + \page tutorials-addressbook-part7.html + + \example tutorials/addressbook/part7 + \title 第7章 - 追加機能 + + 本章では、アドレス帳アプリケーションを + 普段の生活で便利に使用するための追加機能について説明します。 + + \image addressbook-tutorial-part7-screenshot.png + + アドレス帳アプリケーションは、それ自体で便利ですが、 + 他のアプリケーションとデータの交換ができればなお便利です。 + vCard 形式は、この目的で使用可能な一般的なファイル形式です。 + 本章では、連絡先を vCard ファイル(\c{.vcf}) + にエクスポートできるよう、アドレス帳クライアントを拡張します。 + + \section1 AddressBook クラスの宣言 + + QPushButton のオブジェクト \c exportButton 及び、 + 対応する public slot の \c exportAsVCard() を + \c addressbook.h ファイルの \c AddressBook クラスに追加します。 + + \snippet tutorials/addressbook/part7/addressbook.h exportAsVCard() declaration + \dots + \snippet tutorials/addressbook/part7/addressbook.h exportButton declaration + + \section1 AddressBook クラスの実装 + + \c AddressBook のコンストラクタで、 \c exportButton の + \l{QPushButton::clicked()}{clicked()} シグナルを + \c exportAsVCard() に接続します。 + このボタンも、右側のボタンのパネルの処理を行うレイアウトである + \c buttonLayout1 に追加します。 + + \c exportAsVCard() 関数では、 + 連絡先の名前を \c name に抽出することから始めます。 + \c firstName 、 \c lastName 及び \c nameList を宣言します。 + 次に \c name を検索し、最初の空白のインデックスを取得します。 + 空白が存在する場合、連絡先の名前を \c firstName と + \c lastName に分割します。 + 次に、空白をアンダースコア ("_") に置き換えます。 + 空白が存在しない場合は、連絡先にファーストネーム(名) + しか保存されていない可能性があります。 + + \snippet tutorials/addressbook/part7/addressbook.cpp export function part1 + + \c saveToFile() 関数と同様に、ユーザがファイルの場所を選択できるよう + ファイルダイアログを開きます。 + 選択したファイル名を使用して、 + 書き込みを行うための QFile のインスタンスを生成します。 + + ファイルを \l{QIODevice::}{WriteOnly} モードでオープンします。 + オープンに失敗した場合、 QMessageBox を表示して、 + 問題があることをユーザに知らせて戻ります。 + オープンに成功した場合、 QTextStream のオブジェクト \c out へ + パラメータファイルを渡します。 + QDataStream のように、QTextStream クラスは、 + プレーンテキストファイルの読み込みと書き込みを行う機能を提供します。 + 結果として、生成された \c{.vcf} は + テキストエディターで開いて編集することができます。 + + \snippet tutorials/addressbook/part7/addressbook.cpp export function part2 + + まず \c{BEGIN:VCARD} タグ、次に \c{VERSION:2.1} タグの順に + vCard ファイルに書き込みます。 + 連絡先の名前は、 \c{N:} タグを使用して書き込みます。 + vCard の "File as" プロパティを設定する \c{FN:} タグを書き込む際は、 + 連絡先にラストネーム(姓)が含まれているかどうかを確認する必要があります。 + 含まれている場合、 \c nameList の情報を使用して入力します。 + 含まれていない場合、 \c firstName のみを書き込みます。 + + \snippet tutorials/addressbook/part7/addressbook.cpp export function part3 + + 続けて連絡先の住所の書き込みを行います。 + 住所のセミコロンには、"\\" をエスケープ文字として追加する必要があります。 + 改行はセミコロンに置き換えられ、コンマはスペースに置き換えられます。 + 次に、 \c{ADR;HOME:;} タグ、 \c address 、 + \c{END:VCARD} タグの順に書き込みます。 + + \snippet tutorials/addressbook/part7/addressbook.cpp export function part4 + + 最後に、vCard のエクスポートに成功したことをユーザに知らせるために、 + QMessageBox が表示されます。 + + \e{vCard は、\l{http://www.imc.org}{Internet Mail Consortium} の登録商標です。} +*/ diff --git a/doc/src/ja_JP/tutorials/widgets-tutorial.qdoc b/doc/src/ja_JP/tutorials/widgets-tutorial.qdoc new file mode 100644 index 0000000..6a6b1a2 --- /dev/null +++ b/doc/src/ja_JP/tutorials/widgets-tutorial.qdoc @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page widgets-tutorial.html + \title ウィジェットのチュートリアル + \brief 本チュートリアルではウィジェットとレイアウトの基本的な使い方を説明し、それらが GUI アプリケーションの開発でどのように使われるかを説明します。 + + \section1 はじめに + + ウィジェットは Qt によるグラフィカルユーザインターフェース(GUI)アプリケーションの基本構成要素です。 + ボタン、ラベル、テキストエディターなどの各 GUI コンポーネントはウィジェットであり、 + 既存のウィンドウのユーザーインタフェース内に配置したり、独立したウィンドウとして表示することができます。 + それぞれのコンポーネントは QWidget の派生クラスとして実装されます。 + QWidget 自体は QObject の派生クラスです。 + + QWidget は抽象クラスではなく、 + 他のウィジェット用のコンテナとして使用されたり、 + カスタムウィジェットを作る場合の基底クラスとして使用されます。 + 他のウィジェットを配置するウィンドウとしてもよく使われます。 + + \l{QObject} と同様に QWidget は所有権を示すために親オブジェクトを指定して生成できるため、 + 親オブジェクトが使用されなくなった場合には破棄されます。 + ウィジェットではこの親子関係が他の意味も持ちます。 + 子ウィジェットは親ウィジェットが使用する領域内に表示されます。 + これは、ウィンドウを削除するとそのウィンドウに含まれる全てのウィジェットが自動的に破棄されることを意味します。 + + \section1 main 関数の記述 + + Qt の GUI サンプルの多くは標準的なアプリケーションの初期化コードを含む + \c{main.cpp} ファイルと、アプリケーションのロジックやカスタム + GUI コンポーネントを含むいくつかのソース/ヘッダファイルから構成されています。 + + \c{main.cpp} 内の典型的な \c main() 関数は以下のようになります: + + \snippet doc/src/snippets/widgets-tutorial/template.cpp main.cpp body + + 最初に、コマンドラインから渡される引数を渡して QApplication のオブジェクトを生成します。 + ウィジェットを生成して表示した後、 QApplication::exec() を呼び出して Qt のイベントループを開始します。 + この関数から戻ってくるまでアプリケーションの制御は Qt 側にて行われます。最後に、\c{main()} は QApplication::exec() から取得された値を返します。 + + \section1 簡単なウィジェットのサンプル + + 以下の簡単なウィジェットのサンプルでは \c main() 関数の中にコードを記述しています。 + + \list + \o \l {tutorials/widgets/toplevel}{ウィンドウの作成} + + \o \l {tutorials/widgets/childwidget}{子ウィジェット} + + \o \l {tutorials/widgets/windowlayout}{レイアウトの利用} + + \o \l {tutorials/widgets/nestedlayouts}{複雑なレイアウト} + \endlist + + \section1 複雑なウィジェットのサンプル + + \l{Widgets examples}{より高度なサンプル} の場合、ウィジェットやレイアウトのためのコードは他のファイルに記述されています。 + 例えば、メインウインドウ用の GUI は、 QMainWindow 派生クラスのコンストラクタで作成されるでしょう。 + + \section1 サンプルのビルド + + Qt のバイナリパッケージを取得してインストールするか、Qt を自分でコンパイルした場合には既にこのチュートリアルで説明されているサンプルはビルドされ、実行する準備ができています。 + これらを変更し再コンパイルをしたい場合は、次の手順に従う必要があります: + + \list 1 + \o コマンドラインで、再コンパイルしたいサンプルを含むディレクトリに移動します。 + \o \c qmake と入力し、\key{Return} キーを押します。 + うまくいかない場合は、現在のパス内にこの実行ファイルが存在することを確認するか、 + フルパスを指定して実行してください。 + \o Linux/Unix および Mac OS X の場合、\c make と入力し、\key{Return} キーを押します。 + Windows 上の Visual Studio の場合、\c nmake と入力し、\key{Return} キーを押します。 + \endlist + + 現在のディレクトリに実行ファイルが生成されます。 + Windows では、このファイルは \c debug または \c release + ディレクトリに配置されているかもしれません。 + このファイルを実行すると、作業中のサンプルコードの動作を確認できます。 +*/ + +/*! + \example tutorials/widgets/toplevel + \title ウィジェットのチュートリアル - ウィンドウの作成 + + 親を持たないウィジェットを作成した場合、そのウィジェットは表示時にウィンドウ(\e{トップレベルウィジェット})として扱われます。 + このウィジェットが必要なくなった場合にそれを破棄してくれる親ウィジェットがないため、トップレベルウィジェットの管理は開発者が行ってください。 + + 以下のサンプルでは QWidget を使用してウィンドウを作成し、サイズを指定して表示します: + + \raw HTML + <table align="left" width="100%"> + <tr class="qt-code"><td> + \endraw + \snippet tutorials/widgets/toplevel/main.cpp main program + \raw HTML + </td><td align="right"> + \endraw + \inlineimage widgets-tutorial-toplevel.png + \raw HTML + </td></tr> + </table> + \endraw + + 実際の GUI を作成するには、ウィンドウ内にウィジェットを配置する必要があります。 + これは、ウィジェットのコンストラクタに QWidget のインスタンスを渡すことで実現します。 + 詳細は本チュートリアルの次の章で示します。 +*/ + +/*! + \example tutorials/widgets/childwidget + \title ウィジェットのチュートリアル - 子ウィジェット + + 前のサンプルで作成したウィンドウに子ウィジェットを追加するために、 + 親として \c window を子ウィジェットのコンストラクタに渡します。 + ここでは、ウィンドウにボタンを追加し特定の場所に配置します: + + \raw HTML + <table align="left" width="100%"> + <tr class="qt-code"><td> + \endraw + \snippet tutorials/widgets/childwidget/main.cpp main program + \raw HTML + </td><td align="right"> + \endraw + \inlineimage widgets-tutorial-childwidget.png + \raw HTML + </td></tr> + </table> + \endraw + + このボタンはウィンドウの子になり、 + ウィンドウが破棄された場合にはボタンも破棄されるでしょう。 + ウィンドウを非表示化したり閉じた際には、自動的に破棄はされません。 + サンプルが終了する場合には破棄されるでしょう。 +*/ + +/*! + \example tutorials/widgets/windowlayout + \title ウィジェットのチュートリアル - レイアウトの利用 + + 一般的に子ウィジェットは、位置とサイズを明確に指定するのではなく、 + レイアウトオブジェクトを使用してウィンドウ内に配置します。 + ここでは、ラベルとラインエディットを生成し、横に並べて配置します。 + + \raw HTML + <table align="left" width="100%"> + <tr class="qt-code"><td> + \endraw + \snippet tutorials/widgets/windowlayout/main.cpp main program + \raw HTML + </td><td align="right"> + \endraw + \inlineimage widgets-tutorial-windowlayout.png + \raw HTML + </td></tr> + </table> + \endraw + + 生成する \c layout オブジェクトは、 \l{QHBoxLayout::}{addWidget()} 関数を使って設定されたウィジェットの位置とサイズを管理します。 + また、\l{QWidget::}{setLayout()} を使用してレイアウトをウィンドウに設定します。 + レイアウトはそれ自体は目には見えない存在です。 + レイアウトの管理対象となっているウィジェット(や他のレイアウト)に対しての効果としてのみ、その存在を確認できます。 + + 上記サンプルにおいて、各ウィジェットの所有権はあまり明確ではありません。 + 親オブジェクトのない3つのウィジェットと1つのレイアウトを作成するため、 + 空のウィンドウと、ラベルとラインエディットをそれぞれ含む別々のウィンドウが表示されるように見えるかもしれません。 + しかし、レイアウトにラベルとラインエディットを管理するように指定すると、 + ウィンドウにそのレイアウトを設定した際に「親の再指定」が行われるため、 + ウィジェットおよびレイアウト自体がそのウィンドウの子になります。 +*/ + +/*! + \example tutorials/widgets/nestedlayouts + \title ウィジェットのチュートリアル - 複雑なレイアウト + + ウィジェットの中に他のウィジェットを含めることができるように、 + レイアウトは異なるレベルでのウィジェットのグループ化にも使用されます。 + ここではウィンドウ上部にラベルとラインエディットを隣り合わせに配置し、 + その下に検索結果が表示されるテーブルビューを表示します。 + + これは、レイアウトを2つ作成して行います。\c{queryLayout} は、QLabel と QLineEdit を左右に並べて表示する QHBoxLayout です。 + \c{mainLayout} は、\c{queryLayout} と QTableView を上下に並べて表示する QVBoxLayout です。 + + \raw HTML + <table align="left" width="100%"> + <tr class="qt-code"><td> + \endraw + \snippet tutorials/widgets/nestedlayouts/main.cpp first part + \snippet tutorials/widgets/nestedlayouts/main.cpp last part + \raw HTML + </td><td align="right"> + \endraw + \inlineimage widgets-tutorial-nestedlayouts.png + \raw HTML + </td></tr> + </table> + \endraw + + \c{mainLayout} の \l{QBoxLayout::}{addLayout()} 関数にて追加された + \c{queryLayout} と \c{resultView} は追加された順番で上から並べられます。 + + ここでは QTableView ウィジェット \c resultView に表示されるデータを含むモデルの設定のコードは省略していますが、 + 後ほど示します。 + + QHBoxLayout や QVBoxLayout と共に Qt から提供される QGridLayout および QFormLayout を使用することにより、 + より複雑なユーザインターフェースの構築が可能になります。 + これらのレイアウトの効果は、\l{Qt Designer} を実行して確認できます。 + + \section1 モデルを設定する + + 上記のコードでは、レイアウトの有効利用に重点を置いていたため、 + テーブルのデータについては示していませんでした。 + 以下のコードで、モデルには行に対応する項目が含まれ、それぞれの行には2つの列のデータが設定されていることがわかるでしょう。 + + \snippet tutorials/widgets/nestedlayouts/main.cpp set up the model + + モデルとビューの有効利用については、\l{Item Views Examples} および + \l{Model/View Programming} の概要に含まれています。 +*/ diff --git a/examples/activeqt/activeqt.pro b/examples/activeqt/activeqt.pro index 262e1a1..79d257a 100644 --- a/examples/activeqt/activeqt.pro +++ b/examples/activeqt/activeqt.pro @@ -11,7 +11,7 @@ contains(QT_CONFIG, opengl):SUBDIRS += opengl # For now only the contain examples with mingw, for the others you need # an IDL compiler -win32-g++|wince*:SUBDIRS = webbrowser +win32-g++*|wince*:SUBDIRS = webbrowser # install target.path = $$[QT_INSTALL_EXAMPLES]/activeqt diff --git a/examples/declarative/modelviews/listview/dummydata/MyPetsModel.qml b/examples/declarative/modelviews/listview/PetsModel.qml index 70cdcdd..70cdcdd 100644 --- a/examples/declarative/modelviews/listview/dummydata/MyPetsModel.qml +++ b/examples/declarative/modelviews/listview/PetsModel.qml diff --git a/examples/declarative/modelviews/listview/dummydata/Recipes.qml b/examples/declarative/modelviews/listview/RecipesModel.qml index 03ab961..03ab961 100644 --- a/examples/declarative/modelviews/listview/dummydata/Recipes.qml +++ b/examples/declarative/modelviews/listview/RecipesModel.qml diff --git a/examples/declarative/modelviews/listview/content/ClickAutoRepeating.qml b/examples/declarative/modelviews/listview/content/PressAndHoldButton.qml index dc23b78..7c174e3 100644 --- a/examples/declarative/modelviews/listview/content/ClickAutoRepeating.qml +++ b/examples/declarative/modelviews/listview/content/PressAndHoldButton.qml @@ -40,32 +40,40 @@ import Qt 4.7 -Item { - id: page - property int repeatdelay: 300 - property int repeatperiod: 75 - property bool isPressed: false +Image { + id: container + + property int repeatDelay: 300 + property int repeatDuration: 75 + property bool pressed: false - signal pressed - signal released signal clicked - SequentialAnimation on isPressed { + scale: pressed ? 0.9 : 1 + + SequentialAnimation on pressed { + id: autoRepeatClicks running: false - id: autoRepeat - PropertyAction { target: page; property: "isPressed"; value: true } - ScriptAction { script: page.pressed() } - ScriptAction { script: page.clicked() } - PauseAnimation { duration: repeatdelay } + + PropertyAction { target: container; property: "pressed"; value: true } + ScriptAction { script: container.clicked() } + PauseAnimation { duration: repeatDelay } + SequentialAnimation { loops: Animation.Infinite - ScriptAction { script: page.clicked() } - PauseAnimation { duration: repeatperiod } + ScriptAction { script: container.clicked() } + PauseAnimation { duration: repeatDuration } } } + MouseArea { anchors.fill: parent - onPressed: autoRepeat.start() - onReleased: { autoRepeat.stop(); parent.isPressed = false; page.released() } + + onPressed: autoRepeatClicks.start() + onReleased: { + autoRepeatClicks.stop() + container.pressed = false + } } } + diff --git a/examples/declarative/modelviews/listview/content/MediaButton.qml b/examples/declarative/modelviews/listview/content/TextButton.qml index 2aed6e0..ded7a11 100644 --- a/examples/declarative/modelviews/listview/content/MediaButton.qml +++ b/examples/declarative/modelviews/listview/content/TextButton.qml @@ -40,36 +40,39 @@ import Qt 4.7 -Item { - property variant text +Rectangle { + id: container + + property alias text: label.text + signal clicked - id: container - Image { - id: normal - source: "pics/button.png" - } - Image { - id: pressed - source: "pics/button-pressed.png" - opacity: 0 + width: label.width + 20; height: label.height + 6 + smooth: true + radius: 10 + + gradient: Gradient { + GradientStop { id: gradientStop; position: 0.0; color: palette.light } + GradientStop { position: 1.0; color: palette.button } } + + SystemPalette { id: palette } + MouseArea { - id: clickRegion - anchors.fill: normal - onClicked: { container.clicked(); } + id: mouseArea + anchors.fill: parent + onClicked: { container.clicked() } } + Text { - font.bold: true - color: "white" - anchors.centerIn: normal - text: container.text + id: label + anchors.centerIn: parent } - width: normal.width states: State { - name: "Pressed" - when: clickRegion.pressed == true - PropertyChanges { target: pressed; opacity: 1 } + name: "pressed" + when: mouseArea.pressed + PropertyChanges { target: gradientStop; color: palette.dark } } } + diff --git a/examples/declarative/modelviews/listview/dynamiclist.qml b/examples/declarative/modelviews/listview/dynamiclist.qml index df2e094..0e290f5 100644 --- a/examples/declarative/modelviews/listview/dynamiclist.qml +++ b/examples/declarative/modelviews/listview/dynamiclist.qml @@ -37,16 +37,18 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - import Qt 4.7 import "content" -import "../../ui-components/scrollbar" + +// This example shows how items can be dynamically added to and removed from +// a ListModel, and how these list modifications can be animated. Rectangle { id: container width: 640; height: 480 color: "#343434" + // The model: ListModel { id: fruitModel @@ -77,55 +79,43 @@ Rectangle { ListElement { description: "Smelly" } ] } - ListElement { - name: "Elderberry"; cost: 0.05 - attributes: [ - ListElement { description: "Berry" } - ] - } - ListElement { - name: "Fig"; cost: 0.25 - attributes: [ - ListElement { description: "Flower" } - ] - } } + // The delegate for each fruit in the model: Component { - id: fruitDelegate - + id: listDelegate + Item { - id: wrapper - width: container.width; height: 55 + id: delegateItem + width: listView.width; height: 55 + clip: true - Column { - id: moveButtons - x: 5; width: childrenRect.width; anchors.verticalCenter: parent.verticalCenter + Row { + anchors.verticalCenter: parent.verticalCenter + spacing: 10 - Image { - source: "content/pics/go-up.png" - MouseArea { anchors.fill: parent; onClicked: fruitModel.move(index,index-1,1) } - } - Image { source: "content/pics/go-down.png" - MouseArea { anchors.fill: parent; onClicked: fruitModel.move(index,index+1,1) } + Column { + Image { + source: "content/pics/go-up.png" + MouseArea { anchors.fill: parent; onClicked: fruitModel.move(index,index-1,1) } + } + Image { source: "content/pics/go-down.png" + MouseArea { anchors.fill: parent; onClicked: fruitModel.move(index,index+1,1) } + } } - } - Column { - anchors { right: itemButtons.left; verticalCenter: parent.verticalCenter; left: moveButtons.right; leftMargin: 10 } + Column { + anchors.verticalCenter: parent.verticalCenter - Text { - id: label - width: parent.width - color: "White" - font.bold: true; font.pixelSize: 15 - text: name; elide: Text.ElideRight - } - Row { - spacing: 5 - Repeater { - model: attributes - Component { + Text { + text: name + font.pixelSize: 15 + color: "white" + } + Row { + spacing: 5 + Repeater { + model: attributes Text { text: description; color: "White" } } } @@ -133,149 +123,81 @@ Rectangle { } Row { - id: itemButtons - - anchors { right: removeButton.left; rightMargin: 35; verticalCenter: parent.verticalCenter } - width: childrenRect.width + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right spacing: 10 - Image { + PressAndHoldButton { + anchors.verticalCenter: parent.verticalCenter source: "content/pics/list-add.png" - scale: clickUp.isPressed ? 0.9 : 1 - - ClickAutoRepeating { - id: clickUp - anchors.fill: parent - onClicked: fruitModel.setProperty(index, "cost", cost+0.25) - } + onClicked: fruitModel.setProperty(index, "cost", cost + 0.25) } - Text { id: costText; text: '$'+Number(cost).toFixed(2); font.pixelSize: 15; color: "White"; font.bold: true; } + Text { + id: costText + anchors.verticalCenter: parent.verticalCenter + text: '$' + Number(cost).toFixed(2) + font.pixelSize: 15 + color: "white" + font.bold: true + } - Image { + PressAndHoldButton { + anchors.verticalCenter: parent.verticalCenter source: "content/pics/list-remove.png" - scale: clickDown.isPressed ? 0.9 : 1 + onClicked: fruitModel.setProperty(index, "cost", Math.max(0,cost-0.25)) + } - ClickAutoRepeating { - id: clickDown - anchors.fill: parent - onClicked: fruitModel.setProperty(index, "cost", Math.max(0,cost-0.25)) - } + Image { + source: "content/pics/archive-remove.png" + MouseArea { anchors.fill:parent; onClicked: fruitModel.remove(index) } } } - Image { - id: removeButton - anchors { verticalCenter: parent.verticalCenter; right: parent.right; rightMargin: 10 } - source: "content/pics/archive-remove.png" - MouseArea { anchors.fill:parent; onClicked: fruitModel.remove(index) } + // Animate adding and removing of items: + + ListView.onAdd: SequentialAnimation { + PropertyAction { target: delegateItem; property: "height"; value: 0 } + NumberAnimation { target: delegateItem; property: "height"; to: 55; duration: 250; easing.type: Easing.InOutQuad } } - // Animate adding and removing items - ListView.delayRemove: true // so that the item is not destroyed immediately - ListView.onAdd: state = "add" - ListView.onRemove: state = "remove" - states: [ - State { - name: "add" - PropertyChanges { target: wrapper; height: 55; clip: true } - }, - State { - name: "remove" - PropertyChanges { target: wrapper; height: 0; clip: true } - } - ] - transitions: [ - Transition { - to: "add" - SequentialAnimation { - NumberAnimation { properties: "height"; from: 0; to: 55 } - PropertyAction { target: wrapper; property: "state"; value: "" } - } - }, - Transition { - to: "remove" - SequentialAnimation { - NumberAnimation { properties: "height" } - // Make sure delayRemove is set back to false so that the item can be destroyed - PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false } - } - } - ] + ListView.onRemove: SequentialAnimation { + PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: true } + NumberAnimation { target: delegateItem; property: "height"; to: 0; duration: 250; easing.type: Easing.InOutQuad } + + // Make sure delayRemove is set back to false so that the item can be destroyed + PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: false } + } } } + // The view: ListView { - id: view - anchors { top: parent.top; left: parent.left; right: parent.right; bottom: buttons.top } + id: listView + anchors.fill: parent; anchors.margins: 20 model: fruitModel - delegate: fruitDelegate - } - - // Attach scrollbar to the right edge of the view. - ScrollBar { - id: verticalScrollBar - - width: 8; height: view.height; anchors.right: view.right - opacity: 0 - orientation: Qt.Vertical - position: view.visibleArea.yPosition - pageSize: view.visibleArea.heightRatio - - // Only show the scrollbar when the view is moving. - states: State { - name: "ShowBars"; when: view.movingVertically - PropertyChanges { target: verticalScrollBar; opacity: 1 } - } - transitions: Transition { - NumberAnimation { properties: "opacity"; duration: 400 } - } + delegate: listDelegate } Row { - id: buttons - - x: 8; width: childrenRect.width; height: childrenRect.height - anchors { bottom: parent.bottom; bottomMargin: 8 } - spacing: 8 - - Image { - source: "content/pics/archive-insert.png" - - MouseArea { - anchors.fill: parent - onClicked: { - fruitModel.append({ - "name": "Pizza Margarita", - "cost": 5.95, - "attributes": [{"description": "Cheese"},{"description": "Tomato"}] - }) - } - } - } - - Image { - source: "content/pics/archive-insert.png" - - MouseArea { - anchors.fill: parent; - onClicked: { - fruitModel.insert(0, { - "name": "Pizza Supreme", - "cost": 9.95, - "attributes": [{"description": "Cheese"},{"description": "Tomato"},{"description": "The Works"}] - }) - } + anchors { left: parent.left; bottom: parent.bottom; margins: 20 } + spacing: 10 + + TextButton { + text: "Add an item" + onClicked: { + fruitModel.append({ + "name": "Pizza Margarita", + "cost": 5.95, + "attributes": [{"description": "Cheese"}, {"description": "Tomato"}] + }) } } - Image { - source: "content/pics/archive-remove.png" - - MouseArea { - anchors.fill: parent - onClicked: fruitModel.clear() - } + TextButton { + text: "Remove all items" + onClicked: fruitModel.clear() } } } + diff --git a/examples/declarative/modelviews/listview/expandingdelegates.qml b/examples/declarative/modelviews/listview/expandingdelegates.qml index f4b97ea..94ea48f 100644 --- a/examples/declarative/modelviews/listview/expandingdelegates.qml +++ b/examples/declarative/modelviews/listview/expandingdelegates.qml @@ -41,7 +41,7 @@ import Qt 4.7 import "content" -// This example illustrates expanding a list item to show a more detailed view +// This example illustrates expanding a list item to show a more detailed view. Rectangle { id: page @@ -49,13 +49,13 @@ Rectangle { color: "black" // Delegate for the recipes. This delegate has two modes: - // 1. the list mode (default), which just shows the picture and title of the recipe. - // 2. the details mode, which also shows the ingredients and method. + // 1. List mode (default), which just shows the picture and title of the recipe. + // 2. Details mode, which also shows the ingredients and method. Component { id: recipeDelegate Item { - id: wrapper + id: recipe // Create a property to contain the visibility of the details. // We can bind multiple element's opacity to this one property, @@ -63,14 +63,15 @@ Rectangle { // want to fade. property real detailsOpacity : 0 - width: list.width + width: listView.width + height: 70 // A simple rounded rectangle for the background Rectangle { id: background - x: 1; y: 2; width: parent.width - 2; height: parent.height - 4 - color: "#FEFFEE" - border.color: "#FFBE4F" + x: 2; y: 2; width: parent.width - x*2; height: parent.height - y*2 + color: "ivory" + border.color: "orange" radius: 5 } @@ -78,50 +79,53 @@ Rectangle { // When clicked it changes mode to 'Details'. If we are already // in Details mode, then no change will happen. MouseArea { - id: pageMouse anchors.fill: parent - onClicked: wrapper.state = 'Details'; + onClicked: recipe.state = 'Details'; } - // Layout the page. Picture, title and ingredients at the top, method at the + // Lay out the page: picture, title and ingredients at the top, and method at the // bottom. Note that elements that should not be visible in the list - // mode have their opacity set to wrapper.detailsOpacity. + // mode have their opacity set to recipe.detailsOpacity. Row { id: topLayout - x: 10; y: 10; height: recipePic.height; width: parent.width + x: 10; y: 10; height: recipeImage.height; width: parent.width spacing: 10 Image { - id: recipePic - source: picture; width: 48; height: 48 + id: recipeImage + width: 50; height: 50 + source: picture } Column { - width: background.width-recipePic.width-20; height: recipePic.height; + width: background.width - recipeImage.width - 20; height: recipeImage.height spacing: 5 - Text { id: name; text: title; font.bold: true; font.pointSize: 16 } + Text { + text: title + font.bold: true; font.pointSize: 16 + } Text { text: "Ingredients" font.pointSize: 12; font.bold: true - opacity: wrapper.detailsOpacity + opacity: recipe.detailsOpacity } Text { text: ingredients wrapMode: Text.WordWrap width: parent.width - opacity: wrapper.detailsOpacity + opacity: recipe.detailsOpacity } } } Item { id: details - x: 10; width: parent.width-20 + x: 10; width: parent.width - 20 anchors { top: topLayout.bottom; topMargin: 10; bottom: parent.bottom; bottomMargin: 10 } - opacity: wrapper.detailsOpacity + opacity: recipe.detailsOpacity Text { id: methodTitle @@ -153,30 +157,28 @@ Rectangle { } // A button to close the detailed view, i.e. set the state back to default (''). - MediaButton { - y: 10; anchors { right: background.right; rightMargin: 5 } - opacity: wrapper.detailsOpacity + TextButton { + y: 10 + anchors { right: background.right; rightMargin: 10 } + opacity: recipe.detailsOpacity text: "Close" - onClicked: wrapper.state = ''; + onClicked: recipe.state = ''; } - // Set the default height to the height of the picture, plus margin. - height: 68 - states: State { name: "Details" PropertyChanges { target: background; color: "white" } - PropertyChanges { target: recipePic; width: 128; height: 128 } // Make picture bigger - PropertyChanges { target: wrapper; detailsOpacity: 1; x: 0 } // Make details visible - PropertyChanges { target: wrapper; height: list.height } // Fill the entire list area with the detailed view + PropertyChanges { target: recipeImage; width: 130; height: 130 } // Make picture bigger + PropertyChanges { target: recipe; detailsOpacity: 1; x: 0 } // Make details visible + PropertyChanges { target: recipe; height: listView.height } // Fill the entire list area with the detailed view // Move the list so that this item is at the top. - PropertyChanges { target: wrapper.ListView.view; explicit: true; contentY: wrapper.y } + PropertyChanges { target: recipe.ListView.view; explicit: true; contentY: recipe.y } // Disallow flicking while we're in detailed view - PropertyChanges { target: wrapper.ListView.view; interactive: false } + PropertyChanges { target: recipe.ListView.view; interactive: false } } transitions: Transition { @@ -191,10 +193,10 @@ Rectangle { // The actual list ListView { - id: list + id: listView anchors.fill: parent - clip: true - model: Recipes + model: RecipesModel {} delegate: recipeDelegate + clip: true } } diff --git a/examples/declarative/modelviews/listview/highlight.qml b/examples/declarative/modelviews/listview/highlight.qml index 239272a..5748974 100644 --- a/examples/declarative/modelviews/listview/highlight.qml +++ b/examples/declarative/modelviews/listview/highlight.qml @@ -41,12 +41,7 @@ import Qt 4.7 Rectangle { - width: 400; height: 300 - - // MyPets model is defined in dummydata/MyPetsModel.qml - // The launcher automatically loads files in dummydata/* to assist - // development without a real data source. - // This one contains my pets. + width: 200; height: 300 // Define a delegate component. A component will be // instantiated for each visible item in the list. @@ -54,42 +49,45 @@ Rectangle { id: petDelegate Item { id: wrapper - width: 200; height: 50 + width: 200; height: 55 Column { Text { text: 'Name: ' + name } Text { text: 'Type: ' + type } Text { text: 'Age: ' + age } } - // Use the ListView.isCurrentItem attached property to - // indent the item if it is the current item. + // indent the item if it is the current item states: State { name: "Current" when: wrapper.ListView.isCurrentItem - PropertyChanges { target: wrapper; x: 10 } + PropertyChanges { target: wrapper; x: 20 } } transitions: Transition { NumberAnimation { properties: "x"; duration: 200 } } } } - // Specify a highlight with custom movement. Note that highlightFollowsCurrentItem - // is set to false in the ListView so that we can control how the - // highlight moves to the current item. + + // Define a highlight with customised movement between items. Component { - id: petHighlight + id: highlightBar Rectangle { width: 200; height: 50 color: "#FFFF88" - SpringFollow on y { to: list1.currentItem.y; spring: 3; damping: 0.1 } + SpringFollow on y { to: listView.currentItem.y; spring: 3; damping: 0.1 } } } ListView { - id: list1 + id: listView width: 200; height: parent.height - model: MyPetsModel + + model: PetsModel {} delegate: petDelegate - highlight: petHighlight; highlightFollowsCurrentItem: false focus: true + + // Set the highlight delegate. Note we must also set highlightFollowsCurrentItem + // to false so the highlight delegate can control how the highlight is moved. + highlight: highlightBar + highlightFollowsCurrentItem: false } } diff --git a/examples/declarative/modelviews/listview/highlightranges.qml b/examples/declarative/modelviews/listview/highlightranges.qml index a8a95c4..162d8b7 100644 --- a/examples/declarative/modelviews/listview/highlightranges.qml +++ b/examples/declarative/modelviews/listview/highlightranges.qml @@ -43,46 +43,20 @@ import Qt 4.7 Rectangle { width: 600; height: 300 - // MyPets model is defined in dummydata/MyPetsModel.qml - // The viewer automatically loads files in dummydata/* to assist - // development without a real data source. - // This one contains my pets. - - // Define a delegate component. A component will be - // instantiated for each visible item in the list. - Component { - id: petDelegate - Item { - width: 200; height: 50 - Column { - Text { text: 'Name: ' + name } - Text { text: 'Type: ' + type } - Text { text: 'Age: ' + age } - } - } - } - - // Define a highlight component. Just one of these will be instantiated - // by each ListView and placed behind the current item. - Component { - id: petHighlight - Rectangle { color: "#FFFF88" } - } - // Show the model in three lists, with different highlight ranges. // preferredHighlightBegin and preferredHighlightEnd set the // range in which to attempt to maintain the highlight. // - // Note that the second and third ListView - // set their currentIndex to be the same as the first, and that - // the first ListView is given keyboard focus. + // The second and third ListView set their currentIndex to be the + // same as the first, and the first ListView is given keyboard focus. // - // The default mode allows the currentItem to move freely - // within the visible area. If it would move outside the visible - // area, the view is scrolled to keep it visible. + // The first list does not set a highlight range, so its currentItem + // can move freely within the visible area. If it moves outside the + // visible area, the view is automatically scrolled to keep the current + // item visible. // // The second list sets a highlight range which attempts to keep the - // current item within the the bounds of the range, however + // current item within the the bounds of the range. However, // items will not scroll beyond the beginning or end of the view, // forcing the highlight to move outside the range at the ends. // @@ -98,21 +72,22 @@ Rectangle { ListView { id: list1 width: 200; height: parent.height - model: MyPetsModel + model: PetsModel {} delegate: petDelegate - highlight: petHighlight + highlight: Rectangle { color: "lightsteelblue" } currentIndex: list3.currentIndex focus: true } ListView { id: list2 - x: 200; width: 200; height: parent.height - model: MyPetsModel + x: list1.width + width: 200; height: parent.height + model: PetsModel {} delegate: petDelegate - highlight: petHighlight + highlight: Rectangle { color: "yellow" } currentIndex: list1.currentIndex preferredHighlightBegin: 80; preferredHighlightEnd: 220 highlightRangeMode: ListView.ApplyRange @@ -120,14 +95,25 @@ Rectangle { ListView { id: list3 - x: 400; width: 200; height: parent.height - model: MyPetsModel + x: list1.width + list2.width + width: 200; height: parent.height + model: PetsModel {} delegate: petDelegate - highlight: Rectangle { color: "lightsteelblue" } + highlight: Rectangle { color: "yellow" } currentIndex: list1.currentIndex preferredHighlightBegin: 125; preferredHighlightEnd: 125 highlightRangeMode: ListView.StrictlyEnforceRange - flickDeceleration: 1000 + } + + // The delegate for each list + Component { + id: petDelegate + Column { + width: 200 + Text { text: 'Name: ' + name } + Text { text: 'Type: ' + type } + Text { text: 'Age: ' + age } + } } } diff --git a/examples/declarative/modelviews/listview/sections.qml b/examples/declarative/modelviews/listview/sections.qml index d2f9aba..8c038a0 100644 --- a/examples/declarative/modelviews/listview/sections.qml +++ b/examples/declarative/modelviews/listview/sections.qml @@ -42,70 +42,43 @@ import Qt 4.7 //! [0] Rectangle { + id: container width: 200 - height: 240 + height: 250 - // MyPets model is defined in dummydata/MyPetsModel.qml - // The viewer automatically loads files in dummydata/* to assist - // development without a real data source. - // This one contains my pets. - - // Define a delegate component that includes a separator for sections. - Component { - id: petDelegate - - Item { - id: wrapper - width: 200 - height: desc.height // height is the combined height of the description and the section separator + ListModel { + id: animalsModel + ListElement { name: "Parrot"; size: "Small" } + ListElement { name: "Guinea pig"; size: "Small" } + ListElement { name: "Dog"; size: "Medium" } + ListElement { name: "Cat"; size: "Medium" } + ListElement { name: "Elephant"; size: "Large" } + } - Item { - id: desc - x: 5; height: layout.height + 4 + // The delegate for each section header + Component { + id: sectionHeading + Rectangle { + width: container.width + height: childrenRect.height + color: "lightsteelblue" - Column { - id: layout - y: 2 - Text { text: 'Name: ' + name } - Text { text: 'Type: ' + type } - Text { text: 'Age: ' + age } - } + Text { + text: section + font.bold: true } } } - // Define a highlight component. Just one of these will be instantiated - // by each ListView and placed behind the current item. - Component { - id: petHighlight - Rectangle { color: "#FFFF88" } - } - - // The list ListView { - id: myList + anchors.fill: parent + model: animalsModel + delegate: Text { text: name } - width: 200; height: parent.height - model: MyPetsModel - delegate: petDelegate - highlight: petHighlight - focus: true - - // The sectionExpression is simply the size of the pet. - // We use this to determine which section we are in above. section.property: "size" section.criteria: ViewSection.FullString - section.delegate: Rectangle { - color: "lightsteelblue" - width: 200 - height: 20 - Text { - x: 2; height: parent.height - verticalAlignment: Text.AlignVCenter - text: section - font.bold: true - } - } + section.delegate: sectionHeading } } //! [0] + diff --git a/examples/declarative/toys/clocks/content/center.png b/examples/declarative/toys/clocks/content/center.png Binary files differindex 7fbd802..7fbd802 100755..100644 --- a/examples/declarative/toys/clocks/content/center.png +++ b/examples/declarative/toys/clocks/content/center.png diff --git a/examples/declarative/toys/clocks/content/clock-night.png b/examples/declarative/toys/clocks/content/clock-night.png Binary files differindex cc7151a..cc7151a 100755..100644 --- a/examples/declarative/toys/clocks/content/clock-night.png +++ b/examples/declarative/toys/clocks/content/clock-night.png diff --git a/examples/declarative/toys/clocks/content/clock.png b/examples/declarative/toys/clocks/content/clock.png Binary files differindex 462edac..462edac 100755..100644 --- a/examples/declarative/toys/clocks/content/clock.png +++ b/examples/declarative/toys/clocks/content/clock.png diff --git a/examples/declarative/toys/clocks/content/hour.png b/examples/declarative/toys/clocks/content/hour.png Binary files differindex f8061a1..f8061a1 100755..100644 --- a/examples/declarative/toys/clocks/content/hour.png +++ b/examples/declarative/toys/clocks/content/hour.png diff --git a/examples/declarative/toys/clocks/content/minute.png b/examples/declarative/toys/clocks/content/minute.png Binary files differindex 1297ec7..1297ec7 100755..100644 --- a/examples/declarative/toys/clocks/content/minute.png +++ b/examples/declarative/toys/clocks/content/minute.png diff --git a/examples/declarative/toys/clocks/content/second.png b/examples/declarative/toys/clocks/content/second.png Binary files differindex 4aa9fb5..4aa9fb5 100755..100644 --- a/examples/declarative/toys/clocks/content/second.png +++ b/examples/declarative/toys/clocks/content/second.png diff --git a/examples/ja_JP/linguist/hellotr/hellotr.pro b/examples/ja_JP/linguist/hellotr/hellotr.pro new file mode 100644 index 0000000..3846bfb --- /dev/null +++ b/examples/ja_JP/linguist/hellotr/hellotr.pro @@ -0,0 +1,13 @@ +#! [0] +SOURCES = main.cpp +#! [0] #! [1] +TRANSLATIONS = hellotr_ja.ts +#! [1] + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/linguist/hellotr +sources.files = $$SOURCES *.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/linguist/hellotr +INSTALLS += target sources + +symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) diff --git a/examples/ja_JP/linguist/hellotr/main.cpp b/examples/ja_JP/linguist/hellotr/main.cpp new file mode 100644 index 0000000..ad122e9 --- /dev/null +++ b/examples/ja_JP/linguist/hellotr/main.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> +#include <QPushButton> +//! [0] +#include <QTranslator> +//! [0] + +//! [1] //! [2] +int main(int argc, char *argv[]) +//! [1] //! [3] //! [4] +{ + QApplication app(argc, argv); +//! [3] + +//! [5] + QTranslator translator; +//! [5] //! [6] + translator.load("hellotr_ja"); +//! [6] //! [7] + app.installTranslator(&translator); +//! [4] //! [7] + +//! [8] + QPushButton hello(QPushButton::tr("Hello world!")); +//! [8] + hello.resize(100, 30); + + hello.show(); + return app.exec(); +} +//! [2] diff --git a/examples/multimedia/videographicsitem/videoplayer.cpp b/examples/multimedia/videographicsitem/videoplayer.cpp index 281cd6e..f98f542 100644 --- a/examples/multimedia/videographicsitem/videoplayer.cpp +++ b/examples/multimedia/videographicsitem/videoplayer.cpp @@ -115,7 +115,20 @@ VideoPlayer::~VideoPlayer() void VideoPlayer::openFile() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie")); + QStringList supportedFormats; + foreach (QString fmt, QMovie::supportedFormats()) + supportedFormats << fmt; + foreach (QString fmt, QImageReader::supportedImageFormats()) + supportedFormats << fmt; + + QString filter = "Images ("; + foreach ( QString fmt, supportedFormats) { + filter.append(QString("*.%1 ").arg(fmt)); + } + filter.append(")"); + + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"), + QDir::homePath(), filter); if (!fileName.isEmpty()) { videoItem->stop(); diff --git a/examples/multimedia/videowidget/videoplayer.cpp b/examples/multimedia/videowidget/videoplayer.cpp index 87a2621..ad12069 100644 --- a/examples/multimedia/videowidget/videoplayer.cpp +++ b/examples/multimedia/videowidget/videoplayer.cpp @@ -96,7 +96,20 @@ VideoPlayer::~VideoPlayer() void VideoPlayer::openFile() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie")); + QStringList supportedFormats; + foreach (QString fmt, QMovie::supportedFormats()) + supportedFormats << fmt; + foreach (QString fmt, QImageReader::supportedImageFormats()) + supportedFormats << fmt; + + QString filter = "Images ("; + foreach ( QString fmt, supportedFormats) { + filter.append(QString("*.%1 ").arg(fmt)); + } + filter.append(")"); + + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"), + QDir::homePath(), filter); if (!fileName.isEmpty()) { surface->stop(); diff --git a/examples/tutorials/addressbook/part3/addressbook.cpp b/examples/tutorials/addressbook/part3/addressbook.cpp index adb87ef..28a570a 100644 --- a/examples/tutorials/addressbook/part3/addressbook.cpp +++ b/examples/tutorials/addressbook/part3/addressbook.cpp @@ -125,6 +125,7 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); + return; } if (!contacts.contains(name)) { diff --git a/examples/tutorials/addressbook/part4/addressbook.cpp b/examples/tutorials/addressbook/part4/addressbook.cpp index 1b7a6c4..55d551f 100644 --- a/examples/tutorials/addressbook/part4/addressbook.cpp +++ b/examples/tutorials/addressbook/part4/addressbook.cpp @@ -134,6 +134,7 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); + return; } //! [submitContact() function part1] if (currentMode == AddingMode) { diff --git a/examples/tutorials/addressbook/part5/addressbook.cpp b/examples/tutorials/addressbook/part5/addressbook.cpp index 80c18c3..1b3f451 100644 --- a/examples/tutorials/addressbook/part5/addressbook.cpp +++ b/examples/tutorials/addressbook/part5/addressbook.cpp @@ -141,6 +141,7 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); + return; } if (currentMode == AddingMode) { diff --git a/examples/tutorials/addressbook/part6/addressbook.cpp b/examples/tutorials/addressbook/part6/addressbook.cpp index fc41190..724971c 100644 --- a/examples/tutorials/addressbook/part6/addressbook.cpp +++ b/examples/tutorials/addressbook/part6/addressbook.cpp @@ -147,6 +147,7 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); + return; } if (currentMode == AddingMode) { diff --git a/examples/tutorials/addressbook/part7/addressbook.cpp b/examples/tutorials/addressbook/part7/addressbook.cpp index 3ab8702..bf00298 100644 --- a/examples/tutorials/addressbook/part7/addressbook.cpp +++ b/examples/tutorials/addressbook/part7/addressbook.cpp @@ -149,6 +149,7 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); + return; } if (currentMode == AddingMode) { diff --git a/mkspecs/features/symbian/symbian_building.prf b/mkspecs/features/symbian/symbian_building.prf index 92988aa..9fc4d1e 100644 --- a/mkspecs/features/symbian/symbian_building.prf +++ b/mkspecs/features/symbian/symbian_building.prf @@ -1,7 +1,7 @@ # we have some module specific options (defined in qt.prf) lets add them -!contains(TARGET, ".*[ -].*"):eval(TMPVAR = \$\$QMAKE_$${TARGET}_CXXFLAGS) +!contains(TARGET, ".*[ -/].*"):eval(TMPVAR = \$\$QMAKE_$${TARGET}_CXXFLAGS) !isEmpty(TMPVAR):QMAKE_CXXFLAGS += $$TMPVAR -!contains(TARGET, ".*[ -].*"):eval(TMPVAR = \$\$QMAKE_$${TARGET}_LFLAGS) +!contains(TARGET, ".*[ -/].*"):eval(TMPVAR = \$\$QMAKE_$${TARGET}_LFLAGS) !isEmpty(TMPVAR) { QMAKE_LFLAGS += $$TMPVAR } else :linux-gcce { # lets provide a simple default. Without elf2e32 complains diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf index 3353180..3b26f7d 100644 --- a/mkspecs/linux-icc/qmake.conf +++ b/mkspecs/linux-icc/qmake.conf @@ -21,13 +21,13 @@ QMAKE_LEX = flex QMAKE_LEXFLAGS = QMAKE_YACC = yacc QMAKE_YACCFLAGS = -d -QMAKE_CFLAGS = -wd654,1572 +QMAKE_CFLAGS = QMAKE_CFLAGS_DEPS = -M -QMAKE_CFLAGS_WARN_ON = +QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125 QMAKE_CFLAGS_WARN_OFF = -w -QMAKE_CFLAGS_RELEASE = -O2 -QMAKE_CFLAGS_DEBUG = -g -QMAKE_CFLAGS_SHLIB = -fPIC +QMAKE_CFLAGS_RELEASE = -O2 -falign-functions=16 -ansi-alias -fstrict-aliasing +QMAKE_CFLAGS_DEBUG = -O0 -g +QMAKE_CFLAGS_SHLIB = -fPIC -fno-jump-tables QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB QMAKE_CFLAGS_YACC = QMAKE_CFLAGS_THREAD = -D_REENTRANT @@ -58,11 +58,12 @@ QMAKE_LINK_SHLIB = icpc QMAKE_LFLAGS = QMAKE_LFLAGS_RELEASE = QMAKE_LFLAGS_DEBUG = -QMAKE_LFLAGS_SHLIB = -shared +QMAKE_LFLAGS_SHLIB = -shared -shared-intel QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB -QMAKE_LFLAGS_SONAME = -Qoption,ld,-soname, +QMAKE_LFLAGS_SONAME = -Wl,-soname, QMAKE_LFLAGS_THREAD = -QMAKE_LFLAGS_RPATH = -Qoption,ld,-rpath, +QMAKE_LFLAGS_NOUNDEF = -Wl,-z,defs +QMAKE_LFLAGS_RPATH = -Wl,-rpath, QMAKE_LIBS = QMAKE_LIBS_DYNLOAD = -ldl @@ -76,7 +77,7 @@ QMAKE_LIBS_THREAD = -lpthread QMAKE_MOC = $$[QT_INSTALL_BINS]/moc QMAKE_UIC = $$[QT_INSTALL_BINS]/uic -QMAKE_AR = ar cqs +QMAKE_AR = xiar cqs QMAKE_OBJCOPY = objcopy QMAKE_RANLIB = @@ -99,8 +100,8 @@ QMAKE_CXXFLAGS_USE_PRECOMPILE = -pch-use ${QMAKE_PCH_OUTPUT} -include ${QMAKE_PC QMAKE_CXXFLAGS_PRECOMPILE = -c -pch-create ${QMAKE_PCH_OUTPUT} -include ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_TEMP_OBJECT} ${QMAKE_PCH_TEMP_SOURCE} # -Bsymbolic-functions (ld) support -QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Qoption,ld,-Bsymbolic-functions -QMAKE_LFLAGS_DYNAMIC_LIST = -Qoption,ld,--dynamic-list, +QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions +QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, # Symbol visibility control QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden diff --git a/mkspecs/modules/qt_webkit_version.pri b/mkspecs/modules/qt_webkit_version.pri index 0370720..ffd192c 100644 --- a/mkspecs/modules/qt_webkit_version.pri +++ b/mkspecs/modules/qt_webkit_version.pri @@ -1,2 +1,4 @@ -# The version information comes from our copy of -include($$PWD/../../src/3rdparty/webkit/WebKit/qt/qt_webkit_version.pri) +QT_WEBKIT_VERSION = 4.7.0 +QT_WEBKIT_MAJOR_VERSION = 4 +QT_WEBKIT_MINOR_VERSION = 7 +QT_WEBKIT_PATCH_VERSION = 0 diff --git a/mkspecs/unsupported/win32-g++-cross/qmake.conf b/mkspecs/unsupported/win32-g++-cross/qmake.conf new file mode 100644 index 0000000..e338a22 --- /dev/null +++ b/mkspecs/unsupported/win32-g++-cross/qmake.conf @@ -0,0 +1,101 @@ +# +# qmake configuration for win32-g++-cross +# +# Written for MinGW cross building on Unix +# + +MAKEFILE_GENERATOR = MINGW +TEMPLATE = app +CONFIG += qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header +QT += core gui +DEFINES += UNICODE QT_LARGEFILE_SUPPORT +QMAKE_COMPILER_DEFINES += __GNUC__ WIN32 + +QMAKE_EXT_OBJ = .o +QMAKE_EXT_RES = _res.o + +QMAKE_CC = i686-pc-mingw32-gcc +QMAKE_LEX = flex +QMAKE_LEXFLAGS = +QMAKE_YACC = byacc +QMAKE_YACCFLAGS = -d +QMAKE_CFLAGS = -pipe +QMAKE_CFLAGS_DEPS = -M +QMAKE_CFLAGS_WARN_ON = -Wall +QMAKE_CFLAGS_WARN_OFF = -w +QMAKE_CFLAGS_RELEASE = -O2 +QMAKE_CFLAGS_DEBUG = -g +QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses + +QMAKE_CXX = i686-pc-mingw32-g++ +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_YACC = $$QMAKE_CFLAGS_YACC +QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD +QMAKE_CXXFLAGS_RTTI_ON = -frtti +QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti +QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads +QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions + +QMAKE_INCDIR = +QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS] +QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS] + +QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src +QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< +QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src +QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +QMAKE_LINK = i686-pc-mingw32-g++ +QMAKE_LINK_C = i686-pc-mingw32-gcc +QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc +QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl +QMAKE_LFLAGS_EXCEPTIONS_OFF = +QMAKE_LFLAGS_RELEASE = -Wl,-s +QMAKE_LFLAGS_DEBUG = +QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console +QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows +QMAKE_LFLAGS_DLL = -shared +QMAKE_LINK_OBJECT_MAX = 10 +QMAKE_LINK_OBJECT_SCRIPT= object_script + + +QMAKE_LIBS = +QMAKE_LIBS_CORE = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32 +QMAKE_LIBS_GUI = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32 +QMAKE_LIBS_NETWORK = -lws2_32 +QMAKE_LIBS_OPENGL = -lopengl32 -lglu32 -lgdi32 -luser32 +QMAKE_LIBS_COMPAT = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32 +QMAKE_LIBS_QT_ENTRY = -lmingw32 -lqtmain + +QMAKE_SH = bash + +MINGW_IN_SHELL = 1 +QMAKE_DIR_SEP = / +QMAKE_COPY = cp +QMAKE_COPY_DIR = cp -r +QMAKE_MOVE = mv +QMAKE_DEL_FILE = rm -f +QMAKE_MKDIR = mkdir -p +QMAKE_DEL_DIR = rmdir +QMAKE_SYMBOLIC_LINK = ln -s +QMAKE_CHK_DIR_EXISTS = test -d + +#QMAKE_IDC = i686-pc-mingw32-idc +QMAKE_MOC = i686-pc-mingw32-moc +QMAKE_RCC = i686-pc-mingw32-rcc +QMAKE_UIC = i686-pc-mingw32-uic + +#QMAKE_IDL = midl +QMAKE_LIB = i686-pc-mingw32-ar -ru +QMAKE_RC = i686-pc-mingw32-windres +QMAKE_ZIP = zip -r -9 + +QMAKE_STRIP = i686-pc-mingw32-strip +QMAKE_STRIPFLAGS_LIB += --strip-unneeded +PKG_CONFIG = i686-pc-mingw32-pkg-config +load(qt_config) diff --git a/mkspecs/unsupported/win32-g++-cross/qplatformdefs.h b/mkspecs/unsupported/win32-g++-cross/qplatformdefs.h new file mode 100644 index 0000000..309e24a --- /dev/null +++ b/mkspecs/unsupported/win32-g++-cross/qplatformdefs.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../../win32-g++/qplatformdefs.h" diff --git a/qmake/generators/metamakefile.cpp b/qmake/generators/metamakefile.cpp index ad8750b..e98831d 100644 --- a/qmake/generators/metamakefile.cpp +++ b/qmake/generators/metamakefile.cpp @@ -529,9 +529,18 @@ MetaMakefileGenerator::modesForGenerator(const QString &gen, *host_mode = Option::HOST_UNIX_MODE; *target_mode = Option::TARG_UNIX_MODE; #endif - } else if (gen == "MSVC.NET" || gen == "MINGW" || gen == "BMAKE" || gen == "MSBUILD") { + } else if (gen == "MSVC.NET" || gen == "BMAKE" || gen == "MSBUILD") { *host_mode = Option::HOST_WIN_MODE; *target_mode = Option::TARG_WIN_MODE; + } else if (gen == "MINGW") { +#if defined(Q_OS_MAC) + *host_mode = Option::HOST_MACX_MODE; +#elif defined(Q_OS_UNIX) + *host_mode = Option::HOST_UNIX_MODE; +#else + *host_mode = Option::HOST_WIN_MODE; +#endif + *target_mode = Option::TARG_WIN_MODE; } else if (gen == "PROJECTBUILDER" || gen == "XCODE") { *host_mode = Option::HOST_MACX_MODE; *target_mode = Option::TARG_MACX_MODE; diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp index 58729d2..3a4bdbc 100644 --- a/qmake/generators/symbian/symbiancommon.cpp +++ b/qmake/generators/symbian/symbiancommon.cpp @@ -433,9 +433,6 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocB if (from.size() > 1 && from.at(1) == QLatin1Char(':')) from = from.mid(2); from.prepend(zDir); - } else { - if (from.size() > 1 && from.at(1) == QLatin1Char(':')) - from = from.mid(2); } } diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp index c2f1d1a..78f6f85 100644 --- a/qmake/generators/symbian/symmake_sbsv2.cpp +++ b/qmake/generators/symbian/symmake_sbsv2.cpp @@ -99,7 +99,9 @@ void SymbianSbsv2MakefileGenerator::writeSbsDeploymentList(const DeploymentList& fromItem.replace("\\", "/"); toItem.replace("\\", "/"); #if defined(Q_OS_WIN) - toItem.prepend(QDir::current().absolutePath().left(2)); // add drive + // add drive if it doesn't have one yet + if (toItem.size() > 1 && toItem[1] != QLatin1Char(':')) + toItem.prepend(QDir::current().absolutePath().left(2)); #endif t << "OPTION DEPLOY_SOURCE " << fromItem << endl; t << "OPTION DEPLOY_TARGET " << toItem << endl; diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp index 0936d15..5685d6b 100644 --- a/qmake/generators/win32/mingw_make.cpp +++ b/qmake/generators/win32/mingw_make.cpp @@ -371,7 +371,12 @@ void MingwMakefileGenerator::writeObjectsPart(QTextStream &t) ar_script_file += "." + var("BUILD_NAME"); } createArObjectScriptFile(ar_script_file, var("DEST_TARGET"), project->values("OBJECTS")); - objectsLinkLine = "ar -M < " + ar_script_file; + // QMAKE_LIB is used for win32, including mingw, whereas QMAKE_AR is used on Unix. + // Strip off any options since the ar commands will be read from file. + QString ar_cmd = var("QMAKE_LIB").section(" ", 0, 0);; + if (ar_cmd.isEmpty()) + ar_cmd = "ar"; + objectsLinkLine = ar_cmd + " -M < " + ar_script_file; } else { QString ld_script_file = var("QMAKE_LINK_OBJECT_SCRIPT") + "." + var("TARGET"); if (!var("BUILD_NAME").isEmpty()) { diff --git a/qmake/qmake.pri b/qmake/qmake.pri index 6e0f8a2..a7e0ab1 100644 --- a/qmake/qmake.pri +++ b/qmake/qmake.pri @@ -134,7 +134,7 @@ bootstrap { #Qt code } else:win32 { SOURCES += qfsfileengine_win.cpp qfsfileengine_iterator_win.cpp qsettings_win.cpp win32-msvc*:LIBS += ole32.lib advapi32.lib - win32-g++:LIBS += -lole32 -luuid + win32-g++*:LIBS += -lole32 -luuid } qnx { diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h index b134407..0d7c2c2 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h @@ -32,6 +32,10 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + typedef struct HB_GlyphItemRec_ { HB_UInt gindex; HB_UInt properties; @@ -48,13 +52,13 @@ typedef struct HB_PositionRec_ { HB_Fixed y_advance; HB_UShort back; /* number of glyphs to go back for drawing current glyph */ + HB_Short cursive_chain; /* character to which this connects, + may be positive or negative; used + only internally */ HB_Bool new_advance; /* if set, the advance width values are absolute, i.e., they won't be added to the original glyph's value but rather replace them. */ - HB_Short cursive_chain; /* character to which this connects, - may be positive or negative; used - only internally */ } HB_PositionRec, *HB_Position; @@ -66,12 +70,12 @@ typedef struct HB_BufferRec_{ HB_UInt in_pos; HB_UInt out_pos; - HB_Bool separate_out; HB_GlyphItem in_string; HB_GlyphItem out_string; HB_GlyphItem alt_string; HB_Position positions; HB_UShort max_ligID; + HB_Bool separate_out; } HB_BufferRec, *HB_Buffer; HB_Error @@ -89,6 +93,10 @@ hb_buffer_add_glyph( HB_Buffer buffer, HB_UInt properties, HB_UInt cluster ); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif + HB_END_HEADER #endif /* HARFBUZZ_BUFFER_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump.c b/src/3rdparty/harfbuzz/src/harfbuzz-dump.c index 8c81da1..a1ef6b6 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-dump.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-dump.c @@ -519,13 +519,14 @@ Dump_ValueRecord (HB_ValueRecord *ValueRecord, FILE *stream, int indent, HB_Type if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE) DUMP_FINT (ValueRecord, XAdvance); if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE) - RECURSE (Device, Device, &ValueRecord->XPlacementDevice); + RECURSE (Device, Device, &*ValueRecord->XPlacementDevice); if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE) - RECURSE (Device, Device, &ValueRecord->YPlacementDevice); + RECURSE (Device, Device, &*ValueRecord->YPlacementDevice); if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE) - RECURSE (Device, Device, &ValueRecord->XAdvanceDevice); + RECURSE (Device, Device, &*ValueRecord->XAdvanceDevice); if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE) - RECURSE (Device, Device, &ValueRecord->YAdvanceDevice); + RECURSE (Device, Device, &*ValueRecord->YAdvanceDevice); +#ifdef HB_SUPPORT_MULTIPLE_MASTER if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT) DUMP_FUINT (ValueRecord, XIdPlacement); if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT) @@ -534,6 +535,7 @@ Dump_ValueRecord (HB_ValueRecord *ValueRecord, FILE *stream, int indent, HB_Type DUMP_FUINT (ValueRecord, XIdAdvance); if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE) DUMP_FUINT (ValueRecord, XIdAdvance); +#endif } static void diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-external.h b/src/3rdparty/harfbuzz/src/harfbuzz-external.h index 760749b..7644f0d 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-external.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-external.h @@ -146,11 +146,7 @@ HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch); int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch); HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch); -void *HB_Library_Resolve(const char *library, const char *symbol); - -void *HB_TextCodecForMib(int mib); -char *HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength); -void HB_TextCodec_FreeResult(char *); +void *HB_Library_Resolve(const char *library, int version, const char *symbol); HB_END_HEADER diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h index da06b6f..2a6d958 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h @@ -34,12 +34,16 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + /* Attachment related structures */ struct HB_AttachPoint_ { - HB_UShort PointCount; /* size of the PointIndex array */ HB_UShort* PointIndex; /* array of contour points */ + HB_UShort PointCount; /* size of the PointIndex array */ }; /* Ligature Caret related structures */ @@ -62,32 +66,36 @@ typedef struct HB_CaretValueFormat2_ HB_CaretValueFormat2; struct HB_CaretValueFormat3_ { + HB_Device* Device; /* Device table for x or y value */ HB_Short Coordinate; /* x or y value (in design units) */ - HB_Device Device; /* Device table for x or y value */ }; typedef struct HB_CaretValueFormat3_ HB_CaretValueFormat3; +#ifdef HB_SUPPORT_MULTIPLE_MASTER struct HB_CaretValueFormat4_ { HB_UShort IdCaretValue; /* metric ID */ }; typedef struct HB_CaretValueFormat4_ HB_CaretValueFormat4; +#endif struct HB_CaretValue_ { - HB_UShort CaretValueFormat; /* 1, 2, 3, or 4 */ - union { HB_CaretValueFormat1 cvf1; HB_CaretValueFormat2 cvf2; HB_CaretValueFormat3 cvf3; +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_CaretValueFormat4 cvf4; +#endif } cvf; + + HB_Byte CaretValueFormat; /* 1, 2, 3, or 4 */ }; typedef struct HB_CaretValue_ HB_CaretValue; @@ -95,10 +103,9 @@ typedef struct HB_CaretValue_ HB_CaretValue; struct HB_LigGlyph_ { - HB_Bool loaded; - - HB_UShort CaretCount; /* number of caret values */ HB_CaretValue* CaretValue; /* array of caret values */ + HB_UShort CaretCount; /* number of caret values */ + HB_Bool loaded; }; @@ -119,6 +126,10 @@ _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef, HB_Lookup* lo, HB_UShort num_lookups ); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif + HB_END_HEADER #endif /* HARFBUZZ_GDEF_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c index ff3a1f4..c0c6f2c 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c @@ -442,7 +442,11 @@ static HB_Error Load_CaretValue( HB_CaretValue* cv, if ( ACCESS_Frame( 2L ) ) return error; +#ifdef HB_SUPPORT_MULTIPLE_MASTER cv->cvf.cvf4.IdCaretValue = GET_UShort(); +#else + (void) GET_UShort(); +#endif FORGET_Frame(); break; diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h index b6dcadc..f9a03dd 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h @@ -31,6 +31,10 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + /* GDEF glyph properties. Note that HB_GDEF_COMPONENT has no corresponding * flag in the LookupFlag field. */ #define HB_GDEF_BASE_GLYPH 0x0002 @@ -44,12 +48,11 @@ typedef struct HB_AttachPoint_ HB_AttachPoint; struct HB_AttachList_ { - HB_Bool loaded; - + HB_AttachPoint* AttachPoint; /* array of AttachPoint tables */ HB_Coverage Coverage; /* Coverage table */ HB_UShort GlyphCount; /* number of glyphs with attachments */ - HB_AttachPoint* AttachPoint; /* array of AttachPoint tables */ + HB_Bool loaded; }; typedef struct HB_AttachList_ HB_AttachList; @@ -58,11 +61,10 @@ typedef struct HB_LigGlyph_ HB_LigGlyph; struct HB_LigCaretList_ { - HB_Bool loaded; - + HB_LigGlyph* LigGlyph; /* array of LigGlyph tables */ HB_Coverage Coverage; /* Coverage table */ HB_UShort LigGlyphCount; /* number of ligature glyphs */ - HB_LigGlyph* LigGlyph; /* array of LigGlyph tables */ + HB_Bool loaded; }; typedef struct HB_LigCaretList_ HB_LigCaretList; @@ -91,18 +93,18 @@ typedef struct HB_LigCaretList_ HB_LigCaretList; struct HB_GDEFHeader_ { + HB_UShort** NewGlyphClasses; HB_UInt offset; + HB_UInt MarkAttachClassDef_offset; HB_16Dot16 Version; HB_ClassDefinition GlyphClassDef; HB_AttachList AttachList; HB_LigCaretList LigCaretList; - HB_UInt MarkAttachClassDef_offset; HB_ClassDefinition MarkAttachClassDef; /* new in OT 1.2 */ HB_UShort LastGlyph; - HB_UShort** NewGlyphClasses; }; typedef struct HB_GDEFHeader_ HB_GDEFHeader; @@ -129,6 +131,9 @@ HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef, HB_UShort* glyph_array, HB_UShort* class_array ); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif HB_END_HEADER diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-global.h b/src/3rdparty/harfbuzz/src/harfbuzz-global.h index d4e6b46..bccd6a2 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-global.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-global.h @@ -39,6 +39,10 @@ #define HB_END_HEADER /* nothing */ #endif +#if defined(__GNUC__) || defined(_MSC_VER) +#define HB_USE_PACKED_STRUCTS +#endif + HB_BEGIN_HEADER #ifndef FALSE diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h index 4110700..d513c27 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h @@ -32,6 +32,9 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif /* shared tables */ @@ -45,18 +48,20 @@ struct HB_ValueRecord_ advance */ HB_Short YAdvance; /* vertical adjustment for advance */ - HB_Device XPlacementDevice; /* device table for horizontal + HB_Device* XPlacementDevice; /* device table for horizontal placement */ - HB_Device YPlacementDevice; /* device table for vertical + HB_Device* YPlacementDevice; /* device table for vertical placement */ - HB_Device XAdvanceDevice; /* device table for horizontal + HB_Device* XAdvanceDevice; /* device table for horizontal advance */ - HB_Device YAdvanceDevice; /* device table for vertical + HB_Device* YAdvanceDevice; /* device table for vertical advance */ +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_UShort XIdPlacement; /* horizontal placement metric ID */ HB_UShort YIdPlacement; /* vertical placement metric ID */ HB_UShort XIdAdvance; /* horizontal advance metric ID */ HB_UShort YIdAdvance; /* vertical advance metric ID */ +#endif }; typedef struct HB_ValueRecord_ HB_ValueRecord; @@ -102,13 +107,14 @@ struct HB_AnchorFormat3_ { HB_Short XCoordinate; /* horizontal value */ HB_Short YCoordinate; /* vertical value */ - HB_Device XDeviceTable; /* device table for X coordinate */ - HB_Device YDeviceTable; /* device table for Y coordinate */ + HB_Device* XDeviceTable; /* device table for X coordinate */ + HB_Device* YDeviceTable; /* device table for Y coordinate */ }; typedef struct HB_AnchorFormat3_ HB_AnchorFormat3; +#ifdef HB_SUPPORT_MULTIPLE_MASTER struct HB_AnchorFormat4_ { HB_UShort XIdAnchor; /* horizontal metric ID */ @@ -116,11 +122,12 @@ struct HB_AnchorFormat4_ }; typedef struct HB_AnchorFormat4_ HB_AnchorFormat4; +#endif struct HB_Anchor_ { - HB_UShort PosFormat; /* 1, 2, 3, or 4 -- 0 indicates + HB_Byte PosFormat; /* 1, 2, 3, or 4 -- 0 indicates that there is no Anchor table */ union @@ -128,7 +135,9 @@ struct HB_Anchor_ HB_AnchorFormat1 af1; HB_AnchorFormat2 af2; HB_AnchorFormat3 af3; +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_AnchorFormat4 af4; +#endif } af; }; @@ -175,7 +184,7 @@ typedef struct HB_SinglePosFormat2_ HB_SinglePosFormat2; struct HB_SinglePos_ { - HB_UShort PosFormat; /* 1 or 2 */ + HB_Byte PosFormat; /* 1 or 2 */ HB_Coverage Coverage; /* Coverage table */ HB_UShort ValueFormat; /* format of ValueRecord table */ @@ -255,7 +264,7 @@ typedef struct HB_PairPosFormat2_ HB_PairPosFormat2; struct HB_PairPos_ { - HB_UShort PosFormat; /* 1 or 2 */ + HB_Byte PosFormat; /* 1 or 2 */ HB_Coverage Coverage; /* Coverage table */ HB_UShort ValueFormat1; /* format of ValueRecord table for first glyph */ @@ -507,7 +516,7 @@ typedef struct HB_ContextPosFormat3_ HB_ContextPosFormat3; struct HB_ContextPos_ { - HB_UShort PosFormat; /* 1, 2, or 3 */ + HB_Byte PosFormat; /* 1, 2, or 3 */ union { @@ -656,7 +665,7 @@ typedef struct HB_ChainContextPosFormat3_ HB_ChainContextPosFormat3; struct HB_ChainContextPos_ { - HB_UShort PosFormat; /* 1, 2, or 3 */ + HB_Byte PosFormat; /* 1, 2, or 3 */ union { @@ -707,6 +716,10 @@ HB_INTERNAL void _HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st, HB_UShort lookup_type ); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif + HB_END_HEADER #endif /* HARFBUZZ_GPOS_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c index 356dc01..61e42fd 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c @@ -57,6 +57,7 @@ static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi, +#ifdef HB_SUPPORT_MULTIPLE_MASTER /* the client application must replace this with something more meaningful if multiple master fonts are to be supported. */ @@ -71,6 +72,7 @@ static HB_Error default_mmfunc( HB_Font font, HB_UNUSED(data); return ERR(HB_Err_Not_Covered); /* ERR() call intended */ } +#endif @@ -97,7 +99,9 @@ HB_Error HB_Load_GPOS_Table( HB_Stream stream, if ( ALLOC ( gpos, sizeof( *gpos ) ) ) return error; +#ifdef HB_SUPPORT_MULTIPLE_MASTER gpos->mmfunc = default_mmfunc; +#endif /* skip version */ @@ -278,9 +282,7 @@ static HB_Error Load_ValueRecord( HB_ValueRecord* vr, else { empty1: - vr->XPlacementDevice.StartSize = 0; - vr->XPlacementDevice.EndSize = 0; - vr->XPlacementDevice.DeltaValue = NULL; + vr->XPlacementDevice = 0; } if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) @@ -309,9 +311,7 @@ static HB_Error Load_ValueRecord( HB_ValueRecord* vr, else { empty2: - vr->YPlacementDevice.StartSize = 0; - vr->YPlacementDevice.EndSize = 0; - vr->YPlacementDevice.DeltaValue = NULL; + vr->YPlacementDevice = 0; } if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) @@ -340,9 +340,7 @@ static HB_Error Load_ValueRecord( HB_ValueRecord* vr, else { empty3: - vr->XAdvanceDevice.StartSize = 0; - vr->XAdvanceDevice.EndSize = 0; - vr->XAdvanceDevice.DeltaValue = NULL; + vr->XAdvanceDevice = 0; } if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) @@ -371,9 +369,7 @@ static HB_Error Load_ValueRecord( HB_ValueRecord* vr, else { empty4: - vr->YAdvanceDevice.StartSize = 0; - vr->YAdvanceDevice.EndSize = 0; - vr->YAdvanceDevice.DeltaValue = NULL; + vr->YAdvanceDevice = 0; } if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT ) @@ -381,48 +377,72 @@ static HB_Error Load_ValueRecord( HB_ValueRecord* vr, if ( ACCESS_Frame( 2L ) ) goto Fail1; +#ifdef HB_SUPPORT_MULTIPLE_MASTER vr->XIdPlacement = GET_UShort(); +#else + (void) GET_UShort(); +#endif FORGET_Frame(); } +#ifdef HB_SUPPORT_MULTIPLE_MASTER else vr->XIdPlacement = 0; +#endif if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT ) { if ( ACCESS_Frame( 2L ) ) goto Fail1; +#ifdef HB_SUPPORT_MULTIPLE_MASTER vr->YIdPlacement = GET_UShort(); +#else + (void) GET_UShort(); +#endif FORGET_Frame(); } +#ifdef HB_SUPPORT_MULTIPLE_MASTER else vr->YIdPlacement = 0; +#endif if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE ) { if ( ACCESS_Frame( 2L ) ) goto Fail1; +#ifdef HB_SUPPORT_MULTIPLE_MASTER vr->XIdAdvance = GET_UShort(); +#else + (void) GET_UShort(); +#endif FORGET_Frame(); } +#ifdef HB_SUPPORT_MULTIPLE_MASTER else vr->XIdAdvance = 0; +#endif if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE ) { if ( ACCESS_Frame( 2L ) ) goto Fail1; +#ifdef HB_SUPPORT_MULTIPLE_MASTER vr->YIdAdvance = GET_UShort(); +#else + (void) GET_UShort(); +#endif FORGET_Frame(); } +#ifdef HB_SUPPORT_MULTIPLE_MASTER else vr->YIdAdvance = 0; +#endif return HB_Err_Ok; @@ -457,10 +477,12 @@ static HB_Error Get_ValueRecord( GPOS_Instance* gpi, HB_UShort format, HB_Position gd ) { - HB_Fixed value; HB_Short pixel_value; HB_Error error = HB_Err_Ok; +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_GPOSHeader* gpos = gpi->gpos; + HB_Fixed value; +#endif HB_UShort x_ppem, y_ppem; HB_16Dot16 x_scale, y_scale; @@ -511,6 +533,7 @@ static HB_Error Get_ValueRecord( GPOS_Instance* gpi, } } +#ifdef HB_SUPPORT_MULTIPLE_MASTER /* values returned from mmfunc() are already in fractional pixels */ if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT ) @@ -545,6 +568,7 @@ static HB_Error Get_ValueRecord( GPOS_Instance* gpi, return error; gd->y_advance += value; } +#endif return error; } @@ -619,9 +643,7 @@ static HB_Error Load_Anchor( HB_Anchor* an, } else { - an->af.af3.XDeviceTable.StartSize = 0; - an->af.af3.XDeviceTable.EndSize = 0; - an->af.af3.XDeviceTable.DeltaValue = NULL; + an->af.af3.XDeviceTable = 0; } if ( ACCESS_Frame( 2L ) ) @@ -644,9 +666,7 @@ static HB_Error Load_Anchor( HB_Anchor* an, } else { - an->af.af3.YDeviceTable.StartSize = 0; - an->af.af3.YDeviceTable.EndSize = 0; - an->af.af3.YDeviceTable.DeltaValue = NULL; + an->af.af3.YDeviceTable = 0; } break; @@ -654,8 +674,13 @@ static HB_Error Load_Anchor( HB_Anchor* an, if ( ACCESS_Frame( 4L ) ) return error; +#ifdef HB_SUPPORT_MULTIPLE_MASTER an->af.af4.XIdAnchor = GET_UShort(); an->af.af4.YIdAnchor = GET_UShort(); +#else + (void) GET_UShort(); + (void) GET_UShort(); +#endif FORGET_Frame(); break; @@ -690,7 +715,9 @@ static HB_Error Get_Anchor( GPOS_Instance* gpi, { HB_Error error = HB_Err_Ok; +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_GPOSHeader* gpos = gpi->gpos; +#endif HB_UShort ap; HB_Short pixel_value; @@ -756,6 +783,7 @@ static HB_Error Get_Anchor( GPOS_Instance* gpi, break; case 4: +#ifdef HB_SUPPORT_MULTIPLE_MASTER error = (gpos->mmfunc)( gpi->font, an->af.af4.XIdAnchor, x_value, gpos->data ); if ( error ) @@ -766,6 +794,9 @@ static HB_Error Get_Anchor( GPOS_Instance* gpi, if ( error ) return error; break; +#else + return ERR(HB_Err_Not_Covered); +#endif } return error; @@ -5966,8 +5997,7 @@ HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos ) return HB_Err_Ok; } - - +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, HB_MMFunction mmfunc, void* data ) @@ -5980,6 +6010,7 @@ HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, return HB_Err_Ok; } +#endif /* If `dvi' is TRUE, glyph contour points for anchor points and device tables are ignored -- you will get device independent values. */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h index 2840dae..92bff84 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h @@ -44,6 +44,7 @@ HB_BEGIN_HEADER #define HB_GPOS_LOOKUP_CHAIN 8 #define HB_GPOS_LOOKUP_EXTENSION 9 +#ifdef HB_SUPPORT_MULTIPLE_MASTER /* A pointer to a function which accesses the PostScript interpreter. Multiple Master fonts need this interface to convert a metric ID (as stored in an OpenType font version 1.2 or higher) `metric_id' @@ -59,6 +60,7 @@ typedef HB_Error (*HB_MMFunction)(HB_Font font, HB_UShort metric_id, HB_Fixed* metric_value, void* data ); +#endif struct HB_GPOSHeader_ @@ -71,12 +73,14 @@ struct HB_GPOSHeader_ HB_GDEFHeader* gdef; +#ifdef HB_SUPPORT_MULTIPLE_MASTER /* this is OpenType 1.2 -- Multiple Master fonts need this callback function to get various metric values from the PostScript interpreter. */ HB_MMFunction mmfunc; void* data; +#endif }; typedef struct HB_GPOSHeader_ HB_GPOSHeader; @@ -129,9 +133,11 @@ HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos, HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos ); +#ifdef HB_SUPPORT_MULTIPLE_MASTER HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, HB_MMFunction mmfunc, void* data ); +#endif /* If `dvi' is TRUE, glyph contour points for anchor points and device tables are ignored -- you will get device independent values. */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h index dd5ffdf..7eb329e 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h @@ -32,6 +32,9 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif typedef union HB_GSUB_SubTable_ HB_GSUB_SubTable; @@ -48,9 +51,9 @@ typedef struct HB_SingleSubstFormat1_ HB_SingleSubstFormat1; struct HB_SingleSubstFormat2_ { + HB_UShort* Substitute; /* array of substitute glyph IDs */ HB_UShort GlyphCount; /* number of glyph IDs in Substitute array */ - HB_UShort* Substitute; /* array of substitute glyph IDs */ }; typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2; @@ -58,14 +61,14 @@ typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2; struct HB_SingleSubst_ { - HB_UShort SubstFormat; /* 1 or 2 */ - HB_Coverage Coverage; /* Coverage table */ - union { HB_SingleSubstFormat1 ssf1; HB_SingleSubstFormat2 ssf2; } ssf; + + HB_Coverage Coverage; /* Coverage table */ + HB_Byte SubstFormat; /* 1 or 2 */ }; typedef struct HB_SingleSubst_ HB_SingleSubst; @@ -75,10 +78,10 @@ typedef struct HB_SingleSubst_ HB_SingleSubst; struct HB_Sequence_ { - HB_UShort GlyphCount; /* number of glyph IDs in the - Substitute array */ HB_UShort* Substitute; /* string of glyph IDs to substitute */ + HB_UShort GlyphCount; /* number of glyph IDs in the + Substitute array */ }; typedef struct HB_Sequence_ HB_Sequence; @@ -86,10 +89,10 @@ typedef struct HB_Sequence_ HB_Sequence; struct HB_MultipleSubst_ { - HB_UShort SubstFormat; /* always 1 */ + HB_Sequence* Sequence; /* array of Sequence tables */ HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubstFormat; /* always 1 */ HB_UShort SequenceCount; /* number of Sequence tables */ - HB_Sequence* Sequence; /* array of Sequence tables */ }; typedef struct HB_MultipleSubst_ HB_MultipleSubst; @@ -99,9 +102,9 @@ typedef struct HB_MultipleSubst_ HB_MultipleSubst; struct HB_AlternateSet_ { + HB_UShort* Alternate; /* array of alternate glyph IDs */ HB_UShort GlyphCount; /* number of glyph IDs in the Alternate array */ - HB_UShort* Alternate; /* array of alternate glyph IDs */ }; typedef struct HB_AlternateSet_ HB_AlternateSet; @@ -109,11 +112,11 @@ typedef struct HB_AlternateSet_ HB_AlternateSet; struct HB_AlternateSubst_ { - HB_UShort SubstFormat; /* always 1 */ + HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */ HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubstFormat; /* always 1 */ HB_UShort AlternateSetCount; /* number of AlternateSet tables */ - HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */ }; typedef struct HB_AlternateSubst_ HB_AlternateSubst; @@ -123,10 +126,10 @@ typedef struct HB_AlternateSubst_ HB_AlternateSubst; struct HB_Ligature_ { + HB_UShort* Component; /* array of component glyph IDs */ HB_UShort LigGlyph; /* glyphID of ligature to substitute */ HB_UShort ComponentCount; /* number of components in ligature */ - HB_UShort* Component; /* array of component glyph IDs */ }; typedef struct HB_Ligature_ HB_Ligature; @@ -134,8 +137,8 @@ typedef struct HB_Ligature_ HB_Ligature; struct HB_LigatureSet_ { - HB_UShort LigatureCount; /* number of Ligature tables */ HB_Ligature* Ligature; /* array of Ligature tables */ + HB_UShort LigatureCount; /* number of Ligature tables */ }; typedef struct HB_LigatureSet_ HB_LigatureSet; @@ -143,10 +146,10 @@ typedef struct HB_LigatureSet_ HB_LigatureSet; struct HB_LigatureSubst_ { - HB_UShort SubstFormat; /* always 1 */ + HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */ HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubstFormat; /* always 1 */ HB_UShort LigatureSetCount; /* number of LigatureSet tables */ - HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */ }; typedef struct HB_LigatureSubst_ HB_LigatureSubst; @@ -168,13 +171,13 @@ typedef struct HB_SubstLookupRecord_ HB_SubstLookupRecord; struct HB_SubRule_ { - HB_UShort GlyphCount; /* total number of input glyphs */ - HB_UShort SubstCount; /* number of SubstLookupRecord - tables */ HB_UShort* Input; /* array of input glyph IDs */ HB_SubstLookupRecord* SubstLookupRecord; /* array of SubstLookupRecord tables */ + HB_UShort GlyphCount; /* total number of input glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecord + tables */ }; typedef struct HB_SubRule_ HB_SubRule; @@ -182,8 +185,8 @@ typedef struct HB_SubRule_ HB_SubRule; struct HB_SubRuleSet_ { - HB_UShort SubRuleCount; /* number of SubRule tables */ HB_SubRule* SubRule; /* array of SubRule tables */ + HB_UShort SubRuleCount; /* number of SubRule tables */ }; typedef struct HB_SubRuleSet_ HB_SubRuleSet; @@ -191,9 +194,9 @@ typedef struct HB_SubRuleSet_ HB_SubRuleSet; struct HB_ContextSubstFormat1_ { + HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ HB_Coverage Coverage; /* Coverage table */ HB_UShort SubRuleSetCount; /* number of SubRuleSet tables */ - HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ }; typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1; @@ -201,13 +204,13 @@ typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1; struct HB_SubClassRule_ { - HB_UShort GlyphCount; /* total number of context classes */ - HB_UShort SubstCount; /* number of SubstLookupRecord - tables */ HB_UShort* Class; /* array of classes */ HB_SubstLookupRecord* SubstLookupRecord; /* array of SubstLookupRecord tables */ + HB_UShort GlyphCount; /* total number of context classes */ + HB_UShort SubstCount; /* number of SubstLookupRecord + tables */ }; typedef struct HB_SubClassRule_ HB_SubClassRule; @@ -215,9 +218,9 @@ typedef struct HB_SubClassRule_ HB_SubClassRule; struct HB_SubClassSet_ { + HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */ HB_UShort SubClassRuleCount; /* number of SubClassRule tables */ - HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */ }; typedef struct HB_SubClassSet_ HB_SubClassSet; @@ -229,13 +232,13 @@ typedef struct HB_SubClassSet_ HB_SubClassSet; struct HB_ContextSubstFormat2_ { - HB_UShort MaxContextLength; - /* maximal context length */ + HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */ HB_Coverage Coverage; /* Coverage table */ HB_ClassDefinition ClassDef; /* ClassDef table */ HB_UShort SubClassSetCount; /* number of SubClassSet tables */ - HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */ + HB_UShort MaxContextLength; + /* maximal context length */ }; typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2; @@ -243,11 +246,11 @@ typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2; struct HB_ContextSubstFormat3_ { - HB_UShort GlyphCount; /* number of input glyphs */ - HB_UShort SubstCount; /* number of SubstLookupRecords */ HB_Coverage* Coverage; /* array of Coverage tables */ HB_SubstLookupRecord* SubstLookupRecord; /* array of substitution lookups */ + HB_UShort GlyphCount; /* number of input glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecords */ }; typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3; @@ -255,14 +258,14 @@ typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3; struct HB_ContextSubst_ { - HB_UShort SubstFormat; /* 1, 2, or 3 */ - union { HB_ContextSubstFormat1 csf1; HB_ContextSubstFormat2 csf2; HB_ContextSubstFormat3 csf3; } csf; + + HB_Byte SubstFormat; /* 1, 2, or 3 */ }; typedef struct HB_ContextSubst_ HB_ContextSubst; @@ -272,18 +275,18 @@ typedef struct HB_ContextSubst_ HB_ContextSubst; struct HB_ChainSubRule_ { + HB_UShort* Backtrack; /* array of backtrack glyph IDs */ + HB_UShort* Input; /* array of input glyph IDs */ + HB_UShort* Lookahead; /* array of lookahead glyph IDs */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of SubstLookupRecords */ HB_UShort BacktrackGlyphCount; /* total number of backtrack glyphs */ - HB_UShort* Backtrack; /* array of backtrack glyph IDs */ HB_UShort InputGlyphCount; /* total number of input glyphs */ - HB_UShort* Input; /* array of input glyph IDs */ HB_UShort LookaheadGlyphCount; /* total number of lookahead glyphs */ - HB_UShort* Lookahead; /* array of lookahead glyph IDs */ HB_UShort SubstCount; /* number of SubstLookupRecords */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of SubstLookupRecords */ }; typedef struct HB_ChainSubRule_ HB_ChainSubRule; @@ -291,9 +294,9 @@ typedef struct HB_ChainSubRule_ HB_ChainSubRule; struct HB_ChainSubRuleSet_ { + HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ HB_UShort ChainSubRuleCount; /* number of ChainSubRule tables */ - HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ }; typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet; @@ -301,11 +304,11 @@ typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet; struct HB_ChainContextSubstFormat1_ { + HB_ChainSubRuleSet* ChainSubRuleSet; + /* array of ChainSubRuleSet tables */ HB_Coverage Coverage; /* Coverage table */ HB_UShort ChainSubRuleSetCount; /* number of ChainSubRuleSet tables */ - HB_ChainSubRuleSet* ChainSubRuleSet; - /* array of ChainSubRuleSet tables */ }; typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1; @@ -313,20 +316,20 @@ typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1; struct HB_ChainSubClassRule_ { + HB_UShort* Backtrack; /* array of backtrack classes */ + HB_UShort* Input; /* array of context classes */ + HB_UShort* Lookahead; /* array of lookahead classes */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of substitution lookups */ HB_UShort BacktrackGlyphCount; /* total number of backtrack classes */ - HB_UShort* Backtrack; /* array of backtrack classes */ HB_UShort InputGlyphCount; /* total number of context classes */ - HB_UShort* Input; /* array of context classes */ HB_UShort LookaheadGlyphCount; /* total number of lookahead classes */ - HB_UShort* Lookahead; /* array of lookahead classes */ HB_UShort SubstCount; /* number of SubstLookupRecords */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of substitution lookups */ }; typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule; @@ -334,12 +337,12 @@ typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule; struct HB_ChainSubClassSet_ { - HB_UShort ChainSubClassRuleCount; - /* number of ChainSubClassRule - tables */ HB_ChainSubClassRule* ChainSubClassRule; /* array of ChainSubClassRule tables */ + HB_UShort ChainSubClassRuleCount; + /* number of ChainSubClassRule + tables */ }; typedef struct HB_ChainSubClassSet_ HB_ChainSubClassSet; @@ -351,27 +354,27 @@ typedef struct HB_ChainSubClassSet_ HB_ChainSubClassSet; struct HB_ChainContextSubstFormat2_ { + HB_ChainSubClassSet* ChainSubClassSet; + /* array of ChainSubClassSet + tables */ HB_Coverage Coverage; /* Coverage table */ - HB_UShort MaxBacktrackLength; - /* maximal backtrack length */ HB_ClassDefinition BacktrackClassDef; /* BacktrackClassDef table */ - HB_UShort MaxInputLength; - /* maximal input length */ HB_ClassDefinition InputClassDef; /* InputClassDef table */ - HB_UShort MaxLookaheadLength; - /* maximal lookahead length */ HB_ClassDefinition LookaheadClassDef; /* LookaheadClassDef table */ HB_UShort ChainSubClassSetCount; /* number of ChainSubClassSet tables */ - HB_ChainSubClassSet* ChainSubClassSet; - /* array of ChainSubClassSet - tables */ + HB_UShort MaxBacktrackLength; + /* maximal backtrack length */ + HB_UShort MaxLookaheadLength; + /* maximal lookahead length */ + HB_UShort MaxInputLength; + /* maximal input length */ }; typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2; @@ -379,24 +382,24 @@ typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2; struct HB_ChainContextSubstFormat3_ { - HB_UShort BacktrackGlyphCount; - /* number of backtrack glyphs */ HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage tables */ - HB_UShort InputGlyphCount; - /* number of input glyphs */ HB_Coverage* InputCoverage; /* array of input coverage tables */ - HB_UShort LookaheadGlyphCount; - /* number of lookahead glyphs */ HB_Coverage* LookaheadCoverage; /* array of lookahead coverage tables */ - HB_UShort SubstCount; /* number of SubstLookupRecords */ HB_SubstLookupRecord* SubstLookupRecord; /* array of substitution lookups */ + HB_UShort BacktrackGlyphCount; + /* number of backtrack glyphs */ + HB_UShort InputGlyphCount; + /* number of input glyphs */ + HB_UShort LookaheadGlyphCount; + /* number of lookahead glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecords */ }; typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3; @@ -404,14 +407,14 @@ typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3; struct HB_ChainContextSubst_ { - HB_UShort SubstFormat; /* 1, 2, or 3 */ - union { HB_ChainContextSubstFormat1 ccsf1; HB_ChainContextSubstFormat2 ccsf2; HB_ChainContextSubstFormat3 ccsf3; } ccsf; + + HB_Byte SubstFormat; /* 1, 2, or 3 */ }; typedef struct HB_ChainContextSubst_ HB_ChainContextSubst; @@ -421,9 +424,9 @@ typedef struct HB_ChainContextSubst_ HB_ChainContextSubst; /* LookupType 7 */ struct HB_ExtensionSubst_ { + HB_GSUB_SubTable *subtable; /* referenced subtable */ HB_UShort SubstFormat; /* always 1 */ HB_UShort LookuptType; /* lookup-type of referenced subtable */ - HB_GSUB_SubTable *subtable; /* referenced subtable */ }; typedef struct HB_ExtensionSubst_ HB_ExtensionSubst; @@ -433,16 +436,16 @@ typedef struct HB_ExtensionSubst_ HB_ExtensionSubst; /* LookupType 8 */ struct HB_ReverseChainContextSubst_ { - HB_UShort SubstFormat; /* always 1 */ - HB_Coverage Coverage; /* coverage table for input glyphs */ - HB_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ + HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage + tables */ + HB_UShort* Substitute; /* array of substitute Glyph ID */ HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage tables */ + HB_Coverage Coverage; /* coverage table for input glyphs */ + HB_UShort SubstFormat; /* always 1 */ + HB_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ HB_UShort LookaheadGlyphCount; /* number of lookahead glyphs */ - HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage - tables */ HB_UShort GlyphCount; /* number of Glyph IDs */ - HB_UShort* Substitute; /* array of substitute Glyph ID */ }; typedef struct HB_ReverseChainContextSubst_ HB_ReverseChainContextSubst; @@ -471,6 +474,10 @@ HB_INTERNAL void _HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, HB_UShort lookup_type ); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif + HB_END_HEADER #endif /* HARFBUZZ_GSUB_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h index 1ca3f0c..b00df44 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h @@ -32,6 +32,10 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + /* Lookup types for glyph substitution */ #define HB_GSUB_LOOKUP_SINGLE 1 @@ -60,6 +64,14 @@ typedef HB_UShort (*HB_AltFunction)(HB_UInt pos, struct HB_GSUBHeader_ { + HB_GDEFHeader* gdef; + + /* the next two fields are used for an alternate substitution callback + function to select the proper alternate glyph. */ + + void* data; + HB_AltFunction altfunc; + HB_UInt offset; HB_16Dot16 Version; @@ -67,14 +79,6 @@ struct HB_GSUBHeader_ HB_ScriptList ScriptList; HB_FeatureList FeatureList; HB_LookupList LookupList; - - HB_GDEFHeader* gdef; - - /* the next two fields are used for an alternate substitution callback - function to select the proper alternate glyph. */ - - HB_AltFunction altfunc; - void* data; }; typedef struct HB_GSUBHeader_ HB_GSUBHeader; @@ -135,6 +139,9 @@ HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub, HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub, HB_Buffer buffer ); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif HB_END_HEADER diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h index 73dd383..1f7b353 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h @@ -69,7 +69,7 @@ _HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd, HB_UInt base_offset, HB_Stream input ); HB_INTERNAL HB_Error -_HB_OPEN_Load_Device( HB_Device* d, +_HB_OPEN_Load_Device( HB_Device** d, HB_Stream input ); HB_INTERNAL void _HB_OPEN_Free_ScriptList( HB_ScriptList* sl ); @@ -79,7 +79,7 @@ HB_INTERNAL void _HB_OPEN_Free_LookupList( HB_LookupList* ll, HB_INTERNAL void _HB_OPEN_Free_Coverage( HB_Coverage* c ); HB_INTERNAL void _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd ); -HB_INTERNAL void _HB_OPEN_Free_Device( HB_Device* d ); +HB_INTERNAL void _HB_OPEN_Free_Device( HB_Device** d ); @@ -93,7 +93,7 @@ _HB_OPEN_Get_Class( HB_ClassDefinition* cd, HB_UShort* klass, HB_UShort* index ); HB_INTERNAL HB_Error -_HB_OPEN_Get_Device( HB_Device* d, +_HB_OPEN_Get_Device( HB_Device** d, HB_UShort size, HB_Short* value ); diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.c b/src/3rdparty/harfbuzz/src/harfbuzz-open.c index 0fe1e4d..255b7e6 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-open.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-open.c @@ -1282,9 +1282,10 @@ _HB_OPEN_Get_Class( HB_ClassDefinition* cd, HB_INTERNAL HB_Error -_HB_OPEN_Load_Device( HB_Device* d, +_HB_OPEN_Load_Device( HB_Device** device, HB_Stream stream ) { + HB_Device* d; HB_Error error; HB_UShort n, count; @@ -1295,6 +1296,14 @@ _HB_OPEN_Load_Device( HB_Device* d, if ( ACCESS_Frame( 6L ) ) return error; + if ( ALLOC( *device, sizeof(HB_Device)) ) + { + *device = 0; + return error; + } + + d = *device; + d->StartSize = GET_UShort(); d->EndSize = GET_UShort(); d->DeltaFormat = GET_UShort(); @@ -1318,11 +1327,17 @@ _HB_OPEN_Load_Device( HB_Device* d, ( 4 - d->DeltaFormat ) ) + 1; if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) ) + { + FREE( *device ); + *device = 0; return error; + } if ( ACCESS_Frame( count * 2L ) ) { FREE( d->DeltaValue ); + FREE( *device ); + *device = 0; return error; } @@ -1338,9 +1353,13 @@ _HB_OPEN_Load_Device( HB_Device* d, HB_INTERNAL void -_HB_OPEN_Free_Device( HB_Device* d ) +_HB_OPEN_Free_Device( HB_Device** d ) { - FREE( d->DeltaValue ); + if ( *d ) + { + FREE( (*d)->DeltaValue ); + FREE( *d ); + } } @@ -1380,12 +1399,21 @@ _HB_OPEN_Free_Device( HB_Device* d ) mask = 0x00FF */ HB_INTERNAL HB_Error -_HB_OPEN_Get_Device( HB_Device* d, +_HB_OPEN_Get_Device( HB_Device** device, HB_UShort size, HB_Short* value ) { + HB_Device* d; HB_UShort byte, bits, mask, f, s; + HB_Error error; + + if ( ALLOC( *device, sizeof(HB_Device)) ) + { + *device = 0; + return error; + } + d = *device; f = d->DeltaFormat; @@ -1408,6 +1436,8 @@ _HB_OPEN_Get_Device( HB_Device* d, else { *value = 0; + FREE( *device ); + *device = 0; return HB_Err_Not_Covered; } } diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.h b/src/3rdparty/harfbuzz/src/harfbuzz-open.h index bdc6358..4ba6cf5 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-open.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-open.h @@ -30,6 +30,10 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + /* Use this if a feature applies to all glyphs */ #define HB_ALL_GLYPHS 0xFFFF @@ -42,10 +46,10 @@ HB_BEGIN_HEADER struct HB_LangSys_ { + HB_UShort* FeatureIndex; /* array of Feature indices */ HB_UShort LookupOrderOffset; /* always 0 for TT Open 1.0 */ HB_UShort ReqFeatureIndex; /* required FeatureIndex */ HB_UShort FeatureCount; /* number of Feature indices */ - HB_UShort* FeatureIndex; /* array of Feature indices */ }; typedef struct HB_LangSys_ HB_LangSys; @@ -53,8 +57,8 @@ typedef struct HB_LangSys_ HB_LangSys; struct HB_LangSysRecord_ { - HB_UInt LangSysTag; /* LangSysTag identifier */ HB_LangSys LangSys; /* LangSys table */ + HB_UInt LangSysTag; /* LangSysTag identifier */ }; typedef struct HB_LangSysRecord_ HB_LangSysRecord; @@ -62,9 +66,9 @@ typedef struct HB_LangSysRecord_ HB_LangSysRecord; struct HB_ScriptTable_ { + HB_LangSysRecord* LangSysRecord; /* array of LangSysRecords */ HB_LangSys DefaultLangSys; /* DefaultLangSys table */ HB_UShort LangSysCount; /* number of LangSysRecords */ - HB_LangSysRecord* LangSysRecord; /* array of LangSysRecords */ }; typedef struct HB_ScriptTable_ HB_ScriptTable; @@ -81,8 +85,8 @@ typedef struct HB_ScriptRecord_ HB_ScriptRecord; struct HB_ScriptList_ { - HB_UShort ScriptCount; /* number of ScriptRecords */ HB_ScriptRecord* ScriptRecord; /* array of ScriptRecords */ + HB_UShort ScriptCount; /* number of ScriptRecords */ }; typedef struct HB_ScriptList_ HB_ScriptList; @@ -92,9 +96,9 @@ typedef struct HB_ScriptList_ HB_ScriptList; struct HB_Feature_ { + HB_UShort* LookupListIndex; /* array of LookupList indices */ HB_UShort FeatureParams; /* always 0 for TT Open 1.0 */ HB_UShort LookupListCount; /* number of LookupList indices */ - HB_UShort* LookupListIndex; /* array of LookupList indices */ }; typedef struct HB_Feature_ HB_Feature; @@ -111,9 +115,9 @@ typedef struct HB_FeatureRecord_ HB_FeatureRecord; struct HB_FeatureList_ { - HB_UShort FeatureCount; /* number of FeatureRecords */ - HB_FeatureRecord* FeatureRecord; /* array of FeatureRecords */ HB_UShort* ApplyOrder; /* order to apply features */ + HB_FeatureRecord* FeatureRecord; /* array of FeatureRecords */ + HB_UShort FeatureCount; /* number of FeatureRecords */ HB_UShort ApplyCount; /* number of elements in ApplyOrder */ }; @@ -127,10 +131,10 @@ typedef struct HB_SubTable_ HB_SubTable; struct HB_Lookup_ { + HB_SubTable* SubTable; /* array of SubTables */ HB_UShort LookupType; /* Lookup type */ HB_UShort LookupFlag; /* Lookup qualifiers */ HB_UShort SubTableCount; /* number of SubTables */ - HB_SubTable* SubTable; /* array of SubTables */ }; typedef struct HB_Lookup_ HB_Lookup; @@ -144,9 +148,9 @@ typedef struct HB_Lookup_ HB_Lookup; struct HB_LookupList_ { - HB_UShort LookupCount; /* number of Lookups */ HB_Lookup* Lookup; /* array of Lookup records */ HB_UInt* Properties; /* array of flags */ + HB_UShort LookupCount; /* number of Lookups */ }; typedef struct HB_LookupList_ HB_LookupList; @@ -167,8 +171,8 @@ typedef struct HB_LookupList_ HB_LookupList; struct HB_CoverageFormat1_ { - HB_UShort GlyphCount; /* number of glyphs in GlyphArray */ HB_UShort* GlyphArray; /* array of glyph IDs */ + HB_UShort GlyphCount; /* number of glyphs in GlyphArray */ }; typedef struct HB_CoverageFormat1_ HB_CoverageFormat1; @@ -187,8 +191,8 @@ typedef struct HB_RangeRecord_ HB_RangeRecord; struct HB_CoverageFormat2_ { - HB_UShort RangeCount; /* number of RangeRecords */ HB_RangeRecord* RangeRecord; /* array of RangeRecords */ + HB_UShort RangeCount; /* number of RangeRecords */ }; typedef struct HB_CoverageFormat2_ HB_CoverageFormat2; @@ -196,7 +200,7 @@ typedef struct HB_CoverageFormat2_ HB_CoverageFormat2; struct HB_Coverage_ { - HB_UShort CoverageFormat; /* 1 or 2 */ + HB_Byte CoverageFormat; /* 1 or 2 */ union { @@ -210,10 +214,10 @@ typedef struct HB_Coverage_ HB_Coverage; struct HB_ClassDefFormat1_ { + HB_UShort* ClassValueArray; /* array of class values */ HB_UShort StartGlyph; /* first glyph ID of the ClassValueArray */ HB_UShort GlyphCount; /* size of the ClassValueArray */ - HB_UShort* ClassValueArray; /* array of class values */ }; typedef struct HB_ClassDefFormat1_ HB_ClassDefFormat1; @@ -231,10 +235,10 @@ typedef struct HB_ClassRangeRecord_ HB_ClassRangeRecord; struct HB_ClassDefFormat2_ { - HB_UShort ClassRangeCount; - /* number of ClassRangeRecords */ HB_ClassRangeRecord* ClassRangeRecord; /* array of ClassRangeRecords */ + HB_UShort ClassRangeCount; + /* number of ClassRangeRecords */ }; typedef struct HB_ClassDefFormat2_ HB_ClassDefFormat2; @@ -242,15 +246,14 @@ typedef struct HB_ClassDefFormat2_ HB_ClassDefFormat2; struct HB_ClassDefinition_ { - HB_Bool loaded; - - HB_UShort ClassFormat; /* 1 or 2 */ - union { HB_ClassDefFormat1 cd1; HB_ClassDefFormat2 cd2; } cd; + + HB_Byte ClassFormat; /* 1 or 2 */ + HB_Bool loaded; }; typedef struct HB_ClassDefinition_ HB_ClassDefinition; @@ -258,11 +261,11 @@ typedef struct HB_ClassDefinition_ HB_ClassDefinition; struct HB_Device_ { + HB_UShort* DeltaValue; /* array of compressed data */ HB_UShort StartSize; /* smallest size to correct */ HB_UShort EndSize; /* largest size to correct */ - HB_UShort DeltaFormat; /* DeltaValue array data format: + HB_Byte DeltaFormat; /* DeltaValue array data format: 1, 2, or 3 */ - HB_UShort* DeltaValue; /* array of compressed data */ }; typedef struct HB_Device_ HB_Device; @@ -276,6 +279,9 @@ enum HB_Type_ typedef enum HB_Type_ HB_Type; +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif HB_END_HEADER diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp index 4bc53c8..ce4d4ac 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp @@ -183,18 +183,15 @@ static void calcLineBreaks(const HB_UChar16 *uc, hb_uint32 len, HB_CharAttribute if (ncls >= HB_LineBreak_CR) goto next; - // two complex chars (thai or lao), thai_attributes might override, but here we do a best guess - if (cls == HB_LineBreak_SA && ncls == HB_LineBreak_SA) { - lineBreakType = HB_Break; - goto next; - } - { int tcls = ncls; + // for south east asian chars that require a complex (dictionary analysis), the unicode + // standard recommends to treat them as AL. thai_attributes and other attribute methods that + // do dictionary analysis can override if (tcls >= HB_LineBreak_SA) - tcls = HB_LineBreak_ID; + tcls = HB_LineBreak_AL; if (cls >= HB_LineBreak_SA) - cls = HB_LineBreak_ID; + cls = HB_LineBreak_AL; int brk = breakTable[cls][tcls]; switch (brk) { diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h index 470e27b..32f5781 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h @@ -34,6 +34,10 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + /* using anything else than signed or unsigned for bitfields in C is non standard, but accepted by almost all compilers. And it gives a significant reduction in @@ -281,6 +285,10 @@ struct HB_ShaperItem_ { HB_Bool HB_ShapeItem(HB_ShaperItem *item); +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif + HB_END_HEADER #endif diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h index 9991936..a155cc2 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h @@ -30,15 +30,21 @@ HB_BEGIN_HEADER +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(push, 1) +#endif + typedef struct HB_StreamRec_ { HB_Byte* base; + HB_Byte* cursor; HB_UInt size; HB_UInt pos; - - HB_Byte* cursor; } HB_StreamRec; +#ifdef HB_USE_PACKED_STRUCTS +#pragma pack(pop) +#endif HB_END_HEADER diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c index 1d1aa2f..fc2bdbf 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c @@ -27,57 +27,79 @@ #include "harfbuzz-external.h" #include <assert.h> +#include <stdio.h> + +typedef int (*th_brk_def)(const char*, int[], int); +static th_brk_def th_brk = 0; +static int libthai_resolved = 0; + +static void resolve_libthai() +{ + if (!th_brk) + th_brk = (th_brk_def)HB_Library_Resolve("thai", 0, "th_brk"); + libthai_resolved = 1; +} + +static void to_tis620(const HB_UChar16 *string, hb_uint32 len, const char *cstr) +{ + hb_uint32 i; + unsigned char *result = (unsigned char *)cstr; + + for (i = 0; i < len; ++i) { + if (string[i] <= 0xa0) + result[i] = (unsigned char)string[i]; + if (string[i] >= 0xe01 && string[i] <= 0xe5b) + result[i] = (unsigned char)(string[i] - 0xe00 + 0xa0); + else + result[i] = '?'; + } +} static void thaiWordBreaks(const HB_UChar16 *string, hb_uint32 len, HB_CharAttributes *attributes) { - typedef int (*th_brk_def)(const char*, int[], int); - static void *thaiCodec = 0; - static th_brk_def th_brk = 0; - char *cstr = 0; + char s[128]; + char *cstr = s; int brp[128]; int *break_positions = brp; hb_uint32 numbreaks; hb_uint32 i; - if (!thaiCodec) - thaiCodec = HB_TextCodecForMib(2259); - - /* load libthai dynamically */ - if (!th_brk && thaiCodec) { - th_brk = (th_brk_def)HB_Library_Resolve("thai", "th_brk"); - if (!th_brk) - thaiCodec = 0; - } + if (!libthai_resolved) + resolve_libthai(); if (!th_brk) return; - cstr = HB_TextCodec_ConvertFromUnicode(thaiCodec, string, len, 0); - if (!cstr) - return; + if (len > 128) + cstr = (char *)malloc(len*sizeof(char)); + + to_tis620(string, len, cstr); - break_positions = brp; numbreaks = th_brk(cstr, break_positions, 128); if (numbreaks > 128) { break_positions = (int *)malloc(numbreaks * sizeof(int)); numbreaks = th_brk(cstr, break_positions, numbreaks); } - for (i = 0; i < len; ++i) + for (i = 0; i < len; ++i) { attributes[i].lineBreakType = HB_NoBreak; + attributes[i].wordBoundary = FALSE; + } for (i = 0; i < numbreaks; ++i) { - if (break_positions[i] > 0) + if (break_positions[i] > 0) { attributes[break_positions[i]-1].lineBreakType = HB_Break; + attributes[i].wordBoundary = TRUE; + } } if (break_positions != brp) free(break_positions); - HB_TextCodec_FreeResult(cstr); + if (len > 128) + free(cstr); } - void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) { assert(script == HB_Script_Thai); diff --git a/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc b/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc new file mode 100644 index 0000000..133577a --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc @@ -0,0 +1,124 @@ +// This is a fuzzing harness for Harfbuzz. Since Harfbuzz's input is generally +// expected to be controlled by a remote party it's a possible vector for +// security issues. +// +// Fuzzing is a black-box testing scheme where the black-box (Harfbuzz's shaping +// engine in this case) is fed random input to see if it will misbehave. +// Misbehaviours can often be turned into security or crash issues. +// +// It's expected that one will generally run this under valgrind in order to get +// better detection of problems. + +#include <stdint.h> +#include <stdio.h> + +#include <ft2build.h> +#include FT_FREETYPE_H + +#include "../../src/harfbuzz-shaper.h" +#include "../../src/harfbuzz-global.h" +#include "../../src/harfbuzz-gpos.h" + +extern "C" { +#include "../../contrib/harfbuzz-unicode.h" +#include "../../contrib/harfbuzz-freetype.h" +} + +static FT_Library freetype; + +static FT_Face loadFace(const char *path) +{ + FT_Face face; + + if (FT_New_Face(freetype, path, /* index */ 0, &face)) + return 0; + return face; +} + +static const int kWidth = 100; +static const int kHeight = 100; + +static int +usage(const char *argv0) { + fprintf(stderr, "Usage: %s <TTF file>\n", argv0); + return 1; +} + +int +main(int argc, char **argv) { + FT_Init_FreeType(&freetype); + + if (argc != 2) + return usage(argv[0]); + + FT_Face face; + if (FT_New_Face(freetype, argv[1], 0 /* face index */, &face)) { + fprintf(stderr, "Failed to load font file\n"); + return 1; + } + + HB_Face hbFace = HB_NewFace(face, hb_freetype_table_sfnt_get); + + HB_FontRec hbFont; + hbFont.klass = &hb_freetype_class; + hbFont.userData = face; + hbFont.x_ppem = face->size->metrics.x_ppem; + hbFont.y_ppem = face->size->metrics.y_ppem; + hbFont.x_scale = face->size->metrics.x_scale; + hbFont.y_scale = face->size->metrics.y_scale; + + // This is the maximum number of bytes of input which we'll feed to Harfbuzz + // in one shot. We also overload it and make it the size of the output arrays + // as well. (Must be a power of two.) + static const unsigned kMaxInputBytes = 1024; + uint8_t str[kMaxInputBytes]; + + HB_ShaperItem shaper_item; + shaper_item.kerning_applied = false; + shaper_item.string = (HB_UChar16 *) str; + shaper_item.stringLength = 0; + shaper_item.item.bidiLevel = 0; + shaper_item.shaperFlags = 0; + shaper_item.font = &hbFont; + shaper_item.face = hbFace; + shaper_item.glyphIndicesPresent = false; + shaper_item.initialGlyphCount = 0; + + HB_Glyph out_glyphs[kMaxInputBytes]; + HB_GlyphAttributes out_attrs[kMaxInputBytes]; + HB_Fixed out_advs[kMaxInputBytes]; + HB_FixedPoint out_offsets[kMaxInputBytes]; + unsigned short out_logClusters[kMaxInputBytes]; + + shaper_item.glyphs = out_glyphs; + shaper_item.attributes = out_attrs; + shaper_item.advances = out_advs; + shaper_item.offsets = out_offsets; + shaper_item.log_clusters = out_logClusters; + shaper_item.num_glyphs = kMaxInputBytes; + + FILE *urandom = fopen("/dev/urandom", "rb"); + if (!urandom) { + fprintf(stderr, "Cannot open /dev/urandom\n"); + return 1; + } + + for (;;) { + uint16_t len; + fread(&len, sizeof(len), 1, urandom); + len &= (kMaxInputBytes - 1); + len &= ~1; + fread(str, len, 1, urandom); + + ssize_t iterator = 0; + + for (;;) { + if (!hb_utf16_script_run_next(NULL, &shaper_item.item, (uint16_t *) str, len >> 1, &iterator)) + break; + + HB_ShapeItem(&shaper_item); + } + } + + HB_FreeFace(hbFace); +} diff --git a/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp b/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp index ea03052..f0048b7 100644 --- a/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp +++ b/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp @@ -79,30 +79,9 @@ void HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *grapheme, *lineBreak = (HB_LineBreakClass) prop->line_break_class; } -void *HB_Library_Resolve(const char *library, const char *symbol) +void *HB_Library_Resolve(const char *library, int version, const char *symbol) { - return QLibrary::resolve(library, symbol); -} - -void *HB_TextCodecForMib(int mib) -{ - return QTextCodec::codecForMib(mib); -} - -char *HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength) -{ - QByteArray data = reinterpret_cast<QTextCodec *>(codec)->fromUnicode((const QChar *)unicode, length); - // ### suboptimal - char *output = (char *)malloc(data.length() + 1); - memcpy(output, data.constData(), data.length() + 1); - if (outputLength) - *outputLength = data.length(); - return output; -} - -void HB_TextCodec_FreeResult(char *string) -{ - free(string); + return QLibrary::resolve(library, version, symbol); } } diff --git a/src/3rdparty/javascriptcore/WebKit.pri b/src/3rdparty/javascriptcore/WebKit.pri index 0dd0799..9aaaa99 100644 --- a/src/3rdparty/javascriptcore/WebKit.pri +++ b/src/3rdparty/javascriptcore/WebKit.pri @@ -36,7 +36,7 @@ building-libs { win32-*|wince* { CONFIG(debug, debug|release):build_pass: QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}d QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}$${QT_MAJOR_VERSION} - win32-g++: LIBS += -l$$QTWEBKITLIBNAME + win32-g++*: LIBS += -l$$QTWEBKITLIBNAME else: LIBS += $${QTWEBKITLIBNAME}.lib } else { LIBS += -lQtWebKit diff --git a/src/3rdparty/webkit/.tag b/src/3rdparty/webkit/.tag index 125e175..07a02d7 100644 --- a/src/3rdparty/webkit/.tag +++ b/src/3rdparty/webkit/.tag @@ -1 +1 @@ -0f8941d0dd5f947530e1dc55b859d810bba14764 +40c2d6907ef75288b4f15e7fad334b9138acdbbf diff --git a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro index 22fcc91..3f1ac86 100644 --- a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro +++ b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro @@ -43,7 +43,7 @@ CONFIG(QTDIR_build) { } # Pick up 3rdparty libraries from INCLUDE/LIB just like with MSVC -win32-g++ { +win32-g++* { TMPPATH = $$quote($$(INCLUDE)) QMAKE_INCDIR_POST += $$split(TMPPATH,";") TMPPATH = $$quote($$(LIB)) diff --git a/src/3rdparty/webkit/VERSION b/src/3rdparty/webkit/VERSION index 6aaae4f..b648b94 100644 --- a/src/3rdparty/webkit/VERSION +++ b/src/3rdparty/webkit/VERSION @@ -4,4 +4,4 @@ This is a snapshot of the Qt port of WebKit from and has the sha1 checksum - f943ead2759537527faa7f3cb057d995291663b9 + 40c2d6907ef75288b4f15e7fad334b9138acdbbf diff --git a/src/3rdparty/webkit/WebCore/ChangeLog b/src/3rdparty/webkit/WebCore/ChangeLog index e04729d..6a7da30 100644 --- a/src/3rdparty/webkit/WebCore/ChangeLog +++ b/src/3rdparty/webkit/WebCore/ChangeLog @@ -1,3 +1,16 @@ +2010-06-15 Jocelyn Turcotte <jocelyn.turcotte@nokia.com> + + Reviewed by Simon Hausmann. + + [Qt] The qt_webkit_version.pri file gets overwritten on install + https://bugs.webkit.org/show_bug.cgi?id=40487 + + Don't install qt_webkit_version.pri when building WebKit inside of Qt. + The import of WebKit into Qt will take care of providing the file + in mkspecs/modules and it'll be installed through projects.pro. + + * WebCore.pro: + 2010-06-13 Noam Rosenthal <noam.rosenthal@nokia.com> Reviewed by Eric Seidel. diff --git a/src/3rdparty/webkit/WebCore/WebCore.pri b/src/3rdparty/webkit/WebCore/WebCore.pri index 9debd6a..97ae526 100644 --- a/src/3rdparty/webkit/WebCore/WebCore.pri +++ b/src/3rdparty/webkit/WebCore/WebCore.pri @@ -107,7 +107,7 @@ greaterThan(QT_MINOR_VERSION, 5) { !lessThan(QT_MINOR_VERSION, 7) { DEFINES += ENABLE_QT_BEARER=1 } else { - load(mobilityconfig) + load(mobilityconfig, true) contains(MOBILITY_CONFIG, bearer) { DEFINES += ENABLE_QT_BEARER=1 } diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro index 048fc93..e0b4905 100644 --- a/src/3rdparty/webkit/WebCore/WebCore.pro +++ b/src/3rdparty/webkit/WebCore/WebCore.pro @@ -103,7 +103,7 @@ win32-msvc2005|win32-msvc2008:{ } # Pick up 3rdparty libraries from INCLUDE/LIB just like with MSVC -win32-g++ { +win32-g++* { TMPPATH = $$quote($$(INCLUDE)) QMAKE_INCDIR_POST += $$split(TMPPATH,";") TMPPATH = $$quote($$(LIB)) @@ -2845,12 +2845,7 @@ contains(DEFINES, ENABLE_SYMBIAN_DIALOG_PROVIDERS) { include($$PWD/../WebKit/qt/Api/headers.pri) HEADERS += $$WEBKIT_API_HEADERS -CONFIG(QTDIR_build) { - modfile.files = $$moduleFile - modfile.path = $$[QMAKE_MKSPECS]/modules - - INSTALLS += modfile -} else { +!CONFIG(QTDIR_build) { exists($$OUTPUT_DIR/include/QtWebKit/classheaders.pri): include($$OUTPUT_DIR/include/QtWebKit/classheaders.pri) WEBKIT_INSTALL_HEADERS = $$WEBKIT_API_HEADERS $$WEBKIT_CLASS_HEADERS @@ -2935,7 +2930,7 @@ CONFIG(QTDIR_build) { CONFIG += no_debug_info } -!win32-g++:win32:contains(QMAKE_HOST.arch, x86_64):{ +win32:!win32-g++*:contains(QMAKE_HOST.arch, x86_64):{ asm_compiler.commands = ml64 /c asm_compiler.commands += /Fo ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} asm_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.cpp index 910d39a..799055d 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.cpp @@ -404,7 +404,9 @@ bool BitmapImage::internalAdvanceAnimation(bool skippingFrames) // Get the repetition count again. If we weren't able to get a // repetition count before, we should have decoded the whole image by // now, so it should now be available. - if (repetitionCount(true) && m_repetitionsComplete >= m_repetitionCount) { + // Note that we don't need to special-case cAnimationLoopOnce here + // because it is 0 (see comments on its declaration in ImageSource.h). + if (repetitionCount(true) != cAnimationLoopInfinite && m_repetitionsComplete > m_repetitionCount) { m_animationFinished = true; m_desiredFrameStartTime = 0; --m_currentFrame; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h index 258fd0f..0853d7b 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h @@ -86,7 +86,22 @@ typedef RefPtr<SharedBitmap> NativeImagePtr; #endif #endif -const int cAnimationLoopOnce = -1; +// Right now GIFs are the only recognized image format that supports animation. +// The animation system and the constants below are designed with this in mind. +// GIFs have an optional 16-bit unsigned loop count that describes how an +// animated GIF should be cycled. If the loop count is absent, the animation +// cycles once; if it is 0, the animation cycles infinitely; otherwise the +// animation plays n + 1 cycles (where n is the specified loop count). If the +// GIF decoder defaults to cAnimationLoopOnce in the absence of any loop count +// and translates an explicit "0" loop count to cAnimationLoopInfinite, then we +// get a couple of nice side effects: +// * By making cAnimationLoopOnce be 0, we allow the animation cycling code in +// BitmapImage.cpp to avoid special-casing it, and simply treat all +// non-negative loop counts identically. +// * By making the other two constants negative, we avoid conflicts with any +// real loop count values. +const int cAnimationLoopOnce = 0; +const int cAnimationLoopInfinite = -1; const int cAnimationNone = -2; class ImageSource : public Noncopyable { diff --git a/src/3rdparty/webkit/WebKit.pri b/src/3rdparty/webkit/WebKit.pri index 921a6e0..fcd2891 100644 --- a/src/3rdparty/webkit/WebKit.pri +++ b/src/3rdparty/webkit/WebKit.pri @@ -24,7 +24,7 @@ building-libs { win32-*|wince* { !CONFIG(release, debug|release):build_pass: QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}d QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}$${QT_MAJOR_VERSION} - win32-g++: LIBS += -l$$QTWEBKITLIBNAME + win32-g++*: LIBS += -l$$QTWEBKITLIBNAME else: LIBS += $${QTWEBKITLIBNAME}.lib } else { LIBS += -lQtWebKit diff --git a/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro b/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro index 22d4c8d..62546f6 100644 --- a/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro +++ b/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro @@ -12,7 +12,7 @@ DOUBLE_ESCAPED_QUOTE = "" ESCAPE = "" win32-msvc*|symbian { ESCAPE = "^" -} else:win32-g++:isEmpty(QMAKE_SH) { +} else:win32-g++*:isEmpty(QMAKE_SH) { # MinGW's make will run makefile commands using sh, even if make # was run from the Windows shell, if it finds sh in the path. ESCAPE = "^" diff --git a/src/activeqt/container/container.pro b/src/activeqt/container/container.pro index d654f92..4c9b3a8 100644 --- a/src/activeqt/container/container.pro +++ b/src/activeqt/container/container.pro @@ -19,7 +19,7 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/lib LIBS += -lole32 -loleaut32 !wince*:LIBS += -luser32 -lgdi32 -ladvapi32 -win32-g++:LIBS += -luuid +win32-g++*:LIBS += -luuid HEADERS = ../control/qaxaggregated.h \ qaxbase.h \ diff --git a/src/activeqt/control/control.pro b/src/activeqt/control/control.pro index 44eb928..361ca29 100644 --- a/src/activeqt/control/control.pro +++ b/src/activeqt/control/control.pro @@ -18,11 +18,11 @@ CONFIG += qt warn_off staticlib QTDIR_build:DESTDIR = $$QT_BUILD_TREE\\lib DEFINES += QAX_SERVER -win32-g++:DEFINES += QT_NEEDS_QMAIN +win32-g++*:DEFINES += QT_NEEDS_QMAIN win32-borland:DEFINES += QT_NEEDS_QMAIN LIBS += -luser32 -lole32 -loleaut32 -lgdi32 -win32-g++:LIBS += -luuid +win32-g++*:LIBS += -luuid HEADERS = qaxaggregated.h \ qaxbindable.h \ diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 107854c..d53504a 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -44,6 +44,14 @@ #include <QtCore/qglobal.h> +#ifdef Q_OS_LINUX +# include <features.h> +#endif + +#ifdef __GLIBC__ +#include <byteswap.h> +#endif + QT_BEGIN_HEADER QT_BEGIN_NAMESPACE @@ -264,6 +272,21 @@ template <> inline qint16 qFromBigEndian<qint16>(const uchar *src) * and it is therefore a bit more convenient and in most cases more efficient. */ template <typename T> T qbswap(T source); + +#ifdef __GLIBC__ +template <> inline quint64 qbswap<quint64>(quint64 source) +{ + return bswap_64(source); +} +template <> inline quint32 qbswap<quint32>(quint32 source) +{ + return bswap_32(source); +} +template <> inline quint16 qbswap<quint16>(quint16 source) +{ + return bswap_16(source); +} +#else template <> inline quint64 qbswap<quint64>(quint64 source) { return 0 @@ -292,6 +315,7 @@ template <> inline quint16 qbswap<quint16>(quint16 source) | ((source & 0x00ff) << 8) | ((source & 0xff00) >> 8) ); } +#endif // __GLIBC__ // signed specializations template <> inline qint64 qbswap<qint64>(qint64 source) diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index ec49f1a..21930e1 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -1162,7 +1162,15 @@ bool QFSFileEnginePrivate::doStat() const if (filePath.isEmpty()) return could_stat; - QString fname = filePath.endsWith(QLatin1String(".lnk")) ? readLink(filePath) : filePath; + QString fname; + if(filePath.endsWith(QLatin1String(".lnk"))) { + fname = readLink(filePath); + if(fname.isEmpty()) + return could_stat; + } + else + fname = filePath; + fname = fixIfRelativeUncPath(fname); UINT oldmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); diff --git a/src/corelib/kernel/qabstractitemmodel.cpp b/src/corelib/kernel/qabstractitemmodel.cpp index b0e2f48..8415259 100644 --- a/src/corelib/kernel/qabstractitemmodel.cpp +++ b/src/corelib/kernel/qabstractitemmodel.cpp @@ -2854,7 +2854,7 @@ void QAbstractItemModel::endMoveColumns() \note Use beginResetModel() and endResetModel() instead whenever possible. Use this method only if there is no way to call beginResetModel() before invalidating the model. - Otherwise it could lead to unexcpected behaviour, especially when used with proxy models. + Otherwise it could lead to unexpected behaviour, especially when used with proxy models. */ void QAbstractItemModel::reset() { diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp index fd36be4..9c1c827 100644 --- a/src/corelib/kernel/qeventdispatcher_glib.cpp +++ b/src/corelib/kernel/qeventdispatcher_glib.cpp @@ -246,6 +246,7 @@ struct GPostEventSource GSource source; QAtomicInt serialNumber; int lastSerialNumber; + QEventDispatcherGlibPrivate *d; }; static gboolean postEventSourcePrepare(GSource *s, gint *timeout) @@ -274,6 +275,7 @@ static gboolean postEventSourceDispatch(GSource *s, GSourceFunc, gpointer) GPostEventSource *source = reinterpret_cast<GPostEventSource *>(s); source->lastSerialNumber = source->serialNumber; QCoreApplication::sendPostedEvents(); + source->d->runTimersOnceWithNormalPriority(); return true; // i dunno, george... } @@ -313,6 +315,7 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context) postEventSource = reinterpret_cast<GPostEventSource *>(g_source_new(&postEventSourceFuncs, sizeof(GPostEventSource))); postEventSource->serialNumber = 1; + postEventSource->d = this; g_source_set_can_recurse(&postEventSource->source, true); g_source_attach(&postEventSource->source, mainContext); diff --git a/src/corelib/tools/qharfbuzz.cpp b/src/corelib/tools/qharfbuzz.cpp index 1b6d334..9166a14 100644 --- a/src/corelib/tools/qharfbuzz.cpp +++ b/src/corelib/tools/qharfbuzz.cpp @@ -102,45 +102,15 @@ HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch) return QChar::mirroredChar(ch); } -void *HB_Library_Resolve(const char *library, const char *symbol) +void *HB_Library_Resolve(const char *library, int version, const char *symbol) { #ifdef QT_NO_LIBRARY return 0; #else - return QLibrary::resolve(QLatin1String(library), symbol); + return QLibrary::resolve(QLatin1String(library), version, symbol); #endif } -void *HB_TextCodecForMib(int mib) -{ -#ifndef QT_NO_TEXTCODEC - return QTextCodec::codecForMib(mib); -#else - return 0; -#endif -} - -char *HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength) -{ -#ifndef QT_NO_TEXTCODEC - QByteArray data = reinterpret_cast<QTextCodec *>(codec)->fromUnicode((const QChar *)unicode, length); - // ### suboptimal - char *output = (char *)malloc(data.length() + 1); - Q_CHECK_PTR(output); - memcpy(output, data.constData(), data.length() + 1); - if (outputLength) - *outputLength = data.length(); - return output; -#else - return 0; -#endif -} - -void HB_TextCodec_FreeResult(char *string) -{ - free(string); -} - } // extern "C" QT_BEGIN_NAMESPACE diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 1d5fab3..57f79a0 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -4768,6 +4768,10 @@ int QString::localeAwareCompare_helper(const QChar *data1, int length1, CFRelease(thisString); CFRelease(otherString); return result; +#elif defined(Q_OS_SYMBIAN) + TPtrC p1 = TPtrC16(reinterpret_cast<const TUint16 *>(data1), length1); + TPtrC p2 = TPtrC16(reinterpret_cast<const TUint16 *>(data2), length2); + return p1.CompareC(p2); #elif defined(Q_OS_UNIX) // declared in <string.h> int delta = strcoll(toLocal8Bit_helper(data1, length1), toLocal8Bit_helper(data2, length2)); diff --git a/src/corelib/tools/qtextboundaryfinder.cpp b/src/corelib/tools/qtextboundaryfinder.cpp index 9205297..bcddcb2 100644 --- a/src/corelib/tools/qtextboundaryfinder.cpp +++ b/src/corelib/tools/qtextboundaryfinder.cpp @@ -131,6 +131,11 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int Line break boundaries give possible places where a line break might happen and sentence boundaries will show the beginning and end of whole sentences. + + The first position in a string is always a valid boundary and + refers to the position before the first character. The last + position at the length of the string is also valid and refers + to the position after the last character. */ /*! @@ -363,7 +368,8 @@ int QTextBoundaryFinder::toNextBoundary() ++pos; break; case Line: - while (pos < length && d->attributes[pos].lineBreakType < HB_Break) + Q_ASSERT(pos); + while (pos < length && d->attributes[pos-1].lineBreakType < HB_Break) ++pos; break; } @@ -405,7 +411,7 @@ int QTextBoundaryFinder::toPreviousBoundary() --pos; break; case Line: - while (pos > 0 && d->attributes[pos].lineBreakType < HB_Break) + while (pos > 0 && d->attributes[pos-1].lineBreakType < HB_Break) --pos; break; } @@ -430,7 +436,7 @@ bool QTextBoundaryFinder::isAtBoundary() const case Word: return d->attributes[pos].wordBoundary; case Line: - return d->attributes[pos].lineBreakType >= HB_Break; + return (pos > 0) ? d->attributes[pos-1].lineBreakType >= HB_Break : true; case Sentence: return d->attributes[pos].sentenceBoundary; } diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 4e0ebbc..e579dd5 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -106,8 +106,9 @@ contains(QT_CONFIG, zlib) { ../3rdparty/zlib/uncompr.c \ ../3rdparty/zlib/zutil.c } else:!contains(QT_CONFIG, no-zlib) { - unix:LIBS_PRIVATE += -lz -# win32:LIBS += libz.lib + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib } DEFINES += HB_EXPORT=Q_CORE_EXPORT diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp index 18806e7..42b370b 100644 --- a/src/declarative/graphicsitems/qdeclarativeitem.cpp +++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp @@ -231,9 +231,10 @@ QT_BEGIN_NAMESPACE \brief The QDeclarativeContents class gives access to the height and width of an item's contents. */ - -QDeclarativeContents::QDeclarativeContents() : m_x(0), m_y(0), m_width(0), m_height(0) +QDeclarativeContents::QDeclarativeContents(QDeclarativeItem *item) : m_item(item), m_x(0), m_y(0), m_width(0), m_height(0) { + //### optimize + connect(this, SIGNAL(rectChanged(QRectF)), m_item, SIGNAL(childrenRectChanged(QRectF))); } QDeclarativeContents::~QDeclarativeContents() @@ -328,12 +329,8 @@ void QDeclarativeContents::calcWidth(QDeclarativeItem *changed) emit rectChanged(rectF()); } -void QDeclarativeContents::setItem(QDeclarativeItem *item) +void QDeclarativeContents::complete() { - m_item = item; - //### optimize - connect(this, SIGNAL(rectChanged(QRectF)), m_item, SIGNAL(childrenRectChanged(QRectF))); - QList<QGraphicsItem *> children = m_item->childItems(); for (int i = 0; i < children.count(); ++i) { QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i)); @@ -343,9 +340,7 @@ void QDeclarativeContents::setItem(QDeclarativeItem *item) //###what about changes to visibility? } - //### defer until componentComplete - calcHeight(); - calcWidth(); + calcGeometry(); } void QDeclarativeContents::itemGeometryChanged(QDeclarativeItem *changed, const QRectF &newGeometry, const QRectF &oldGeometry) @@ -360,16 +355,14 @@ void QDeclarativeContents::itemDestroyed(QDeclarativeItem *item) { if (item) QDeclarativeItemPrivate::get(item)->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed); - calcWidth(); - calcHeight(); + calcGeometry(); } void QDeclarativeContents::childRemoved(QDeclarativeItem *item) { if (item) QDeclarativeItemPrivate::get(item)->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed); - calcWidth(); - calcHeight(); + calcGeometry(); } void QDeclarativeContents::childAdded(QDeclarativeItem *item) @@ -1752,8 +1745,9 @@ QRectF QDeclarativeItem::childrenRect() { Q_D(QDeclarativeItem); if (!d->_contents) { - d->_contents = new QDeclarativeContents; - d->_contents->setItem(this); + d->_contents = new QDeclarativeContents(this); + if (d->_componentComplete) + d->_contents->complete(); } return d->_contents->rectF(); } @@ -2619,6 +2613,8 @@ void QDeclarativeItem::componentComplete() } if (d->keyHandler) d->keyHandler->componentComplete(); + if (d->_contents) + d->_contents->complete(); } QDeclarativeStateGroup *QDeclarativeItemPrivate::_states() diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h index 184d6f1..fb416c2 100644 --- a/src/declarative/graphicsitems/qdeclarativeitem_p.h +++ b/src/declarative/graphicsitems/qdeclarativeitem_p.h @@ -83,16 +83,17 @@ class QDeclarativeContents : public QObject, public QDeclarativeItemChangeListen { Q_OBJECT public: - QDeclarativeContents(); + QDeclarativeContents(QDeclarativeItem *item); ~QDeclarativeContents(); QRectF rectF() const; - void setItem(QDeclarativeItem *item); - void childRemoved(QDeclarativeItem *item); void childAdded(QDeclarativeItem *item); + void calcGeometry() { calcWidth(); calcHeight(); } + void complete(); + Q_SIGNALS: void rectChanged(QRectF); diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp index dcf18af..48ac4a4 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview.cpp +++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp @@ -1936,6 +1936,8 @@ void QDeclarativeListView::setCacheBuffer(int b) /*! \qmlproperty string ListView::section.property \qmlproperty enumeration ListView::section.criteria + \qmlproperty Component ListView::section.delegate + These properties hold the expression to be evaluated for the \l section attached property. \c section.property hold the name of the property to use to determine @@ -1949,6 +1951,8 @@ void QDeclarativeListView::setCacheBuffer(int b) \o ViewSection.FirstCharacter - section is the first character of the property value. \endlist + \c section.delegate holds the delegate component for each section. + Each item in the list has attached properties named \c ListView.section and \c ListView.prevSection. These may be used to place a section header for related items. The example below assumes that the model is sorted by size of @@ -1985,7 +1989,7 @@ QString QDeclarativeListView::currentSection() const These properties hold the move and resize animation speed of the highlight delegate. - \c highlightFollowsCurrentItem must be true for these properties + \l highlightFollowsCurrentItem must be true for these properties to have effect. The default value for the speed properties is 400 pixels/second. diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp index 3b4f2a7..3106daf 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp @@ -1113,13 +1113,7 @@ void QDeclarativeTextEdit::mousePressEvent(QGraphicsSceneMouseEvent *event) Q_D(QDeclarativeTextEdit); if (d->focusOnPress){ bool hadFocus = hasFocus(); - QGraphicsItem *p = parentItem();//###Is there a better way to find my focus scope? - while(p) { - if (p->flags() & QGraphicsItem::ItemIsFocusScope) - p->setFocus(); - p = p->parentItem(); - } - setFocus(true); + forceFocus(); if (d->showInputPanelOnFocus) { if (hasFocus() && hadFocus && !isReadOnly()) { // re-open input panel on press if already focused diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index 633c01e..cba01ef 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -924,13 +924,7 @@ void QDeclarativeTextInput::mousePressEvent(QGraphicsSceneMouseEvent *event) Q_D(QDeclarativeTextInput); if(d->focusOnPress){ bool hadFocus = hasFocus(); - QGraphicsItem *p = parentItem();//###Is there a better way to find my focus scope? - while(p) { - if (p->flags() & QGraphicsItem::ItemIsFocusScope) - p->setFocus(); - p = p->parentItem(); - } - setFocus(true); + forceFocus(); if (d->showInputPanelOnFocus) { if (hasFocus() && hadFocus && !isReadOnly()) { // re-open input panel on press if already focused diff --git a/src/gui/graphicsview/qgraphicsgridlayout.cpp b/src/gui/graphicsview/qgraphicsgridlayout.cpp index 6ca799d..83db3ec 100644 --- a/src/gui/graphicsview/qgraphicsgridlayout.cpp +++ b/src/gui/graphicsview/qgraphicsgridlayout.cpp @@ -572,6 +572,18 @@ void QGraphicsGridLayout::removeAt(int index) if (QGraphicsLayoutItem *layoutItem = gridItem->layoutItem()) layoutItem->setParentLayoutItem(0); d->engine.removeItem(gridItem); + + // recalculate rowInfo.count if we remove an item that is on the right/bottommost row + for (int j = 0; j < NOrientations; ++j) { + // 0: Hor, 1: Ver + const Qt::Orientation orient = (j == 0 ? Qt::Horizontal : Qt::Vertical); + const int oldCount = d->engine.rowCount(orient); + if (gridItem->lastRow(orient) == oldCount - 1) { + const int newCount = d->engine.effectiveLastRow(orient) + 1; + d->engine.removeRows(newCount, oldCount - newCount, orient); + } + } + delete gridItem; invalidate(); } diff --git a/src/gui/graphicsview/qgraphicslinearlayout.cpp b/src/gui/graphicsview/qgraphicslinearlayout.cpp index 9722683..b828722 100644 --- a/src/gui/graphicsview/qgraphicslinearlayout.cpp +++ b/src/gui/graphicsview/qgraphicslinearlayout.cpp @@ -147,7 +147,7 @@ void QGraphicsLinearLayoutPrivate::removeGridItem(QGridLayoutItem *gridItem) { int index = gridItem->firstRow(orientation); engine.removeItem(gridItem); - engine.removeRow(index, orientation); + engine.removeRows(index, 1, orientation); } void QGraphicsLinearLayoutPrivate::fixIndex(int *index) const diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 7b0722e..6c5623e 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -6100,8 +6100,15 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event) if (ev.isAccepted() || ev.isAccepted(g)) { conflictedGestures.remove(g); // mark the item as a gesture target - if (item) + if (item) { gestureTargets.insert(g, item.data()); + QHash<QGraphicsObject *, QSet<QGesture *> >::iterator it, e; + it = cachedItemGestures.begin(); + e = cachedItemGestures.end(); + for(; it != e; ++it) + it.value().remove(g); + cachedItemGestures[item.data()].insert(g); + } DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:" << "override was accepted:" << g << item.data(); diff --git a/src/gui/graphicsview/qgridlayoutengine_p.h b/src/gui/graphicsview/qgridlayoutengine_p.h index cbf704e..9ac9a8e 100644 --- a/src/gui/graphicsview/qgridlayoutengine_p.h +++ b/src/gui/graphicsview/qgridlayoutengine_p.h @@ -363,8 +363,8 @@ public: QGridLayoutItem *itemAt(int row, int column, Qt::Orientation orientation = Qt::Vertical) const; inline void insertRow(int row, Qt::Orientation orientation = Qt::Vertical) { insertOrRemoveRows(row, +1, orientation); } - inline void removeRow(int row, Qt::Orientation orientation = Qt::Vertical) - { insertOrRemoveRows(row, -1, orientation); } + inline void removeRows(int row, int count, Qt::Orientation orientation) + { insertOrRemoveRows(row, -count, orientation); } void invalidate(); void setGeometries(const QLayoutStyleInfo &styleInfo, const QRectF &contentsGeometry); diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri index 8d75fdd..c4eac95 100644 --- a/src/gui/image/image.pri +++ b/src/gui/image/image.pri @@ -93,12 +93,12 @@ SOURCES += \ SOURCES += image/qpnghandler.cpp contains(QT_CONFIG, system-png) { - unix:LIBS_PRIVATE += -lpng - win32:LIBS += libpng.lib + unix|win32-g++*:LIBS_PRIVATE += -lpng + win32:!win32-g++*:LIBS += libpng.lib } else { DEFINES *= QT_USE_BUNDLED_LIBPNG !isEqual(QT_ARCH, i386):!isEqual(QT_ARCH, x86_64):DEFINES += PNG_NO_ASSEMBLER_CODE - INCLUDEPATH += ../3rdparty/libpng ../3rdparty/zlib + INCLUDEPATH += ../3rdparty/libpng SOURCES += ../3rdparty/libpng/png.c \ ../3rdparty/libpng/pngerror.c \ ../3rdparty/libpng/pngget.c \ @@ -114,6 +114,14 @@ SOURCES += \ ../3rdparty/libpng/pngwrite.c \ ../3rdparty/libpng/pngwtran.c \ ../3rdparty/libpng/pngwutil.c + + contains(QT_CONFIG, system-zlib) { + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib + } else { + INCLUDEPATH += ../3rdparty/zlib + } } } else { DEFINES *= QT_NO_IMAGEFORMAT_PNG diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp index 42e19b8..074b8f0 100644 --- a/src/gui/image/qbmphandler.cpp +++ b/src/gui/image/qbmphandler.cpp @@ -674,13 +674,15 @@ bool QBmpHandler::readHeader() bool QBmpHandler::canRead() const { - if (state == Ready) { - if (!canRead(device())) - return false; + if (state == Ready && !canRead(device())) + return false; + + if (state != Error) { setFormat("bmp"); return true; } - return state != Error; + + return false; } bool QBmpHandler::canRead(QIODevice *device) diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp index 20e4b50..fd2c139 100644 --- a/src/gui/image/qpixmap.cpp +++ b/src/gui/image/qpixmap.cpp @@ -1766,6 +1766,9 @@ QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode) function returns the actual matrix used for transforming the pixmap. + \note When using the native X11 graphics system, the pixmap + becomes invalid when the QApplication instance is destroyed. + \sa QBitmap, QImage, QImageReader, QImageWriter */ diff --git a/src/gui/image/qpixmap_x11.cpp b/src/gui/image/qpixmap_x11.cpp index 6bebefc..e8dc5ae 100644 --- a/src/gui/image/qpixmap_x11.cpp +++ b/src/gui/image/qpixmap_x11.cpp @@ -1250,10 +1250,8 @@ void QX11PixmapData::release() pengine = 0; if (!X11) { -#ifndef QT_NO_DEBUG - qWarning("~QX11PixmapData(): QPixmap objects must be destroyed before the QApplication" - " object, otherwise the native pixmap object will be leaked."); -#endif + // At this point, the X server will already have freed our resources, + // so there is nothing to do. return; } diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp index dd31834..2cf8222 100644 --- a/src/gui/image/qpnghandler.cpp +++ b/src/gui/image/qpnghandler.cpp @@ -892,13 +892,15 @@ QPngHandler::~QPngHandler() bool QPngHandler::canRead() const { - if (d->state == QPngHandlerPrivate::Ready) { - if (!canRead(device())) - return false; + if (d->state == QPngHandlerPrivate::Ready && !canRead(device())) + return false; + + if (d->state != QPngHandlerPrivate::Error) { setFormat("png"); return true; } - return d->state != QPngHandlerPrivate::Error; + + return false; } bool QPngHandler::canRead(QIODevice *device) diff --git a/src/gui/image/qppmhandler.cpp b/src/gui/image/qppmhandler.cpp index cbbbef4..a9e796c 100644 --- a/src/gui/image/qppmhandler.cpp +++ b/src/gui/image/qppmhandler.cpp @@ -409,13 +409,15 @@ bool QPpmHandler::readHeader() bool QPpmHandler::canRead() const { - if (state == Ready) { - if (!canRead(device(), &subType)) - return false; + if (state == Ready && !canRead(device(), &subType)) + return false; + + if (state != Error) { setFormat(subType); return true; } - return state != Error; + + return false; } bool QPpmHandler::canRead(QIODevice *device, QByteArray *subType) diff --git a/src/gui/image/qxbmhandler.cpp b/src/gui/image/qxbmhandler.cpp index 385340a..0dd4e99 100644 --- a/src/gui/image/qxbmhandler.cpp +++ b/src/gui/image/qxbmhandler.cpp @@ -261,13 +261,15 @@ bool QXbmHandler::readHeader() bool QXbmHandler::canRead() const { - if (state == Ready) { - if (!canRead(device())) - return false; + if (state == Ready && !canRead(device())) + return false; + + if (state != Error) { setFormat("xbm"); return true; } - return state != Error; + + return false; } bool QXbmHandler::canRead(QIODevice *device) diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp index a475cd0..b97afd3 100644 --- a/src/gui/image/qxpmhandler.cpp +++ b/src/gui/image/qxpmhandler.cpp @@ -1225,11 +1225,15 @@ bool QXpmHandler::readImage(QImage *image) bool QXpmHandler::canRead() const { - if (state == Ready && canRead(device())) { + if (state == Ready && !canRead(device())) + return false; + + if (state != Error) { setFormat("xpm"); return true; } - return state != Error; + + return false; } bool QXpmHandler::canRead(QIODevice *device) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index 52767b8..1680ef4 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -5313,6 +5313,7 @@ void QApplication::setInputContext(QInputContext *inputContext) } delete QApplicationPrivate::inputContext; QApplicationPrivate::inputContext = inputContext; + QApplicationPrivate::inputContext->setParent(this); } /*! diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index a50fd95..d5d4be6 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -2196,4 +2196,29 @@ void QApplication::restoreOverrideCursor() #endif // QT_NO_CURSOR +QS60ThreadLocalData::QS60ThreadLocalData() +{ + CCoeEnv *env = CCoeEnv::Static(); + if (env) { + //if this is the UI thread, share objects owned by CONE + usingCONEinstances = true; + wsSession = env->WsSession(); + screenDevice = env->ScreenDevice(); + } + else { + usingCONEinstances = false; + qt_symbian_throwIfError(wsSession.Connect(qt_s60GetRFs())); + screenDevice = new CWsScreenDevice(wsSession); + screenDevice->Construct(); + } +} + +QS60ThreadLocalData::~QS60ThreadLocalData() +{ + if (!usingCONEinstances) { + delete screenDevice; + wsSession.Close(); + } +} + QT_END_NAMESPACE diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 09535fa..0edb8fb 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -118,8 +118,6 @@ extern void qt_wince_hide_taskbar(HWND hwnd); //defined in qguifunctions_wince.c # include <winable.h> #endif -#include "private/qwinnativepangesturerecognizer_win_p.h" - #ifndef WM_TOUCH # define WM_TOUCH 0x0240 @@ -4066,36 +4064,9 @@ PtrCloseTouchInputHandle QApplicationPrivate::CloseTouchInputHandle = 0; void QApplicationPrivate::initializeMultitouch_sys() { - static const IID QT_IID_IInkTablets = {0x112086D9, 0x7779, 0x4535, {0xA6, 0x99, 0x86, 0x2B, 0x43, 0xAC, 0x18, 0x63} }; - static const IID QT_IID_IInkTablet2 = {0x90c91ad2, 0xfa36, 0x49d6, {0x95, 0x16, 0xce, 0x8d, 0x57, 0x0f, 0x6f, 0x85} }; - static const CLSID QT_CLSID_InkTablets = {0x6E4FCB12, 0x510A, 0x4d40, {0x93, 0x04, 0x1D, 0xA1, 0x0A, 0xE9, 0x14, 0x7C} }; - - IInkTablets *iInkTablets = 0; - HRESULT hr = CoCreateInstance(QT_CLSID_InkTablets, NULL, CLSCTX_ALL, QT_IID_IInkTablets, (void**)&iInkTablets); - if (SUCCEEDED(hr)) { - long count = 0; - iInkTablets->get_Count(&count); - for (long i = 0; i < count; ++i) { - IInkTablet *iInkTablet = 0; - hr = iInkTablets->Item(i, &iInkTablet); - if (FAILED(hr)) - continue; - IInkTablet2 *iInkTablet2 = 0; - hr = iInkTablet->QueryInterface(QT_IID_IInkTablet2, (void**)&iInkTablet2); - iInkTablet->Release(); - if (FAILED(hr)) - continue; - TabletDeviceKind kind; - hr = iInkTablet2->get_DeviceKind(&kind); - iInkTablet2->Release(); - if (FAILED(hr)) - continue; - if (kind == TDK_Touch) { - QApplicationPrivate::HasTouchSupport = true; - break; - } - } - iInkTablets->Release(); + if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) { + static const int QT_SM_DIGITIZER = 94; + QApplicationPrivate::HasTouchSupport = GetSystemMetrics(QT_SM_DIGITIZER); } QLibrary library(QLatin1String("user32")); diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp index 2af031b..e43a560 100644 --- a/src/gui/kernel/qgesturemanager.cpp +++ b/src/gui/kernel/qgesturemanager.cpp @@ -286,6 +286,9 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, // check if a running gesture switched back to maybe state QSet<QGesture *> activeToMaybeGestures = m_activeGestures & newMaybeGestures; + // check if a maybe gesture switched to canceled - reset it but don't send an event + QSet<QGesture *> maybeToCanceledGestures = m_maybeGestures & notGestures; + // check if a running gesture switched back to not gesture state, // i.e. were canceled QSet<QGesture *> canceledGestures = m_activeGestures & notGestures; @@ -345,7 +348,8 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, << "\n\tstarted:" << startedGestures << "\n\ttriggered:" << triggeredGestures << "\n\tfinished:" << finishedGestures - << "\n\tcanceled:" << canceledGestures; + << "\n\tcanceled:" << canceledGestures + << "\n\tmaybe-canceled:" << maybeToCanceledGestures; } QSet<QGesture *> undeliveredGestures; @@ -366,7 +370,7 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, // reset gestures that ended QSet<QGesture *> endedGestures = - finishedGestures + canceledGestures + undeliveredGestures; + finishedGestures + canceledGestures + undeliveredGestures + maybeToCanceledGestures; foreach (QGesture *gesture, endedGestures) { recycle(gesture); m_gestureTargets.remove(gesture); diff --git a/src/gui/kernel/qstandardgestures.cpp b/src/gui/kernel/qstandardgestures.cpp index 6960838..8a3e89e 100644 --- a/src/gui/kernel/qstandardgestures.cpp +++ b/src/gui/kernel/qstandardgestures.cpp @@ -112,6 +112,7 @@ QGestureRecognizer::Result QPanGestureRecognizer::recognize(QGesture *state, p1.pos().y() - p1.startPos().y() + p2.pos().y() - p2.startPos().y()) / 2; if (d->offset.x() > 10 || d->offset.y() > 10 || d->offset.x() < -10 || d->offset.y() < -10) { + q->setHotSpot(p1.startScreenPos()); result = QGestureRecognizer::TriggerGesture; } else { result = QGestureRecognizer::MayBeGesture; @@ -441,6 +442,7 @@ QGestureRecognizer::Result QTapGestureRecognizer::recognize(QGesture *state, switch (event->type()) { case QEvent::TouchBegin: { d->position = ev->touchPoints().at(0).pos(); + q->setHotSpot(ev->touchPoints().at(0).screenPos()); result = QGestureRecognizer::TriggerGesture; break; } @@ -523,6 +525,7 @@ QTapAndHoldGestureRecognizer::recognize(QGesture *state, QObject *object, if (d->timerId) q->killTimer(d->timerId); d->timerId = q->startTimer(TimerInterval); + q->setHotSpot(ev->touchPoints().at(0).startScreenPos()); result = QGestureRecognizer::TriggerGesture; break; case QEvent::TouchEnd: diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h index fe3fa57..ed53ccf 100644 --- a/src/gui/kernel/qt_s60_p.h +++ b/src/gui/kernel/qt_s60_p.h @@ -63,6 +63,7 @@ #include "qpointer.h" #include "qapplication.h" #include "qelapsedtimer.h" +#include "QtCore/qthreadstorage.h" #include <w32std.h> #include <coecntrl.h> #include <eikenv.h> @@ -86,10 +87,21 @@ const TInt KInternalStatusPaneChange = 0x50000000; //this macro exists because EColor16MAP enum value doesn't exist in Symbian OS 9.2 #define Q_SYMBIAN_ECOLOR16MAP TDisplayMode(13) +class QS60ThreadLocalData +{ +public: + QS60ThreadLocalData(); + ~QS60ThreadLocalData(); + bool usingCONEinstances; + RWsSession wsSession; + CWsScreenDevice *screenDevice; +}; + class QS60Data { public: QS60Data(); + QThreadStorage<QS60ThreadLocalData *> tls; TUid uid; int screenDepth; QPoint lastCursorPos; @@ -132,9 +144,9 @@ public: int memoryLimitForHwRendering; QApplication::QS60MainApplicationFactory s60ApplicationFactory; // typedef'ed pointer type static inline void updateScreenSize(); - static inline RWsSession& wsSession(); + inline RWsSession& wsSession(); static inline RWindowGroup& windowGroup(); - static inline CWsScreenDevice* screenDevice(); + inline CWsScreenDevice* screenDevice(); static inline CCoeAppUi* appUi(); static inline CEikMenuBar* menuBar(); #ifdef Q_WS_S60 @@ -265,7 +277,10 @@ inline void QS60Data::updateScreenSize() inline RWsSession& QS60Data::wsSession() { - return CCoeEnv::Static()->WsSession(); + if(!tls.hasLocalData()) { + tls.setLocalData(new QS60ThreadLocalData); + } + return tls.localData()->wsSession; } inline RWindowGroup& QS60Data::windowGroup() @@ -275,7 +290,10 @@ inline RWindowGroup& QS60Data::windowGroup() inline CWsScreenDevice* QS60Data::screenDevice() { - return CCoeEnv::Static()->ScreenDevice(); + if(!tls.hasLocalData()) { + tls.setLocalData(new QS60ThreadLocalData); + } + return tls.localData()->screenDevice; } inline CCoeAppUi* QS60Data::appUi() diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 492954a..dd568cd 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -380,6 +380,8 @@ void QWidget::setInputContext(QInputContext *context) if (d->ic) delete d->ic; d->ic = context; + if (d->ic) + d->ic->setParent(this); #endif } @@ -1067,7 +1069,6 @@ struct QWidgetExceptionCleaner \sa windowFlags */ - QWidget::QWidget(QWidget *parent, Qt::WindowFlags f) : QObject(*new QWidgetPrivate, 0), QPaintDevice() { diff --git a/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h b/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h index 64addeb..9d0e6f7 100644 --- a/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h +++ b/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h @@ -55,39 +55,6 @@ #include <QGestureRecognizer> -#include <objbase.h> - -class IInkRectangle; -class TabletHardwareCapabilities; -class TabletPropertyMetricUnit; -DECLARE_INTERFACE_(IInkTablet, IDispatch) -{ - STDMETHOD(get_Name)(THIS_ BSTR *Name) PURE; - STDMETHOD(get_PlugAndPlayId)(THIS_ BSTR *Id) PURE; - STDMETHOD(get_MaximumInputRectangle)(THIS_ IInkRectangle **Rectangle) PURE; - STDMETHOD(get_HardwareCapabilities)(THIS_ TabletHardwareCapabilities *Capabilities) PURE; - STDMETHOD(IsPacketPropertySupported)(THIS_ BSTR packetPropertyName) PURE; - STDMETHOD(GetPropertyMetrics)(THIS_ BSTR propertyName, long *Minimum, long *Maximum, TabletPropertyMetricUnit *Units, float *Resolution) PURE; -}; -enum TabletDeviceKind -{ - TDK_Mouse = 0, - TDK_Pen = 1, - TDK_Touch = 2 -}; -DECLARE_INTERFACE_(IInkTablet2, IDispatch) -{ - STDMETHOD(get_DeviceKind)(THIS_ TabletDeviceKind *Kind) PURE; -}; -DECLARE_INTERFACE_(IInkTablets, IDispatch) -{ - STDMETHOD(get_Count)(THIS_ long *Count) PURE; - STDMETHOD(get__NewEnum)(THIS_ IUnknown **_NewEnum) PURE; - STDMETHOD(get_DefaultTablet)(THIS_ IInkTablet **DefaultTablet) PURE; - STDMETHOD(Item)(THIS_ long Index, IInkTablet **Tablet) PURE; - STDMETHOD(IsPacketPropertySupported)(THIS_ BSTR packetPropertyName, VARIANT_BOOL *Supported) PURE; -}; - #ifndef QT_NO_GESTURES QT_BEGIN_NAMESPACE diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri index 123af1c..a5cfb84 100644 --- a/src/gui/painting/painting.pri +++ b/src/gui/painting/painting.pri @@ -234,7 +234,7 @@ contains(QMAKE_MAC_XARCH, no) { IWMMXT_SOURCES += painting/qdrawhelper_iwmmxt.cpp } - win32-g++|!win32:!*-icc* { + win32-g++*|!win32:!*-icc* { mmx { mmx_compiler.commands = $$QMAKE_CXX -c -Winline @@ -403,9 +403,10 @@ neon:*-g++* { } contains(QT_CONFIG, zlib) { - INCLUDEPATH += ../3rdparty/zlib + INCLUDEPATH += ../3rdparty/zlib } else:!contains(QT_CONFIG, no-zlib) { - unix:LIBS_PRIVATE += -lz -# win32:LIBS += libz.lib + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib } diff --git a/src/gui/painting/qoutlinemapper.cpp b/src/gui/painting/qoutlinemapper.cpp index 1b01960..bf03545 100644 --- a/src/gui/painting/qoutlinemapper.cpp +++ b/src/gui/painting/qoutlinemapper.cpp @@ -234,12 +234,12 @@ void QOutlineMapper::endOutline() // Check for out of dev bounds... - const bool do_clip = (controlPointRect.left() < -QT_RASTER_COORD_LIMIT + const bool do_clip = !m_in_clip_elements && ((controlPointRect.left() < -QT_RASTER_COORD_LIMIT || controlPointRect.right() > QT_RASTER_COORD_LIMIT || controlPointRect.top() < -QT_RASTER_COORD_LIMIT || controlPointRect.bottom() > QT_RASTER_COORD_LIMIT || controlPointRect.width() > QT_RASTER_COORD_LIMIT - || controlPointRect.height() > QT_RASTER_COORD_LIMIT); + || controlPointRect.height() > QT_RASTER_COORD_LIMIT)); if (do_clip) { clipElements(elements, elementTypes(), element_count); @@ -353,7 +353,13 @@ void QOutlineMapper::clipElements(const QPointF *elements, // instead of going through convenience functionallity, but since // this part of code hardly every used, it shouldn't matter. + m_in_clip_elements = true; + QPainterPath path; + + if (!(m_outline.flags & QT_FT_OUTLINE_EVEN_ODD_FILL)) + path.setFillRule(Qt::WindingFill); + if (types) { for (int i=0; i<element_count; ++i) { switch (types[i]) { @@ -389,6 +395,8 @@ void QOutlineMapper::clipElements(const QPointF *elements, else convertPath(clippedPath); m_txop = old_txop; + + m_in_clip_elements = false; } QT_END_NAMESPACE diff --git a/src/gui/painting/qoutlinemapper_p.h b/src/gui/painting/qoutlinemapper_p.h index 39b7593..f64d03b 100644 --- a/src/gui/painting/qoutlinemapper_p.h +++ b/src/gui/painting/qoutlinemapper_p.h @@ -95,7 +95,8 @@ public: m_tags(0), m_contours(0), m_polygon_dev(0), - m_round_coords(false) + m_round_coords(false), + m_in_clip_elements(false) { } @@ -235,6 +236,7 @@ public: qreal m_dy; bool m_valid; + bool m_in_clip_elements; private: bool m_round_coords; diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 9f1128b..a212718 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -459,13 +459,12 @@ bool QRasterPaintEngine::begin(QPaintDevice *device) QRasterPaintEngineState *s = state(); ensureOutlineMapper(); - d->outlineMapper->m_clip_rect = d->deviceRect.adjusted(-10, -10, 10, 10); - - // This is the upp - QRect bounds(-QT_RASTER_COORD_LIMIT, -QT_RASTER_COORD_LIMIT, - QT_RASTER_COORD_LIMIT*2 - 1, QT_RASTER_COORD_LIMIT * 2 - 1); - d->outlineMapper->m_clip_rect = bounds.intersected(d->outlineMapper->m_clip_rect); + d->outlineMapper->m_clip_rect = d->deviceRect; + if (d->outlineMapper->m_clip_rect.width() > QT_RASTER_COORD_LIMIT) + d->outlineMapper->m_clip_rect.setWidth(QT_RASTER_COORD_LIMIT); + if (d->outlineMapper->m_clip_rect.height() > QT_RASTER_COORD_LIMIT) + d->outlineMapper->m_clip_rect.setHeight(QT_RASTER_COORD_LIMIT); d->rasterizer->setClipRect(d->deviceRect); @@ -3789,6 +3788,7 @@ void QRasterPaintEngine::drawEllipse(const QRectF &rect) if (((qpen_style(s->lastPen) == Qt::SolidLine && s->flags.fast_pen) || (qpen_style(s->lastPen) == Qt::NoPen && !s->flags.antialiased)) && qMax(rect.width(), rect.height()) < QT_RASTER_COORD_LIMIT + && !rect.isEmpty() && s->matrix.type() <= QTransform::TxScale) // no shear { ensureBrush(); diff --git a/src/gui/painting/qpaintengine_x11.cpp b/src/gui/painting/qpaintengine_x11.cpp index b8ad9b3..910b2df 100644 --- a/src/gui/painting/qpaintengine_x11.cpp +++ b/src/gui/painting/qpaintengine_x11.cpp @@ -1453,6 +1453,11 @@ void QX11PaintEngine::drawEllipse(const QRectF &rect) void QX11PaintEngine::drawEllipse(const QRect &rect) { + if (rect.isEmpty()) { + drawRects(&rect, 1); + return; + } + Q_D(QX11PaintEngine); QRect devclip(SHRT_MIN, SHRT_MIN, SHRT_MAX*2 - 1, SHRT_MAX*2 - 1); QRect r(rect); diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index ff82d59..e0746fb 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -494,11 +494,9 @@ void QPaintEngineEx::stroke(const QVectorPath &path, const QPen &pen) } else { d->activeStroker->moveTo(points[0], points[1]); points += 2; - ++types; while (points < lastPoint) { d->activeStroker->lineTo(points[0], points[1]); points += 2; - ++types; } if (path.hasImplicitClose()) d->activeStroker->lineTo(path.points()[0], path.points()[1]); @@ -561,12 +559,10 @@ void QPaintEngineEx::stroke(const QVectorPath &path, const QPen &pen) QPointF p = ((QPointF *)points)[0] * state()->matrix; d->activeStroker->moveTo(p.x(), p.y()); points += 2; - ++types; while (points < lastPoint) { QPointF p = ((QPointF *)points)[0] * state()->matrix; d->activeStroker->lineTo(p.x(), p.y()); points += 2; - ++types; } if (path.hasImplicitClose()) d->activeStroker->lineTo(p.x(), p.y()); diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index e8c4599..71bc990 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -2391,6 +2391,8 @@ void QPainter::setCompositionMode(CompositionMode mode) qWarning("QPainter::setCompositionMode: Painter not active"); return; } + if (d->state->composition_mode == mode) + return; if (d->extended) { d->state->composition_mode = mode; d->extended->compositionModeChanged(); @@ -4238,8 +4240,6 @@ void QPainter::drawEllipse(const QRectF &r) return; QRectF rect(r.normalized()); - if (rect.isEmpty()) - return; if (d->extended) { d->extended->drawEllipse(rect); @@ -4281,8 +4281,6 @@ void QPainter::drawEllipse(const QRect &r) return; QRect rect(r.normalized()); - if (rect.isEmpty()) - return; if (d->extended) { d->extended->drawEllipse(rect); diff --git a/src/gui/styles/qcleanlooksstyle.cpp b/src/gui/styles/qcleanlooksstyle.cpp index 883f511..ada5293 100644 --- a/src/gui/styles/qcleanlooksstyle.cpp +++ b/src/gui/styles/qcleanlooksstyle.cpp @@ -884,7 +884,7 @@ void QCleanlooksStyle::drawPrimitive(PrimitiveElement elem, } painter->restore(); break; -#ifndef QT_NO_LINEDIT +#ifndef QT_NO_LINEEDIT case PE_FrameLineEdit: // fall through #endif // QT_NO_LINEEDIT diff --git a/src/gui/styles/qcommonstyle.cpp b/src/gui/styles/qcommonstyle.cpp index 4978565..039a6da 100644 --- a/src/gui/styles/qcommonstyle.cpp +++ b/src/gui/styles/qcommonstyle.cpp @@ -762,7 +762,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q #ifndef QT_NO_ITEMVIEWS case PE_PanelItemViewRow: if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(opt)) { - QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled + QPalette::ColorGroup cg = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled)) ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active)) cg = QPalette::Inactive; @@ -775,7 +775,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q break; case PE_PanelItemViewItem: if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(opt)) { - QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled + QPalette::ColorGroup cg = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled)) ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active)) cg = QPalette::Inactive; diff --git a/src/gui/styles/qgtkstyle.cpp b/src/gui/styles/qgtkstyle.cpp index b59a033..c989bd3 100644 --- a/src/gui/styles/qgtkstyle.cpp +++ b/src/gui/styles/qgtkstyle.cpp @@ -855,9 +855,10 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, key = QLS("a"); GTK_WIDGET_SET_FLAGS(gtkTreeView, GTK_HAS_FOCUS); } + bool isEnabled = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled)); gtkPainter.paintFlatBox(gtkTreeView, detail, option->rect, option->state & State_Selected ? GTK_STATE_SELECTED : - option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, + isEnabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_OUT, gtkTreeView->style, key); if (isActive ) GTK_WIDGET_UNSET_FLAGS(gtkTreeView, GTK_HAS_FOCUS); diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index 91d3fa6..45bcc00 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -1762,40 +1762,65 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, if (!styleHint(SH_UnderlineShortcut, menuItem, widget)) text_flags |= Qt::TextHideMnemonic; - const bool selected = (option->state & State_Selected) && (option->state & State_Enabled); - if (selected) - QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ListHighlight, painter, option->rect, flags); - QRect iconRect = subElementRect(SE_ItemViewItemDecoration, &optionMenuItem, widget); QRect textRect = subElementRect(SE_ItemViewItemText, &optionMenuItem, widget); //todo: move the vertical spacing stuff into subElementRect const int vSpacing = QS60StylePrivate::pixelMetric(PM_LayoutVerticalSpacing); - if (checkable){ - const int hSpacing = QS60StylePrivate::pixelMetric(PM_LayoutHorizontalSpacing); - QStyleOptionMenuItem optionCheckBox; - optionCheckBox.QStyleOptionMenuItem::operator=(*menuItem); - optionCheckBox.rect.setWidth(pixelMetric(PM_IndicatorWidth)); - optionCheckBox.rect.setHeight(pixelMetric(PM_IndicatorHeight)); - optionCheckBox.rect.moveCenter(QPoint( - optionCheckBox.rect.center().x(), - menuItem->rect.center().y())); - const int moveByX = optionCheckBox.rect.width() + vSpacing; - if (optionMenuItem.direction == Qt::LeftToRight) { - textRect.translate(moveByX, 0); + QStyleOptionMenuItem optionCheckBox; + + //Regardless of checkbox visibility, make room for it, this mirrors native implementation, + //where text and icon placement is static regardless of content of menu item. + const int hSpacing = QS60StylePrivate::pixelMetric(PM_LayoutHorizontalSpacing); + optionCheckBox.QStyleOptionMenuItem::operator=(*menuItem); + optionCheckBox.rect.setWidth(pixelMetric(PM_IndicatorWidth)); + optionCheckBox.rect.setHeight(pixelMetric(PM_IndicatorHeight)); + optionCheckBox.rect.moveCenter(QPoint( + optionCheckBox.rect.center().x(), + menuItem->rect.center().y())); + const int moveByX = optionCheckBox.rect.width() + vSpacing + + pixelMetric(PM_DefaultFrameWidth); + if (optionMenuItem.direction == Qt::LeftToRight) { + if (iconRect.isValid()) { iconRect.translate(moveByX, 0); iconRect.setWidth(iconRect.width() + vSpacing); + } + if (textRect.isValid()) { + textRect.translate(moveByX, 0); textRect.setWidth(textRect.width() - moveByX - vSpacing); - optionCheckBox.rect.translate(vSpacing >> 1, hSpacing >> 1); - } else { + } + optionCheckBox.rect.translate(vSpacing + pixelMetric(PM_DefaultFrameWidth), hSpacing >> 1); + } else { + if (textRect.isValid()) textRect.setWidth(textRect.width() - moveByX); + if (iconRect.isValid()) { iconRect.setWidth(iconRect.width() + vSpacing); iconRect.translate(-optionCheckBox.rect.width() - vSpacing, 0); - optionCheckBox.rect.translate(textRect.width() + iconRect.width(), 0); } - if (!ignoreCheckMark) - drawPrimitive(PE_IndicatorMenuCheckMark, &optionCheckBox, painter, widget); + optionCheckBox.rect.translate(textRect.width() + iconRect.width(), 0); } + + const bool selected = (option->state & State_Selected) && (option->state & State_Enabled); + if (selected) { + const int spacing = pixelMetric(PM_DefaultFrameWidth) * 2; + int start; int end; + if (QApplication::layoutDirection() == Qt::LeftToRight) { + start = optionMenuItem.rect.left() + spacing; + end = qMax(textRect.right(), iconRect.right() + spacing); + } else { + start = qMax(spacing, qMin(textRect.left(), iconRect.left() - spacing)); + end = optionMenuItem.rect.right() - spacing; + } + //-1 adjustment to avoid highlight being on top of possible separator item + const QRect highlightRect = QRect( + QPoint(start, option->rect.top()), + QPoint(end, option->rect.bottom() - 1)); + QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ListHighlight, painter, highlightRect, flags); + } + + if (checkable && !ignoreCheckMark) + drawPrimitive(PE_IndicatorMenuCheckMark, &optionCheckBox, painter, widget); + //draw icon and/or checkState QPixmap pix = menuItem->icon.pixmap(pixelMetric(PM_SmallIconSize), enabled ? QIcon::Normal : QIcon::Disabled); @@ -1806,7 +1831,7 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, textRect.translate(vSpacing, 0); else textRect.translate(-vSpacing, 0); - textRect.setWidth(textRect.width()-vSpacing); + textRect.setWidth(textRect.width() - vSpacing); } //draw indicators @@ -1844,6 +1869,24 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, QCommonStyle::drawItemText(painter, textRect, text_flags, optionMenuItem.palette, enabled, optionMenuItem.text, QPalette::Text); + + //In Sym^3, native menu items have "lines" between them + if (QS60StylePrivate::isSingleClickUi()) { + const QColor lineColorAlpha = QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnLineColors, 15, 0); + const int spacing = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth); + //native platform sets each color byte to same value for "line 16" which just defines alpha for + //menuitem lines; lets use first byte "red". + QColor lineColor = optionMenuItem.palette.text().color(); + if (lineColorAlpha.isValid()) + lineColor.setAlpha(lineColorAlpha.red()); + painter->save(); + painter->setPen(lineColor); + + const int lineStartX = optionMenuItem.rect.left() + (QS60StylePrivate::pixelMetric(PM_FrameCornerWidth) - 2) + spacing; + const int lineEndX = optionMenuItem.rect.right() - (QS60StylePrivate::pixelMetric(PM_FrameCornerWidth) - 2) - spacing; + painter->drawLine(QPoint(lineStartX, optionMenuItem.rect.bottom()), QPoint(lineEndX, optionMenuItem.rect.bottom())); + painter->restore(); + } if (!enabled) painter->restore(); } @@ -2240,6 +2283,8 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti if (QS60StylePrivate::canDrawThemeBackground(option->palette.base(), widget) && option->palette.window().texture().cacheKey() == QS60StylePrivate::m_themePalette->window().texture().cacheKey()) + //todo: for combobox listviews, the background should include area for menu scrollers, + //but this produces drawing issues as we need to turn clipping off. QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_PopupBackground, painter, option->rect, flags); else commonStyleDraws = true; @@ -2555,10 +2600,12 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt, } } sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget); + //native items have small empty areas at the beginning and end of menu item + sz.setWidth(sz.width() + 2 * pixelMetric(PM_MenuHMargin) + 2 * QS60StylePrivate::pixelMetric(PM_FrameCornerWidth)); if (QS60StylePrivate::isTouchSupported()) //Make itemview easier to use in touch devices //QCommonStyle does not adjust height with horizontal margin, it only adjusts width - sz.setHeight(sz.height() + 2 * pixelMetric(PM_FocusFrameVMargin)); + sz.setHeight(sz.height() + 2 * pixelMetric(PM_FocusFrameVMargin) - 8); //QCommonstyle adds 8 to height that this style handles through PM values break; #ifndef QT_NO_COMBOBOX case CT_ComboBox: { @@ -2823,16 +2870,7 @@ QRect QS60Style::subControlRect(ComplexControl control, const QStyleOptionComple } break; case SC_ComboBoxListBoxPopup: { - const QRect desktopContent = QApplication::desktop()->availableGeometry(); - - // take the size of this and position bottom above available area - QRect popupRect; - const int width = desktopContent.width() - pixelMetric(PM_LayoutRightMargin) - pixelMetric(PM_LayoutLeftMargin); - popupRect.setWidth(width); - popupRect.setHeight(desktopContent.height()); //combobox resets height anyway based on content - popupRect.setBottom(desktopContent.bottom()); - popupRect.translate(pixelMetric(PM_LayoutLeftMargin), 0); - ret = popupRect; + ret = QApplication::desktop()->availableGeometry(); } break; default: @@ -2996,7 +3034,6 @@ QRect QS60Style::subElementRect(SubElement element, const QStyleOption *opt, con ret.setWidth(indicatorWidth); } } else { - ret = menuItem->rect; if (!menuItem->icon.isNull()) if (menuItem->direction == Qt::LeftToRight) ret.adjust(indicatorWidth, 0, 0, 0); diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp index e5c74ad..4bb2ea8 100644 --- a/src/gui/styles/qs60style_s60.cpp +++ b/src/gui/styles/qs60style_s60.cpp @@ -1023,8 +1023,14 @@ TRect QS60StyleModeSpecifics::innerRectFromElement(QS60StylePrivate::SkinFrameEl heightShrink = heightShrink >> 1; break; case QS60StylePrivate::SF_ListHighlight: - widthShrink = widthShrink - 2; - heightShrink = heightShrink - 2; + //In Sym^3 devices highlights are less blocky + if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0) { + widthShrink += 2; + heightShrink += 2; + } else { + widthShrink -= 2; + heightShrink -= 2; + } break; case QS60StylePrivate::SF_PopupBackground: widthShrink = widthShrink + 5; diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index 943df7f..cdfba3d 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -118,7 +118,7 @@ public: { if (!font) return; - QS60Data::screenDevice()->ReleaseFont(font); + S60->screenDevice()->ReleaseFont(font); } }; @@ -205,7 +205,7 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c CFont* font = NULL; #ifdef Q_SYMBIAN_HAS_FONTTABLE_API - const TInt err = QS60Data::screenDevice()->GetNearestFontToDesignHeightInPixels(font, searchSpec); + const TInt err = S60->screenDevice()->GetNearestFontToDesignHeightInPixels(font, searchSpec); Q_ASSERT(err == KErrNone && font); QScopedPointer<CFont, CFontFromScreenDeviceReleaser> sFont(font); QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font); @@ -260,17 +260,19 @@ QFontEngineFTS60::QFontEngineFTS60(const QFontDef &fd) */ qreal QFontEngineS60::pixelsToPoints(qreal pixels, Qt::Orientation orientation) { + CWsScreenDevice* device = S60->screenDevice(); return (orientation == Qt::Horizontal? - S60->screenDevice()->HorizontalPixelsToTwips(pixels) - :S60->screenDevice()->VerticalPixelsToTwips(pixels)) / KTwipsPerPoint; + device->HorizontalPixelsToTwips(pixels) + :device->VerticalPixelsToTwips(pixels)) / KTwipsPerPoint; } qreal QFontEngineS60::pointsToPixels(qreal points, Qt::Orientation orientation) { + CWsScreenDevice* device = S60->screenDevice(); const int twips = points * KTwipsPerPoint; return orientation == Qt::Horizontal? - S60->screenDevice()->HorizontalTwipsToPixels(twips) - :S60->screenDevice()->VerticalTwipsToPixels(twips); + device->HorizontalTwipsToPixels(twips) + :device->VerticalTwipsToPixels(twips); } QFontEngineMultiS60::QFontEngineMultiS60(QFontEngine *first, int script, const QStringList &fallbackFamilies) @@ -309,16 +311,16 @@ static void initializeDb() QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock); - const int numTypeFaces = QS60Data::screenDevice()->NumTypefaces(); + const int numTypeFaces = S60->screenDevice()->NumTypefaces(); const QSymbianFontDatabaseExtrasImplementation *dbExtras = static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); bool fontAdded = false; for (int i = 0; i < numTypeFaces; i++) { TTypefaceSupport typefaceSupport; - QS60Data::screenDevice()->TypefaceSupport(typefaceSupport, i); + S60->screenDevice()->TypefaceSupport(typefaceSupport, i); CFont *font; // We have to get a font instance in order to know all the details TFontSpec fontSpec(typefaceSupport.iTypeface.iName, 11); - if (QS60Data::screenDevice()->GetNearestFontInPixels(font, fontSpec) != KErrNone) + if (S60->screenDevice()->GetNearestFontInPixels(font, fontSpec) != KErrNone) continue; QScopedPointer<CFont, QSymbianFontDatabaseExtrasImplementation::CFontFromScreenDeviceReleaser> sFont(font); if (font->TypeUid() == KCFbsFontUid) { diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm index 3be6d28..7ceed61 100644 --- a/src/gui/text/qfontengine_mac.mm +++ b/src/gui/text/qfontengine_mac.mm @@ -237,7 +237,8 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay *nglyphs = len; for (int i = 0; i < len; ++i) { outGlyphs[i] = 0; - logClusters[i] = i; + if (logClusters) + logClusters[i] = i; outAdvances_x[i] = QFixed(); outAdvances_y[i] = QFixed(); outAttributes[i].clusterStart = true; diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp index 925b3bf..f691413 100644 --- a/src/gui/text/qfontengine_s60.cpp +++ b/src/gui/text/qfontengine_s60.cpp @@ -66,7 +66,7 @@ QSymbianTypeFaceExtras::QSymbianTypeFaceExtras(CFont* cFont, COpenFont *openFont QSymbianTypeFaceExtras::~QSymbianTypeFaceExtras() { - QS60Data::screenDevice()->ReleaseFont(m_cFont); + S60->screenDevice()->ReleaseFont(m_cFont); } QByteArray QSymbianTypeFaceExtras::getSfntTable(uint tag) const diff --git a/src/gui/text/qtextoption.cpp b/src/gui/text/qtextoption.cpp index 3b02ebe..8f31e46 100644 --- a/src/gui/text/qtextoption.cpp +++ b/src/gui/text/qtextoption.cpp @@ -145,7 +145,7 @@ QTextOption &QTextOption::operator=(const QTextOption &o) \sa tabArray(), setTabStop(), setTabs() */ -void QTextOption::setTabArray(QList<qreal> tabStops) +void QTextOption::setTabArray(QList<qreal> tabStops) // Qt5: const ref { if (!d) d = new QTextOptionPrivate; @@ -165,7 +165,7 @@ void QTextOption::setTabArray(QList<qreal> tabStops) \sa tabStops() */ -void QTextOption::setTabs(QList<QTextOption::Tab> tabStops) +void QTextOption::setTabs(QList<QTextOption::Tab> tabStops) // Qt5: const ref { if (!d) d = new QTextOptionPrivate; @@ -391,6 +391,12 @@ QList<QTextOption::Tab> QTextOption::tabs() const */ /*! + \fn Tab::Tab(qreal pos, TabType tabType, QChar delim = QChar()) + Creates a tab with the given position, tab type, and (for DelimiterTab) delimiter + \since 4.7 +*/ + +/*! \fn bool Tab::operator==(const Tab &other) const Returns true if tab \a other is equal to this tab; diff --git a/src/gui/text/qtextoption.h b/src/gui/text/qtextoption.h index fa8c6f2..a48efc1 100644 --- a/src/gui/text/qtextoption.h +++ b/src/gui/text/qtextoption.h @@ -68,6 +68,8 @@ public: struct Q_GUI_EXPORT Tab { inline Tab() : position(80), type(QTextOption::LeftTab) { } + inline Tab(qreal pos, TabType tabType, QChar delim = QChar()) + : position(pos), type(tabType), delimiter(delim) {} inline bool operator==(const Tab &other) const { return type == other.type diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri index d5a9c74..34311a9 100644 --- a/src/gui/text/text.pri +++ b/src/gui/text/text.pri @@ -139,7 +139,7 @@ contains(QT_CONFIG, freetype) { ../3rdparty/freetype/src/base/ftmm.c \ ../3rdparty/freetype/src/base/fttype1.c \ ../3rdparty/freetype/src/base/ftsynth.c \ - ../3rdparty/freetype/src/base/ftbitmap.c\ + ../3rdparty/freetype/src/base/ftbitmap.c \ ../3rdparty/freetype/src/bdf/bdf.c \ ../3rdparty/freetype/src/cache/ftcache.c \ ../3rdparty/freetype/src/cff/cff.c \ diff --git a/src/gui/util/qsystemtrayicon.cpp b/src/gui/util/qsystemtrayicon.cpp index d7dde87..941961b 100644 --- a/src/gui/util/qsystemtrayicon.cpp +++ b/src/gui/util/qsystemtrayicon.cpp @@ -356,10 +356,7 @@ bool QSystemTrayIcon::isSystemTrayAvailable() */ bool QSystemTrayIcon::supportsMessages() { -#if defined(Q_WS_QWS) - return false; -#endif - return true; + return QSystemTrayIconPrivate::supportsMessages_sys(); } /*! diff --git a/src/gui/util/qsystemtrayicon_mac.mm b/src/gui/util/qsystemtrayicon_mac.mm index 8aaaa0f..22134cb 100644 --- a/src/gui/util/qsystemtrayicon_mac.mm +++ b/src/gui/util/qsystemtrayicon_mac.mm @@ -226,6 +226,11 @@ bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() return true; } +bool QSystemTrayIconPrivate::supportsMessages_sys() +{ + return true; +} + void QSystemTrayIconPrivate::showMessage_sys(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon icon, int) { diff --git a/src/gui/util/qsystemtrayicon_p.h b/src/gui/util/qsystemtrayicon_p.h index e8bf197..4592e43 100644 --- a/src/gui/util/qsystemtrayicon_p.h +++ b/src/gui/util/qsystemtrayicon_p.h @@ -83,7 +83,9 @@ public: void updateMenu_sys(); QRect geometry_sys() const; void showMessage_sys(const QString &msg, const QString &title, QSystemTrayIcon::MessageIcon icon, int secs); + static bool isSystemTrayAvailable_sys(); + static bool supportsMessages_sys(); QPointer<QMenu> menu; QIcon icon; diff --git a/src/gui/util/qsystemtrayicon_qws.cpp b/src/gui/util/qsystemtrayicon_qws.cpp index b1b895b..cda47aa 100644 --- a/src/gui/util/qsystemtrayicon_qws.cpp +++ b/src/gui/util/qsystemtrayicon_qws.cpp @@ -75,6 +75,11 @@ bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() return false; } +bool QSystemTrayIconPrivate::supportsMessages_sys() +{ + return false; +} + void QSystemTrayIconPrivate::showMessage_sys(const QString &message, const QString &title, QSystemTrayIcon::MessageIcon icon, diff --git a/src/gui/util/qsystemtrayicon_win.cpp b/src/gui/util/qsystemtrayicon_win.cpp index c89fbae..a9585b9 100644 --- a/src/gui/util/qsystemtrayicon_win.cpp +++ b/src/gui/util/qsystemtrayicon_win.cpp @@ -41,23 +41,21 @@ #include "qsystemtrayicon_p.h" #ifndef QT_NO_SYSTEMTRAYICON -#define _WIN32_IE 0x0600 //required for NOTIFYICONDATA_V2_SIZE -//missing defines for MINGW : -#ifndef NIN_BALLOONTIMEOUT -#define NIN_BALLOONTIMEOUT (WM_USER + 4) +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 #endif -#ifndef NIN_BALLOONUSERCLICK -#define NIN_BALLOONUSERCLICK (WM_USER + 5) + +#ifndef _WIN32_IE +#define _WIN32_IE 0x600 #endif #include <qt_windows.h> +#include <windowsx.h> #include <commctrl.h> -#include <QBitmap> + #include <QLibrary> #include <QApplication> -#include <QToolTip> -#include <QDesktopWidget> #include <QSettings> QT_BEGIN_NAMESPACE @@ -74,6 +72,30 @@ struct Q_NOTIFYICONIDENTIFIER { GUID guidItem; }; +#ifndef NOTIFYICON_VERSION_4 +#define NOTIFYICON_VERSION_4 4 +#endif + +#ifndef NIN_SELECT +#define NIN_SELECT (WM_USER + 0) +#endif + +#ifndef NIN_KEYSELECT +#define NIN_KEYSELECT (WM_USER + 1) +#endif + +#ifndef NIN_BALLOONTIMEOUT +#define NIN_BALLOONTIMEOUT (WM_USER + 4) +#endif + +#ifndef NIN_BALLOONUSERCLICK +#define NIN_BALLOONUSERCLICK (WM_USER + 5) +#endif + +#ifndef NIF_SHOWTIP +#define NIF_SHOWTIP 0x00000080 +#endif + #define Q_MSGFLT_ALLOW 1 typedef HRESULT (WINAPI *PtrShell_NotifyIconGetRect)(const Q_NOTIFYICONIDENTIFIER* identifier, RECT* iconLocation); @@ -87,11 +109,8 @@ public: ~QSystemTrayIconSys(); bool winEvent( MSG *m, long *result ); bool trayMessage(DWORD msg); - bool iconDrawItem(LPDRAWITEMSTRUCT lpdi); void setIconContents(NOTIFYICONDATA &data); bool showMessage(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon type, uint uSecs); - bool allowsMessages(); - bool supportsMessages(); QRect findIconGeometry(const int a_iButtonID); void createIcon(); HICON hIcon; @@ -100,10 +119,11 @@ public: private: uint notifyIconSize; int maxTipLength; + int version; bool ignoreNextMouseRelease; }; -bool QSystemTrayIconSys::allowsMessages() +static bool allowsMessages() { #ifndef QT_NO_SETTINGS QSettings settings(QLatin1String("HKEY_CURRENT_USER\\Software\\Microsoft" @@ -114,16 +134,18 @@ bool QSystemTrayIconSys::allowsMessages() #endif } -bool QSystemTrayIconSys::supportsMessages() -{ - return allowsMessages(); -} - QSystemTrayIconSys::QSystemTrayIconSys(QSystemTrayIcon *object) : hIcon(0), q(object), ignoreNextMouseRelease(false) { - notifyIconSize = FIELD_OFFSET(NOTIFYICONDATA, guidItem); // NOTIFYICONDATAW_V2_SIZE; + if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) { + notifyIconSize = sizeof(NOTIFYICONDATA); + version = NOTIFYICON_VERSION_4; + } else { + notifyIconSize = NOTIFYICONDATA_V2_SIZE; + version = NOTIFYICON_VERSION; + } + maxTipLength = 128; // For restoring the tray icon after explorer crashes @@ -157,7 +179,7 @@ QSystemTrayIconSys::~QSystemTrayIconSys() void QSystemTrayIconSys::setIconContents(NOTIFYICONDATA &tnd) { - tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; + tnd.uFlags |= NIF_MESSAGE | NIF_ICON | NIF_TIP; tnd.uCallbackMessage = MYWM_NOTIFYICON; tnd.hIcon = hIcon; QString tip = q->toolTip(); @@ -170,7 +192,6 @@ void QSystemTrayIconSys::setIconContents(NOTIFYICONDATA &tnd) static int iconFlag( QSystemTrayIcon::MessageIcon icon ) { -#if NOTIFYICON_VERSION >= 3 switch (icon) { case QSystemTrayIcon::Information: return NIIF_INFO; @@ -184,20 +205,13 @@ static int iconFlag( QSystemTrayIcon::MessageIcon icon ) Q_ASSERT_X(false, "QSystemTrayIconSys::showMessage", "Invalid QSystemTrayIcon::MessageIcon value"); return NIIF_NONE; } -#else - Q_UNUSED(icon); - return 0; -#endif } bool QSystemTrayIconSys::showMessage(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon type, uint uSecs) { -#if NOTIFYICON_VERSION >= 3 NOTIFYICONDATA tnd; memset(&tnd, 0, notifyIconSize); - Q_ASSERT(testAttribute(Qt::WA_WState_Created)); - setIconContents(tnd); memcpy(tnd.szInfo, message.utf16(), qMin(message.length() + 1, 256) * sizeof(wchar_t)); memcpy(tnd.szInfoTitle, title.utf16(), qMin(title.length() + 1, 64) * sizeof(wchar_t)); @@ -206,42 +220,36 @@ bool QSystemTrayIconSys::showMessage(const QString &title, const QString &messag tnd.cbSize = notifyIconSize; tnd.hWnd = winId(); tnd.uTimeout = uSecs; - tnd.uFlags = NIF_INFO; + tnd.uFlags = NIF_INFO | NIF_SHOWTIP; + + Q_ASSERT(testAttribute(Qt::WA_WState_Created)); return Shell_NotifyIcon(NIM_MODIFY, &tnd); -#else - Q_UNUSED(title); - Q_UNUSED(message); - Q_UNUSED(type); - Q_UNUSED(uSecs); - return false; -#endif } bool QSystemTrayIconSys::trayMessage(DWORD msg) { NOTIFYICONDATA tnd; memset(&tnd, 0, notifyIconSize); + tnd.uID = q_uNOTIFYICONID; tnd.cbSize = notifyIconSize; tnd.hWnd = winId(); + tnd.uFlags = NIF_SHOWTIP; + tnd.uVersion = version; Q_ASSERT(testAttribute(Qt::WA_WState_Created)); - if (msg != NIM_DELETE) { + if (msg == NIM_ADD || msg == NIM_MODIFY) { setIconContents(tnd); } - return Shell_NotifyIcon(msg, &tnd); -} + bool success = Shell_NotifyIcon(msg, &tnd); -bool QSystemTrayIconSys::iconDrawItem(LPDRAWITEMSTRUCT lpdi) -{ - if (!hIcon) - return false; - - DrawIconEx(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top, hIcon, 0, 0, 0, 0, DI_NORMAL); - return true; + if (msg == NIM_ADD) + return success && Shell_NotifyIcon(NIM_SETVERSION, &tnd); + else + return success; } void QSystemTrayIconSys::createIcon() @@ -264,27 +272,24 @@ void QSystemTrayIconSys::createIcon() bool QSystemTrayIconSys::winEvent( MSG *m, long *result ) { switch(m->message) { - case WM_CREATE: -#ifdef GWLP_USERDATA - SetWindowLongPtr(winId(), GWLP_USERDATA, (LONG_PTR)((CREATESTRUCTW*)m->lParam)->lpCreateParams); -#else - SetWindowLong(winId(), GWL_USERDATA, (LONG)((CREATESTRUCTW*)m->lParam)->lpCreateParams); -#endif - break; - - case WM_DRAWITEM: - return iconDrawItem((LPDRAWITEMSTRUCT)m->lParam); - case MYWM_NOTIFYICON: { - RECT r; - GetWindowRect(winId(), &r); - QEvent *e = 0; - Qt::KeyboardModifiers keys = QApplication::keyboardModifiers(); - QPoint gpos = QCursor::pos(); - - switch (m->lParam) { - case WM_LBUTTONUP: + int message = 0; + QPoint gpos; + + if (version == NOTIFYICON_VERSION_4) { + Q_ASSERT(q_uNOTIFYICONID == HIWORD(m->lParam)); + message = LOWORD(m->lParam); + gpos = QPoint(GET_X_LPARAM(m->wParam), GET_Y_LPARAM(m->wParam)); + } else { + Q_ASSERT(q_uNOTIFYICONID == m->wParam); + message = m->lParam; + gpos = QCursor::pos(); + } + + switch (message) { + case NIN_SELECT: + case NIN_KEYSELECT: if (ignoreNextMouseRelease) ignoreNextMouseRelease = false; else @@ -297,7 +302,7 @@ bool QSystemTrayIconSys::winEvent( MSG *m, long *result ) emit q->activated(QSystemTrayIcon::DoubleClick); break; - case WM_RBUTTONUP: + case WM_CONTEXTMENU: if (q->contextMenu()) { q->contextMenu()->popup(gpos); } @@ -311,13 +316,9 @@ bool QSystemTrayIconSys::winEvent( MSG *m, long *result ) case WM_MBUTTONUP: emit q->activated(QSystemTrayIcon::MiddleClick); break; + default: - break; - } - if (e) { - bool res = QApplication::sendEvent(q, e); - delete e; - return res; + break; } break; } @@ -441,7 +442,7 @@ QRect QSystemTrayIconSys::findIconGeometry(const int iconId) void QSystemTrayIconPrivate::showMessage_sys(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon type, int timeOut) { - if (!sys || !sys->allowsMessages()) + if (!sys || !allowsMessages()) return; uint uSecs = 0; @@ -459,21 +460,14 @@ void QSystemTrayIconPrivate::showMessage_sys(const QString &title, const QString //title is limited to 63 chars + NULL QString titleString = title.left(63) + QChar(); - if (sys->supportsMessages()) { - sys->showMessage(titleString, messageString, type, (unsigned int)uSecs); - } else { - //use fallback - QRect iconPos = sys->findIconGeometry(q_uNOTIFYICONID); - if (iconPos.isValid()) { - QBalloonTip::showBalloon(type, title, message, sys->q, iconPos.center(), uSecs, true); - } - } + sys->showMessage(titleString, messageString, type, uSecs); } QRect QSystemTrayIconPrivate::geometry_sys() const { if (!sys) return QRect(); + return sys->findIconGeometry(q_uNOTIFYICONID); } @@ -519,6 +513,11 @@ bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() return true; } +bool QSystemTrayIconPrivate::supportsMessages_sys() +{ + return allowsMessages(); +} + QT_END_NAMESPACE #endif diff --git a/src/gui/util/qsystemtrayicon_wince.cpp b/src/gui/util/qsystemtrayicon_wince.cpp index 0a0d340..e5cf0fd 100644 --- a/src/gui/util/qsystemtrayicon_wince.cpp +++ b/src/gui/util/qsystemtrayicon_wince.cpp @@ -155,10 +155,6 @@ bool QSystemTrayIconSys::winEvent( MSG *m, long *result ) case MYWM_NOTIFYICON: { - RECT r; - GetWindowRect(winId(), &r); - QEvent *e = 0; - Qt::KeyboardModifiers keys = QApplication::keyboardModifiers(); QPoint gpos = QCursor::pos(); switch (m->lParam) { @@ -193,14 +189,10 @@ bool QSystemTrayIconSys::winEvent( MSG *m, long *result ) case WM_MBUTTONUP: emit q->activated(QSystemTrayIcon::MiddleClick); break; + default: break; } - if (e) { - bool res = QApplication::sendEvent(q, e); - delete e; - return res; - } break; } default: @@ -291,6 +283,11 @@ bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() return true; } +bool QSystemTrayIconPrivate::supportsMessages_sys() +{ + return true; +} + QT_END_NAMESPACE #endif diff --git a/src/gui/util/qsystemtrayicon_x11.cpp b/src/gui/util/qsystemtrayicon_x11.cpp index 82b4325..59fdc07 100644 --- a/src/gui/util/qsystemtrayicon_x11.cpp +++ b/src/gui/util/qsystemtrayicon_x11.cpp @@ -381,6 +381,11 @@ bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() return QSystemTrayIconSys::locateSystemTray() != XNone; } +bool QSystemTrayIconPrivate::supportsMessages_sys() +{ + return true; +} + void QSystemTrayIconPrivate::showMessage_sys(const QString &message, const QString &title, QSystemTrayIcon::MessageIcon icon, int msecs) { diff --git a/src/network/access/access.pri b/src/network/access/access.pri index aa36890..173a087 100644 --- a/src/network/access/access.pri +++ b/src/network/access/access.pri @@ -59,8 +59,9 @@ SOURCES += access/qftp.cpp \ #zlib support contains(QT_CONFIG, zlib) { - INCLUDEPATH += ../3rdparty/zlib + INCLUDEPATH += ../3rdparty/zlib } else:!contains(QT_CONFIG, no-zlib) { - unix:LIBS_PRIVATE += -lz -# win32:LIBS += libz.lib + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib } diff --git a/src/network/network.qrc b/src/network/network.qrc deleted file mode 100644 index 06f98cb..0000000 --- a/src/network/network.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE RCC><RCC version="1.0"> -<qresource prefix="/trolltech/network"> -<file>ssl/qt-ca-bundle.crt</file> -</qresource> -</RCC> diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h index feaaae0..4f92b64 100644 --- a/src/network/socket/qlocalserver_p.h +++ b/src/network/socket/qlocalserver_p.h @@ -99,6 +99,7 @@ public: struct Listener { HANDLE handle; OVERLAPPED overlapped; + bool connected; }; void setError(const QString &function); diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp index 07baf1e..61220e4 100644 --- a/src/network/socket/qlocalserver_win.cpp +++ b/src/network/socket/qlocalserver_win.cpp @@ -85,8 +85,10 @@ bool QLocalServerPrivate::addListener() if (!ConnectNamedPipe(listener.handle, &listener.overlapped)) { switch (GetLastError()) { case ERROR_IO_PENDING: + listener.connected = false; break; case ERROR_PIPE_CONNECTED: + listener.connected = true; SetEvent(eventHandle); break; default: @@ -155,7 +157,9 @@ void QLocalServerPrivate::_q_onNewConnection() // a client connection first, so there is no way around polling all of them. for (int i = 0; i < listeners.size(); ) { HANDLE handle = listeners[i].handle; - if (GetOverlappedResult(handle, &listeners[i].overlapped, &dummy, FALSE)) { + if (listeners[i].connected + || GetOverlappedResult(handle, &listeners[i].overlapped, &dummy, FALSE)) + { listeners.removeAt(i); addListener(); diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h index 0f1c23c..57ca3c2 100644 --- a/src/network/socket/qlocalsocket_p.h +++ b/src/network/socket/qlocalsocket_p.h @@ -135,7 +135,7 @@ public: void _q_canWrite(); void _q_pipeClosed(); void _q_emitReadyRead(); - DWORD bytesAvailable(); + DWORD checkPipeState(); void startAsyncRead(); bool completeAsyncRead(); void checkReadyRead(); diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 5f46ecb..5486f47 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -192,6 +192,9 @@ qint64 QLocalSocket::readData(char *data, qint64 maxSize) { Q_D(QLocalSocket); + if (d->pipeClosed && d->actualReadBufferSize == 0) + return -1; // signal EOF + qint64 readSoFar; // If startAsyncRead() read data, copy it to its destination. if (maxSize == 1 && d->actualReadBufferSize > 0) { @@ -213,10 +216,8 @@ qint64 QLocalSocket::readData(char *data, qint64 maxSize) } if (d->pipeClosed) { - if (readSoFar == 0) { + if (d->actualReadBufferSize == 0) QTimer::singleShot(0, this, SLOT(_q_pipeClosed())); - return -1; // signal EOF - } } else { if (!d->readSequenceStarted) d->startAsyncRead(); @@ -250,7 +251,10 @@ void QLocalSocketPrivate::checkReadyRead() void QLocalSocketPrivate::startAsyncRead() { do { - DWORD bytesToRead = bytesAvailable(); + DWORD bytesToRead = checkPipeState(); + if (pipeClosed) + return; + if (bytesToRead == 0) { // There are no bytes in the pipe but we need to // start the overlapped read with some buffer size. @@ -333,9 +337,11 @@ void QLocalSocket::abort() } /*! - The number of bytes available from the pipe - */ -DWORD QLocalSocketPrivate::bytesAvailable() + \internal + Returns the number of available bytes in the pipe. + Sets QLocalSocketPrivate::pipeClosed to true if the connection is broken. + */ +DWORD QLocalSocketPrivate::checkPipeState() { Q_Q(QLocalSocket); DWORD bytes; @@ -345,7 +351,8 @@ DWORD QLocalSocketPrivate::bytesAvailable() if (!pipeClosed) { pipeClosed = true; emit q->readChannelFinished(); - QTimer::singleShot(0, q, SLOT(_q_pipeClosed())); + if (actualReadBufferSize == 0) + QTimer::singleShot(0, q, SLOT(_q_pipeClosed())); } } return 0; @@ -478,6 +485,8 @@ void QLocalSocketPrivate::_q_notified() if (!completeAsyncRead()) { pipeClosed = true; emit q->readChannelFinished(); + if (actualReadBufferSize == 0) + QTimer::singleShot(0, q, SLOT(_q_pipeClosed())); return; } startAsyncRead(); @@ -529,7 +538,7 @@ bool QLocalSocket::waitForDisconnected(int msecs) } QIncrementalSleepTimer timer(msecs); forever { - d->bytesAvailable(); // to check if PeekNamedPipe fails + d->checkPipeState(); if (d->pipeClosed) close(); if (state() == UnconnectedState) @@ -561,11 +570,22 @@ bool QLocalSocket::waitForReadyRead(int msecs) if (d->state != QLocalSocket::ConnectedState) return false; + // We already know that the pipe is gone, but did not enter the event loop yet. + if (d->pipeClosed) { + close(); + return false; + } + Q_ASSERT(d->readSequenceStarted); DWORD result = WaitForSingleObject(d->overlapped.hEvent, msecs == -1 ? INFINITE : msecs); switch (result) { case WAIT_OBJECT_0: d->_q_notified(); + // We just noticed that the pipe is gone. + if (d->pipeClosed) { + close(); + return false; + } return true; case WAIT_TIMEOUT: return false; diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp index 31c5ed1..a3ea555 100644 --- a/src/network/ssl/qsslcertificate.cpp +++ b/src/network/ssl/qsslcertificate.cpp @@ -548,8 +548,13 @@ QList<QSslCertificate> QSslCertificate::fromPath(const QString &path, // chop off the first two characters from the glob'ed paths. int startIndex = 0; if (pathPrefix.trimmed().isEmpty()) { - startIndex = 2; - pathPrefix = QLatin1String("."); + if(path.startsWith(QLatin1Char('/'))) { + pathPrefix = path.left(path.indexOf(QRegExp(QLatin1String("[\\*\\?\\[]")))); + pathPrefix = path.left(path.lastIndexOf(QLatin1Char('/'))); + } else { + startIndex = 2; + pathPrefix = QLatin1String("."); + } } // The path is a file. diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index 0918539..a8c602a 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -1329,8 +1329,8 @@ void QSslSocket::setDefaultCaCertificates(const QList<QSslCertificate> &certific /*! Returns the current default CA certificate database. This database is originally set to your system's default CA certificate database. - If no system default database is found, Qt will provide its own - default database. You can override the default CA certificate database + If no system default database is found, an empty database will be + returned. You can override the default CA certificate database with your own CA certificate database using setDefaultCaCertificates(). Each SSL socket's CA certificate database is initialized to the @@ -1344,8 +1344,8 @@ QList<QSslCertificate> QSslSocket::defaultCaCertificates() } /*! - This function provides a default CA certificate database - shipped together with Qt. The CA certificate database + This function provides the CA certificate database + provided by the operating system. The CA certificate database returned by this function is used to initialize the database returned by defaultCaCertificates(). You can replace that database with your own with setDefaultCaCertificates(). diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 050fb1b..36a0cc7 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -57,12 +57,18 @@ #include <QtCore/qthread.h> #include <QtCore/qurl.h> #include <QtCore/qvarlengtharray.h> - -static void initNetworkResources() -{ - // Initialize resources - Q_INIT_RESOURCE(network); -} +#include <QLibrary> // for loading the security lib for the CA store + +#if defined(Q_OS_MAC) +#define kSecTrustSettingsDomainSystem 2 // so we do not need to include the header file + PtrSecCertificateGetData QSslSocketPrivate::ptrSecCertificateGetData = 0; + PtrSecTrustSettingsCopyCertificates QSslSocketPrivate::ptrSecTrustSettingsCopyCertificates = 0; + PtrSecTrustCopyAnchorCertificates QSslSocketPrivate::ptrSecTrustCopyAnchorCertificates = 0; +#elif defined(Q_OS_WIN) + PtrCertOpenSystemStoreW QSslSocketPrivate::ptrCertOpenSystemStoreW = 0; + PtrCertFindCertificateInStore QSslSocketPrivate::ptrCertFindCertificateInStore = 0; + PtrCertCloseStore QSslSocketPrivate::ptrCertCloseStore = 0; +#endif QT_BEGIN_NAMESPACE @@ -406,9 +412,6 @@ bool QSslSocketPrivate::ensureInitialized() if (!q_initialized) { q_initialized = true; - // Initialize resources - initNetworkResources(); - // Initialize OpenSSL. q_CRYPTO_set_id_callback(id_function); q_CRYPTO_set_locking_callback(locking_function); @@ -448,6 +451,36 @@ bool QSslSocketPrivate::ensureInitialized() resetDefaultCiphers(); setDefaultCaCertificates(systemCaCertificates()); } + + //load symbols needed to receive certificates from system store +#if defined(Q_OS_MAC) + QLibrary securityLib("/System/Library/Frameworks/Security.framework/Versions/Current/Security"); + if (securityLib.load()) { + ptrSecCertificateGetData = (PtrSecCertificateGetData) securityLib.resolve("SecCertificateGetData"); + if (!ptrSecCertificateGetData) + qWarning("could not resolve symbols in security library"); // should never happen + + ptrSecTrustSettingsCopyCertificates = (PtrSecTrustSettingsCopyCertificates) securityLib.resolve("SecTrustSettingsCopyCertificates"); + if (!ptrSecTrustSettingsCopyCertificates) { // method was introduced in Leopard, use legacy method if it's not there + ptrSecTrustCopyAnchorCertificates = (PtrSecTrustCopyAnchorCertificates) securityLib.resolve("SecTrustCopyAnchorCertificates"); + if (!ptrSecTrustCopyAnchorCertificates) + qWarning("could not resolve symbols in security library"); // should never happen + } + } else { + qWarning("could not load security library"); + } +#elif defined(Q_OS_WIN) + HINSTANCE hLib = LoadLibraryW(L"Crypt32"); + if (hLib) { + ptrCertOpenSystemStoreW = (PtrCertOpenSystemStoreW)GetProcAddress(hLib, "CertOpenSystemStoreW"); + ptrCertFindCertificateInStore = (PtrCertFindCertificateInStore)GetProcAddress(hLib, "CertFindCertificateInStore"); + ptrCertCloseStore = (PtrCertCloseStore)GetProcAddress(hLib, "CertCloseStore"); + if (!ptrCertOpenSystemStoreW || !ptrCertFindCertificateInStore || !ptrCertCloseStore) + qWarning("could not resolve symbols in crypt32 library"); // should never happen + } else { + qWarning("could not load crypt32 library"); // should never happen + } +#endif return true; } @@ -486,13 +519,74 @@ void QSslSocketPrivate::resetDefaultCiphers() QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates() { - // Qt provides a default bundle of certificates - QFile caBundle(QLatin1String(":/trolltech/network/ssl/qt-ca-bundle.crt")); - if (caBundle.open(QIODevice::ReadOnly | QIODevice::Text)) - return QSslCertificate::fromDevice(&caBundle); - - // Unreachable; return no bundle. - return QList<QSslCertificate>(); + ensureInitialized(); + QList<QSslCertificate> systemCerts; +#if defined(Q_OS_MAC) + CFArrayRef cfCerts; + OSStatus status = 1; + + OSStatus SecCertificateGetData ( + SecCertificateRef certificate, + CSSM_DATA_PTR data + ); + + if (ptrSecCertificateGetData) { + if (ptrSecTrustSettingsCopyCertificates) + status = ptrSecTrustSettingsCopyCertificates(kSecTrustSettingsDomainSystem, &cfCerts); + else if (ptrSecTrustCopyAnchorCertificates) + status = ptrSecTrustCopyAnchorCertificates(&cfCerts); + if (!status) { + CFIndex size = CFArrayGetCount(cfCerts); + for (CFIndex i = 0; i < size; ++i) { + SecCertificateRef cfCert = (SecCertificateRef)CFArrayGetValueAtIndex(cfCerts, i); + CSSM_DATA data; + CSSM_DATA_PTR dataPtr = &data; + if (ptrSecCertificateGetData(cfCert, dataPtr)) { + qWarning("error retrieving a CA certificate from the system store"); + } else { + int len = data.Length; + char *rawData = reinterpret_cast<char *>(data.Data); + QByteArray rawCert(rawData, len); + systemCerts.append(QSslCertificate::fromData(rawCert, QSsl::Der)); + } + } + } + else { + // no detailed error handling here + qWarning("could not retrieve system CA certificates"); + } + } +#elif defined(Q_OS_WIN) + if (ptrCertOpenSystemStoreW && ptrCertFindCertificateInStore && ptrCertCloseStore) { + HCERTSTORE hSystemStore; + hSystemStore = ptrCertOpenSystemStoreW(0, L"ROOT"); + if(hSystemStore) { + PCCERT_CONTEXT pc = NULL; + while(1) { + pc = ptrCertFindCertificateInStore( hSystemStore, X509_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, pc); + if(!pc) + break; + QByteArray der((const char *)(pc->pbCertEncoded), static_cast<int>(pc->cbCertEncoded)); + QSslCertificate cert(der,QSsl::Der); + systemCerts.append(cert); + } + ptrCertCloseStore(hSystemStore, 0); + } + } +#elif defined(Q_OS_AIX) + systemCerts.append(QSslCertificate::fromPath("/var/ssl/certs/*.pem", QSsl::Pem, QRegExp::Wildcard)); +#elif defined(Q_OS_SOLARIS) + systemCerts.append(QSslCertificate::fromPath("/usr/local/ssl/certs/*.pem", QSsl::Pem, QRegExp::Wildcard)); +#elif defined(Q_OS_HPUX) + systemCerts.append(QSslCertificate::fromPath("/opt/openssl/certs/*.pem", QSsl::Pem, QRegExp::Wildcard)); +#elif defined(Q_OS_LINUX) + systemCerts.append(QSslCertificate::fromPath("/etc/ssl/certs/*.pem", QSsl::Pem, QRegExp::Wildcard)); // (K)ubuntu, OpenSUSE, Mandriva, ... + systemCerts.append(QSslCertificate::fromPath("/etc/pki/tls/certs/ca-bundle.crt", QSsl::Pem)); // Fedora + systemCerts.append(QSslCertificate::fromPath("/usr/lib/ssl/certs/*.pem", QSsl::Pem, QRegExp::Wildcard)); // Gentoo, Mandrake + systemCerts.append(QSslCertificate::fromPath("/usr/share/ssl/*.pem", QSsl::Pem, QRegExp::Wildcard)); // Centos, Redhat, SuSE + systemCerts.append(QSslCertificate::fromPath("/usr/local/ssl/*.pem", QSsl::Pem, QRegExp::Wildcard)); // Normal OpenSSL Tarball +#endif + return systemCerts; } void QSslSocketBackendPrivate::startClientEncryption() diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h index 8e22664..42ae98f 100644 --- a/src/network/ssl/qsslsocket_p.h +++ b/src/network/ssl/qsslsocket_p.h @@ -66,6 +66,24 @@ QT_BEGIN_NAMESPACE +#if defined(Q_OS_MAC) +#include <Security/SecCertificate.h> +#include <CoreFoundation/CFArray.h> + typedef OSStatus (*PtrSecCertificateGetData)(SecCertificateRef, CSSM_DATA_PTR); + typedef OSStatus (*PtrSecTrustSettingsCopyCertificates)(int, CFArrayRef*); + typedef OSStatus (*PtrSecTrustCopyAnchorCertificates)(CFArrayRef*); +#elif defined(Q_OS_WIN) +#include <Wincrypt.h> +#ifndef HCRYPTPROV_LEGACY +#define HCRYPTPROV_LEGACY HCRYPTPROV +#endif + typedef HCERTSTORE (WINAPI *PtrCertOpenSystemStoreW)(HCRYPTPROV_LEGACY, LPCWSTR); + typedef PCCERT_CONTEXT (WINAPI *PtrCertFindCertificateInStore)(HCERTSTORE, DWORD, DWORD, DWORD, const void*, PCCERT_CONTEXT); + typedef BOOL (WINAPI *PtrCertCloseStore)(HCERTSTORE, DWORD); +#endif + + + class QSslSocketPrivate : public QTcpSocketPrivate { Q_DECLARE_PUBLIC(QSslSocket) @@ -106,6 +124,16 @@ public: static void addDefaultCaCertificate(const QSslCertificate &cert); static void addDefaultCaCertificates(const QList<QSslCertificate> &certs); +#if defined(Q_OS_MAC) + static PtrSecCertificateGetData ptrSecCertificateGetData; + static PtrSecTrustSettingsCopyCertificates ptrSecTrustSettingsCopyCertificates; + static PtrSecTrustCopyAnchorCertificates ptrSecTrustCopyAnchorCertificates; +#elif defined(Q_OS_WIN) + static PtrCertOpenSystemStoreW ptrCertOpenSystemStoreW; + static PtrCertFindCertificateInStore ptrCertFindCertificateInStore; + static PtrCertCloseStore ptrCertCloseStore; +#endif + // The socket itself, including private slots. QTcpSocket *plainSocket; void createPlainSocket(QIODevice::OpenMode openMode); diff --git a/src/network/ssl/qt-ca-bundle.crt b/src/network/ssl/qt-ca-bundle.crt deleted file mode 100644 index 7755ca0..0000000 --- a/src/network/ssl/qt-ca-bundle.crt +++ /dev/null @@ -1,1984 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Certificates -## -## This is a bundle of X.509 certificates of public -## Certificate Authorities (CA). -## - ------BEGIN CERTIFICATE----- -MIICfTCCAeagAwIBAgIEAgAAuDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSkwJwYD -VQQDEyBCYWx0aW1vcmUgQ3liZXJUcnVzdCBNb2JpbGUgUm9vdDAeFw0wMDA1MTIx -ODIwMDBaFw0yMDA1MTIyMzU5MDBaMGExCzAJBgNVBAYTAklFMRIwEAYDVQQKEwlC -YWx0aW1vcmUxEzARBgNVBAsTCkN5YmVyVHJ1c3QxKTAnBgNVBAMTIEJhbHRpbW9y -ZSBDeWJlclRydXN0IE1vYmlsZSBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCjbbE4Vqz8tVYh3sCQXSZHgsZ9jx+ghY8vu9ThHB3yJB8osC+5pKVvoiIg -ZP6ERzx+K2xparjUwJaOjFINzW9B1L8ErqeBLy2YSNLBlKO1GV1dUWT0jkGwm8At -IqBexthaEmO8EUpeJhId4iYF5g9fIh96X3aUrs9aKA6rRdoiMQIDAQABo0IwQDAd -BgNVHQ4EFgQUyeKPwAImWrbAB+N/lAcY2y6lmnAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEFBQADgYEAUwgLJgl4QnPU7Hp3Rw3j -CzNx764zFE37+v0at1H15JkcBnHXKRnX5hUgUVFGbU/eGEmY0Ph4u3HojQEG1ddk -j5TfR/6ghWk2qS9CemhKEtaLC3BECqQE7yaIwTVxOF0bW0hC8OeUHHCVNKir9avi -eK318FL9m+pCDOjYVL5TZvU= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg -bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ -j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV -Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw -MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 -fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i -+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ -gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE -CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx -ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf -WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK -xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE -zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F -5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv -OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz -ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME -lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG -Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q -gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k -Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ -k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso -LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o -TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 -MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C -TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 -WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL -B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE -CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy -MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV -p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw -BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl -5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi -3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ -QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ -2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN -I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL -553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q -10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN -uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u -ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh -Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU -MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D -bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq -RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G -CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo -6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux -5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm -AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC -ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m -by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp -IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg -Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg -KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV -HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E -BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE -FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 -pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz -wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a -EkP/TOYGJqibGapEPHayXOw= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDIzCCAoygAwIBAgIENeHvHjANBgkqhkiG9w0BAQUFADBPMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEuMCwGA1UECxMlRXF1aWZheCBQcmVtaXVtIENl -cnRpZmljYXRlIEF1dGhvcml0eTAeFw05ODA4MjQyMjU0MjNaFw0xODA4MjQyMjU0 -MjNaME8xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFcXVpZmF4MS4wLAYDVQQLEyVF -cXVpZmF4IFByZW1pdW0gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDOoQaOBswIC8GGqN4g1Q0O0Q3En+pq2bPCMkdAb4qI -pAm9OCwd5svmpPM269rrvPxkswf2Lbyqzp8ZSGhK/PWiRX4JEPWPs0lcIwY56hOL -uAvNkR12X9k3oUT7X5DyZ7PNGJlDH3YSawLylYM4Q8L2YjTKyXhdX9LYupr/vhBg -WwIDAQABo4IBCjCCAQYwcQYDVR0fBGowaDBmoGSgYqRgMF4xCzAJBgNVBAYTAlVT -MRAwDgYDVQQKEwdFcXVpZmF4MS4wLAYDVQQLEyVFcXVpZmF4IFByZW1pdW0gQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIw -MTgwODI0MjI1NDIzWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUFe6yKFmrbuX4 -z4uB9CThrj91G5gwHQYDVR0OBBYEFBXusihZq27l+M+LgfQk4a4/dRuYMAwGA1Ud -EwQFMAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEB -BQUAA4GBAL0LnCepA9so3JipS9DRjqeoGlqR4Jzx9xh8LiKeNh/JqLXNRkpu+jUH -G4YI65/iqPmdQS06rlxctl80BOv8KmCw+3TkhellOJbuFcfGd2MSvYpoH6tsfdrK -XBPO6snrCVzFc+cSAdXZUwee4A+W8Iu0u0VIn4bFGVWgy5bFA/xI ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgICAbYwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVVMx -GDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1 -c3QgU29sdXRpb25zLCBJbmMuMR4wHAYDVQQDExVHVEUgQ3liZXJUcnVzdCBSb290 -IDUwHhcNOTgwODE0MTQ1MDAwWhcNMTMwODE0MjM1OTAwWjBwMQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xHjAcBgNVBAMTFUdURSBDeWJlclRydXN0IFJv -b3QgNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALwSbj+KfHqXAewe -uzlaAvR4RKJIG457SVJ6uHtHs6+Um2+7lvoramVcuByUc76/iQoigO5X/IwFu3Cf -lzkE2qOHXKjlyq/AM5rVN1xLrOSA0KYjYPv9ci6UncfOwgQy73hgXe2thw9FZR48 -mgqavl0dmezn8tHGehfZrZtUln/EfGC/haoVNR1A2hG87FQhKC0joajwzy3N3fx+ -D17hZQdWywe00lboXjHMGGPEhtIthc+Tkqtt/mg5+95zvYb45EZ66p8My/QZ/mO8 -0Sx7iDM29uThnAxTgWAc2i6rlqkWiBNQmbK9Vd8VMH7o5Zj7cH5stQf8/Ea30O03 -ln4y/iECAwEAAaNaMFgwEgYDVR0TAQH/BAgwBgEB/wIBBTAOBgNVHQ8BAf8EBAMC -AQYwFwYDVR0gBBAwDjAMBgoqhkiG+GMBAgEDMBkGA1UdDgQSBBB2CkkhOEyf3vjE -ScdxcZGdMA0GCSqGSIb3DQEBBQUAA4IBAQBBOtQYW9q43iEc4Y4J5fFoNP/elvQH -9ac886xKsZv6kvqb7eYyIapKdsXcTzjl39WG5NXIdn2Y17HNj021kSNsi4rr6nzv -FJTExvAfSi0ycWMrY5EmAgm2gB3t4sy4f9uHY8jh0GwmsTUdQGYQG82VVBgzYewT -T9oT95mvPtDPjqZyorPDBZrJJ32SzH5SjbOrcG2eiZ9N6xp1wpiq1QIW1wyKvyXk -6y28mOlYOBl8uTf+2+KZCHMGx5eDan0QAS8yuRcFSmXmL86+XlOmgumaUwqEdC2D -ysiUFnZflGEo8IWnObvXi9moshMdVAk0JH0ggX1mfqKQdFwQxr3sqxvC ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDnjCCAoagAwIBAgILAgAAAAAA1ni50a8wDQYJKoZIhvcNAQEEBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAxMjgxMjAw -MDBaFw0wOTAxMjgxMjAwMDBaMF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xv -YmFsU2lnbiBQYXJ0bmVycyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBANIs+DKsShJ6N8gpkaWujG4eDsA0M4jlM3EWHHiEaMMYNFAuFj6xlIJPsZqf -APjGETXGaXuYAq0ABohs50wzKACIJ0Yfh7NxdWO8MruI3mYYDlAGk7T2vBQ3MD0i -3z3/dX7ZChrFn7P80KyzCHqJ0wHoAFznSgs9TXsmordiBovaRt2TFz8/WwJLC7aI -IBGSAK27xy7U40Wu9YlafI2krYVkMsAnjMbyioCShiRWWY10aKKDQrOePVBBhm8g -bvb9ztMZ4zLMj+2aXm0fKPVSrG4YXvg90ZLlumwBiEsK8i3eZTMFQqBMqjF2vv2/ -gXj5cRxGXi0VlS0wWY5MQdFiqz0CAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgAGMB0G -A1UdDgQWBBRDJI1wFQhiVZxPDEAXXYZeD6JM+zAfBgNVHSMEGDAWgBRge2YaRQ2X -yolQL30EzTSo//z9SzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IB -AQBm7bSIaRGZgiGDrKFti5uErQ8tyB6Mynt+rarUjt4H1p5Fx6W4nAc5YCVVGsBP -GeXPFylJiRg1ZuXrKEBOV8mvs+S4IAWjO5VQkUmUKX0s5YhBpUWIXp2CJ/fS71u1 -T5++/jVlLFVkn+FR2iJhd7pYTo/GeVlZbjCAok+QbiELrdBoOZAQm+0iZW8eETjm -f4zS8zltR9Uh6Op1OkHRrfYWnV0LIb3zH2MGJR3BHzVxLOsgGdXBsOw95W/tAgc/ -E3tmktZEwZj3X1CLelvCb22w0fjldKBAN6MlD+Q9ymQxk5BcMHu5OTGaXkzNuUFP -UOQ9OK7IZtnHO11RR6ybq/Kt ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDrDCCApSgAwIBAgILAgAAAAAA1ni4N88wDQYJKoZIhvcNAQEEBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MTUxMjAw -MDBaFw0wOTAxMjgxMjAwMDBaMG0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRswGQYDVQQLExJQcmltYXJ5IENsYXNzIDEgQ0ExJjAkBgNV -BAMTHUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAxIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAvSA1R9Eo1gijEjkjRw29cCFSDlcxlaY0V2vsfkN5 -wwZSSM28taGZvdgfMrzP125ybS53IpCCTkuPmgwBQprZcFm2nR/mY9EMrR1O+IWB -+a7vn6ZSYUR5GnVF4GFWRW1CjD1yy6akErea9dZg0GBQs46mpuy09BLNf6jO77Ph -hTD+csTm53eznlhB1lGDiAfGtmlPNt7RC0g/vdafIXRkbycGPkv9Dqabv6RIV4yQ -7okYCwKBGL5n/lNgiCe6o3M0S1pWtN5zBe2Yll3sSudA/EsJYuvQ4zFPhdF6q1ln -K/uID+uqg701/WEn7GYOQlf3acIM7/xqwm5J2o9BOK5IqQIDAQABo2MwYTAOBgNV -HQ8BAf8EBAMCAAYwHQYDVR0OBBYEFPzgZvZaNZnrQB7SuB5DvJiOH4rDMB8GA1Ud -IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEEBQADggEBAJujCETO8pCdcfMyswVqterPKZjeVT6gFn0GekTWr9L6 -E1iM+BzHqx20G+9paJhcCDmP4Pf7SMwh57gz2wWqNCRsSuXpe2Deg7MfCr5BdfzM -MEi3wSYdBDOqtnjtKsu6VpcybvcxlS5G8hTuJ8f3Yom5XFrTOIpk9Te08bM0ctXV -IT1L13iT1zFmNR6j2EdJbxyt4YB/+JgkbHOsDsIadwKjJge3x2tdvILVKkgdY89Q -Mqb7HBhHFQpbDFw4JJoEmKgISF98NIdjqy2NTAB3lBt2uvUWGKMVry+U9ikAdsEV -F9PpN0121MtLKVkkrNpKoOpj3l9Usfrz0UXLxWS0cyE= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDrDCCApSgAwIBAgILAgAAAAAA1ni4jY0wDQYJKoZIhvcNAQEEBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAxMjgxMjAw -MDBaFw0wOTAxMjgxMjAwMDBaMG0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRswGQYDVQQLExJQcmltYXJ5IENsYXNzIDIgQ0ExJjAkBgNV -BAMTHUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAyIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAkoz+7/RFjhdBbvzYvyFvqwadUsEsAJ0/joW4f0qP -vaBjKspJJ65agvR04lWS/8LRqnmitvrVnYIET8ayxl5jpzq62O7rim+ftrsoQcAi -+05IGgaS17/Xz7nZvThPOw1EblVB/vwJ29i/844h8egStfYTpdPGTJMisAL/7h0M -xKhrT3VoVujcKBJQ96gknS4kOfsJBd7lo2RJIdBofnEwkbFg4Dn0UPh6TZgAa3x5 -uk7OSuK6Nh23xTYVlZxkQupfxLr1QAW+4TpZvYSnGbjeTVNQzgfR0lHT7w2BbObn -bctdfD98zOxPgycl/3BQ9oNZdYQGZlgs3omNAKZJ+aVDdwIDAQABo2MwYTAOBgNV -HQ8BAf8EBAMCAAYwHQYDVR0OBBYEFHznsrEs3rGna+l2DOGj/U5sx7n2MB8GA1Ud -IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEEBQADggEBAGPdWc6KeaqYnU7FiWQ3foqTZy8Q6m8nw413bfJcVpQZ -GmlgMEZdj/JtRTyONZd8L7hR4uiJvYjPJxwINFyIwWgk25GF5M/7+0ON6CUBG8QO -9wBCSIYfJAhYWoyN8mtHLGiRsWlC/Q2NySbmkoamZG6Sxc4+PH1x4yOkq8fVqKnf -gqc76IbVw08Y40TQ4NzzxWgu/qUvBYTIfkdCU2uHSv4y/14+cIy3qBXMF8L/RuzQ -7C20bhIoqflA6evUZpdTqWlVwKmqsi7N0Wn0vvi7fGnuVKbbnvtapj7+mu+UUUt1 -7tjU4ZrxAlYTiQ6nQouWi4UMG4W+Jq6rppm8IvFz30I= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDrDCCApSgAwIBAgILAgAAAAAA1ni41sMwDQYJKoZIhvcNAQEEBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAxMjgxMjAw -MDBaFw0wOTAxMjgxMjAwMDBaMG0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRswGQYDVQQLExJQcmltYXJ5IENsYXNzIDMgQ0ExJjAkBgNV -BAMTHUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAzIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAkV5WZdbAwAScv0fEXHt6MQH5WJaZ4xyEL9xWj631 -WYHVQ2ZdWpOMdcqp5xHBURAUYMks1HuvxneGq3onrm+VuQvKtkb7fhr0DRRt0slO -sq7wVPZcQEw2SHToVIxlZhCnvSu3II0FSa14fdIkI1Dj8LR5mwE5/6870y3u4UmN -jS88akFFL5vjPeES5JF1ns+gPjySgW+KLhjc4PKMjP2H2Qf0QJTJTk9D32dWb70D -UHyZZ6S5PJFsAm6E1vxG98xvGD4X8O8LZBZX5qyG8UiqQ8HJJ3hzREXihX26/7Ph -+xsFpEs7mRIlAVAUaq9d6sgM7uTa7EuLXGgTldzDtTA61wIDAQABo2MwYTAOBgNV -HQ8BAf8EBAMCAAYwHQYDVR0OBBYEFMw2zBe0RZEv7c87MEh3+7UUmb7jMB8GA1Ud -IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEEBQADggEBAFeyVMy9lRdkYIm2U5EMRZLDPahsw8yyGPV4QXTYfaMn -r3cNWT6UHWn6idMMvRoB9D/o4Hcagiha5mLXt+M2yQ6feuPC08xZiQzvFovwNnci -yqS2t8FCZwFAY8znOGSHWxSWZnstFO69SW3/d9DiTlvTgMJND8q4nYGXpzRux+Oc -SOW0qkX19mVMSPISwtKTjMIVJPMrUv/jCK64btYsEs85yxIq56l7X5g9o+HMpmOJ -XH0xdfnV1l3y0NQ9355xqA7c5CCXeOZ/U6QNUU+OOwOuow1aTcN55zVYcELJXqFe -tNkio0RTNaTQz3OAxc+fVph2+RRMd4eCydx+XTTVNnU= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU -YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 -5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR -rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 -ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o -Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj -IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X -DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw -EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE -ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy -dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD -QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 -dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK -wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 -G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF -AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P -9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p -dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv -bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa -QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY -BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u -IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl -bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu -Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs -Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI -Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD -ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh -KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIRIjCCCQoCAQAwDQYJKoZIhvcNAQEFBQAwVzEPMA0GA1UEChMGVGhhd3RlMSEw -HwYDVQQLExhUaGF3dGUgVW5pdmVyc2FsIENBIFJvb3QxITAfBgNVBAMTGFRoYXd0 -ZSBVbml2ZXJzYWwgQ0EgUm9vdDAeFw05OTEyMDUxMzU2MDVaFw0zNzA0MDMxMzU2 -MDVaMFcxDzANBgNVBAoTBlRoYXd0ZTEhMB8GA1UECxMYVGhhd3RlIFVuaXZlcnNh -bCBDQSBSb290MSEwHwYDVQQDExhUaGF3dGUgVW5pdmVyc2FsIENBIFJvb3Qwgggi -MA0GCSqGSIb3DQEBAQUAA4IIDwAwgggKAoIIAQDiiQVtw3+tpok6/7vHzZ03seHS -IR6bYSoV53tXT1U80Lv52T0+przstK1TmhYC6wty/Yryj0QFxevT5b22RDnm+0e/ -ap4KlRjiaOLWltYhrYj99Rf109pCpZDtKZWWdTrah6HU9dOH3gVipuNmdJLPpby7 -32j/cXVWQVk16zNaZlHy0qMKwYzOc1wRby2MlYyRsf3P5a1WlcyFkoOQVUHJwnft -+aN0QgpoCPPQ0WX9Zyw0/yR/53nIBzslV92kDJg9vuDMGWXb8lSir0LUneKuhCMl -CTMStWoedsSL2UkAbF66H/Ib2mfKJ6qjRCMbg4LO8qsz7VSk3MmrWWXROA7BPhtn -j9Z1AeBVIt12d+yO3fTPeSJtuVcD9ZkIpzw+NPvEF64jWM0k8yPKagIolAGBNLRs -a66LGsOj0gk8FlT1Nl8k459KoeJkxhbDpoF6JDZHjsFeDvv5FXgE1g5Z2Z1YZmLS -lCkyMsh4uWb2tVbhbMYUS5ZSWZECJGpVR9c/tiMaYHeXLuJAr54EV56tEcXJQ3Dv -SLRerBxpLi6C1VuLvoK+GRRe5w0ix1Eb/x6b8TCPcTEGszQnj196ZoJPii0Tq0LP -IVael45mNg+Wm+Ur9AKpKmqMLMTDuHAsLSkeP1B3Hm0qVORVCpE4ocW1ZqJ2Wu4P -v7Rn4ShuD+E2oYLRv9R34cRnMpN4yOdUU/4jeeZozCaQ9hBjXSpvkS2kczJRIfK7 -Fd+qJAhIBt6hnia/uoO/fKTIoIy90v+8hGknEyQYxEUYIyZeGBTKLoiHYqNT5iG3 -uIV7moW7FSZy+Ln3anQPST+SvqkFt5knv78JF0uZTK0REHzfdDH2jyZfqoiuOFfI -VS3T+9gbUZm+JRs6usB9G+3O0km5z/PFfYmQgdhpSCAQo/jvklEYMosRGMA/G4VW -zlfJ8oJkxt8CCS5KES+xJ203UvDwFmHxZ43fh3Kvh9rP+1CUbtSUheuKLOoh9ZZK -RNXgzmp0RE3QBdOHFe020KSLZlVwk+5HBsF+LqUYeWfzKIXxcPcOg6R+VJ5adjLL -ZRu4zfvIKAPSVJHRp8WFQwgXdqXmL2cI2KGigi0M+MGvY9RQd21rRkpBhdWQX3kt -xOzXEYdAiuFo4mT4VTL7b5Ms2nfZIcEX5TYsTn6Qf6yUKzJnvjhQdriuQbnXIcUJ -TGDIo1HENJtXN9/LyTNXi+v7dp8ZTcVqHypFrivtL42npQDLBPolYi50SBvKKoy6 -27Z+9rsCfKnD21h4ob/w/hoQVRHO6GlOlmXGFwPWB2iMVIKuHCJVP/H0CZcowEb3 -TgslHfcH1wkdOhhXODvoMwbnj3hGHlv1BrbsuKYN8boTS9YYIN1pM0ozFa64yJiK -JyyTvC377jO/ZuZNurabBlVgl0u8RM1+9KHYqi/AAighFmJ42whU8vz0NOPGjxxD -V86QGkvcLjsokYk/eto1HY4s7kns9DOtyVOojJ8EUz4kHFLJEvliV6O87izrQHwg -I3ArlflzF4rRwRxpprc4mmf3cB16WgxAz2IPhTzCAk5+tfbFKimEsx83KuGqckLE -7Wsaj5IcXb7R8lvyq6qp0vW4pEErK5FuEkjKmNg3jcjtADC1tgROfpzahOzA+nvl -HYikU0awlORcG6ElLA9IUneXCWzsWxgzgwLlgn7NhSEwEf0nT8/kHuw/pVds6Sow -GSqI5cNpOKtvOXF/hOFBw+HMKokgUi6DD2w5P0stFqwt8CSsAHP0m7MGPwW4FIUf -q55cPJ5inQ5tO4AJ/ALqopd0ysf541bhw8qlpprAkOAkElPSwovavu0CQ15n4YmY -ee7LqsrDG9znpUalfGsWh7ZaKNfbJzxepb22Ud0fQ887Jsg6jSVhwUn0PBvJROqv -HMIrlAEqDjDRW4srR+XD0QQDmw45LNYn1OZwWtl1zyrYyQAF5BOI7MM5+4dhMDZD -A8ienKIGwi/F/PCAY7FUBKBMqS7G9XZ62NDk1JQR5RW1eAbcuICPmakgMz0QhUxl -Cco+WF5gk5qqYl3AUQYcXWCgDZxLQ/anFiGkh6rywS7ukjC4nt/fEAGLhglw2Gyo -t1AeFpa092f9NTohkCoyxwB7TQcQCbkvc9gYfmeZBE8G/FDHhZudQJ2zljf6pdyy -ck7vTgks/ZH9Tfe7pqE+q3uiA0CmqVUn4vr5Gc6HdarxdTbz87iR+JHDi3UTjkxl -mhY5auU06HqWWX81sAD9W2n8Qyb69Shu/ofZfiT7tKCCblSi/66/YrT0cgHCy5hH -mOFMtReAgM6PpijuHkVq+9/xHfxaO9bq9GwdYklXO4qPhurwUwTOnBZo/7q5/IgP -R/cCRHJAuMo7LVOd3DxWjFl7aBosjXG7bADHGs5vQJKxoy8P2UTyo3Aunu4OrjLQ -Oz6LB+rmebNcKeJ9a6he+Vox6AiWoowDmEbxuH2QVCbtdmL+numabl7JScdcNFMp -VNns5EbhgDt12d/7edWH8bqe6xnOTFJz5luHriVPOXnMxrj5EHvs8JtxpAWg0ynT -Tn8f9C0oeMxVlXsekS/MVhhzi7LbvGkH5tDYT+2i/1iFo23gSlO3Z32NDFxbe3co -AjVEegTTKEPIazAXXTK4KTW6dto7FEp2GFik+JI8nk0zb0ZrCNkxSGjd9PskVjSy -z2lmvkjSimYizfJpzcJTE0UpQSLWXZgftqSyo8LuAi9RG9yDpOxwJajUCGEyb+Sh -gS58Y3L6KWW8cETPXQIDAQABMA0GCSqGSIb3DQEBBQUAA4IIAQBVmjRqIgZpCUUz -x66pXMcJTpuGvEGQ1JRS9s0jKZRLIs3ovf6dzVLyve2rh8mrq0YEtL2iPyIwR1DA -S4x2DwP1ktKxLcR6NZzJc4frpp/eD3ON03+Z2LqPb8Tzvhqui6KUNpDi5euNBfT8 -Zd+V8cSUTRdW1588j1A853e/lYYmZPtq/8ba6YyuQrtp5TPG2OkNxlUhScEMtKP5 -m0tc3oNPQQPOKnloOH3wVEkg9bYQ/wjcM2aWm/8G3gCe185WQ5pR/HDN9vBRo7fN -tFyFYs1xt8YrIyvdw25AQvo3/zcc9npXlIeFI9fUycdfwU0vyQ3XXOycJe6eMIKR -lnK4dR34CWhXl7ItS+4l7HokKe5y1JwT26vcAwrYShTJCFdEXaG1U4A08hSXz1Le -og6KEOkU79BgvmGh8SVd1RhzP5MQypbus0DS26NVz1dapQ5PdUff6veQmm31cC4d -FBw3ZARZULDccoZvnDc9XSivc1Xv0u4kdHQT79zbMUn7P2P10wg+M6XnnQreUyxR -jmfbm0FlQVC91KSWbIe8EuCUx9PA5MtzWACD4awnhdadU51cvQo+A0OcDJH1bXv4 -QHJ1qxF2kSvhxqofcGl2cBUJ/pPQ1i23FWqbZ1y0aZ8lpn2K+30iqXHyzk6MuCEt -3v5BcQ3/nexzprsHT4gOWEcufqnCx3jdunqeTuAwTmNvhdQgQen6/kNF5/uverLO -pAUdIppYht/kzkyp/tgWpW/72M5We/XWIO/kR81jJP+5vvFIo8EBcua9wK3tJg3K -NJ/8Ai0gTwUgriE9DMIgPD/wBITcz4n9uSWRjtBD5rMgq1wt1UCeoEvY9LLMffFY -Co6H7YisNpbkVqARivKa0LNXozS7Gas44XRrIsQxzgHVGzbjHjhMM5PfQONZV06s -bnseWj3FHVusyBCCNQIisvx16BCRjcR9eJNHnhydrGtiAliM1hwj1q94woCcpKok -VBS1FJjG+CsaJMtxMgrimw5pa91+jGTRLmPvDn+xPohMnVXlyW4XBLdB/72KQcsl -MW9Edz9HsfyBiAeOBUkgtxHZaQMqA525M4Sa399640Zzo9iijFMZiFVMdLj2RIQr -0RQtTjkukmj/afyFYhvrVU/vJYRiRZnW2E5vP1MIfR0GlYGAf09OdDaYteKHcJjc -1/XcUhXmxtZ5ljl/j5XPq4BTrRsLRUAO1Bi9LN6Kd3b98kRHxiHQ5HTw2BgFyHww -csff8bv8AjCp9EImWQ2TBYKhc+005ThdzVCQ/pT8E7y9/KiiiKdzxLKo0V2IxAKi -evEEyf6MdMnvHWRBn6welmdkrKsoQced98CYG24HwmR9WoNmVig2nOf7HHcOKKDE -92t5OQQghMdXk7wboOq860LlqBH+/KxlzP34KIj0pZrlc1HgqJsNA3dO5eCYs4ja -febGnnwUZsEuU0qSBzegfuk9CeQVfM/9uEGl755mncReBx2H+EGt6ucv0kFjGDf5 -FONN0OX3Q/0V4/k2cwYm3wFPqcNO3iBGd5i0eiQrO3UrTliNm12kxxagvDKIP6GD -8wDI+NhY6WNdTCu18HJB2Kt3N9ZydK62NpzIpoNJS+DJVgspvgAwy93WyEKKANns -FdE0cfJbZIf2J9K364awkL8p2yGeNozjIC+VI1FsG8Kk1ebYAkNnoP6bUANEf7vk -ctXR5NqPkhRk+10UEBJKlQbJZQgpyiGjJjgRySffcGcE/cpIMn9jskV0MVBPh9kg -cNIhcLHWEJ0zXXiDkW1Vguza5GJjx4FG1xllcipDGZC41yNNTBzgRKlmZ6zucXkn -Jnhtcg71XUsjtXx8ZekXxjoLDd1eHlHDhrjsf8cnSqVG6GotGcGHo8uZk4dkolUU -TLdDpZPX59JOeUDKZZlGPT96gHqIaswe5WszRvRQwNUfCbjNii6hJ+tdc6foawrl -V4IqsPziVFJW8KupEsYjlgcknOC8RqW0IATaCZNj5dQuwn7FMe21FXSGF7mz8yaK -HQJq2ho/6LrxBG2UUVTiWrRZgx1g0C1zzAe1Joz518aIke+Az10PoWDLRdRCItGx -cB390LcwkDrGSG1n5TLaj9vjqOMdICWiHOFMuaT2xj9cWA27xrJ3ARaRnxcGDbdA -PsyPjpxL4J1+mx4Fq4gi+tMoG1cUZEo+JCw4TSFpAHMu0FUtdPIV6JRDPkAqxsa5 -alveoswYUFRdTiqFbPaSiykZfufqSuAiKyW892bPd5pBdPI8FA10afVQg83NLyHb -IkaK0PdRGpVX8gWLGhntO0XoNsJufvtXIgAfBlOprpPGj3EqMUWS545t5pkiwIP8 -79xXZndPojYx+6ETjeXKo5V9AQxkcDtTQmiAx7udqAA1aZgMqGfYQ+Wqz5XgUZWk -Fz9CnbgEztN5ecjTihYykuDXou7XN0wvrLh7vkX28RgznHs3piTZvECrAOnDN4ur -2LbzXoFOsBRrBz4f7ML2RCKVu7Pmb9b5cGW6CoNlqg4TL4MTI1OLQBb6zi/8TQT4 -69isxTbCFVdIOOxVs7Qeuq3SQgYXDXPIV6a+lk2p8sD7eiEc9clwqYKQtfEM1HkQ -voGm6VxhnHd5mqTDNyZXN8lSLPoI/9BfxmHA9Ha+/N5Oz6tRmXHH33701s8GVhkT -UwttdFlIGZtTBS2dMlTT5SxTi2Q+1GR744AJFMz+FkZja3Fp+PnLJ/aIVLxFs84C -yJTuQFv5QgLC/7DYLOsof17JJgGZpw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 -NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD -VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N -H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR -4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN -BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo -EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 -FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx -lA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 -MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV -BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy -dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ -ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII -0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI -uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI -hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 -YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc -1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICjTCCAXWgAwIBAgIDAQAhMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA3MTIxNjMxNTNaFw0xMjA3MTIxNjMxNTNaMEMxCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xFzAVBgNVBAMTDkNlcnR1bSBM -ZXZlbCBJMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCl73pZ9DFcn7Qy0qBZ -K+So18cav7drUrJ8SiYOlDDVskt81+eIcL/4FelTSGjuAOvYdmm+HGYG998RPB0i -Z+Ak67vXFJ537vRWOcu6aMjNuAwu8BOdc5eSgB0Y8X4+3LOYfugtaZa8mrEQ8Hit -0yLE9UBcU9J+4PmkVGecmZ8jZQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAlDS4aTmgK0YgmUvt/3zN7G2/ZrtBBCtONlUvC69c7 -TmLJWJ842y2AH7ryNXXkcsn6p0ZBTrTJ2tA2y/j2PXJeXrCkK/qAJIpM0l4u0MT7 -enY5akasduHp2NXMP9vDlgMy7elU2s3nkOT79gfh5XttC+5D/x4JDNi1DMAA9hk1 -6DK4zWmDVfjkiP/G3fEndtJgNDQsyqnaQ3E3bljv3f1KJTjZUvtA2Ml6MP2hFRhg -ZPsxuhW8QXidQYNiua1h7XUUiPiERLDLWZmfY6dxGrHXjSTx3shHNaQM0qkDs9gS -6UK8uWJN2bf2YBnvGmzy0IQvx5wDCH7h8AdaBD6DgIG1 ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICjjCCAXagAwIBAgIDAQAiMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA3MTIxNjMyMDNaFw0xMjA3MTIxNjMyMDNaMEQxCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xGDAWBgNVBAMTD0NlcnR1bSBM -ZXZlbCBJSTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyMQSaN5fA94hNE46 -bMKpGUb5yIPEowReGZzGttYBQnC6oUOy+iM3md8WerzXeBKf7iIZEDW2HAp7BKhS -4rMB6taxT07vDtkNfEKwOk6X7dODw6KY4mxnzjmjh5pf2feKKJ3MoZxi2HAz2a6J -vHKFMq8dAlGL2GBtLvzlFp2jwkMCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQUFAAOCAQEAWo3wgy+/0B7UiTCu4Wn1rvGRXIUtbPNp4Bc4PP/i -1q6pPheIe0ooCopuqnDX9maTHhZeNpnApgCUSbyw71EaOremD7HjWXASRUTylhwL -5FdSx+D6MgF2uW9uwZ+NErkeRJYT2aRXe5FBOVIseC4g93Ay0D8Hg50MkAC5pQqW -+8GSszT94NzT7ppIaMtq53PZpUtLGiL3UBZ5vUJ5pE4lLKD7Ce+pXzZevy/MnkMG -D1L7LgjRWL17OcMlASFETyUTajNjvxMy+oM4C22rwHRh2WQrvgw5MO+Q3UyYA1r5 -VrSaqgQ1g06ZcQt+mhzoc2swlOSwm8iis8H6orR8xmCWrA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICjzCCAXegAwIBAgIDAQAjMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA3MTIxNjMyMTdaFw0xMjA3MTIxNjMyMTdaMEUxCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xGTAXBgNVBAMTEENlcnR1bSBM -ZXZlbCBJSUkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALZjBbfGFmlsLjPe -pWaDwG0LqhF11lWKabaHi1sQhK3qomHY7Em7qpL11dUQ1vsMcnnpzz/J0AEH6KDh -+yAyXV1SE/tVToLYYByZK+JGacLYIYF9aCwV8AhqyzOGurO5QX6vLboXB2WNnwmX -hyNVKUgnUVy4ktAR2qZJIw5Bjsn/AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAIsLt3vKCZqd/gui45ovm3FSO6FLjzzq4pagPvbN -nZ39HrhRaCpqkHDAj71L5L27U3eW2D4ILL0iUmZadbC4i3at/PUL9mjhGlajcCN8 -EF6IXGT87Tbcii735jRaaXSbEY4YhNOg9DPBoD4uJMkA8Z0Y/6lYmk4S6KUMCzzt -t5zZBiWjdd08yFi5VGMvpE74KVOMdMa3JNVaR0XvT0Q8yXo1XKCrY9OFIxnhVgDb -hzr9fwjKWDwu8kxhT9khAETm0BU2Buu+CTasaJdT/bBR2YEx9qcN7XyXTeDtkOO5 -QeGSqFgzquwjWEbKhf7l/e+efdRCg+ikH3O5snHB6iS+dgg= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICjjCCAXagAwIBAgIDAQAkMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA3MTIxNjMyMzVaFw0xMjA3MTIxNjMyMzVaMEQxCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xGDAWBgNVBAMTD0NlcnR1bSBM -ZXZlbCBJVjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmyb1lKqCAKE4juAy -6lpVNUl6aJ2DuWPSiJ3BBk3/6ty6I4Lr2Dpy1b1vjVelhaFsVKEDgK2JyQlk9XMq -LPZI2Ql166mJiPKFg77aY/W78EcQfGyjnRvVcs0tG40mAs/p84OEpFcVe/RSqDrD -/D7R01u+Wj5xLl0PUsFplIGDbikCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQUFAAOCAQEAPS99JujKGVRfa50TKfieq+uK1SxjidErYaZTb3cJ -NNfQDYn6nk4lnrnab5EUVhO/NegP2yIu3YOnZGfxFDhvVozMTKKAB5r5XKOvzsP9 -9C9578PVMLozucfUMCSwau7Z4l5uuQOHuzjzlVLCibbbf4RwfvZ7hh5sB5c0pNbw -RQq64RXQUUEvul/W9gUeT9ISHOsASGTq+HJ5i7vNARjukEAXW/maqs9vyTWWbGVI -1FSOnVyteymq4Xk+9YlIyNPNyacgnsMnU72XKBLDS0KJdhIWALFAZI4dSh5WZNuW -ZguUnEmeH81lLbR+p/N3iuN8+oSo8UXik92jxeUY2tQJUA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y -AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw -TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 -/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ -jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms -Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF -Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw -Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW -w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE -Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD -2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIG2jCCBcKgAwIBAgIDFc/9MA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJE -RTEhMB8GA1UEChMYRGV1dHNjaGVzIEZvcnNjaHVuZ3NuZXR6MRYwFAYDVQQLEw1E -Rk4tQ0VSVCBHbWJIMRAwDgYDVQQLEwdERk4tUENBMS0wKwYDVQQDEyRERk4gVG9w -bGV2ZWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEmNl -cnRpZnlAcGNhLmRmbi5kZTAeFw0wMTEyMDExMjExMTZaFw0xMDAxMzExMjExMTZa -MIGsMQswCQYDVQQGEwJERTEhMB8GA1UEChMYRGV1dHNjaGVzIEZvcnNjaHVuZ3Nu -ZXR6MRYwFAYDVQQLEw1ERk4tQ0VSVCBHbWJIMRAwDgYDVQQLEwdERk4tUENBMS0w -KwYDVQQDEyRERk4gVG9wbGV2ZWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAf -BgkqhkiG9w0BCQEWEmNlcnRpZnlAcGNhLmRmbi5kZTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMF5rhMt6zmhxK5oWPwT2FG7Up7T5DovHSD/YKPIRxsv -DWmC4dTzByIBLnOmEflk+5KAqAYao6eY1qF0hR4WiS4DjCsn7l3zNo/4i2eF4EmG -EksBygb4tRlTThcO7heFX+Du5qFoks+ONqa70RlwOr2l53KVwjMXBCtCLFSKRLVu -xeh5+Smkm+FuOmwEugndM2n74Djjyf9DCOaHGZrHwVDh+Vpy5Ny4bKCSboujRxd5 -NxsStUshDVbTeS3B8TuzAJbywYWEE7erox+7WTfQr8ivSCBhrNJ36VRjAb8hiV9I -uy2TmJYo2oPyC8a3eM3xj9Ku2IW3tS2zpfiIzt9xvFMCAwEAAaOCAwEwggL9MA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAYL+rX4SHijILELPs+g0MTRf33QMIHb -BgNVHSMEgdMwgdCAFAYL+rX4SHijILELPs+g0MTRf33QoYGypIGvMIGsMQswCQYD -VQQGEwJERTEhMB8GA1UEChMYRGV1dHNjaGVzIEZvcnNjaHVuZ3NuZXR6MRYwFAYD -VQQLEw1ERk4tQ0VSVCBHbWJIMRAwDgYDVQQLEwdERk4tUENBMS0wKwYDVQQDEyRE -Rk4gVG9wbGV2ZWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0B -CQEWEmNlcnRpZnlAcGNhLmRmbi5kZYIDFc/9MAsGA1UdDwQEAwIBBjARBglghkgB -hvhCAQEEBAMCAAcwgaUGA1UdHwSBnTCBmjBLoEmgR4ZFaHR0cDovL3d3dy5kZm4t -cGNhLmRlL2NlcnRpZmljYXRpb24veDUwOS9nMS9kYXRhL2NybHMvcm9vdC1jYS1j -cmwuY3J4MEugSaBHhkVodHRwOi8vd3d3LmRmbi1wY2EuZGUvY2VydGlmaWNhdGlv -bi94NTA5L2cxL2RhdGEvY3Jscy9yb290LWNhLWNybC5jcmwwOAYJYIZIAYb4QgED -BCsWKWh0dHBzOi8vd3d3LmRmbi1wY2EuZGUvY2dpL2NoZWNrLXJldi5jZ2k/MEsG -CWCGSAGG+EIBCAQ+FjxodHRwOi8vd3d3LmRmbi1wY2EuZGUvY2VydGlmaWNhdGlv -bi9wb2xpY2llcy94NTA5cG9saWN5Lmh0bWwwOAYJYIZIAYb4QgENBCsWKVRoZSBE -Rk4gVG9wLUxldmVsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MGQGA1UdIARdMFsw -WQYLKwYBBAHZGoIsAQEwSjBIBggrBgEFBQcCARY8aHR0cDovL3d3dy5kZm4tcGNh -LmRlL2NlcnRpZmljYXRpb24vcG9saWNpZXMveDUwOXBvbGljeS5odG1sMA0GCSqG -SIb3DQEBBQUAA4IBAQAmbai6JMt7nkuavyvxKzLGn04Gyt0zKrp8zmERp4inktvY -7p+vkaomYu2QYC7cHq0tlrPXQQhhetjiXGb+36aJtHDkEA0NwrJzYnHgPsvx7z0w -ysENP4wxf97KsSWm07RY+f6/gIQF7Je7CW30Rzq7N6R0NMBs32mJgdn3ntqlFNw3 -Nbs050FEjPNq54RdawlJo85x+w+QJd7uQM4yZjHpRhvwgte9Ge1UqCUdpMsLHzeM -KJ0B9GhwIIqOJCMiPgKjcUBrn6ehSX70POvXvjjE2+FzhPGTyTkS474d2UCAnL9q -hPrdWXzBjOumOjhJutT1aecm9eljlshmh1cNen00 ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB -ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt -TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 -NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD -VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS -Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 -N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH -iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe -YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 -axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g -yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh -ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V -VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB -BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs -QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 -ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM -YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb -QErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx -MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG -29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk -oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk -3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL -qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN -nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX -ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H -DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO -TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w -zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB -lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt -T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc -BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 -dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP -HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO -KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo -5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ -pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb -kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC -AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov -L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV -HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN -AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB -mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU -4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 -81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR -Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICiTCCAfKgAwIBAgIEN4dnrDANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJi -ZTERMA8GA1UEChMIQmVsZ2Fjb20xDDAKBgNVBAsTA01UTTEkMCIGA1UEAxMbQmVs -Z2Fjb20gRS1UcnVzdCBQcmltYXJ5IENBMR8wHQYKCZImiZPyLGQBAxQPaW5mb0Bl -LXRydXN0LmJlMB4XDTk4MTEwNDEzMDQzOVoXDTEwMDEyMTEzMDQzOVowdTELMAkG -A1UEBhMCYmUxETAPBgNVBAoTCEJlbGdhY29tMQwwCgYDVQQLEwNNVE0xJDAiBgNV -BAMTG0JlbGdhY29tIEUtVHJ1c3QgUHJpbWFyeSBDQTEfMB0GCgmSJomT8ixkAQMU -D2luZm9AZS10cnVzdC5iZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqtm5 -s9VPak3FQdB7BGFqi3GBB9pk41huJ1XCrc4XsPz6ko0I8Bxy/7LDMf7gaoeXTMxD -V6coeTq1g12kHWrxasU+FCIdWQZv8KYxd9ywSTjmywwP/qpyNIjaKDohWu50Kxuk -21sTFrVzX8OujNLAPj2wy/Dsi4YLwsFEGFpjqNUCAwEAAaMmMCQwDwYDVR0TBAgw -BgEB/wIBATARBglghkgBhvhCAQEEBAMCAAcwDQYJKoZIhvcNAQEFBQADgYEAerKx -pbF9M+nC4RvO05OMfwH9Gx1amq6rB1Ev7Ymr3VBCux//SrWknLFhKQpM6oNZSY2v -hmnXgaxHqqRxblnvynxqblSK2qiSyfVms3lf1IsBniFjRjWTpcJfImIDcB1jI+hr -SB0jECfY9t9HorrsgFBKbMRwpnrkdCJ/9oRiMn8= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE -SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw -ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU -REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr -2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s -2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU -GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj -dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r -TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB -AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv -c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl -ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu -MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud -HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD -VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny -bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ -J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG -SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom -JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO -inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y -caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB -mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ -YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 -BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD -EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz -aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w -MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l -dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh -bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq -eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe -r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 -3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd -vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC -wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg -hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 -TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg -ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg -dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 -b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl -c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 -ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 -dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu -ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo -ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 -Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA -A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ -MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ -NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR -VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY -83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 -macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri index 72ea80f..8b2e2c1 100644 --- a/src/network/ssl/ssl.pri +++ b/src/network/ssl/ssl.pri @@ -31,9 +31,6 @@ symbian { ssl/qsslsocket_openssl.cpp \ ssl/qsslsocket_openssl_symbols.cpp - # Include Qt's default CA bundle - RESOURCES += network.qrc - # Add optional SSL libs LIBS_PRIVATE += $$OPENSSL_LIBS } diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index a9cb65b..6ba9504 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -70,9 +70,10 @@ #include <net/if.h> #include <ifaddrs.h> -@interface QNSListener : NSObject + +@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject { - NSNotificationCenter *center; + NSNotificationCenter *notificationCenter; CWInterface *currentInterface; QCoreWlanEngine *engine; NSLock *locker; @@ -86,16 +87,16 @@ @end -@implementation QNSListener +@implementation QT_MANGLE_NAMESPACE(QNSListener) @synthesize engine; - (id) init { [locker lock]; QMacCocoaAutoReleasePool pool; - center = [NSNotificationCenter defaultCenter]; + notificationCenter = [NSNotificationCenter defaultCenter]; currentInterface = [CWInterface interfaceWithName:nil]; - [center addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil]; [locker unlock]; return self; } @@ -116,7 +117,7 @@ -(void)remove { [locker lock]; - [center removeObserver:self]; + [notificationCenter removeObserver:self]; [locker unlock]; } @@ -126,7 +127,7 @@ } @end -QNSListener *listener = 0; +QT_MANGLE_NAMESPACE(QNSListener) *listener = 0; QT_BEGIN_NAMESPACE @@ -296,6 +297,9 @@ void QScanThread::getUserConfigurations() for(uint row=0; row < [wifiInterfaces count]; row++ ) { CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]]; + if ( ![wifiInterface power] ) + continue; + NSString *nsInterfaceName = [wifiInterface name]; // add user configured system networks SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil); @@ -430,7 +434,7 @@ void QCoreWlanEngine::initialize() QMacCocoaAutoReleasePool pool; if([[CWInterface supportedInterfaces] count] > 0 && !listener) { - listener = [[QNSListener alloc] init]; + listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init]; listener.engine = this; hasWifi = true; } else { @@ -785,6 +789,11 @@ void QCoreWlanEngine::networksChanged() changed = true; } + if (ptr->bearer != cpPriv->bearer) { + ptr->bearer = cpPriv->bearer; + changed = true; + } + if (ptr->state != cpPriv->state) { ptr->state = cpPriv->state; changed = true; diff --git a/src/plugins/bearer/symbian/3_1/3_1.pro b/src/plugins/bearer/symbian/3_1/3_1.pro new file mode 100644 index 0000000..2d721a8 --- /dev/null +++ b/src/plugins/bearer/symbian/3_1/3_1.pro @@ -0,0 +1,5 @@ +include(../symbian.pri) + +LIBS += -lapengine +TARGET = $${TARGET}_3_1 +TARGET.UID3 = 0x2002131C diff --git a/src/plugins/bearer/symbian/3_2/3_2.pro b/src/plugins/bearer/symbian/3_2/3_2.pro new file mode 100644 index 0000000..3404dde --- /dev/null +++ b/src/plugins/bearer/symbian/3_2/3_2.pro @@ -0,0 +1,13 @@ +include(../symbian.pri) + +exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ +exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { + DEFINES += SNAP_FUNCTIONALITY_AVAILABLE + LIBS += -lcmmanager +} else { + # Fall back to 3_1 implementation on platforms that do not have cmmanager + LIBS += -lapengine +} + +TARGET = $${TARGET}_3_2 +TARGET.UID3 = 0x2002131D diff --git a/src/plugins/bearer/symbian/symbian.pri b/src/plugins/bearer/symbian/symbian.pri new file mode 100644 index 0000000..afe84dc --- /dev/null +++ b/src/plugins/bearer/symbian/symbian.pri @@ -0,0 +1,28 @@ +TARGET = qsymbianbearer +include(../../qpluginbase.pri) + +QT += network + +HEADERS += ../symbianengine.h \ + ../qnetworksession_impl.h + +SOURCES += ../symbianengine.cpp \ + ../qnetworksession_impl.cpp \ + ../main.cpp + +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE +symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private + +LIBS += -lcommdb \ + -lapsettingshandlerui \ + -lconnmon \ + -lcentralrepository \ + -lesock \ + -linsock \ + -lecom \ + -lefsrv \ + -lnetmeta + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer +target.path += $$[QT_INSTALL_PLUGINS]/bearer +INSTALLS += target diff --git a/src/plugins/bearer/symbian/symbian.pro b/src/plugins/bearer/symbian/symbian.pro index 4f1e51c..f320eb6 100644 --- a/src/plugins/bearer/symbian/symbian.pro +++ b/src/plugins/bearer/symbian/symbian.pro @@ -1,41 +1,3 @@ -TARGET = qsymbianbearer -include(../../qpluginbase.pri) +TEMPLATE = subdirs -QT += network - -HEADERS += symbianengine.h \ - qnetworksession_impl.h - -SOURCES += symbianengine.cpp \ - qnetworksession_impl.cpp \ - main.cpp - -symbian { - TARGET.UID3=0x20021319 - exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ - exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { - message("Building with SNAP support") - DEFINES += SNAP_FUNCTIONALITY_AVAILABLE - LIBS += -lcmmanager - } else { - message("Building without SNAP support") - LIBS += -lapengine - } -} - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private - -LIBS += -lcommdb \ - -lapsettingshandlerui \ - -lconnmon \ - -lcentralrepository \ - -lesock \ - -linsock \ - -lecom \ - -lefsrv \ - -lnetmeta - -QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer -target.path += $$[QT_INSTALL_PLUGINS]/bearer -INSTALLS += target +SUBDIRS += 3_1 3_2 symbian_3
\ No newline at end of file diff --git a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro new file mode 100644 index 0000000..f9d486e --- /dev/null +++ b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro @@ -0,0 +1,16 @@ +include(../symbian.pri) + +exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ +exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { + DEFINES += SNAP_FUNCTIONALITY_AVAILABLE + LIBS += -lcmmanager + + exists($$MW_LAYER_PUBLIC_EXPORT_PATH(extendedconnpref.h)) { + DEFINES += OCC_FUNCTIONALITY_AVAILABLE + } +} else { + # Fall back to 3_1 implementation on platforms that do not have cmmanager + LIBS += -lapengine +} + +TARGET.UID3 = 0x20021319 diff --git a/src/plugins/imageformats/gif/qgifhandler.cpp b/src/plugins/imageformats/gif/qgifhandler.cpp index 8abc2d1..591e40b 100644 --- a/src/plugins/imageformats/gif/qgifhandler.cpp +++ b/src/plugins/imageformats/gif/qgifhandler.cpp @@ -1026,7 +1026,7 @@ inline QRgb QGIFFormat::color(uchar index) const QGifHandler::QGifHandler() { gifFormat = new QGIFFormat; - nextDelay = 0; + nextDelay = 100; loopCnt = 1; frameNumber = -1; scanIsCached = false; @@ -1061,12 +1061,12 @@ bool QGifHandler::imageIsComing() const bool QGifHandler::canRead() const { - if (!nextDelay && canRead(device())) { + if (canRead(device()) || imageIsComing()) { setFormat("gif"); return true; } - return imageIsComing(); + return false; } bool QGifHandler::canRead(QIODevice *device) diff --git a/src/plugins/imageformats/jpeg/jpeg.pro b/src/plugins/imageformats/jpeg/jpeg.pro index 5b45422..0b5d389 100644 --- a/src/plugins/imageformats/jpeg/jpeg.pro +++ b/src/plugins/imageformats/jpeg/jpeg.pro @@ -22,10 +22,9 @@ symbian: { } contains(QT_CONFIG, system-jpeg) { - unix:LIBS += -ljpeg - win32:LIBS += libjpeg.lib -} -!contains(QT_CONFIG, system-jpeg) { + unix|win32-g++*:LIBS += -ljpeg + win32:!win32-g++*:LIBS += libjpeg.lib +} else { INCLUDEPATH += ../../../3rdparty/libjpeg SOURCES += \ ../../../3rdparty/libjpeg/jaricom.c \ diff --git a/src/plugins/imageformats/jpeg/qjpeghandler.cpp b/src/plugins/imageformats/jpeg/qjpeghandler.cpp index 72dde15..60e7cce 100644 --- a/src/plugins/imageformats/jpeg/qjpeghandler.cpp +++ b/src/plugins/imageformats/jpeg/qjpeghandler.cpp @@ -802,13 +802,15 @@ QJpegHandler::~QJpegHandler() bool QJpegHandler::canRead() const { - if(d->state == QJpegHandlerPrivate::Ready) { - if (!canRead(device())) - return false; + if(d->state == QJpegHandlerPrivate::Ready && !canRead(device())) + return false; + + if (d->state != QJpegHandlerPrivate::Error) { setFormat("jpeg"); return true; } - return d->state != QJpegHandlerPrivate::Error; + + return false; } bool QJpegHandler::canRead(QIODevice *device) diff --git a/src/plugins/imageformats/mng/mng.pro b/src/plugins/imageformats/mng/mng.pro index de7dfa7..c188b47 100644 --- a/src/plugins/imageformats/mng/mng.pro +++ b/src/plugins/imageformats/mng/mng.pro @@ -14,10 +14,9 @@ symbian: { } contains(QT_CONFIG, system-mng) { - unix:LIBS += -lmng - win32:LIBS += libmng.lib -} -!contains(QT_CONFIG, system-mng) { + unix|win32-g++*:LIBS += -lmng + win32:!win32-g++*:LIBS += libmng.lib +} else { DEFINES += MNG_BUILD_SO DEFINES += MNG_NO_INCLUDE_JNG INCLUDEPATH += ../../../3rdparty/libmng @@ -44,10 +43,11 @@ contains(QT_CONFIG, system-mng) { } contains(QT_CONFIG, system-zlib) { - LIBS += -lz -} -!contains(QT_CONFIG, system-zlib) { - INCLUDEPATH += ../../../3rdparty/zlib + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib +} else { + INCLUDEPATH += ../../../3rdparty/zlib } QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats diff --git a/src/plugins/imageformats/mng/qmnghandler.cpp b/src/plugins/imageformats/mng/qmnghandler.cpp index d408e6c..ec442a1 100644 --- a/src/plugins/imageformats/mng/qmnghandler.cpp +++ b/src/plugins/imageformats/mng/qmnghandler.cpp @@ -271,7 +271,6 @@ bool QMngHandlerPrivate::getNextImage(QImage *result) } if ((MNG_NOERROR == ret) || (MNG_NEEDTIMERWAIT == ret)) { *result = image; - image.fill(0); frameIndex = nextIndex++; if (haveReadAll && (frameCount == 0)) frameCount = nextIndex; @@ -381,10 +380,10 @@ QMngHandler::~QMngHandler() bool QMngHandler::canRead() const { Q_D(const QMngHandler); - if (!d->haveReadNone) - return (!d->haveReadAll || (d->haveReadAll && (d->nextIndex < d->frameCount))); - - if (canRead(device())) { + if ((!d->haveReadNone + && (!d->haveReadAll || (d->haveReadAll && (d->nextIndex < d->frameCount)))) + || canRead(device())) + { setFormat("mng"); return true; } diff --git a/src/plugins/imageformats/tiff/tiff.pro b/src/plugins/imageformats/tiff/tiff.pro index 3cb64ad..90868e8 100644 --- a/src/plugins/imageformats/tiff/tiff.pro +++ b/src/plugins/imageformats/tiff/tiff.pro @@ -8,10 +8,14 @@ SOURCES += main.cpp \ qtiffhandler.cpp contains(QT_CONFIG, system-tiff) { - unix:LIBS += -ltiff - win32:LIBS += libtiff.lib -} -!contains(QT_CONFIG, system-tiff) { + unix|win32-g++*:LIBS += -ltiff + win32:!win32-g++*:LIBS += libtiff.lib + + contains(QT_CONFIG, system-jpeg) { + unix|win32-g++*:LIBS += -ljpeg + win32:!win32-g++*:LIBS += libjpeg.lib + } +} else { INCLUDEPATH += ../../../3rdparty/libtiff/libtiff SOURCES += \ ../../../3rdparty/libtiff/libtiff/tif_aux.c \ @@ -64,10 +68,11 @@ contains(QT_CONFIG, system-tiff) { } contains(QT_CONFIG, system-zlib) { - LIBS += -lz -} -!contains(QT_CONFIG, system-zlib) { - INCLUDEPATH += ../../../3rdparty/zlib + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib +} else { + INCLUDEPATH += ../../../3rdparty/zlib } QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats diff --git a/src/plugins/sqldrivers/psql/psql.pro b/src/plugins/sqldrivers/psql/psql.pro index 0a38ee4..80a5348 100644 --- a/src/plugins/sqldrivers/psql/psql.pro +++ b/src/plugins/sqldrivers/psql/psql.pro @@ -4,7 +4,7 @@ HEADERS = ../../../sql/drivers/psql/qsql_psql.h SOURCES = main.cpp \ ../../../sql/drivers/psql/qsql_psql.cpp -unix|win32-g++: { +unix|win32-g++*: { !isEmpty(QT_LFLAGS_PSQL) { !contains(QT_CONFIG, system-zlib): QT_LFLAGS_PSQL -= -lz !static:LIBS *= $$QT_LFLAGS_PSQL @@ -13,6 +13,6 @@ unix|win32-g++: { !contains(LIBS, .*pq.*):LIBS *= -lpq } -win32:!win32-g++:!contains(LIBS, .*pq.* ) LIBS *= -llibpq -lws2_32 -ladvapi32 +win32:!win32-g++*:!contains(LIBS, .*pq.* ) LIBS *= -llibpq -lws2_32 -ladvapi32 include(../qsqldriverbase.pri) diff --git a/src/qbase.pri b/src/qbase.pri index 83ae069..064e67c 100644 --- a/src/qbase.pri +++ b/src/qbase.pri @@ -85,7 +85,6 @@ win32-borland { } win32 { - CONFIG += zlib INCLUDEPATH += tmp !static: DEFINES+=QT_MAKEDLL } diff --git a/src/s60installs/qsymbianbearer.qtplugin b/src/s60installs/qsymbianbearer.qtplugin new file mode 100644 index 0000000..5c45bdd --- /dev/null +++ b/src/s60installs/qsymbianbearer.qtplugin @@ -0,0 +1 @@ +This file is a Qt plugin stub file. The real Qt plugin is located in /sys/bin. Created:2010-06-02T14:02:21 diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index d751134..6d8513e 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -16,8 +16,8 @@ symbian: { # It is also expected that devices newer than those based on S60 5.0 all have sqlite3.dll. contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) { BLD_INF_RULES.prj_exports += \ - "sqlite3.sis $${EPOCROOT}epoc32/data/qt/sis/sqlite3.sis" \ - "sqlite3_selfsigned.sis $${EPOCROOT}epoc32/data/qt/sis/sqlite3_selfsigned.sis" + "sqlite3.sis /epoc32/data/qt/sis/sqlite3.sis" \ + "sqlite3_selfsigned.sis /epoc32/data/qt/sis/sqlite3_selfsigned.sis" symbian-abld|symbian-sbsv2 { sqlitedeployment = \ "; Deploy sqlite onto phone that does not have it already" \ @@ -54,20 +54,35 @@ symbian: { symbian-abld|symbian-sbsv2 { pluginLocations = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET) + bearerPluginLocation = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET) + bearerStubZ = $${EPOCROOT}$${HW_ZDIR}$${QT_PLUGINS_BASE_DIR}/bearer/qsymbianbearer$${QT_LIBINFIX}.qtplugin + BLD_INF_RULES.prj_exports += \ + "qsymbianbearer.qtplugin $$bearerStubZ" \ + "qsymbianbearer.qtplugin $${EPOCROOT}epoc32/winscw/c$${QT_PLUGINS_BASE_DIR}/bearer/qsymbianbearer$${QT_LIBINFIX}.qtplugin" } else { pluginLocations = $$QT_BUILD_TREE/plugins/s60 + bearerPluginLocation = $$QT_BUILD_TREE/plugins/bearer + bearerStubZ = $${PWD}/qsymbianbearer.qtplugin } qts60plugindeployment = \ - "IF package(0x1028315F)" \ + "IF package(0x20022E6D)" \ " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ + "ELSEIF package(0x1028315F)" \ + " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102752AE)" \ " \"$$pluginLocations/qts60plugin_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_2$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102032BE)" \ " \"$$pluginLocations/qts60plugin_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_1$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSE" \ " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ - "ENDIF" + " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ + "ENDIF" \ + " \"$$bearerStubZ\" - \"c:$$replace(QT_PLUGINS_BASE_DIR,/,\\)\\bearer\\qsymbianbearer$${QT_LIBINFIX}.qtplugin\" qtlibraries.pkg_postrules += qts60plugindeployment @@ -118,15 +133,11 @@ symbian: { qtbackup.sources = backup_registration.xml qtbackup.path = c:/private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) - bearer_plugins.path = c:$$QT_PLUGINS_BASE_DIR/bearer - bearer_plugins.sources += $$QT_BUILD_TREE/plugins/bearer/qsymbianbearer$${QT_LIBINFIX}.dll - DEPLOYMENT += qtlibraries \ qtbackup \ imageformats_plugins \ codecs_plugins \ - graphicssystems_plugins \ - bearer_plugins + graphicssystems_plugins contains(QT_CONFIG, svg): { qtlibraries.sources += $$QMAKE_LIBDIR_QT/QtSvg$${QT_LIBINFIX}.dll diff --git a/src/sql/drivers/drivers.pri b/src/sql/drivers/drivers.pri index 8dfc50f..05e7265 100644 --- a/src/sql/drivers/drivers.pri +++ b/src/sql/drivers/drivers.pri @@ -6,16 +6,14 @@ contains(sql-drivers, psql) { HEADERS += drivers/psql/qsql_psql.h SOURCES += drivers/psql/qsql_psql.cpp - unix|win32-g++ { + unix|win32-g++* { !static:!isEmpty(QT_LFLAGS_PSQL) { !contains(QT_CONFIG, system-zlib): QT_LFLAGS_PSQL -= -lz !static:LIBS *= $$QT_LFLAGS_PSQL QMAKE_CXXFLAGS *= $$QT_CFLAGS_PSQL } !contains(LIBS, .*pq.*):LIBS *= -lpq - } - - win32:!win32-g++:!contains(LIBS, .*pq.* ) LIBS *= -llibpq -lws2_32 -ladvapi32 + } else:win32:!contains(LIBS, .*pq.* ) LIBS *= -llibpq -lws2_32 -ladvapi32 } contains(sql-drivers, mysql) { @@ -35,8 +33,8 @@ contains(sql-drivers, mysql) { } win32:!contains(LIBS, .*mysql.*):!contains(LIBS, .*mysqld.*) { - !win32-g++:LIBS *= -llibmysql - win32-g++:LIBS *= -lmysql + !win32-g++*:LIBS *= -llibmysql + else:LIBS *= -lmysql } } @@ -49,8 +47,8 @@ contains(sql-drivers, odbc) { unix:DEFINES += UNICODE win32 { - !win32-borland:LIBS *= -lodbc32 - win32-borland:LIBS *= $(BCB)/lib/PSDK/odbc32.lib + !win32-borland:LIBS *= -lodbc32 + else:LIBS *= $(BCB)/lib/PSDK/odbc32.lib } } @@ -71,7 +69,7 @@ contains(sql-drivers, tds) { win32 { !win32-borland:LIBS += -lNTWDBLIB - win32-borland:LIBS += $(BCB)/lib/PSDK/NTWDBLIB.LIB + else:LIBS += $(BCB)/lib/PSDK/NTWDBLIB.LIB } } @@ -83,7 +81,7 @@ contains(sql-drivers, db2) { win32 { !win32-borland:LIBS += -ldb2cli -# win32-borland:LIBS += $(BCB)/lib/PSDK/db2cli.lib +# else:LIBS += $(BCB)/lib/PSDK/db2cli.lib } } @@ -95,7 +93,7 @@ contains(sql-drivers, ibase) { win32 { !win32-borland:LIBS *= -lgds32_ms - win32-borland:LIBS += gds32.lib + else:LIBS += gds32.lib } } diff --git a/src/svg/svg.pro b/src/svg/svg.pro index d2a4227..de4bba6 100644 --- a/src/svg/svg.pro +++ b/src/svg/svg.pro @@ -44,7 +44,9 @@ symbian:TARGET.UID3=0x2001B2E2 #zlib support contains(QT_CONFIG, zlib) { - INCLUDEPATH += ../3rdparty/zlib + INCLUDEPATH += ../3rdparty/zlib } else:!contains(QT_CONFIG, no-zlib) { - unix:LIBS_PRIVATE += -lz + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib } diff --git a/src/tools/bootstrap/bootstrap.pri b/src/tools/bootstrap/bootstrap.pri index 1de7b18..1aa8121 100644 --- a/src/tools/bootstrap/bootstrap.pri +++ b/src/tools/bootstrap/bootstrap.pri @@ -52,8 +52,9 @@ hpux-acc*|hpuxi-acc* { LIBS += -lbootstrap } !contains(QT_CONFIG, zlib):!contains(QT_CONFIG, no-zlib):!cross_compile { - unix:LIBS += -lz -# win32:LIBS += libz.lib + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib } win32:LIBS += -luser32 diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index 44dd625..149291a 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -109,6 +109,10 @@ contains(QT_CONFIG, zlib)|cross_compile { ../3rdparty/zlib/trees.c \ ../3rdparty/zlib/uncompr.c \ ../3rdparty/zlib/zutil.c +} else:!contains(QT_CONFIG, no-zlib) { + symbian:LIBS_PRIVATE += -llibz + else:if(unix|win32-g++*):LIBS_PRIVATE += -lz + else:LIBS += zdll.lib } lib.CONFIG = dummy_install diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp index ebe1834..4997690 100644 --- a/src/tools/moc/main.cpp +++ b/src/tools/moc/main.cpp @@ -359,11 +359,10 @@ int runMoc(int _argc, char **_argv) if (autoInclude) { + int spos = filename.lastIndexOf(QDir::separator().toLatin1()); int ppos = filename.lastIndexOf('.'); - moc.noInclude = (ppos >= 0 - && tolower(filename[ppos + 1]) != 'h' - && tolower(filename[ppos + 1]) != QDir::separator().toLatin1() - ); + // spos >= -1 && ppos > spos => ppos >= 0 + moc.noInclude = (ppos > spos && tolower(filename[ppos + 1]) != 'h'); } if (moc.includeFiles.isEmpty()) { if (moc.includePath.isEmpty()) { diff --git a/src/winmain/winmain.pro b/src/winmain/winmain.pro index bc322b9..0c9b214 100644 --- a/src/winmain/winmain.pro +++ b/src/winmain/winmain.pro @@ -8,10 +8,10 @@ CONFIG += staticlib warn_on CONFIG -= qt shared win32 { - win32-g++:DEFINES += QT_NEEDS_QMAIN + win32-g++*:DEFINES += QT_NEEDS_QMAIN win32-borland:DEFINES += QT_NEEDS_QMAIN SOURCES = qtmain_win.cpp - CONFIG += png zlib + CONFIG += png CONFIG -= jpeg INCLUDEPATH += tmp $$QMAKE_INCDIR_QT/QtCore } diff --git a/src/xmlpatterns/schema/qxsdparticlechecker.cpp b/src/xmlpatterns/schema/qxsdparticlechecker.cpp index ef1d135..15c2afe 100644 --- a/src/xmlpatterns/schema/qxsdparticlechecker.cpp +++ b/src/xmlpatterns/schema/qxsdparticlechecker.cpp @@ -344,6 +344,19 @@ bool XsdParticleChecker::hasDuplicatedElements(const XsdParticle::Ptr &particle, bool XsdParticleChecker::isUPAConform(const XsdParticle::Ptr &particle, const NamePool::Ptr &namePool) { + + /** + * In case we encounter an <xsd:all> element, don't construct a state machine, but use the approach + * described at http://www.w3.org/TR/xmlschema-1/#non-ambig + * Reason: For n elements inside the <xsd:all>, represented in the NDA, the state machine + * constructs n! states in the DFA, which does not scale. + */ + if (particle->term()->isModelGroup()) { + const XsdModelGroup::Ptr group(particle->term()); + if (group->compositor() == XsdModelGroup::AllCompositor) + return isUPAConformXsdAll(particle, namePool); + } + /** * The algorithm is implemented like described in http://www.ltg.ed.ac.uk/~ht/XML_Europe_2003.html#S2.2 */ @@ -414,6 +427,23 @@ bool XsdParticleChecker::isUPAConform(const XsdParticle::Ptr &particle, const Na return true; } +bool XsdParticleChecker::isUPAConformXsdAll(const XsdParticle::Ptr &particle, const NamePool::Ptr &namePool) +{ + /** + * see http://www.w3.org/TR/xmlschema-1/#non-ambig + */ + const XsdModelGroup::Ptr group(particle->term()); + const XsdParticle::List particles = group->particles(); + const int count = particles.count(); + for (int left = 0; left < count; ++left) { + for (int right = left+1; right < count; ++right) { + if (termMatches(particles.at(left)->term(), particles.at(right)->term(), namePool)) + return false; + } + } + return true; +} + bool XsdParticleChecker::subsumes(const XsdParticle::Ptr &particle, const XsdParticle::Ptr &derivedParticle, const XsdSchemaContext::Ptr &context, QString &errorMsg) { /** diff --git a/src/xmlpatterns/schema/qxsdparticlechecker_p.h b/src/xmlpatterns/schema/qxsdparticlechecker_p.h index 742f0d0..40c525a 100644 --- a/src/xmlpatterns/schema/qxsdparticlechecker_p.h +++ b/src/xmlpatterns/schema/qxsdparticlechecker_p.h @@ -85,6 +85,13 @@ namespace QPatternist static bool isUPAConform(const XsdParticle::Ptr &particle, const NamePool::Ptr &namePool); /** + * Checks whether the given @p particle, which must be an xsd:all element, + * is valid according the UPA (http://www.w3.org/TR/xmlschema-1/#cos-nonambig) constraint. + * For xsd:all elements, we do not want to construct a state machine. + */ + static bool isUPAConformXsdAll(const XsdParticle::Ptr &particle, const NamePool::Ptr &namePool); + + /** * Checks whether the given @p particle subsumes the given @p derivedParticle. * (http://www.w3.org/TR/xmlschema-1/#cos-particle-restrict) */ diff --git a/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml new file mode 100644 index 0000000..4a2f056 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml @@ -0,0 +1,23 @@ +import Qt 4.7 + +Rectangle { + width: 400 + height: 200 + + Item { + objectName: "theItem" + anchors.centerIn: parent + width: childrenRect.width + height: childrenRect.height + Rectangle { + id: text1 + anchors.verticalCenter: parent.verticalCenter + width: 100; height: 100; color: "green" + } + Rectangle { + anchors.left: text1.right + anchors.verticalCenter: parent.verticalCenter + width: 100; height: 100; color: "green" + } + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp index c2d3660..0a66245 100644 --- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp +++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp @@ -72,6 +72,7 @@ private slots: void transforms(); void transforms_data(); void childrenRect(); + void childrenRectBug(); void childrenProperty(); void resourcesProperty(); @@ -736,6 +737,22 @@ void tst_QDeclarativeItem::childrenRect() delete o; } +// QTBUG-11383 +void tst_QDeclarativeItem::childrenRectBug() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug.qml")); + canvas->show(); + + QGraphicsObject *o = canvas->rootObject(); + QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("theItem"); + QCOMPARE(item->width(), qreal(200)); + QCOMPARE(item->height(), qreal(100)); + QCOMPARE(item->x(), qreal(100)); + + delete canvas; +} + template<typename T> T *tst_QDeclarativeItem::findItem(QGraphicsObject *parent, const QString &objectName) { diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp index 7c1170c..a968520 100644 --- a/tests/auto/gestures/tst_gestures.cpp +++ b/tests/auto/gestures/tst_gestures.cpp @@ -334,6 +334,7 @@ private slots: void gestureOverChild(); void multipleWidgetOnlyGestureInTree(); void conflictingGestures(); + void conflictingGesturesInGraphicsView(); void finishedWithoutStarted(); void unknownGesture(); void graphicsItemGesture(); @@ -2235,5 +2236,70 @@ void tst_Gestures::testReuseCanceledGestures() QCOMPARE(target->canceled(), 1); } +void tst_Gestures::conflictingGesturesInGraphicsView() +{ + QGraphicsScene scene; + GraphicsView view(&scene); + view.setWindowFlags(Qt::X11BypassWindowManagerHint); + + GestureItem *item1 = new GestureItem("item1"); + item1->grabGesture(CustomGesture::GestureType); + item1->size = QRectF(0, 0, 100, 100); + item1->setZValue(2); + scene.addItem(item1); + + GestureItem *item2 = new GestureItem("item2"); + item2->grabGesture(CustomGesture::GestureType); + item2->size = QRectF(0, 0, 100, 100); + item2->setZValue(5); + scene.addItem(item2); + + view.show(); + QTest::qWaitForWindowShown(&view); + view.ensureVisible(scene.sceneRect()); + + static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; + + CustomEvent event; + + // nobody accepts override + item1->acceptGestureOverride = false; + item2->acceptGestureOverride = false; + event.hotSpot = mapToGlobal(item2->boundingRect().center(), item2, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item2, &scene); + QCOMPARE(item2->gestureOverrideEventsReceived, 1); + QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1->gestureOverrideEventsReceived, 1); + QCOMPARE(item1->gestureEventsReceived, 0); + + item1->reset(); item2->reset(); + + // the original target accepts override + item1->acceptGestureOverride = false; + item2->acceptGestureOverride = true; + event.hotSpot = mapToGlobal(item2->boundingRect().center(), item2, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item2, &scene); + QCOMPARE(item2->gestureOverrideEventsReceived, 1); + QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1->gestureEventsReceived, 0); + + item1->reset(); item2->reset(); + + // the item behind accepts override + item1->acceptGestureOverride = true; + item2->acceptGestureOverride = false; + event.hotSpot = mapToGlobal(item2->boundingRect().center(), item2, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item2, &scene); + + QCOMPARE(item2->gestureOverrideEventsReceived, 1); + QCOMPARE(item2->gestureEventsReceived, 0); + QCOMPARE(item1->gestureOverrideEventsReceived, 1); + QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); +} + QTEST_MAIN(tst_Gestures) #include "tst_gestures.moc" diff --git a/tests/auto/mediaobject/dummy/dummy.pro b/tests/auto/mediaobject/dummy/dummy.pro index cf1010e..88b864b 100644 --- a/tests/auto/mediaobject/dummy/dummy.pro +++ b/tests/auto/mediaobject/dummy/dummy.pro @@ -1,7 +1,7 @@ TEMPLATE = lib isEmpty(QT_MAJOR_VERSION) { - VERSION=4.6.3 + VERSION=4.6.4 } else { VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION} } diff --git a/tests/auto/qapplication/tst_qapplication.cpp b/tests/auto/qapplication/tst_qapplication.cpp index 43fbba1..1a38070 100644 --- a/tests/auto/qapplication/tst_qapplication.cpp +++ b/tests/auto/qapplication/tst_qapplication.cpp @@ -189,15 +189,22 @@ void tst_QApplication::getSetCheck() { int argc = 0; QApplication obj1(argc, 0, QApplication::GuiServer); - // QInputContext * QApplication::inputContext() - // void QApplication::setInputContext(QInputContext *) MyInputContext *var1 = new MyInputContext; + + // QApplication takes ownership, so check for reparenting: obj1.setInputContext(var1); - QCOMPARE((QInputContext *)var1, obj1.inputContext()); + QCOMPARE(var1->parent(), static_cast<QObject *>(&obj1)); + + // Test for self-assignment: + obj1.setInputContext(obj1.inputContext()); + QVERIFY(obj1.inputContext()); + QCOMPARE(static_cast<QInputContext *>(var1), obj1.inputContext()); + + // Resetting the input context to 0 is not allowed: QTest::ignoreMessage(QtWarningMsg, "QApplication::setInputContext: called with 0 input context"); - obj1.setInputContext((QInputContext *)0); - QCOMPARE((QInputContext *)var1, obj1.inputContext()); - // delete var1; // No delete, since QApplication takes ownership + obj1.setInputContext(0); + + QCOMPARE(static_cast<QInputContext *>(var1), obj1.inputContext()); } class CloseEventTestWindow : public QWidget diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp index 8127f84..b9a5c66 100644 --- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp +++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp @@ -741,31 +741,73 @@ void tst_QGraphicsGridLayout::setColumnFixedWidth() // public qreal columnSpacing(int column) const void tst_QGraphicsGridLayout::columnSpacing() { - QGraphicsScene scene; - QGraphicsView view(&scene); - QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); - QGraphicsGridLayout *layout = new QGraphicsGridLayout(); - scene.addItem(widget); - widget->setLayout(layout); - populateLayout(layout, 3, 2); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); - QCOMPARE(layout->columnSpacing(0), 0.0); + { + QGraphicsScene scene; + QGraphicsView view(&scene); + QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); + QGraphicsGridLayout *layout = new QGraphicsGridLayout(); + scene.addItem(widget); + widget->setLayout(layout); + populateLayout(layout, 3, 2); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + QCOMPARE(layout->columnSpacing(0), 0.0); + + layout->setColumnSpacing(0, 20); + view.show(); + widget->show(); + widget->resize(widget->effectiveSizeHint(Qt::PreferredSize)); + QApplication::processEvents(); - layout->setColumnSpacing(0, 20); - view.show(); - widget->show(); - widget->resize(widget->effectiveSizeHint(Qt::PreferredSize)); - QApplication::processEvents(); + QCOMPARE(layout->itemAt(0,0)->geometry().left(), 0.0); + QCOMPARE(layout->itemAt(0,0)->geometry().right(), 25.0); + QCOMPARE(layout->itemAt(0,1)->geometry().left(), 45.0); + QCOMPARE(layout->itemAt(0,1)->geometry().right(), 70.0); + QCOMPARE(layout->itemAt(0,2)->geometry().left(), 70.0); + QCOMPARE(layout->itemAt(0,2)->geometry().right(), 95.0); - QCOMPARE(layout->itemAt(0,0)->geometry().left(), 0.0); - QCOMPARE(layout->itemAt(0,0)->geometry().right(), 25.0); - QCOMPARE(layout->itemAt(0,1)->geometry().left(), 45.0); - QCOMPARE(layout->itemAt(0,1)->geometry().right(), 70.0); - QCOMPARE(layout->itemAt(0,2)->geometry().left(), 70.0); - QCOMPARE(layout->itemAt(0,2)->geometry().right(), 95.0); + delete widget; + } + + { + // don't include items and spacings that was previously part of the layout + // (horizontal) + QGraphicsGridLayout *layout = new QGraphicsGridLayout; + populateLayout(layout, 3, 1); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + layout->setColumnSpacing(0, 10); + layout->setColumnSpacing(1, 10); + layout->setColumnSpacing(2, 10); + layout->setColumnSpacing(3, 10); + QCOMPARE(layout->preferredSize(), QSizeF(95, 25)); + layout->removeAt(2); + QCOMPARE(layout->preferredSize(), QSizeF(60, 25)); + layout->removeAt(1); + QCOMPARE(layout->preferredSize(), QSizeF(25, 25)); + delete layout; + } + { + // don't include items and spacings that was previously part of the layout + // (vertical) + QGraphicsGridLayout *layout = new QGraphicsGridLayout; + populateLayout(layout, 2, 2); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + layout->setColumnSpacing(0, 10); + layout->setColumnSpacing(1, 10); + layout->setRowSpacing(0, 10); + layout->setRowSpacing(1, 10); + QCOMPARE(layout->preferredSize(), QSizeF(60, 60)); + layout->removeAt(3); + QCOMPARE(layout->preferredSize(), QSizeF(60, 60)); + layout->removeAt(2); + QCOMPARE(layout->preferredSize(), QSizeF(60, 25)); + layout->removeAt(1); + QCOMPARE(layout->preferredSize(), QSizeF(25, 25)); + delete layout; + } - delete widget; } // public int columnStretchFactor(int column) const diff --git a/tests/auto/qimagereader/tst_qimagereader.cpp b/tests/auto/qimagereader/tst_qimagereader.cpp index aadee5b..fe2a719 100644 --- a/tests/auto/qimagereader/tst_qimagereader.cpp +++ b/tests/auto/qimagereader/tst_qimagereader.cpp @@ -138,6 +138,9 @@ private slots: void sizeBeforeRead_data(); void sizeBeforeRead(); + void sizeBeforeFormat_data(); + void sizeBeforeFormat(); + void imageFormatBeforeRead_data(); void imageFormatBeforeRead(); @@ -706,6 +709,31 @@ void tst_QImageReader::sizeBeforeRead() QCOMPARE(size, image.size()); } +void tst_QImageReader::sizeBeforeFormat_data() +{ + imageFormat_data(); +} + +void tst_QImageReader::sizeBeforeFormat() +{ + QFETCH(QString, fileName); + + QByteArray formatA, formatB; + + { + QImageReader reader(prefix + fileName); + formatA = reader.format(); + } + + { + QImageReader reader(prefix + fileName); + QSize size = reader.size(); + formatB = reader.format(); + } + + QCOMPARE(formatA, formatB); +} + void tst_QImageReader::imageFormatBeforeRead_data() { imageFormat_data(); @@ -1884,14 +1912,14 @@ void tst_QImageReader::testIgnoresFormatAndExtension() QFETCH(QString, expected); QList<QByteArray> formats = QImageReader::supportedImageFormats(); - QString fileNameBase = "images/" + name + "."; + QString fileNameBase = prefix + name + "."; foreach (const QByteArray &f, formats) { if (f == extension) continue; QFile tmp(QDir::tempPath() + "/" + name + "_" + expected + "." + f); - QFile::copy(fileNameBase + extension, QFileInfo(tmp).absoluteFilePath()); + QVERIFY(QFile::copy(fileNameBase + extension, QFileInfo(tmp).absoluteFilePath())); QString format; QImage image; diff --git a/tests/auto/qlocale/test/test.pro b/tests/auto/qlocale/test/test.pro index d57f2d1..e33d0fe 100644 --- a/tests/auto/qlocale/test/test.pro +++ b/tests/auto/qlocale/test/test.pro @@ -36,4 +36,4 @@ symbian:contains(S60_VERSION,3.2) { "PAGED" \ "$${LITERAL_HASH}endif" MMP_RULES += custom_paged_rule -}
\ No newline at end of file +} diff --git a/tests/auto/qlocalsocket/example/client/client.pro b/tests/auto/qlocalsocket/example/client/client.pro index eb7e6e6..84f20d6 100644 --- a/tests/auto/qlocalsocket/example/client/client.pro +++ b/tests/auto/qlocalsocket/example/client/client.pro @@ -1,14 +1,8 @@ -###################################################################### -# Automatically generated by qmake (2.01a) Wed Jun 6 17:07:12 2007 -###################################################################### - TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . CONFIG += console -include(../../src/src.pri) -# Input QT = core network SOURCES += main.cpp diff --git a/tests/auto/qlocalsocket/example/server/server.pro b/tests/auto/qlocalsocket/example/server/server.pro index 438462d..bfd14d2 100644 --- a/tests/auto/qlocalsocket/example/server/server.pro +++ b/tests/auto/qlocalsocket/example/server/server.pro @@ -1,7 +1,3 @@ -###################################################################### -# Automatically generated by qmake (2.01a) Wed Jun 6 15:16:48 2007 -###################################################################### - TEMPLATE = app TARGET = DEPENDPATH += . @@ -11,8 +7,6 @@ CONFIG += console QT = core network -include(../../src/src.pri) - # Input SOURCES += main.cpp diff --git a/tests/auto/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/qlocalsocket/tst_qlocalsocket.cpp index 44f3c12..9c09917 100644 --- a/tests/auto/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/qlocalsocket/tst_qlocalsocket.cpp @@ -115,7 +115,8 @@ private slots: void writeToClientAndDisconnect(); void debug(); void bytesWrittenSignal(); - + void syncDisconnectNotify(); + void asyncDisconnectNotify(); #ifdef Q_OS_SYMBIAN private: @@ -683,25 +684,11 @@ public: QString testLine = "test"; LocalSocket socket; QSignalSpy spyReadyRead(&socket, SIGNAL(readyRead())); - int tries = 0; - do { - socket.connectToServer("qlocalsocket_threadtest"); - if (socket.error() != QLocalSocket::ServerNotFoundError - && socket.error() != QLocalSocket::ConnectionRefusedError) - break; - QTest::qWait(100); - ++tries; - } while ((socket.error() == QLocalSocket::ServerNotFoundError - || socket.error() == QLocalSocket::ConnectionRefusedError) - && tries < 1000); - if (tries == 0 && socket.state() != QLocalSocket::ConnectedState) { - QVERIFY(socket.waitForConnected(7000)); - QVERIFY(socket.state() == QLocalSocket::ConnectedState); - } + socket.connectToServer("qlocalsocket_threadtest"); + QVERIFY(socket.waitForConnected(1000)); // We should *not* have this signal yet! - if (tries == 0) - QCOMPARE(spyReadyRead.count(), 0); + QCOMPARE(spyReadyRead.count(), 0); socket.waitForReadyRead(); QCOMPARE(spyReadyRead.count(), 1); QTextStream in(&socket); @@ -715,6 +702,8 @@ class Server : public QThread public: int clients; + QMutex mutex; + QWaitCondition wc; void run() { QString testLine = "test"; @@ -722,6 +711,9 @@ public: server.setMaxPendingConnections(10); QVERIFY2(server.listen("qlocalsocket_threadtest"), server.errorString().toLatin1().constData()); + mutex.lock(); + wc.wakeAll(); + mutex.unlock(); int done = clients; while (done > 0) { bool timedOut = true; @@ -746,14 +738,9 @@ void tst_QLocalSocket::threadedConnection_data() QTest::addColumn<int>("threads"); QTest::newRow("1 client") << 1; QTest::newRow("2 clients") << 2; -#ifdef Q_OS_WINCE - QTest::newRow("4 clients") << 4; -#endif -#ifndef Q_OS_WIN QTest::newRow("5 clients") << 5; - QTest::newRow("10 clients") << 10; -#endif #ifndef Q_OS_WINCE + QTest::newRow("10 clients") << 10; QTest::newRow("20 clients") << 20; #endif } @@ -770,7 +757,9 @@ void tst_QLocalSocket::threadedConnection() server.setStackSize(0x14000); #endif server.clients = threads; + server.mutex.lock(); server.start(); + server.wc.wait(&server.mutex); QList<Client*> clients; for (int i = 0; i < threads; ++i) { @@ -784,9 +773,7 @@ void tst_QLocalSocket::threadedConnection() server.wait(); while (!clients.isEmpty()) { QVERIFY(clients.first()->wait(3000)); - Client *client =clients.takeFirst(); - client->terminate(); - delete client; + delete clients.takeFirst(); } } @@ -994,6 +981,7 @@ void tst_QLocalSocket::writeToClientAndDisconnect() QLocalServer server; QLocalSocket client; + QSignalSpy readChannelFinishedSpy(&client, SIGNAL(readChannelFinished())); QVERIFY(server.listen("writeAndDisconnectServer")); client.connectToServer("writeAndDisconnectServer"); @@ -1006,10 +994,12 @@ void tst_QLocalSocket::writeToClientAndDisconnect() memset(buffer, 0, sizeof(buffer)); QCOMPARE(clientSocket->write(buffer, sizeof(buffer)), (qint64)sizeof(buffer)); clientSocket->waitForBytesWritten(); - clientSocket->disconnectFromServer(); - QVERIFY(client.waitForReadyRead()); + clientSocket->close(); + server.close(); + + QTRY_COMPARE(readChannelFinishedSpy.count(), 1); QCOMPARE(client.read(buffer, sizeof(buffer)), (qint64)sizeof(buffer)); - QVERIFY(client.waitForDisconnected()); + client.waitForDisconnected(); QCOMPARE(client.state(), QLocalSocket::UnconnectedState); } @@ -1065,6 +1055,41 @@ void tst_QLocalSocket::bytesWrittenSignal() QVERIFY(writeThread.wait(2000)); } +void tst_QLocalSocket::syncDisconnectNotify() +{ +#ifdef Q_OS_SYMBIAN + unlink("syncDisconnectNotify"); +#endif + + QLocalServer server; + QVERIFY(server.listen("syncDisconnectNotify")); + QLocalSocket client; + client.connectToServer("syncDisconnectNotify"); + QVERIFY(server.waitForNewConnection()); + QLocalSocket* serverSocket = server.nextPendingConnection(); + QVERIFY(serverSocket); + delete serverSocket; + QCOMPARE(client.waitForReadyRead(), false); +} + +void tst_QLocalSocket::asyncDisconnectNotify() +{ +#ifdef Q_OS_SYMBIAN + unlink("asyncDisconnectNotify"); +#endif + + QLocalServer server; + QVERIFY(server.listen("asyncDisconnectNotify")); + QLocalSocket client; + QSignalSpy disconnectedSpy(&client, SIGNAL(disconnected())); + client.connectToServer("asyncDisconnectNotify"); + QVERIFY(server.waitForNewConnection()); + QLocalSocket* serverSocket = server.nextPendingConnection(); + QVERIFY(serverSocket); + delete serverSocket; + QTRY_VERIFY(!disconnectedSpy.isEmpty()); +} + #ifdef Q_OS_SYMBIAN void tst_QLocalSocket::unlink(QString name) { diff --git a/tests/auto/qprocess/testProcessEOF/testProcessEOF.pro b/tests/auto/qprocess/testProcessEOF/testProcessEOF.pro index f406759..756bd23 100644 --- a/tests/auto/qprocess/testProcessEOF/testProcessEOF.pro +++ b/tests/auto/qprocess/testProcessEOF/testProcessEOF.pro @@ -2,7 +2,7 @@ SOURCES = main.cpp CONFIG -= qt app_bundle CONFIG += console -!win32-g++:win32:!equals(TEMPLATE_PREFIX, "vc"):QMAKE_CXXFLAGS += /GS- +win32:!win32-g++*:!equals(TEMPLATE_PREFIX, "vc"):QMAKE_CXXFLAGS += /GS- DESTDIR = ./ diff --git a/tests/auto/qsqldriver/qsqldriver.pro b/tests/auto/qsqldriver/qsqldriver.pro index d04ca83..2e9ed67 100644 --- a/tests/auto/qsqldriver/qsqldriver.pro +++ b/tests/auto/qsqldriver/qsqldriver.pro @@ -9,7 +9,7 @@ wince*: { DEPLOYMENT += plugFiles LIBS += -lws2 } else { - win32-g++ { + win32-g++* { LIBS += -lws2_32 } else:win32 { LIBS += ws2_32.lib diff --git a/tests/auto/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro b/tests/auto/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro index ee4f2f0..c6681d5 100644 --- a/tests/auto/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro +++ b/tests/auto/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro @@ -17,7 +17,7 @@ wince*: { } } } else { - win32-g++ { + win32-g++* { LIBS += -lws2_32 } else:win32 { LIBS += ws2_32.lib diff --git a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp index 505b867..d0509bb 100644 --- a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp +++ b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp @@ -542,6 +542,9 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"d.*/c.*.pem\" regexp der") << QString("d.*/c.*.pem") << int(QRegExp::RegExp) << false << 0; 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 << 4; +#endif QTest::newRow("trailing-whitespace") << QString("more-certificates/trailing-whitespace.pem") << int(QRegExp::FixedString) << true << 1; QTest::newRow("no-ending-newline") << QString("more-certificates/no-ending-newline.pem") << int(QRegExp::FixedString) << true << 1; diff --git a/tests/auto/qtcpserver/crashingServer/crashingServer.pro b/tests/auto/qtcpserver/crashingServer/crashingServer.pro index 70e42b4..0bea655 100644 --- a/tests/auto/qtcpserver/crashingServer/crashingServer.pro +++ b/tests/auto/qtcpserver/crashingServer/crashingServer.pro @@ -5,4 +5,4 @@ DESTDIR = ./ # This means the auto test works on some machines for MinGW. No dialog stalls # the application. -win32-g++:CONFIG += console +win32-g++*:CONFIG += console diff --git a/tests/auto/qtextboundaryfinder/tst_qtextboundaryfinder.cpp b/tests/auto/qtextboundaryfinder/tst_qtextboundaryfinder.cpp index c60af5e..a562fbe 100644 --- a/tests/auto/qtextboundaryfinder/tst_qtextboundaryfinder.cpp +++ b/tests/auto/qtextboundaryfinder/tst_qtextboundaryfinder.cpp @@ -71,6 +71,10 @@ private slots: void isAtWordStart(); void fastConstructor(); void isAtBoundaryLine(); + void toNextBoundary_data(); + void toNextBoundary(); + void toPreviousBoundary_data(); + void toPreviousBoundary(); }; tst_QTextBoundaryFinder::tst_QTextBoundaryFinder() @@ -292,25 +296,120 @@ void tst_QTextBoundaryFinder::fastConstructor() void tst_QTextBoundaryFinder::isAtBoundaryLine() { - // idx 0 1 2 3 4 5 - // break? - - - + - + + // idx 0 1 2 3 4 5 6 + // break? - - - - + - + QChar s[] = { 0x0061, 0x00AD, 0x0062, 0x0009, 0x0063, 0x0064 }; QString text(s, sizeof(s)/sizeof(s[0])); - qDebug() << "text = " << text << ", length = " << text.length(); +// qDebug() << "text = " << text << ", length = " << text.length(); QTextBoundaryFinder finder(QTextBoundaryFinder::Line, text.constData(), text.length(), /*buffer*/0, /*buffer size*/0); finder.setPosition(0); - QVERIFY(!finder.isAtBoundary()); + QVERIFY(finder.isAtBoundary()); finder.setPosition(1); QVERIFY(!finder.isAtBoundary()); finder.setPosition(2); QVERIFY(!finder.isAtBoundary()); finder.setPosition(3); - QVERIFY(finder.isAtBoundary()); - finder.setPosition(4); QVERIFY(!finder.isAtBoundary()); + finder.setPosition(4); + QVERIFY(finder.isAtBoundary()); finder.setPosition(5); + QVERIFY(!finder.isAtBoundary()); + finder.setPosition(6); QVERIFY(finder.isAtBoundary()); } +Q_DECLARE_METATYPE(QList<int>) + +void tst_QTextBoundaryFinder::toNextBoundary_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<int>("type"); + QTest::addColumn< QList<int> >("boundaries"); + + 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) \ + << boundaries; + + boundaries.clear(); + boundaries << 0 << 13 << 25; + QTest::newRow("Line") << 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) \ + << 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) + << boundaries; + +} + +void tst_QTextBoundaryFinder::toNextBoundary() +{ + QFETCH(QString, text); + QFETCH(int, type); + QFETCH(QList<int>, boundaries); + + QList<int> foundBoundaries; + QTextBoundaryFinder boundaryFinder(QTextBoundaryFinder::BoundaryType(type), text); + boundaryFinder.toStart(); + for(int next = 0; next != -1; next = boundaryFinder.toNextBoundary()) + foundBoundaries << next; + QCOMPARE(boundaries, foundBoundaries); +} + +void tst_QTextBoundaryFinder::toPreviousBoundary_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<int>("type"); + QTest::addColumn< QList<int> >("boundaries"); + + 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) + << boundaries; + + boundaries.clear(); + boundaries << 25 << 13 << 0; + QTest::newRow("Line") << 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) + << 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) + << boundaries; + +} + +void tst_QTextBoundaryFinder::toPreviousBoundary() +{ + QFETCH(QString, text); + QFETCH(int, type); + QFETCH(QList<int>, boundaries); + + QList<int> foundBoundaries; + QTextBoundaryFinder boundaryFinder(QTextBoundaryFinder::BoundaryType(type), text); + boundaryFinder.toEnd(); + for (int previous = boundaryFinder.position(); + previous != -1; + previous = boundaryFinder.toPreviousBoundary()) + { + foundBoundaries << previous; + } + QCOMPARE(boundaries, foundBoundaries); +} + + + + QTEST_MAIN(tst_QTextBoundaryFinder) #include "tst_qtextboundaryfinder.moc" diff --git a/tests/auto/qtextformat/tst_qtextformat.cpp b/tests/auto/qtextformat/tst_qtextformat.cpp index ee1f4b5..9b71481 100644 --- a/tests/auto/qtextformat/tst_qtextformat.cpp +++ b/tests/auto/qtextformat/tst_qtextformat.cpp @@ -308,10 +308,7 @@ void tst_QTextFormat::getSetTabs() format.setTabPositions(tabs); Comparator c2(tabs, format.tabPositions()); - QTextOption::Tab tab2; - tab2.position = 3456; - tab2.type = QTextOption::RightTab; - tab2.delimiter = QChar('x'); + QTextOption::Tab tab2(3456, QTextOption::RightTab, QChar('x')); tabs.append(tab2); format.setTabPositions(tabs); Comparator c3(tabs, format.tabPositions()); diff --git a/tests/auto/qtextlayout/tst_qtextlayout.cpp b/tests/auto/qtextlayout/tst_qtextlayout.cpp index 1a5f493..a631f3d 100644 --- a/tests/auto/qtextlayout/tst_qtextlayout.cpp +++ b/tests/auto/qtextlayout/tst_qtextlayout.cpp @@ -980,9 +980,7 @@ void tst_QTextLayout::testCenteredTab() // test if centering the tab works. We expect the center of 'Bar.' to be at the tab point. QTextOption option = layout.textOption(); QList<QTextOption::Tab> tabs; - QTextOption::Tab tab; - tab.type = QTextOption::CenterTab; - tab.position = 150; + QTextOption::Tab tab(150, QTextOption::CenterTab); tabs.append(tab); option.setTabs(tabs); layout.setTextOption(option); @@ -1002,10 +1000,7 @@ void tst_QTextLayout::testDelimiterTab() // try the different delimiter characters to see if the alignment works there. QTextOption option = layout.textOption(); QList<QTextOption::Tab> tabs; - QTextOption::Tab tab; - tab.type = QTextOption::DelimiterTab; - tab.delimiter = QChar('.'); - tab.position = 100; + QTextOption::Tab tab(100, QTextOption::DelimiterTab, QChar('.')); tabs.append(tab); option.setTabs(tabs); layout.setTextOption(option); diff --git a/tests/auto/qtextodfwriter/tst_qtextodfwriter.cpp b/tests/auto/qtextodfwriter/tst_qtextodfwriter.cpp index 64c42bb..a463d86 100644 --- a/tests/auto/qtextodfwriter/tst_qtextodfwriter.cpp +++ b/tests/auto/qtextodfwriter/tst_qtextodfwriter.cpp @@ -198,14 +198,9 @@ void tst_QTextOdfWriter::testWriteStyle2() { QTextBlockFormat bf; // = cursor.blockFormat(); QList<QTextOption::Tab> tabs; - QTextOption::Tab tab1; - tab1.position = 40; - tab1.type = QTextOption::RightTab; + QTextOption::Tab tab1(40, QTextOption::RightTab); tabs << tab1; - QTextOption::Tab tab2; - tab2.position = 80; - tab2.type = QTextOption::DelimiterTab; - tab2.delimiter = 'o'; + QTextOption::Tab tab2(80, QTextOption::DelimiterTab, 'o'); tabs << tab2; bf.setTabPositions(tabs); diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index d76bbfa..045216a 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -610,10 +610,14 @@ void tst_QWidget::getSetCheck() obj1.setAttribute(Qt::WA_InputMethodEnabled); obj1.setInputContext(var13); QCOMPARE(static_cast<QInputContext *>(var13), obj1.inputContext()); + // QWidget takes ownership, so check parent + QCOMPARE(var13->parent(), static_cast<QObject *>(&obj1)); + // Check self assignment + obj1.setInputContext(obj1.inputContext()); + QCOMPARE(static_cast<QInputContext *>(var13), obj1.inputContext()); obj1.setInputContext((QInputContext *)0); QCOMPARE(qApp->inputContext(), obj1.inputContext()); QVERIFY(qApp->inputContext() != var13); - //delete var13; // No delete, since QWidget takes ownership // bool QWidget::autoFillBackground() // void QWidget::setAutoFillBackground(bool) diff --git a/tests/auto/selftests/expected_badxml.txt b/tests/auto/selftests/expected_badxml.txt index 046f1b2..bc9d203 100644 --- a/tests/auto/selftests/expected_badxml.txt +++ b/tests/auto/selftests/expected_badxml.txt @@ -1,5 +1,5 @@ ********* Start testing of tst_BadXml ********* -Config: Using QTest library 4.6.3, Qt 4.6.3 +Config: Using QTest library 4.6.4, Qt 4.6.4 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 diff --git a/tests/auto/selftests/expected_xunit.txt b/tests/auto/selftests/expected_xunit.txt index 02cfa6f..ac8c0db 100644 --- a/tests/auto/selftests/expected_xunit.txt +++ b/tests/auto/selftests/expected_xunit.txt @@ -1,5 +1,5 @@ ********* Start testing of tst_Xunit ********* -Config: Using QTest library 4.6.3, Qt 4.6.3 +Config: Using QTest library 4.6.4, Qt 4.6.4 PASS : tst_Xunit::initTestCase() WARNING: tst_Xunit::testFunc1() just a QWARN() ! PASS : tst_Xunit::testFunc1() diff --git a/tests/auto/uic/baseline/config_fromuic3.ui.h b/tests/auto/uic/baseline/config_fromuic3.ui.h index 7e0189e..a97e8bc 100644 --- a/tests/auto/uic/baseline/config_fromuic3.ui.h +++ b/tests/auto/uic/baseline/config_fromuic3.ui.h @@ -45,7 +45,7 @@ ** Form generated from reading UI file 'config_fromuic3.ui' ** ** Created: Thu Dec 17 12:48:42 2009 -** by: Qt User Interface Compiler version 4.6.3 +** by: Qt User Interface Compiler version 4.6.4 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/xmlpatternsxqts/tst_suitetest.cpp b/tests/auto/xmlpatternsxqts/tst_suitetest.cpp index ec63858..6e10e3f 100644 --- a/tests/auto/xmlpatternsxqts/tst_suitetest.cpp +++ b/tests/auto/xmlpatternsxqts/tst_suitetest.cpp @@ -141,8 +141,6 @@ void tst_SuiteTest::checkTestSuiteResult() const /* Passed to ResultThreader so it knows what kind of file it is handling. */ ResultThreader::Type type = ResultThreader::Baseline; - QProcess::execute(QLatin1String("p4 edit ") + m_existingBaseline); - for(QFileInfoList::const_iterator it(list.constBegin()); it != end; ++it) { QFileInfo i(*it); @@ -167,8 +165,6 @@ void tst_SuiteTest::checkTestSuiteResult() const const int exitCode = eventLoop.exec(); - QProcess::execute(QLatin1String("p4 revert -a ") + m_existingBaseline); - QCOMPARE(exitCode, 0); } diff --git a/tools/activeqt/testcon/testcon.pro b/tools/activeqt/testcon/testcon.pro index dc98218..89f8067 100644 --- a/tools/activeqt/testcon/testcon.pro +++ b/tools/activeqt/testcon/testcon.pro @@ -16,6 +16,6 @@ RC_FILE = testcon.rc win32-borland { QMAKE_POST_LINK = -midl $$QT_SOURCE_TREE/tools/activeqt/testcon/testcon.idl } else { - !win32-g++:QMAKE_POST_LINK = midl $$QT_SOURCE_TREE/tools/activeqt/testcon/testcon.idl && move testcon.tlb $(TARGETDIR) + !win32-g++*:QMAKE_POST_LINK = midl $$QT_SOURCE_TREE/tools/activeqt/testcon/testcon.idl && move testcon.tlb $(TARGETDIR) } diff --git a/tools/assistant/lib/fulltextsearch/fulltextsearch.pro b/tools/assistant/lib/fulltextsearch/fulltextsearch.pro index fb1a0dd..4d2fddb 100644 --- a/tools/assistant/lib/fulltextsearch/fulltextsearch.pro +++ b/tools/assistant/lib/fulltextsearch/fulltextsearch.pro @@ -29,7 +29,7 @@ unix:QMAKE_PKGCONFIG_REQUIRES = QtCore CONFIG(exceptions_off) { CONFIG -= exceptions_off CONFIG += exceptions - !win32|win32-g++ { + !win32|win32-g++* { QMAKE_CFLAGS -= -fno-exceptions QMAKE_CXXFLAGS -= -fno-exceptions QMAKE_LFLAGS -= -fno-exceptions diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro index d926a76..64a6d9a 100644 --- a/tools/configure/configure.pro +++ b/tools/configure/configure.pro @@ -8,7 +8,7 @@ DEFINES += QT_BOOTSTRAPPED win32 : LIBS += -lole32 -ladvapi32 win32-msvc.net | win32-msvc2* : QMAKE_CXXFLAGS += /EHsc -win32-g++ : LIBS += -luuid +win32-g++* : LIBS += -luuid win32-msvc* { QMAKE_CFLAGS_RELEASE -= -MD diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index a5f9f2c..2e2d8ba 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -1035,6 +1035,8 @@ void Configure::parseCmdLine() qmakeLibs += QString("-l" + configCmdLine.at(i)); } else if (configCmdLine.at(i).startsWith("OPENSSL_LIBS=")) { opensslLibs = configCmdLine.at(i); + } else if (configCmdLine.at(i).startsWith("PSQL_LIBS=")) { + psqlLibs = configCmdLine.at(i); } else if( ( configCmdLine.at(i) == "-override-version" ) || ( configCmdLine.at(i) == "-version-override" ) ){ @@ -2747,6 +2749,8 @@ void Configure::generateOutputVars() else qmakeVars += QString("OPENSSL_LIBS = -lssleay32 -llibeay32"); } + if (!psqlLibs.isEmpty()) + qmakeVars += QString("QT_LFLAGS_PSQL=") + psqlLibs.section("=", 1); if (!qmakeSql.isEmpty()) qmakeVars += QString("sql-drivers += ") + qmakeSql.join( " " ); if (!qmakeSqlPlugins.isEmpty()) diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index 6c10dd8..ff2ee8b 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -133,6 +133,7 @@ private: QStringList qmakeIncludes; QStringList qmakeLibs; QString opensslLibs; + QString psqlLibs; QMap<QString,QString> licenseInfo; QString outputLine; diff --git a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp index a25bd5d..5547761 100644 --- a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp +++ b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp @@ -63,6 +63,7 @@ #include <QtGui/QAction> #include <QtGui/QButtonGroup> #include <QtGui/QMenu> +#include <QtGui/QSortFilterProxyModel> #include <QtGui/QStandardItemModel> #include <QtGui/QComboBox> #include <QtGui/QApplication> @@ -712,9 +713,12 @@ SignalSlotEditorWindow::SignalSlotEditorWindow(QDesignerFormEditorInterface *cor m_remove_button(new QToolButton), m_core(core), m_model(new ConnectionModel(this)), + m_proxy_model(new QSortFilterProxyModel(this)), m_handling_selection_change(false) { - m_view->setModel(m_model); + m_proxy_model->setSourceModel(m_model); + m_view->setModel(m_proxy_model); + m_view->setSortingEnabled(true); m_view->setItemDelegate(new ConnectionDelegate(this)); m_view->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); @@ -790,7 +794,7 @@ void SignalSlotEditorWindow::updateDialogSelection(Connection *con) if (m_handling_selection_change || m_editor == 0) return; - QModelIndex index = m_model->connectionToIndex(con); + QModelIndex index = m_proxy_model->mapFromSource(m_model->connectionToIndex(con)); if (index == m_view->currentIndex()) return; m_handling_selection_change = true; @@ -808,7 +812,7 @@ void SignalSlotEditorWindow::updateEditorSelection(const QModelIndex &index) if (m_editor == 0) return; - Connection *con = m_model->indexToConnection(index); + Connection *con = m_model->indexToConnection(m_proxy_model->mapToSource(index)); if (m_editor->selected(con)) return; m_handling_selection_change = true; diff --git a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.h b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.h index 9315955..665f0b7 100644 --- a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.h +++ b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.h @@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE class QDesignerFormWindowInterface; class QDesignerFormEditorInterface; class QModelIndex; +class QSortFilterProxyModel; class QTreeView; class QToolButton; @@ -84,6 +85,7 @@ private: QToolButton *m_add_button, *m_remove_button; QDesignerFormEditorInterface *m_core; ConnectionModel *m_model; + QSortFilterProxyModel *m_proxy_model; bool m_handling_selection_change; }; diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp index a64e8e7..197bc13 100644 --- a/tools/qdoc3/ditaxmlgenerator.cpp +++ b/tools/qdoc3/ditaxmlgenerator.cpp @@ -45,23 +45,295 @@ #include "codemarker.h" #include "codeparser.h" -#include "helpprojectwriter.h" #include "ditaxmlgenerator.h" #include "node.h" #include "separator.h" #include "tree.h" #include <ctype.h> - #include <qdebug.h> #include <qlist.h> #include <qiterator.h> #include <qtextcodec.h> +#include <QUuid> QT_BEGIN_NAMESPACE -#define COMMAND_VERSION Doc::alias("version") +#define COMMAND_VERSION Doc::alias("version") int DitaXmlGenerator::id = 0; +#define cxxapi_d_xref Doc::alias("cxxapi-d-xref") +#define cxxclass Doc::alias("cxxclass") +#define cxxdefine Doc::alias("cxxdefine") +#define cxxenumeration Doc::alias("cxxenumeration") +#define cxxfile Doc::alias("cxxfile") +#define cxxfunction Doc::alias("cxxfunction") +#define cxxstruct Doc::alias("cxxstruct") +#define cxxtypedef Doc::alias("cxxtypedef") +#define cxxunion Doc::alias("cxxunion") +#define cxxvariable Doc::alias("cxxvariable") + +#define CXXAPIMAP Doc::alias("cxxAPIMap") +#define CXXCLASSREF Doc::alias("cxxClassRef") +#define CXXDEFINEREF Doc::alias("cxxDefineRef") +#define CXXENUMERATIONREF Doc::alias("cxxEnumerationRef") +#define CXXFILEREF Doc::alias("cxxFileRef") +#define CXXFUNCTIONREF Doc::alias("cxxFunctionRef") +#define CXXSTRUCTREF Doc::alias("cxxStructRef") +#define CXXTYPDEFREF Doc::alias("cxxTypedefRef") +#define CXXUNIONREF Doc::alias("cxxUnionRef") +#define CXXVARIABLEREF Doc::alias("cxxVariableRef") + +#define CXXCLASS Doc::alias("cxxClass") +#define CXXCLASSABSTRACT Doc::alias("cxxClassAbstract") +#define CXXCLASSACCESSSPECIFIER Doc::alias("cxxClassAccessSpecifier") +#define CXXCLASSAPIITEMLOCATION Doc::alias("cxxClassAPIItemLocation") +#define CXXCLASSBASECLASS Doc::alias("cxxClassBaseClass") +#define CXXCLASSBASECLASSSTRUCT Doc::alias("cxxClassBaseStruct") +#define CXXCLASSBASEUNION Doc::alias("cxxClassBaseUnion") +#define CXXCLASSDECLARATIONFILE Doc::alias("cxxClassDeclarationFile") +#define CXXCLASSDECLARATIONFILELINE Doc::alias("cxxClassDeclarationFileLine") +#define CXXCLASSDEFINITION Doc::alias("cxxClassDefinition") +#define CXXCLASSDEFINITIONFILE Doc::alias("cxxClassDefinitionFile") +#define CXXCLASSDEFINITIONFILEEND Doc::alias("cxxClassDefinitionFileLineEnd") +#define CXXCLASSDEFINITIONFILESTART Doc::alias("cxxClassDefinitionFileLineStart") +#define CXXCLASSDERIVATION Doc::alias("cxxClassDerivation") +#define CXXCLASSDERIVATIONACCESSSPECIFIER Doc::alias("cxxClassDerivationAccessSpecifier") +#define CXXCLASSDERIVATIONS Doc::alias("cxxClassDerivations") +#define CXXCLASSDERIVATIONVIRTUAL Doc::alias("cxxClassDerivationVirtual") +#define CXXCLASSDETAIL Doc::alias("cxxClassDetail") +#define CXXCLASSENUMERATIONINHERITED Doc::alias("cxxClassEnumerationInherited") +#define CXXCLASSENUMERATORINHERITED Doc::alias("cxxClassEnumeratorInherited") +#define CXXCLASSFUNCTIONINHERITED Doc::alias("cxxClassFunctionInherited") +#define CXXCLASSINHERITS Doc::alias("cxxClassInherits") +#define CXXCLASSINHERITSDETAIL Doc::alias("cxxClassInheritsDetail") +#define CXXCLASSNESTED Doc::alias("cxxClassNested") +#define CXXCLASSNESTEDCLASS Doc::alias("cxxClassNestedClass") +#define CXXCLASSNESTEDDETAIL Doc::alias("cxxClassNestedDetail") +#define CXXCLASSNESTEDSTRUCT Doc::alias("cxxClassNestedStruct") +#define CXXCLASSNESTEDUNION Doc::alias("cxxClassNestedUnion") +#define CXXCLASSTEMPLATEPARAMETER Doc::alias("cxxClassTemplateParameter") +#define CXXCLASSTEMPLATEPARAMETERS Doc::alias("cxxClassTemplateParameters") +#define CXXCLASSTEMPLATEPARAMETERTYPE Doc::alias("cxxClassTemplateParameterType") +#define CXXCLASSVARIABLEINHERITED Doc::alias("cxxClassVariableInherited") + +#define CXXDEFINE Doc::alias("cxxDefine") +#define CXXDEFINEACCESSSPECIFIER Doc::alias("cxxDefineAccessSpecifier") +#define CXXDEFINEAPIITEMLOCATION Doc::alias("cxxDefineAPIItemLocation") +#define CXXDEFINEDECLARATIONFILE Doc::alias("cxxDefineDeclarationFile") +#define CXXDEFINEDECLARATIONFILELINE Doc::alias("cxxDefineDeclarationFileLine") +#define CXXDEFINEDEFINITION Doc::alias("cxxDefineDefinition") +#define CXXDEFINEDETAIL Doc::alias("cxxDefineDetail") +#define CXXDEFINENAMELOOKUP Doc::alias("cxxDefineNameLookup") +#define CXXDEFINEPARAMETER Doc::alias("cxxDefineParameter") +#define CXXDEFINEPARAMETERDECLARATIONNAME Doc::alias("cxxDefineParameterDeclarationName") +#define CXXDEFINEPARAMETERS Doc::alias("cxxDefineParameters") +#define CXXDEFINEPROTOTYPE Doc::alias("cxxDefinePrototype") +#define CXXDEFINEREIMPLEMENTED Doc::alias("cxxDefineReimplemented") + +#define CXXENUMERATION Doc::alias("cxxEnumeration") +#define CXXENUMERATIONACCESSSPECIFIER Doc::alias("cxxEnumerationAccessSpecifier") +#define CXXENUMERATIONAPIITEMLOCATION Doc::alias("cxxEnumerationAPIItemLocation") +#define CXXENUMERATIONDECLARATIONFILE Doc::alias("cxxEnumerationDeclarationFile") +#define CXXENUMERATIONDECLARATIONFILELINE Doc::alias("cxxEnumerationDeclarationFileLine") +#define CXXENUMERATIONDEFINITION Doc::alias("cxxEnumerationDefinition") +#define CXXENUMERATIONDEFINITIONFILE Doc::alias("cxxEnumerationDefinitionFile") +#define CXXENUMERATIONDEFINITIONFILELINEEND Doc::alias("cxxEnumerationDefinitionFileLineEnd") +#define CXXENUMERATIONDEFINITIONFILELINESTART Doc::alias("cxxEnumerationDefinitionFileLineStart") +#define CXXENUMERATIONDETAIL Doc::alias("cxxEnumerationDetail") +#define CXXENUMERATIONNAMELOOKUP Doc::alias("cxxEnumerationNameLookup") +#define CXXENUMERATIONPROTOTYPE Doc::alias("cxxEnumerationPrototype") +#define CXXENUMERATIONREIMPLEMENTED Doc::alias("cxxEnumerationReimplemented") +#define CXXENUMERATIONSCOPEDNAME Doc::alias("cxxEnumerationScopedName") +#define CXXENUMERATOR Doc::alias("cxxEnumerator") +#define CXXENUMERATORAPIITEMLOCATION Doc::alias("cxxEnumeratorAPIItemLocation") +#define CXXENUMERATORDECLARATIONFILE Doc::alias("cxxEnumeratorDeclarationFile") +#define CXXENUMERATORDECLARATIONFILELINE Doc::alias("cxxEnumeratorDeclarationFileLine") +#define CXXENUMERATORINITIALISER Doc::alias("cxxEnumeratorInitialiser") +#define CXXENUMERATORNAMELOOKUP Doc::alias("cxxEnumeratorNameLookup") +#define CXXENUMERATORPROTOTYPE Doc::alias("cxxEnumeratorPrototype") +#define CXXENUMERATORS Doc::alias("cxxEnumerators") +#define CXXENUMERATORSCOPEDNAME Doc::alias("cxxEnumeratorScopedName") + +#define CXXFILE_INFO_TYPES Doc::alias("cxxFile-info-types") +#define CXXFILE_TYPES_DEFAULT Doc::alias("cxxFile-types-default") +#define CXXFILE Doc::alias("cxxFile") +#define CXXFILEAPIITMELOCATION Doc::alias("cxxFileAPIItemLocation") +#define CXXFILEDECLARATIONFILE Doc::alias("cxxFileDeclarationFile") + +#define CXXFUNCTION Doc::alias("cxxFunction") +#define CXXFUNCTIONACCESSSPECIFIER Doc::alias("cxxFunctionAccessSpecifier") +#define CXXFUNCTIONAPIITEMLOCATION Doc::alias("cxxFunctionAPIItemLocation") +#define CXXFUNCTIONCONST Doc::alias("cxxFunctionConst") +#define CXXFUNCTIONCONSTRUCTOR Doc::alias("cxxFunctionConstructor") +#define CXXFUNCTIONDECLARATIONFILE Doc::alias("cxxFunctionDeclarationFile") +#define CXXFUNCTIONDECLARATIONFILELINE Doc::alias("cxxFunctionDeclarationFileLine") +#define CXXFUNCTIONDECLAREDTYPE Doc::alias("cxxFunctionDeclaredType") +#define CXXFUNCTIONDEFINITION Doc::alias("cxxFunctionDefinition") +#define CXXFUNCTIONDEFINITIONFILE Doc::alias("cxxFunctionDefinitionFile") +#define CXXFUNCTIONDEFINITIONFILELINEEND Doc::alias("cxxFunctionDefinitionFileLineEnd") +#define CXXFUNCTIONDEFINITIONFILELINESTART Doc::alias("cxxFunctionDefinitionFileLineStart") +#define CXXFUNCTIONDESTRUCTOR Doc::alias("cxxFunctionDestructor") +#define CXXFUNCTIONDETAIL Doc::alias("cxxFunctionDetail") +#define CXXFUNCTIONEXPLICIT Doc::alias("cxxFunctionExplicit") +#define CXXFUNCTIONINLINE Doc::alias("cxxFunctionInline") +#define CXXFUNCTIONNAMELOOKUP Doc::alias("cxxFunctionNameLookup") +#define CXXFUNCTIONPARAMETER Doc::alias("cxxFunctionParameter") +#define CXXFUNCTIONPARAMETERDECLARATIONNAME Doc::alias("cxxFunctionParameterDeclarationName") +#define CXXFUNCTIONPARAMETERDECLAREDTYPE Doc::alias("cxxFunctionParameterDeclaredType") +#define CXXFUNCTIONPARAMETERDEFAULTVALUE Doc::alias("cxxFunctionParameterDefaultValue") +#define CXXFUNCTIONPARAMETERDEFINITIONNAME Doc::alias("cxxFunctionParameterDefinitionName") +#define CXXFUNCTIONPARAMETERS Doc::alias("cxxFunctionParameters") +#define CXXFUNCTIONPROTOTYPE Doc::alias("cxxFunctionPrototype") +#define CXXFUNCTIONPUREVIRTUAL Doc::alias("cxxFunctionPureVirtual") +#define CXXFUNCTIONREIMPLEMENTED Doc::alias("cxxFunctionReimplemented") +#define CXXFUNCTIONRETURNTYPE Doc::alias("cxxFunctionReturnType") +#define CXXFUNCTIONSCOPEDNAME Doc::alias("cxxFunctionScopedName") +#define CXXFUNCTIONSTORAGECLASSSPECIFIEREXTERN Doc::alias("cxxFunctionStorageClassSpecifierExtern") +#define CXXFUNCTIONSTORAGECLASSSPECIFIERMUTABLE Doc::alias("cxxFunctionStorageClassSpecifierMutable") +#define CXXFUNCTIONSTORAGECLASSSPECIFIERSTATIC Doc::alias("cxxFunctionStorageClassSpecifierStatic") +#define CXXFUNCTIONTEMPLATEPARAMETER Doc::alias("cxxFunctionTemplateParameter") +#define CXXFUNCTIONTEMPLATEPARAMETERS Doc::alias("cxxFunctionTemplateParameters") +#define CXXFUNCTIONTEMPLATEPARAMETERTYPE Doc::alias("cxxFunctionTemplateParameterType") +#define CXXFUNCTIONVIRTUAL Doc::alias("cxxFunctionVirtual") +#define CXXFUNCTIONVOLATILE Doc::alias("cxxFunctionVolatile") + +#define CXXSTRUCT Doc::alias("cxxStruct") +#define CXXSTRUCTABSTRACT Doc::alias("cxxStructAbstract") +#define CXXSTRUCTACCESSSPECIFIER Doc::alias("cxxStructAccessSpecifier") +#define CXXSTRUCTAPIITEMLOCATION Doc::alias("cxxStructAPIItemLocation") +#define CXXSTRUCTBASECLASS Doc::alias("cxxStructBaseClass") +#define CXXSTRUCTBASESTRUCT Doc::alias("cxxStructBaseStruct") +#define CXXSTRUCTBASEUNION Doc::alias("cxxStructBaseUnion") +#define CXXSTRUCTDECLARATIONFILE Doc::alias("cxxStructDeclarationFile") +#define CXXSTRUCTDECLARATIONFILELINE Doc::alias("cxxStructDeclarationFileLine") +#define CXXSTRUCTDEFINITION Doc::alias("cxxStructDefinition") +#define CXXSTRUCTDEFINITIONFILE Doc::alias("cxxStructDefinitionFile") +#define CXXSTRUCTDEFINITIONFILELINEEND Doc::alias("cxxStructDefinitionFileLineEnd") +#define CXXSTRUCTDEFINITIONFILELINESTART Doc::alias("cxxStructDefinitionFileLineStart") +#define CXXSTRUCTDERIVATION Doc::alias("cxxStructDerivation") +#define CXXSTRUCTDERIVATIONACCESSSPECIFIER Doc::alias("cxxStructDerivationAccessSpecifier") +#define CXXSTRUCTDERIVATIONS Doc::alias("cxxStructDerivations") +#define CXXSTRUCTDERIVATIONVIRTUAL Doc::alias("cxxStructDerivationVirtual") +#define CXXSTRUCTDETAIL Doc::alias("cxxStructDetail") +#define CXXSTRUCTENUMERATIONINHERITED Doc::alias("cxxStructEnumerationInherited") +#define CXXSTRUCTENUMERATORINHERITED Doc::alias("cxxStructEnumeratorInherited") +#define CXXSTRUCTFUNCTIONINHERITED Doc::alias("cxxStructFunctionInherited") +#define CXXSTRUCTINHERITS Doc::alias("cxxStructInherits") +#define CXXSTRUCTINHERITSDETAIL Doc::alias("cxxStructInheritsDetail") +#define CXXSTRUCTNESTED Doc::alias("cxxStructNested") +#define CXXSTRUCTNESTEDCLASS Doc::alias("cxxStructNestedClass") +#define CXXSTRUCTNESTEDDETAIL Doc::alias("cxxStructNestedDetail") +#define CXXSTRUCTNESTEDSTRUCT Doc::alias("cxxStructNestedStruct") +#define CXXSTRUCTNESTEDUNION Doc::alias("cxxStructNestedUnion") +#define CXXSTRUCTTEMPLATEPARAMETER Doc::alias("cxxStructTemplateParameter") +#define CXXSTRUCTTEMPLATEPARAMETERS Doc::alias("cxxStructTemplateParameters") +#define CXXSTRUCTTEMPLATEPARAMETERTYPE Doc::alias("cxxStructTemplateParameterType") +#define CXXSTRUCTVARIABLEINHERITED Doc::alias("cxxStructVariableInherited") + +#define CXXTYPEDEF Doc::alias("cxxTypedef") +#define CXXTYPEDEFACCESSSPECIFIER Doc::alias("cxxTypedefAccessSpecifier") +#define CXXTYPEDEFAPIITEMLOCATION Doc::alias("cxxTypedefAPIItemLocation") +#define CXXTYPEDEFDECLARATIONFILE Doc::alias("cxxTypedefDeclarationFile") +#define CXXTYPEDEFDECLARATIONFILELINE Doc::alias("cxxTypedefDeclarationFileLine") +#define CXXTYPEDEFDECLAREDTYPE Doc::alias("cxxTypedefDeclaredType") +#define CXXTYPEDEFDEFINITION Doc::alias("cxxTypedefDefinition") +#define CXXTYPEDEFDETAIL Doc::alias("cxxTypedefDetail") +#define CXXTYPEDEFNAMELOOKUP Doc::alias("cxxTypedefNameLookup") +#define CXXTYPEDEFPROTOTYPE Doc::alias("cxxTypedefPrototype") +#define CXXTYPEDEFREIMPLEMENTED Doc::alias("cxxTypedefReimplemented") +#define CXXTYPEDEFSCOPEDNAME Doc::alias("cxxTypedefScopedName") + +#define CXXUNION Doc::alias("cxxUnion") +#define CXXUNIONABSTRACT Doc::alias("cxxUnionAbstract") +#define CXXUNIONACCESSSPECIFIER Doc::alias("cxxUnionAccessSpecifier") +#define CXXUNIONAPIITEMLOCATION Doc::alias("cxxUnionAPIItemLocation") +#define CXXUNIONDECLARATIONFILE Doc::alias("cxxUnionDeclarationFile") +#define CXXUNIONDECLARATIONFILELINE Doc::alias("cxxUnionDeclarationFileLine") +#define CXXUNIONDEFINITION Doc::alias("cxxUnionDefinition") +#define CXXUNIONDEFINITIONFILE Doc::alias("cxxUnionDefinitionFile") +#define CXXUNIONDEFINITIONFILELINEEND Doc::alias("cxxUnionDefinitionFileLineEnd") +#define CXXUNIONDEFINITIONFILELINESTART Doc::alias("cxxUnionDefinitionFileLineStart") +#define CXXUNIONDETAIL Doc::alias("cxxUnionDetail") +#define CXXUNIONNESTED Doc::alias("cxxUnionNested") +#define CXXUNIONNESTEDCLASS Doc::alias("cxxUnionNestedClass") +#define CXXUNIONNESTEDDETAIL Doc::alias("cxxUnionNestedDetail") +#define CXXUNIONNESTEDSTRUCT Doc::alias("cxxUnionNestedStruct") +#define CXXUNIONNESTEDUNION Doc::alias("cxxUnionNestedUnion") +#define CXXUNIONTEMPLATEPARAMETER Doc::alias("cxxUnionTemplateParameter") +#define CXXUNIONTEMPLATEPARAMETERS Doc::alias("cxxUnionTemplateParameters") +#define CXXUNIONTEMPLATEPARAMETERTYPE Doc::alias("cxxUnionTemplateParameterType") + +#define CXXVARIABLE Doc::alias("cxxVariable") +#define CXXVARIABLEACCESSSPECIFIER Doc::alias("cxxVariableAccessSpecifier") +#define CXXVARIABLEAPIITEMLOCATION Doc::alias("cxxVariableAPIItemLocation") +#define CXXVARIABLECONST Doc::alias("cxxVariableConst") +#define CXXVARIABLEDECLARATIONFILE Doc::alias("cxxVariableDeclarationFile") +#define CXXVARIABLEDECLARATIONFILELINE Doc::alias("cxxVariableDeclarationFileLine") +#define CXXVARIABLEDECLAREDTYPE Doc::alias("cxxVariableDeclaredType") +#define CXXVARIABLEDEFINITION Doc::alias("cxxVariableDefinition") +#define CXXVARIABLEDETAIL Doc::alias("cxxVariableDetail") +#define CXXVARIABLENAMELOOKUP Doc::alias("cxxVariableNameLookup") +#define CXXVARIABLEPROTOTYPE Doc::alias("cxxVariablePrototype") +#define CXXVARIABLEREIMPLEMENTED Doc::alias("cxxVariableReimplemented") +#define CXXVARIABLESCOPEDNAME Doc::alias("cxxVariableScopedName") +#define CXXVARIABLESTORAGECLASSSPECIFIEREXTERN Doc::alias("cxxVariableStorageClassSpecifierExtern") +#define CXXVARIABLESTORAGECLASSSPECIFIERMUTABLE Doc::alias("cxxVariableStorageClassSpecifierMutable") +#define CXXVARIABLESTORAGECLASSSPECIFIERSTATIC Doc::alias("cxxVariableStorageClassSpecifierStatic") +#define CXXVARIABLEVOLATILE Doc::alias("cxxVariableVolatile") + +#define APIREF Doc::alias("apiRef") +#define APINAME Doc::alias("apiName") +#define APIDETAIL Doc::alias("apiDetail") +#define APISYNTAX Doc::alias("apiSyntax") +#define APISYNTAXTEXT Doc::alias("apiSyntaxText") +#define APISYNTAXITEM Doc::alias("apiSyntaxItem") +#define APIDEF Doc::alias("apiDef") +#define APIQUALIFIER Doc::alias("apiQualifier") +#define APIRELATION Doc::alias("apiRelation") +#define APITYPE Doc::alias("apiType") +#define APIARRAY Doc::alias("apiArray") +#define APIDATA Doc::alias("apiData") +#define APIDEFNOTE Doc::alias("apiDefNote") +#define APIDEFITEM Doc::alias("apiDefItem") +#define APIITEMNAME Doc::alias("apiItemName") +#define APIDESC Doc::alias("apiDesc") +#define APIIMPL Doc::alias("apiImpl") + +#define APIPACKAGE Doc::alias("apiPackage") + +#define APICLASSIFIER Doc::alias("apiClassifier") +#define APICLASSIFIERDETAIL Doc::alias("apiClassifierDetail") +#define APICLASSIFIERDEF Doc::alias("apiClassifierDef") +#define APICLASSIFIERMEMBER Doc::alias("apiClassifierMember") +#define APIOTHERCLASSIFIER Doc::alias("apiOtherClassifier") +#define APIBASECLASSIFIER Doc::alias("apiBaseClassifier") + +#define APIOPERATION Doc::alias("apiOperation") +#define APIOPERATIONDETAIL Doc::alias("apiOperationDetail") +#define APIOPERATIONDEF Doc::alias("apiOperationDef") +#define APIRETURN Doc::alias("apiReturn") +#define APIPARAM Doc::alias("apiParam") +#define APIEVENT Doc::alias("apiEvent") +#define APIOPERATIONDEFITEM Doc::alias("apiOperationDefItem") +#define APIOPERATIONCLASSIFIER Doc::alias("apiOperationClassifier") +#define APICONSTRUCTORDEF Doc::alias("apiConstructorDef") + +#define APIVALUE Doc::alias("apiValue") +#define APIVALUEDETAIL Doc::alias("apiValueDetail") +#define APIVALUEDEF Doc::alias("apiValueDef") +#define APIVALUEMEMBER Doc::alias("apiValueMember") +#define APIVALUECLASSIFIER Doc::alias("apiValueClassifier") + +#define APIclassifier Doc::alias("apiclassifier") +#define APIoperation Doc::alias("apioperation") +#define APIpackage Doc::alias("apipackage") +#define APIvalue Doc::alias("apivalue") + +#define APIMAP Doc::alias("apiMap") +#define APIITEMREF Doc::alias("apiItemRef") + +#define SHORTDESC Doc::alias("shortdesc") + QString DitaXmlGenerator::sinceTitles[] = { " New Namespaces", @@ -88,11 +360,11 @@ static void addLink(const QString &linkTarget, QString *res) { if (!linkTarget.isEmpty()) { - *res += "<a href=\""; + *res += "<xref href=\""; *res += linkTarget; *res += "\">"; *res += nestedStuff; - *res += "</a>"; + *res += "</xref>"; } else { *res += nestedStuff; @@ -101,8 +373,7 @@ static void addLink(const QString &linkTarget, DitaXmlGenerator::DitaXmlGenerator() - : helpProjectWriter(0), - inLink(false), + : inLink(false), inContents(false), inSectionHeading(false), inTableHeader(false), @@ -112,32 +383,31 @@ DitaXmlGenerator::DitaXmlGenerator() funcLeftParen("\\S(\\()"), myTree(0), slow(false), - obsoleteLinks(false) + obsoleteLinks(false), + noLinks(0) { } DitaXmlGenerator::~DitaXmlGenerator() { - if (helpProjectWriter) - delete helpProjectWriter; + // nothing yet. } void DitaXmlGenerator::initializeGenerator(const Config &config) { static const struct { const char *key; - const char *left; - const char *right; + const char *tag; } defaults[] = { - { ATOM_FORMATTING_BOLD, "<b>", "</b>" }, - { ATOM_FORMATTING_INDEX, "<!--", "-->" }, - { ATOM_FORMATTING_ITALIC, "<i>", "</i>" }, - { ATOM_FORMATTING_PARAMETER, "<i>", "</i>" }, - { ATOM_FORMATTING_SUBSCRIPT, "<sub>", "</sub>" }, - { ATOM_FORMATTING_SUPERSCRIPT, "<sup>", "</sup>" }, - { ATOM_FORMATTING_TELETYPE, "<tt>", "</tt>" }, - { ATOM_FORMATTING_UNDERLINE, "<u>", "</u>" }, - { 0, 0, 0 } + { ATOM_FORMATTING_BOLD, "b" }, + { ATOM_FORMATTING_INDEX, "<!--" }, + { ATOM_FORMATTING_ITALIC, "i" }, + { ATOM_FORMATTING_PARAMETER, "i" }, + { ATOM_FORMATTING_SUBSCRIPT, "sub" }, + { ATOM_FORMATTING_SUPERSCRIPT, "sup" }, + { ATOM_FORMATTING_TELETYPE, "tt", }, + { ATOM_FORMATTING_UNDERLINE, "u", }, + { 0, 0 } }; Generator::initializeGenerator(config); @@ -145,8 +415,7 @@ void DitaXmlGenerator::initializeGenerator(const Config &config) setImageFileExtensions(QStringList() << "png" << "jpg" << "jpeg" << "gif"); int i = 0; while (defaults[i].key) { - formattingLeftMap().insert(defaults[i].key, defaults[i].left); - formattingRightMap().insert(defaults[i].key, defaults[i].right); + formattingLeftMap().insert(defaults[i].key, defaults[i].tag); i++; } @@ -219,9 +488,6 @@ void DitaXmlGenerator::initializeGenerator(const Config &config) DITAXMLGENERATOR_CUSTOMHEADELEMENTS); codeIndent = config.getInt(CONFIG_CODEINDENT); - helpProjectWriter = new HelpProjectWriter(config, - project.toLower() + - ".qhp"); } void DitaXmlGenerator::terminateGenerator() @@ -235,23 +501,40 @@ QString DitaXmlGenerator::format() } /*! - This is where the html files and dcf files are written. - \note The html file generation is done in the base class, + Create a new GUID, write it to the XML stream + as an "id" attribute, and return it. + */ +QString DitaXmlGenerator::writeGuidAttribute(QString text) +{ + QString guid = QUuid::createUuid().toString(); + name2guidMap.insert(text,guid); + writer.writeAttribute("id",guid); + return guid; +} + +/*! + Looks up \a text in the GUID map. It it finds \a text, + it returns the associated GUID. Otherwise it inserts + \a text into the map with a new GUID, and it returns + the new GUID. + */ +QString DitaXmlGenerator::lookupGuid(QString text) +{ + QMap<QString, QString>::const_iterator i = name2guidMap.find(text); + if (i != name2guidMap.end()) + return i.value(); + QString guid = QUuid::createUuid().toString(); + name2guidMap.insert(text,guid); + return guid; +} + +/*! + This is where the DITA XML files are written. + \note The file generation is done in the base class, PageGenerator::generateTree(). */ void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker) { -#if 0 - // Copy the stylesheets from the directory containing the qdocconf file. - // ### This should be changed to use a special directory in doc/src. - QStringList::ConstIterator styleIter = stylesheets.begin(); - QDir configPath = QDir::current(); - while (styleIter != stylesheets.end()) { - QString filePath = configPath.absoluteFilePath(*styleIter); - Config::copyFile(Location(), filePath, filePath, outputDir()); - ++styleIter; - } -#endif myTree = tree; nonCompatClasses.clear(); mainClasses.clear(); @@ -266,59 +549,13 @@ void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker) findAllFunctions(tree->root()); findAllLegaleseTexts(tree->root()); findAllNamespaces(tree->root()); -#ifdef ZZZ_QDOC_QML - findAllQmlClasses(tree->root()); -#endif findAllSince(tree->root()); PageGenerator::generateTree(tree, marker); - - dcfClassesRoot.ref = "classes.html"; - dcfClassesRoot.title = "Classes"; - qSort(dcfClassesRoot.subsections); - - dcfOverviewsRoot.ref = "overviews.html"; - dcfOverviewsRoot.title = "Overviews"; - qSort(dcfOverviewsRoot.subsections); - - dcfExamplesRoot.ref = "examples.html"; - dcfExamplesRoot.title = "Tutorial & Examples"; - qSort(dcfExamplesRoot.subsections); - - DcfSection qtRoot; - appendDcfSubSection(&qtRoot, dcfClassesRoot); - appendDcfSubSection(&qtRoot, dcfOverviewsRoot); - appendDcfSubSection(&qtRoot, dcfExamplesRoot); - - generateDcf(project.toLower().simplified().replace(" ", "-"), - "index.html", - projectDescription, qtRoot); - generateDcf("designer", - "designer-manual.html", - "Qt Designer Manual", - dcfDesignerRoot); - generateDcf("linguist", - "linguist-manual.html", - "Qt Linguist Manual", - dcfLinguistRoot); - generateDcf("assistant", - "assistant-manual.html", - "Qt Assistant Manual", - dcfAssistantRoot); - generateDcf("qmake", - "qmake-manual.html", - "qmake Manual", - dcfQmakeRoot); - - QString fileBase = project.toLower().simplified().replace(" ", "-"); - generateIndex(fileBase, projectUrl, projectDescription); - generatePageIndex(outputDir() + "/" + fileBase + ".pageindex", marker); - - helpProjectWriter->generate(myTree); } -void DitaXmlGenerator::startText(const Node * /* relative */, - CodeMarker * /* marker */) +void DitaXmlGenerator::startText(const Node* /* relative */, + CodeMarker* /* marker */) { inLink = false; inContents = false; @@ -334,19 +571,21 @@ void DitaXmlGenerator::startText(const Node * /* relative */, Generate html from an instance of Atom. */ int DitaXmlGenerator::generateAtom(const Atom *atom, - const Node *relative, - CodeMarker *marker) + const Node *relative, + CodeMarker *marker) { int skipAhead = 0; + QString hx; static bool in_para = false; - + QString guid; + switch (atom->type()) { case Atom::AbstractLeft: break; case Atom::AbstractRight: break; case Atom::AutoLink: - if (!inLink && !inContents && !inSectionHeading) { + if ((noLinks > 0) && !inLink && !inContents && !inSectionHeading) { const Node *node = 0; QString link = getLink(atom, relative, marker, &node); if (!link.isEmpty()) { @@ -355,11 +594,11 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, endLink(); } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string())); } } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string())); } break; case Atom::BaseName: @@ -369,8 +608,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, skipAhead = skipAtoms(atom, Atom::BriefRight); break; } - - out() << "<p>"; + writer.writeStartElement(SHORTDESC); if (relative->type() == Node::Property || relative->type() == Node::Variable) { QString str; @@ -385,88 +623,102 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, str[0] = str[0].toLower(); if (str.right(1) == ".") str.truncate(str.length() - 1); - out() << "This "; + writer.writeCharacters("This "); if (relative->type() == Node::Property) - out() << "property"; + writer.writeCharacters("property"); else - out() << "variable"; + writer.writeCharacters("variable"); QStringList words = str.split(" "); if (!(words.first() == "contains" || words.first() == "specifies" || words.first() == "describes" || words.first() == "defines" || words.first() == "holds" || words.first() == "determines")) - out() << " holds "; + writer.writeCharacters(" holds "); else - out() << " "; - out() << str << "."; + writer.writeCharacters(" "); + writer.writeCharacters(str + "."); } break; case Atom::BriefRight: - if (relative->type() != Node::Fake) - out() << "</p>\n"; + if (relative->type() != Node::Fake) { + writer.writeEndElement(); // </shortdesc> + } break; case Atom::C: - out() << formattingLeftMap()[ATOM_FORMATTING_TELETYPE]; + writer.writeStartElement(formattingLeftMap()[ATOM_FORMATTING_TELETYPE]); if (inLink) { - out() << protectEnc(plainCode(atom->string())); + writer.writeCharacters(protectEnc(plainCode(atom->string()))); } else { - out() << highlightedCode(atom->string(), marker, relative); + writer.writeCharacters(highlightedCode(atom->string(), marker, relative)); } - out() << formattingRightMap()[ATOM_FORMATTING_TELETYPE]; + writer.writeEndElement(); // sse writeStartElement() above break; case Atom::Code: - out() << "<pre class=\"highlightedCode\">" - << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), - marker,relative)) - << "</pre>\n"; + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), + marker, + relative))); + writer.writeEndElement(); // </pre> break; #ifdef QDOC_QML case Atom::Qml: - out() << "<pre class=\"highlightedCode\">" - << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), - marker,relative)) - << "</pre>\n"; + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), + marker, + relative))); + writer.writeEndElement(); // pre break; #endif case Atom::CodeNew: - out() << "<p>you can rewrite it as</p>\n" - << "<pre class=\"highlightedCode\">" - << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), - marker,relative)) - << "</pre>\n"; + writer.writeStartElement("p"); + writer.writeCharacters("you can rewrite it as"); + writer.writeEndElement(); // </p> + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), + marker, + relative))); + writer.writeEndElement(); // </pre> break; case Atom::CodeOld: - out() << "<p>For example, if you have code like</p>\n"; + writer.writeStartElement("p"); + writer.writeCharacters("For example, if you have code like"); + writer.writeEndElement(); // </p> // fallthrough case Atom::CodeBad: - out() << "<pre class=\"highlightedCode\">" - << trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string())))) - << "</pre>\n"; + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string()))))); + writer.writeEndElement(); // </pre> break; case Atom::FootnoteLeft: // ### For now if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p> in_para = false; } - out() << "<!-- "; + writer.writeCharacters("<!-- "); break; case Atom::FootnoteRight: // ### For now - out() << "-->"; + writer.writeCharacters("-->"); break; case Atom::FormatElse: case Atom::FormatEndif: case Atom::FormatIf: break; case Atom::FormattingLeft: - out() << formattingLeftMap()[atom->string()]; + writer.writeStartElement(formattingLeftMap()[atom->string()]); if (atom->string() == ATOM_FORMATTING_PARAMETER) { if (atom->next() != 0 && atom->next()->type() == Atom::String) { QRegExp subscriptRegExp("([a-z]+)_([0-9n])"); if (subscriptRegExp.exactMatch(atom->next()->string())) { - out() << subscriptRegExp.cap(1) << "<sub>" - << subscriptRegExp.cap(2) << "</sub>"; + writer.writeCharacters(subscriptRegExp.cap(1)); + writer.writeStartElement("sub"); + writer.writeCharacters(subscriptRegExp.cap(2)); + writer.writeEndElement(); // </sub> skipAhead = 1; } } @@ -477,7 +729,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, endLink(); } else { - out() << formattingRightMap()[atom->string()]; + writer.writeEndElement(); // ? } break; case Atom::AnnotatedList: @@ -676,30 +928,31 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, /* First generate the table of contents. */ - out() << "<ul>\n"; + writer.writeStartElement("ul"); s = sections.constBegin(); while (s != sections.constEnd()) { if (!(*s).members.isEmpty()) { - out() << "<li>" - << "<a href=\"#" - << Doc::canonicalTitle((*s).name) - << "\">" - << (*s).name - << "</a></li>\n"; + writer.writeStartElement("li"); + writer.writeStartElement("xref"); + writer.writeAttribute("href",QString("#" + Doc::canonicalTitle((*s).name))); + writer.writeCharacters((*s).name); + writer.writeEndElement(); // </xref> + writer.writeEndElement(); // </li> } ++s; } - out() << "</ul>\n"; + writer.writeEndElement(); // </ul> int idx = 0; s = sections.constBegin(); while (s != sections.constEnd()) { if (!(*s).members.isEmpty()) { - out() << "<a name=\"" - << Doc::canonicalTitle((*s).name) - << "\"></a>\n"; - out() << "<h3>" << protectEnc((*s).name) << "</h3>\n"; + writer.writeStartElement("p"); + writeGuidAttribute(Doc::canonicalTitle((*s).name)); + writer.writeAttribute("outputclass","h3"); + writer.writeCharacters(protectEnc((*s).name)); + writer.writeEndElement(); // </p> if (idx == Class) generateCompactList(0, marker, ncmap.value(), false, QString("Q")); else if (idx == QmlClass) @@ -719,17 +972,18 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, pmap = parentmaps.begin(); while (pmap != parentmaps.end()) { NodeList nlist = pmap->values(); - out() << "<p>Class "; - - out() << "<a href=\"" - << linkForNode(pmap.key(), 0) - << "\">"; + writer.writeStartElement("p"); + writer.writeCharacters("Class "); + writer.writeStartElement("xref"); + writer.writeAttribute("href",linkForNode(pmap.key(), 0)); QStringList pieces = fullName(pmap.key(), 0, marker).split("::"); - out() << protectEnc(pieces.last()); - out() << "</a>" << ":</p>\n"; + writer.writeCharacters(protectEnc(pieces.last())); + writer.writeEndElement(); // </xref> + writer.writeCharacters(":"); + writer.writeEndElement(); // </p> generateSection(nlist, 0, marker, CodeMarker::Summary); - out() << "<br/>"; + writer.writeEmptyElement("br"); ++pmap; } } @@ -749,33 +1003,40 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, QString text; if (atom->next() != 0) text = atom->next()->string(); - if (atom->type() == Atom::Image) - out() << "<p class=\"centerAlign\">"; + if (atom->type() == Atom::Image) { + writer.writeStartElement("p"); + writer.writeAttribute("outputclass","centerAlign"); + } if (fileName.isEmpty()) { - out() << "<font color=\"red\">[Missing image " - << protectEnc(atom->string()) << "]</font>"; + writer.writeStartElement("font"); + writer.writeAttribute("color","red"); + writer.writeCharacters("[Missing image: "); + writer.writeCharacters(protectEnc(atom->string())); + writer.writeEndElement(); // </font> } else { - out() << "<img src=\"" << protectEnc(fileName) << "\""; + writer.writeStartElement("img"); + writer.writeAttribute("src",protectEnc(fileName)); if (!text.isEmpty()) - out() << " alt=\"" << protectEnc(text) << "\""; - out() << " />"; - helpProjectWriter->addExtraFile(fileName); + writer.writeAttribute("alt",protectEnc(text)); + writer.writeEndElement(); // </img> } if (atom->type() == Atom::Image) - out() << "</p>"; + writer.writeEndElement(); // </p> } break; case Atom::ImageText: + // nothing break; case Atom::LegaleseLeft: - out() << "<div class=\"LegaleseLeft\">"; + writer.writeStartElement("p"); + writer.writeAttribute("outputclass","legalese"); break; case Atom::LegaleseRight: - out() << "</div>"; + writer.writeEndElement(); // </p> break; case Atom::LineBreak: - out() << "<br/>"; + writer.writeEmptyElement("br"); break; case Atom::Link: { @@ -799,69 +1060,83 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, break; case Atom::ListLeft: if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p> in_para = false; } if (atom->string() == ATOM_LIST_BULLET) { - out() << "<ul>\n"; + writer.writeStartElement("ul"); } else if (atom->string() == ATOM_LIST_TAG) { - out() << "<dl>\n"; + writer.writeStartElement("dl"); } else if (atom->string() == ATOM_LIST_VALUE) { threeColumnEnumValueTable = isThreeColumnEnumValueTable(atom); if (threeColumnEnumValueTable) { - out() << "<table class=\"valuelist\">"; - // << "<tr>" - if (++numTableRows % 2 == 1) - out() << "<tr class=\"odd\">"; - else - out() << "<tr class=\"even\">"; - - out() << "<tr><th>Constant</th>" - << "<th>Value</th>" - << "<th>Description</th></tr>\n"; + writer.writeStartElement("table"); + writer.writeAttribute("outputclass","valuelist"); + writer.writeStartElement("tr"); + if (++numTableRows % 2 == 1) + writer.writeAttribute("outputclass","odd"); + else + writer.writeAttribute("outputclass","even"); + writer.writeStartElement("th"); + writer.writeCharacters("Constant"); + writer.writeEndElement(); // </th> + writer.writeStartElement("th"); + writer.writeCharacters("Value"); + writer.writeEndElement(); // </th> + writer.writeStartElement("th"); + writer.writeCharacters("Description"); + writer.writeEndElement(); // </th> + writer.writeEndElement(); // </tr> } else { - out() << "<table class=\"valuelist\">" - << "<tr><th>Constant</th><th>Value</th></tr>\n"; + writer.writeStartElement("table"); + writer.writeAttribute("outputclass","valuelist"); + writer.writeStartElement("tr"); + writer.writeStartElement("th"); + writer.writeCharacters("Constant"); + writer.writeEndElement(); // </th> + writer.writeStartElement("th"); + writer.writeCharacters("Value"); + writer.writeEndElement(); // </th> + writer.writeEndElement(); // </tr> } } else { - out() << "<ol type="; - if (atom->string() == ATOM_LIST_UPPERALPHA) { - out() << "\"A\""; - } /* why type? */ - else if (atom->string() == ATOM_LIST_LOWERALPHA) { - out() << "\"a\""; - } - else if (atom->string() == ATOM_LIST_UPPERROMAN) { - out() << "\"I\""; - } - else if (atom->string() == ATOM_LIST_LOWERROMAN) { - out() << "\"i\""; - } - else { // (atom->string() == ATOM_LIST_NUMERIC) - out() << "\"1\""; - } + writer.writeStartElement("ol"); + if (atom->string() == ATOM_LIST_UPPERALPHA) + writer.writeAttribute("type","A"); + else if (atom->string() == ATOM_LIST_LOWERALPHA) + writer.writeAttribute("type","a"); + else if (atom->string() == ATOM_LIST_UPPERROMAN) + writer.writeAttribute("type","I"); + else if (atom->string() == ATOM_LIST_LOWERROMAN) + writer.writeAttribute("type","i"); + else // (atom->string() == ATOM_LIST_NUMERIC) + writer.writeAttribute("type","1"); if (atom->next() != 0 && atom->next()->string().toInt() != 1) - out() << " start=\"" << atom->next()->string() << "\""; - out() << ">\n"; + writer.writeAttribute("start",atom->next()->string()); } break; case Atom::ListItemNumber: + // nothing break; case Atom::ListTagLeft: if (atom->string() == ATOM_LIST_TAG) { - out() << "<dt>"; + writer.writeStartElement("dt"); } else { // (atom->string() == ATOM_LIST_VALUE) - // ### Trenton - - out() << "<tr><td class=\"topAlign\"><tt>" - << protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(), - relative))) - << "</tt></td><td class=\" topAlign\">"; + writer.writeStartElement("tr"); + writer.writeStartElement("td"); + writer.writeAttribute("outputclass","topAlign"); + writer.writeStartElement("tt"); + writer.writeCharacters(protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(), + relative)))); + writer.writeEndElement(); // </tt> + writer.writeEndElement(); // </td> + writer.writeStartElement("td"); + writer.writeAttribute("outputclass","topAlign"); QString itemValue; if (relative->type() == Node::Enum) { @@ -870,188 +1145,179 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, } if (itemValue.isEmpty()) - out() << "?"; - else - out() << "<tt>" << protectEnc(itemValue) << "</tt>"; - + writer.writeCharacters("?"); + else { + writer.writeStartElement("tt"); + writer.writeCharacters(protectEnc(itemValue)); + writer.writeEndElement(); // </tt> + } skipAhead = 1; } break; case Atom::ListTagRight: if (atom->string() == ATOM_LIST_TAG) - out() << "</dt>\n"; + writer.writeEndElement(); // </dt> break; case Atom::ListItemLeft: if (atom->string() == ATOM_LIST_TAG) { - out() << "<dd>"; + writer.writeStartElement("dd"); } else if (atom->string() == ATOM_LIST_VALUE) { if (threeColumnEnumValueTable) { - out() << "</td><td class=\"topAlign\">"; + writer.writeEndElement(); // </td> + writer.writeStartElement("td"); + writer.writeAttribute("outputclass","topAlign"); if (matchAhead(atom, Atom::ListItemRight)) - out() << " "; + writer.writeCharacters(" "); } } else { - out() << "<li>"; + writer.writeStartElement("li"); } if (matchAhead(atom, Atom::ParaLeft)) skipAhead = 1; break; case Atom::ListItemRight: if (atom->string() == ATOM_LIST_TAG) { - out() << "</dd>\n"; + writer.writeEndElement(); // </dd> } else if (atom->string() == ATOM_LIST_VALUE) { - out() << "</td></tr>\n"; + writer.writeEndElement(); // </td> + writer.writeEndElement(); // </tr> } else { - out() << "</li>\n"; + writer.writeEndElement(); // </li> } break; case Atom::ListRight: if (atom->string() == ATOM_LIST_BULLET) { - out() << "</ul>\n"; + writer.writeEndElement(); // </ul> } else if (atom->string() == ATOM_LIST_TAG) { - out() << "</dl>\n"; + writer.writeEndElement(); // </dl> } else if (atom->string() == ATOM_LIST_VALUE) { - out() << "</table>\n"; + writer.writeEndElement(); // </table> } else { - out() << "</ol>\n"; + writer.writeEndElement(); // </ol> } break; case Atom::Nop: + // nothing break; case Atom::ParaLeft: - out() << "<p>"; + writer.writeStartElement("p"); in_para = true; break; case Atom::ParaRight: endLink(); if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p? in_para = false; } - //if (!matchAhead(atom, Atom::ListItemRight) && !matchAhead(atom, Atom::TableItemRight)) - // out() << "</p>\n"; break; case Atom::QuotationLeft: - out() << "<blockquote>"; + writer.writeStartElement("blockquote"); break; case Atom::QuotationRight: - out() << "</blockquote>\n"; + writer.writeEndElement(); // </blockquote> break; case Atom::RawString: - out() << atom->string(); + writer.writeCharacters(atom->string()); break; case Atom::SectionLeft: -#if 0 - { - int nextLevel = atom->string().toInt(); - if (sectionNumber.size() < nextLevel) { - do { - sectionNumber.append("1"); - } while (sectionNumber.size() < nextLevel); - } - else { - while (sectionNumber.size() > nextLevel) { - sectionNumber.removeLast(); - } - sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1); - } - out() << "<a name=\"sec-" << sectionNumber.join("-") << "\"></a>\n"; - } -#else - out() << "<a name=\"" << Doc::canonicalTitle(Text::sectionHeading(atom).toString()) - << "\"></a>\n"; -#endif + writer.writeStartElement("p"); + writeGuidAttribute(Doc::canonicalTitle(Text::sectionHeading(atom).toString())); + writer.writeAttribute("outputclass","target"); + writer.writeCharacters(protectEnc(Text::sectionHeading(atom).toString())); + writer.writeEndElement(); // </p> break; case Atom::SectionRight: + // nothing break; case Atom::SectionHeadingLeft: - out() << "<h" + QString::number(atom->string().toInt() + hOffset(relative)) + ">"; + writer.writeStartElement("p"); + hx = "h" + QString::number(atom->string().toInt() + hOffset(relative)); + writer.writeAttribute("outputclass",hx); inSectionHeading = true; break; case Atom::SectionHeadingRight: - out() << "</h" + QString::number(atom->string().toInt() + hOffset(relative)) + ">\n"; + writer.writeEndElement(); // </p> (see case Atom::SectionHeadingLeft) inSectionHeading = false; break; case Atom::SidebarLeft: + // nothing break; case Atom::SidebarRight: + // nothing break; case Atom::String: if (inLink && !inContents && !inSectionHeading) { generateLink(atom, relative, marker); } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string())); } break; case Atom::TableLeft: if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p> in_para = false; } - if (!atom->string().isEmpty()) { - if (atom->string().contains("%")) - out() << "<table class=\"generic\">\n "; // width=\"" << atom->string() << "\">\n "; - else { - out() << "<table class=\"generic\">\n"; - } - } - else { - out() << "<table class=\"generic\">\n"; - } + writer.writeStartElement("table"); + writer.writeAttribute("outputclass","generic"); numTableRows = 0; break; case Atom::TableRight: - out() << "</table>\n"; + writer.writeEndElement(); // </table> break; case Atom::TableHeaderLeft: - out() << "<thead><tr class=\"qt-style topAlign\">"; + writer.writeStartElement("thead"); + writer.writeStartElement("tr"); + writer.writeAttribute("outputclass","qt-style topAlign"); inTableHeader = true; break; case Atom::TableHeaderRight: - out() << "</tr>"; + writer.writeEndElement(); // </tr> if (matchAhead(atom, Atom::TableHeaderLeft)) { skipAhead = 1; - out() << "\n<tr class=\"qt-style topAlign\">"; + writer.writeStartElement("tr"); + writer.writeAttribute("outputclass","qt-style topAlign"); } - else { - out() << "</thead>\n"; + else { + writer.writeEndElement(); // </thead> inTableHeader = false; } break; case Atom::TableRowLeft: + writer.writeStartElement("tr"); if (++numTableRows % 2 == 1) - out() << "<tr class=\"odd topAlign\">"; + writer.writeAttribute("outputclass","odd topAlign"); else - out() << "<tr class=\"even topAlign\">"; + writer.writeAttribute("outputclass","even topAlign"); break; case Atom::TableRowRight: - out() << "</tr>\n"; + writer.writeEndElement(); // </tr>\n"; break; case Atom::TableItemLeft: { if (inTableHeader) - out() << "<th"; + writer.writeStartElement("th"); else - out() << "<td"; + writer.writeStartElement("td"); QStringList spans = atom->string().split(","); if (spans.size() == 2) { +#if zzz + if (spans.at(0) != "1") out() << " colspan=\"" << spans.at(0) << "\""; if (spans.at(1) != "1") out() << " rowspan=\"" << spans.at(1) << "\""; - if (inTableHeader) - out() << ">"; - else - out() << "><p>"; +#endif + if (!inTableHeader) + writer.writeStartElement("p"); } if (matchAhead(atom, Atom::ParaLeft)) skipAhead = 1; @@ -1059,9 +1325,11 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, break; case Atom::TableItemRight: if (inTableHeader) - out() << "</th>"; - else - out() << "</p></td>"; + writer.writeEndElement(); // </th> + else { + writer.writeEndElement(); // </p> + writer.writeEndElement(); // </td> + } if (matchAhead(atom, Atom::ParaLeft)) skipAhead = 1; break; @@ -1095,14 +1363,23 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, } break; case Atom::Target: - out() << "<a name=\"" << Doc::canonicalTitle(atom->string()) << "\"></a>"; + writer.writeStartElement("p"); + writeGuidAttribute(Doc::canonicalTitle(atom->string())); + writer.writeAttribute("outputclass","target"); + writer.writeCharacters(protectEnc(atom->string())); + writer.writeEndElement(); // </p> break; case Atom::UnhandledFormat: - out() << "<b class=\"redFont\"><Missing DITAXML></b>"; + writer.writeStartElement("b"); + writer.writeAttribute("outputclass","redFont"); + writer.writeCharacters("<Missing DITAXML>"); + writer.writeEndElement(); // </b> break; case Atom::UnknownCommand: - out() << "<b class=\"redFont\"><code>\\" << protectEnc(atom->string()) - << "</code></b>"; + writer.writeStartElement("b"); + writer.writeAttribute("outputclass","redFont code"); + writer.writeCharacters(protectEnc(atom->string())); + writer.writeEndElement(); // </b> break; #ifdef QDOC_QML case Atom::QmlText: @@ -1111,7 +1388,8 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, break; #endif default: - unknownAtom(atom); + // unknownAtom(atom); + break; } return skipAhead; } @@ -1119,13 +1397,13 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, /*! Generate a reference page for a C++ class. */ -void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, - CodeMarker *marker) +void +DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* marker) { QList<Section> sections; QList<Section>::ConstIterator s; - const ClassNode *classe = 0; + const ClassNode* cn = 0; const NamespaceNode *namespasse = 0; QString title; @@ -1138,63 +1416,87 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, title = rawTitle + " Namespace"; } else if (inner->type() == Node::Class) { - classe = static_cast<const ClassNode *>(inner); + cn = static_cast<const ClassNode *>(inner); rawTitle = marker->plainName(inner); fullTitle = marker->plainFullName(inner); title = rawTitle + " Class Reference"; - } - DcfSection classSection; - classSection.title = title; - classSection.ref = linkForNode(inner, 0); - classSection.keywords += qMakePair(inner->name(), classSection.ref); + generateHeader(inner); + + writer.writeStartElement(CXXCLASS); + writeGuidAttribute(fullTitle); + writer.writeStartElement(APINAME); + writer.writeCharacters(fullTitle); + writer.writeEndElement(); // </apiName> + + generateBrief(inner, marker); + + writer.writeStartElement(CXXCLASSDETAIL); + writer.writeStartElement(CXXCLASSDEFINITION); + writer.writeStartElement(CXXCLASSACCESSSPECIFIER); + writer.writeAttribute("value",inner->accessString()); + writer.writeEndElement(); // <cxxClassAccessSpecifier> + writeDerivations(cn, marker); + writeLocation(cn, marker); + writer.writeEndElement(); // <cxxClassDefinition> + writer.writeStartElement(APIDESC); + + if (!inner->doc().isEmpty()) { + writer.writeStartElement("p"); + writer.writeAttribute("outputclass","h2"); + writer.writeCharacters("Detailed Description"); + writer.writeEndElement(); // </p> + generateBody(inner, marker); + // generateAlsoList(inner, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxClassDetail> + writer.writeEndElement(); // </cxxClass> + } +#ifdef WRITE_HTML Text subtitleText; if (rawTitle != fullTitle) subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")" << Atom(Atom::LineBreak); -#if 0 - // No longer used because the modeule name is a breadcrumb. - QString fixedModule = inner->moduleName(); - if (fixedModule == "Qt3SupportLight") - fixedModule = "Qt3Support"; - if (!fixedModule.isEmpty()) - subtitleText << "[" << Atom(Atom::AutoLink, fixedModule) << " module]"; - - if (fixedModule.isEmpty()) { - QMultiMap<QString, QString> publicGroups = myTree->publicGroups(); - QList<QString> groupNames = publicGroups.values(inner->name()); - if (!groupNames.isEmpty()) { - qSort(groupNames.begin(), groupNames.end()); - subtitleText << "["; - for (int j=0; j<groupNames.count(); j++) { - subtitleText << Atom(Atom::AutoLink, groupNames[j]); - if (j<groupNames.count()-1) - subtitleText <<", "; - } - subtitleText << "]"; - } + QString shortVersion; + shortVersion = project + " " + shortVersion + ": "; + shortVersion = myTree->version(); + if (shortVersion.count(QChar('.')) == 2) + shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); + if (!shortVersion.isEmpty()) { + if (project == "QSA") + shortVersion = "QSA " + shortVersion + ": "; + else + shortVersion = "Qt " + shortVersion + ": "; } -#endif - generateHeader(title, inner, marker); + out() << " <title>" << shortVersion << protectEnc(title) << "</title>\n"; + +#if 0 + out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version()); + generateBreadCrumbs(title,node,marker); + out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version()); +#endif + sections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay); generateTableOfContents(inner,marker,§ions); generateTitle(title, subtitleText, SmallSubTitle, inner, marker); #ifdef QDOC_QML - if (classe && !classe->qmlElement().isEmpty()) { - generateInstantiatedBy(classe,marker); + if (cn && !cn->qmlElement().isEmpty()) { + generateInstantiatedBy(cn,marker); } #endif generateBrief(inner, marker); generateIncludes(inner, marker); generateStatus(inner, marker); - if (classe) { - generateInherits(classe, marker); - generateInheritedBy(classe, marker); + if (cn) { + generateInherits(cn, marker); + generateInheritedBy(cn, marker); } generateThreadSafeness(inner, marker); generateSince(inner, marker); @@ -1203,22 +1505,22 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, QString membersLink = generateListOfAllMemberFile(inner, marker); if (!membersLink.isEmpty()) - out() << "<li><a href=\"" << membersLink << "\">" - << "List of all members, including inherited members</a></li>\n"; + out() << "<li><xref href=\"" << membersLink << "\">" + << "List of all members, including inherited members</xref></li>\n"; QString obsoleteLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Obsolete); if (!obsoleteLink.isEmpty()) - out() << "<li><a href=\"" << obsoleteLink << "\">" - << "Obsolete members</a></li>\n"; + out() << "<li><xref href=\"" << obsoleteLink << "\">" + << "Obsolete members</xref></li>\n"; QString compatLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Compat); if (!compatLink.isEmpty()) - out() << "<li><a href=\"" << compatLink << "\">" - << "Qt 3 support members</a></li>\n"; + out() << "<li><xref href=\"" << compatLink << "\">" + << "Qt 3 support members</xref></li>\n"; out() << "</ul>\n"; @@ -1335,8 +1637,6 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, names << plainCode(marker->markedUpEnumValue(enumName, enume)); } - foreach (const QString &name, names) - classSection.keywords += qMakePair(name,linkForNode(*m,0)); } ++m; } @@ -1344,28 +1644,7 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, out() << "</div>\n"; // QTBUG-9504 ++s; } - generateFooter(inner); - - if (!membersLink.isEmpty()) { - DcfSection membersSection; - membersSection.title = "List of all members"; - membersSection.ref = membersLink; - appendDcfSubSection(&classSection, membersSection); - } - if (!obsoleteLink.isEmpty()) { - DcfSection obsoleteSection; - obsoleteSection.title = "Obsolete members"; - obsoleteSection.ref = obsoleteLink; - appendDcfSubSection(&classSection, obsoleteSection); - } - if (!compatLink.isEmpty()) { - DcfSection compatSection; - compatSection.title = "Qt 3 support members"; - compatSection.ref = compatLink; - appendDcfSubSection(&classSection, compatSection); - } - - appendDcfSubSection(&dcfClassesRoot, classSection); +#endif } /*! @@ -1374,16 +1653,14 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, */ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker) { + return; // zzz + SubTitleSize subTitleSize = LargeSubTitle; - DcfSection fakeSection; - fakeSection.title = fake->fullTitle(); - fakeSection.ref = linkForNode(fake, 0); - QList<Section> sections; QList<Section>::const_iterator s; - QString fullTitle = fake->fullTitle(); QString htmlTitle = fullTitle; + if (fake->subType() == Node::File && !fake->subTitle().isEmpty()) { subTitleSize = SmallSubTitle; htmlTitle += " (" + fake->subTitle() + ")"; @@ -1393,7 +1670,7 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker htmlTitle = fullTitle; } - generateHeader(htmlTitle, fake, marker); + generateHeader(fake); /* Generate the TOC for the new doc format. @@ -1433,43 +1710,24 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker QString membersLink = generateListOfAllMemberFile(fake, marker); if (!membersLink.isEmpty()) - out() << "<li><a href=\"" << membersLink << "\">" - << "List of all members, including inherited members</a></li>\n"; + out() << "<li><xref href=\"" << membersLink << "\">" + << "List of all members, including inherited members</xref></li>\n"; QString obsoleteLink = generateLowStatusMemberFile(fake, marker, CodeMarker::Obsolete); if (!obsoleteLink.isEmpty()) - out() << "<li><a href=\"" << obsoleteLink << "\">" - << "Obsolete members</a></li>\n"; + out() << "<li><xref href=\"" << obsoleteLink << "\">" + << "Obsolete members</xref></li>\n"; QString compatLink = generateLowStatusMemberFile(fake, marker, CodeMarker::Compat); if (!compatLink.isEmpty()) - out() << "<li><a href=\"" << compatLink << "\">" - << "Qt 3 support members</a></li>\n"; + out() << "<li><xref href=\"" << compatLink << "\">" + << "Qt 3 support members</xref></li>\n"; out() << "</ul>\n"; - - if (!membersLink.isEmpty()) { - DcfSection membersSection; - membersSection.title = "List of all members"; - membersSection.ref = membersLink; - appendDcfSubSection(&fakeSection, membersSection); - } - if (!obsoleteLink.isEmpty()) { - DcfSection obsoleteSection; - obsoleteSection.title = "Obsolete members"; - obsoleteSection.ref = obsoleteLink; - appendDcfSubSection(&fakeSection, obsoleteSection); - } - if (!compatLink.isEmpty()) { - DcfSection compatSection; - compatSection.title = "Qt 3 support members"; - compatSection.ref = compatLink; - appendDcfSubSection(&fakeSection, compatSection); - } } #ifdef QDOC_QML else if (fake->subType() == Node::QmlClass) { @@ -1504,13 +1762,10 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker while (m != (*s).members.end()) { generateDetailedQmlMember(*m, fake, marker); out() << "<br/>\n"; - fakeSection.keywords += qMakePair((*m)->name(), - linkForNode(*m,0)); ++m; } ++s; } - generateFooter(fake); return; } #endif @@ -1546,8 +1801,6 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker generateAnnotatedList(fake, marker, groupMembersMap); } - fakeSection.keywords += qMakePair(fakeSection.title, fakeSection.ref); - sections = marker->sections(fake, CodeMarker::Detailed, CodeMarker::Okay); s = sections.begin(); while (s != sections.end()) { @@ -1557,57 +1810,32 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker NodeList::ConstIterator m = (*s).members.begin(); while (m != (*s).members.end()) { generateDetailedMember(*m, fake, marker); - fakeSection.keywords += qMakePair((*m)->name(), linkForNode(*m, 0)); ++m; } ++s; } - generateFooter(fake); - - if (fake->subType() == Node::Example) { - appendDcfSubSection(&dcfExamplesRoot, fakeSection); - } - else if (fake->subType() != Node::File) { - QString contentsPage = fake->links().value(Node::ContentsLink).first; - - if (contentsPage == "Qt Designer Manual") { - appendDcfSubSection(&dcfDesignerRoot, fakeSection); - } - else if (contentsPage == "Qt Linguist Manual") { - appendDcfSubSection(&dcfLinguistRoot, fakeSection); - } - else if (contentsPage == "Qt Assistant Manual") { - appendDcfSubSection(&dcfAssistantRoot, fakeSection); - } - else if (contentsPage == "qmake Manual") { - appendDcfSubSection(&dcfQmakeRoot, fakeSection); - } - else { - appendDcfSubSection(&dcfOverviewsRoot, fakeSection); - } - } } /*! - Returns "html" for this subclass of Generator. + Returns "xml" for this subclass of Generator. */ QString DitaXmlGenerator::fileExtension(const Node * /* node */) const { - return "html"; + return "xml"; } /*! Output breadcrumb list in the html file. */ void DitaXmlGenerator::generateBreadCrumbs(const QString& title, - const Node *node, - CodeMarker *marker) + const Node *node, + CodeMarker *marker) { Text breadcrumb; if (node->type() == Node::Class) { const ClassNode* cn = static_cast<const ClassNode*>(node); QString name = node->moduleName(); - out() << " <li><a href=\"modules.html\">All Modules</a></li>"; + out() << " <li><xref href=\"modules.html\">All Modules</xref></li>"; if (!name.isEmpty()) { out() << " <li>"; breadcrumb << Atom(Atom::AutoLink,name); @@ -1625,7 +1853,7 @@ void DitaXmlGenerator::generateBreadCrumbs(const QString& title, else if (node->type() == Node::Fake) { const FakeNode* fn = static_cast<const FakeNode*>(node); if (node->subType() == Node::Module) { - out() << " <li><a href=\"modules.html\">All Modules</a></li>"; + out() << " <li><xref href=\"modules.html\">All Modules</xref></li>"; QString name = node->name(); if (!name.isEmpty()) { out() << " <li>"; @@ -1636,125 +1864,85 @@ void DitaXmlGenerator::generateBreadCrumbs(const QString& title, } else if (node->subType() == Node::Group) { if (fn->name() == QString("modules")) - out() << " <li><a href=\"modules.html\">All Modules</a></li>"; + out() << " <li><xref href=\"modules.html\">All Modules</xref></li>"; else { - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } } else if (node->subType() == Node::Page) { if (fn->name() == QString("examples.html")) { - out() << " <li><a href=\"all-examples.html\">Examples</a></li>"; + out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>"; } else if (fn->name().startsWith("examples-")) { - out() << " <li><a href=\"all-examples.html\">Examples</a></li>"; - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } else if (fn->name() == QString("namespaces.html")) { - out() << " <li><a href=\"namespaces.html\">All Namespaces</a></li>"; + out() << " <li><xref href=\"namespaces.html\">All Namespaces</xref></li>"; } else { - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } } else if (node->subType() == Node::QmlClass) { - out() << " <li><a href=\"qdeclarativeelements.html\">QML Elements</a></li>"; - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"qdeclarativeelements.html\">QML Elements</xref></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } else if (node->subType() == Node::Example) { - out() << " <li><a href=\"all-examples.html\">Examples</a></li>"; + out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>"; QStringList sl = fn->name().split('/'); QString name = "examples-" + sl.at(0) + ".html"; QString t = CodeParser::titleFromName(name); - out() << " <li><a href=\"" << name << "\">" - << t << "</a></li>"; - out() << " <li><a href=\"" << sl.at(0) + out() << " <li><xref href=\"" << name << "\">" + << t << "</xref></li>"; + out() << " <li><xref href=\"" << sl.at(0) << "-" << sl.at(sl.size()-1) << ".html\">" - << title << "</a></li>"; + << title << "</xref></li>"; } } else if (node->type() == Node::Namespace) { const NamespaceNode* nsn = static_cast<const NamespaceNode*>(node); - out() << " <li><a href=\"namespaces.html\">All Namespaces</a></li>"; - out() << " <li><a href=\"" << fileName(nsn) << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"namespaces.html\">All Namespaces</xref></li>"; + out() << " <li><xref href=\"" << fileName(nsn) << "\">" << title + << "</xref></li>"; } } -void DitaXmlGenerator::generateHeader(const QString& title, - const Node *node, - CodeMarker *marker) +void DitaXmlGenerator::generateHeader(const Node* node) { - out() << QString("<?xml version=\"1.0\" encoding=\"%1\"?>\n").arg(outputEncoding); - out() << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; - out() << QString("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"%1\" lang=\"%1\">\n").arg(naturalLanguage); - out() << "<head>\n"; - out() << " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; - QString shortVersion; - shortVersion = project + " " + shortVersion + ": "; - if (node && !node->doc().location().isEmpty()) - out() << "<!-- " << node->doc().location().fileName() << " -->\n"; + writer.setDevice(out().device()); + writer.setAutoFormatting(true); + writer.setAutoFormattingIndent(4); + writer.writeStartDocument(); + + if (!node) + return; - shortVersion = myTree->version(); - if (shortVersion.count(QChar('.')) == 2) - shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); - if (!shortVersion.isEmpty()) { - if (project == "QSA") - shortVersion = "QSA " + shortVersion + ": "; - else - shortVersion = "Qt " + shortVersion + ": "; + QString docType; + QString dtd; + QString version; + if (node->type() == Node::Class) { + docType = "cxxClass"; + dtd = "dtd/cxxClass.dtd"; + version = "0.6.0"; } - out() << " <title>" << shortVersion << protectEnc(title) << "</title>\n"; - - out() << " <!--[if IE]>"; - out() << "<meta name=\"MSSmartTagsPreventParsing\" content=\"true\">"; - out() << "<meta http-equiv=\"imagetoolbar\" content=\"no\">"; - out() << "<![endif]-->"; - out() << "<!--[if lt IE 7]>"; - out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie6.css\">"; - out() << "<![endif]-->"; - out() << "<!--[if IE 7]>"; - out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie7.css\">"; - out() << "<![endif]-->"; - out() << "<!--[if IE 8]>"; - out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie8.css\">"; - out() << "<![endif]-->"; - - - //out() << " <title>Qt Reference Documentation</title>"; - out() << " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/style.css\" />\n"; - out() << " <script src=\"scripts/jquery.js\" type=\"text/javascript\"></script>\n"; - out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n"; - out() << "</head>\n"; - - if (offlineDocs) - out() << "<body class=\"offline\" onload=\"CheckEmptyAndLoadList();\">\n"; - else - out() << "<body class=\"\" onload=\"CheckEmptyAndLoadList();\">\n"; - -#ifdef GENERATE_MAC_REFS - if (mainPage) - generateMacRef(node, marker); -#endif - out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version()); - generateBreadCrumbs(title,node,marker); - out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version()); - -#if 0 // Removed for new docf format. MWS - if (node && !node->links().empty()) - out() << "<p>\n" << navigationLinks << "</p>\n"; -#endif + QString doctype = "<!DOCTYPE " + docType + + " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" + + version + "//EN\" \"" + dtd + "\">"; + writer.writeDTD(doctype); + writer.writeComment(node->doc().location().fileName()); } void DitaXmlGenerator::generateTitle(const QString& title, - const Text &subTitle, - SubTitleSize subTitleSize, - const Node *relative, - CodeMarker *marker) + const Text &subTitle, + SubTitleSize subTitleSize, + const Node *relative, + CodeMarker *marker) { if (!title.isEmpty()) out() << "<h1 class=\"title\">" << protectEnc(title) << "</h1>\n"; @@ -1769,30 +1957,18 @@ void DitaXmlGenerator::generateTitle(const QString& title, } } -void DitaXmlGenerator::generateFooter(const Node *node) -{ - if (node && !node->links().empty()) - out() << "<p>\n" << navigationLinks << "</p>\n"; - - out() << QString(footer).replace("\\" + COMMAND_VERSION, myTree->version()) - << QString(address).replace("\\" + COMMAND_VERSION, myTree->version()); - out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n"; - out() << "</body>\n"; - out() << "</html>\n"; -} - -void DitaXmlGenerator::generateBrief(const Node *node, CodeMarker *marker, - const Node *relative) +/*! + Outputs the brief command as a <shortdesc" element. + */ +void DitaXmlGenerator::generateBrief(const Node* node, CodeMarker* marker) { Text brief = node->doc().briefText(); if (!brief.isEmpty()) { - out() << "<p>"; + ++noLinks; + writer.writeStartElement(SHORTDESC); generateText(brief, node, marker); - if (!relative || node == relative) - out() << " <a href=\"#"; - else - out() << " <a href=\"" << linkForNode(node, relative) << "#"; - out() << registerRef("details") << "\">More...</a></p>\n"; + writer.writeEndElement(); // shortdesc + --noLinks; } } @@ -1870,13 +2046,13 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, columnSize = 0; } out() << "<li>"; - out() << "<a href=\"" + out() << "<xref href=\"" << nodeName << "#" << Doc::canonicalTitle(headingText.toString()) << "\">"; generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms); - out() << "</a></li>\n"; + out() << "</xref></li>\n"; ++columnSize; } @@ -1922,22 +2098,22 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, if (moduleNamespaceMap.contains(node->name())) { out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("namespaces") - << "\">Namespaces</a></li>\n"; + << "\">Namespaces</xref></li>\n"; } if (moduleClassMap.contains(node->name())) { out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("classes") - << "\">Classes</a></li>\n"; + << "\">Classes</xref></li>\n"; } out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("details") - << "\">Detailed Description</a></li>\n"; + << "\">Detailed Description</xref></li>\n"; for (int i = 0; i < toc.size(); ++i) { if (toc.at(i)->string().toInt() == 1) { detailsBase = 1; @@ -1951,18 +2127,18 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, if (!s->members.isEmpty() || !s->reimpMembers.isEmpty()) { out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef((*s).pluralMember) << "\">" << (*s).name - << "</a></li>\n"; + << "</xref></li>\n"; } ++s; } out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("details") - << "\">Detailed Description</a></li>\n"; + << "\">Detailed Description</xref></li>\n"; for (int i = 0; i < toc.size(); ++i) { if (toc.at(i)->string().toInt() == 1) { detailsBase = 1; @@ -1991,12 +2167,12 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, out() << "<li class=\"level" << sectionNumber.size() << "\">"; - out() << "<a href=\"" + out() << "<xref href=\"" << "#" << Doc::canonicalTitle(s) << "\">"; generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms); - out() << "</a></li>\n"; + out() << "</xref></li>\n"; } while (!sectionNumber.isEmpty()) { sectionNumber.removeLast(); @@ -2007,37 +2183,6 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, inLink = false; } -#if 0 -void DitaXmlGenerator::generateNavigationBar(const NavigationBar& bar, - const Node *node, - CodeMarker *marker) -{ - if (bar.prev.begin() != 0 || bar.current.begin() != 0 || - bar.next.begin() != 0) { - out() << "<p class=\"rightAlign\">"; - if (bar.prev.begin() != 0) { -#if 0 - out() << "[<a href=\"" << section.previousBaseName() - << ".html\">Prev: "; - generateText(section.previousHeading(), node, marker); - out() << "</a>]\n"; -#endif - } - if (bar.current.begin() != 0) { - out() << "[<a href=\"" << "home" - << ".html\">Home</a>]\n"; - } - if (bar.next.begin() != 0) { - out() << "[<a href=\"" << fileBase(node, bar.next) - << ".html\">Next: "; - generateText(Text::sectionHeading(bar.next.begin()), node, marker); - out() << "</a>]\n"; - } - out() << "</p>\n"; - } -} -#endif - QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, CodeMarker *marker) { @@ -2053,7 +2198,7 @@ QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, QString fileName = fileBase(inner) + "-members." + fileExtension(inner); beginSubPage(inner->location(), fileName); QString title = "List of All Members for " + inner->name(); - generateHeader(title, inner, marker); + generateHeader(inner); generateTitle(title, Text(), SmallSubTitle, inner, marker); out() << "<p>This is the complete list of members for "; generateFullName(inner, 0, marker); @@ -2062,7 +2207,6 @@ QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, Section section = sections.first(); generateSectionList(section, 0, marker, CodeMarker::SeparateList); - generateFooter(); endSubPage(); return fileName; } @@ -2097,12 +2241,12 @@ QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, } beginSubPage(inner->location(), fileName); - generateHeader(title, inner, marker); + generateHeader(inner); generateTitle(title, Text(), SmallSubTitle, inner, marker); if (status == CodeMarker::Compat) { out() << "<p><b>The following class members are part of the " - "<a href=\"qt3support.html\">Qt 3 support layer</a>.</b> " + "<xref href=\"qt3support.html\">Qt 3 support layer</xref>.</b> " "They are provided to help you port old code to Qt 4. We advise against " "using them in new code.</p>\n"; } @@ -2112,10 +2256,10 @@ QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, << "We strongly advise against using them in new code.</p>\n"; } - out() << "<p><ul><li><a href=\"" + out() << "<p><ul><li><xref href=\"" << linkForNode(inner, 0) << "\">" << protectEnc(inner->name()) - << " class reference</a></li></ul></p>\n"; + << " class reference</xref></li></ul></p>\n"; for (i = 0; i < sections.size(); ++i) { out() << "<h2>" << protectEnc(sections.at(i).name) << "</h2>\n"; @@ -2135,7 +2279,6 @@ QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, } } - generateFooter(); endSubPage(); return fileName; } @@ -2362,7 +2505,7 @@ void DitaXmlGenerator::generateCompactList(const Node *relative, for (int i = 0; i < 26; i++) { QChar ch('a' + i); if (usedParagraphNames.contains(char('a' + i))) - out() << QString("<a href=\"#%1\">%2</a> ").arg(ch).arg(ch.toUpper()); + out() << QString("<xref href=\"#%1\">%2</xref> ").arg(ch).arg(ch.toUpper()); } out() << "</b></p>\n"; } @@ -2415,7 +2558,7 @@ void DitaXmlGenerator::generateCompactList(const Node *relative, Previously, we used generateFullName() for this, but we require some special formatting. */ - out() << "<a href=\"" << linkForNode(it.value(), relative) << "\">"; + out() << "<xref href=\"" << linkForNode(it.value(), relative) << "\">"; QStringList pieces; if (it.value()->subType() == Node::QmlClass) @@ -2423,7 +2566,7 @@ void DitaXmlGenerator::generateCompactList(const Node *relative, else pieces = fullName(it.value(), relative, marker).split("::"); out() << protectEnc(pieces.last()); - out() << "</a>"; + out() << "</xref>"; if (pieces.size() > 1) { out() << " ("; generateFullName(it.value()->parent(), relative, marker); @@ -2443,7 +2586,7 @@ void DitaXmlGenerator::generateFunctionIndex(const Node *relative, out() << "<p class=\"centerAlign functionIndex\"><b>"; for (int i = 0; i < 26; i++) { QChar ch('a' + i); - out() << QString("<a href=\"#%1\">%2</a> ").arg(ch).arg(ch.toUpper()); + out() << QString("<xref href=\"#%1\">%2</xref> ").arg(ch).arg(ch.toUpper()); } out() << "</b></p>\n"; @@ -2657,7 +2800,7 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * / if (!fakeNodeMap.isEmpty()) { foreach (const QString &groupTitle, groupTitlesMap.keys()) { const FakeNode *groupNode = groupTitlesMap[groupTitle]; - out() << QString("<h3><a href=\"%1\">%2</a></h3>\n").arg( + out() << QString("<h3><xref href=\"%1\">%2</xref></h3>\n").arg( linkForNode(groupNode, relative)).arg( protectEnc(groupNode->fullTitle())); @@ -2670,8 +2813,8 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * / QString title = fakeNode->fullTitle(); if (title.startsWith("The ")) title.remove(0, 4); - out() << "<li><a href=\"" << linkForNode(fakeNode, relative) << "\">" - << protectEnc(title) << "</a></li>\n"; + out() << "<li><xref href=\"" << linkForNode(fakeNode, relative) << "\">" + << protectEnc(title) << "</xref></li>\n"; } out() << "</ul>\n"; } @@ -2684,14 +2827,13 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * / QString title = fakeNode->fullTitle(); if (title.startsWith("The ")) title.remove(0, 4); - out() << "<li><a href=\"" << linkForNode(fakeNode, relative) << "\">" - << protectEnc(title) << "</a></li>\n"; + out() << "<li><xref href=\"" << linkForNode(fakeNode, relative) << "\">" + << protectEnc(title) << "</xref></li>\n"; } out() << "</ul>\n"; } } -#ifdef QDOC_NAME_ALIGNMENT void DitaXmlGenerator::generateSection(const NodeList& nl, const Node *relative, CodeMarker *marker, @@ -2838,10 +2980,10 @@ void DitaXmlGenerator::generateSectionInheritedList(const Section& section, else { out() << section.pluralMember; } - out() << " inherited from <a href=\"" << fileName((*p).first) + out() << " inherited from <xref href=\"" << fileName((*p).first) << "#" << DitaXmlGenerator::cleanRef(section.name.toLower()) << "\">" << protectEnc(marker->plainFullName((*p).first, relative)) - << "</a></li>\n"; + << "</xref></li>\n"; ++p; } } @@ -3056,281 +3198,6 @@ QString DitaXmlGenerator::highlightedCode(const QString& markedCode, return html; } -#else -void DitaXmlGenerator::generateSectionList(const Section& section, - const Node *relative, - CodeMarker *marker, - CodeMarker::SynopsisStyle style) -{ - if (!section.members.isEmpty()) { - bool twoColumn = false; - if (style == CodeMarker::SeparateList) { - twoColumn = (section.members.count() >= 16); - } - else if (section.members.first()->type() == Node::Property) { - twoColumn = (section.members.count() >= 5); - } - if (twoColumn) - out() << "<table class=\"generic\">\n"; - if (++numTableRows % 2 == 1) - out() << "<tr class=\"odd topAlign\">"; - else - out() << "<tr class=\"even topAlign\">"; - -// << "<tr><td class=\"topAlign\">"; - out() << "<ul>\n"; - - int i = 0; - NodeList::ConstIterator m = section.members.begin(); - while (m != section.members.end()) { - if ((*m)->access() == Node::Private) { - ++m; - continue; - } - - if (twoColumn && i == (int) (section.members.count() + 1) / 2) - out() << "</ul></td><td class=\"topAlign\"><ul>\n"; - - out() << "<li class=\"fn\">"; - if (style == CodeMarker::Accessors) - out() << "<b>"; - generateSynopsis(*m, relative, marker, style); - if (style == CodeMarker::Accessors) - out() << "</b>"; - out() << "</li>\n"; - i++; - ++m; - } - out() << "</ul>\n"; - if (twoColumn) - out() << "</td></tr>\n</table>\n"; - } - - if (style == CodeMarker::Summary && !section.inherited.isEmpty()) { - out() << "<ul>\n"; - generateSectionInheritedList(section, relative, marker); - out() << "</ul>\n"; - } -} - -void DitaXmlGenerator::generateSectionInheritedList(const Section& section, - const Node *relative, - CodeMarker *marker) -{ - QList<QPair<ClassNode *, int> >::ConstIterator p = section.inherited.begin(); - while (p != section.inherited.end()) { - out() << "<li class=\"fn\">"; - out() << (*p).second << " "; - if ((*p).second == 1) { - out() << section.singularMember; - } else { - out() << section.pluralMember; - } - out() << " inherited from <a href=\"" << fileName((*p).first) - << "#" << DitaXmlGenerator::cleanRef(section.name.toLower()) << "\">" - << protectEnc(marker->plainFullName((*p).first, relative)) - << "</a></li>\n"; - ++p; - } -} - -void DitaXmlGenerator::generateSynopsis(const Node *node, - const Node *relative, - CodeMarker *marker, - CodeMarker::SynopsisStyle style) -{ - QString marked = marker->markedUpSynopsis(node, relative, style); - QRegExp templateTag("(<[^@>]*>)"); - if (marked.indexOf(templateTag) != -1) { - QString contents = protectEnc(marked.mid(templateTag.pos(1), - templateTag.cap(1).length())); - marked.replace(templateTag.pos(1), templateTag.cap(1).length(), - contents); - } - marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])</@param>"), "<i>\\1<sub>\\2</sub></i>"); - marked.replace("<@param>", "<i>"); - marked.replace("</@param>", "</i>"); - - if (style == CodeMarker::Summary) - marked.replace("@name>", "b>"); - - if (style == CodeMarker::SeparateList) { - QRegExp extraRegExp("<@extra>.*</@extra>"); - extraRegExp.setMinimal(true); - marked.replace(extraRegExp, ""); - } else { - marked.replace("<@extra>", "<tt>"); - marked.replace("</@extra>", "</tt>"); - } - - if (style != CodeMarker::Detailed) { - marked.replace("<@type>", ""); - marked.replace("</@type>", ""); - } - out() << highlightedCode(marked, marker, relative); -} - -QString DitaXmlGenerator::highlightedCode(const QString& markedCode, - CodeMarker *marker, - const Node *relative) -{ - QString src = markedCode; - QString html; - QStringRef arg; - QStringRef par1; - - const QChar charLangle = '<'; - const QChar charAt = '@'; - - // replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*(</@link>)" - static const QString linkTag("link"); - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle && src.at(i + 1) == charAt) { - i += 2; - if (parseArg(src, linkTag, &i, n, &arg, &par1)) { - const Node* node = CodeMarker::nodeForString(par1.toString()); - QString link = linkForNode(node, relative); - addLink(link, arg, &html); - } - else { - html += charLangle; - html += charAt; - } - } - else { - html += src.at(i++); - } - } - - if (slow) { - // is this block ever used at all? - // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)(</@func>)" - src = html; - html = QString(); - static const QString funcTag("func"); - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle && src.at(i + 1) == charAt) { - i += 2; - if (parseArg(src, funcTag, &i, n, &arg, &par1)) { - QString link = linkForNode( - marker->resolveTarget(par1.toString(), - myTree, - relative), - relative); - addLink(link, arg, &html); - par1 = QStringRef(); - } - else { - html += charLangle; - html += charAt; - } - } - else { - html += src.at(i++); - } - } - } - - // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)" tags - src = html; - html = QString(); - static const QString typeTags[] = { "type", "headerfile", "func" }; - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle && src.at(i + 1) == charAt) { - i += 2; - bool handled = false; - for (int k = 0; k != 3; ++k) { - if (parseArg(src, typeTags[k], &i, n, &arg, &par1)) { - par1 = QStringRef(); - QString link = linkForNode( - marker->resolveTarget(arg.toString(), myTree, relative), - relative); - addLink(link, arg, &html); - handled = true; - break; - } - } - if (!handled) { - html += charLangle; - html += charAt; - } - } - else { - html += src.at(i++); - } - } - - // replace all - // "<@comment>" -> "<span class=\"comment\">"; - // "<@preprocessor>" -> "<span class=\"preprocessor\">"; - // "<@string>" -> "<span class=\"string\">"; - // "<@char>" -> "<span class=\"char\">"; - // "</@(?:comment|preprocessor|string|char)>" -> "</span>" - src = html; - html = QString(); - static const QString spanTags[] = { - "<@comment>", "<span class=\"comment\">", - "<@preprocessor>", "<span class=\"preprocessor\">", - "<@string>", "<span class=\"string\">", - "<@char>", "<span class=\"char\">", - "</@comment>", "</span>", - "</@preprocessor>","</span>", - "</@string>", "</span>", - "</@char>", "</span>" - // "<@char>", "<font color=blue>", - // "</@char>", "</font>", - // "<@func>", "<font color=green>", - // "</@func>", "</font>", - // "<@id>", "<i>", - // "</@id>", "</i>", - // "<@keyword>", "<b>", - // "</@keyword>", "</b>", - // "<@number>", "<font color=yellow>", - // "</@number>", "</font>", - // "<@op>", "<b>", - // "</@op>", "</b>", - // "<@param>", "<i>", - // "</@param>", "</i>", - // "<@string>", "<font color=green>", - // "</@string>", "</font>", - }; - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle) { - bool handled = false; - for (int k = 0; k != 8; ++k) { - const QString & tag = spanTags[2 * k]; - if (tag == QStringRef(&src, i, tag.length())) { - html += spanTags[2 * k + 1]; - i += tag.length(); - handled = true; - break; - } - } - if (!handled) { - ++i; - if (src.at(i) == charAt || - (src.at(i) == QLatin1Char('/') && src.at(i + 1) == charAt)) { - // drop 'our' unknown tags (the ones still containing '@') - while (i < n && src.at(i) != QLatin1Char('>')) - ++i; - ++i; - } - else { - // retain all others - html += charLangle; - } - } - } - else { - html += src.at(i); - ++i; - } - } - - return html; -} -#endif - void DitaXmlGenerator::generateLink(const Atom* atom, const Node* /* relative */, CodeMarker* marker) @@ -3340,29 +3207,32 @@ void DitaXmlGenerator::generateLink(const Atom* atom, if (funcLeftParen.indexIn(atom->string()) != -1 && marker->recognizeLanguage("Cpp")) { // hack for C++: move () outside of link int k = funcLeftParen.pos(1); - out() << protectEnc(atom->string().left(k)); + writer.writeCharacters(protectEnc(atom->string().left(k))); if (link.isEmpty()) { if (showBrokenLinks) - out() << "</i>"; - } else { - out() << "</a>"; + writer.writeEndElement(); // </i> + } + else { + writer.writeEndElement(); // </xref> } inLink = false; - out() << protectEnc(atom->string().mid(k)); + writer.writeCharacters(protectEnc(atom->string().mid(k))); } else if (marker->recognizeLanguage("Java")) { // hack for Java: remove () and use <tt> when appropriate bool func = atom->string().endsWith("()"); bool tt = (func || atom->string().contains(camelCase)); if (tt) - out() << "<tt>"; + writer.writeStartElement("tt"); if (func) { - out() << protectEnc(atom->string().left(atom->string().length() - 2)); - } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string().left(atom->string().length() - 2))); } - out() << "</tt>"; - } else { - out() << protectEnc(atom->string()); + else { + writer.writeCharacters(protectEnc(atom->string())); + } + writer.writeEndElement(); // </tt> + } + else { + writer.writeCharacters(protectEnc(atom->string())); } } @@ -3444,13 +3314,13 @@ QString DitaXmlGenerator::protectEnc(const QString &string) QString DitaXmlGenerator::protect(const QString &string, const QString &outputEncoding) { #define APPEND(x) \ - if (html.isEmpty()) { \ - html = string; \ - html.truncate(i); \ + if (xml.isEmpty()) { \ + xml = string; \ + xml.truncate(i); \ } \ - html += (x); + xml += (x); - QString html; + QString xml; int n = string.length(); for (int i = 0; i < n; ++i) { @@ -3469,16 +3339,16 @@ QString DitaXmlGenerator::protect(const QString &string, const QString &outputEn || (ch == QLatin1Char('.') && i > 2 && string.at(i - 2) == QLatin1Char('.'))) { // we escape '*/' and the last dot in 'e.g.' and 'i.e.' for the Javadoc generator APPEND("&#x"); - html += QString::number(ch.unicode(), 16); - html += QLatin1Char(';'); + xml += QString::number(ch.unicode(), 16); + xml += QLatin1Char(';'); } else { - if (!html.isEmpty()) - html += ch; + if (!xml.isEmpty()) + xml += ch; } } - if (!html.isEmpty()) - return html; + if (!xml.isEmpty()) + return xml; return string; #undef APPEND @@ -3615,12 +3485,6 @@ QString DitaXmlGenerator::linkForNode(const Node *node, const Node *relative) return QString(); fn = fileName(node); -/* if (!node->url().isEmpty()) - return fn;*/ -#if 0 - // ### reintroduce this test, without breaking .dcf files - if (fn != outFileName()) -#endif link += fn; if (!node->isInnerNode() || node->subType() == Node::QmlPropertyGroup) { @@ -3654,7 +3518,7 @@ void DitaXmlGenerator::generateFullName(const Node *apparentNode, { if (actualNode == 0) actualNode = apparentNode; - out() << "<a href=\"" << linkForNode(actualNode, relative); + out() << "<xref href=\"" << linkForNode(actualNode, relative); if (true || relative == 0 || relative->status() != actualNode->status()) { switch (actualNode->status()) { case Node::Obsolete: @@ -3669,7 +3533,7 @@ void DitaXmlGenerator::generateFullName(const Node *apparentNode, } out() << "\">"; out() << protectEnc(fullName(apparentNode, relative, marker)); - out() << "</a>"; + out() << "</xref>"; } void DitaXmlGenerator::generateDetailedMember(const Node *node, @@ -3735,7 +3599,7 @@ void DitaXmlGenerator::generateDetailedMember(const Node *node, if (enume->flagsType()) { out() << "<p>The " << protectEnc(enume->flagsType()->name()) << " type is a typedef for " - << "<a href=\"qflags.html\">QFlags</a><" + << "<xref href=\"qflags.html\">QFlags</xref><" << protectEnc(enume->name()) << ">. It stores an OR combination of " << protectEnc(enume->name()) @@ -3926,29 +3790,6 @@ void DitaXmlGenerator::findAllNamespaces(const InnerNode *node) } } -#ifdef ZZZ_QDOC_QML -/*! - This function finds all the qml element nodes and - stores them in a map for later use. - */ -void DitaXmlGenerator::findAllQmlClasses(const InnerNode *node) -{ - NodeList::const_iterator c = node->childNodes().constBegin(); - while (c != node->childNodes().constEnd()) { - if ((*c)->type() == Node::Fake) { - const FakeNode* fakeNode = static_cast<const FakeNode *>(*c); - if (fakeNode->subType() == Node::QmlClass) { - const QmlClassNode* qmlNode = - static_cast<const QmlClassNode*>(fakeNode); - const Node* n = qmlNode->classNode(); - } - qmlClasses.insert(fakeNode->name(),*c); - } - ++c; - } -} -#endif - int DitaXmlGenerator::hOffset(const Node *node) { switch (node->type()) { @@ -4136,16 +3977,6 @@ QString DitaXmlGenerator::getLink(const Atom *atom, return link; } -void DitaXmlGenerator::generateDcf(const QString &fileBase, - const QString &startPage, - const QString &title, - DcfSection &dcfRoot) -{ - dcfRoot.ref = startPage; - dcfRoot.title = title; - generateDcfSections(dcfRoot, outputDir() + "/" + fileBase + ".dcf", fileBase + "/reference"); -} - void DitaXmlGenerator::generateIndex(const QString &fileBase, const QString &url, const QString &title) @@ -4228,22 +4059,28 @@ void DitaXmlGenerator::beginLink(const QString &link, this->link = link; if (link.isEmpty()) { if (showBrokenLinks) - out() << "<i>"; + writer.writeStartElement("i"); } else if (node == 0 || (relative != 0 && node->status() == relative->status())) { - out() << "<a href=\"" << link << "\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); } else { switch (node->status()) { case Node::Obsolete: - out() << "<a href=\"" << link << "\" class=\"obsolete\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); + writer.writeAttribute("outputclass","obsolete"); break; case Node::Compat: - out() << "<a href=\"" << link << "\" class=\"compat\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); + writer.writeAttribute("outputclass","compat"); break; default: - out() << "<a href=\"" << link << "\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); } } inLink = true; @@ -4254,13 +4091,15 @@ void DitaXmlGenerator::endLink() if (inLink) { if (link.isEmpty()) { if (showBrokenLinks) - out() << "</i>"; + writer.writeEndElement(); // i } else { if (inObsoleteLink) { - out() << "<sup>(obsolete)</sup>"; + writer.writeStartElement("sup"); + writer.writeCharacters("(obsolete)"); + writer.writeEndElement(); // sup } - out() << "</a>"; + writer.writeEndElement(); // xref } } inLink = false; @@ -4636,138 +4475,46 @@ void DitaXmlGenerator::generatePageIndex(const QString& fileName, CodeMarker* ma #endif -#if 0 // fossil removed for new doc format MWS 19/04/2010 - out() << "<!DOCTYPE html\n" - " PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\">\n"; - out() << QString("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"%1\" lang=\"%1\">\n").arg(naturalLanguage); - - QString shortVersion; - if ((project != "Qtopia") && (project != "Qt Extended")) { - shortVersion = project + " " + shortVersion + ": "; - if (node && !node->doc().location().isEmpty()) - out() << "<!-- " << node->doc().location().fileName() << " -->\n"; - - shortVersion = myTree->version(); - if (shortVersion.count(QChar('.')) == 2) - shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); - if (!shortVersion.isEmpty()) { - if (project == "QSA") - shortVersion = "QSA " + shortVersion + ": "; - else - shortVersion = "Qt " + shortVersion + ": "; - } - } - - out() << "<head>\n" - " <title>" << shortVersion << protectEnc(title) << "</title>\n"; - out() << QString("<meta http-equiv=\"Content-type\" content=\"text/html; charset=%1\" />").arg(outputEncoding); - - if (!style.isEmpty()) - out() << " <style type=\"text/css\">" << style << "</style>\n"; - - const QMap<QString, QString> &metaMap = node->doc().metaTagMap(); - if (!metaMap.isEmpty()) { - QMapIterator<QString, QString> i(metaMap); - while (i.hasNext()) { - i.next(); - out() << " <meta name=\"" << protectEnc(i.key()) << "\" contents=\"" - << protectEnc(i.value()) << "\" />\n"; - } - } - - navigationLinks.clear(); - - if (node && !node->links().empty()) { - QPair<QString,QString> linkPair; - QPair<QString,QString> anchorPair; - const Node *linkNode; - - if (node->links().contains(Node::PreviousLink)) { - linkPair = node->links()[Node::PreviousLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - - out() << " <link rel=\"prev\" href=\"" - << anchorPair.first << "\" />\n"; - - navigationLinks += "[Previous: <a href=\"" + anchorPair.first + "\">"; - if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) - navigationLinks += protectEnc(anchorPair.second); - else - navigationLinks += protectEnc(linkPair.second); - navigationLinks += "</a>]\n"; - } - if (node->links().contains(Node::ContentsLink)) { - linkPair = node->links()[Node::ContentsLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - - out() << " <link rel=\"contents\" href=\"" - << anchorPair.first << "\" />\n"; - - navigationLinks += "[<a href=\"" + anchorPair.first + "\">"; - if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) - navigationLinks += protectEnc(anchorPair.second); - else - navigationLinks += protectEnc(linkPair.second); - navigationLinks += "</a>]\n"; - } - if (node->links().contains(Node::NextLink)) { - linkPair = node->links()[Node::NextLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - - out() << " <link rel=\"next\" href=\"" - << anchorPair.first << "\" />\n"; - - navigationLinks += "[Next: <a href=\"" + anchorPair.first + "\">"; - if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) - navigationLinks += protectEnc(anchorPair.second); - else - navigationLinks += protectEnc(linkPair.second); - navigationLinks += "</a>]\n"; - } - if (node->links().contains(Node::IndexLink)) { - linkPair = node->links()[Node::IndexLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - out() << " <link rel=\"index\" href=\"" - << anchorPair.first << "\" />\n"; - } - if (node->links().contains(Node::StartLink)) { - linkPair = node->links()[Node::StartLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - out() << " <link rel=\"start\" href=\"" - << anchorPair.first << "\" />\n"; - } - } - - foreach (const QString &stylesheet, stylesheets) { - out() << " <link href=\"" << stylesheet << "\" rel=\"stylesheet\" " - << "type=\"text/css\" />\n"; - } - - foreach (const QString &customHeadElement, customHeadElements) { - out() << " " << customHeadElement << "\n"; - } +void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker) +{ + QList<RelatedClass>::ConstIterator r; + int index; + + if (!cn->baseClasses().isEmpty()) { + writer.writeStartElement(CXXCLASSDERIVATIONS); + r = cn->baseClasses().begin(); + index = 0; + while (r != cn->baseClasses().end()) { + writer.writeStartElement(CXXCLASSDERIVATION); + writer.writeStartElement(CXXCLASSDERIVATIONACCESSSPECIFIER); + writer.writeAttribute("value",(*r).accessString()); + writer.writeEndElement(); // </cxxClassDerivationAccessSpecifier> + writer.writeStartElement(CXXCLASSBASECLASS); + QString fullTitle = marker->plainFullName((*r).node); + QString guid = lookupGuid(fullTitle); + writer.writeAttribute("href",guid); + writer.writeCharacters(fullTitle); + writer.writeEndElement(); // </cxxClassBaseClass> + writer.writeEndElement(); // </cxxClassDerivation> + ++r; + } + writer.writeEndElement(); // </cxxClassDerivations> + } +} - out() << "</head>\n" - #endif +void DitaXmlGenerator::writeLocation(const ClassNode* cn, CodeMarker* marker) +{ + writer.writeStartElement(CXXCLASSAPIITEMLOCATION); + writer.writeStartElement(CXXCLASSDECLARATIONFILE); + writer.writeAttribute("name","filePath"); + writer.writeAttribute("value",cn->location().filePath()); + writer.writeEndElement(); // </cxxClassDeclarationFile> + writer.writeStartElement(CXXCLASSDECLARATIONFILELINE); + writer.writeAttribute("name","lineNumber"); + QString lineNr; + writer.writeAttribute("value",lineNr.setNum(cn->location().lineNo())); + writer.writeEndElement(); // </cxxClassDeclarationFileLine> + writer.writeEndElement(); // </cxxClassApiItemLocation> +} - QT_END_NAMESPACE +QT_END_NAMESPACE diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h index 4de578d..070329b 100644 --- a/tools/qdoc3/ditaxmlgenerator.h +++ b/tools/qdoc3/ditaxmlgenerator.h @@ -46,28 +46,15 @@ #ifndef DITAXMLGENERATOR_H #define DITAXMLGENERATOR_H -#define QDOC_NAME_ALIGNMENT - #include <qmap.h> #include <qregexp.h> #include <QXmlStreamWriter> - #include "codemarker.h" #include "config.h" -#include "dcfsection.h" #include "pagegenerator.h" QT_BEGIN_NAMESPACE -#if 0 -struct NavigationBar -{ - SectionIterator prev; - SectionIterator current; - SectionIterator next; -}; -#endif - typedef QMultiMap<QString, Node*> NodeMultiMap; typedef QMap<QString, NodeMultiMap> NewSinceMaps; typedef QMap<Node*, NodeMultiMap> ParentMaps; @@ -122,6 +109,9 @@ class DitaXmlGenerator : public PageGenerator virtual QString refForNode(const Node *node); virtual QString linkForNode(const Node *node, const Node *relative); virtual QString refForAtom(Atom *atom, const Node *node); + + void writeDerivations(const ClassNode* cn, CodeMarker* marker); + void writeLocation(const ClassNode* cn, CodeMarker* marker); private: enum SubTitleSize { SmallSubTitle, LargeSubTitle }; @@ -134,24 +124,14 @@ class DitaXmlGenerator : public PageGenerator void generateBreadCrumbs(const QString& title, const Node *node, CodeMarker *marker); - void generateHeader(const QString& title, - const Node *node = 0, - CodeMarker *marker = 0); + void generateHeader(const Node* node); void generateTitle(const QString& title, const Text &subTitle, SubTitleSize subTitleSize, const Node *relative, CodeMarker *marker); - void generateFooter(const Node *node = 0); - void generateBrief(const Node *node, - CodeMarker *marker, - const Node *relative = 0); + void generateBrief(const Node* node, CodeMarker* marker); void generateIncludes(const InnerNode *inner, CodeMarker *marker); -#if 0 - void generateNavigationBar(const NavigationBar& bar, - const Node *node, - CodeMarker *marker); -#endif void generateTableOfContents(const Node *node, CodeMarker *marker, Doc::SectioningUnit sectioningUnit, @@ -198,7 +178,7 @@ class DitaXmlGenerator : public PageGenerator void generateQmlInstantiates(const QmlClassNode* qcn, CodeMarker* marker); void generateInstantiatedBy(const ClassNode* cn, CodeMarker* marker); #endif -#ifdef QDOC_NAME_ALIGNMENT + void generateSection(const NodeList& nl, const Node *relative, CodeMarker *marker, @@ -217,18 +197,7 @@ class DitaXmlGenerator : public PageGenerator const Node *relative, CodeMarker::SynopsisStyle style = CodeMarker::Accessors, bool nameAlignment = false); -#else - void generateSynopsis(const Node *node, - const Node *relative, - CodeMarker *marker, - CodeMarker::SynopsisStyle style); - void generateSectionInheritedList(const Section& section, - const Node *relative, - CodeMarker *marker); - QString highlightedCode(const QString& markedCode, - CodeMarker *marker, - const Node *relative); -#endif + void generateFullName(const Node *apparentNode, const Node *relative, CodeMarker *marker, @@ -251,9 +220,6 @@ class DitaXmlGenerator : public PageGenerator void findAllFunctions(const InnerNode *node); void findAllLegaleseTexts(const InnerNode *node); void findAllNamespaces(const InnerNode *node); -#ifdef ZZZ_QDOC_QML - void findAllQmlClasses(const InnerNode *node); -#endif void findAllSince(const InnerNode *node); static int hOffset(const Node *node); static bool isThreeColumnEnumValueTable(const Atom *atom); @@ -261,9 +227,6 @@ class DitaXmlGenerator : public PageGenerator const Node *relative, CodeMarker *marker, const Node** node); - virtual void generateDcf(const QString &fileBase, - const QString &startPage, - const QString &title, DcfSection &dcfRoot); virtual void generateIndex(const QString &fileBase, const QString &url, const QString &title); @@ -283,20 +246,13 @@ class DitaXmlGenerator : public PageGenerator CodeMarker* marker) const; void generatePageIndex(const QString& fileName, CodeMarker* marker) const; + QString writeGuidAttribute(QString text); + QString lookupGuid(QString text); -#if 0 - NavigationBar currentNavigationBar; -#endif + private: QMap<QString, QString> refMap; + QMap<QString, QString> name2guidMap; int codeIndent; - DcfSection dcfClassesRoot; - DcfSection dcfOverviewsRoot; - DcfSection dcfExamplesRoot; - DcfSection dcfDesignerRoot; - DcfSection dcfLinguistRoot; - DcfSection dcfAssistantRoot; - DcfSection dcfQmakeRoot; - HelpProjectWriter *helpProjectWriter; bool inLink; bool inObsoleteLink; bool inContents; @@ -323,6 +279,7 @@ class DitaXmlGenerator : public PageGenerator const Tree *myTree; bool slow; bool obsoleteLinks; + int noLinks; QMap<QString, NodeMap > moduleClassMap; QMap<QString, NodeMap > moduleNamespaceMap; NodeMap nonCompatClasses; @@ -341,6 +298,7 @@ class DitaXmlGenerator : public PageGenerator NewClassMaps newClassMaps; NewClassMaps newQmlClassMaps; static int id; + QXmlStreamWriter writer; }; #define DITAXMLGENERATOR_ADDRESS "address" diff --git a/tools/qdoc3/main.cpp b/tools/qdoc3/main.cpp index fe4ad86..616ae2f 100644 --- a/tools/qdoc3/main.cpp +++ b/tools/qdoc3/main.cpp @@ -68,6 +68,7 @@ #include "qscodeparser.h" #include "sgmlgenerator.h" #include "webxmlgenerator.h" +#include "ditaxmlgenerator.h" #include "tokenizer.h" #include "tree.h" #include <qdebug.h> @@ -427,6 +428,7 @@ int main(int argc, char **argv) ManGenerator manGenerator; SgmlGenerator smglGenerator; WebXMLGenerator webxmlGenerator; + DitaXmlGenerator ditaxmlGenerator; QStringList qdocFiles; QString opt; diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp index 3c7e9dc..4664e9d 100644 --- a/tools/qdoc3/node.cpp +++ b/tools/qdoc3/node.cpp @@ -154,6 +154,41 @@ void Node::setLink(LinkType linkType, const QString &link, const QString &desc) } /*! + Returns a string representing the access specifier. + */ +QString Node::accessString() const +{ + switch (acc) { + case Protected: + return "protected"; + case Private: + return "private"; + case Public: + default: + break; + } + return "public"; +} + + +/*! + Returns a string representing the access specifier. + */ +QString RelatedClass::accessString() const +{ + switch (access) { + case Node::Protected: + return "protected"; + case Node::Private: + return "private"; + case Node::Public: + default: + break; + } + return "public"; +} + +/*! */ Node::Status Node::inheritedStatus() const { diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h index 215a7ae..523394d 100644 --- a/tools/qdoc3/node.h +++ b/tools/qdoc3/node.h @@ -175,6 +175,7 @@ class Node virtual QString nameForLists() const { return nam; } Access access() const { return acc; } + QString accessString() const; const Location& location() const { return loc; } const Doc& doc() const { return d; } Status status() const { return sta; } @@ -312,6 +313,7 @@ struct RelatedClass : access(access0), node(node0), dataTypeWithTemplateArgs(dataTypeWithTemplateArgs0) { } + QString accessString() const; Node::Access access; ClassNode* node; diff --git a/tools/qdoc3/pagegenerator.cpp b/tools/qdoc3/pagegenerator.cpp index 13c83a8..cd364ef 100644 --- a/tools/qdoc3/pagegenerator.cpp +++ b/tools/qdoc3/pagegenerator.cpp @@ -299,8 +299,8 @@ QTextStream &PageGenerator::out() /*! Recursive writing of html files from the root \a node. */ -void PageGenerator::generateInnerNode(const InnerNode *node, - CodeMarker *marker) +void +PageGenerator::generateInnerNode(const InnerNode* node, CodeMarker* marker) { if (!node->url().isNull()) return; diff --git a/tools/qdoc3/test/qt-api-only_ja_JP.qdocconf b/tools/qdoc3/test/qt-api-only_ja_JP.qdocconf new file mode 100644 index 0000000..aa3ab01 --- /dev/null +++ b/tools/qdoc3/test/qt-api-only_ja_JP.qdocconf @@ -0,0 +1,30 @@ +include(qt-build-docs_ja_JP.qdocconf) + +# Ensures that the generated index contains a URL that can be used by the +# tools documentation (assistant.qdocconf, designer.qdocconf, linguist.qdocconf, +# qmake.qdocconf). + +url = ./ + +# Ensures that the documentation for the tools is not included in the generated +# .qhp file. + +qhp.Qt.excluded += $QT_SOURCE_TREE/doc/src/development/assistant-manual.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/simpletextviewer.qdoc \ + $QT_SOURCE_TREE/doc/src/development/designer-manual.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/calculatorbuilder.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/calculatorform.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/customwidgetplugin.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/taskmenuextension.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/containerextension.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/worldtimeclockbuilder.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/worldtimeclockplugin.qdoc \ + $QT_SOURCE_TREE/doc/src/internationalization/linguist-manual.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/hellotr.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/arrowpad.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/trollprint.qdoc \ + $QT_SOURCE_TREE/doc/src/development/qmake-manual.qdoc + +outputdir = $QT_BUILD_TREE/doc-build/html-qt_ja_JP +tagfile = $QT_BUILD_TREE/doc-build/html-qt_ja_JP/qt.tags +base = file:$QT_BUILD_TREE/doc-build/html-qt_ja_JP diff --git a/tools/qdoc3/test/qt-build-docs.qdocconf b/tools/qdoc3/test/qt-build-docs.qdocconf index 00704ea..216ac6a 100644 --- a/tools/qdoc3/test/qt-build-docs.qdocconf +++ b/tools/qdoc3/test/qt-build-docs.qdocconf @@ -115,6 +115,7 @@ excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \ $QT_SOURCE_TREE/src/3rdparty/phonon/mmf \ $QT_SOURCE_TREE/src/3rdparty/phonon/waveout \ $QT_SOURCE_TREE/doc/src/snippets \ + $QT_SOURCE_TREE/doc/src/ja_JP \ $QT_SOURCE_TREE/doc/src/zh_CN sources.fileextensions = "*.cpp *.qdoc *.mm" diff --git a/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf b/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf new file mode 100644 index 0000000..e517b33 --- /dev/null +++ b/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf @@ -0,0 +1,110 @@ +include(compat.qdocconf) +include(macros.qdocconf) +include(qt-cpp-ignore.qdocconf) +include(qt-html-templates_ja_JP.qdocconf) +include(qt-defines.qdocconf) + +project = Qt +description = Qt リファレンスドキュメント +url = http://qt.nokia.com/doc/ja_JP/4.7 + +sourceencoding = UTF-8 +outputencoding = UTF-8 +naturallanguage = ja + +indexes = $QT_BUILD_TREE/doc-build/html-qt/qt.index + +qhp.projects = Qt + +qhp.Qt.file = qt.qhp +qhp.Qt.namespace = com.trolltech.qt.470 +qhp.Qt.virtualFolder = qdoc +qhp.Qt.title = Qt +qhp.Qt.indexTitle = Qt +qhp.Qt.selectors = fake:example + +qhp.Qt.filterAttributes = qt 4.7.0 qtrefdoc ja_JP +qhp.Qt.customFilters.Qt.name = Qt 4.7.0 +qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.0 + +# Files not referenced in any qdoc file (last four are needed by qtdemo) +# See also extraimages.HTML +qhp.Qt.extraFiles = index.html \ + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/arrow-down.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + style/OfflineStyle.css \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css + +language = Cpp + +sourcedirs = $QT_SOURCE_TREE/doc/src/ja_JP + +excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \ + $QT_SOURCE_TREE/src/3rdparty/des \ + $QT_SOURCE_TREE/src/3rdparty/freetype \ + $QT_SOURCE_TREE/src/3rdparty/harfbuzz \ + $QT_SOURCE_TREE/src/3rdparty/kdebase \ + $QT_SOURCE_TREE/src/3rdparty/libjpeg \ + $QT_SOURCE_TREE/src/3rdparty/libmng \ + $QT_SOURCE_TREE/src/3rdparty/libpng \ + $QT_SOURCE_TREE/src/3rdparty/libtiff \ + $QT_SOURCE_TREE/src/3rdparty/md4 \ + $QT_SOURCE_TREE/src/3rdparty/md5 \ + $QT_SOURCE_TREE/src/3rdparty/patches \ + $QT_SOURCE_TREE/src/3rdparty/sha1 \ + $QT_SOURCE_TREE/src/3rdparty/sqlite \ + $QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore \ + $QT_SOURCE_TREE/src/3rdparty/webkit/WebCore \ + $QT_SOURCE_TREE/src/3rdparty/wintab \ + $QT_SOURCE_TREE/src/3rdparty/zlib \ + $QT_SOURCE_TREE/doc/src/snippets \ + $QT_SOURCE_TREE/doc/src/zh_CN \ + $QT_SOURCE_TREE/src/3rdparty/phonon/gstreamer \ + $QT_SOURCE_TREE/src/3rdparty/phonon/ds9 \ + $QT_SOURCE_TREE/src/3rdparty/phonon/qt7 \ + $QT_SOURCE_TREE/src/3rdparty/phonon/mmf \ + $QT_SOURCE_TREE/src/3rdparty/phonon/waveout + +sources.fileextensions = "*.cpp *.qdoc *.mm" +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp" +examples.imageextensions = "*.png" + +exampledirs = $QT_SOURCE_TREE/doc/src \ + $QT_SOURCE_TREE/examples/ja_JP \ + $QT_SOURCE_TREE/examples \ + $QT_SOURCE_TREE/examples/tutorials \ + $QT_SOURCE_TREE \ + $QT_SOURCE_TREE/qmake/examples \ + $QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/docs +imagedirs = $QT_SOURCE_TREE/doc/src/ja_JP/images \ + $QT_SOURCE_TREE/doc/src/images \ + $QT_SOURCE_TREE/examples \ + $QT_SOURCE_TREE/doc/src/template/images +outputdir = $QT_BUILD_TREE/doc/html_ja_JP +tagfile = $QT_BUILD_TREE/doc/html_ja_JP/qt.tags +base = file:$QT_BUILD_TREE/doc/html_ja_JP + +HTML.generatemacrefs = "true" diff --git a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf index 712e23f..909a2d4 100644 --- a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf +++ b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf @@ -30,32 +30,32 @@ qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.0 # Files not referenced in any qdoc file (last four are needed by qtdemo) # See also extraimages.HTML qhp.Qt.extraFiles = index.html \ - images/bg_l.png \ - images/bg_l_blank.png \ - images/bg_r.png \ - images/box_bg.png \ - images/breadcrumb.png \ - images/bullet_gt.png \ - images/bullet_dn.png \ - images/bullet_sq.png \ - images/bullet_up.png \ - images/feedbackground.png \ - images/horBar.png \ - images/page.png \ - images/page_bg.png \ - images/sprites-combined.png \ - images/arrow-down.png \ - images/spinner.gif \ - images/stylesheet-coffee-plastique.png \ - images/taskmenuextension-example.png \ - images/coloreditorfactoryimage.png \ - images/dynamiclayouts-example.png \ - scripts/functions.js \ - scripts/jquery.js \ - style/style_ie6.css \ - style/style_ie7.css \ - style/style_ie8.css \ - style/style.css + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/arrow-down.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css language = Cpp @@ -80,6 +80,7 @@ excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \ $QT_SOURCE_TREE/src/3rdparty/wintab \ $QT_SOURCE_TREE/src/3rdparty/zlib \ $QT_SOURCE_TREE/doc/src/snippets \ + $QT_SOURCE_TREE/doc/src/ja_JP \ $QT_SOURCE_TREE/src/3rdparty/phonon/gstreamer \ $QT_SOURCE_TREE/src/3rdparty/phonon/ds9 \ $QT_SOURCE_TREE/src/3rdparty/phonon/qt7 \ diff --git a/tools/qdoc3/test/qt-ditaxml.qdocconf b/tools/qdoc3/test/qt-ditaxml.qdocconf new file mode 100644 index 0000000..66f30e3 --- /dev/null +++ b/tools/qdoc3/test/qt-ditaxml.qdocconf @@ -0,0 +1,11 @@ +include(qt.qdocconf) + +imagedirs = $QTDIR/doc/src/images \ + $QTDIR/examples \ + $QTDIR/doc/src/template/images + +outputdir = $QTDIR/doc/ditaxml +outputformats = DITAXML + +generateindex = true +url = . diff --git a/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf b/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf new file mode 100644 index 0000000..027548e --- /dev/null +++ b/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf @@ -0,0 +1,178 @@ +HTML.stylesheets = style/style.css \ + style/OfflineStyle.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style_ie6.css + +HTML.postheader = " <div class=\"header\" id=\"qtdocheader\">\n" \ + " <div class=\"content\"> \n" \ + " <div id=\"nav-logo\">\n" \ + " <a href=\"index.html\">Home</a></div>\n" \ + " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \ + " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \ + " <fieldset>\n" \ + " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \ + " </fieldset>\n" \ + " </form></div>\n" \ + " <div id=\"nav-topright\">\n" \ + " <ul>\n" \ + " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \ + " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \ + " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \ + " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \ + " DOC</a></li>\n" \ + " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \ + " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \ + " </ul>\n" \ + " </div>\n" \ + " <div id=\"shortCut\">\n" \ + " <ul>\n" \ + " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.7</a></span></li>\n" \ + " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \ + " </a></li>\n" \ + " </ul>\n" \ + " </div>\n" \ + " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \ + " <li><a href=\"#\">API Lookup</a> \n" \ + " <ul id=\"topmenuLook\"> \n" \ + " <li><a href=\"classes.html\">Class index</a></li> \n" \ + " <li><a href=\"functions.html\">Function index</a></li> \n" \ + " <li><a href=\"modules.html\">Modules</a></li> \n" \ + " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \ + " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \ + " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \ + " </ul> \n" \ + " </li> \n" \ + " <li><a href=\"#\">Qt Topics</a> \n" \ + " <ul id=\"topmenuTopic\"> \n" \ + " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \ + " <li><a href=\"declarativeui.html\">Device UI's & Qt Quick</a></li> \n" \ + " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \ + " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \ + " </ul> \n" \ + " </li> \n" \ + " <li><a href=\"#\">Examples</a> \n" \ + " <ul id=\"topmenuexample\"> \n" \ + " <li><a href=\"all-examples.html\">Examples</a></li> \n" \ + " <li><a href=\"tutorials.html\">チュートリアル</a></li> \n" \ + " <li><a href=\"demos.html\">Demos</a></li> \n" \ + " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \ + " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \ + " </ul> \n" \ + " </li> \n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"wrapper\">\n" \ + " <div class=\"hd\">\n" \ + " <span></span>\n" \ + " </div>\n" \ + " <div class=\"bd group\">\n" \ + " <div class=\"sidebar\">\n" \ + " <div class=\"searchlabel\">\n" \ + " Search index:</div>\n" \ + " <div class=\"search\">\n" \ + " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \ + " <fieldset>\n" \ + " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \ + " </fieldset>\n" \ + " </form>\n" \ + " </div>\n" \ + " <div class=\"box first bottombar\" id=\"lookup\">\n" \ + " <h2 title=\"API Lookup\"><span></span>\n" \ + " API Lookup</h2>\n" \ + " <div id=\"list001\" class=\"list\">\n" \ + " <ul id=\"ul001\" >\n" \ + " <li class=\"defaultLink\"><a href=\"classes.html\">Class index</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"functions.html\">Function index</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"box bottombar\" id=\"topics\">\n" \ + " <h2 title=\"Qt Topics\"><span></span>\n" \ + " Qt Topics</h2>\n" \ + " <div id=\"list002\" class=\"list\">\n" \ + " <ul id=\"ul002\" >\n" \ + " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's & Qt Quick</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"box\" id=\"examples\">\n" \ + " <h2 title=\"Examples\"><span></span>\n" \ + " Examples</h2>\n" \ + " <div id=\"list003\" class=\"list\">\n" \ + " <ul id=\"ul003\">\n" \ + " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"tutorials.html\">チュートリアル</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"wrap\">\n" \ + " <div class=\"toolbar\">\n" \ + " <div class=\"breadcrumb toolblock\">\n" \ + " <ul>\n" \ + " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \ + " <!-- Bread crumbs goes here -->\n" + +HTML.postpostheader = " </ul>\n" \ + " </div>\n" \ + " <div class=\"toolbuttons toolblock\">\n" \ + " <ul>\n" \ + " <li id=\"smallA\" class=\"t_button\">A</li>\n" \ + " <li id=\"medA\" class=\"t_button active\">A</li>\n" \ + " <li id=\"bigA\" class=\"t_button\">A</li>\n" \ + " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \ + " <span>Print</span></a></li>\n" \ + " </ul>\n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"content\">\n" + +HTML.footer = " <!-- /div -->\n" \ + " <div class=\"feedback t_button\">\n" \ + " [+] Documentation Feedback</div>\n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"ft\">\n" \ + " <span></span>\n" \ + " </div>\n" \ + " </div> \n" \ + " <div class=\"footer\">\n" \ + " <p>\n" \ + " <acronym title=\"Copyright\">©</acronym> 2008-2010 Nokia Corporation and/or its\n" \ + " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \ + " in Finland and/or other countries worldwide.</p>\n" \ + " <p>\n" \ + " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \ + " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \ + " </div>\n" \ + " <div id=\"feedbackBox\">\n" \ + " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \ + " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \ + " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit you feedback...</textarea></p>\n" \ + " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \ + " </form>\n" \ + " </div>\n" \ + " <div id=\"blurpage\">\n" \ + " </div>\n" \ + "<script type=\"text/javascript\">\n" \ + " var _gaq = _gaq || [];\n" \ + " _gaq.push([\'_setAccount\', \'UA-4457116-5\']);\n" \ + " _gaq.push([\'_trackPageview\']);\n" \ + " (function() {\n" \ + " var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;\n" \ + " ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';\n" \ + " var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);\n" \ + " })();\n" \ + "</script>\n" diff --git a/tools/qdoc3/test/qt.qdocconf b/tools/qdoc3/test/qt.qdocconf index edf6d92..d132771 100644 --- a/tools/qdoc3/test/qt.qdocconf +++ b/tools/qdoc3/test/qt.qdocconf @@ -130,6 +130,7 @@ excludedirs = $QTDIR/src/3rdparty/clucene \ $QTDIR/src/3rdparty/phonon/mmf \ $QTDIR/src/3rdparty/phonon/waveout \ $QTDIR/doc/src/snippets \ + $QTDIR/doc/src/ja_JP \ $QTDIR/doc/src/zh_CN sources.fileextensions = "*.cpp *.qdoc *.mm" diff --git a/tools/qdoc3/test/qt_ja_JP.qdocconf b/tools/qdoc3/test/qt_ja_JP.qdocconf new file mode 100644 index 0000000..d4141c7 --- /dev/null +++ b/tools/qdoc3/test/qt_ja_JP.qdocconf @@ -0,0 +1,125 @@ +include(compat.qdocconf) +include(macros.qdocconf) +include(qt-cpp-ignore.qdocconf) +include(qt-html-templates_ja_JP.qdocconf) +include(qt-defines.qdocconf) + +project = Qt +versionsym = +version = %VERSION% +description = Qt リファレンスドキュメント +url = http://qt.nokia.com/doc/ja_JP/4.7 + +sourceencoding = UTF-8 +outputencoding = UTF-8 +naturallanguage = ja + +indexes = $QTDIR/doc/html/qt.index + +qhp.projects = Qt + +qhp.Qt.file = qt.qhp +qhp.Qt.namespace = com.trolltech.qt.470 +qhp.Qt.virtualFolder = qdoc +qhp.Qt.title = Qt +qhp.Qt.indexTitle = Qt +qhp.Qt.selectors = fake:example + +qhp.Qt.filterAttributes = qt 4.7.0 qtrefdoc ja_JP +qhp.Qt.customFilters.Qt.name = Qt 4.7.0 +qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.0 + +# Files not referenced in any qdoc file (last four are needed by qtdemo) +# See also extraimages.HTML +qhp.Qt.extraFiles = index.html \ + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_ll_blank.png \ + images/bg_ul_blank.png \ + images/header_bg.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/arrow_down.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + scripts/shBrushCpp.js \ + scripts/shCore.js \ + scripts/shLegacy.js \ + scripts/narrow.js \ + scripts/superfish.js \ + style/shCore.css \ + style/shThemeDefault.css \ + style/narrow.css \ + style/superfish.css \ + style/superfish_skin.css \ + style/OfflineStyle.css \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css + +language = Cpp + +sourcedirs = $QTDIR/doc/src/ja_JP + +excludedirs = $QTDIR/src/3rdparty/clucene \ + $QTDIR/src/3rdparty/des \ + $QTDIR/src/3rdparty/freetype \ + $QTDIR/src/3rdparty/harfbuzz \ + $QTDIR/src/3rdparty/kdebase \ + $QTDIR/src/3rdparty/libjpeg \ + $QTDIR/src/3rdparty/libmng \ + $QTDIR/src/3rdparty/libpng \ + $QTDIR/src/3rdparty/libtiff \ + $QTDIR/src/3rdparty/md4 \ + $QTDIR/src/3rdparty/md5 \ + $QTDIR/src/3rdparty/patches \ + $QTDIR/src/3rdparty/sha1 \ + $QTDIR/src/3rdparty/sqlite \ + $QTDIR/src/3rdparty/webkit/JavaScriptCore \ + $QTDIR/src/3rdparty/webkit/WebCore \ + $QTDIR/src/3rdparty/wintab \ + $QTDIR/src/3rdparty/zlib \ + $QTDIR/doc/src/snippets \ + $QTDIR/doc/src/zh_CN \ + $QTDIR/src/3rdparty/phonon/gstreamer \ + $QTDIR/src/3rdparty/phonon/ds9 \ + $QTDIR/src/3rdparty/phonon/qt7 \ + $QTDIR/src/3rdparty/phonon/mmf \ + $QTDIR/src/3rdparty/phonon/waveout + +sources.fileextensions = "*.cpp *.qdoc *.mm" +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp" +examples.imageextensions = "*.png" + +exampledirs = $QTDIR/doc/src \ + $QTDIR/examples/ja_JP \ + $QTDIR/examples \ + $QTDIR/examples/tutorials \ + $QTDIR \ + $QTDIR/qmake/examples \ + $QTDIR/src/3rdparty/webkit/WebKit/qt/docs +imagedirs = $QTDIR/doc/src/ja_JP/images \ + $QTDIR/doc/src/images \ + $QTDIR/examples \ + $QTDIR/doc/src/template/images +outputdir = $QTDIR/doc/html_ja_JP +tagfile = $QTDIR/doc/html_ja_JP/qt.tags +base = file:$QTDIR/doc/html_ja_JP + +HTML.generatemacrefs = "true" diff --git a/tools/qdoc3/test/qt_zh_CN.qdocconf b/tools/qdoc3/test/qt_zh_CN.qdocconf index db02478..4983f9e 100644 --- a/tools/qdoc3/test/qt_zh_CN.qdocconf +++ b/tools/qdoc3/test/qt_zh_CN.qdocconf @@ -32,28 +32,28 @@ qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.0 # Files not referenced in any qdoc file (last four are needed by qtdemo) # See also extraimages.HTML qhp.Qt.extraFiles = index.html \ - images/bg_l.png \ - images/bg_l_blank.png \ - images/bg_r.png \ - images/box_bg.png \ - images/breadcrumb.png \ - images/bullet_gt.png \ - images/bullet_dn.png \ - images/bullet_sq.png \ - images/bullet_up.png \ - images/feedbackground.png \ - images/horBar.png \ - images/page.png \ - images/page_bg.png \ - images/sprites-combined.png \ - images/spinner.gif \ - images/stylesheet-coffee-plastique.png \ - images/taskmenuextension-example.png \ - images/coloreditorfactoryimage.png \ - images/dynamiclayouts-example.png \ - scripts/functions.js \ - scripts/jquery.js \ - style/style.css + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + style/style.css language = Cpp @@ -78,6 +78,7 @@ excludedirs = $QTDIR/src/3rdparty/clucene \ $QTDIR/src/3rdparty/wintab \ $QTDIR/src/3rdparty/zlib \ $QTDIR/doc/src/snippets \ + $QTDIR/doc/src/ja_JP \ $QTDIR/src/3rdparty/phonon/gstreamer \ $QTDIR/src/3rdparty/phonon/ds9 \ $QTDIR/src/3rdparty/phonon/qt7 \ diff --git a/tools/shared/symbian/epocroot.cpp b/tools/shared/symbian/epocroot.cpp index 064e056..ae1dcb1 100644 --- a/tools/shared/symbian/epocroot.cpp +++ b/tools/shared/symbian/epocroot.cpp @@ -105,10 +105,6 @@ static void fixEpocRoot(QString &path) { path.replace("\\", "/"); - if (path.size() > 1 && path[1] == QChar(':')) { - path = path.mid(2); - } - if (!path.size() || path[path.size()-1] != QChar('/')) { path += QChar('/'); } diff --git a/translations/check-ts.pl b/translations/check-ts.pl new file mode 100755 index 0000000..7b46bf5 --- /dev/null +++ b/translations/check-ts.pl @@ -0,0 +1,85 @@ +#! /usr/bin/perl -w + +use strict; + +# "qt" must come last to avoid prefix matching. +my @groups = ("assistant", "designer", "linguist", "qt_help", "qtconfig", "qvfb", "qt"); + +my %scores = (); +my %langs = (); + +my $files = join("\n", <*.ts>); +my $res = `xmlpatterns -param files=\"$files\" check-ts.xq`; +for my $i (split(/ /, $res)) { + $i =~ /^([^.]+).ts:(.*)$/; + my ($fn, $pc) = ($1, $2); + for my $g (@groups) { + if ($fn =~ /^${g}_(.*)$/) { + my $lang = $1; + $scores{$g}{$lang} = $pc; + $langs{$lang} = 1; + last; + } + } +} + +# now we move "qt" to the front, as it should be the first column. +pop @groups; +unshift @groups, "qt"; + +my $code = ""; + +print "L10n "; +for my $g (@groups) { + print " ".$g." "; +} +print "\n"; +for my $lang (sort(keys(%langs))) { + printf "%-5s ", $lang; + my $qt = 1; + my $rest = 1; + my $line = ""; + for my $g (@groups) { + my $pc = $scores{$g}{$lang}; + $pc = "0" if !defined($pc); + if (int($pc) < 98 or !$qt) { + if ($g eq "qt") { + $qt = 0; + } else { + $rest = 0; + } + } else { + $line .= " ".$g."_".$lang.".ts"; + } + printf " %-".(length($g)+1)."s", $pc; + } + if ($qt) { + $code .= " \\\n ".$line; + if (!$rest) { + print " (partial)"; + } + } else { + print " (excluded)"; + } + print "\n"; +} + +my $fn = "translations.pro"; +my $nfn = $fn."new"; +open IN, $fn or die; +open OUT, ">".$nfn or die; +while (1) { + $_ = <IN>; + last if (/^TRANSLATIONS /); + print OUT $_; +} +while ($_ =~ /\\\n$/) { + $_ = <IN>; +} +print OUT "TRANSLATIONS =".$code."\n"; +while (<IN>) { + print OUT $_; +} +close OUT; +close IN; +rename $nfn, $fn; diff --git a/translations/check-ts.xq b/translations/check-ts.xq new file mode 100644 index 0000000..2d6404c --- /dev/null +++ b/translations/check-ts.xq @@ -0,0 +1,3 @@ +for $file in tokenize($files, codepoints-to-string(10)) + let $fresh := doc($file)/TS/context/message[not (translation/@type = 'obsolete')] + return concat($file, ":", count($fresh/translation[not (@type = 'unfinished')]) * 100 idiv count($fresh)) diff --git a/translations/qt_de.ts b/translations/qt_de.ts index 226b7da..7d32ead 100644 --- a/translations/qt_de.ts +++ b/translations/qt_de.ts @@ -4,7 +4,7 @@ <context> <name>CloseButton</name> <message> - <location filename="../src/gui/widgets/qtabbar.cpp" line="+2266"/> + <location filename="../src/gui/widgets/qtabbar.cpp" line="+2313"/> <source>Close Tab</source> <translation>Schließen</translation> </message> @@ -12,7 +12,7 @@ <context> <name>FakeReply</name> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp" line="+2217"/> + <location filename="../src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp" line="+2278"/> <source>Fake error !</source> <translation>Fake error !</translation> </message> @@ -25,7 +25,7 @@ <context> <name>MAC_APPLICATION_MENU</name> <message> - <location filename="../src/gui/kernel/qapplication.cpp" line="+2316"/> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2348"/> <source>Services</source> <translation>Dienste</translation> </message> @@ -1275,7 +1275,7 @@ nach <translation>Diese Socket-Operation wird nicht unterstützt</translation> </message> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+614"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+625"/> <location filename="../src/network/socket/qabstractsocket.cpp" line="+203"/> <source>Socket operation timed out</source> <translation>Das Zeitlimit für die Operation wurde überschritten</translation> @@ -1597,7 +1597,7 @@ nach <context> <name>QDeclarativeAbstractAnimation</name> <message> - <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="+165"/> + <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="+166"/> <source>Cannot animate non-existent property "%1"</source> <translation>Die Eigenschaft '%1" existiert nicht und kann daher nicht animiert werden</translation> </message> @@ -1606,11 +1606,24 @@ nach <source>Cannot animate read-only property "%1"</source> <translation>Die Eigenschaft '%1" ist schreibgeschützt und kann daher nicht animiert werden</translation> </message> + <message> + <location filename="../src/declarative/util/qdeclarativeutilmodule.cpp" line="+122"/> + <source>Animation is an abstract class</source> + <translation>Die Klasse Animation ist abstrakt</translation> + </message> +</context> +<context> + <name>QDeclarativeAnchorAnimation</name> + <message> + <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="+2568"/> + <source>Cannot set a duration of < 0</source> + <translation>Es kann keine Zeitdauer <0 gesetzt werden</translation> + </message> </context> <context> <name>QDeclarativeAnchors</name> <message> - <location filename="../src/declarative/graphicsitems/qdeclarativeanchors.cpp" line="+181"/> + <location filename="../src/declarative/graphicsitems/qdeclarativeanchors.cpp" line="+180"/> <source>Possible anchor loop detected on fill.</source> <translation>Bei der Fülloperation wurde eine potentielle Endlosschleife der Anker festgestellt.</translation> </message> @@ -1676,9 +1689,17 @@ nach </message> </context> <context> + <name>QDeclarativeAnimatedImage</name> + <message> + <location filename="../src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp" line="+86"/> + <source>Qt was built without support for QMovie</source> + <translation>Diese Version der Qt-Bibliothek wurde ohne Unterstützung für die Klasse QMovie erstellt</translation> + </message> +</context> +<context> <name>QDeclarativeBehavior</name> <message> - <location filename="../src/declarative/util/qdeclarativebehavior.cpp" line="+122"/> + <location filename="../src/declarative/util/qdeclarativebehavior.cpp" line="+127"/> <source>Cannot change the animation assigned to a Behavior.</source> <translation>Die zu einem Behavior-Element gehörende Animation kann nicht geändert werden.</translation> </message> @@ -1686,7 +1707,7 @@ nach <context> <name>QDeclarativeBinding</name> <message> - <location filename="../src/declarative/qml/qdeclarativebinding.cpp" line="+222"/> + <location filename="../src/declarative/qml/qdeclarativebinding.cpp" line="+238"/> <source>Binding loop detected for property "%1"</source> <translation>Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt</translation> </message> @@ -1694,7 +1715,7 @@ nach <context> <name>QDeclarativeCompiledBindings</name> <message> - <location filename="../src/declarative/qml/qdeclarativecompiledbindings.cpp" line="+305"/> + <location filename="../src/declarative/qml/qdeclarativecompiledbindings.cpp" line="+372"/> <source>Binding loop detected for property "%1"</source> <translation>Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt</translation> </message> @@ -1703,16 +1724,16 @@ nach <name>QDeclarativeCompiler</name> <message> <location filename="../src/declarative/qml/qdeclarativecompiler.cpp" line="+186"/> - <location line="+1654"/> - <location line="+187"/> - <location line="+82"/> + <location line="+1596"/> + <location line="+186"/> + <location line="+81"/> <location line="+75"/> - <location line="+488"/> + <location line="+487"/> <source>Invalid property assignment: "%1" is a read-only property</source> <translation>Ungültige Zuweisung bei Eigenschaft: "%1" ist schreibgeschützt</translation> </message> <message> - <location line="-2477"/> + <location line="-2416"/> <source>Invalid property assignment: unknown enumeration</source> <translation>Ungültige Zuweisung bei Eigenschaft: Ungültiger Aufzählungswert</translation> </message> @@ -1727,32 +1748,32 @@ nach <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine URL erwartet</translation> </message> <message> - <location line="+6"/> + <location line="+10"/> <source>Invalid property assignment: unsigned int expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine vorzeichenloser Ganzzahlwert erwartet</translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>Invalid property assignment: int expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird ein Ganzzahlwert erwartet</translation> </message> <message> - <location line="+7"/> + <location line="+4"/> <source>Invalid property assignment: float expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine Gleitkommazahl erwartet</translation> </message> <message> - <location line="+7"/> + <location line="+3"/> <source>Invalid property assignment: double expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine Gleitkommazahl (double) erwartet</translation> </message> <message> - <location line="+7"/> + <location line="+6"/> <source>Invalid property assignment: color expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine Farbspezifikation erwartet</translation> </message> <message> - <location line="+7"/> + <location line="+8"/> <source>Invalid property assignment: date expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine Datumsangabe erwartet</translation> </message> @@ -1767,7 +1788,7 @@ nach <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine Datumsangabe erwartet</translation> </message> <message> - <location line="+8"/> + <location line="+9"/> <source>Invalid property assignment: point expected</source> <translation>Ungültige Zuweisung bei Eigenschaft: Es wird eine Koordinatenangabe für einen Punkt erwartet</translation> </message> @@ -1797,63 +1818,38 @@ nach <translation>Ungültige Zuweisung bei Eigenschaft: Der Typ "%1" ist nicht unterstützt</translation> </message> <message> - <location line="+269"/> + <location line="+277"/> <source>Element is not creatable.</source> <translation>Das Element kann nicht erzeugt werden.</translation> </message> <message> - <location line="+603"/> + <location line="+618"/> <source>Component elements may not contain properties other than id</source> <translation>Komponenten dürfen außer id keine weiteren Eigenschaften enthalten.</translation> </message> <message> - <location line="+3"/> - <source>Component elements may not contain script blocks</source> - <translation>Komponenten dürfen keine Skripte enthalten</translation> - </message> - <message> <location line="+7"/> <source>Invalid component id specification</source> <translation>Ungültige Komponentenspezifikation</translation> </message> <message> <location line="+6"/> - <location line="+558"/> + <location line="+478"/> <source>id is not unique</source> <translation>ID-Wert nicht eindeutig</translation> </message> <message> - <location line="-548"/> + <location line="-468"/> <source>Invalid component body specification</source> <translation>Inhalt der Komponente ungültig</translation> </message> <message> - <location line="+7"/> + <location line="+14"/> <source>Cannot create empty component specification</source> <translation>Es kann keine leere Komponentenangabe erzeugt werden</translation> </message> <message> - <location line="+19"/> - <source>Invalid Script block. Specify either the source property or inline script</source> - <translation>Ungültiges Skript. Es muss die Eigenschaft oder ein eingebettetes Skript angegeben werden</translation> - </message> - <message> - <location line="+4"/> - <source>Invalid Script source value</source> - <translation>Ungültige Angabe für Skript</translation> - </message> - <message> - <location line="+25"/> - <source>Properties cannot be set on Script block</source> - <translation>Für ein Skript können keine Eigenschaften angegeben werden</translation> - </message> - <message> - <location line="+14"/> - <source>Invalid Script block</source> - <translation>Ungültiges Skript</translation> - </message> - <message> - <location line="+128"/> + <location line="+105"/> <source>Empty signal assignment</source> <translation>Leere Signalzuweisung</translation> </message> @@ -1869,29 +1865,29 @@ nach </message> <message> <location line="+15"/> - <location line="+104"/> + <location line="+102"/> <source>Non-existent attached object</source> <translation>Es existiert kein Bezugselement für die Eigenschaft</translation> </message> <message> - <location line="-100"/> - <location line="+103"/> + <location line="-98"/> + <location line="+101"/> <source>Invalid attached object assignment</source> <translation>Ungültige Zuweisung des Bezugselements</translation> </message> <message> - <location line="-50"/> + <location line="-48"/> <source>Cannot assign to non-existent default property</source> <translation>Es kann keine Zuweisung erfolgen, da keine Vorgabe-Eigenschaft existiert</translation> </message> <message> <location line="+2"/> - <location line="+355"/> + <location line="+352"/> <source>Cannot assign to non-existent property "%1"</source> <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert</translation> </message> <message> - <location line="-324"/> + <location line="-322"/> <source>Invalid use of namespace</source> <translation>Ungültige Verwendung eines Namensraums</translation> </message> @@ -1901,24 +1897,44 @@ nach <translation>Kein gültiger Name einer Eigenschaft des Typs 'attached'</translation> </message> <message> - <location line="+183"/> + <location line="+182"/> <source>Invalid use of id property</source> <translation>Ungültige Verwendung einer Eigenschaft des Typs 'Id'</translation> </message> <message> - <location line="-356"/> + <location line="-357"/> <source>Incorrectly specified signal assignment</source> <translation></translation> </message> <message> - <location line="+445"/> + <location line="-100"/> + <source>Component objects cannot declare new properties.</source> + <translation>Komponentenobjekte können keine neuen Eigenschaften deklarieren.</translation> + </message> + <message> + <location line="+2"/> + <source>Component objects cannot declare new signals.</source> + <translation>Komponentenobjekte können keine neuen Signale deklarieren.</translation> + </message> + <message> + <location line="+2"/> + <source>Component objects cannot declare new functions.</source> + <translation>Komponentenobjekte können keine neuen Funktionen deklarieren.</translation> + </message> + <message> + <location line="+108"/> + <source>Cannot assign a value to a signal (expecting a script to be run)</source> + <translation>Einem Signal können keine Werte zugewiesen werden (es wird ein Skript erwartet)</translation> + </message> + <message> + <location line="+434"/> <location line="+2"/> <source>Property has already been assigned a value</source> <translation>Der Eigenschaft wurde bereits ein Wert zugewiesen</translation> </message> <message> <location line="+12"/> - <location line="+8"/> + <location line="+7"/> <source>Invalid grouped property access</source> <translation>Falsche Gruppierung bei Zugriff auf Eigenschaft</translation> </message> @@ -1973,7 +1989,7 @@ nach <translation>Ungültige Zuweisung bei Eigenschaft: Es wird ein Skript erwartet</translation> </message> <message> - <location line="+106"/> + <location line="+105"/> <source>Cannot assign object to property</source> <translation>Zuweisung eines Objekts an eine Eigenschaft nicht zulässig</translation> </message> @@ -2033,7 +2049,7 @@ nach <translation>Eine als 'FINAL' ausgewiesene Eigenschaft kann nicht überschrieben werden</translation> </message> <message> - <location line="+25"/> + <location line="+24"/> <source>Invalid property type</source> <translation>Ungültiger Typ der Eigenschaft</translation> </message> @@ -2088,7 +2104,7 @@ nach <context> <name>QDeclarativeComponent</name> <message> - <location filename="../src/declarative/qml/qdeclarativecomponent.cpp" line="+452"/> + <location filename="../src/declarative/qml/qdeclarativecomponent.cpp" line="+459"/> <source>Invalid empty URL</source> <translation>Ungültige (leere) URL</translation> </message> @@ -2096,23 +2112,23 @@ nach <context> <name>QDeclarativeCompositeTypeManager</name> <message> - <location filename="../src/declarative/qml/qdeclarativecompositetypemanager.cpp" line="+483"/> - <location line="+268"/> + <location filename="../src/declarative/qml/qdeclarativecompositetypemanager.cpp" line="+475"/> + <location line="+266"/> <source>Resource %1 unavailable</source> <translation>Auf die Ressource %1 konnte nicht zugegriffen werden</translation> </message> <message> - <location line="-119"/> + <location line="-122"/> <source>Namespace %1 cannot be used as a type</source> <translation>Der Namensraum %1 kann nicht als Typangabe verwendet werden</translation> </message> <message> <location line="+2"/> - <source>%1 is not a type</source> - <translation>%1 ist keine Typangabe</translation> + <source>%1 %2</source> + <translation>%1 %2</translation> </message> <message> - <location line="+46"/> + <location line="+47"/> <source>Type %1 unavailable</source> <translation>Der Typ %1 ist nicht verfügbar</translation> </message> @@ -2120,14 +2136,13 @@ nach <context> <name>QDeclarativeConnections</name> <message> - <location filename="../src/declarative/util/qdeclarativeconnections.cpp" line="+172"/> - <location line="+54"/> - <location line="+7"/> + <location filename="../src/declarative/util/qdeclarativeconnections.cpp" line="+209"/> + <location line="+60"/> <source>Cannot assign to non-existent property "%1"</source> <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert</translation> </message> <message> - <location line="-51"/> + <location line="-50"/> <source>Connections: nested objects not allowed</source> <translation>Verbindungen: Verschachtelte Objekte sind nicht zulässig</translation> </message> @@ -2175,13 +2190,29 @@ nach <source>SQL: database version mismatch</source> <translation>SQL: Die Version der Datenbank entspricht nicht der erwarteten Version</translation> </message> +</context> +<context> + <name>QDeclarativeFlipable</name> + <message> + <location filename="../src/declarative/graphicsitems/qdeclarativeflipable.cpp" line="+129"/> + <source>front is a write-once property</source> + <translation>'front' kann nur einmal zugewiesen werden</translation> + </message> + <message> + <location line="+19"/> + <source>back is a write-once property</source> + <translation>'back' kann nur einmal zugewiesen werden</translation> + </message> +</context> +<context> + <name>QDeclarativeImportDatabase</name> <message> - <location filename="../src/declarative/qml/qdeclarativeengine.cpp" line="+1515"/> + <location filename="../src/declarative/qml/qdeclarativeimport.cpp" line="+294"/> <source>module "%1" definition "%2" not readable</source> <translation>Modul "%1" Definition "%2" kann nicht gelesen werden</translation> </message> <message> - <location line="+23"/> + <location line="+20"/> <source>plugin cannot be loaded for module "%1": %2</source> <translation>Das Plugin des Moduls "%1" konnte nicht geladen werden: %2</translation> </message> @@ -2191,7 +2222,7 @@ nach <translation>Modul "%1" Plugin "%2" konnte nicht gefunden werden</translation> </message> <message> - <location line="+82"/> + <location line="+79"/> <location line="+55"/> <source>module "%1" version %2.%3 is not installed</source> <translation>Modul "%1" Version %2.%3 ist nicht installiert</translation> @@ -2210,29 +2241,59 @@ nach <message> <location line="-2"/> <source>import "%1" has no qmldir and no namespace</source> - <translation>"qmldir" und Namensraum fehlt bei Import "%1"</translation> + <translation>"qmldir" und Namensraum fehlen bei dem Import "%1"</translation> </message> -</context> -<context> - <name>QDeclarativeFlipable</name> <message> - <location filename="../src/declarative/graphicsitems/qdeclarativeflipable.cpp" line="+125"/> - <source>front is a write-once property</source> - <translation>'front' kann nur einmal zugewiesen werden</translation> + <location line="+46"/> + <source>- %1 is not a namespace</source> + <translation>- %1 ist kein gültiger Namensraum</translation> </message> <message> - <location line="+19"/> - <source>back is a write-once property</source> - <translation>'back' kann nur einmal zugewiesen werden</translation> + <location line="+6"/> + <source>- nested namespaces not allowed</source> + <translation>- geschachtelte Namensräume sind nicht zulässig</translation> + </message> + <message> + <location line="+47"/> + <location line="+4"/> + <source>local directory</source> + <translation>Lokales Verzeichnis'</translation> + </message> + <message> + <location line="+6"/> + <source>is ambiguous. Found in %1 and in %2</source> + <translation>ist mehrdeutig. Es kommt in %1 und in %2 vor</translation> + </message> + <message> + <location line="+4"/> + <source>is ambiguous. Found in %1 in version %2.%3 and %4.%5</source> + <translation>ist mehrdeutig. Es kommt in %1 in den Version %2.%3 und %4.%5 vor</translation> + </message> + <message> + <location line="+14"/> + <source>is instantiated recursively</source> + <translation>wird rekursiv instanziiert</translation> + </message> + <message> + <location line="+2"/> + <source>is not a type</source> + <translation>ist kein Typ</translation> </message> </context> <context> - <name>QDeclarativeInfo</name> + <name>QDeclarativeKeyNavigationAttached</name> <message> - <location filename="../src/declarative/qml/qdeclarativeinfo.cpp" line="+113"/> - <location line="+3"/> - <source>unknown location</source> - <translation>Unbekannter Ort</translation> + <location filename="../src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp" line="+70"/> + <source>KeyNavigation is only available via attached properties</source> + <translation>Tastennavigation ist nur über Eigenschaften des Typs 'attached' verfügbar</translation> + </message> +</context> +<context> + <name>QDeclarativeKeysAttached</name> + <message> + <location line="+1"/> + <source>Keys is only available via attached properties</source> + <translation>Die Unterstützung für Tasten ist nur über Eigenschaften des Typs 'attached' verfügbar</translation> </message> </context> <context> @@ -2263,12 +2324,7 @@ nach <translation>append: Der Wert ist kein Objekt</translation> </message> <message> - <location line="+34"/> - <source>get: index %1 out of range</source> - <translation>get: Der Index %1 ist außerhalb des gültigen Bereichs</translation> - </message> - <message> - <location line="+25"/> + <location line="+55"/> <source>set: value is not an object</source> <translation>set: Der Wert ist kein Objekt</translation> </message> @@ -2303,7 +2359,7 @@ nach <context> <name>QDeclarativeLoader</name> <message> - <location filename="../src/declarative/graphicsitems/qdeclarativeloader.cpp" line="+309"/> + <location filename="../src/declarative/graphicsitems/qdeclarativeloader.cpp" line="+323"/> <source>Loader does not support loading non-visual elements.</source> <translation>Das Laden nicht-visueller Elemente ist nicht unterstützt.</translation> </message> @@ -2311,7 +2367,7 @@ nach <context> <name>QDeclarativeParentAnimation</name> <message> - <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="+2370"/> + <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="-169"/> <source>Unable to preserve appearance under complex transform</source> <translation>Das Erscheinungsbild kann bei einer komplexen Transformation nicht beibehalten werden</translation> </message> @@ -2330,7 +2386,7 @@ nach <context> <name>QDeclarativeParentChange</name> <message> - <location filename="../src/declarative/util/qdeclarativestateoperations.cpp" line="+94"/> + <location filename="../src/declarative/util/qdeclarativestateoperations.cpp" line="+95"/> <source>Unable to preserve appearance under complex transform</source> <translation>Das Erscheinungsbild kann bei einer komplexen Transformation nicht beibehalten werden</translation> </message> @@ -2349,7 +2405,7 @@ nach <context> <name>QDeclarativeParser</name> <message> - <location filename="../src/declarative/qml/parser/qdeclarativejslexer.cpp" line="+558"/> + <location filename="../src/declarative/qml/parser/qdeclarativejslexer.cpp" line="+579"/> <source>Illegal character</source> <translation>Ungültiges Zeichen</translation> </message> @@ -2364,17 +2420,19 @@ nach <translation>Ungültiges Escape-Sequenz</translation> </message> <message> - <location line="+46"/> + <location line="-77"/> + <location line="+123"/> + <location line="+54"/> <source>Illegal unicode escape sequence</source> <translation>Ungültige Unicode-Escape-Sequenz</translation> </message> <message> - <location line="+26"/> + <location line="-28"/> <source>Unclosed comment at end of file</source> <translation>Kommentar am Dateiende nicht abgeschlossen</translation> </message> <message> - <location line="+87"/> + <location line="+102"/> <source>Illegal syntax for exponential number</source> <translation>Ungültige Syntax des Exponenten</translation> </message> @@ -2384,16 +2442,27 @@ nach <translation>Ein Bezeichner darf nicht mit einem numerischen Literal beginnen</translation> </message> <message> - <location line="+331"/> + <location line="+338"/> <source>Unterminated regular expression literal</source> <translation>Regulärer Ausdruck nicht abgeschlossen</translation> </message> <message> - <location line="+24"/> + <location line="+15"/> <source>Invalid regular expression flag '%0'</source> <translation>Ungültiger Modifikator '%0' bei regulärem Ausdruck</translation> </message> <message> + <location line="+16"/> + <location line="+22"/> + <source>Unterminated regular expression backslash sequence</source> + <translation>Regulärer Ausdruck nicht abgeschlossen</translation> + </message> + <message> + <location line="+13"/> + <source>Unterminated regular expression class</source> + <translation>Klasse im regulären Ausdruck nicht abgeschlossen</translation> + </message> + <message> <location filename="../src/declarative/qml/parser/qdeclarativejsparser.cpp" line="+1828"/> <location line="+67"/> <source>Syntax error</source> @@ -2411,28 +2480,28 @@ nach <translation>Es wird das Element '%1' erwartet</translation> </message> <message> - <location filename="../src/declarative/qml/qdeclarativescriptparser.cpp" line="+264"/> - <location line="+481"/> + <location filename="../src/declarative/qml/qdeclarativescriptparser.cpp" line="+260"/> + <location line="+431"/> <location line="+59"/> <source>Property value set multiple times</source> <translation>Mehrfache Zuweisung eines Wertes an eine Eigenschaft</translation> </message> <message> - <location line="-529"/> + <location line="-479"/> <source>Expected type name</source> <translation>Es wird ein Typname erwartet</translation> </message> <message> - <location line="+29"/> - <source>Invalid use of Script block</source> - <translation>Ungültige Verwendung von Skript-Blöcken</translation> - </message> - <message> - <location line="+161"/> + <location line="+136"/> <source>Invalid import qualifier ID</source> <translation>Ungültige Id-Angabe bei Import</translation> </message> <message> + <location line="+8"/> + <source>Reserved name "Qt" cannot be used as an qualifier</source> + <translation>Der reservierte Name "Qt" kann nicht als Bezeichner verwendet werden</translation> + </message> + <message> <location line="+15"/> <source>Script import qualifiers must be unique.</source> <translation>Der für den Skript-Import angegebene Qualifizierer muss eindeutig sein.</translation> @@ -2448,7 +2517,7 @@ nach <translation>Der Import einer Bibliothek erfordert eine Versionsangabe</translation> </message> <message> - <location line="+60"/> + <location line="+59"/> <source>Expected parameter type</source> <translation>Es wird eine Typangabe für den Parameter erwartet</translation> </message> @@ -2473,20 +2542,15 @@ nach <translation>'read-only' wird an dieser Stelle noch nicht unterstützt</translation> </message> <message> - <location line="+222"/> + <location line="+215"/> <source>JavaScript declaration outside Script element</source> <translation>Eine JavaScript-Deklaration ist außerhalb eines Skriptelementes nicht zulässig</translation> </message> - <message> - <location line="+19"/> - <source>Variable declarations not allow in inline Script blocks</source> - <translation>Variablendeklarationen sind in eingebetteten Script-Blöcken nicht zulässig</translation> - </message> </context> <context> <name>QDeclarativePauseAnimation</name> <message> - <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="-1972"/> + <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="-1990"/> <source>Cannot set a duration of < 0</source> <translation>Es kann keine Zeitdauer <0 gesetzt werden</translation> </message> @@ -2494,7 +2558,7 @@ nach <context> <name>QDeclarativePixmapCache</name> <message> - <location filename="../src/declarative/util/qdeclarativepixmapcache.cpp" line="+197"/> + <location filename="../src/declarative/util/qdeclarativepixmapcache.cpp" line="+190"/> <source>Error decoding: %1: %2</source> <translation>Fehler beim Decodieren: %1: %2</translation> </message> @@ -2505,7 +2569,7 @@ nach </message> <message> <location line="+19"/> - <location line="+342"/> + <location line="+345"/> <source>Cannot open: %1</source> <translation>Fehlschlag beim Öffnen: %1</translation> </message> @@ -2518,7 +2582,7 @@ nach <context> <name>QDeclarativePropertyAnimation</name> <message> - <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="+1100"/> + <location filename="../src/declarative/util/qdeclarativeanimation.cpp" line="+1113"/> <source>Cannot set a duration of < 0</source> <translation>Es kann keine Zeitdauer <0 gesetzt werden</translation> </message> @@ -2526,12 +2590,12 @@ nach <context> <name>QDeclarativePropertyChanges</name> <message> - <location filename="../src/declarative/util/qdeclarativepropertychanges.cpp" line="+231"/> + <location filename="../src/declarative/util/qdeclarativepropertychanges.cpp" line="+267"/> <source>PropertyChanges does not support creating state-specific objects.</source> <translation>Die Erzeugung von Objekten, die einem Zustand zugeordnet sind, wird von PropertyChanges nicht unterstützt.</translation> </message> <message> - <location line="+151"/> + <location line="+157"/> <source>Cannot assign to non-existent property "%1"</source> <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert</translation> </message> @@ -2544,13 +2608,13 @@ nach <context> <name>QDeclarativeTextInput</name> <message> - <location filename="../src/declarative/graphicsitems/qdeclarativetextinput.cpp" line="+783"/> - <location line="+9"/> + <location filename="../src/declarative/graphicsitems/qdeclarativetextinput.cpp" line="+793"/> + <location line="+8"/> <source>Could not load cursor delegate</source> <translation>Cursor-Delegate konnte nicht geladen werden</translation> </message> <message> - <location line="+12"/> + <location line="+11"/> <source>Could not instantiate cursor delegate</source> <translation>Cursor-Delegate konnte angelegt werden</translation> </message> @@ -2563,7 +2627,7 @@ nach <translation>Es konnte kein Objekt des Typs %1 erzeugt werden</translation> </message> <message> - <location line="+380"/> + <location line="+390"/> <source>Cannot assign value %1 to property %2</source> <translation>Der Wert '%1' kann nicht der Eigenschaft %2 zugewiesen werden</translation> </message> @@ -2583,7 +2647,7 @@ nach <translation>Der Signal-Eigenschaft %1 kann kein Objekt zugewiesen werden</translation> </message> <message> - <location line="+153"/> + <location line="+146"/> <source>Cannot assign object to list</source> <translation>Zuweisung eines Objekts an eine Liste nicht zulässig</translation> </message> @@ -2606,15 +2670,24 @@ nach <context> <name>QDeclarativeVisualDataModel</name> <message> - <location filename="../src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp" line="+1032"/> + <location filename="../src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp" line="+1090"/> <source>Delegate component must be Item type.</source> <translation>Delegate-Komponente muss vom Typ 'Item' sein</translation> </message> </context> <context> + <name>QDeclarativeXmlListModel</name> + <message> + <location filename="../src/declarative/util/qdeclarativeutilmodule.cpp" line="-12"/> + <location line="+2"/> + <source>Qt was built without support for xmlpatterns</source> + <translation>Diese Version der Qt-Bibliothek wurde ohne Unterstützung für xmlpatterns erstellt</translation> + </message> +</context> +<context> <name>QDeclarativeXmlListModelRole</name> <message> - <location filename="../src/declarative/util/qdeclarativexmllistmodel_p.h" line="+168"/> + <location filename="../src/declarative/util/qdeclarativexmllistmodel_p.h" line="+174"/> <source>An XmlRole query must not start with '/'</source> <translation>Eine XmlRole-Abfrage darf nicht mit '/' beginnen</translation> </message> @@ -2622,7 +2695,7 @@ nach <context> <name>QDeclarativeXmlRoleList</name> <message> - <location filename="../src/declarative/util/qdeclarativexmllistmodel.cpp" line="+638"/> + <location filename="../src/declarative/util/qdeclarativexmllistmodel.cpp" line="+712"/> <source>An XmlListModel query must start with '/' or "//"</source> <translation>Eine XmlListModel-Abfrage muss mit '/' oder "//" beginnen</translation> </message> @@ -3690,7 +3763,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <translation>Unbekannter Fehler</translation> </message> <message> - <location filename="../src/network/kernel/qhostinfo.cpp" line="+175"/> + <location filename="../src/network/kernel/qhostinfo.cpp" line="+171"/> <source>No host name given</source> <translation>Es wurde kein Hostname angegeben</translation> </message> @@ -3698,9 +3771,9 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QHostInfoAgent</name> <message> - <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+259"/> + <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+260"/> <location line="+32"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+216"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+215"/> <location line="+27"/> <source>Host not found</source> <translation>Rechner konnte nicht gefunden werden</translation> @@ -4051,7 +4124,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QIODevice</name> <message> - <location filename="../src/corelib/global/qglobal.cpp" line="+2099"/> + <location filename="../src/corelib/global/qglobal.cpp" line="+2120"/> <source>Permission denied</source> <translation>Zugriff verweigert</translation> </message> @@ -4071,7 +4144,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <translation>Kein freier Speicherplatz auf dem Gerät vorhanden</translation> </message> <message> - <location filename="../src/corelib/io/qiodevice.cpp" line="+1596"/> + <location filename="../src/corelib/io/qiodevice.cpp" line="+1598"/> <source>Unknown error</source> <translation>Unbekannter Fehler</translation> </message> @@ -4188,7 +4261,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QLineEdit</name> <message> - <location filename="../src/gui/widgets/qlineedit.cpp" line="+2110"/> + <location filename="../src/gui/widgets/qlineedit.cpp" line="+2116"/> <source>Select All</source> <translation>Alles auswählen</translation> </message> @@ -4509,39 +4582,6 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> </context> <context> - <name>QMediaPlayer</name> - <message> - <location filename="../src/multimedia/playback/qmediaplayer.cpp" line="+496"/> - <source>The QMediaPlayer object does not have a valid service</source> - <translation>Das QMediaPlayer-Objekt verfügt über keinen gültigen Dienst</translation> - </message> -</context> -<context> - <name>QMediaPlaylist</name> - <message> - <location filename="../src/multimedia/base/qmediaplaylist.cpp" line="+455"/> - <location line="+46"/> - <source>Could not add items to read only playlist.</source> - <translation>Es konnten keine Einträge zur Wiedergabeliste hinzugefügt werden, da sie schreibgeschützt ist.</translation> - </message> - <message> - <location line="-27"/> - <location line="+46"/> - <source>Playlist format is not supported</source> - <translation>Das Format der Wiedergabeliste ist nicht unterstützt</translation> - </message> - <message> - <location line="+26"/> - <source>The file could not be accessed.</source> - <translation>Auf die Datei konnte nicht zugegriffen werden.</translation> - </message> - <message> - <location line="+35"/> - <source>Playlist format is not supported.</source> - <translation>Das Format der Wiedergabeliste ist nicht unterstützt.</translation> - </message> -</context> -<context> <name>QMenu</name> <message> <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/> @@ -4566,7 +4606,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QMenuBar</name> <message> - <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+452"/> + <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+456"/> <source>Actions</source> <translation>Optionen</translation> </message> @@ -4867,7 +4907,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QNetworkAccessHttpBackend</name> <message> - <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+645"/> + <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+652"/> <source>No suitable proxy found</source> <translation>Es konnte kein geeigneter Proxy-Server gefunden werden</translation> </message> @@ -4875,7 +4915,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QNetworkAccessManager</name> <message> - <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+910"/> + <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+942"/> <source>Network access is disabled.</source> <translation>Der Zugriff auf das Netzwerk ist nicht gestattet.</translation> </message> @@ -4883,12 +4923,12 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QNetworkReply</name> <message> - <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+101"/> + <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+100"/> <source>Error downloading %1 - server replied: %2</source> <translation>Beim Herunterladen von %1 trat ein Fehler auf - Die Antwort des Servers ist: %2</translation> </message> <message> - <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="-828"/> + <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="-860"/> <source>Protocol "%1" is unknown</source> <translation>Das Protokoll "%1" ist unbekannt</translation> </message> @@ -4898,7 +4938,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <translation>Fehler bei Netzwerkverbindung.</translation> </message> <message> - <location line="+329"/> + <location line="+352"/> <source>Temporary network failure.</source> <translation>Das Netzwerk ist zur Zeit ausgefallen.</translation> </message> @@ -4906,7 +4946,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QNetworkReplyImpl</name> <message> - <location line="+111"/> + <location line="+120"/> <location line="+28"/> <source>Operation canceled</source> <translation>Operation abgebrochen</translation> @@ -4924,7 +4964,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> <name>QNetworkSessionPrivateImpl</name> <message> <location filename="../src/plugins/bearer/qnetworksession_impl.cpp" line="+272"/> - <location filename="../src/plugins/bearer/symbian/qnetworksession_impl.cpp" line="+227"/> + <location filename="../src/plugins/bearer/symbian/qnetworksession_impl.cpp" line="+271"/> <source>Unknown session error.</source> <translation>Unbekannter Fehler bei Netzwerkverbindung.</translation> </message> @@ -5130,11 +5170,17 @@ Möchten Sie die Datei trotzdem löschen?</translation> <context> <name>QObject</name> <message> - <location filename="../src/declarative/util/qdeclarativexmllistmodel.cpp" line="-194"/> + <location filename="../src/declarative/util/qdeclarativexmllistmodel.cpp" line="-241"/> <source>"%1" duplicates a previous role name and will be disabled.</source> <translation>"%1" ist bereits als Name einer Rolle vergeben und wird daher deaktiviert.</translation> </message> <message> + <location line="+515"/> + <location line="+4"/> + <source>invalid query: "%1"</source> + <translation>Ungültige Abfrage: "%1"</translation> + </message> + <message> <location filename="../src/3rdparty/phonon/phonon/pulsesupport.cpp" line="+162"/> <location line="+11"/> <source>PulseAudio Sound Server</source> @@ -6212,7 +6258,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <context> <name>QSQLiteDriver</name> <message> - <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+538"/> + <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+539"/> <source>Error opening database</source> <translation>Die Datenbankverbindung konnte nicht geöffnet werden</translation> </message> @@ -6240,8 +6286,8 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <context> <name>QSQLiteResult</name> <message> - <location line="-395"/> - <location line="+62"/> + <location line="-396"/> + <location line="+63"/> <location line="+8"/> <source>Unable to fetch row</source> <translation>Der Datensatz konnte nicht abgeholt werden</translation> @@ -6267,7 +6313,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>Die Anzahl der Parameter ist falsch</translation> </message> <message> - <location line="-200"/> + <location line="-201"/> <source>No query</source> <translation>Kein Abfrage</translation> </message> @@ -6810,8 +6856,9 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <context> <name>QShortcut</name> <message> - <location filename="../src/gui/kernel/qkeysequence.cpp" line="+393"/> + <location filename="../src/gui/kernel/qkeysequence.cpp" line="+396"/> <source>Space</source> + <extracomment>This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used.</extracomment> <translation>Leertaste</translation> </message> <message> @@ -7999,7 +8046,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>Abbrechen</translation> </message> <message> - <location filename="../src/gui/kernel/qsoftkeymanager_s60.cpp" line="+319"/> + <location filename="../src/gui/kernel/qsoftkeymanager_s60.cpp" line="+321"/> <source>Exit</source> <translation>Beenden</translation> </message> @@ -8343,7 +8390,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <context> <name>QTextControl</name> <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+2036"/> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+2046"/> <source>&Undo</source> <translation>&Rückgängig</translation> </message> @@ -9056,7 +9103,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>Unbekannt</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+236"/> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+253"/> <source>Web Inspector - %2</source> <translation>Web Inspector - %2</translation> </message> @@ -9067,7 +9114,12 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>%1 (%2x%3 Pixel)</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+456"/> + <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+347"/> + <source>Redirection limit reached</source> + <translation>Maximal Anzahl von Weiterleitungen wurde erreicht</translation> + </message> + <message> + <location line="+121"/> <source>Bad HTTP request</source> <translation>Ungültige HTTP-Anforderung</translation> </message> @@ -9152,7 +9204,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1959"/> + <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+2033"/> <source>JavaScript Alert - %1</source> <translation>JavaScript-Hinweis - %1</translation> </message> @@ -9177,7 +9229,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>Das Skript dieser Webseite ist fehlerhaft. Möchten Sie es anhalten?</translation> </message> <message> - <location line="+374"/> + <location line="+395"/> <source>Move the cursor to the next character</source> <translation>Positionsmarke auf folgendes Zeichen setzen</translation> </message> @@ -9398,7 +9450,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <context> <name>QWidget</name> <message> - <location filename="../src/gui/kernel/qwidget.cpp" line="+5809"/> + <location filename="../src/gui/kernel/qwidget.cpp" line="+5806"/> <source>*</source> <translation>*</translation> </message> @@ -11303,13 +11355,13 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <location line="+28"/> - <location line="+408"/> + <location line="+415"/> <location line="+30"/> <source>Type %1 of %2 element cannot be resolved.</source> <translation>Der Typ %1 des Elements %2 kann nicht aufgelöst werden.</translation> </message> <message> - <location line="-416"/> + <location line="-423"/> <source>Base type %1 of complex type cannot be resolved.</source> <translation>Der Basistyp %1 des komplexen Typs kann nicht aufgelöst werden.</translation> </message> @@ -11319,7 +11371,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>%1 kann keinen komplexen Basistyp haben, der '%2' spezifiziert.</translation> </message> <message> - <location line="+279"/> + <location line="+286"/> <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source> <translation>Das Inhaltsmodell des komplexen Typs %1enthält ein Element '%2'; es kann daher nicht durch Erweiterung von einem Typ abgeleitet werden, der nicht leer ist.</translation> </message> @@ -12229,27 +12281,4 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <translation>Das Attribut '%1' enthält einen ungültigen qualifizierten Namen: %2.</translation> </message> </context> -<context> - <name>Widget</name> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/tests/hybridPixmap/widget.ui"/> - <source>Widget</source> - <translation>Widget</translation> - </message> - <message> - <location/> - <source>about:blank</source> - <translation>about:blank</translation> - </message> - <message> - <location/> - <source>Image from Qt to HTML</source> - <translation>Bild von Qt zu HTML</translation> - </message> - <message> - <location/> - <source>Pixmap from Qt to HTML</source> - <translation>Pixmap von Qt zu HTML</translation> - </message> -</context> </TS> diff --git a/translations/qt_ja_JP.ts b/translations/qt_ja.ts index e6f92b7..e6f92b7 100644 --- a/translations/qt_ja_JP.ts +++ b/translations/qt_ja.ts diff --git a/translations/translations.pri b/translations/translations.pri index 2edc89a..9ab72fc 100644 --- a/translations/translations.pri +++ b/translations/translations.pri @@ -13,7 +13,7 @@ LUPDATE += -locations relative -no-ui-lines ###### Qt Libraries -QT_TS = ar cs da de es fr he hu ja_JP pl pt ru sk sl sv uk zh_CN zh_TW +QT_TS = ar cs da de es fr he hu ja pl pt ru sk sl sv uk zh_CN zh_TW ts-qt.commands = (cd $$QT_SOURCE_TREE/src && $$LUPDATE \ -I../include -I../include/Qt \ @@ -73,5 +73,8 @@ ts-qvfb.depends = sub-tools ts.depends = ts-qt ts-designer ts-linguist ts-assistant ts-qtconfig ts-qvfb +check-ts.commands = (cd $$PWD && perl check-ts.pl) +check-ts.depends = ts + QMAKE_EXTRA_TARGETS += ts-qt ts-designer ts-linguist ts-assistant ts-qtconfig ts-qvfb \ - ts + ts check-ts |