QT_BEGIN_NAMESPACE #if defined(Q_OS_DARWIN) static inline bool hasResourcePropertyFlag(const QFileSystemMetaData &data, const QFileSystemEntry &entry, CFStringRef key) { QCFString path = CFStringCreateWithFileSystemRepresentation(0, entry.nativeFilePath().constData()); if (!path) return false; QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0, path, kCFURLPOSIXPathStyle, data.hasFlags(QFileSystemMetaData::DirectoryType)); if (!url) return false; CFBooleanRef value; if (CFURLCopyResourcePropertyForKey(url, key, &value, NULL)) { if (value == kCFBooleanTrue) return true; } return false; }
void QStorageInfoPrivate::retrieveLabel() { QCFString path = CFStringCreateWithFileSystemRepresentation(0, QFile::encodeName(rootPath).constData()); if (!path) return; QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0, path, kCFURLPOSIXPathStyle, true); if (!url) return; QCFType<CFURLRef> volumeUrl; if (!CFURLCopyResourcePropertyForKey(url, kCFURLVolumeURLKey, &volumeUrl, NULL)) return; QCFString volumeName; if (!CFURLCopyResourcePropertyForKey(url, kCFURLNameKey, &volumeName, NULL)) return; name = volumeName; }
static CFIndex URLGetFileSize(CFURLRef theURL) { CFNumberRef fileSizeRef = NULL; CFIndex fileSize = 200; if (!CFURLCopyResourcePropertyForKey(theURL, kCFURLFileSizeKey, &fileSizeRef, NULL)) { return fileSize; } fileSize = CFNumberGetValue(fileSizeRef, kCFNumberCFIndexType, &fileSize); CFRelease(fileSizeRef); return fileSize; }
/* * Volume iterator */ #if __unused__ /* remain here just for reference. Should work on 10.7 or later */ static Boolean getVolumeProperty(const char *path, CFStringRef key, void *value) { FskErr err; char *url; CFURLRef urlRef; if ((err = FskMemPtrNew(sizeof("file://") + FskStrLen(path), (FskMemPtr *)&url)) != kFskErrNone) return false; FskStrCopy(url, "file://"); FskStrCat(url, path); urlRef = CFURLCreateWithBytes(NULL, (UInt8 *)url, FskStrLen(url), kCFStringEncodingUTF8, NULL); FskMemPtrDispose(url); return CFURLCopyResourcePropertyForKey(urlRef, key, value, NULL); }
void parseQuarantineFile(QueryData &results, const std::string &path) { CFURLRef url = CFURLCreateFromFileSystemRepresentation( kCFAllocatorDefault, (const UInt8 *)path.c_str(), path.length(), false); if (url == nullptr) { VLOG(1) << "Error obtaining CFURLRef for " << path; VLOG(1) << "Unable to fetch quarantine data"; return; } CFTypeRef quarantine_properties = nullptr; // This is the non-10.10-symbolic version of kCFURLQuarantinePropertiesKey. CFStringRef qp_key = CFSTR("NSURLQuarantinePropertiesKey"); CFURLCopyResourcePropertyForKey(url, qp_key, &quarantine_properties, nullptr); CFRelease(qp_key); if (quarantine_properties == nullptr) { VLOG(1) << "Error retrieving quarantine properties for " << path; CFRelease(url); return; } CFTypeRef property = nullptr; for (const auto &kv : kQuarantineKeys) { CFStringRef key = CFStringCreateWithCString( kCFAllocatorDefault, kv.second.c_str(), kCFStringEncodingUTF8); if (key != nullptr) { if (CFDictionaryGetValueIfPresent( (CFDictionaryRef)quarantine_properties, key, &property)) { extractQuarantineProperty(kv.first, property, path, results); } CFRelease(key); } } CFRelease(quarantine_properties); CFRelease(url); }
CFDataRef TSystemUtils::ReadDataFromURL ( CFURLRef url ) { CFMutableDataRef data = NULL; Boolean result = false; CFNumberRef fileSizeNumber = NULL; CFIndex fileSize = 0; UInt8 * dataPtr = NULL; UInt8 * endPtr = NULL; CFReadStreamRef readStream = NULL; CFIndex bytesRead = 0; result = CFURLCopyResourcePropertyForKey ( url, kCFURLFileSizeKey, &fileSizeNumber, NULL ); require ( result, ErrorExit ); result = CFNumberGetValue ( fileSizeNumber, kCFNumberCFIndexType, &fileSize ); require ( result, ReleaseNumber ); data = CFDataCreateMutable ( kCFAllocatorDefault, fileSize ); require ( data, ReleaseNumber ); CFDataSetLength ( data, fileSize ); dataPtr = CFDataGetMutableBytePtr ( data ); require ( dataPtr, ReleaseNumber ); readStream = CFReadStreamCreateWithFile ( kCFAllocatorDefault, url ); require ( readStream, ErrorExit ); result = CFReadStreamOpen ( readStream ); require ( result, ReleaseStream ); endPtr = ( UInt8 * ) dataPtr + fileSize; while ( dataPtr < endPtr ) { bytesRead = CFReadStreamRead ( readStream, dataPtr, endPtr - dataPtr ); if ( bytesRead > 0 ) { dataPtr += bytesRead; } } CFReadStreamClose ( readStream ); ReleaseStream: CFRelease ( readStream ); readStream = NULL; ReleaseNumber: CFRelease ( fileSizeNumber ); fileSizeNumber = NULL; ErrorExit: return data; }