Commit Graph

33433 Commits (a6c4d54eaf467e2db4eef83d737ffcbb263345d0)

Author SHA1 Message Date
Jesus Fernandez a6c4d54eaf Add override keyword to QPlatformSurface derived classes
Change-Id: I9ce58fb48fd41f4fc340188c1df358d9ef215c3f
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2017-08-11 09:06:06 +00:00
Tor Arne Vestbø 22998e64d9 macOS: Remove dead code from Leopard times
Change-Id: I02bc0a8488763fea525771636538b9d0943b8971
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2017-08-10 20:51:39 +00:00
Tor Arne Vestbø 7fd9da94bb macOS: Log target view for backingstore flush without quotes
Change-Id: I0d5f9f9172aaa7b9b7575dce6ba59b23567b35ce
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2017-08-10 20:51:31 +00:00
Gatis Paeglis 5f1df771b6 xcb: re-factor QXcbConnection::printXcbEvent
- To use categorized logging.

- Print also non-core event types.

- Added QLoggingCategory as one of the parameters because I will
  need it in a subsequent patch.

- A call to this function in QXcbConnection::handleXcbEvent I left
  disabled from builds by default as the "handled" variable is broken.

Change-Id: I15cd71c40b5772a4352a69cdc24a0ae026626060
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
2017-08-10 17:14:36 +00:00
David Faure 60ad66ce3c QSqlTableModel: avoid copying QSqlRecord instances
Profiling a large model showed that QSqlRecord was being copied and
destroyed from a few places, due to use of QMap<int, ModifiedRow>::value()
where ModifiedRow has two QSqlRecord members. This can easily be avoided
(in the common case with no modified rows) by using constFind() instead.

My testcase (iterating over a model with 126936 rows) went from 1266 ms
to 896 ms.

Change-Id: I04e98b5573ef24165bf6cff19946e5bedd0fb0ba
Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
2017-08-10 14:50:29 +00:00
Allan Sandfeld Jensen 74bbb6ba8a Fix handling of mirroring upscaling in simple bilinear upscaler
Calculates the correct offsets and coordinate transforms for the
intermediate buffer. This means we can conceptually simplify our
path switches instead of having downscale routines handling mirrored
upscaling.

Change-Id: I60efa7feaba80165672ca0ce064515fdf620869d
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
2017-08-10 06:42:22 +00:00
Gatis Paeglis 9184384bc9 xcb: use XInput2 for mouse starting from 2.0 not 2.2
53d289ec4c fixed the issue of not getting
touch events when grabbing via the plain xcb functions. And due to wanting
to support a setup where mouse events are delivered via core events it was
chosen to use mouse via XI2 only when really necessary. Thus starting only
from 2.2, the version from which the mouse+touch grabbing becomes the issue
(XI2 introduced touch support from 2.2).

The same patch states that using QT_XCB_NO_XI2_MOUSE restores to the old
behavior (grabbing via core) with broken touch grabbing. Broken only with
2.2+, not 2.0 and 2.1 since those versions of protocol do not know about touch.

All of this implies the following:

1) The user code that already depends on QT_XCB_NO_XI2_MOUSE, won't see any
behavioural difference if we will use XInput starting from 2.0 for mouse.
Mouse grabbing will continue to be done via core (xcb_grab_pointer) as
mentioned above and thus touch grabbing will continue to be broken with 2.2+.

2) The code that has never cared how we get the native events (core vs
xinput2), won't see any behavioural difference. In this case grabbing will
always be done via XI2 (XIGrabDevice) grab when XI2.0+ is available.

Since there is no difference in the outcome, we migth as well use XI2 for
mouse from 2.0, not 2.2. Extension events are always better choice than core.

Besides the broken touch grabbing issue with QT_XCB_NO_XI2_MOUSE, there are
other issues with that code path, for details see internal documentation of
xi2SelectDeviceEventsCompatibility(), where the conclusion is:

*** If your code relies on QT_XCB_NO_XI2_MOUSE, then your code needs fixing. ***

