QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device, int *accuracyPtr) { // First, glob patterns are evaluated. If there is a match with max weight, // this one is selected and we are done. Otherwise, the file contents are // evaluated and the match with the highest value (either a magic priority or // a glob pattern weight) is selected. Matching starts from max level (most // specific) in both cases, even when there is already a suffix matching candidate. *accuracyPtr = 0; // Pass 1) Try to match on the file name QStringList candidatesByName = mimeTypeForFileName(fileName); if (candidatesByName.count() == 1) { *accuracyPtr = 100; const QMimeType mime = mimeTypeForName(candidatesByName.at(0)); if (mime.isValid()) return mime; candidatesByName.clear(); } // Extension is unknown, or matches multiple mimetypes. // Pass 2) Match on content, if we can read the data if (device->isOpen()) { // Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h). // This is much faster than seeking back and forth into QIODevice. const QByteArray data = device->peek(16384); int magicAccuracy = 0; QMimeType candidateByData(findByData(data, &magicAccuracy)); // Disambiguate conflicting extensions (if magic matching found something) if (candidateByData.isValid() && magicAccuracy > 0) { // "for glob_match in glob_matches:" // "if glob_match is subclass or equal to sniffed_type, use glob_match" const QString sniffedMime = candidateByData.name(); foreach (const QString &m, candidatesByName) { if (inherits(m, sniffedMime)) { // We have magic + pattern pointing to this, so it's a pretty good match *accuracyPtr = 100; return mimeTypeForName(m); } } *accuracyPtr = magicAccuracy; return candidateByData; } } if (candidatesByName.count() > 1) { *accuracyPtr = 20; candidatesByName.sort(); // to make it deterministic const QMimeType mime = mimeTypeForName(candidatesByName.at(0)); if (mime.isValid()) return mime; } return mimeTypeForName(defaultMimeType()); }
/** * Search the link list for a specific element. * \note An O(n) opperation. * * @param llist Ptr to the list to be searched. * @return Index of the element in the list if found, else @c <0. */ listindex_t List_Find(const LinkList *llist, const void *data) { if(llist) { LinkList *list = (LinkList*) llist; return findByData(list, data); } return -1; }