Merge "Merge remote branch 'gerrit/master' into refactor" into refactor

This commit is contained in:
Lars Knoll 2011-07-12 16:11:03 +02:00 committed by Qt by Nokia
commit 2770415f92
141 changed files with 1654 additions and 2673 deletions

22
dist/changes-4.8.0 vendored
View File

@ -63,6 +63,15 @@ QtGui
- Deprecate qGenericMatrixFromMatrix4x4 and qGenericMatrixToMatrix4x4
- QListView diverses optimisations [QTBUG-11438]
- QTreeWidget/QListWidget: use localeAwareCompare for string comparisons [QTBUG-10839]
- PNG image I/O: Much improved support for text annotations, including iTXt fields.
- QRawFont and QGlyphRun are introduced for low-level text rendering. [QTBUG-18252]
- QFont: hintingPreference() is introduced to control hinting in font rendering and
subpixel positioning of glyphs for Windows, Mac OS X and X11/raster. [QTBUG-10615]
- Subpixel positioned text layout is supported in raster and OpenGL paint engines.
- QFont: styleName() is added to allow selecting fonts with irregular style names
like UltraLight. [QTBUG-19366]
- Visual text cursor movement behavior is added to QTextEdit and QLineEdit controls,
which can be used as an optional mode for bi-directional text editing. [QTBUG-13859]
QtNetwork
---------
@ -103,15 +112,22 @@ QtScript
Qt for Linux/X11
----------------
- Now takes font hinting settings from GConf by default if running in
GNOME desktop.
- Various fixes to FontConfig font matching code to make it consistent
with other X11 programs. [QTBUG-2148, QTBUG-19947, QTBUG-14269]
Qt for Windows
--------------
- DirectWrite experimental text shaping engine is added with subpixel
positioning support. [QTBUG-12678]
Qt for Mac OS X
---------------
- raster graphics system is now made as the default paint engine for
Mac OS X. [QTBUG-12615]
- HarfBuzz can now be used as an optional text layout engine on Mac OS X.
[QTBUG-17728]
Qt for Embedded Linux
---------------------

View File

@ -29,7 +29,7 @@
\example painting/affine
\title Affine Transformations
In this demo we show Qt's ability to perform affine transformations
In this example we show Qt's ability to perform affine transformations
on painting operations.
\image affine-demo.png

View File

@ -27,9 +27,9 @@
/*!
\example sql/books
\title Books Demonstration
\title Books
The Books demonstration shows how Qt's SQL classes can be used with the model/view
The Books example shows how Qt's SQL classes can be used with the model/view
framework to create rich user interfaces for information stored in a database.
\image books-demo.png

View File

@ -26,7 +26,7 @@
****************************************************************************/
/*!
\example embedded/styledemo
\example embedded/styleexample
\title Embedded Styles
\image styledemo-demo.png

View File

@ -777,7 +777,7 @@
\section2 4.2 Qt Documentation
Qt 4.7 comes with 17 examples and 2 Demonstrations for model/view.
Qt 5.0 comes with 19 examples for model/view.
The examples can be found on the \l{Item Views Examples} page.
\table
@ -841,6 +841,11 @@
\o QTableView
\o QStandardItemModel
\o
\row
\o Interview
\o Multiple
\o Custom item model
\o Multiple views
\row
\o Pixelator
\o QTableView
@ -871,24 +876,16 @@
\o QTableView
\o QStandardItemModel
\o Custom delegate that uses a spin box as a cell editor
\row
\o Spreadsheet
\o {2, 1} QTableView
\o Custom delegates
\row
\o Star Delegate
\o {2, 1} QTableWidget
\o Comprehensive custom delegate example.
\endtable
\l{Qt Demonstrations}{Demonstrations} are similar to examples except that no
walkthrough is provided for the code. Demonstrations are typically more
feature rich than examples.
\list
\o The \bold Interview demonstration shows the same model and
selection being shared between three different views.
\o The \bold Spreadsheet demonstration illustrates the use of a
table view as a spreadsheet, using custom delegates to render
each item according to the type of data it contains.
\endlist
A \l{Model/View Programming}{reference document} for model/view technology
is also available.
*/

View File

@ -1,39 +1,8 @@
Qt is supplied with a number of example applications and demonstrations that
have been written to provide developers with examples of the Qt API in use,
Qt is supplied with a number of example applications that have been
written to provide developers with examples of the Qt API in use,
highlight good programming practice, and showcase features found in each of
Qt's core technologies.
The example and demo launcher can be used to explore the different categories
available. It provides an overview of each example, lets you view the
documentation in Qt Assistant, and is able to launch examples and demos.
Documentation for examples can be found in the Tutorials and Examples section
Documentation for examples can be found in the Examples section
of the Qt documentation.
Finding the Qt Examples and Demos launcher
==========================================
On Windows:
The launcher can be accessed via the Windows Start menu. Select the menu
entry entitled "Qt Examples and Demos" entry in the submenu containing
the Qt tools.
On Mac OS X:
For the binary distribution, the qtdemo executable is installed in the
/Developer/Applications/Qt directory. For the source distribution, it is
installed alongside the other Qt tools on the path specified when Qt is
configured.
On Unix/Linux:
The qtdemo executable is installed alongside the other Qt tools on the path
specified when Qt is configured.
On all platforms:
The source code for the launcher can be found in the demos/qtdemo directory
in the Qt package. This example is built at the same time as the Qt libraries,
tools, examples, and demonstrations.

View File

@ -1,5 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = styledemo raycasting flickable digiflip
SUBDIRS = styleexample raycasting flickable digiflip
SUBDIRS += lightmaps
SUBDIRS += flightinfo

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 164 KiB

View File

Before

Width:  |  Height:  |  Size: 865 B

After

Width:  |  Height:  |  Size: 865 B

View File

@ -45,7 +45,7 @@
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Q_INIT_RESOURCE(styledemo);
Q_INIT_RESOURCE(styleexample);
app.setApplicationName("style");
app.setOrganizationName("Nokia");

View File

@ -4,15 +4,15 @@ TEMPLATE = app
HEADERS += stylewidget.h
FORMS += stylewidget.ui
SOURCES += main.cpp stylewidget.cpp
RESOURCES += styledemo.qrc
RESOURCES += styleexample.qrc
target.path = $$[QT_INSTALL_DEMOS]/qtbase/embedded/styledemo
target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/embedded/styleexample
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro *.html
sources.path = $$[QT_INSTALL_DEMOS]/qtbase/embedded/styledemo
sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/embedded/styleexample
INSTALLS += target sources
symbian {
TARGET.UID3 = 0xA000A63F
CONFIG += qt_demo
CONFIG += qt_example
}
QT += widgets widgets

View File

@ -314,7 +314,7 @@
</layout>
</widget>
<resources>
<include location="StyleDemo.qrc"/>
<include location="styleexample.qrc"/>
</resources>
<connections>
<connection>

View File

@ -78,7 +78,7 @@ MainWindow::MainWindow(QWidget *parent)
layout->addWidget(vSplitter);
setLayout(layout);
setWindowTitle(tr("Chip Demo"));
setWindowTitle(tr("Chip Example"));
}
void MainWindow::populateScene()

View File

@ -78,6 +78,6 @@ int main(int argc, char *argv[])
view.setBackgroundBrush(QPixmap(":/No-Ones-Laughing-3.jpg"));
view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
view.show();
view.setWindowTitle("Embedded Dialogs Demo");
view.setWindowTitle("Embedded Dialogs Example");
return app.exec();
}

View File