This patch also cleans up how we select XInput2 events, by separating
the QT_XCB_NO_XI2_MOUSE code path. This has two benefits - improved code
readability and will make the deprecation of QT_XCB_NO_XI2_MOUSE easier.

The patch removes some sparse comments as the behavior is now documented in
one place, see xi2SelectDeviceEventsCompatibility().

[ChangeLog][Platform Specific Changes][Linux] The QT_XCB_NO_XI2_MOUSE
environment variable is deprecated and will be removed in Qt 6. If your
application relies on behavior set by QT_XCB_NO_XI2_MOUSE, it should be
updated accordingly.

[ChangeLog][Platform Specific Changes][Linux] Pointer event delivery on
X11 is now done starting from XInput version 2.0 (when available) instead
of 2.2. XInput support can be disabled by setting QT_XCB_NO_XI2=1 environment
variable. Note that using QT_XCB_NO_XI2 would also disable tablet and touch
support.

Change-Id: I661b36d6710b9f6ec71fecc8287ba479432bff4c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2017-08-09 16:55:25 +00:00
Tor Arne Vestbø 0ad79dd0f0 iOS: Fix accessibility leak
Change-Id: I359ce521decbbb06376fc48689762f462c8706b0
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
2017-08-09 12:44:13 +00:00
Eirik Aavitsland 123741b64c Fix build when no fontconfig
The x11 native painting experimental feature requires fontconfig to
build, so add that dependency to configure.

Task-number: QTBUG-62121
Change-Id: Iac79c17fdeaef06b2e075dc34fe554c0e7c56edf
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2017-08-09 07:08:16 +00:00
Thiago Macieira 9312ec54db Fix QAbstractFileEngine::clone misuse
QFile::copy was assuming that the target file was native and therefore
it could simply take the file descriptor to clone. While that was not
currently a problem, in theory it could be as we do have one writeable
file engine besides QFSFileEngine (QWinRTFileEngine).

By refactoring to take the parameter as a QAbstractFileEngine, we can
ensure that the target file is a native file.

Change-Id: Ib7a1737987bf4c4a8c51fffd14d0c048fd509025
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-09 05:19:23 +00:00
Gatis Paeglis 284fff1217 xcb: cleanup leftovers in QXcbScreen::updateGeometry
That code was added by ae5f2a6672 and
later incompletely removed by c173a50719.

This patch amends c173a50719.

Change-Id: Ibfd39aaf9b49424fc54d878dc588454eb841ed97
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
2017-08-08 22:21:01 +00:00
Gatis Paeglis 6c10c54aa8 xcb: tidy-up has_<extension> variable handling
Change-Id: I666c9d415e366d6b06b05e70e01456c47ac35b4a
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2017-08-08 22:20:51 +00:00
Thiago Macieira 5d2240718c Autotest: fix blacklisted test about position on non-regular files
On BSD systems (tested on macOS and FreeBSD), you *can* lseek(2) or
ftell(3) on a pipe and get its current position. But QFile will not get
the position when the file is sequential, so we need to return 0.

Technically speaking, we ought to do the same for block devices, but if
you're redirecting stdin, stdout or stderr in the unit test to or from a
block device, you deserve the extra work to add that yourself to the
test.

Change-Id: I3868166e5efc45538544fffd14d8a74e92963fe7
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@qt.io>
2017-08-08 21:48:28 +00:00
Thiago Macieira e94830f496 QFileSystemEngine/Unix: support UF_HIDDEN on the other BSDs
The stat::st_flags and fchflags(2) syscall are marked:
HISTORY
     The chflags() and fchflags functions first appeared in 4.4BSD.

Change-Id: I81480fdb578d4d43b3fcfffd14d4fd23bd27e37e
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Tobias C. Berner <tcberner@FreeBSD.org>
2017-08-08 21:48:25 +00:00
Thiago Macieira 6504bc6bbc QFileInfo: harmonize QFileInfo() and QFileInfo("")
If a QFileInfo was constructed with an empty path, which could happen
with QFileInfo(QFile()) or via QDir, etc., then it would issue system
calls to empty paths and could even produce warnings. This commit makes
am empty path name be the same as a default-constructed QFileInfo and
corrects the use if 0 for ownerId and groupId to match the
documentation.

