Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/io/qabstractfileengine.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||
2 | ** | - | ||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||
5 | ** | - | ||||||
6 | ** This file is part of the QtCore module of the Qt Toolkit. | - | ||||||
7 | ** | - | ||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||
9 | ** Commercial License Usage | - | ||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||
16 | ** | - | ||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||
24 | ** | - | ||||||
25 | ** GNU General Public License Usage | - | ||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||
35 | ** | - | ||||||
36 | ** $QT_END_LICENSE$ | - | ||||||
37 | ** | - | ||||||
38 | ****************************************************************************/ | - | ||||||
39 | - | |||||||
40 | #include "private/qabstractfileengine_p.h" | - | ||||||
41 | #include "private/qfsfileengine_p.h" | - | ||||||
42 | #ifdef QT_BUILD_CORE_LIB | - | ||||||
43 | #include "private/qresource_p.h" | - | ||||||
44 | #endif | - | ||||||
45 | #include "qdatetime.h" | - | ||||||
46 | #include "qreadwritelock.h" | - | ||||||
47 | #include "qvariant.h" | - | ||||||
48 | // built-in handlers | - | ||||||
49 | #include "qdiriterator.h" | - | ||||||
50 | #include "qstringbuilder.h" | - | ||||||
51 | - | |||||||
52 | #include <QtCore/private/qfilesystementry_p.h> | - | ||||||
53 | #include <QtCore/private/qfilesystemmetadata_p.h> | - | ||||||
54 | #include <QtCore/private/qfilesystemengine_p.h> | - | ||||||
55 | - | |||||||
56 | QT_BEGIN_NAMESPACE | - | ||||||
57 | - | |||||||
58 | /*! | - | ||||||
59 | \class QAbstractFileEngineHandler | - | ||||||
60 | \inmodule QtCore | - | ||||||
61 | \reentrant | - | ||||||
62 | \internal | - | ||||||
63 | - | |||||||
64 | \brief The QAbstractFileEngineHandler class provides a way to register | - | ||||||
65 | custom file engines with your application. | - | ||||||
66 | - | |||||||
67 | \ingroup io | - | ||||||
68 | \since 4.1 | - | ||||||
69 | - | |||||||
70 | QAbstractFileEngineHandler is a factory for creating QAbstractFileEngine | - | ||||||
71 | objects (file engines), which are used internally by QFile, QFileInfo, and | - | ||||||
72 | QDir when working with files and directories. | - | ||||||
73 | - | |||||||
74 | When you open a file, Qt chooses a suitable file engine by passing the | - | ||||||
75 | file name from QFile or QDir through an internal list of registered file | - | ||||||
76 | engine handlers. The first handler to recognize the file name is used to | - | ||||||
77 | create the engine. Qt provides internal file engines for working with | - | ||||||
78 | regular files and resources, but you can also register your own | - | ||||||
79 | QAbstractFileEngine subclasses. | - | ||||||
80 | - | |||||||
81 | To install an application-specific file engine, you subclass | - | ||||||
82 | QAbstractFileEngineHandler and reimplement create(). When you instantiate | - | ||||||
83 | the handler (e.g. by creating an instance on the stack or on the heap), it | - | ||||||
84 | will automatically register with Qt. (The latest registered handler takes | - | ||||||
85 | precedence over existing handlers.) | - | ||||||
86 | - | |||||||
87 | For example: | - | ||||||
88 | - | |||||||
89 | \snippet code/src_corelib_io_qabstractfileengine.cpp 0 | - | ||||||
90 | - | |||||||
91 | When the handler is destroyed, it is automatically removed from Qt. | - | ||||||
92 | - | |||||||
93 | The most common approach to registering a handler is to create an instance | - | ||||||
94 | as part of the start-up phase of your application. It is also possible to | - | ||||||
95 | limit the scope of the file engine handler to a particular area of | - | ||||||
96 | interest (e.g. a special file dialog that needs a custom file engine). By | - | ||||||
97 | creating the handler inside a local scope, you can precisely control the | - | ||||||
98 | area in which your engine will be applied without disturbing file | - | ||||||
99 | operations in other parts of your application. | - | ||||||
100 | - | |||||||
101 | \sa QAbstractFileEngine, QAbstractFileEngine::create() | - | ||||||
102 | */ | - | ||||||
103 | - | |||||||
104 | static bool qt_file_engine_handlers_in_use = false; | - | ||||||
105 | - | |||||||
106 | /* | - | ||||||
107 | All application-wide handlers are stored in this list. The mutex must be | - | ||||||
108 | acquired to ensure thread safety. | - | ||||||
109 | */ | - | ||||||
110 | Q_GLOBAL_STATIC_WITH_ARGS(QReadWriteLock, fileEngineHandlerMutex, (QReadWriteLock::Recursive)) executed 3 times by 3 tests: end of block Executed by:
executed 3 times by 3 tests: guard.store(QtGlobalStatic::Destroyed); Executed by:
executed 120 times by 6 tests: return &holder.value; Executed by:
| 0-120 | ||||||
111 | static bool qt_abstractfileenginehandlerlist_shutDown = false; | - | ||||||
112 | class QAbstractFileEngineHandlerList : public QList<QAbstractFileEngineHandler *> | - | ||||||
113 | { | - | ||||||
114 | public: | - | ||||||
115 | ~QAbstractFileEngineHandlerList() | - | ||||||
116 | { | - | ||||||
117 | QWriteLocker locker(fileEngineHandlerMutex()); | - | ||||||
118 | qt_abstractfileenginehandlerlist_shutDown = true; | - | ||||||
119 | } executed 3 times by 3 tests: end of block Executed by:
| 3 | ||||||
120 | }; | - | ||||||
121 | Q_GLOBAL_STATIC(QAbstractFileEngineHandlerList, fileEngineHandlers) executed 3 times by 3 tests: end of block Executed by:
executed 3 times by 3 tests: guard.store(QtGlobalStatic::Destroyed); Executed by:
executed 117 times by 3 tests: return &holder.value; Executed by:
| 0-117 | ||||||
122 | - | |||||||
123 | /*! | - | ||||||
124 | Constructs a file handler and registers it with Qt. Once created this | - | ||||||
125 | handler's create() function will be called (along with all the other | - | ||||||
126 | handlers) for any paths used. The most recently created handler that | - | ||||||
127 | recognizes the given path (i.e. that returns a QAbstractFileEngine) is | - | ||||||
128 | used for the new path. | - | ||||||
129 | - | |||||||
130 | \sa create() | - | ||||||
131 | */ | - | ||||||
132 | QAbstractFileEngineHandler::QAbstractFileEngineHandler() | - | ||||||
133 | { | - | ||||||
134 | QWriteLocker locker(fileEngineHandlerMutex()); | - | ||||||
135 | qt_file_engine_handlers_in_use = true; | - | ||||||
136 | fileEngineHandlers()->prepend(this); | - | ||||||
137 | } executed 15 times by 3 tests: end of block Executed by:
| 15 | ||||||
138 | - | |||||||
139 | /*! | - | ||||||
140 | Destroys the file handler. This will automatically unregister the handler | - | ||||||
141 | from Qt. | - | ||||||
142 | */ | - | ||||||
143 | QAbstractFileEngineHandler::~QAbstractFileEngineHandler() | - | ||||||
144 | { | - | ||||||
145 | QWriteLocker locker(fileEngineHandlerMutex()); | - | ||||||
146 | // Remove this handler from the handler list only if the list is valid. | - | ||||||
147 | if (!qt_abstractfileenginehandlerlist_shutDown) {
| 0-15 | ||||||
148 | QAbstractFileEngineHandlerList *handlers = fileEngineHandlers(); | - | ||||||
149 | handlers->removeOne(this); | - | ||||||
150 | if (handlers->isEmpty())
| 1-14 | ||||||
151 | qt_file_engine_handlers_in_use = false; executed 14 times by 3 tests: qt_file_engine_handlers_in_use = false; Executed by:
| 14 | ||||||
152 | } executed 15 times by 3 tests: end of block Executed by:
| 15 | ||||||
153 | } executed 15 times by 3 tests: end of block Executed by:
| 15 | ||||||
154 | - | |||||||
155 | /* | - | ||||||
156 | \internal | - | ||||||
157 | - | |||||||
158 | Handles calls to custom file engine handlers. | - | ||||||
159 | */ | - | ||||||
160 | QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path) | - | ||||||
161 | { | - | ||||||
162 | QAbstractFileEngine *engine = 0; | - | ||||||
163 | - | |||||||
164 | if (qt_file_engine_handlers_in_use) {
| 87-305828 | ||||||
165 | QReadLocker locker(fileEngineHandlerMutex()); | - | ||||||
166 | - | |||||||
167 | // check for registered handlers that can load the file | - | ||||||
168 | QAbstractFileEngineHandlerList *handlers = fileEngineHandlers(); | - | ||||||
169 | for (int i = 0; i < handlers->size(); i++) {
| 34-87 | ||||||
170 | if ((engine = handlers->at(i)->create(path)))
| 34-53 | ||||||
171 | break; executed 53 times by 3 tests: break; Executed by:
| 53 | ||||||
172 | } executed 34 times by 2 tests: end of block Executed by:
| 34 | ||||||
173 | } executed 87 times by 3 tests: end of block Executed by:
| 87 | ||||||
174 | - | |||||||
175 | return engine; executed 305915 times by 303 tests: return engine; Executed by:
| 305915 | ||||||
176 | } | - | ||||||
177 | - | |||||||
178 | /*! | - | ||||||
179 | \fn QAbstractFileEngine *QAbstractFileEngineHandler::create(const QString &fileName) const | - | ||||||
180 | - | |||||||
181 | Creates a file engine for file \a fileName. Returns 0 if this | - | ||||||
182 | file handler cannot handle \a fileName. | - | ||||||
183 | - | |||||||
184 | Example: | - | ||||||
185 | - | |||||||
186 | \snippet code/src_corelib_io_qabstractfileengine.cpp 1 | - | ||||||
187 | - | |||||||
188 | \sa QAbstractFileEngine::create() | - | ||||||
189 | */ | - | ||||||
190 | - | |||||||
191 | /*! | - | ||||||
192 | Creates and returns a QAbstractFileEngine suitable for processing \a | - | ||||||
193 | fileName. | - | ||||||
194 | - | |||||||
195 | You should not need to call this function; use QFile, QFileInfo or | - | ||||||
196 | QDir directly instead. | - | ||||||
197 | - | |||||||
198 | If you reimplemnt this function, it should only return file | - | ||||||
199 | engines that knows how to handle \a fileName; otherwise, it should | - | ||||||
200 | return 0. | - | ||||||
201 | - | |||||||
202 | \sa QAbstractFileEngineHandler | - | ||||||
203 | */ | - | ||||||
204 | QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName) | - | ||||||
205 | { | - | ||||||
206 | QFileSystemEntry entry(fileName); | - | ||||||
207 | QFileSystemMetaData metaData; | - | ||||||
208 | QAbstractFileEngine *engine = QFileSystemEngine::resolveEntryAndCreateLegacyEngine(entry, metaData); | - | ||||||
209 | - | |||||||
210 | #ifndef QT_NO_FSFILEENGINE | - | ||||||
211 | if (!engine)
| 14942-47048 | ||||||
212 | // fall back to regular file engine | - | ||||||
213 | return new QFSFileEngine(entry.filePath()); executed 47048 times by 207 tests: return new QFSFileEngine(entry.filePath()); Executed by:
| 47048 | ||||||
214 | #endif | - | ||||||
215 | - | |||||||
216 | return engine; executed 14942 times by 83 tests: return engine; Executed by:
| 14942 | ||||||
217 | } | - | ||||||
218 | - | |||||||
219 | /*! | - | ||||||
220 | \class QAbstractFileEngine | - | ||||||
221 | \inmodule QtCore | - | ||||||
222 | \reentrant | - | ||||||
223 | \internal | - | ||||||
224 | - | |||||||
225 | \brief The QAbstractFileEngine class provides an abstraction for accessing | - | ||||||
226 | the filesystem. | - | ||||||
227 | - | |||||||
228 | \ingroup io | - | ||||||
229 | \since 4.1 | - | ||||||
230 | - | |||||||
231 | The QDir, QFile, and QFileInfo classes all make use of a | - | ||||||
232 | QAbstractFileEngine internally. If you create your own QAbstractFileEngine | - | ||||||
233 | subclass (and register it with Qt by creating a QAbstractFileEngineHandler | - | ||||||
234 | subclass), your file engine will be used when the path is one that your | - | ||||||
235 | file engine handles. | - | ||||||
236 | - | |||||||
237 | A QAbstractFileEngine refers to one file or one directory. If the referent | - | ||||||
238 | is a file, the setFileName(), rename(), and remove() functions are | - | ||||||
239 | applicable. If the referent is a directory the mkdir(), rmdir(), and | - | ||||||
240 | entryList() functions are applicable. In all cases the caseSensitive(), | - | ||||||
241 | isRelativePath(), fileFlags(), ownerId(), owner(), and fileTime() | - | ||||||
242 | functions are applicable. | - | ||||||
243 | - | |||||||
244 | A QAbstractFileEngine subclass can be created to do synchronous network I/O | - | ||||||
245 | based file system operations, local file system operations, or to operate | - | ||||||
246 | as a resource system to access file based resources. | - | ||||||
247 | - | |||||||
248 | \sa QAbstractFileEngineHandler | - | ||||||
249 | */ | - | ||||||
250 | - | |||||||
251 | /*! | - | ||||||
252 | \enum QAbstractFileEngine::FileName | - | ||||||
253 | - | |||||||
254 | These values are used to request a file name in a particular | - | ||||||
255 | format. | - | ||||||
256 | - | |||||||
257 | \value DefaultName The same filename that was passed to the | - | ||||||
258 | QAbstractFileEngine. | - | ||||||
259 | \value BaseName The name of the file excluding the path. | - | ||||||
260 | \value PathName The path to the file excluding the base name. | - | ||||||
261 | \value AbsoluteName The absolute path to the file (including | - | ||||||
262 | the base name). | - | ||||||
263 | \value AbsolutePathName The absolute path to the file (excluding | - | ||||||
264 | the base name). | - | ||||||
265 | \value LinkName The full file name of the file that this file is a | - | ||||||
266 | link to. (This will be empty if this file is not a link.) | - | ||||||
267 | \value CanonicalName Often very similar to LinkName. Will return the true path to the file. | - | ||||||
268 | \value CanonicalPathName Same as CanonicalName, excluding the base name. | - | ||||||
269 | \value BundleName Returns the name of the bundle implies BundleType is set. | - | ||||||
270 | - | |||||||
271 | \omitvalue NFileNames | - | ||||||
272 | - | |||||||
273 | \sa fileName(), setFileName() | - | ||||||
274 | */ | - | ||||||
275 | - | |||||||
276 | /*! | - | ||||||
277 | \enum QAbstractFileEngine::FileFlag | - | ||||||
278 | - | |||||||
279 | The permissions and types of a file, suitable for OR'ing together. | - | ||||||
280 | - | |||||||
281 | \value ReadOwnerPerm The owner of the file has permission to read | - | ||||||
282 | it. | - | ||||||
283 | \value WriteOwnerPerm The owner of the file has permission to | - | ||||||
284 | write to it. | - | ||||||
285 | \value ExeOwnerPerm The owner of the file has permission to | - | ||||||
286 | execute it. | - | ||||||
287 | \value ReadUserPerm The current user has permission to read the | - | ||||||
288 | file. | - | ||||||
289 | \value WriteUserPerm The current user has permission to write to | - | ||||||
290 | the file. | - | ||||||
291 | \value ExeUserPerm The current user has permission to execute the | - | ||||||
292 | file. | - | ||||||
293 | \value ReadGroupPerm Members of the current user's group have | - | ||||||
294 | permission to read the file. | - | ||||||
295 | \value WriteGroupPerm Members of the current user's group have | - | ||||||
296 | permission to write to the file. | - | ||||||
297 | \value ExeGroupPerm Members of the current user's group have | - | ||||||
298 | permission to execute the file. | - | ||||||
299 | \value ReadOtherPerm All users have permission to read the file. | - | ||||||
300 | \value WriteOtherPerm All users have permission to write to the | - | ||||||
301 | file. | - | ||||||
302 | \value ExeOtherPerm All users have permission to execute the file. | - | ||||||
303 | - | |||||||
304 | \value LinkType The file is a link to another file (or link) in | - | ||||||
305 | the file system (i.e. not a file or directory). | - | ||||||
306 | \value FileType The file is a regular file to the file system | - | ||||||
307 | (i.e. not a link or directory) | - | ||||||
308 | \value BundleType \macos and iOS: the file is a bundle; implies DirectoryType | - | ||||||
309 | \value DirectoryType The file is a directory in the file system | - | ||||||
310 | (i.e. not a link or file). | - | ||||||
311 | - | |||||||
312 | \value HiddenFlag The file is hidden. | - | ||||||
313 | \value ExistsFlag The file actually exists in the file system. | - | ||||||
314 | \value RootFlag The file or the file pointed to is the root of the filesystem. | - | ||||||
315 | \value LocalDiskFlag The file resides on the local disk and can be passed to standard file functions. | - | ||||||
316 | \value Refresh Passing this flag will force the file engine to refresh all flags. | - | ||||||
317 | - | |||||||
318 | \omitvalue PermsMask | - | ||||||
319 | \omitvalue TypesMask | - | ||||||
320 | \omitvalue FlagsMask | - | ||||||
321 | \omitvalue FileInfoAll | - | ||||||
322 | - | |||||||
323 | \sa fileFlags(), setFileName() | - | ||||||
324 | */ | - | ||||||
325 | - | |||||||
326 | /*! | - | ||||||
327 | \enum QAbstractFileEngine::FileTime | - | ||||||
328 | - | |||||||
329 | These are used by the fileTime() function. | - | ||||||
330 | - | |||||||
331 | \value CreationTime When the file was created. | - | ||||||
332 | \value ModificationTime When the file was most recently modified. | - | ||||||
333 | \value AccessTime When the file was most recently accessed (e.g. | - | ||||||
334 | read or written to). | - | ||||||
335 | - | |||||||
336 | \sa setFileName() | - | ||||||
337 | */ | - | ||||||
338 | - | |||||||
339 | /*! | - | ||||||
340 | \enum QAbstractFileEngine::FileOwner | - | ||||||
341 | - | |||||||
342 | \value OwnerUser The user who owns the file. | - | ||||||
343 | \value OwnerGroup The group who owns the file. | - | ||||||
344 | - | |||||||
345 | \sa owner(), ownerId(), setFileName() | - | ||||||
346 | */ | - | ||||||
347 | - | |||||||
348 | /*! | - | ||||||
349 | Constructs a new QAbstractFileEngine that does not refer to any file or directory. | - | ||||||
350 | - | |||||||
351 | \sa setFileName() | - | ||||||
352 | */ | - | ||||||
353 | QAbstractFileEngine::QAbstractFileEngine() : d_ptr(new QAbstractFileEnginePrivate) | - | ||||||
354 | { | - | ||||||
355 | d_ptr->q_ptr = this; | - | ||||||
356 | } executed 18 times by 2 tests: end of block Executed by:
| 18 | ||||||
357 | - | |||||||
358 | /*! | - | ||||||
359 | \internal | - | ||||||
360 | - | |||||||
361 | Constructs a QAbstractFileEngine. | - | ||||||
362 | */ | - | ||||||
363 | QAbstractFileEngine::QAbstractFileEngine(QAbstractFileEnginePrivate &dd) : d_ptr(&dd) | - | ||||||
364 | { | - | ||||||
365 | d_ptr->q_ptr = this; | - | ||||||
366 | } executed 98631 times by 217 tests: end of block Executed by:
| 98631 | ||||||
367 | - | |||||||
368 | /*! | - | ||||||
369 | Destroys the QAbstractFileEngine. | - | ||||||
370 | */ | - | ||||||
371 | QAbstractFileEngine::~QAbstractFileEngine() | - | ||||||
372 | { | - | ||||||
373 | } | - | ||||||
374 | - | |||||||
375 | /*! | - | ||||||
376 | \fn bool QAbstractFileEngine::open(QIODevice::OpenMode mode) | - | ||||||
377 | - | |||||||
378 | Opens the file in the specified \a mode. Returns \c true if the file | - | ||||||
379 | was successfully opened; otherwise returns \c false. | - | ||||||
380 | - | |||||||
381 | The \a mode is an OR combination of QIODevice::OpenMode and | - | ||||||
382 | QIODevice::HandlingMode values. | - | ||||||
383 | */ | - | ||||||
384 | bool QAbstractFileEngine::open(QIODevice::OpenMode openMode) | - | ||||||
385 | { | - | ||||||
386 | Q_UNUSED(openMode); | - | ||||||
387 | return false; never executed: return false; | 0 | ||||||
388 | } | - | ||||||
389 | - | |||||||
390 | /*! | - | ||||||
391 | Closes the file, returning true if successful; otherwise returns \c false. | - | ||||||
392 | - | |||||||
393 | The default implementation always returns \c false. | - | ||||||
394 | */ | - | ||||||
395 | bool QAbstractFileEngine::close() | - | ||||||
396 | { | - | ||||||
397 | return false; never executed: return false; | 0 | ||||||
398 | } | - | ||||||
399 | - | |||||||
400 | /*! | - | ||||||
401 | \since 5.1 | - | ||||||
402 | - | |||||||
403 | Flushes and syncs the file to disk. | - | ||||||
404 | - | |||||||
405 | Returns \c true if successful; otherwise returns \c false. | - | ||||||
406 | The default implementation always returns \c false. | - | ||||||
407 | */ | - | ||||||
408 | bool QAbstractFileEngine::syncToDisk() | - | ||||||
409 | { | - | ||||||
410 | return false; never executed: return false; | 0 | ||||||
411 | } | - | ||||||
412 | - | |||||||
413 | /*! | - | ||||||
414 | Flushes the open file, returning true if successful; otherwise returns | - | ||||||
415 | false. | - | ||||||
416 | - | |||||||
417 | The default implementation always returns \c false. | - | ||||||
418 | */ | - | ||||||
419 | bool QAbstractFileEngine::flush() | - | ||||||
420 | { | - | ||||||
421 | return false; never executed: return false; | 0 | ||||||
422 | } | - | ||||||
423 | - | |||||||
424 | /*! | - | ||||||
425 | Returns the size of the file. | - | ||||||
426 | */ | - | ||||||
427 | qint64 QAbstractFileEngine::size() const | - | ||||||
428 | { | - | ||||||
429 | return 0; never executed: return 0; | 0 | ||||||
430 | } | - | ||||||
431 | - | |||||||
432 | /*! | - | ||||||
433 | Returns the current file position. | - | ||||||
434 | - | |||||||
435 | This is the position of the data read/write head of the file. | - | ||||||
436 | */ | - | ||||||
437 | qint64 QAbstractFileEngine::pos() const | - | ||||||
438 | { | - | ||||||
439 | return 0; never executed: return 0; | 0 | ||||||
440 | } | - | ||||||
441 | - | |||||||
442 | /*! | - | ||||||
443 | \fn bool QAbstractFileEngine::seek(qint64 offset) | - | ||||||
444 | - | |||||||
445 | Sets the file position to the given \a offset. Returns \c true if | - | ||||||
446 | the position was successfully set; otherwise returns \c false. | - | ||||||
447 | - | |||||||
448 | The offset is from the beginning of the file, unless the | - | ||||||
449 | file is sequential. | - | ||||||
450 | - | |||||||
451 | \sa isSequential() | - | ||||||
452 | */ | - | ||||||
453 | bool QAbstractFileEngine::seek(qint64 pos) | - | ||||||
454 | { | - | ||||||
455 | Q_UNUSED(pos); | - | ||||||
456 | return false; never executed: return false; | 0 | ||||||
457 | } | - | ||||||
458 | - | |||||||
459 | /*! | - | ||||||
460 | Returns \c true if the file is a sequential access device; returns | - | ||||||
461 | false if the file is a direct access device. | - | ||||||
462 | - | |||||||
463 | Operations involving size() and seek(int) are not valid on | - | ||||||
464 | sequential devices. | - | ||||||
465 | */ | - | ||||||
466 | bool QAbstractFileEngine::isSequential() const | - | ||||||
467 | { | - | ||||||
468 | return false; executed 13 times by 1 test: return false; Executed by:
| 13 | ||||||
469 | } | - | ||||||
470 | - | |||||||
471 | /*! | - | ||||||
472 | Requests that the file is deleted from the file system. If the | - | ||||||
473 | operation succeeds return true; otherwise return false. | - | ||||||
474 | - | |||||||
475 | This virtual function must be reimplemented by all subclasses. | - | ||||||
476 | - | |||||||
477 | \sa setFileName(), rmdir() | - | ||||||
478 | */ | - | ||||||
479 | bool QAbstractFileEngine::remove() | - | ||||||
480 | { | - | ||||||
481 | return false; never executed: return false; | 0 | ||||||
482 | } | - | ||||||
483 | - | |||||||
484 | /*! | - | ||||||
485 | Copies the contents of this file to a file with the name \a newName. | - | ||||||
486 | Returns \c true on success; otherwise, false is returned. | - | ||||||
487 | */ | - | ||||||
488 | bool QAbstractFileEngine::copy(const QString &newName) | - | ||||||
489 | { | - | ||||||
490 | Q_UNUSED(newName); | - | ||||||
491 | return false; never executed: return false; | 0 | ||||||
492 | } | - | ||||||
493 | - | |||||||
494 | /*! | - | ||||||
495 | Requests that the file be renamed to \a newName in the file | - | ||||||
496 | system. If the operation succeeds return true; otherwise return | - | ||||||
497 | false. | - | ||||||
498 | - | |||||||
499 | This virtual function must be reimplemented by all subclasses. | - | ||||||
500 | - | |||||||
501 | \sa setFileName() | - | ||||||
502 | */ | - | ||||||
503 | bool QAbstractFileEngine::rename(const QString &newName) | - | ||||||
504 | { | - | ||||||
505 | Q_UNUSED(newName); | - | ||||||
506 | return false; never executed: return false; | 0 | ||||||
507 | } | - | ||||||
508 | - | |||||||
509 | /*! | - | ||||||
510 | \since 5.1 | - | ||||||
511 | - | |||||||
512 | Requests that the file be renamed to \a newName in the file | - | ||||||
513 | system. If the new name already exists, it must be overwritten. | - | ||||||
514 | If the operation succeeds, returns \c true; otherwise returns | - | ||||||
515 | false. | - | ||||||
516 | - | |||||||
517 | This virtual function must be reimplemented by all subclasses. | - | ||||||
518 | - | |||||||
519 | \sa setFileName() | - | ||||||
520 | */ | - | ||||||
521 | bool QAbstractFileEngine::renameOverwrite(const QString &newName) | - | ||||||
522 | { | - | ||||||
523 | Q_UNUSED(newName); | - | ||||||
524 | return false; never executed: return false; | 0 | ||||||
525 | } | - | ||||||
526 | - | |||||||
527 | /*! | - | ||||||
528 | Creates a link from the file currently specified by fileName() to | - | ||||||
529 | \a newName. What a link is depends on the underlying filesystem | - | ||||||
530 | (be it a shortcut on Windows or a symbolic link on Unix). Returns | - | ||||||
531 | true if successful; otherwise returns \c false. | - | ||||||
532 | */ | - | ||||||
533 | bool QAbstractFileEngine::link(const QString &newName) | - | ||||||
534 | { | - | ||||||
535 | Q_UNUSED(newName); | - | ||||||
536 | return false; never executed: return false; | 0 | ||||||
537 | } | - | ||||||
538 | - | |||||||
539 | /*! | - | ||||||
540 | Requests that the directory \a dirName be created. If | - | ||||||
541 | \a createParentDirectories is true, then any sub-directories in \a dirName | - | ||||||
542 | that don't exist must be created. If \a createParentDirectories is false then | - | ||||||
543 | any sub-directories in \a dirName must already exist for the function to | - | ||||||
544 | succeed. If the operation succeeds return true; otherwise return | - | ||||||
545 | false. | - | ||||||
546 | - | |||||||
547 | This virtual function must be reimplemented by all subclasses. | - | ||||||
548 | - | |||||||
549 | \sa setFileName(), rmdir(), isRelativePath() | - | ||||||
550 | */ | - | ||||||
551 | bool QAbstractFileEngine::mkdir(const QString &dirName, bool createParentDirectories) const | - | ||||||
552 | { | - | ||||||
553 | Q_UNUSED(dirName); | - | ||||||
554 | Q_UNUSED(createParentDirectories); | - | ||||||
555 | return false; never executed: return false; | 0 | ||||||
556 | } | - | ||||||
557 | - | |||||||
558 | /*! | - | ||||||
559 | Requests that the directory \a dirName is deleted from the file | - | ||||||
560 | system. When \a recurseParentDirectories is true, then any empty | - | ||||||
561 | parent-directories in \a dirName must also be deleted. If | - | ||||||
562 | \a recurseParentDirectories is false, only the \a dirName leaf-node | - | ||||||
563 | should be deleted. In most file systems a directory cannot be deleted | - | ||||||
564 | using this function if it is non-empty. If the operation succeeds | - | ||||||
565 | return true; otherwise return false. | - | ||||||
566 | - | |||||||
567 | This virtual function must be reimplemented by all subclasses. | - | ||||||
568 | - | |||||||
569 | \sa setFileName(), remove(), mkdir(), isRelativePath() | - | ||||||
570 | */ | - | ||||||
571 | bool QAbstractFileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const | - | ||||||
572 | { | - | ||||||
573 | Q_UNUSED(dirName); | - | ||||||
574 | Q_UNUSED(recurseParentDirectories); | - | ||||||
575 | return false; never executed: return false; | 0 | ||||||
576 | } | - | ||||||
577 | - | |||||||
578 | /*! | - | ||||||
579 | Requests that the file be set to size \a size. If \a size is larger | - | ||||||
580 | than the current file then it is filled with 0's, if smaller it is | - | ||||||
581 | simply truncated. If the operations succceeds return true; otherwise | - | ||||||
582 | return false; | - | ||||||
583 | - | |||||||
584 | This virtual function must be reimplemented by all subclasses. | - | ||||||
585 | - | |||||||
586 | \sa size() | - | ||||||
587 | */ | - | ||||||
588 | bool QAbstractFileEngine::setSize(qint64 size) | - | ||||||
589 | { | - | ||||||
590 | Q_UNUSED(size); | - | ||||||
591 | return false; never executed: return false; | 0 | ||||||
592 | } | - | ||||||
593 | - | |||||||
594 | /*! | - | ||||||
595 | Should return true if the underlying file system is case-sensitive; | - | ||||||
596 | otherwise return false. | - | ||||||
597 | - | |||||||
598 | This virtual function must be reimplemented by all subclasses. | - | ||||||
599 | */ | - | ||||||
600 | bool QAbstractFileEngine::caseSensitive() const | - | ||||||
601 | { | - | ||||||
602 | return false; never executed: return false; | 0 | ||||||
603 | } | - | ||||||
604 | - | |||||||
605 | /*! | - | ||||||
606 | Return true if the file referred to by this file engine has a | - | ||||||
607 | relative path; otherwise return false. | - | ||||||
608 | - | |||||||
609 | This virtual function must be reimplemented by all subclasses. | - | ||||||
610 | - | |||||||
611 | \sa setFileName() | - | ||||||
612 | */ | - | ||||||
613 | bool QAbstractFileEngine::isRelativePath() const | - | ||||||
614 | { | - | ||||||
615 | return false; never executed: return false; | 0 | ||||||
616 | } | - | ||||||
617 | - | |||||||
618 | /*! | - | ||||||
619 | Requests that a list of all the files matching the \a filters | - | ||||||
620 | list based on the \a filterNames in the file engine's directory | - | ||||||
621 | are returned. | - | ||||||
622 | - | |||||||
623 | Should return an empty list if the file engine refers to a file | - | ||||||
624 | rather than a directory, or if the directory is unreadable or does | - | ||||||
625 | not exist or if nothing matches the specifications. | - | ||||||
626 | - | |||||||
627 | This virtual function must be reimplemented by all subclasses. | - | ||||||
628 | - | |||||||
629 | \sa setFileName() | - | ||||||
630 | */ | - | ||||||
631 | QStringList QAbstractFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const | - | ||||||
632 | { | - | ||||||
633 | QStringList ret; | - | ||||||
634 | QDirIterator it(fileName(), filterNames, filters); | - | ||||||
635 | while (it.hasNext()) {
| 0 | ||||||
636 | it.next(); | - | ||||||
637 | ret << it.fileName(); | - | ||||||
638 | } never executed: end of block | 0 | ||||||
639 | return ret; never executed: return ret; | 0 | ||||||
640 | } | - | ||||||
641 | - | |||||||
642 | /*! | - | ||||||
643 | This function should return the set of OR'd flags that are true | - | ||||||
644 | for the file engine's file, and that are in the \a type's OR'd | - | ||||||
645 | members. | - | ||||||
646 | - | |||||||
647 | In your reimplementation you can use the \a type argument as an | - | ||||||
648 | optimization hint and only return the OR'd set of members that are | - | ||||||
649 | true and that match those in \a type; in other words you can | - | ||||||
650 | ignore any members not mentioned in \a type, thus avoiding some | - | ||||||
651 | potentially expensive lookups or system calls. | - | ||||||
652 | - | |||||||
653 | This virtual function must be reimplemented by all subclasses. | - | ||||||
654 | - | |||||||
655 | \sa setFileName() | - | ||||||
656 | */ | - | ||||||
657 | QAbstractFileEngine::FileFlags QAbstractFileEngine::fileFlags(FileFlags type) const | - | ||||||
658 | { | - | ||||||
659 | Q_UNUSED(type); | - | ||||||
660 | return 0; never executed: return 0; | 0 | ||||||
661 | } | - | ||||||
662 | - | |||||||
663 | /*! | - | ||||||
664 | Requests that the file's permissions be set to \a perms. The argument | - | ||||||
665 | perms will be set to the OR-ed together combination of | - | ||||||
666 | QAbstractFileEngine::FileInfo, with only the QAbstractFileEngine::PermsMask being | - | ||||||
667 | honored. If the operations succceeds return true; otherwise return | - | ||||||
668 | false; | - | ||||||
669 | - | |||||||
670 | This virtual function must be reimplemented by all subclasses. | - | ||||||
671 | - | |||||||
672 | \sa size() | - | ||||||
673 | */ | - | ||||||
674 | bool QAbstractFileEngine::setPermissions(uint perms) | - | ||||||
675 | { | - | ||||||
676 | Q_UNUSED(perms); | - | ||||||
677 | return false; never executed: return false; | 0 | ||||||
678 | } | - | ||||||
679 | - | |||||||
680 | /*! | - | ||||||
681 | Return the file engine's current file name in the format | - | ||||||
682 | specified by \a file. | - | ||||||
683 | - | |||||||
684 | If you don't handle some \c FileName possibilities, return the | - | ||||||
685 | file name set in setFileName() when an unhandled format is | - | ||||||
686 | requested. | - | ||||||
687 | - | |||||||
688 | This virtual function must be reimplemented by all subclasses. | - | ||||||
689 | - | |||||||
690 | \sa setFileName(), FileName | - | ||||||
691 | */ | - | ||||||
692 | QString QAbstractFileEngine::fileName(FileName file) const | - | ||||||
693 | { | - | ||||||
694 | Q_UNUSED(file); | - | ||||||
695 | return QString(); never executed: return QString(); | 0 | ||||||
696 | } | - | ||||||
697 | - | |||||||
698 | /*! | - | ||||||
699 | If \a owner is \c OwnerUser return the ID of the user who owns | - | ||||||
700 | the file. If \a owner is \c OwnerGroup return the ID of the group | - | ||||||
701 | that own the file. If you can't determine the owner return -2. | - | ||||||
702 | - | |||||||
703 | This virtual function must be reimplemented by all subclasses. | - | ||||||
704 | - | |||||||
705 | \sa owner(), setFileName(), FileOwner | - | ||||||
706 | */ | - | ||||||
707 | uint QAbstractFileEngine::ownerId(FileOwner owner) const | - | ||||||
708 | { | - | ||||||
709 | Q_UNUSED(owner); | - | ||||||
710 | return 0; never executed: return 0; | 0 | ||||||
711 | } | - | ||||||
712 | - | |||||||
713 | /*! | - | ||||||
714 | If \a owner is \c OwnerUser return the name of the user who owns | - | ||||||
715 | the file. If \a owner is \c OwnerGroup return the name of the group | - | ||||||
716 | that own the file. If you can't determine the owner return | - | ||||||
717 | QString(). | - | ||||||
718 | - | |||||||
719 | This virtual function must be reimplemented by all subclasses. | - | ||||||
720 | - | |||||||
721 | \sa ownerId(), setFileName(), FileOwner | - | ||||||
722 | */ | - | ||||||
723 | QString QAbstractFileEngine::owner(FileOwner owner) const | - | ||||||
724 | { | - | ||||||
725 | Q_UNUSED(owner); | - | ||||||
726 | return QString(); never executed: return QString(); | 0 | ||||||
727 | } | - | ||||||
728 | - | |||||||
729 | /*! | - | ||||||
730 | If \a time is \c CreationTime, return when the file was created. | - | ||||||
731 | If \a time is \c ModificationTime, return when the file was most | - | ||||||
732 | recently modified. If \a time is \c AccessTime, return when the | - | ||||||
733 | file was most recently accessed (e.g. read or written). | - | ||||||
734 | If the time cannot be determined return QDateTime() (an invalid | - | ||||||
735 | date time). | - | ||||||
736 | - | |||||||
737 | This virtual function must be reimplemented by all subclasses. | - | ||||||
738 | - | |||||||
739 | \sa setFileName(), QDateTime, QDateTime::isValid(), FileTime | - | ||||||
740 | */ | - | ||||||
741 | QDateTime QAbstractFileEngine::fileTime(FileTime time) const | - | ||||||
742 | { | - | ||||||
743 | Q_UNUSED(time); | - | ||||||
744 | return QDateTime(); never executed: return QDateTime(); | 0 | ||||||
745 | } | - | ||||||
746 | - | |||||||
747 | /*! | - | ||||||
748 | Sets the file engine's file name to \a file. This file name is the | - | ||||||
749 | file that the rest of the virtual functions will operate on. | - | ||||||
750 | - | |||||||
751 | This virtual function must be reimplemented by all subclasses. | - | ||||||
752 | - | |||||||
753 | \sa rename() | - | ||||||
754 | */ | - | ||||||
755 | void QAbstractFileEngine::setFileName(const QString &file) | - | ||||||
756 | { | - | ||||||
757 | Q_UNUSED(file); | - | ||||||
758 | } never executed: end of block | 0 | ||||||
759 | - | |||||||
760 | /*! | - | ||||||
761 | Returns the native file handle for this file engine. This handle must be | - | ||||||
762 | used with care; its value and type are platform specific, and using it | - | ||||||
763 | will most likely lead to non-portable code. | - | ||||||
764 | */ | - | ||||||
765 | int QAbstractFileEngine::handle() const | - | ||||||
766 | { | - | ||||||
767 | return -1; executed 1 time by 1 test: return -1; Executed by:
| 1 | ||||||
768 | } | - | ||||||
769 | - | |||||||
770 | /*! | - | ||||||
771 | \since 4.3 | - | ||||||
772 | - | |||||||
773 | Returns \c true if the current position is at the end of the file; otherwise, | - | ||||||
774 | returns \c false. | - | ||||||
775 | - | |||||||
776 | This function bases its behavior on calling extension() with | - | ||||||
777 | AtEndExtension. If the engine does not support this extension, false is | - | ||||||
778 | returned. | - | ||||||
779 | - | |||||||
780 | \sa extension(), supportsExtension(), QFile::atEnd() | - | ||||||
781 | */ | - | ||||||
782 | bool QAbstractFileEngine::atEnd() const | - | ||||||
783 | { | - | ||||||
784 | return const_cast<QAbstractFileEngine *>(this)->extension(AtEndExtension); never executed: return const_cast<QAbstractFileEngine *>(this)->extension(AtEndExtension); | 0 | ||||||
785 | } | - | ||||||
786 | - | |||||||
787 | /*! | - | ||||||
788 | \since 4.4 | - | ||||||
789 | - | |||||||
790 | Maps \a size bytes of the file into memory starting at \a offset. | - | ||||||
791 | Returns a pointer to the memory if successful; otherwise returns \c false | - | ||||||
792 | if, for example, an error occurs. | - | ||||||
793 | - | |||||||
794 | This function bases its behavior on calling extension() with | - | ||||||
795 | MapExtensionOption. If the engine does not support this extension, 0 is | - | ||||||
796 | returned. | - | ||||||
797 | - | |||||||
798 | \a flags is currently not used, but could be used in the future. | - | ||||||
799 | - | |||||||
800 | \sa unmap(), supportsExtension() | - | ||||||
801 | */ | - | ||||||
802 | - | |||||||
803 | uchar *QAbstractFileEngine::map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags) | - | ||||||
804 | { | - | ||||||
805 | MapExtensionOption option; | - | ||||||
806 | option.offset = offset; | - | ||||||
807 | option.size = size; | - | ||||||
808 | option.flags = flags; | - | ||||||
809 | MapExtensionReturn r; | - | ||||||
810 | if (!extension(MapExtension, &option, &r))
| 24-34366 | ||||||
811 | return 0; executed 24 times by 1 test: return 0; Executed by:
| 24 | ||||||
812 | return r.address; executed 34366 times by 121 tests: return r.address; Executed by:
| 34366 | ||||||
813 | } | - | ||||||
814 | - | |||||||
815 | /*! | - | ||||||
816 | \since 4.4 | - | ||||||
817 | - | |||||||
818 | Unmaps the memory \a address. Returns \c true if the unmap succeeds; otherwise | - | ||||||
819 | returns \c false. | - | ||||||
820 | - | |||||||
821 | This function bases its behavior on calling extension() with | - | ||||||
822 | UnMapExtensionOption. If the engine does not support this extension, false is | - | ||||||
823 | returned. | - | ||||||
824 | - | |||||||
825 | \sa map(), supportsExtension() | - | ||||||
826 | */ | - | ||||||
827 | bool QAbstractFileEngine::unmap(uchar *address) | - | ||||||
828 | { | - | ||||||
829 | UnMapExtensionOption options; | - | ||||||
830 | options.address = address; | - | ||||||
831 | return extension(UnMapExtension, &options); executed 32814 times by 2 tests: return extension(UnMapExtension, &options); Executed by:
| 32814 | ||||||
832 | } | - | ||||||
833 | - | |||||||
834 | /*! | - | ||||||
835 | \since 4.3 | - | ||||||
836 | \class QAbstractFileEngineIterator | - | ||||||
837 | \inmodule QtCore | - | ||||||
838 | \brief The QAbstractFileEngineIterator class provides an iterator | - | ||||||
839 | interface for custom file engines. | - | ||||||
840 | \internal | - | ||||||
841 | - | |||||||
842 | If all you want is to iterate over entries in a directory, see | - | ||||||
843 | QDirIterator instead. This class is only for custom file engine authors. | - | ||||||
844 | - | |||||||
845 | QAbstractFileEngineIterator is a unidirectional single-use virtual | - | ||||||
846 | iterator that plugs into QDirIterator, providing transparent proxy | - | ||||||
847 | iteration for custom file engines. | - | ||||||
848 | - | |||||||
849 | You can subclass QAbstractFileEngineIterator to provide an iterator when | - | ||||||
850 | writing your own file engine. To plug the iterator into your file system, | - | ||||||
851 | you simply return an instance of this subclass from a reimplementation of | - | ||||||
852 | QAbstractFileEngine::beginEntryList(). | - | ||||||
853 | - | |||||||
854 | Example: | - | ||||||
855 | - | |||||||
856 | \snippet code/src_corelib_io_qabstractfileengine.cpp 2 | - | ||||||
857 | - | |||||||
858 | QAbstractFileEngineIterator is associated with a path, name filters, and | - | ||||||
859 | entry filters. The path is the directory that the iterator lists entries | - | ||||||
860 | in. The name filters and entry filters are provided for file engines that | - | ||||||
861 | can optimize directory listing at the iterator level (e.g., network file | - | ||||||
862 | systems that need to minimize network traffic), but they can also be | - | ||||||
863 | ignored by the iterator subclass; QAbstractFileEngineIterator already | - | ||||||
864 | provides the required filtering logics in the matchesFilters() function. | - | ||||||
865 | You can call dirName() to get the directory name, nameFilters() to get a | - | ||||||
866 | stringlist of name filters, and filters() to get the entry filters. | - | ||||||
867 | - | |||||||
868 | The pure virtual function hasNext() returns \c true if the current directory | - | ||||||
869 | has at least one more entry (i.e., the directory name is valid and | - | ||||||
870 | accessible, and we have not reached the end of the entry list), and false | - | ||||||
871 | otherwise. Reimplement next() to seek to the next entry. | - | ||||||
872 | - | |||||||
873 | The pure virtual function currentFileName() returns the name of the | - | ||||||
874 | current entry without advancing the iterator. The currentFilePath() | - | ||||||
875 | function is provided for convenience; it returns the full path of the | - | ||||||
876 | current entry. | - | ||||||
877 | - | |||||||
878 | Here is an example of how to implement an iterator that returns each of | - | ||||||
879 | three fixed entries in sequence. | - | ||||||
880 | - | |||||||
881 | \snippet code/src_corelib_io_qabstractfileengine.cpp 3 | - | ||||||
882 | - | |||||||
883 | Note: QAbstractFileEngineIterator does not deal with QDir::IteratorFlags; | - | ||||||
884 | it simply returns entries for a single directory. | - | ||||||
885 | - | |||||||
886 | \sa QDirIterator | - | ||||||
887 | */ | - | ||||||
888 | - | |||||||
889 | /*! | - | ||||||
890 | \enum QAbstractFileEngineIterator::EntryInfoType | - | ||||||
891 | \internal | - | ||||||
892 | - | |||||||
893 | This enum describes the different types of information that can be | - | ||||||
894 | requested through the QAbstractFileEngineIterator::entryInfo() function. | - | ||||||
895 | */ | - | ||||||
896 | - | |||||||
897 | /*! | - | ||||||
898 | \typedef QAbstractFileEngine::Iterator | - | ||||||
899 | \since 4.3 | - | ||||||
900 | - | |||||||
901 | Synonym for QAbstractFileEngineIterator. | - | ||||||
902 | */ | - | ||||||
903 | - | |||||||
904 | class QAbstractFileEngineIteratorPrivate | - | ||||||
905 | { | - | ||||||
906 | public: | - | ||||||
907 | QString path; | - | ||||||
908 | QDir::Filters filters; | - | ||||||
909 | QStringList nameFilters; | - | ||||||
910 | QFileInfo fileInfo; | - | ||||||
911 | }; | - | ||||||
912 | - | |||||||
913 | /*! | - | ||||||
914 | Constructs a QAbstractFileEngineIterator, using the entry filters \a | - | ||||||
915 | filters, and wildcard name filters \a nameFilters. | - | ||||||
916 | */ | - | ||||||
917 | QAbstractFileEngineIterator::QAbstractFileEngineIterator(QDir::Filters filters, | - | ||||||
918 | const QStringList &nameFilters) | - | ||||||
919 | : d(new QAbstractFileEngineIteratorPrivate) | - | ||||||
920 | { | - | ||||||
921 | d->nameFilters = nameFilters; | - | ||||||
922 | d->filters = filters; | - | ||||||
923 | } executed 176 times by 7 tests: end of block Executed by:
| 176 | ||||||
924 | - | |||||||
925 | /*! | - | ||||||
926 | Destroys the QAbstractFileEngineIterator. | - | ||||||
927 | - | |||||||
928 | \sa QDirIterator | - | ||||||
929 | */ | - | ||||||
930 | QAbstractFileEngineIterator::~QAbstractFileEngineIterator() | - | ||||||
931 | { | - | ||||||
932 | } | - | ||||||
933 | - | |||||||
934 | /*! | - | ||||||
935 | Returns the path for this iterator. QDirIterator is responsible for | - | ||||||
936 | assigning this path; it cannot change during the iterator's lifetime. | - | ||||||
937 | - | |||||||
938 | \sa nameFilters(), filters() | - | ||||||
939 | */ | - | ||||||
940 | QString QAbstractFileEngineIterator::path() const | - | ||||||
941 | { | - | ||||||
942 | return d->path; executed 1210 times by 7 tests: return d->path; Executed by:
| 1210 | ||||||
943 | } | - | ||||||
944 | - | |||||||
945 | /*! | - | ||||||
946 | \internal | - | ||||||
947 | - | |||||||
948 | Sets the iterator path to \a path. This function is called from within | - | ||||||
949 | QDirIterator. | - | ||||||
950 | */ | - | ||||||
951 | void QAbstractFileEngineIterator::setPath(const QString &path) | - | ||||||
952 | { | - | ||||||
953 | d->path = path; | - | ||||||
954 | } executed 176 times by 7 tests: end of block Executed by:
| 176 | ||||||
955 | - | |||||||
956 | /*! | - | ||||||
957 | Returns the name filters for this iterator. | - | ||||||
958 | - | |||||||
959 | \sa QDir::nameFilters(), filters(), path() | - | ||||||
960 | */ | - | ||||||
961 | QStringList QAbstractFileEngineIterator::nameFilters() const | - | ||||||
962 | { | - | ||||||
963 | return d->nameFilters; never executed: return d->nameFilters; | 0 | ||||||
964 | } | - | ||||||
965 | - | |||||||
966 | /*! | - | ||||||
967 | Returns the entry filters for this iterator. | - | ||||||
968 | - | |||||||
969 | \sa QDir::filter(), nameFilters(), path() | - | ||||||
970 | */ | - | ||||||
971 | QDir::Filters QAbstractFileEngineIterator::filters() const | - | ||||||
972 | { | - | ||||||
973 | return d->filters; never executed: return d->filters; | 0 | ||||||
974 | } | - | ||||||
975 | - | |||||||
976 | /*! | - | ||||||
977 | \fn QString QAbstractFileEngineIterator::currentFileName() const = 0 | - | ||||||
978 | - | |||||||
979 | This pure virtual function returns the name of the current directory | - | ||||||
980 | entry, excluding the path. | - | ||||||
981 | - | |||||||
982 | \sa currentFilePath() | - | ||||||
983 | */ | - | ||||||
984 | - | |||||||
985 | /*! | - | ||||||
986 | Returns the path to the current directory entry. It's the same as | - | ||||||
987 | prepending path() to the return value of currentFileName(). | - | ||||||
988 | - | |||||||
989 | \sa currentFileName() | - | ||||||
990 | */ | - | ||||||
991 | QString QAbstractFileEngineIterator::currentFilePath() const | - | ||||||
992 | { | - | ||||||
993 | QString name = currentFileName(); | - | ||||||
994 | if (!name.isNull()) {
| 0-1036 | ||||||
995 | QString tmp = path(); | - | ||||||
996 | if (!tmp.isEmpty()) {
| 0-1036 | ||||||
997 | if (!tmp.endsWith(QLatin1Char('/')))
| 142-894 | ||||||
998 | tmp.append(QLatin1Char('/')); executed 894 times by 7 tests: tmp.append(QLatin1Char('/')); Executed by:
| 894 | ||||||
999 | name.prepend(tmp); | - | ||||||
1000 | } executed 1036 times by 7 tests: end of block Executed by:
| 1036 | ||||||
1001 | } executed 1036 times by 7 tests: end of block Executed by:
| 1036 | ||||||
1002 | return name; executed 1036 times by 7 tests: return name; Executed by:
| 1036 | ||||||
1003 | } | - | ||||||
1004 | - | |||||||
1005 | /*! | - | ||||||
1006 | The virtual function returns a QFileInfo for the current directory | - | ||||||
1007 | entry. This function is provided for convenience. It can also be slightly | - | ||||||
1008 | faster than creating a QFileInfo object yourself, as the object returned | - | ||||||
1009 | by this function might contain cached information that QFileInfo otherwise | - | ||||||
1010 | would have to access through the file engine. | - | ||||||
1011 | - | |||||||
1012 | \sa currentFileName() | - | ||||||
1013 | */ | - | ||||||
1014 | QFileInfo QAbstractFileEngineIterator::currentFileInfo() const | - | ||||||
1015 | { | - | ||||||
1016 | QString path = currentFilePath(); | - | ||||||
1017 | if (d->fileInfo.filePath() != path)
| 0-518 | ||||||
1018 | d->fileInfo.setFile(path); executed 518 times by 7 tests: d->fileInfo.setFile(path); Executed by:
| 518 | ||||||
1019 | - | |||||||
1020 | // return a shallow copy | - | ||||||
1021 | return d->fileInfo; executed 518 times by 7 tests: return d->fileInfo; Executed by:
| 518 | ||||||
1022 | } | - | ||||||
1023 | - | |||||||
1024 | /*! | - | ||||||
1025 | \internal | - | ||||||
1026 | - | |||||||
1027 | Returns the entry info \a type for this iterator's current directory entry | - | ||||||
1028 | as a QVariant. If \a type is undefined for this entry, a null QVariant is | - | ||||||
1029 | returned. | - | ||||||
1030 | - | |||||||
1031 | \sa QAbstractFileEngine::beginEntryList(), QDir::beginEntryList() | - | ||||||
1032 | */ | - | ||||||
1033 | QVariant QAbstractFileEngineIterator::entryInfo(EntryInfoType type) const | - | ||||||
1034 | { | - | ||||||
1035 | Q_UNUSED(type) | - | ||||||
1036 | return QVariant(); never executed: return QVariant(); | 0 | ||||||
1037 | } | - | ||||||
1038 | - | |||||||
1039 | /*! | - | ||||||
1040 | \fn virtual QString QAbstractFileEngineIterator::next() = 0 | - | ||||||
1041 | - | |||||||
1042 | This pure virtual function advances the iterator to the next directory | - | ||||||
1043 | entry, and returns the file path to the current entry. | - | ||||||
1044 | - | |||||||
1045 | This function can optionally make use of nameFilters() and filters() to | - | ||||||
1046 | optimize its performance. | - | ||||||
1047 | - | |||||||
1048 | Reimplement this function in a subclass to advance the iterator. | - | ||||||
1049 | - | |||||||
1050 | \sa QDirIterator::next() | - | ||||||
1051 | */ | - | ||||||
1052 | - | |||||||
1053 | /*! | - | ||||||
1054 | \fn virtual bool QAbstractFileEngineIterator::hasNext() const = 0 | - | ||||||
1055 | - | |||||||
1056 | This pure virtual function returns \c true if there is at least one more | - | ||||||
1057 | entry in the current directory (i.e., the iterator path is valid and | - | ||||||
1058 | accessible, and the iterator has not reached the end of the entry list). | - | ||||||
1059 | - | |||||||
1060 | \sa QDirIterator::hasNext() | - | ||||||
1061 | */ | - | ||||||
1062 | - | |||||||
1063 | /*! | - | ||||||
1064 | Returns an instance of a QAbstractFileEngineIterator using \a filters for | - | ||||||
1065 | entry filtering and \a filterNames for name filtering. This function is | - | ||||||
1066 | called by QDirIterator to initiate directory iteration. | - | ||||||
1067 | - | |||||||
1068 | QDirIterator takes ownership of the returned instance, and deletes it when | - | ||||||
1069 | it's done. | - | ||||||
1070 | - | |||||||
1071 | \sa QDirIterator | - | ||||||
1072 | */ | - | ||||||
1073 | QAbstractFileEngine::Iterator *QAbstractFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) | - | ||||||
1074 | { | - | ||||||
1075 | Q_UNUSED(filters); | - | ||||||
1076 | Q_UNUSED(filterNames); | - | ||||||
1077 | return 0; never executed: return 0; | 0 | ||||||
1078 | } | - | ||||||
1079 | - | |||||||
1080 | /*! | - | ||||||
1081 | \internal | - | ||||||
1082 | */ | - | ||||||
1083 | QAbstractFileEngine::Iterator *QAbstractFileEngine::endEntryList() | - | ||||||
1084 | { | - | ||||||
1085 | return 0; never executed: return 0; | 0 | ||||||
1086 | } | - | ||||||
1087 | - | |||||||
1088 | /*! | - | ||||||
1089 | Reads a number of characters from the file into \a data. At most | - | ||||||
1090 | \a maxlen characters will be read. | - | ||||||
1091 | - | |||||||
1092 | Returns -1 if a fatal error occurs, or 0 if there are no bytes to | - | ||||||
1093 | read. | - | ||||||
1094 | */ | - | ||||||
1095 | qint64 QAbstractFileEngine::read(char *data, qint64 maxlen) | - | ||||||
1096 | { | - | ||||||
1097 | Q_UNUSED(data); | - | ||||||
1098 | Q_UNUSED(maxlen); | - | ||||||
1099 | return -1; never executed: return -1; | 0 | ||||||
1100 | } | - | ||||||
1101 | - | |||||||
1102 | /*! | - | ||||||
1103 | Writes \a len bytes from \a data to the file. Returns the number | - | ||||||
1104 | of characters written on success; otherwise returns -1. | - | ||||||
1105 | */ | - | ||||||
1106 | qint64 QAbstractFileEngine::write(const char *data, qint64 len) | - | ||||||
1107 | { | - | ||||||
1108 | Q_UNUSED(data); | - | ||||||
1109 | Q_UNUSED(len); | - | ||||||
1110 | return -1; never executed: return -1; | 0 | ||||||
1111 | } | - | ||||||
1112 | - | |||||||
1113 | /*! | - | ||||||
1114 | This function reads one line, terminated by a '\\n' character, from the | - | ||||||
1115 | file info \a data. At most \a maxlen characters will be read. The | - | ||||||
1116 | end-of-line character is included. | - | ||||||
1117 | */ | - | ||||||
1118 | qint64 QAbstractFileEngine::readLine(char *data, qint64 maxlen) | - | ||||||
1119 | { | - | ||||||
1120 | qint64 readSoFar = 0; | - | ||||||
1121 | while (readSoFar < maxlen) {
| 0-8 | ||||||
1122 | char c; | - | ||||||
1123 | qint64 readResult = read(&c, 1); | - | ||||||
1124 | if (readResult <= 0)
| 0-8 | ||||||
1125 | return (readSoFar > 0) ? readSoFar : -1; executed 8 times by 1 test: return (readSoFar > 0) ? readSoFar : -1; Executed by:
| 8 | ||||||
1126 | ++readSoFar; | - | ||||||
1127 | *data++ = c; | - | ||||||
1128 | if (c == '\n')
| 0 | ||||||
1129 | return readSoFar; never executed: return readSoFar; | 0 | ||||||
1130 | } never executed: end of block | 0 | ||||||
1131 | return readSoFar; never executed: return readSoFar; | 0 | ||||||
1132 | } | - | ||||||
1133 | - | |||||||
1134 | /*! | - | ||||||
1135 | \enum QAbstractFileEngine::Extension | - | ||||||
1136 | \since 4.3 | - | ||||||
1137 | - | |||||||
1138 | This enum describes the types of extensions that the file engine can | - | ||||||
1139 | support. Before using these extensions, you must verify that the extension | - | ||||||
1140 | is supported (i.e., call supportsExtension()). | - | ||||||
1141 | - | |||||||
1142 | \value AtEndExtension Whether the current file position is at the end of | - | ||||||
1143 | the file or not. This extension allows file engines that implement local | - | ||||||
1144 | buffering to report end-of-file status without having to check the size of | - | ||||||
1145 | the file. It is also useful for sequential files, where the size of the | - | ||||||
1146 | file cannot be used to determine whether or not you have reached the end. | - | ||||||
1147 | This extension returns \c true if the file is at the end; otherwise it returns | - | ||||||
1148 | false. The input and output arguments to extension() are ignored. | - | ||||||
1149 | - | |||||||
1150 | \value FastReadLineExtension Whether the file engine provides a | - | ||||||
1151 | fast implementation for readLine() or not. If readLine() remains | - | ||||||
1152 | unimplemented in the file engine, QAbstractFileEngine will provide | - | ||||||
1153 | an implementation based on calling read() repeatedly. If | - | ||||||
1154 | supportsExtension() returns \c false for this extension, however, | - | ||||||
1155 | QIODevice can provide a faster implementation by making use of its | - | ||||||
1156 | internal buffer. For engines that already provide a fast readLine() | - | ||||||
1157 | implementation, returning false for this extension can avoid | - | ||||||
1158 | unnnecessary double-buffering in QIODevice. | - | ||||||
1159 | - | |||||||
1160 | \value MapExtension Whether the file engine provides the ability to map | - | ||||||
1161 | a file to memory. | - | ||||||
1162 | - | |||||||
1163 | \value UnMapExtension Whether the file engine provides the ability to | - | ||||||
1164 | unmap memory that was previously mapped. | - | ||||||
1165 | */ | - | ||||||
1166 | - | |||||||
1167 | /*! | - | ||||||
1168 | \class QAbstractFileEngine::ExtensionOption | - | ||||||
1169 | \inmodule QtCore | - | ||||||
1170 | \since 4.3 | - | ||||||
1171 | \brief provides an extended input argument to QAbstractFileEngine's | - | ||||||
1172 | extension support. | - | ||||||
1173 | - | |||||||
1174 | \sa QAbstractFileEngine::extension() | - | ||||||
1175 | */ | - | ||||||
1176 | - | |||||||
1177 | /*! | - | ||||||
1178 | \class QAbstractFileEngine::ExtensionReturn | - | ||||||
1179 | \inmodule QtCore | - | ||||||
1180 | \since 4.3 | - | ||||||
1181 | \brief provides an extended output argument to QAbstractFileEngine's | - | ||||||
1182 | extension support. | - | ||||||
1183 | - | |||||||
1184 | \sa QAbstractFileEngine::extension() | - | ||||||
1185 | */ | - | ||||||
1186 | - | |||||||
1187 | /*! | - | ||||||
1188 | \since 4.3 | - | ||||||
1189 | - | |||||||
1190 | This virtual function can be reimplemented in a QAbstractFileEngine | - | ||||||
1191 | subclass to provide support for extensions. The \a option argument is | - | ||||||
1192 | provided as input to the extension, and this function can store output | - | ||||||
1193 | results in \a output. | - | ||||||
1194 | - | |||||||
1195 | The behavior of this function is determined by \a extension; see the | - | ||||||
1196 | Extension documentation for details. | - | ||||||
1197 | - | |||||||
1198 | You can call supportsExtension() to check if an extension is supported by | - | ||||||
1199 | the file engine. | - | ||||||
1200 | - | |||||||
1201 | By default, no extensions are supported, and this function returns \c false. | - | ||||||
1202 | - | |||||||
1203 | \sa supportsExtension(), Extension | - | ||||||
1204 | */ | - | ||||||
1205 | bool QAbstractFileEngine::extension(Extension extension, const ExtensionOption *option, ExtensionReturn *output) | - | ||||||
1206 | { | - | ||||||
1207 | Q_UNUSED(extension); | - | ||||||
1208 | Q_UNUSED(option); | - | ||||||
1209 | Q_UNUSED(output); | - | ||||||
1210 | return false; never executed: return false; | 0 | ||||||
1211 | } | - | ||||||
1212 | - | |||||||
1213 | /*! | - | ||||||
1214 | \since 4.3 | - | ||||||
1215 | - | |||||||
1216 | This virtual function returns \c true if the file engine supports \a | - | ||||||
1217 | extension; otherwise, false is returned. By default, no extensions are | - | ||||||
1218 | supported. | - | ||||||
1219 | - | |||||||
1220 | \sa extension() | - | ||||||
1221 | */ | - | ||||||
1222 | bool QAbstractFileEngine::supportsExtension(Extension extension) const | - | ||||||
1223 | { | - | ||||||
1224 | Q_UNUSED(extension); | - | ||||||
1225 | return false; never executed: return false; | 0 | ||||||
1226 | } | - | ||||||
1227 | - | |||||||
1228 | /*! | - | ||||||
1229 | Returns the QFile::FileError that resulted from the last failed | - | ||||||
1230 | operation. If QFile::UnspecifiedError is returned, QFile will | - | ||||||
1231 | use its own idea of the error status. | - | ||||||
1232 | - | |||||||
1233 | \sa QFile::FileError, errorString() | - | ||||||
1234 | */ | - | ||||||
1235 | QFile::FileError QAbstractFileEngine::error() const | - | ||||||
1236 | { | - | ||||||
1237 | Q_D(const QAbstractFileEngine); | - | ||||||
1238 | return d->fileError; executed 3754 times by 53 tests: return d->fileError; Executed by:
| 3754 | ||||||
1239 | } | - | ||||||
1240 | - | |||||||
1241 | /*! | - | ||||||
1242 | Returns the human-readable message appropriate to the current error | - | ||||||
1243 | reported by error(). If no suitable string is available, an | - | ||||||
1244 | empty string is returned. | - | ||||||
1245 | - | |||||||
1246 | \sa error() | - | ||||||
1247 | */ | - | ||||||
1248 | QString QAbstractFileEngine::errorString() const | - | ||||||
1249 | { | - | ||||||
1250 | Q_D(const QAbstractFileEngine); | - | ||||||
1251 | return d->errorString; executed 4349 times by 63 tests: return d->errorString; Executed by:
| 4349 | ||||||
1252 | } | - | ||||||
1253 | - | |||||||
1254 | /*! | - | ||||||
1255 | Sets the error type to \a error, and the error string to \a errorString. | - | ||||||
1256 | Call this function to set the error values returned by the higher-level | - | ||||||
1257 | classes. | - | ||||||
1258 | - | |||||||
1259 | \sa QFile::error(), QIODevice::errorString(), QIODevice::setErrorString() | - | ||||||
1260 | */ | - | ||||||
1261 | void QAbstractFileEngine::setError(QFile::FileError error, const QString &errorString) | - | ||||||
1262 | { | - | ||||||
1263 | Q_D(QAbstractFileEngine); | - | ||||||
1264 | d->fileError = error; | - | ||||||
1265 | d->errorString = errorString; | - | ||||||
1266 | } executed 6409 times by 71 tests: end of block Executed by:
| 6409 | ||||||
1267 | - | |||||||
1268 | QT_END_NAMESPACE | - | ||||||
Source code | Switch to Preprocessed file |