@ -64,7 +64,7 @@
#include <qdebug.h>
static const char * const message =
"<p><b>Qt Main Window Demo</b></p>"
"<p><b>Qt Main Window Example</b></p>"
"<p>This is a demonstration of the QMainWindow, QToolBar and "
"QDockWidget classes.</p>"
@ -88,7 +88,7 @@ MainWindow::MainWindow(const QMap<QString, QSize> &customSizeHints,
: QMainWindow(parent, flags)
{
setObjectName("MainWindow");
setWindowTitle("Qt Main Window Demo");
setWindowTitle("Qt Main Window Example");
center = new QTextEdit(this);
center->setReadOnly(true);

View File

@ -895,7 +895,7 @@ XFormWidget::XFormWidget(QWidget *parent)
// defaults
view->reset();
vectorType->setChecked(true);
textEditor->setText("Qt Affine Transformation Demo");
textEditor->setText("Qt Affine Transformation Example");
textEditor->setEnabled(false);
animateButton->animateClick();

View File

@ -1,9 +1,9 @@
<html>
<h1>Demo for composition modes</h1>
<h1>Example for composition modes</h1>
<p>
This demo shows some of the more advanced composition modes supported by Qt.
This example shows some of the more advanced composition modes supported by Qt.
</p>
<p>

View File

@ -1,9 +1,9 @@
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>QTextEdit Demonstration</title><style type="text/css">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>QTextEdit Example</title><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt; font-weight:600;">QTextEdit</span></p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">The QTextEdit widget is an advanced editor that supports formatted rich text. It can be used to display HTML and other rich document formats. Internally, QTextEdit uses the QTextDocument class to describe both the high-level structure of each document and the low-level formatting of paragraphs.</span></p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">If you are viewing this document in the <span style=" font-style:italic;">textedit</span> demo, you can edit this document to explore Qt's rich text editing features. We have included some comments in each of the following sections to encourage you to experiment. </p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">If you are viewing this document in the <span style=" font-style:italic;">textedit</span> example, you can edit this document to explore Qt's rich text editing features. We have included some comments in each of the following sections to encourage you to experiment. </p>
<p style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:18pt; font-weight:600;"><span style=" font-size:16pt;">Font and Paragraph Styles</span></p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">QTextEdit supports </span><span style=" font-size:11pt; font-weight:600;">bold</span><span style=" font-size:11pt;">, </span><span style=" font-size:11pt; font-style:italic;">italic</span><span style=" font-size:11pt;">, and </span><span style=" font-size:11pt; text-decoration: underline;">underlined</span><span style=" font-size:11pt;"> font styles, and can display </span><span style=" font-size:11pt; font-weight:600; color:#00007f;">multicolored</span><span style=" font-size:11pt;"> </span><span style=" font-size:11pt; font-weight:600; color:#aa0000;">text</span><span style=" font-size:11pt;">. Font families such as </span><span style=" font-family:'Times'; font-size:11pt; font-weight:600;">Times New Roman</span><span style=" font-size:11pt;"> and </span><span style=" font-family:'Courier'; font-size:11pt; font-weight:600;">Courier</span><span style=" font-size:11pt;"> can also be used directly. </span><span style=" font-size:11pt; font-style:italic;">If you place the cursor in a region of styled text, the controls in the tool bars will change to reflect the current style.</span></p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Paragraphs can be formatted so that the text is left-aligned, right-aligned, centered, or fully justified.</p>

View File

@ -130,7 +130,7 @@ for(QT_CURRENT_VERIFY, $$list($$QT_PLUGIN_VERIFY)) {
QMAKE_LIBDIR += $$QMAKE_LIBDIR_QT
# Topological ordering of modules based on their QT.<module>.depends variable
QT = $$resolve_depends($$QT, "QT.")
QT = $$sort_depends(QT, "QT.")
QT_DEPENDS=

View File

@ -219,7 +219,6 @@ public:
DataPath,
TranslationsPath,
SettingsPath,
DemosPath,
ExamplesPath,
ImportsPath
};

View File

@ -81,7 +81,7 @@ enum ExpandFunc { E_MEMBER=1, E_FIRST, E_LAST, E_CAT, E_FROMFILE, E_EVAL, E_LIST
E_SPRINTF, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION,
E_FIND, E_SYSTEM, E_UNIQUE, E_QUOTE, E_ESCAPE_EXPAND,
E_UPPER, E_LOWER, E_FILES, E_PROMPT, E_RE_ESCAPE, E_REPLACE,
E_SIZE, E_GENERATE_UID, E_RESOLVE_DEPENDS };
E_SIZE, E_GENERATE_UID, E_SORT_DEPENDS, E_RESOLVE_DEPENDS };
QMap<QString, ExpandFunc> qmake_expandFunctions()
{
static QMap<QString, ExpandFunc> *qmake_expand_functions = 0;
@ -114,6 +114,7 @@ QMap<QString, ExpandFunc> qmake_expandFunctions()
qmake_expand_functions->insert("replace", E_REPLACE);
qmake_expand_functions->insert("size", E_SIZE);
qmake_expand_functions->insert("generate_uid", E_GENERATE_UID);
qmake_expand_functions->insert("sort_depends", E_SORT_DEPENDS);
qmake_expand_functions->insert("resolve_depends", E_RESOLVE_DEPENDS);
}
return *qmake_expand_functions;
@ -1801,37 +1802,25 @@ QMakeProject::doProjectExpand(QString func, QStringList args,
// defined in symbian generator
extern QString generate_test_uid(const QString& target);
void calculateDeps(QStringList &sortedList, const QString &item, const QString &prefix,
QStringList &org, QMap<QString, QStringList> &place)
static void
populateDeps(const QStringList &deps, const QString &prefix,
QHash<QString, QSet<QString> > &dependencies, QHash<QString, QStringList> &dependees,
QStringList &rootSet, QMap<QString, QStringList> &place)
{
if (sortedList.contains(item))
return;
foreach(QString dep, place.value(prefix + item + ".depends")) {
calculateDeps(sortedList, dep, prefix, org, place);
if (org.isEmpty())
break;
}
if (org.contains(item)) {
sortedList += item;
org.removeAll(item);
}
}
QStringList
QMakeProject::resolveDepends(const QStringList &deps, const QString &prefix,
QMap<QString, QStringList> &place)
{
QStringList sortedList;
QStringList org = deps;
foreach(QString item, deps) {
calculateDeps(sortedList, item, prefix, org, place);
if (org.isEmpty())
break;
}
return sortedList;
foreach (const QString &item, deps)
if (!dependencies.contains(item)) {
QSet<QString> &dset = dependencies[item]; // Always create entry
QStringList depends = place.value(prefix + item + ".depends");
if (depends.isEmpty()) {
rootSet << item;
} else {
foreach (const QString &dep, depends) {
dset.insert(dep);
dependees[dep] << item;
}
populateDeps(depends, prefix, dependencies, dependees, rootSet, place);
}
}
}
QStringList
@ -2280,14 +2269,31 @@ QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
ret += generate_test_uid(args.first());
}
break;
case E_SORT_DEPENDS:
case E_RESOLVE_DEPENDS: {
if(args.count() < 1 || args.count() > 2) {
fprintf(stderr, "%s:%d: resolve_depends(var, prefix) requires one or two arguments.\n",
parser.file.toLatin1().constData(), parser.line_no);
fprintf(stderr, "%s:%d: %s(var, prefix) requires one or two arguments.\n",
parser.file.toLatin1().constData(), parser.line_no, func.toLatin1().constData());
} else {
ret += resolveDepends(args[0].split(QString(Option::field_sep)),
(args.count() != 2 ? QString() : args[1]),
place);
QHash<QString, QSet<QString> > dependencies;
QHash<QString, QStringList> dependees;
QStringList rootSet;
QStringList orgList = values(args[0], place);
populateDeps(orgList, (args.count() != 2 ? QString() : args[1]),
dependencies, dependees, rootSet, place);
for (int i = 0; i < rootSet.size(); ++i) {
const QString &item = rootSet.at(i);
if ((func_t == E_RESOLVE_DEPENDS) || orgList.contains(item))
ret.prepend(item);
foreach (const QString &dep, dependees[item]) {
QSet<QString> &dset = dependencies[dep];
dset.remove(item);
if (dset.isEmpty())
rootSet << dep;
}
}
}
break; }
default: {

View File

@ -107,7 +107,6 @@ class QMakeProject
QStringList doVariableReplaceExpand(const QString &str, QMap<QString, QStringList> &place, bool *ok=0);
void init(QMakeProperty *, const QMap<QString, QStringList> *);
QStringList &values(const QString &v, QMap<QString, QStringList> &place);
QStringList resolveDepends(const QStringList &deps, const QString &prefix, QMap<QString, QStringList> &place);
void validateModes();
public:

View File

@ -104,7 +104,7 @@ QMakeProperty::value(QString v, bool just_check)
else if(v == "QT_INSTALL_EXAMPLES")
return QLibraryInfo::location(QLibraryInfo::ExamplesPath);
else if(v == "QT_INSTALL_DEMOS")
return QLibraryInfo::location(QLibraryInfo::DemosPath);
return QLibraryInfo::location(QLibraryInfo::ExamplesPath);
else if(v == "QMAKE_MKSPECS")
return qmake_mkspec_paths().join(Option::dirlist_sep);
else if(v == "QMAKE_VERSION")

View File

@ -68,6 +68,7 @@ bootstrap { #Qt code
qlist.cpp \
qlinkedlist.cpp \
qlocale.cpp \
qlocale_tools.cpp \
qmalloc.cpp \
qmap.cpp \
qmetatype.cpp \
@ -111,6 +112,7 @@ bootstrap { #Qt code
qlist.h \
qlinkedlist.h \
qlocale.h \
qlocale_tools_p.h \
qmalloc.h \
qmap.h \
qmetatype.h \

View File

@ -25,6 +25,7 @@ INCLUDEPATH += . \
generators/win32 \
generators/mac \
generators/symbian \
generators/integrity \
$$QT_SOURCE_TREE/include \
$$QT_SOURCE_TREE/include/QtCore \
$$QT_SOURCE_TREE/include/QtCore/$$QT_VERSION \

View File

@ -40,6 +40,7 @@
****************************************************************************/
#include "qtconcurrentexception.h"
#include "QtCore/qshareddata.h"
#ifndef QT_NO_QFUTURE
#ifndef QT_NO_EXCEPTIONS
@ -141,15 +142,14 @@ Exception *UnhandledException::clone() const
namespace internal {
class Base
class Base : public QSharedData
{
public:
Base(Exception *exception)
: exception(exception), refCount(1), hasThrown(false) { }
: exception(exception), hasThrown(false) { }
~Base() { delete exception; }
Exception *exception;
QAtomicInt refCount;
bool hasThrown;
};
@ -158,27 +158,15 @@ ExceptionHolder::ExceptionHolder(Exception *exception)
ExceptionHolder::ExceptionHolder(const ExceptionHolder &other)
: base(other.base)
{
base->refCount.ref();
}
{}
void ExceptionHolder::operator=(const ExceptionHolder &other)
{
if (base == other.base)
return;
if (base->refCount.deref() == false)
delete base;
base = other.base;
base->refCount.ref();
}
ExceptionHolder::~ExceptionHolder()
{
if (base->refCount.deref() == 0)
delete base;
}
{}
Exception *ExceptionHolder::exception() const
{

View File

@ -47,6 +47,7 @@
#ifndef QT_NO_QFUTURE
#include <QtCore/qatomic.h>
#include <QtCore/qshareddata.h>
#ifndef QT_NO_EXCEPTIONS
# include <exception>
@ -87,7 +88,7 @@ public:
void operator=(const ExceptionHolder &other);
~ExceptionHolder();
Exception *exception() const;
Base *base;
QExplicitlySharedDataPointer<Base> base;
};
class Q_CORE_EXPORT ExceptionStore

View File

@ -1642,6 +1642,21 @@ bool qSharedBuild()
\sa Q_WS_MAC, Q_WS_WIN, Q_WS_X11, Q_WS_QWS
*/
/*!
\macro QT_DISABLE_DEPRECATED_BEFORE
\relates <QtGlobal>
This macro can be defined in the project file to disable functions deprecated in
a specified version of Qt or any earlier version. The default version number is 5.0,
meaning that functions deprecated in or before Qt 5.0 will not be included.
Examples:
When using a future release of Qt 5, set QT_DISABLE_DEPRECATED_BEFORE=0x050100 to
disable functions deprecated in Qt 5.1 and earlier. In any release, set
QT_DISABLE_DEPRECATED_BEFORE=0x000000 to enable any functions, including the ones
deprecated in Qt 5.0
*/
#if defined(QT_BUILD_QMAKE)
// needed to bootstrap qmake
static const unsigned int qt_one = 1;

View File

@ -54,6 +54,23 @@
*/
#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
#ifndef QT_DISABLE_DEPRECATED_BEFORE
#define QT_DISABLE_DEPRECATED_BEFORE QT_VERSION_CHECK(5, 0, 0)
#endif
/*
QT_DEPRECATED_SINCE(major, minor) evaluates as true if the Qt version is greater than
the deprecation point specified.
Use it to specify from which version of Qt a function or class has been deprecated
Example:
#if QT_DEPRECATED_SINCE(5,1)
QT_DEPRECATED void deprecatedFunction(); //function deprecated sine Qt 5.1
#endif
*/
#define QT_DEPRECATED_SINCE(major, minor) (QT_VERSION_CHECK(major, minor, 0) > QT_DISABLE_DEPRECATED_BEFORE)
#define QT_PACKAGEDATE_STR "YYYY-MM-DD"
#define QT_PACKAGE_TAG ""
@ -516,6 +533,7 @@ namespace QT_NAMESPACE {}
# endif
# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
/* C++0x features supported in GCC 4.4: */
# define Q_COMPILER_UNICODE_STRINGS
# define Q_COMPILER_VARIADIC_TEMPLATES
# define Q_COMPILER_AUTO_TYPE
# define Q_COMPILER_EXTERN_TEMPLATES
@ -526,8 +544,12 @@ namespace QT_NAMESPACE {}
# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
/* C++0x features supported in GCC 4.5: */
# define Q_COMPILER_LAMBDA
# define Q_COMPILER_UNICODE_STRINGS
# endif
# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
/* C++0x features supported in GCC 4.6: */
# define Q_COMPILER_CONSTEXPR
# endif
# endif
/* IBM compiler versions are a bit messy. There are actually two products:
@ -961,6 +983,7 @@ QT_END_INCLUDE_NAMESPACE
#error "Compiler doesn't support the bool type"
#endif
/*
Constant bool values
*/
@ -1091,6 +1114,12 @@ redefine to built-in booleans to make autotests work properly */
# define QT_FASTCALL
#endif
#ifdef Q_COMPILER_CONSTEXPR
# define Q_DECL_CONSTEXPR constexpr
#else
# define Q_DECL_CONSTEXPR
#endif
//defines the type for the WNDPROC on windows
//the alignment needs to be forced for sse2 to not crash with mingw
#if defined(Q_OS_WIN)
@ -1104,10 +1133,6 @@ redefine to built-in booleans to make autotests work properly */
typedef int QNoImplicitBoolCast;
#if defined(QT_ARCH_ARM) || defined(QT_ARCH_ARMV6) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_MIPS) && (defined(Q_WS_QWS) || defined(Q_WS_QPA) || defined(Q_OS_WINCE))) || defined(QT_ARCH_SH) || defined(QT_ARCH_SH4A)
#define QT_NO_FPU
#endif
// This logic must match the one in qmetatype.h
#if defined(QT_COORD_TYPE)
typedef QT_COORD_TYPE qreal;
@ -1122,25 +1147,25 @@ typedef double qreal;
*/
template <typename T>
inline T qAbs(const T &t) { return t >= 0 ? t : -t; }
Q_DECL_CONSTEXPR inline T qAbs(const T &t) { return t >= 0 ? t : -t; }
inline int qRound(qreal d)
Q_DECL_CONSTEXPR inline int qRound(qreal d)
{ return d >= qreal(0.0) ? int(d + qreal(0.5)) : int(d - int(d-1) + qreal(0.5)) + int(d-1); }
#if defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) || defined(QT_ARCH_SYMBIAN)
inline qint64 qRound64(double d)
Q_DECL_CONSTEXPR inline qint64 qRound64(double d)
{ return d >= 0.0 ? qint64(d + 0.5) : qint64(d - qreal(qint64(d-1)) + 0.5) + qint64(d-1); }
#else
inline qint64 qRound64(qreal d)
Q_DECL_CONSTEXPR inline qint64 qRound64(qreal d)
{ return d >= qreal(0.0) ? qint64(d + qreal(0.5)) : qint64(d - qreal(qint64(d-1)) + qreal(0.5)) + qint64(d-1); }
#endif
template <typename T>
inline const T &qMin(const T &a, const T &b) { if (a < b) return a; return b; }
Q_DECL_CONSTEXPR inline const T &qMin(const T &a, const T &b) { return (a < b) ? a : b; }
template <typename T>
inline const T &qMax(const T &a, const T &b) { if (a < b) return b; return a; }
Q_DECL_CONSTEXPR inline const T &qMax(const T &a, const T &b) { return (a < b) ? b : a; }
template <typename T>
inline const T &qBound(const T &min, const T &val, const T &max)
Q_DECL_CONSTEXPR inline const T &qBound(const T &min, const T &val, const T &max)
{ return qMax(min, qMin(max, val)); }
/*
@ -1914,12 +1939,12 @@ inline bool operator!=(QBool b1, bool b2) { return !b1 != !b2; }
inline bool operator!=(bool b1, QBool b2) { return !b1 != !b2; }
inline bool operator!=(QBool b1, QBool b2) { return !b1 != !b2; }
static inline bool qFuzzyCompare(double p1, double p2)
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{
return (qAbs(p1 - p2) <= 0.000000000001 * qMin(qAbs(p1), qAbs(p2)));
}
static inline bool qFuzzyCompare(float p1, float p2)
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
{
return (qAbs(p1 - p2) <= 0.00001f * qMin(qAbs(p1), qAbs(p2)));
}
@ -1927,7 +1952,7 @@ static inline bool qFuzzyCompare(float p1, float p2)
/*!
\internal
*/
static inline bool qFuzzyIsNull(double d)
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d)
{
return qAbs(d) <= 0.000000000001;
}
@ -1935,7 +1960,7 @@ static inline bool qFuzzyIsNull(double d)
/*!
\internal
*/
static inline bool qFuzzyIsNull(float f)
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f)
{
return qAbs(f) <= 0.00001f;
}
@ -2203,9 +2228,9 @@ class QFlags
int i;
public:
typedef Enum enum_type;
inline QFlags(const QFlags &f) : i(f.i) {}
inline QFlags(Enum f) : i(f) {}
inline QFlags(Zero = 0) : i(0) {}
Q_DECL_CONSTEXPR inline QFlags(const QFlags &f) : i(f.i) {}
Q_DECL_CONSTEXPR inline QFlags(Enum f) : i(f) {}
Q_DECL_CONSTEXPR inline QFlags(Zero = 0) : i(0) {}
inline QFlags(QFlag f) : i(f) {}
inline QFlags &operator=(const QFlags &f) { i = f.i; return *this; }
@ -2216,18 +2241,18 @@ public:
inline QFlags &operator^=(QFlags f) { i ^= f.i; return *this; }
inline QFlags &operator^=(Enum f) { i ^= f; return *this; }
inline operator int() const { return i; }
Q_DECL_CONSTEXPR inline operator int() const { return i; }
inline QFlags operator|(QFlags f) const { QFlags g; g.i = i | f.i; return g; }
inline QFlags operator|(Enum f) const { QFlags g; g.i = i | f; return g; }
inline QFlags operator^(QFlags f) const { QFlags g; g.i = i ^ f.i; return g; }
inline QFlags operator^(Enum f) const { QFlags g; g.i = i ^ f; return g; }
inline QFlags operator&(int mask) const { QFlags g; g.i = i & mask; return g; }
inline QFlags operator&(uint mask) const { QFlags g; g.i = i & mask; return g; }
inline QFlags operator&(Enum f) const { QFlags g; g.i = i & f; return g; }
inline QFlags operator~() const { QFlags g; g.i = ~i; return g; }
Q_DECL_CONSTEXPR inline QFlags operator|(QFlags f) const { return QFlags(Enum(i | f.i)); }
Q_DECL_CONSTEXPR inline QFlags operator|(Enum f) const { return QFlags(Enum(i | f)); }
Q_DECL_CONSTEXPR inline QFlags operator^(QFlags f) const { return QFlags(Enum(i ^ f.i)); }
Q_DECL_CONSTEXPR inline QFlags operator^(Enum f) const { return QFlags(Enum(i ^ f)); }
Q_DECL_CONSTEXPR inline QFlags operator&(int mask) const { return QFlags(Enum(i & mask)); }
Q_DECL_CONSTEXPR inline QFlags operator&(uint mask) const { return QFlags(Enum(i & mask)); }
Q_DECL_CONSTEXPR inline QFlags operator&(Enum f) const { return QFlags(Enum(i & f)); }
Q_DECL_CONSTEXPR inline QFlags operator~() const { return QFlags(Enum(~i)); }
inline bool operator!() const { return !i; }
Q_DECL_CONSTEXPR inline bool operator!() const { return !i; }
inline bool testFlag(Enum f) const { return (i & f) == f && (f != 0 || i == int(f) ); }
};
@ -2240,9 +2265,9 @@ inline QIncompatibleFlag operator|(Flags::enum_type f1, int f2) \
{ return QIncompatibleFlag(int(f1) | f2); }
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \
inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \
{ return QFlags<Flags::enum_type>(f1) | f2; } \
inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) \
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) \
{ return f2 | f1; } Q_DECLARE_INCOMPATIBLE_FLAGS(Flags)

View File