[ChangeLog][Important Behavior Changes] QFileInfo on empty strings now
behaves like the default-constructed QFileInfo. Notably, path() will now
be the empty string too, instead of ".", which means absoluteFilePath()
is no longer the current working directory.

Change-Id: I8d96dea9955d4c749b99fffd14ce34968b1d9bbf
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
2017-08-08 21:48:23 +00:00
Thiago Macieira d3393ce258 Add support for statx(2) on Linux
This system call, new in Linux 4.11, gives us the file birth time. It's
also extensible, representing the fourth generation of stat(2) on Linux
(the original sys_stat(), sys_newstat(), sys_stat64() and now
sys_statx()), not to be confused with glibc's __xstat function, which
wraps a call to stat64. Anyway, the new one is designed to be extensible.

Now we get birth times on ext[34] on Linux too:
 Name:   .
 Path:   . (/home/tjmaciei/src/qt)
 Size:   4096    Type: Directory
 Attrs:   readable writable executable hidden nativepath
 Mode:   drwxr-xr-x
 Owner:  tjmaciei (1000) Group:  users (100)
 Access: 2017-07-02T14:47:49.608
 Birth:  2016-05-02T13:20:33.097
 Change: 2017-07-01T13:37:08.737
 Modified: 2017-07-01T13:37:08.737

It's not supported in any other filesystems I have (Linux sources show
xfs has the feature too). Even on ext4, it depends on whether the
filesystem was created with 256-byte inodes, which my /boot fs wasn't.

Change-Id: I8d96dea9955d4c749b99fffd14cda23ed60d5e72
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
2017-08-08 21:48:20 +00:00
Jake Petroules 874837b4cc Fix the safety check preventing apps from running on old OSes
This fixes an issue where iOS, watchOS, and tvOS versions would be
mis-detected as 100 times their version (i.e. iOS 8.0 as iOS 800.0).
Instead of protecting the branch in (version >= 100000) with a macOS
ifdef, we can simply remove it entirely since Qt cannot be run on OSes
where the old encoding was used (macOS < 10.10).

Amends 8418a6335b

Change-Id: I32b307163c815799cb46c008b93f3b53d27c48b9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-08 21:42:09 +00:00
Jake Petroules 38bfe7a279 Add NSSupportsAutomaticGraphicsSwitching key to Info.plist app templates
This will allow Qt Quick applications to use the integrated GPU on
compatible Apple hardware, which helps preserve battery life.

Change-Id: I9224bd408930e2ed3dd8a022432512e78d69c195
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2017-08-08 21:42:00 +00:00
Jake Petroules 3ec3f2a5da Sort keys in Info.plist templates
This makes editing the templates easier since they can be read
alphabetically.

Change-Id: I6af5e4f13718ba1145c2dec1f8a05bc600ea937a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2017-08-08 21:41:55 +00:00
Thiago Macieira 883dfb3d15 Merge remote-tracking branch 'origin/5.9' into dev
Conflicts:
	src/widgets/kernel/qwidget.cpp

This merge also extends the expected output of the pairdiagnostics
teamcity output (added in dev in commit
c608ffc56a) after the recent addition of
the flowId attribute to the teamcity output (commit
8f03656211 in 5.9).

Change-Id: I3868166e5efc45538544fffd14d8aba438f9173c
2017-08-08 11:48:10 +02:00
Simon Hausmann b75bc0f75c Fix failing network cookie jar tests
The test verifies that a cookie with a date in the future is not
"expired" and will be sent to the server. This test started failing
on August 7th 2017 when the test case "0003" with it's cookie expiring
August 7th 2017 started ... expiring ;-)

Bumped all suspicious cookie test cases by a hundred years.

Change-Id: I7c09069ec4999e2ea0aae7b2a2819cced0fd6a99
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@qt.io>
2017-08-07 19:19:13 +00:00
Simon Hausmann ea9032ceaa Revert "Ignore thaiZWJ failure on RHEL 7.2"
The blacklisting is not needed anymore as we now use -qt-harfbuzz.

This reverts commit b36e5faad4.

