Changeset View
Changeset View
Standalone View
Standalone View
src/xattr_p.h
Show First 20 Lines • Show All 76 Lines • ▼ Show 20 Line(s) | 71 | #elif defined(Q_OS_WIN) | |||
---|---|---|---|---|---|
77 | 77 | | |||
78 | LARGE_INTEGER lsize; | 78 | LARGE_INTEGER lsize; | ||
79 | lsize.LowPart = GetFileSize(hFile, (DWORD*)&lsize.HighPart); | 79 | lsize.LowPart = GetFileSize(hFile, (DWORD*)&lsize.HighPart); | ||
80 | ssize_t size = (qint64)lsize.QuadPart; | 80 | ssize_t size = (qint64)lsize.QuadPart; | ||
81 | #else | 81 | #else | ||
82 | const ssize_t size = 0; | 82 | const ssize_t size = 0; | ||
83 | #endif | 83 | #endif | ||
84 | 84 | | |||
85 | if (!value) { | ||||
86 | return size; | ||||
87 | } | ||||
88 | | ||||
85 | if (size <= 0) { | 89 | if (size <= 0) { | ||
86 | if (value) { | | |||
87 | value->clear(); | 90 | value->clear(); | ||
88 | } | | |||
89 | return size; | 91 | return size; | ||
90 | } | 92 | } | ||
91 | 93 | | |||
92 | QByteArray data(size, Qt::Uninitialized); | 94 | QByteArray data(size, Qt::Uninitialized); | ||
93 | 95 | | |||
94 | #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) | 96 | #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) | ||
95 | const ssize_t r = getxattr(encodedPath, attributeName, data.data(), size); | 97 | const ssize_t r = getxattr(encodedPath, attributeName, data.data(), size); | ||
96 | #elif defined(Q_OS_MAC) | 98 | #elif defined(Q_OS_MAC) | ||
97 | const ssize_t r = getxattr(encodedPath, attributeName, data.data(), size, 0, 0); | 99 | const ssize_t r = getxattr(encodedPath, attributeName, data.data(), size, 0, 0); | ||
98 | #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) | 100 | #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) | ||
99 | const ssize_t r = extattr_get_file(encodedPath, EXTATTR_NAMESPACE_USER, attributeName, data.data(), size); | 101 | const ssize_t r = extattr_get_file(encodedPath, EXTATTR_NAMESPACE_USER, attributeName, data.data(), size); | ||
100 | #elif defined(Q_OS_WIN) | 102 | #elif defined(Q_OS_WIN) | ||
101 | ssize_t r = 0; | 103 | ssize_t r = 0; | ||
102 | // should we care about attributes longer than 2GiB? - unix xattr are restricted to much lower values | 104 | // should we care about attributes longer than 2GiB? - unix xattr are restricted to much lower values | ||
103 | ::ReadFile(hFile, data.data(), size, (DWORD*)&r, NULL); | 105 | ::ReadFile(hFile, data.data(), size, (DWORD*)&r, NULL); | ||
104 | CloseHandle(hFile); | 106 | CloseHandle(hFile); | ||
105 | #else | 107 | #else | ||
106 | const ssize_t r = 0; | 108 | const ssize_t r = 0; | ||
107 | #endif | 109 | #endif | ||
108 | 110 | | |||
109 | if(value) *value = QString::fromUtf8(data); | 111 | *value = QString::fromUtf8(data); | ||
110 | return r; | 112 | return r; | ||
111 | } | 113 | } | ||
112 | 114 | | |||
113 | inline int k_setxattr(const QString& path, const QString& name, const QString& value) | 115 | inline int k_setxattr(const QString& path, const QString& name, const QString& value) | ||
114 | { | 116 | { | ||
115 | const QByteArray p = QFile::encodeName(path); | 117 | const QByteArray p = QFile::encodeName(path); | ||
116 | const char* encodedPath = p.constData(); | 118 | const char* encodedPath = p.constData(); | ||
117 | 119 | | |||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Line(s) | 212 | if(QString::fromUtf16((ushort*)p->StreamName, p->StreamNameLength / sizeof(ushort)) == streamName) { | |||
213 | return true; | 215 | return true; | ||
214 | } | 216 | } | ||
215 | } while(p->NextEntryOffset != NULL); | 217 | } while(p->NextEntryOffset != NULL); | ||
216 | } | 218 | } | ||
217 | delete[] fi; | 219 | delete[] fi; | ||
218 | CloseHandle(hFile); | 220 | CloseHandle(hFile); | ||
219 | return false; | 221 | return false; | ||
220 | #else | 222 | #else | ||
221 | k_getxattr(path, name, nullptr); | 223 | auto ret = k_getxattr(path, name, nullptr); | ||
222 | return (errno != ENOATTR); | 224 | return (ret >= 0); | ||
223 | #endif | 225 | #endif | ||
224 | } | 226 | } | ||
225 | 227 | | |||
226 | inline bool k_isSupported(const QString& path) | 228 | inline bool k_isSupported(const QString& path) | ||
227 | { | 229 | { | ||
228 | QString value; | | |||
229 | #if defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) | 230 | #if defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) | ||
230 | k_getxattr(path, QStringLiteral("user.test"), &value); | 231 | auto ret = k_getxattr(path, QStringLiteral("user.test"), nullptr); | ||
231 | return (errno != ENOTSUP); | 232 | return (ret >= 0) || (errno != ENOTSUP); | ||
232 | #elif defined(Q_OS_WIN) | 233 | #elif defined(Q_OS_WIN) | ||
233 | QFileInfo f(path); | 234 | QFileInfo f(path); | ||
234 | const QString drive = QString(f.absolutePath().left(2)) + QStringLiteral("\\"); | 235 | const QString drive = QString(f.absolutePath().left(2)) + QStringLiteral("\\"); | ||
235 | WCHAR szFSName[MAX_PATH]; | 236 | WCHAR szFSName[MAX_PATH]; | ||
236 | DWORD dwVolFlags; | 237 | DWORD dwVolFlags; | ||
237 | ::GetVolumeInformationW(reinterpret_cast<const WCHAR*>(drive.utf16()), NULL, 0, NULL, NULL, &dwVolFlags, szFSName, MAX_PATH); | 238 | ::GetVolumeInformationW(reinterpret_cast<const WCHAR*>(drive.utf16()), NULL, 0, NULL, NULL, &dwVolFlags, szFSName, MAX_PATH); | ||
238 | return ((dwVolFlags & FILE_NAMED_STREAMS) && _wcsicmp(szFSName, L"NTFS") == 0); | 239 | return ((dwVolFlags & FILE_NAMED_STREAMS) && _wcsicmp(szFSName, L"NTFS") == 0); | ||
239 | #else | 240 | #else | ||
240 | return false; | 241 | return false; | ||
241 | #endif | 242 | #endif | ||
242 | } | 243 | } | ||
243 | #endif // KFILEMETADATA_XATTR_P_H | 244 | #endif // KFILEMETADATA_XATTR_P_H |