@ -296,11 +296,6 @@ QLibraryInfo::location(LibraryLocation loc)
case ExamplesPath:
path = QT_CONFIGURE_EXAMPLES_PATH;
break;
#endif
#ifdef QT_CONFIGURE_DEMOS_PATH
case DemosPath:
path = QT_CONFIGURE_DEMOS_PATH;
break;
#endif
default:
break;
@ -352,9 +347,6 @@ QLibraryInfo::location(LibraryLocation loc)
case ExamplesPath:
key = QLatin1String("Examples");
break;
case DemosPath:
key = QLatin1String("Demos");
break;
default:
break;
}
@ -500,7 +492,6 @@ QLibraryInfo::location(LibraryLocation loc)
\value TranslationsPath The location of translation information for Qt strings.
\value SettingsPath The location for Qt settings.
\value ExamplesPath The location for examples upon install.
\value DemosPath The location for demos upon install.
\sa location()
*/

View File

@ -75,7 +75,6 @@ public:
DataPath,
TranslationsPath,
SettingsPath,
DemosPath,
ExamplesPath,
ImportsPath
};

View File

@ -7,29 +7,29 @@
** This file is part of the QtCore module 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.
** 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
** 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.
**
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**

View File

@ -7,29 +7,29 @@
** This file is part of the QtCore module 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.
** 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
** 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.
**
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**

View File