Task-number: QTQAINFRA-1363
Change-Id: I3ae50588204b27e6880416ae2cbc28dda53bb292
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@qt.io>
2017-08-07 07:18:26 +00:00
Thiago Macieira 5a9b1425e1 QFileSystemEngine/Unix: rework the getting of nsec-precision file times
It was working on Linux because _GNU_SOURCE gets us POSIX.1-2008
compatibility, but not on macOS or the BSDs. There, we were still stuck
to full second precision.

This commit uses the template trick introduced by the futimes code
(which itself was inspired by commit 2fb42eb4af
in QtNetwork). Also note how it adds support for birth time, if the
system's stat struct has that information.

Tested to work on MacOS and FreeBSD. The manual filetest produces:
 Name:   .
 Path:   . (/usr/home/tjmaciei/src/qt/qt5)
 Size:   1536    Type: Directory
 Attrs:   readable writable executable hidden nativepath
 Mode:   drwxr-xr-x
 Owner:  tjmaciei (1001) Group:  tjmaciei (1001)
 Access: 2017-07-13T20:03:47.916
 Birth:  2017-07-13T20:03:47.916
 Change: 2017-07-13T20:04:41.648
 Modified: 2017-07-13T20:04:41.648

Linux will require support for statx(2).

Change-Id: I8d96dea9955d4c749b99fffd14cd97d7a8c6d45d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-06 23:14:26 +00:00
Thiago Macieira 04f4d87bda QFileSystemEngine::fillMetaData: simplify and comment the code
Took me a long while to understand what it did. Now that I do, I can
also answer the question left behind during the original implementation
in Qt 4.8 (commit 4fd2aced96d9095254d89f9da9c911bd88f15245 in the old
history): how to know if a file exists?

Change-Id: I8d96dea9955d4c749b99fffd14cdae135499a0d3
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-06 23:14:22 +00:00
Thiago Macieira 12339481ea Move Unix code from qfilesystemengine.cpp to qfilesystemengine_unix.cpp
The comment about Symbian no longer applies.

Change-Id: I8d96dea9955d4c749b99fffd14cd966f07d95948
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-06 23:14:18 +00:00
Nico Vertriest 2765b0cf3a Doc: remove linking to internal method
qimage.cpp:2127: warning: Can't link to 'isDetached()'

Change-Id: Ib8f056441bf08e315ed97caf55c510f50ebaf4ed
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
2017-08-06 09:42:04 +00:00
Eskil Abrahamsen Blomfeldt 9342a8b843 Add QTextOption/QTextEdit/QPlainTextEdit::tabStopDistance property
In Qt, we have QTextOption::tabStop, QTextEdit::tabStopWidth and
QPlainTextEdit::tabStopWidth.

Neither are very good names, since the tab stop is neither a
numerical value as in the former, nor does it have any dimensions
that can be measured, as in the latter. Vertical text advances
may also be supported by Qt at some point in the future, at
which point the name would make even less sense.

At the same time, we expose the actual type of the tab stop
distance as floating point in the QTextEdit and QPlainTextEdit
API instead of always rounding it to an int.

To avoid duplicating either of these APIs in Qt Quick, we
introduce tabStopDistance as the common term instead and deprecate
the old names.

[ChangeLog][Text] Introduced tabStopDistance property in
QTextOption, QTextEdit and QPlainTextEdit as replacement for
the inconsistently named tabStop and tabStopWidth properties.
QTextOption::tabStop, QTextEdit::tabStopWidth and
QPlainTextEdit::tabStopWidth have subsequently been deprecated.

Change-Id: Ib7e01387910cddb58adaaaadcd56c0e69edc4bc2
Reviewed-by: Paolo Angelelli <paolo.angelelli@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-06 08:16:06 +00:00
Samuel Gaist b03706d35f Migrate QStandardPaths to use QRegularExpression
This patch updates the code from the unix implementation of
QStandardPaths to use QRegularExpression in place of the deprecated
QRegExp.

Change-Id: I51fa231dcd70ca55d1bfffb31d8f28f964ac44fe
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: David Faure <david.faure@kdab.com>
2017-08-05 16:45:14 +00:00
Samuel Gaist 82fbf97903 Doc: add warning against bulk random data creation to QRandomGenerator
The full documentation explains it well but a more prominent warning
will help avoid the wrong use of that class and encourage user to read
further the documentation.

Change-Id: I3178749f2b1b0350040f81eef253fd85c7ba0a5f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-05 16:44:55 +00:00
Frederik Gladhorn 60bfd6a214 Fix typo
Change-Id: Ie82c0996a7b1112fe6d6d259d765737fc3fb6a22
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2017-08-05 16:44:36 +00:00
Thiago Macieira f77117d6ca QFileSystemEngine/Windows: fix setFileTime when input date is UTC
I was getting a weird 7-hour offset when doing:

    QVERIFY(file.setFileTime(before.addSecs(-10), QFile::FileModificationTime));
    mtime = file.fileTime(QFile::FileModificationTime).toUTC();
    QCOMPARE(mtime, before.addSecs(-10));

Change-Id: I35c4da69d754686a43e675b3d215213e448df7cf
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
2017-08-05 16:41:47 +00:00
Thiago Macieira a3c71b71e2 QFileSystemEngine::setFileTime/Unix: remove the fallback to futimesat
The use as in the code:
  futimesat(fd, NULL, &tv)

is not documented to work. The file descriptor should be a directory's
one, not an open file (though the Linux source code seems to handle that
case). This call was done as a fallback to futimes, so it's very
unlikely a system would have futimesat and not futimes.

Both the Linux and the FreeBSD man pages say it's deprecated anyway.

Change-Id: I8d96dea9955d4c749b99fffd14cd94068dc7668a
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
2017-08-05 16:41:42 +00:00
Thiago Macieira 6c3a3d498a Filesystem: Use "birth time" to avoid confusion with Unix ctime
The Unix stat fields "st_ctime" and "st_ctim" mean "change time", the
last time that the file/inode status fields were changed. It does not
mean "creation time". So this commit splits all of the internal API to
"birth" and "metadata change" instead of "creation" to avoid the
conflict.

Change-Id: I149e0540c00745fe8119fffd1463fe78b619649e
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
2017-08-05 16:41:38 +00:00
Thiago Macieira db433bdf65 Move platform-specific code from QFSFileEngine to QFileSystemEngine
Change-Id: I8d96dea9955d4c749b99fffd14cd9395174ba005
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-05 16:41:35 +00:00
Thiago Macieira 261c6713bd Introduce QFileInfo::birthTime and metadataChangeTime
[ChangeLog][QtCore][QFileInfo] Deprecated created() because it could
return one of three different file times depending on the OS and
filesystem type, without the ability to determine which one is which. It
is replaced by metadataChangeTime() and birthTime().

[ChangeLog][QtCore][QFileInfo] Added QFileInfo::metadataChangeTime(),
which returns the time the file's metadata was last changed, if it is
known, and falling back to the same value as lastModified() otherwise.
On Unix systems, this corresponds to the file's ctime.

[ChangeLog][QtCore][QFileInfo] Added QFileInfo::birthTime(), which
returns the file's birth time if it is known, an invalid QDateTime
otherwise. This function is supported on Windows and on some Unix
systems.

Change-Id: I0031aa609e714ae983c3fffd1467bd8b3e3a593d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-05 16:41:32 +00:00
Borgar Ovsthus 8f03656211 Add flowId to messages when logging in TeamCity format
Added flowId='name' to each message when using TeamCity logging format.
This is necessary to distinguish separate processes running in parallel.

[ChangeLog][QtTest] Added flowId to messages when logging in TeamCity
format. FlowId is used to distinguish logging from multiple processes
running in parallel.

Change-Id: I7f5046c1058ff02770404caa2c9b3a5398f97f6b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-04 18:48:48 +00:00
Jan Murawski 230c293f20 Fix iOS shared builds
Building iOS shared failed with link errors to the CoreGraphics framework
when building without harfbuzz-ng.
This patch adds the missing dependency.