@ -805,7 +805,16 @@ bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
// call overhead.
QObjectPrivate *d = receiver->d_func();
QThreadData *threadData = d->threadData;
++threadData->loopLevel;
// Exception-safety without try/catch
struct Incrementer {
int &variable;
inline Incrementer(int &variable) : variable(variable)
{ ++variable; }
inline ~Incrementer()
{ --variable; }
};
Incrementer inc(threadData->loopLevel);
#ifdef QT_JAMBI_BUILD
int deleteWatch = 0;
@ -816,12 +825,7 @@ bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
#endif
bool returnValue;
QT_TRY {
returnValue = notify(receiver, event);
} QT_CATCH (...) {
--threadData->loopLevel;
QT_RETHROW;
}
returnValue = notify(receiver, event);
#ifdef QT_JAMBI_BUILD
// Restore the previous state if the object was not deleted..
@ -830,7 +834,6 @@ bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
}
QObjectPrivate::resetDeleteWatch(d, oldDeleteWatch, deleteWatch);
#endif
--threadData->loopLevel;
return returnValue;
}
@ -1373,6 +1376,40 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
int &i = (!event_type && !receiver) ? data->postEventList.startOffset : startOffset;
data->postEventList.insertionOffset = data->postEventList.size();
// Exception-safe cleaning up without the need for a try/catch block
struct CleanUp {
QObject *receiver;
int event_type;
QThreadData *data;
bool exceptionCaught;
inline CleanUp(QObject *receiver, int event_type, QThreadData *data) :
receiver(receiver), event_type(event_type), data(data), exceptionCaught(true)
{}
inline ~CleanUp()
{
if (exceptionCaught) {
// since we were interrupted, we need another pass to make sure we clean everything up
data->canWait = false;
}
--data->postEventList.recursion;
if (!data->postEventList.recursion && !data->canWait && data->eventDispatcher)
data->eventDispatcher->wakeUp();
// clear the global list, i.e. remove everything that was
// delivered.
if (!event_type && !receiver && data->postEventList.startOffset >= 0) {
const QPostEventList::iterator it = data->postEventList.begin();
data->postEventList.erase(it, it + data->postEventList.startOffset);
data->postEventList.insertionOffset -= data->postEventList.startOffset;
Q_ASSERT(data->postEventList.insertionOffset >= 0);
data->postEventList.startOffset = 0;
}
}
};
CleanUp cleanup(receiver, event_type, data);
while (i < data->postEventList.size()) {
// avoid live-lock
if (i >= data->postEventList.insertionOffset)
@ -1411,7 +1448,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
// first, we diddle the event so that we can deliver
// it, and that no one will try to touch it later.
pe.event->posted = false;
QEvent * e = pe.event;
QScopedPointer<QEvent> e(pe.event);
QObject * r = pe.receiver;
--r->d_func()->postedEvents;
@ -1421,49 +1458,23 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
// for the next event.
const_cast<QPostEvent &>(pe).event = 0;
locker.unlock();
struct MutexUnlocker
{
QMutexLocker &m;
MutexUnlocker(QMutexLocker &m) : m(m) { m.unlock(); }
~MutexUnlocker() { m.relock(); }
};
MutexUnlocker unlocker(locker);
// after all that work, it's time to deliver the event.
#ifdef QT_NO_EXCEPTIONS
QCoreApplication::sendEvent(r, e);
#else
try {
QCoreApplication::sendEvent(r, e);
} catch (...) {
delete e;
locker.relock();
// since we were interrupted, we need another pass to make sure we clean everything up
data->canWait = false;
// uglehack: copied from below
--data->postEventList.recursion;
if (!data->postEventList.recursion && !data->canWait && data->eventDispatcher)
data->eventDispatcher->wakeUp();
throw; // rethrow
}
#endif
delete e;
locker.relock();
QCoreApplication::sendEvent(r, e.data());
// careful when adding anything below this point - the
// sendEvent() call might invalidate any invariants this
// function depends on.
}
--data->postEventList.recursion;
if (!data->postEventList.recursion && !data->canWait && data->eventDispatcher)
data->eventDispatcher->wakeUp();
// clear the global list, i.e. remove everything that was
// delivered.
if (!event_type && !receiver && data->postEventList.startOffset >= 0) {
const QPostEventList::iterator it = data->postEventList.begin();
data->postEventList.erase(it, it + data->postEventList.startOffset);
data->postEventList.insertionOffset -= data->postEventList.startOffset;
Q_ASSERT(data->postEventList.insertionOffset >= 0);
data->postEventList.startOffset = 0;
}
cleanup.exceptionCaught = false;
}
/*!

View File

@ -184,49 +184,47 @@ int QEventLoop::exec(ProcessEventsFlags flags)
qWarning("QEventLoop::exec: instance %p has already called exec()", this);
return -1;
}
d->inExec = true;
d->exit = false;
++d->threadData->loopLevel;
d->threadData->eventLoops.push(this);
locker.unlock();
struct LoopReference {
QEventLoopPrivate *d;
QMutexLocker &locker;
bool exceptionCaught;
LoopReference(QEventLoopPrivate *d, QMutexLocker &locker) : d(d), locker(locker), exceptionCaught(true)
{
d->inExec = true;
d->exit = false;
++d->threadData->loopLevel;
d->threadData->eventLoops.push(d->q_func());
locker.unlock();
}
~LoopReference()
{
if (exceptionCaught) {
qWarning("Qt has caught an exception thrown from an event handler. Throwing\n"
"exceptions from an event handler is not supported in Qt. You must\n"
"reimplement QApplication::notify() and catch all exceptions there.\n");
}
locker.relock();
QEventLoop *eventLoop = d->threadData->eventLoops.pop();
Q_ASSERT_X(eventLoop == d->q_func(), "QEventLoop::exec()", "internal error");
Q_UNUSED(eventLoop); // --release warning
d->inExec = false;
--d->threadData->loopLevel;
}
};
LoopReference ref(d, locker);
// remove posted quit events when entering a new event loop
QCoreApplication *app = QCoreApplication::instance();
if (app && app->thread() == thread())
QCoreApplication::removePostedEvents(app, QEvent::Quit);
#if defined(QT_NO_EXCEPTIONS)
while (!d->exit)
processEvents(flags | WaitForMoreEvents | EventLoopExec);
#else
try {
while (!d->exit)
processEvents(flags | WaitForMoreEvents | EventLoopExec);
} catch (...) {
qWarning("Qt has caught an exception thrown from an event handler. Throwing\n"
"exceptions from an event handler is not supported in Qt. You must\n"
"reimplement QApplication::notify() and catch all exceptions there.\n");
// copied from below
locker.relock();
QEventLoop *eventLoop = d->threadData->eventLoops.pop();
Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
Q_UNUSED(eventLoop); // --release warning
d->inExec = false;
--d->threadData->loopLevel;
throw;
}
#endif
// copied above
locker.relock();
QEventLoop *eventLoop = d->threadData->eventLoops.pop();
Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
Q_UNUSED(eventLoop); // --release warning
d->inExec = false;
--d->threadData->loopLevel;
ref.exceptionCaught = false;
return d->returnCode;
}

View File

@ -125,6 +125,39 @@ extern "C" Q_CORE_EXPORT void qt_removeObject(QObject *)
}
}
struct QConnectionSenderSwitcher {
QObject *receiver;
QObjectPrivate::Sender *previousSender;
QObjectPrivate::Sender currentSender;
bool switched;
inline QConnectionSenderSwitcher() : switched(false) {}
inline QConnectionSenderSwitcher(QObject *receiver, QObject *sender, int signal_absolute_id)
{
switchSender(receiver, sender, signal_absolute_id);
}
inline void switchSender(QObject *receiver, QObject *sender, int signal_absolute_id)
{
this->receiver = receiver;
currentSender.sender = sender;
currentSender.signal = signal_absolute_id;
currentSender.ref = 1;
previousSender = QObjectPrivate::setCurrentSender(receiver, &currentSender);
switched = true;
}
inline ~QConnectionSenderSwitcher()
{
if (switched)
QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
}
private:
Q_DISABLE_COPY(QConnectionSenderSwitcher)
};
void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = 0;
void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = 0;
void (*QAbstractDeclarativeData::objectNameChanged)(QAbstractDeclarativeData *, QObject *) = 0;
@ -1084,23 +1117,10 @@ bool QObject::event(QEvent *e)
d_func()->inEventHandler = false;
#endif
QMetaCallEvent *mce = static_cast<QMetaCallEvent*>(e);
QObjectPrivate::Sender currentSender;
currentSender.sender = const_cast<QObject*>(mce->sender());
currentSender.signal = mce->signalId();
currentSender.ref = 1;
QObjectPrivate::Sender * const previousSender =
QObjectPrivate::setCurrentSender(this, &currentSender);
#if defined(QT_NO_EXCEPTIONS)
QConnectionSenderSwitcher sw(this, const_cast<QObject*>(mce->sender()), mce->signalId());
mce->placeMetaCall(this);
#else
QT_TRY {
mce->placeMetaCall(this);
} QT_CATCH(...) {
QObjectPrivate::resetCurrentSender(this, &currentSender, previousSender);
QT_RETHROW;
}
#endif
QObjectPrivate::resetCurrentSender(this, &currentSender, previousSender);
break;
}
@ -2977,7 +2997,7 @@ bool QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
type &= Qt::UniqueConnection - 1;
}
QObjectPrivate::Connection *c = new QObjectPrivate::Connection;
QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection);
c->sender = s;
c->receiver = r;
c->method_relative = method_index;
@ -2987,16 +3007,11 @@ bool QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
c->nextConnectionList = 0;
c->callFunction = callFunction;
QT_TRY {
QObjectPrivate::get(s)->addConnection(signal_index, c);
} QT_CATCH(...) {
delete c;
QT_RETHROW;
}
QObjectPrivate::get(s)->addConnection(signal_index, c.data());
c->prev = &(QObjectPrivate::get(r)->senders);
c->next = *c->prev;
*c->prev = c;
*c->prev = c.data();
if (c->next)
c->next->prev = &c->next;
@ -3007,6 +3022,7 @@ bool QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
sender_d->connectedSignals[signal_index >> 5] |= (1 << (signal_index & 0x1f));
}
c.take(); // stop tracking
return true;
}
@ -3265,16 +3281,37 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
Qt::HANDLE currentThreadId = QThread::currentThreadId();
{
QMutexLocker locker(signalSlotLock(sender));
QObjectConnectionListVector *connectionLists = sender->d_func()->connectionLists;
if (!connectionLists) {
struct ConnectionListsRef {
QObjectConnectionListVector *connectionLists;
ConnectionListsRef(QObjectConnectionListVector *connectionLists) : connectionLists(connectionLists)
{
if (connectionLists)
++connectionLists->inUse;
}
~ConnectionListsRef()
{
if (!connectionLists)
return;
--connectionLists->inUse;
Q_ASSERT(connectionLists->inUse >= 0);
if (connectionLists->orphaned) {
if (!connectionLists->inUse)
delete connectionLists;
}
}
QObjectConnectionListVector *operator->() const { return connectionLists; }
};
ConnectionListsRef connectionLists = sender->d_func()->connectionLists;
if (!connectionLists.connectionLists) {
locker.unlock();
if (qt_signal_spy_callback_set.signal_end_callback != 0)
qt_signal_spy_callback_set.signal_end_callback(sender, signal_absolute_index);
return;
}
++connectionLists->inUse;
const QObjectPrivate::ConnectionList *list;
if (signal_index < connectionLists->count())
@ -3324,13 +3361,10 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
#endif
}
QObjectPrivate::Sender currentSender;
QObjectPrivate::Sender *previousSender = 0;
QConnectionSenderSwitcher sw;
if (receiverInSameThread) {
currentSender.sender = sender;
currentSender.signal = signal_absolute_index;
currentSender.ref = 1;
previousSender = QObjectPrivate::setCurrentSender(receiver, &currentSender);
sw.switchSender(receiver, sender, signal_absolute_index);
}
const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction;
const int method_relative = c->method_relative;
@ -3355,23 +3389,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
argv ? argv : empty_argv);
}
#if defined(QT_NO_EXCEPTIONS)
metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
#else
QT_TRY {
metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
} QT_CATCH(...) {
locker.relock();
if (receiverInSameThread)
QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
--connectionLists->inUse;
Q_ASSERT(connectionLists->inUse >= 0);
if (connectionLists->orphaned && !connectionLists->inUse)
delete connectionLists;
QT_RETHROW;
}
#endif
if (qt_signal_spy_callback_set.slot_end_callback != 0)
qt_signal_spy_callback_set.slot_end_callback(receiver, method);
@ -3379,9 +3397,6 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
locker.relock();
}
if (receiverInSameThread)
QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
if (connectionLists->orphaned)
break;
} while (c != last && (c = c->nextConnectionList) != 0);
@ -3392,17 +3407,8 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
//start over for all signals;
((list = &connectionLists->allsignals), true));
--connectionLists->inUse;
Q_ASSERT(connectionLists->inUse >= 0);
if (connectionLists->orphaned) {
if (!connectionLists->inUse)
delete connectionLists;
} else if (connectionLists->dirty) {
sender->d_func()->cleanConnectionLists();
}
locker.unlock();
if (qt_signal_spy_callback_set.signal_end_callback != 0)
qt_signal_spy_callback_set.signal_end_callback(sender, signal_absolute_index);

View File

@ -172,15 +172,9 @@ public:
inline bool isSharedWith(const QByteArray &other) const { return d == other.d; }
void clear();
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
const char at(int i) const;
const char operator[](int i) const;
const char operator[](uint i) const;
#else
char at(int i) const;
char operator[](int i) const;
char operator[](uint i) const;
#endif
QByteRef operator[](int i);
QByteRef operator[](uint i);
@ -359,21 +353,12 @@ inline QByteArray::~QByteArray() { if (!d->ref.deref()) qFree(d); }
inline int QByteArray::size() const
{ return d->size; }
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
inline const char QByteArray::at(int i) const
{ Q_ASSERT(i >= 0 && i < size()); return d->data[i]; }
inline const char QByteArray::operator[](int i) const
{ Q_ASSERT(i >= 0 && i < size()); return d->data[i]; }
inline const char QByteArray::operator[](uint i) const
{ Q_ASSERT(i < uint(size())); return d->data[i]; }
#else
inline char QByteArray::at(int i) const
{ Q_ASSERT(i >= 0 && i < size()); return d->data[i]; }
inline char QByteArray::operator[](int i) const
{ Q_ASSERT(i >= 0 && i < size()); return d->data[i]; }
inline char QByteArray::operator[](uint i) const
{ Q_ASSERT(i < uint(size())); return d->data[i]; }
#endif
inline bool QByteArray::isEmpty() const
{ return d->size == 0; }
@ -412,13 +397,8 @@ class Q_CORE_EXPORT QByteRef {
: a(array),i(idx) {}
friend class QByteArray;
public:
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
inline operator const char() const
{ return i < a.d->size ? a.d->data[i] : char(0); }
#else
inline operator char() const
{ return i < a.d->size ? a.d->data[i] : char(0); }
#endif
inline QByteRef &operator=(char c)
{ if (i >= a.d->size) a.expand(i); else a.detach();
a.d->data[i] = c; return *this; }

View File

@ -1295,11 +1295,7 @@ ushort QChar::toCaseFolded(ushort ucs2)
\sa toLatin1(), unicode(), QTextCodec::codecForCStrings()
*/
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
const char QChar::toAscii() const
#else
char QChar::toAscii() const
#endif
{
#ifndef QT_NO_CODEC_FOR_C_STRINGS
if (QTextCodec::codecForCStrings())

View File

@ -56,13 +56,8 @@ struct QLatin1Char
{
public:
inline explicit QLatin1Char(char c) : ch(c) {}
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
inline const char toLatin1() const { return ch; }
inline const ushort unicode() const { return ushort(uchar(ch)); }
#else
inline char toLatin1() const { return ch; }
inline ushort unicode() const { return ushort(uchar(ch)); }
#endif
private:
char ch;
@ -230,20 +225,10 @@ public:
UnicodeVersion unicodeVersion() const;
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
const char toAscii() const;
inline const char toLatin1() const;
inline const ushort unicode() const { return ucs; }
#else
char toAscii() const;
inline char toLatin1() const;
inline ushort unicode() const { return ucs; }
#endif
#ifdef Q_NO_PACKED_REFERENCE
inline ushort &unicode() { return const_cast<ushort&>(ucs); }
#else
inline ushort &unicode() { return ucs; }
#endif
static QChar fromAscii(char c);
static QChar fromLatin1(char c);
@ -339,11 +324,7 @@ Q_DECLARE_TYPEINFO(QChar, Q_MOVABLE_TYPE);
inline QChar::QChar() : ucs(0) {}
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
inline const char QChar::toLatin1() const { return ucs > 0xff ? '\0' : char(ucs); }
#else
inline char QChar::toLatin1() const { return ucs > 0xff ? '\0' : char(ucs); }
#endif
inline QChar QChar::fromLatin1(char c) { return QChar(ushort(uchar(c))); }
inline QChar::QChar(uchar c, uchar r) : ucs(ushort((r << 8) | c)){}

View File

@ -164,7 +164,7 @@ void **QListData::append(int n)
if (b - n >= 2 * d->alloc / 3) {
// we have enough space. Just not at the end -> move it.
e -= b;
::memcpy(d->array, d->array + b, e * sizeof(void *));
::memmove(d->array, d->array + b, e * sizeof(void *));
d->begin = 0;
} else {
realloc(grow(d->alloc + n));

View File

@ -0,0 +1,51 @@
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\class QtPrivate::RefCount
\internal
QRefCount implements atomic ref counting for Qt's shared classes. It behaves very similar
to QAtomicInt, but ignores negative ref counts.
This can be used to allow to implement e.g. const read-only QStringData objects. QString::shared_null and
the qs(...) macro make use of this feature.
*/

View File

@ -0,0 +1,92 @@
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QREFCOUNT_H
#define QREFCOUNT_H
#include <QtCore/qatomic.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Core)
namespace QtPrivate
{
class RefCount
{
public:
inline void ref() {
if (atomic >= 0)
atomic.ref();
}
inline bool deref() {
if (atomic < 0)
return true;
return atomic.deref();
}
inline bool operator==(int value) const
{ return atomic.operator ==(value); }
inline bool operator!=(int value) const
{ return atomic.operator !=(value); }
inline bool operator!() const
{ return atomic.operator !(); }
inline operator int() const
{ return atomic.operator int(); }
inline RefCount &operator=(int value)
{ atomic = value; return *this; }
QBasicAtomicInt atomic;
};
#define Q_REFCOUNT_INITIALIZER(a) { Q_BASIC_ATOMIC_INITIALIZER(a) }
}
QT_END_NAMESPACE
QT_END_HEADER
#endif

File diff suppressed because it is too large Load Diff

View File

@ -44,7 +44,7 @@
#include <QtCore/qchar.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qatomic.h>
#include <QtCore/qrefcount.h>
#include <QtCore/qnamespace.h>
#ifndef QT_NO_STL
@ -77,9 +77,86 @@ class QLatin1String;
class QStringRef;
template <typename T> class QVector;
struct QStringData {
QtPrivate::RefCount ref;
int size;
uint alloc : 31;
uint capacityReserved : 1;
union {
qptrdiff offset; // will always work as we add/subtract from a ushort ptr
ushort d[sizeof(qptrdiff)/sizeof(ushort)];
};
inline ushort *data() { return d + sizeof(qptrdiff)/sizeof(ushort) + offset; }
inline const ushort *data() const { return d + sizeof(qptrdiff)/sizeof(ushort) + offset; }
};
template<int N> struct QConstStringData;
template<int N> struct QConstStringDataPtr
{
const QConstStringData<N> *ptr;
};
#if defined(Q_COMPILER_UNICODE_STRINGS)
template<int n> struct QConstStringData
{
const QStringData str;
const char16_t data[n];
};
#define QT_QSTRING_UNICODE_MARKER u""
#elif defined(Q_OS_WIN) || (defined(__SIZEOF_WCHAR_T__) && __SIZEOF_WCHAR_T__ == 2) || defined(WCHAR_MAX) && (WCHAR_MAX - 0 < 65536)
// wchar_t is 2 bytes
template<int n> struct QConstStringData
{
const QStringData str;
const wchar_t data[n];
};
#define QT_QSTRING_UNICODE_MARKER L""
#else
template<int n> struct QConstStringData
{
const QStringData str;
const ushort data[n];
};
#endif
#if defined(QT_QSTRING_UNICODE_MARKER)
# if defined(Q_COMPILER_LAMBDA)
# define QStringLiteral(str) ([]() { \
enum { Size = sizeof(QT_QSTRING_UNICODE_MARKER str)/2 }; \
static const QConstStringData<Size> qstring_literal = \
{ { Q_REFCOUNT_INITIALIZER(-1), Size -1, 0, 0, { 0 } }, QT_QSTRING_UNICODE_MARKER str }; \
QConstStringDataPtr<Size> holder = { &qstring_literal }; \
return holder; }())
# elif defined(Q_CC_GNU)
// We need to create a QStringData in the .rodata section of memory
// and the only way to do that is to create a "static const" variable.
// To do that, we need the __extension__ {( )} trick which only GCC supports
# define QStringLiteral(str) \
__extension__ ({ \
enum { Size = sizeof(QT_QSTRING_UNICODE_MARKER str)/2 }; \
static const QConstStringData<Size> qstring_literal = \
{ { Q_REFCOUNT_INITIALIZER(-1), Size -1, 0, 0, { 0 } }, QT_QSTRING_UNICODE_MARKER str }; \
QConstStringDataPtr<Size> holder = { &qstring_literal }; \
holder; })
# endif
#endif
#ifndef QStringLiteral
// no lambdas, not GCC, or GCC in C++98 mode with 4-byte wchar_t
// fallback, uses QLatin1String as next best options
# define QStringLiteral(str) QLatin1String(str)
#endif
class Q_CORE_EXPORT QString
{
public:
typedef QStringData Data;
inline QString();
QString(const QChar *unicode, int size); // Qt5: don't cap size < 0
explicit QString(const QChar *unicode); // Qt5: merge with the above
@ -108,7 +185,7 @@ public:
int capacity() const;
inline void reserve(int size);
inline void squeeze() { if (d->size < d->alloc || d->ref != 1) realloc(); d->capacity = 0;}
inline void squeeze() { if (d->size < d->alloc || d->ref != 1) realloc(); d->capacityReserved = false;}
inline const QChar *unicode() const;
inline QChar *data();
@ -262,8 +339,8 @@ public:
inline QString &operator+=(QChar c) {
if (d->ref != 1 || d->size + 1 > d->alloc)
realloc(grow(d->size + 1));
d->data[d->size++] = c.unicode();
d->data[d->size] = '\0';
d->data()[d->size++] = c.unicode();
d->data()[d->size] = '\0';
return *this;
}
@ -491,15 +568,19 @@ public:
// compatibility
struct Null { };
static const Null null;
inline QString(const Null &): d(&shared_null) { d->ref.ref(); }
inline QString(const Null &): d(const_cast<Data *>(&shared_null.str)) {}
inline QString &operator=(const Null &) { *this = QString(); return *this; }
inline bool isNull() const { return d == &shared_null; }
inline bool isNull() const { return d == &shared_null.str; }
bool isSimpleText() const { if (!d->clean) updateProperties(); return d->simpletext; }
bool isSimpleText() const;
bool isRightToLeft() const;
QString(int size, Qt::Initialization);
template <int n>
inline QString(const QConstStringData<n> &dd) : d(const_cast<QStringData *>(&dd.str)) {}
template <int N>
Q_DECL_CONSTEXPR inline QString(QConstStringDataPtr<N> dd) : d(const_cast<QStringData *>(&dd.ptr->str)) {}
private:
#if defined(QT_NO_CAST_FROM_ASCII) && !defined(Q_NO_DECLARED_NOT_DEFINED)
@ -511,22 +592,11 @@ private:
QString &operator=(const QByteArray &a);
#endif
struct Data {
QBasicAtomicInt ref;
int alloc, size;
ushort *data; // QT5: put that after the bit field to fill alignment gap; don't use sizeof any more then
ushort clean : 1;
ushort simpletext : 1;
ushort righttoleft : 1;
ushort capacity : 1;
ushort reserved : 11;
// ### Qt5: try to ensure that "array" is aligned to 16 bytes on both 32- and 64-bit
ushort array[1];
};
static Data shared_null;
static Data shared_empty;
static const QConstStringData<1> shared_null;
static const QConstStringData<1> shared_empty;
Data *d;
QString(Data *dd, int /*dummy*/) : d(dd) {}
inline QString(Data *dd, int /*dummy*/) : d(dd) {}
#ifndef QT_NO_TEXTCODEC
static QTextCodec *codecForCStrings;
#endif
@ -563,11 +633,11 @@ public:
class Q_CORE_EXPORT QLatin1String
{
public:
inline explicit QLatin1String(const char *s) : chars(s) {}
inline QLatin1String &operator=(const QLatin1String &other)
{ chars = other.chars; return *this; }
inline explicit QLatin1String(const char *s) : m_size(s ? strlen(s) : 0), m_data(s) {}
inline const char *latin1() const { return chars; }
inline const char *latin1() const { return m_data; }
inline int size() const { return m_size; }
inline const char *data() const { return m_data; }
inline bool operator==(const QString &s) const
{ return s == *this; }
@ -595,9 +665,12 @@ public:
inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const
{ return QString::fromAscii(s) <= *this; }
private:
const char *chars;
int m_size;
const char *m_data;
};
// Qt 4.x compatibility
typedef QLatin1String QLatin1Literal;
inline QString::QString(const QLatin1String &aLatin1) : d(fromLatin1_helper(aLatin1.latin1()))
@ -605,23 +678,23 @@ inline QString::QString(const QLatin1String &aLatin1) : d(fromLatin1_helper(aLat
inline int QString::length() const
{ return d->size; }
inline const QChar QString::at(int i) const
{ Q_ASSERT(uint(i) < uint(size())); return d->data[i]; }
{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
inline const QChar QString::operator[](int i) const
{ Q_ASSERT(uint(i) < uint(size())); return d->data[i]; }
{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
inline const QChar QString::operator[](uint i) const
{ Q_ASSERT(i < uint(size())); return d->data[i]; }
{ Q_ASSERT(i < uint(size())); return d->data()[i]; }
inline bool QString::isEmpty() const
{ return d->size == 0; }
inline const QChar *QString::unicode() const
{ return reinterpret_cast<const QChar*>(d->data); }
{ return reinterpret_cast<const QChar*>(d->data()); }
inline const QChar *QString::data() const
{ return reinterpret_cast<const QChar*>(d->data); }
{ return reinterpret_cast<const QChar*>(d->data()); }
inline QChar *QString::data()
{ detach(); return reinterpret_cast<QChar*>(d->data); }
{ detach(); return reinterpret_cast<QChar*>(d->data()); }
inline const QChar *QString::constData() const
{ return reinterpret_cast<const QChar*>(d->data); }
{ return reinterpret_cast<const QChar*>(d->data()); }
inline void QString::detach()
{ if (d->ref != 1 || d->data != d->array) realloc(); }
{ if (d->ref != 1 || d->offset) realloc(); }
inline bool QString::isDetached() const
{ return d->ref == 1; }
inline QString &QString::operator=(const QLatin1String &s)
@ -703,10 +776,10 @@ public:
// all this is not documented: We just say "like QChar" and let it be.
inline operator QChar() const
{ return i < s.d->size ? s.d->data[i] : 0; }
{ return i < s.d->size ? s.d->data()[i] : 0; }
inline QCharRef &operator=(const QChar &c)
{ if (i >= s.d->size) s.expand(i); else s.detach();
s.d->data[i] = c.unicode(); return *this; }
s.d->data()[i] = c.unicode(); return *this; }
// An operator= for each QChar cast constructors
#ifndef QT_NO_CAST_FROM_ASCII
@ -756,15 +829,9 @@ public:
inline void setCell(uchar cell);
inline void setRow(uchar row);
#ifdef Q_COMPILER_MANGLES_RETURN_TYPE
const char toAscii() const { return QChar(*this).toAscii(); }
const char toLatin1() const { return QChar(*this).toLatin1(); }
const ushort unicode() const { return QChar(*this).unicode(); }
#else
char toAscii() const { return QChar(*this).toAscii(); }
char toLatin1() const { return QChar(*this).toLatin1(); }
ushort unicode() const { return QChar(*this).unicode(); }
#endif
ushort& unicode() { return s.data()[i].unicode(); }
};
@ -773,9 +840,9 @@ inline void QCharRef::setRow(uchar arow) { QChar(*this).setRow(arow); }
inline void QCharRef::setCell(uchar acell) { QChar(*this).setCell(acell); }
inline QString::QString() : d(&shared_null) { d->ref.ref(); }
inline QString::QString() : d(const_cast<Data *>(&shared_null.str)) {}
inline QString::~QString() { if (!d->ref.deref()) free(d); }
inline void QString::reserve(int asize) { if (d->ref != 1 || asize > d->alloc) realloc(asize); d->capacity = 1;}
inline void QString::reserve(int asize) { if (d->ref != 1 || asize > d->alloc) realloc(asize); d->capacityReserved = true;}
inline QString &QString::setUtf16(const ushort *autf16, int asize)
{ return setUnicode(reinterpret_cast<const QChar *>(autf16), asize); }
inline QCharRef QString::operator[](int i)
@ -783,17 +850,17 @@ inline QCharRef QString::operator[](int i)
inline QCharRef QString::operator[](uint i)
{ return QCharRef(*this, i); }
inline QString::iterator QString::begin()
{ detach(); return reinterpret_cast<QChar*>(d->data); }
{ detach(); return reinterpret_cast<QChar*>(d->data()); }
inline QString::const_iterator QString::begin() const
{ return reinterpret_cast<const QChar*>(d->data); }
{ return reinterpret_cast<const QChar*>(d->data()); }
inline QString::const_iterator QString::constBegin() const
{ return reinterpret_cast<const QChar*>(d->data); }
{ return reinterpret_cast<const QChar*>(d->data()); }
inline QString::iterator QString::end()
{ detach(); return reinterpret_cast<QChar*>(d->data + d->size); }
{ detach(); return reinterpret_cast<QChar*>(d->data() + d->size); }
inline QString::const_iterator QString::end() const
{ return reinterpret_cast<const QChar*>(d->data + d->size); }
{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
inline QString::const_iterator QString::constEnd() const
{ return reinterpret_cast<const QChar*>(d->data + d->size); }
{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
inline QBool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
{ return QBool(indexOf(s, 0, cs) != -1); }
inline QBool QString::contains(const QStringRef &s, Qt::CaseSensitivity cs) const
@ -1024,7 +1091,7 @@ public:
inline const QChar *unicode() const {
if (!m_string)
return reinterpret_cast<const QChar *>(QString::shared_null.data);
return reinterpret_cast<const QChar *>(QString::shared_null.str.data());
return m_string->unicode() + m_position;
}
inline const QChar *data() const { return unicode(); }
@ -1154,7 +1221,6 @@ inline QBool QStringRef::contains(const QStringRef &s, Qt::CaseSensitivity cs) c
{ return QBool(indexOf(s, 0, cs) != -1); }
QT_END_NAMESPACE
QT_END_HEADER

View File

@ -44,47 +44,6 @@
QT_BEGIN_NAMESPACE
/*!
\class QLatin1Literal
\internal
\reentrant
\since 4.6
\brief The QLatin1Literal class provides a thin wrapper around string
literals used in source code.
\ingroup tools
\ingroup shared
\ingroup string-processing
Unlike \c QLatin1String, a \c QLatin1Literal can retrieve its size
without iterating over the literal.
The main use of \c QLatin1Literal is in conjunction with \c QStringBuilder
to reduce the number of reallocations needed to build up a string from
smaller chunks.
\sa QStringBuilder, QLatin1String, QString, QStringRef
*/
/*! \fn int QLatin1Literal::size() const
Returns the number of characters in the literal \e{excluding} the trailing
NULL char.
*/
/*! \fn QLatin1Literal::QLatin1Literal(const char str)
Constructs a new literal from the string \a str.
*/
/*! \fn const char *QLatin1Literal::data() const
Returns a pointer to the first character of the string literal.
The string literal is terminated by a NUL character.
*/
/*!
\class QStringBuilder
\internal
@ -110,7 +69,7 @@ QT_BEGIN_NAMESPACE
The QStringBuilder class is not to be used explicitly in user
code. Instances of the class are created as return values of the
operator%() function, acting on objects of type QString,
QLatin1String, QLatin1Literal, QStringRef, QChar, QCharRef,
QLatin1String, QStringRef, QChar, QCharRef,
QLatin1Char, and \c char.
Concatenating strings with operator%() generally yields better
@ -118,7 +77,7 @@ QT_BEGIN_NAMESPACE
if there are three or more of them, and performs equally well in other
cases.
\sa QLatin1Literal, QString
\sa QLatin1String, QString
*/
/*! \fn QStringBuilder::QStringBuilder(const A &a, const B &b)
@ -132,7 +91,7 @@ QT_BEGIN_NAMESPACE
takes a QString parameter.
This function is usable with arguments of type \c QString,
\c QLatin1String, \c QLatin1Literal, \c QStringRef,
\c QLatin1String, \c QStringRef,
\c QChar, \c QCharRef, \c QLatin1Char, and \c char.
*/
@ -145,7 +104,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn operator QStringBuilder::QString() const
Converts the \c QLatin1Literal into a \c QString object.
Converts the \c QLatin1String into a \c QString object.
*/
/*! \internal

View File

@ -59,22 +59,6 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Core)
// ### Qt 5: merge with QLatin1String
class QLatin1Literal
{
public:
int size() const { return m_size; }
const char *data() const { return m_data; }
template <int N>
QLatin1Literal(const char (&str)[N])
: m_size(N - 1), m_data(str) {}
private:
const int m_size;
const char * const m_data;
};
struct Q_CORE_EXPORT QAbstractConcatenable
{
protected:
@ -234,31 +218,13 @@ template <> struct QConcatenable<QLatin1String>
typedef QLatin1String type;
typedef QString ConvertTo;
enum { ExactSize = true };
static int size(const QLatin1String &a) { return qstrlen(a.latin1()); }
static int size(const QLatin1String &a) { return a.size(); }
static inline void appendTo(const QLatin1String &a, QChar *&out)
{
for (const char *s = a.latin1(); *s; )
*out++ = QLatin1Char(*s++);
}
static inline void appendTo(const QLatin1String &a, char *&out)
{
for (const char *s = a.latin1(); *s; )
*out++ = *s++;
}
};
template <> struct QConcatenable<QLatin1Literal>
{
typedef QLatin1Literal type;
typedef QString ConvertTo;
enum { ExactSize = true };
static int size(const QLatin1Literal &a) { return a.size(); }
static inline void appendTo(const QLatin1Literal &a, QChar *&out)
{
for (const char *s = a.data(); *s; )
*out++ = QLatin1Char(*s++);
}
static inline void appendTo(const QLatin1Literal &a, char *&out)
static inline void appendTo(const QLatin1String &a, char *&out)
{
for (const char *s = a.data(); *s; )
*out++ = *s++;
@ -283,6 +249,23 @@ template <> struct QConcatenable<QString> : private QAbstractConcatenable
#endif
};
template <int N> struct QConcatenable<QConstStringDataPtr<N> > : private QAbstractConcatenable
{
typedef QConstStringDataPtr<N> type;
typedef QString ConvertTo;
enum { ExactSize = true };
static int size(const type &) { return N; }
static inline void appendTo(const type &a, QChar *&out)
{
memcpy(out, reinterpret_cast<const char*>(a.ptr->data), sizeof(QChar) * N);
out += N;
}
#ifndef QT_NO_CAST_TO_ASCII
static inline QT_ASCII_CAST_WARN void appendTo(const type &a, char *&out)
{ convertToAscii(a.ptr->data, N, out); }
#endif
};
template <> struct QConcatenable<QStringRef> : private QAbstractConcatenable
{
typedef QStringRef type;

View File

@ -68,7 +68,7 @@ public:
inline QStringList(const QStringList &l) : QList<QString>(l) { }
inline QStringList(const QList<QString> &l) : QList<QString>(l) { }
#ifdef Q_COMPILER_INITIALIZER_LISTS
inline QStringList(std::initializer_list<QString> args) : QList(args) { }
inline QStringList(std::initializer_list<QString> args) : QList<QString>(args) { }
#endif
inline void sort();

View File

@ -30,6 +30,7 @@ HEADERS += \
tools/qrect.h \
tools/qregexp.h \
tools/qringbuffer_p.h \
tools/qrefcount.h \
tools/qscopedpointer.h \
tools/qscopedpointer_p.h \
tools/qscopedvaluerollback.h \
@ -72,6 +73,7 @@ SOURCES += \
tools/qcontiguouscache.cpp \
tools/qrect.cpp \
tools/qregexp.cpp \
tools/qrefcount.cpp \
tools/qshareddata.cpp \
tools/qsharedpointer.cpp \
tools/qsimd.cpp \

View File

@ -62,6 +62,12 @@ void qdbus_unloadLibDBus()
bool qdbus_loadLibDBus()
{
#ifdef QT_BUILD_INTERNAL
// this is to simulate a library load failure for our autotest suite.
if (!qgetenv("QT_SIMULATE_DBUS_LIBFAIL").isEmpty())
return false;
#endif
static volatile bool triedToLoadLibrary = false;
#ifndef QT_NO_THREAD
QMutexLocker locker(QMutexPool::globalInstanceGet((void *)&qdbus_resolve_me));

View File

@ -1061,7 +1061,7 @@ public:
if (!instance) {
qWarning("QDBusConnection: %s D-Bus connection created before QCoreApplication. Application may misbehave.",
type == SessionBus ? "session" : type == SystemBus ? "system" : "generic");
} else {
} else if (QDBusConnectionPrivate::d(*this)) {
QDBusConnectionPrivate::d(*this)->moveToThread(instance->thread());
}
}

View File

@ -7,29 +7,29 @@
** This file is part of the QtGui module 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.
** 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
** 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.
**
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**

View File

@ -7,29 +7,29 @@
** This file is part of the QtGui module 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.
** 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
** 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.
**
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**

View File

@ -1291,7 +1291,7 @@ void QPainterPrivate::updateState(QPainterState *newState)
\o \inlineimage qpainter-compositiondemo.png
\o
\bold {Composition Modes Demo}
\bold {Composition Modes Example}
The \l {painting/composition}{Composition Modes} example, available in
Qt's examples directory, allows you to experiment with the various
@ -6503,6 +6503,10 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti)
qreal x = p.x();
qreal y = p.y();
bool rtl = ti.flags & QTextItem::RightToLeft;
if (rtl)
x += ti.width.toReal();
int start = 0;
int end, i;
for (end = 0; end < ti.glyphs.numGlyphs; ++end) {
@ -6519,14 +6523,19 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti)
ti2.width += ti.glyphs.effectiveAdvance(i);
}
if (rtl)
x -= ti2.width.toReal();
d->engine->drawTextItem(QPointF(x, y), ti2);
if (!rtl)
x += ti2.width.toReal();
// reset the high byte for all glyphs and advance to the next sub-string
const int hi = which << 24;
for (i = start; i < end; ++i) {
glyphs.glyphs[i] = hi | glyphs.glyphs[i];
}
x += ti2.width.toReal();
// change engine
start = end;
@ -6541,6 +6550,9 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti)
ti2.width += ti.glyphs.effectiveAdvance(i);
}
if (rtl)
x -= ti2.width.toReal();
if (d->extended)
d->extended->drawTextItem(QPointF(x, y), ti2);
else

View File

@ -218,17 +218,14 @@ struct QtFontStyle
Key(const QString &styleString);
Key() : style(QFont::StyleNormal),
weight(QFont::Normal), stretch(0) { }
Key(const Key &o) : styleName(o.styleName), style(o.style),
weight(o.weight), stretch(o.stretch) { }
QString styleName;
Key(const Key &o) : style(o.style), weight(o.weight), stretch(o.stretch) { }
uint style : 2;
signed int weight : 8;
signed int stretch : 12;
bool operator==(const Key & other) {
return styleName == other.styleName && style == other.style &&
weight == other.weight &&
(stretch == 0 || other.stretch == 0 || stretch == other.stretch);
return (style == other.style && weight == other.weight &&
(stretch == 0 || other.stretch == 0 || stretch == other.stretch));
}
bool operator!=(const Key &other) {
return !operator==(other);
@ -280,6 +277,7 @@ struct QtFontStyle
bool smoothScalable : 1;
signed int count : 30;
QtFontSize *pixelSizes;
QString styleName;
#ifdef Q_WS_X11
const char *weightName;
@ -293,7 +291,7 @@ struct QtFontStyle
};
QtFontStyle::Key::Key(const QString &styleString)
: styleName(styleString), style(QFont::StyleNormal), weight(QFont::Normal), stretch(0)
: style(QFont::StyleNormal), weight(QFont::Normal), stretch(0)
{
weight = getFontWeight(styleString);
@ -354,13 +352,20 @@ struct QtFontFoundry
int count;
QtFontStyle **styles;
QtFontStyle *style(const QtFontStyle::Key &, bool = false);
QtFontStyle *style(const QtFontStyle::Key &, const QString & = QString(), bool = false);
};
QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, bool create)
QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, const QString &styleName, bool create)
{
int pos = 0;
if (count) {
// if styleName for searching first if possible
if (!styleName.isEmpty()) {
for (; pos < count; pos++) {
if (styles[pos]->styleName == styleName)
return styles[pos];
}
}
int low = 0;
int high = count;
pos = count / 2;
@ -387,6 +392,7 @@ QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, bool create)
}
QtFontStyle *style = new QtFontStyle(key);
style->styleName = styleName;
memmove(styles + pos + 1, styles + pos, (count-pos)*sizeof(QtFontStyle *));
styles[pos] = style;
count++;
@ -815,7 +821,7 @@ void QFontDatabasePrivate::addFont(const QString &familyname, const char *foundr
}
QtFontFoundry *foundry = f->foundry(QString::fromLatin1(foundryname), true);
QtFontStyle *style = foundry->style(styleKey, true);
QtFontStyle *style = foundry->style(styleKey, QString(), true);
style->smoothScalable = (pixelSize == 0);
style->antialiased = antialiased;
QtFontSize *size = style->pixelSize(pixelSize?pixelSize:SMOOTH_SCALABLE, true);
@ -1132,7 +1138,8 @@ QString QFontDatabase::resolveFontFamilyAlias(const QString &family)
}
#endif
static QtFontStyle *bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &styleKey)
static QtFontStyle *bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &styleKey,
const QString &styleName = QString())
{
int best = 0;
int dist = 0xffff;
@ -1140,7 +1147,7 @@ static QtFontStyle *bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &st
for ( int i = 0; i < foundry->count; i++ ) {
QtFontStyle *style = foundry->styles[i];
if (!styleKey.styleName.isEmpty() && styleKey.styleName == style->key.styleName) {
if (!styleName.isEmpty() && styleName == style->styleName) {
dist = 0;
best = i;
break;
@ -1797,16 +1804,16 @@ QStringList QFontDatabase::styles(const QString &family) const
for (int k = 0; k < foundry->count; k++) {
QtFontStyle::Key ke(foundry->styles[k]->key);
ke.stretch = 0;
allStyles.style(ke, true);
allStyles.style(ke, foundry->styles[k]->styleName, true);
}
}
}
for (int i = 0; i < allStyles.count; i++) {
l.append(allStyles.styles[i]->key.styleName.isEmpty() ?
l.append(allStyles.styles[i]->styleName.isEmpty() ?
styleStringHelper(allStyles.styles[i]->key.weight,
(QFont::Style)allStyles.styles[i]->key.style) :
allStyles.styles[i]->key.styleName);
allStyles.styles[i]->styleName);
}
return l;
}
@ -1865,7 +1872,9 @@ bool QFontDatabase::isBitmapScalable(const QString &family,
QtFontFoundry *foundry = f->foundries[j];
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++)
if ((style.isEmpty() || foundry->styles[k]->key == styleKey)
if ((style.isEmpty() ||
foundry->styles[k]->styleName == style ||
foundry->styles[k]->key == styleKey)
&& foundry->styles[k]->bitmapScalable && !foundry->styles[k]->smoothScalable) {
bitmapScalable = true;
goto end;
@ -1904,7 +1913,9 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty
QtFontFoundry *foundry = f->foundries[j];
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++)
if ((style.isEmpty() || foundry->styles[k]->key == styleKey) && foundry->styles[k]->smoothScalable) {
if ((style.isEmpty() ||
foundry->styles[k]->styleName == style ||
foundry->styles[k]->key == styleKey) && foundry->styles[k]->smoothScalable) {
smoothScalable = true;
goto end;
}
@ -1937,12 +1948,12 @@ bool QFontDatabase::isScalable(const QString &family,
\sa smoothSizes(), standardSizes()
*/
QList<int> QFontDatabase::pointSizes(const QString &family,
const QString &style)
const QString &styleName)
{
#if defined(Q_WS_WIN)
// windows and macosx are always smoothly scalable
Q_UNUSED(family);
Q_UNUSED(style);
Q_UNUSED(styleName);
return standardSizes();
#else
bool smoothScalable = false;
@ -1953,7 +1964,7 @@ QList<int> QFontDatabase::pointSizes(const QString &family,
QT_PREPEND_NAMESPACE(load)(familyName);
QtFontStyle::Key styleKey(style);
QtFontStyle::Key styleKey(styleName);
QList<int> sizes;
@ -1970,7 +1981,7 @@ QList<int> QFontDatabase::pointSizes(const QString &family,
for (int j = 0; j < fam->count; j++) {
QtFontFoundry *foundry = fam->foundries[j];
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
QtFontStyle *style = foundry->style(styleKey);
QtFontStyle *style = foundry->style(styleKey, styleName);
if (!style) continue;
if (style->smoothScalable) {
@ -2021,25 +2032,21 @@ QFont QFontDatabase::font(const QString &family, const QString &style,
QtFontFoundry *foundry = f->foundries[j];
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++)
allStyles.style(foundry->styles[k]->key, true);
allStyles.style(foundry->styles[k]->key, foundry->styles[k]->styleName, true);
}
}
QtFontStyle::Key styleKey(style);
QtFontStyle *s = bestStyle(&allStyles, styleKey);
QtFontStyle *s = bestStyle(&allStyles, styleKey, style);
if (!s) // no styles found?
return QGuiApplication::font();
if (s->key.styleName.isEmpty()) {
QFont fnt(family, pointSize, s->key.weight);
fnt.setStyle((QFont::Style)s->key.style);
return fnt;
} else {
// found a perfect match
QFont fnt(family, pointSize);
fnt.setStyleName(s->key.styleName);
return fnt;
}
QFont fnt(family, pointSize, s->key.weight);
fnt.setStyle((QFont::Style)s->key.style);
if (!s->styleName.isEmpty())
fnt.setStyleName(s->styleName);
return fnt;
}
@ -2052,11 +2059,11 @@ QFont QFontDatabase::font(const QString &family, const QString &style,
\sa pointSizes(), standardSizes()
*/
QList<int> QFontDatabase::smoothSizes(const QString &family,
const QString &style)
const QString &styleName)
{
#ifdef Q_WS_WIN
Q_UNUSED(family);
Q_UNUSED(style);
Q_UNUSED(styleName);
return QFontDatabase::standardSizes();
#else
bool smoothScalable = false;
@ -2067,7 +2074,7 @@ QList<int> QFontDatabase::smoothSizes(const QString &family,
QT_PREPEND_NAMESPACE(load)(familyName);
QtFontStyle::Key styleKey(style);
QtFontStyle::Key styleKey(styleName);
QList<int> sizes;
@ -2084,7 +2091,7 @@ QList<int> QFontDatabase::smoothSizes(const QString &family,
for (int j = 0; j < fam->count; j++) {
QtFontFoundry *foundry = fam->foundries[j];
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
QtFontStyle *style = foundry->style(styleKey);
QtFontStyle *style = foundry->style(styleKey, styleName);
if (!style) continue;
if (style->smoothScalable) {
@ -2151,12 +2158,12 @@ bool QFontDatabase::italic(const QString &family, const QString &style) const
QtFontFoundry *foundry = f->foundries[j];
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++)
allStyles.style(foundry->styles[k]->key, true);
allStyles.style(foundry->styles[k]->key, foundry->styles[k]->styleName, true);
}
}
QtFontStyle::Key styleKey(style);
QtFontStyle *s = allStyles.style(styleKey);
QtFontStyle *s = allStyles.style(styleKey, style);
return s && s->key.style == QFont::StyleItalic;
}
@ -2186,12 +2193,12 @@ bool QFontDatabase::bold(const QString &family,
if (foundryName.isEmpty() ||
foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++)
allStyles.style(foundry->styles[k]->key, true);
allStyles.style(foundry->styles[k]->key, foundry->styles[k]->styleName, true);
}
}
QtFontStyle::Key styleKey(style);
QtFontStyle *s = allStyles.style(styleKey);
QtFontStyle *s = allStyles.style(styleKey, style);
return s && s->key.weight >= QFont::Bold;
}
@ -2222,12 +2229,12 @@ int QFontDatabase::weight(const QString &family,
if (foundryName.isEmpty() ||
foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++)
allStyles.style(foundry->styles[k]->key, true);
allStyles.style(foundry->styles[k]->key, foundry->styles[k]->styleName, true);
}
}
QtFontStyle::Key styleKey(style);
QtFontStyle *s = allStyles.style(styleKey);
QtFontStyle *s = allStyles.style(styleKey, style);
return s ? s->key.weight : -1;
}

View File

@ -73,7 +73,7 @@ Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &fou
}
QtFontFoundry *foundry = f->foundry(foundryname, true);
QtFontStyle *fontStyle = foundry->style(styleKey, true);
QtFontStyle *fontStyle = foundry->style(styleKey, QString(), true);
fontStyle->smoothScalable = scalable;
fontStyle->antialiased = antialiased;
QtFontSize *size = fontStyle->pixelSize(pixelSize?pixelSize:SMOOTH_SCALABLE, true);

View File

@ -2711,7 +2711,7 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block)
html += QLatin1Char('>');
if (block.begin().atEnd())
html += "<br />";
html += QLatin1String("<br />");
QTextBlock::Iterator it = block.begin();
if (fragmentMarkers && !it.atEnd() && block == doc->begin())

View File

@ -163,8 +163,6 @@ public:
bool isSocketWaiting() const;
bool isSocketReading() const;
friend class QNetworkAccessHttpBackend;
protected slots:
void _q_receiveReply();
void _q_bytesWritten(qint64 bytes); // proceed sending

File diff suppressed because it is too large Load Diff

View File

@ -1,169 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtNetwork module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QNETWORKACCESSHTTPBACKEND_P_H
#define QNETWORKACCESSHTTPBACKEND_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of the Network Access API. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
#include "qhttpnetworkconnection_p.h"
#include "qnetworkaccessbackend_p.h"
#include "qnetworkrequest.h"
#include "qnetworkreply.h"
#include "qabstractsocket.h"
#include "QtCore/qpointer.h"
#include "QtCore/qdatetime.h"
#include "QtCore/qsharedpointer.h"
#include "qatomic.h"
#ifndef QT_NO_HTTP
QT_BEGIN_NAMESPACE
class QNetworkAccessCachedHttpConnection;
class QNetworkAccessHttpBackendIODevice;
class QNetworkAccessHttpBackend: public QNetworkAccessBackend
{
Q_OBJECT
public:
QNetworkAccessHttpBackend();
virtual ~QNetworkAccessHttpBackend();
virtual void open();
virtual void closeDownstreamChannel();
virtual void downstreamReadyWrite();
virtual void setDownstreamLimited(bool b);
virtual void copyFinished(QIODevice *);
#ifndef QT_NO_OPENSSL
virtual void ignoreSslErrors();
virtual void ignoreSslErrors(const QList<QSslError> &errors);
virtual void fetchSslConfiguration(QSslConfiguration &configuration) const;
virtual void setSslConfiguration(const QSslConfiguration &configuration);
#endif
QNetworkCacheMetaData fetchCacheMetaData(const QNetworkCacheMetaData &metaData) const;
// we return true since HTTP needs to send PUT/POST data again after having authenticated
bool needsResetableUploadData() { return true; }
bool canResume() const;
void setResumeOffset(quint64 offset);
signals:
// To HTTP thread:
void startHttpRequest();
void abortHttpRequest();
void startHttpRequestSynchronously();
void haveUploadData(QByteArray dataArray, bool dataAtEnd, qint64 dataSize);
private slots:
// From HTTP thread:
void replyDownloadData(QByteArray);
void replyFinished();
void replyDownloadMetaData(QList<QPair<QByteArray,QByteArray> >,int,QString,bool,QSharedPointer<char>,qint64);
void replyDownloadProgressSlot(qint64,qint64);
void httpAuthenticationRequired(const QHttpNetworkRequest &request, QAuthenticator *auth);
void httpError(QNetworkReply::NetworkError error, const QString &errorString);
#ifndef QT_NO_OPENSSL
void replySslErrors(const QList<QSslError> &, bool *, QList<QSslError> *);
void replySslConfigurationChanged(const QSslConfiguration&);
#endif
// From QNonContiguousByteDeviceThreadForwardImpl in HTTP thread:
void resetUploadDataSlot(bool *r);
void wantUploadDataSlot(qint64);
void sentUploadDataSlot(qint64);
bool sendCacheContents(const QNetworkCacheMetaData &metaData);
private:
QHttpNetworkRequest httpRequest; // There is also a copy in the HTTP thread
int statusCode;
QString reasonPhrase;
// Will be increased by HTTP thread:
QSharedPointer<QAtomicInt> pendingDownloadDataEmissions;
QSharedPointer<QAtomicInt> pendingDownloadProgressEmissions;
bool loadingFromCache;
QByteDataBuffer pendingDownloadData;
bool usingZerocopyDownloadBuffer;
#ifndef QT_NO_OPENSSL
QSslConfiguration *pendingSslConfiguration;
bool pendingIgnoreAllSslErrors;
QList<QSslError> pendingIgnoreSslErrorsList;
#endif
quint64 resumeOffset;
bool loadFromCacheIfAllowed(QHttpNetworkRequest &httpRequest);
void invalidateCache();
void postRequest();
void readFromHttp();
void checkForRedirect(const int statusCode);
};
class QNetworkAccessHttpBackendFactory : public QNetworkAccessBackendFactory
{
public:
virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op,
const QNetworkRequest &request) const;
};
QT_END_NAMESPACE
#endif // QT_NO_HTTP
#endif

View File

@ -50,7 +50,6 @@
#include "QtNetwork/qnetworksession.h"
#include "QtNetwork/private/qsharednetworksession_p.h"
#include "qnetworkaccesshttpbackend_p.h"
#include "qnetworkaccessftpbackend_p.h"
#include "qnetworkaccessfilebackend_p.h"
#include "qnetworkaccessdebugpipebackend_p.h"

View File

@ -159,7 +159,6 @@ protected:
private:
friend class QNetworkReplyImplPrivate;
friend class QNetworkAccessHttpBackend;
friend class QNetworkReplyHttpImpl;
Q_DECLARE_PRIVATE(QNetworkAccessManager)

View File

@ -105,6 +105,10 @@ QT_BEGIN_NAMESPACE
header and contains a QList<QNetworkCookie> representing the
cookies sent by the server to be stored locally.
\value UserAgentHeader The User-Agent header sent by HTTP clients.
\value ServerHeader The Server header received by HTTP clients.
\sa header(), setHeader(), rawHeader(), setRawHeader()
*/
@ -650,6 +654,12 @@ static QByteArray headerName(QNetworkRequest::KnownHeaders header)
case QNetworkRequest::ContentDispositionHeader:
return "Content-Disposition";
case QNetworkRequest::UserAgentHeader:
return "User-Agent";
case QNetworkRequest::ServerHeader:
return "Server";
// no default:
// if new values are added, this will generate a compiler warning
}
@ -663,6 +673,8 @@ static QByteArray headerValue(QNetworkRequest::KnownHeaders header, const QVaria
case QNetworkRequest::ContentTypeHeader:
case QNetworkRequest::ContentLengthHeader:
case QNetworkRequest::ContentDispositionHeader:
case QNetworkRequest::UserAgentHeader:
case QNetworkRequest::ServerHeader:
return value.toByteArray();
case QNetworkRequest::LocationHeader:
@ -745,6 +757,13 @@ static QNetworkRequest::KnownHeaders parseHeaderName(const QByteArray &headerNam
case 's':
if (qstricmp(headerName.constData(), "set-cookie") == 0)
return QNetworkRequest::SetCookieHeader;
else if (qstricmp(headerName.constData(), "server") == 0)
return QNetworkRequest::ServerHeader;
break;
case 'u':
if (qstricmp(headerName.constData(), "user-agent") == 0)
return QNetworkRequest::UserAgentHeader;
break;
}
@ -778,6 +797,8 @@ static QVariant parseHeaderValue(QNetworkRequest::KnownHeaders header, const QBy
{
// header is always a valid value
switch (header) {
case QNetworkRequest::UserAgentHeader:
case QNetworkRequest::ServerHeader:
case QNetworkRequest::ContentTypeHeader:
// copy exactly, convert to QString
return QString::fromLatin1(value);

View File

@ -66,7 +66,9 @@ public:
LastModifiedHeader,
CookieHeader,
SetCookieHeader,
ContentDispositionHeader // added for QMultipartMessage
ContentDispositionHeader, // added for QMultipartMessage
UserAgentHeader,
ServerHeader
};
enum Attribute {
HttpStatusCodeAttribute,

View File

@ -527,6 +527,7 @@ void QHostInfoRunnable::run()
iterator.remove();
hostInfo.setLookupId(postponed->id);
postponed->resultEmitter.emitResultsReady(hostInfo);
delete postponed;
}
}
}

View File

@ -128,7 +128,7 @@
QT_BEGIN_NAMESPACE
// forward declaration
static QMap<QString, QString> _q_mapFromX509Name(X509_NAME *name);
static QMap<QByteArray, QString> _q_mapFromX509Name(X509_NAME *name);
/*!
Constructs a QSslCertificate by reading \a format encoded data
@ -297,19 +297,19 @@ QByteArray QSslCertificate::digest(QCryptographicHash::Algorithm algorithm) cons
return QCryptographicHash::hash(toDer(), algorithm);
}
static QString _q_SubjectInfoToString(QSslCertificate::SubjectInfo info)
static QByteArray _q_SubjectInfoToString(QSslCertificate::SubjectInfo info)
{
QString str;
QByteArray str;
switch (info) {
case QSslCertificate::Organization: str = QLatin1String("O"); break;
case QSslCertificate::CommonName: str = QLatin1String("CN"); break;
case QSslCertificate::LocalityName: str = QLatin1String("L"); break;
case QSslCertificate::OrganizationalUnitName: str = QLatin1String("OU"); break;
case QSslCertificate::CountryName: str = QLatin1String("C"); break;
case QSslCertificate::StateOrProvinceName: str = QLatin1String("ST"); break;
case QSslCertificate::DistinguishedNameQualifier: str = QLatin1String("dnQualifier"); break;
case QSslCertificate::SerialNumber: str = QLatin1String("serialNumber"); break;
case QSslCertificate::EmailAddress: str = QLatin1String("emailAddress"); break;
case QSslCertificate::Organization: str = QByteArray("O"); break;
case QSslCertificate::CommonName: str = QByteArray("CN"); break;
case QSslCertificate::LocalityName: str = QByteArray("L"); break;
case QSslCertificate::OrganizationalUnitName: str = QByteArray("OU"); break;
case QSslCertificate::CountryName: str = QByteArray("C"); break;
case QSslCertificate::StateOrProvinceName: str = QByteArray("ST"); break;
case QSslCertificate::DistinguishedNameQualifier: str = QByteArray("dnQualifier"); break;
case QSslCertificate::SerialNumber: str = QByteArray("serialNumber"); break;
case QSslCertificate::EmailAddress: str = QByteArray("emailAddress"); break;
}
return str;
}
@ -334,20 +334,20 @@ QStringList QSslCertificate::issuerInfo(SubjectInfo info) const
}
/*!
Returns the issuer information for \a tag from the certificate,
or an empty string if there is no information for \a tag in the
Returns the issuer information for \a attribute from the certificate,
or an empty string if there is no information for \a attribute in the
certificate.
\sa subjectInfo()
*/
QStringList QSslCertificate::issuerInfo(const QByteArray &tag) const
QStringList QSslCertificate::issuerInfo(const QByteArray &attribute) const
{
// lazy init
if (d->issuerInfo.isEmpty() && d->x509)
d->issuerInfo =
_q_mapFromX509Name(q_X509_get_issuer_name(d->x509));
return d->issuerInfo.values(QString::fromLatin1(tag));
return d->issuerInfo.values(attribute);
}
/*!
@ -370,19 +370,57 @@ QStringList QSslCertificate::subjectInfo(SubjectInfo info) const
}
/*!
Returns the subject information for \a tag, or an empty string if
there is no information for \a tag in the certificate.
Returns the subject information for \a attribute, or an empty string if
there is no information for \a attribute in the certificate.
\sa issuerInfo()
*/
QStringList QSslCertificate::subjectInfo(const QByteArray &tag) const
QStringList QSslCertificate::subjectInfo(const QByteArray &attribute) const
{
// lazy init
if (d->subjectInfo.isEmpty() && d->x509)
d->subjectInfo =
_q_mapFromX509Name(q_X509_get_subject_name(d->x509));
return d->subjectInfo.values(QString::fromLatin1(tag));
return d->subjectInfo.values(attribute);
}
/*!
Returns a list of the attributes that have values in the subject
information of this certificate. The information associated
with a given attribute can be accessed using the subjectInfo()
method. Note that this list may include the OIDs for any
elements that are not known by the SSL backend.
\sa subjectInfo()
*/
QList<QByteArray> QSslCertificate::subjectInfoAttributes() const
{
// lazy init
if (d->subjectInfo.isEmpty() && d->x509)
d->subjectInfo =
_q_mapFromX509Name(q_X509_get_subject_name(d->x509));
return d->subjectInfo.uniqueKeys();
}
/*!
Returns a list of the attributes that have values in the issuer
information of this certificate. The information associated
with a given attribute can be accessed using the issuerInfo()
method. Note that this list may include the OIDs for any
elements that are not known by the SSL backend.
\sa subjectInfo()
*/
QList<QByteArray> QSslCertificate::issuerInfoAttributes() const
{
// lazy init
if (d->issuerInfo.isEmpty() && d->x509)
d->issuerInfo =
_q_mapFromX509Name(q_X509_get_issuer_name(d->x509));
return d->issuerInfo.uniqueKeys();
}
/*!
@ -706,17 +744,32 @@ QByteArray QSslCertificatePrivate::text_from_X509(X509 *x509)
return result;
}
static QMap<QString, QString> _q_mapFromX509Name(X509_NAME *name)
QByteArray QSslCertificatePrivate::asn1ObjectName(ASN1_OBJECT *object)
{
QMap<QString, QString> info;
int nid = q_OBJ_obj2nid(object);
if (nid != NID_undef)
return QByteArray(q_OBJ_nid2sn(nid));
// This is used for unknown info so we get the OID as text
char buf[80];
q_i2t_ASN1_OBJECT(buf, sizeof(buf), object);
return QByteArray(buf);
}
static QMap<QByteArray, QString> _q_mapFromX509Name(X509_NAME *name)
{
QMap<QByteArray, QString> info;
for (int i = 0; i < q_X509_NAME_entry_count(name); ++i) {
X509_NAME_ENTRY *e = q_X509_NAME_get_entry(name, i);
const char *obj = q_OBJ_nid2sn(q_OBJ_obj2nid(q_X509_NAME_ENTRY_get_object(e)));
QByteArray name = QSslCertificatePrivate::asn1ObjectName(q_X509_NAME_ENTRY_get_object(e));
unsigned char *data = 0;
int size = q_ASN1_STRING_to_UTF8(&data, q_X509_NAME_ENTRY_get_data(e));
info.insertMulti(QString::fromUtf8(obj), QString::fromUtf8((char*)data, size));
info.insertMulti(name, QString::fromUtf8((char*)data, size));
q_CRYPTO_free(data);
}
return info;
}

View File

@ -100,9 +100,11 @@ public:
QByteArray serialNumber() const;
QByteArray digest(QCryptographicHash::Algorithm algorithm = QCryptographicHash::Md5) const;
QStringList issuerInfo(SubjectInfo info) const;
QStringList issuerInfo(const QByteArray &tag) const;
QStringList issuerInfo(const QByteArray &attribute) const;
QStringList subjectInfo(SubjectInfo info) const;
QStringList subjectInfo(const QByteArray &tag) const;
QStringList subjectInfo(const QByteArray &attribute) const;
QList<QByteArray> subjectInfoAttributes() const;
QList<QByteArray> issuerInfoAttributes() const;
QMultiMap<QSsl::AlternateNameEntryType, QString> alternateSubjectNames() const;
QDateTime effectiveDate() const;
QDateTime expiryDate() const;

View File

@ -83,8 +83,8 @@ public:
QByteArray versionString;
QByteArray serialNumberString;
QMap<QString, QString> issuerInfo;
QMap<QString, QString> subjectInfo;
QMap<QByteArray, QString> issuerInfo;
QMap<QByteArray, QString> subjectInfo;
QDateTime notValidAfter;
QDateTime notValidBefore;
@ -92,6 +92,7 @@ public:
void init(const QByteArray &data, QSsl::EncodingFormat format);
static QByteArray asn1ObjectName(ASN1_OBJECT *object);
static QByteArray QByteArray_from_X509(X509 *x509, QSsl::EncodingFormat format);
static QByteArray text_from_X509(X509 *x509);
static QSslCertificate QSslCertificate_from_X509(X509 *x509);

View File

@ -1598,6 +1598,27 @@ bool QSslSocket::supportsSsl()
return QSslSocketPrivate::supportsSsl();
}
/*!
Returns the version number of the SSL library in use. Note that
this is the version of the library in use at run-time not compile
time. If no SSL support is available then this will return an
undefined value.
*/
long QSslSocket::sslLibraryVersionNumber()
{
return QSslSocketPrivate::sslLibraryVersionNumber();
}
/*!
Returns the version string of the SSL library in use. Note that
this is the version of the library in use at run-time not compile
time. If no SSL support is available then this will return an empty value.
*/
QString QSslSocket::sslLibraryVersionString()
{
return QSslSocketPrivate::sslLibraryVersionString();
}
/*!
Starts a delayed SSL handshake for a client connection. This
function can be called when the socket is in the \l ConnectedState

View File

@ -176,6 +176,9 @@ public:
QList<QSslError> sslErrors() const;
static bool supportsSsl();
static long sslLibraryVersionNumber();
static QString sslLibraryVersionString();
void ignoreSslErrors(const QList<QSslError> &errors);
public Q_SLOTS:

View File

@ -602,6 +602,23 @@ void QSslSocketPrivate::ensureInitialized()
ensureCiphersAndCertsLoaded();
}
long QSslSocketPrivate::sslLibraryVersionNumber()
{
return q_SSLeay();
}
QString QSslSocketPrivate::sslLibraryVersionString()
{
if (!supportsSsl())
return QString();
const char *versionString = q_SSLeay_version(SSLEAY_VERSION);
if (!versionString)
return QString();
return QString::fromLatin1(versionString);
}
/*!
\internal

View File

@ -133,6 +133,10 @@ DEFINEFUNC(EVP_PKEY *, EVP_PKEY_new, DUMMYARG, DUMMYARG, return 0, return)
DEFINEFUNC(int, EVP_PKEY_type, int a, a, return NID_undef, return)
DEFINEFUNC2(int, i2d_X509, X509 *a, a, unsigned char **b, b, return -1, return)
DEFINEFUNC(const char *, OBJ_nid2sn, int a, a, return 0, return)
DEFINEFUNC(const char *, OBJ_nid2ln, int a, a, return 0, return)
DEFINEFUNC3(int, i2t_ASN1_OBJECT, char *a, a, int b, b, ASN1_OBJECT *c, c, return -1, return)
DEFINEFUNC(int, OBJ_obj2nid, const ASN1_OBJECT *a, a, return NID_undef, return)
#ifdef SSLEAY_MACROS
DEFINEFUNC6(void *, PEM_ASN1_read_bio, d2i_of_void *a, a, const char *b, b, BIO *c, c, void **d, d, pem_password_cb *e, e, void *f, f, return 0, return)
@ -276,6 +280,7 @@ DEFINEFUNC(void, OPENSSL_add_all_algorithms_noconf, void, DUMMYARG, return, DUMM
DEFINEFUNC(void, OPENSSL_add_all_algorithms_conf, void, DUMMYARG, return, DUMMYARG)
DEFINEFUNC3(int, SSL_CTX_load_verify_locations, SSL_CTX *ctx, ctx, const char *CAfile, CAfile, const char *CApath, CApath, return 0, return)
DEFINEFUNC(long, SSLeay, void, DUMMYARG, return 0, return)
DEFINEFUNC(const char *, SSLeay_version, int a, a, return 0, return)
#ifdef Q_OS_SYMBIAN
#define RESOLVEFUNC(func, ordinal, lib) \
@ -687,6 +692,8 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(EVP_PKEY_new)
RESOLVEFUNC(EVP_PKEY_type)
RESOLVEFUNC(OBJ_nid2sn)
RESOLVEFUNC(OBJ_nid2ln)
RESOLVEFUNC(i2t_ASN1_OBJECT)
RESOLVEFUNC(OBJ_obj2nid)
#ifdef SSLEAY_MACROS // ### verify
RESOLVEFUNC(PEM_ASN1_read_bio)
@ -788,6 +795,7 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(OPENSSL_add_all_algorithms_conf)
RESOLVEFUNC(SSL_CTX_load_verify_locations)
RESOLVEFUNC(SSLeay)
RESOLVEFUNC(SSLeay_version)
#endif // Q_OS_SYMBIAN
symbolsResolved = true;
delete libs.first;

View File

@ -237,6 +237,8 @@ int q_EVP_PKEY_type(int a);
EVP_PKEY *q_EVP_PKEY_new();
int q_i2d_X509(X509 *a, unsigned char **b);
const char *q_OBJ_nid2sn(int a);
const char *q_OBJ_nid2ln(int a);
int q_i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *obj);
int q_OBJ_obj2nid(const ASN1_OBJECT *a);
#ifdef SSLEAY_MACROS
// ### verify
@ -426,6 +428,7 @@ void q_OPENSSL_add_all_algorithms_noconf();
void q_OPENSSL_add_all_algorithms_conf();
int q_SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath);
long q_SSLeay();
const char *q_SSLeay_version(int type);
// Helper function
class QDateTime;

View File

@ -116,6 +116,8 @@ public:
bool allowRootCertOnDemandLoading;
static bool supportsSsl();
static long sslLibraryVersionNumber();
static QString sslLibraryVersionString();
static void ensureInitialized();
static void deinitialize();
static QList<QSslCipher> defaultCiphers();

View File

@ -57,8 +57,6 @@
#ifndef QT_NO_DBUS
QT_BEGIN_NAMESPACE
static QDBusConnection dbusConnection = QDBusConnection::systemBus();
QOfonoManagerInterface::QOfonoManagerInterface( QObject *parent)
: QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
@ -106,7 +104,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
QLatin1String(OFONO_MANAGER_PATH),
QLatin1String(OFONO_MANAGER_INTERFACE),
QLatin1String("PropertyChanged"),
@ -256,7 +254,7 @@ void QOfonoModemInterface::connectNotify(const char *signal)
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_MODEM_INTERFACE),
QLatin1String("PropertyChanged"),
@ -379,7 +377,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_NETWORK_REGISTRATION_INTERFACE),
QLatin1String("PropertyChanged"),
@ -477,7 +475,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
QLatin1String("PropertyChanged"),
@ -580,7 +578,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
QLatin1String("PropertyChanged"),
@ -669,7 +667,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
QLatin1String("PropertyChanged"),
@ -788,7 +786,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
QLatin1String("PropertyChanged"),
@ -870,7 +868,7 @@ void QOfonoSmsInterface::connectNotify(const char *signal)
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
dbusConnection.connect(QLatin1String(OFONO_SERVICE),
QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
QLatin1String("PropertyChanged"),

View File

@ -18,11 +18,11 @@ After configuring and building Qt you need to also build src/plugins/platforms/u
Simulator:
----------
configure -qpa -xplatform qws/macx-iphonesimulator-g++ -arch i386 -developer-build -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
configure -qpa -xplatform qws/macx-iphonesimulator-g++ -arch i386 -developer-build -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake docs -nomake examples -nomake translations
Device:
-------
configure -qpa -xplatform qws/macx-iphonedevice-g++ -arch armv7 -developer-build -release -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
configure -qpa -xplatform qws/macx-iphonedevice-g++ -arch armv7 -developer-build -release -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake docs -nomake examples -nomake translations
2) XCode setup:
- there are examples in the examples subdirectory of the platform plugin

View File

@ -48,6 +48,8 @@
#include "wayland-xcomposite-client-protocol.h"
#include <X11/extensions/Xcomposite.h>
#include "qwaylandxcompositeeglintegration.h"
#include "windowmanager_integration/qwaylandwindowmanagerintegration.h"
#include <QtCore/QDebug>
@ -147,3 +149,12 @@ void QWaylandXCompositeEGLWindow::sync_function(void *data)
QWaylandXCompositeEGLWindow *that = static_cast<QWaylandXCompositeEGLWindow *>(data);
that->m_waitingForSync = false;
}
void QWaylandXCompositeEGLWindow::requestActivateWindow()
{
#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT
mDisplay->windowManagerIntegration()->authenticateWithToken();
#endif
QWaylandWindow::requestActivateWindow();
}

View File

@ -55,6 +55,7 @@ public:
WindowType windowType() const;
void setGeometry(const QRect &rect);
void requestActivateWindow();
EGLSurface eglSurface() const;

View File

@ -99,19 +99,18 @@ void QWaylandWindowManagerIntegration::authenticateWithToken(const QByteArray &t
QByteArray authToken = token;
if (authToken.isEmpty())
authToken = qgetenv("WL_AUTHENTICATION_TOKEN");
if (mWaylandWindowManager)
if (mWaylandWindowManager && !authToken.isEmpty()) {
wl_windowmanager_authenticate_with_token(mWaylandWindowManager, authToken.constData());
}
}
void QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible)
{
Q_UNUSED(data);
Q_UNUSED(wl_windowmanager);
QEvent evt(visible != 0 ? QEvent::ApplicationActivated : QEvent::ApplicationDeactivated);
QEvent evt(visible != 0 ? QEvent::ApplicationActivate : QEvent::ApplicationDeactivate);
QCoreApplication::sendEvent(QCoreApplication::instance(), &evt);
qDebug() << "OnScreenVisibility" << (visible != 0);
}
void QWaylandWindowManagerIntegration::wlHandleScreenOrientationChange(void *data, struct wl_windowmanager *wl_windowmanager, int screenOrientation)

View File

@ -56,10 +56,6 @@ namespace QSql
{
BeforeFirstRow = -1,
AfterLastRow = -2
#ifdef QT3_SUPPORT
, BeforeFirst = BeforeFirstRow,
AfterLast = AfterLastRow
#endif
};
enum ParamTypeFlag
@ -87,21 +83,6 @@ namespace QSql
HighPrecision = 0
};
#ifdef QT3_SUPPORT
enum Op {
None = -1,
Insert = 0,
Update = 1,
Delete = 2
};
enum Confirm {
Cancel = -1,
No = 0,
Yes = 1
};
#endif
}
Q_DECLARE_OPERATORS_FOR_FLAGS(QSql::ParamType)

View File

@ -1434,26 +1434,6 @@ bool QSqlDatabase::isValid() const
return d->driver && d->driver != d->shared_null()->driver;
}
#ifdef QT3_SUPPORT
/*!
Use query.record() instead.
*/
QSqlRecord QSqlDatabase::record(const QSqlQuery& query) const
{ return query.record(); }
/*!
Use query.record() instead.
*/
QSqlRecord QSqlDatabase::recordInfo(const QSqlQuery& query) const
{ return query.record(); }
/*!
\fn QSqlRecord QSqlDatabase::recordInfo(const QString& tablename) const
Use record() instead.
*/
#endif
/*!
Clones the database connection \a other and and stores it as \a
connectionName. All the settings from the original database, e.g.

View File

@ -44,9 +44,6 @@
#include <QtCore/qstring.h>
#include <QtSql/qsql.h>
#ifdef QT3_SUPPORT
#include <QtSql/qsqlrecord.h>
#endif
QT_BEGIN_HEADER
@ -92,12 +89,6 @@ public:
QStringList tables(QSql::TableType type = QSql::Tables) const;
QSqlIndex primaryIndex(const QString& tablename) const;
QSqlRecord record(const QString& tablename) const;
#ifdef QT3_SUPPORT
QT3_SUPPORT QSqlRecord record(const QSqlQuery& query) const;
inline QT3_SUPPORT QSqlRecord recordInfo(const QString& tablename) const
{ return record(tablename); }
QT3_SUPPORT QSqlRecord recordInfo(const QSqlQuery& query) const;
#endif
QSqlQuery exec(const QString& query = QString()) const;
QSqlError lastError() const;
bool isValid() const;

View File

@ -46,9 +46,6 @@
#include <QtCore/qstring.h>
#include <QtCore/qstringlist.h>
#include <QtSql/qsql.h>
#ifdef QT3_SUPPORT
#include <QtSql/qsqlquery.h>
#endif
QT_BEGIN_HEADER
@ -93,17 +90,6 @@ public:
virtual QStringList tables(QSql::TableType tableType) const;
virtual QSqlIndex primaryIndex(const QString &tableName) const;
virtual QSqlRecord record(const QString &tableName) const;
#ifdef QT3_SUPPORT
inline QT3_SUPPORT QSqlRecord record(const QSqlQuery& query) const
{ return query.record(); }
inline QT3_SUPPORT QSqlRecord recordInfo(const QString& tablename) const
{ return record(tablename); }
inline QT3_SUPPORT QSqlRecord recordInfo(const QSqlQuery& query) const
{ return query.record(); }
inline QT3_SUPPORT QString nullText() const { return QLatin1String("NULL"); }
inline QT3_SUPPORT QString formatValue(const QSqlField *field, bool trimStrings = false) const
{ return field ? formatValue(*field, trimStrings) : QString(); }
#endif
virtual QString formatValue(const QSqlField& field, bool trimStrings = false) const;
virtual QString escapeIdentifier(const QString &identifier, IdentifierType type) const;

View File

@ -59,13 +59,6 @@ public:
StatementError,
TransactionError,
UnknownError
#ifdef QT3_SUPPORT
, None = NoError,
Connection = ConnectionError,
Statement = StatementError,
Transaction = TransactionError,
Unknown = UnknownError
#endif
};
QSqlError( const QString& driverText = QString(),
const QString& databaseText = QString(),

View File

@ -98,10 +98,6 @@ public:
bool isGenerated() const;
bool isValid() const;
#ifdef QT3_SUPPORT
inline QT3_SUPPORT void setNull() { clear(); }
#endif
private:
void detach();
QVariant val;

View File

@ -164,60 +164,6 @@ void QSqlIndex::setDescending(int i, bool desc)
sorts[i] = desc;
}
#ifdef QT3_SUPPORT
/*!
Returns a comma-separated list of all the index's field names as a
string. This string is suitable, for example, for generating a
SQL SELECT statement. Only generated fields are included in the
list (see \l{isGenerated()}). If a \a prefix is specified, e.g. a
table name, it is prepended before all field names in the form:
"\a{prefix}.<fieldname>"
If \a sep is specified, each field is separated by \a sep. If \a
verbose is true (the default), each field contains a suffix
indicating an ASCending or DESCending sort order.
*/
QString QSqlIndex::toString(const QString& prefix, const QString& sep, bool verbose) const
{
QString s;
bool comma = false;
for (int i = 0; i < count(); ++i) {
if(comma)
s += sep + QLatin1Char(' ');
s += createField(i, prefix, verbose);
comma = true;
}
return s;
}
/*!
Returns a list of all the index's field names. Only generated
fields are included in the list (see \l{isGenerated()}). If a \a
prefix is specified, e.g. a table name, all fields are prefixed in
the form:
"\a{prefix}.<fieldname>"
If \a verbose is true (the default), each field contains a suffix
indicating an ASCending or DESCending sort order.
Note that if you want to iterate over the list, you should iterate
over a copy, e.g.
\snippet doc/src/snippets/code/src_sql_kernel_qsqlindex.cpp 0
*/
QStringList QSqlIndex::toStringList(const QString& prefix, bool verbose) const
{
QStringList s;
for (int i = 0; i < count(); ++i)
s += createField(i, prefix, verbose);
return s;
}
#endif
/*! \internal
Creates a string representing the field number \a i using prefix \a

View File

@ -70,14 +70,6 @@ public:
bool isDescending(int i) const;
void setDescending(int i, bool desc);
#ifdef QT3_SUPPORT
QT3_SUPPORT QString toString(const QString &prefix = QString(),
const QString &sep = QLatin1String(","),
bool verbose = true) const;
QT3_SUPPORT QStringList toStringList(const QString& prefix = QString(),
bool verbose = true) const;
#endif
private:
QString createField(int i, const QString& prefix, bool verbose) const;
QString cursor;

View File

@ -94,9 +94,6 @@ public:
bool seek(int i, bool relative = false);
bool next();
bool previous();
#ifdef QT3_SUPPORT
inline QT3_SUPPORT bool prev() { return previous(); }
#endif
bool first();
bool last();

View File

@ -244,34 +244,6 @@ int QSqlRecord::indexOf(const QString& name) const
return -1;
}
#ifdef QT3_SUPPORT
/*!
\obsolete
Use field() instead
*/
const QSqlField* QSqlRecord::fieldPtr(int index) const
{
if (!d->contains(index))
return 0;
return &d->fields.at(index);
}
/*!
\obsolete
Use field() instead
*/
const QSqlField* QSqlRecord::fieldPtr(const QString& name) const
{
int i = indexOf(name);
if (!d->contains(i))
return 0;
return &d->fields.at(i);
}
#endif //QT3_SUPPORT
/*!
Returns the field at position \a index. If the position is out of
range, an empty field is returned.
@ -496,49 +468,6 @@ bool QSqlRecord::isGenerated(int index) const
return d->fields.value(index).isGenerated();
}
#ifdef QT3_SUPPORT
/*!
Returns a list of all the record's field names as a string
separated by \a sep.
In the unlikely event that you used this function in Qt 3, you
can simulate it using the rest of the QSqlRecord public API.
*/
QString QSqlRecord::toString(const QString& prefix, const QString& sep) const
{
QString pflist;
bool comma = false;
for (int i = 0; i < count(); ++i) {
if (!d->fields.value(i).isGenerated()) {
if (comma)
pflist += sep + QLatin1Char(' ');
pflist += d->createField(i, prefix);
comma = true;
}
}
return pflist;
}
/*!
Returns a list of all the record's field names, each having the
prefix \a prefix.
In the unlikely event that you used this function in Qt 3, you
can simulate it using the rest of the QSqlRecord public API.
*/
QStringList QSqlRecord::toStringList(const QString& prefix) const
{
QStringList s;
for (int i = 0; i < count(); ++i) {
if (!d->fields.value(i).isGenerated())
s += d->createField(i, prefix);
}
return s;
}
#endif // QT3_SUPPORT
/*!
Returns the number of fields in the record.

View File

@ -87,15 +87,6 @@ public:
void setGenerated(const QString& name, bool generated);
void setGenerated(int i, bool generated);
#ifdef QT3_SUPPORT
QT3_SUPPORT const QSqlField* fieldPtr(int i) const;
QT3_SUPPORT const QSqlField* fieldPtr(const QString& name) const;
inline QT3_SUPPORT int position(const QString& name) const { return indexOf(name); }
QT3_SUPPORT QString toString(const QString& prefix = QString(),
const QString& sep = QLatin1String(",")) const;
QT3_SUPPORT QStringList toStringList(const QString& prefix = QString()) const;
#endif
void append(const QSqlField& field);
void replace(int pos, const QSqlField& field);
void insert(int pos, const QSqlField& field);

View File

@ -74,10 +74,6 @@ protected:
enum BindingSyntax {
PositionalBinding,
NamedBinding
#ifdef QT3_SUPPORT
, BindByPosition = PositionalBinding,
BindByName = NamedBinding
#endif
};
explicit QSqlResult(const QSqlDriver * db);

View File

@ -113,7 +113,7 @@ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5) {
QtFontFoundry *foundry = family->foundry(foundry_name, true);
QtFontStyle::Key styleKey;
styleKey.styleName = style_name;
QString styleName = style_name;
if(QCFType<CFDictionaryRef> styles = (CFDictionaryRef)CTFontDescriptorCopyAttribute(font, kCTFontTraitsAttribute)) {
if(CFNumberRef weight = (CFNumberRef)CFDictionaryGetValue(styles, kCTFontWeightTrait)) {
Q_ASSERT(CFNumberIsFloatType(weight));
@ -134,7 +134,7 @@ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5) {
}
}
QtFontStyle *style = foundry->style(styleKey, true);
QtFontStyle *style = foundry->style(styleKey, styleName, true);
style->smoothScalable = true;
if(QCFType<CFNumberRef> size = (CFNumberRef)CTFontDescriptorCopyAttribute(font, kCTFontSizeAttribute)) {
//qDebug() << "WHEE";
@ -207,7 +207,7 @@ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5) {
QtFontFamily *family = db->family(familyName, true);
QtFontFoundry *foundry = family->foundry(QString(), true);
QtFontStyle *style = foundry->style(styleKey, true);
QtFontStyle *style = foundry->style(styleKey, QString(), true);
style->pixelSize(0, true);
style->smoothScalable = true;

Some files were not shown because too many files have changed in this diff Show More