Change-Id: If464417039172c2854e455563153057f0cea2a22
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
2017-08-04 18:48:37 +00:00
Eirik Aavitsland 51edf8a2b2 Fix compilation of manual lance test
Commit 32a94e54 changed the API of the QPS engine (PaintCommands
class). Update the usage accordingly.

Change-Id: Ide57609e636dad0aa434d1049b600b72f731bc30
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2017-08-04 18:48:29 +00:00
Giuseppe D'Angelo 37af667771 XCB GLX: request OpenGL 4.6 / OpenGL ES 3.2 if possible
Code was lagging a bit behind published standards.

Change-Id: I0fe07c0162a54d9eed8b539887496b9313b37aa4
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
2017-08-04 18:48:16 +00:00
Romain Pokrzywka 02b0f44fab Fix race condition in QDBusAbstractInterfacePrivate::initOwnerTracking()
The current code fetches currentOwner in the constructor, then sets up
a connection between a service watcher and _q_serviceOwnerChanged() in
initOwnerTracking(). But an owner change notification could arrive
after we fetch the current owner and before the connection is made.
In this case the owner change notification will be lost, and the
interface will keep reporting being invalid permanently.

The fix is to delay initializing currentOwner until after the connection
is made.

Task-number: QTBUG-62284
Change-Id: I92b9d61004e14fd2ee2543488740a542dc7a9b7a
Reviewed-by: Romain Pokrzywka <romain.pokrzywka@gmail.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-04 18:47:55 +00:00
Thiago Macieira b22b514140 Bump minimum glibc requirement for sys/eventfd.h to glibc 2.8
The file was added to glibc 2.7 along with the functions we need (Added
2007-10-05). But they forgot to install the file until a month and a
half later (2007-11-17), which means it missed the 2.7 release
(2007-10-19).

Note that EFD_CLOEXEC wasn't added until glibc 2.9, so effectively glibc
2.9 is required.

Change-Id: I3868166e5efc45538544fffd14d773ba576fb793
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
2017-08-04 17:56:34 +00:00
Jake Petroules 8615445835 Fix build error with macOS 10.13 SDK
Several of these variables/macros are no longer defined. We didn't
validate the preconditions on iOS, tvOS, or watchOS, so no
need to bother validating them on macOS either. Nor did we check the
OSStatus result on any platform anyways.

Task-number: QTBUG-62266
Change-Id: Id19ebead5d3a8a08a0a56d798f0173d0d893fc91
Reviewed-by: Tony Sarajärvi <tony.sarajarvi@qt.io>
2017-08-04 17:55:48 +00:00
Thiago Macieira 88c30618d5 QFileSystemEngine::renameFile: use calls that don't overwrite
The renameat2(2) Linux system call, new in 3.16, allows for the atomic
renaming of a file if and only if it won't clobber an existing
file. None of the Linux libcs have enabled this syscall as an API, so we
use syscall(3) to place the call.

If your libc has SYS_renameat2 but your kernel doesn't support it, we'll
keep issuing the unknown syscall, every time. Users in that situation
should upgrade (3.16 is from 2014).

On Darwin, there's a similar renameatx_np (guessing "np" stands for
"non-portable"). I haven't found anything similar on the other BSDs.

Change-Id: I1eba2b016de74620bfc8fffd14ccb4e455a3ec9e
Reviewed-by: David Faure <david.faure@kdab.com>
2017-08-04 17:30:33 +00:00
Thiago Macieira 4934138be2 Allow QSettings to synchronize non-atomically
This is required so that one can use QSettings in situations that
temporary files or renaming may not work.

[ChangeLog][QtCore][QSettings] Added setAtomicSyncRequired(), which
allows one to use QSettings with config files in unwriteable directories
or in Alternate Data Streams on NTFS on Windows. This used to work
before Qt 5.4, but remains a non-default behavior due to the potential
of data corruption.

Task-number: QTBUG-47379
Change-Id: I81480fdb578d4d43b3fcfffd14d4f77112f0402f
Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
2017-08-04 17:30:16 +00:00
Thiago Macieira 66500b9d75 Support Alternate Data Streams in QSaveFile
We can't use MoveFile to do atomic commits on an ADS, so QSaveFile needs
to detect when the target name is ADS and then use the direct fallback
mode.

[ChangeLog][QtCore][QSaveFile] Saving to Alternate Data Streams on NTFS
on Windows is now possible, but requires setDirectWriteFallback(true).

Task-number: QTBUG-47379
Change-Id: I81480fdb578d4d43b3fcfffd14d4bc062ae1750d
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2017-08-04 17:30:13 +00:00
Thiago Macieira 9a3ce25f98 QTemporaryFileName: use the random data more wisely
First, instead of getting 32 bits of random for every character, we can
get reasonable randomness with just 10 bits, so we can replace 3
characters per get32() call. A typical template with six X will only
need 64 bits of random data.

Second, using the PID is not random at all. The reason why mktemp used
to use it is irrelevant (probably because applications failed to seed
rand()). Either way, we don't need nor want the PID anymore. And because
the code is completely rewritten, the UCB copyright no longer applies.

Change-Id: I84e45059a888497fb55ffffd14d2d4cfe159abca
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-04 17:30:10 +00:00
Thiago Macieira a06fb55dcb QFile::rename: use QTemporaryFileName instead of QTemporaryFile
This means the workaround for Linux's behavior now works even if
QTemporaryFile is disabled. We also avoid the creation of an otherwise
unused temporary file just so we can take its name.

Tested with tests/manual/filetest. Strace shows:
 renameat2(AT_FDCWD, "a", AT_FDCWD, "/var/run/media/tjmaciei/B852-6088/a.EBG705", RENAME_NOREPLACE) = 0
 renameat2(AT_FDCWD, "/var/run/media/tjmaciei/B852-6088/a.EBG705", AT_FDCWD, "A", RENAME_NOREPLACE) = 0

Before it was:
 open("/var/run/media/tjmaciei/B852-6088/a.VuL412", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0600) = 4
 fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
 lseek(4, 0, SEEK_SET)                   = 0
 rename("a", "/var/run/media/tjmaciei/B852-6088/a.VuL412") = 0
 stat("A", 0x7fff13260f00)               = -1 ENOENT (No such file or directory)
 close(4)                                = 0
 renameat2(AT_FDCWD, "/var/run/media/tjmaciei/B852-6088/a.VuL412", AT_FDCWD, "A", RENAME_NOREPLACE) = 0

(the absolute path comes from fd61059d35
and it seems it was needed for Symbian)

Change-Id: I1eba2b016de74620bfc8fffd14ccc7c4ded009c8
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2017-08-04 17:30:07 +00:00
Thiago Macieira 3d6cbe3409 Long live QTemporaryFileName!
So we can use it in QTemporaryFile, QTemporaryDir and QFile::rename()

[ChangeLog][QtCore][QTemporaryDir] The class now supports the "XXXXXX"
replacement token anywhere in the template, not just at the end. This
behavior is similar to what QTemporaryFile supports.

Change-Id: I1eba2b016de74620bfc8fffd14ccb645729de170
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-04 17:30:03 +00:00
Thiago Macieira 3981a1f440 QTemporaryFile: split the template parsing and generation
This makes the code more reusable by the unnamed file feature.

This commit removes the backwards compatibility in using sequential file
names if the first one failed. Since 5483b30868,
there are at least three random characters, so the chance of collision
is 1 in 52³ = 140608.

That commit also did not take a system failure into account. If we ended
up getting EEXIST for all attempts, we'd attempt on average 26³*53³ file
creations. For that reason, I've added an upper limit in the number of
attempts to create a file.

Change-Id: I1eba2b016de74620bfc8fffd14cc7e31c6e50558
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2017-08-04 17:30:01 +00:00
Thiago Macieira 3766265602 QTemporaryFile: give the engine access to the template name
Instead of storing it in d->fileEntry. The QFSFileEngine methods may try
to use it before the file entry is filled with the actual file name and
that's no good. This change is using a reference to avoid keeping an
extra QString reference and to avoid going out of sync.

Change-Id: I1eba2b016de74620bfc8fffd14cca9e340e4b1e2
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
2017-08-04 17:29:57 +00:00