void closeIfNot(int& f) { if (fd != f) { f = fd; QT_CLOSE(fd); } }
static void resetTty(int ttyfd, int oldMode) { ioctl(ttyfd, KDSETMODE, oldMode); // Blankin' screen, blinkin' cursor! const char termctl[] = "\033[9;15]\033[?33h\033[?25h\033[?0c"; QT_WRITE(ttyfd, termctl, sizeof(termctl)); QT_CLOSE(ttyfd); }
/*! Destructs the QFSFileEngine. */ QFSFileEngine::~QFSFileEngine() { Q_D(QFSFileEngine); if (d->closeFileHandle) { if (d->fh) { fclose(d->fh); } else if (d->fd != -1) { QT_CLOSE(d->fd); } } d->unmapAll(); }
void QBluetoothSocketPrivate::abort() { delete readNotifier; readNotifier = 0; delete connectWriteNotifier; connectWriteNotifier = 0; // We don't transition through Closing for abort, so // we don't call disconnectFromService or // QBluetoothSocket::close QT_CLOSE(socket); socket = -1; }
void QLinuxFbScreenPrivate::closeTty() { if (ttyfd == -1) return; if (doGraphicsMode) ioctl(ttyfd, KDSETMODE, oldKdMode); // Blankin' screen, blinkin' cursor! const char termctl[] = "\033[9;15]\033[?33h\033[?25h\033[?0c"; QT_WRITE(ttyfd, termctl, sizeof(termctl)); QT_CLOSE(ttyfd); ttyfd = -1; }
TActionContext::~TActionContext() { if (httpSocket) delete httpSocket; if (socketDesc > 0) QT_CLOSE(socketDesc); for (QListIterator<TTemporaryFile *> i(tempFiles); i.hasNext(); ) { delete i.next(); } for (QStringListIterator i(autoRemoveFiles); i.hasNext(); ) { QFile(i.next()).remove(); } }
QLock::~QLock() { if (locked()) unlock(); #ifdef Q_NO_SEMAPHORE if(isValid()) { QT_CLOSE(data->id); if(data->owned) unlink(data->file); } #else if(data->owned) QWSSignalHandler::instance()->removeSemaphore(data->id); #endif delete data; }
bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) { if (socket != -1) { if (socketType == type) return true; delete readNotifier; readNotifier = 0; delete connectWriteNotifier; connectWriteNotifier = 0; QT_CLOSE(socket); } socketType = type; switch (type) { case QBluetoothServiceInfo::L2capProtocol: socket = ::socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); break; case QBluetoothServiceInfo::RfcommProtocol: socket = ::socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); break; default: socket = -1; } if (socket == -1) return false; int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags | O_NONBLOCK); Q_Q(QBluetoothSocket); readNotifier = new QSocketNotifier(socket, QSocketNotifier::Read); QObject::connect(readNotifier, SIGNAL(activated(int)), this, SLOT(_q_readNotify())); connectWriteNotifier = new QSocketNotifier(socket, QSocketNotifier::Write, q); QObject::connect(connectWriteNotifier, SIGNAL(activated(int)), this, SLOT(_q_writeNotify())); connectWriteNotifier->setEnabled(false); readNotifier->setEnabled(false); return true; }
/*! \internal */ bool QFSFileEnginePrivate::closeFdFh() { Q_Q(QFSFileEngine); if (fd == -1 && !fh ) return false; // Flush the file if it's buffered, and if the last flush didn't fail. bool flushed = !fh || (!lastFlushFailed && q->flush()); bool closed = true; tried_stat = 0; // Close the file if we created the handle. if (closeFileHandle) { int ret; do { if (fh) { // Close buffered file. ret = fclose(fh) != 0 ? -1 : 0; } else { // Close unbuffered file. ret = QT_CLOSE(fd); } } while (ret == -1 && errno == EINTR); // We must reset these guys regardless; calling close again after a // failed close causes crashes on some systems. fh = 0; fd = -1; closed = (ret == 0); } // Report errors. if (!flushed || !closed) { if (flushed) { // If not flushed, we want the flush error to fall through. q->setError(QFile::UnspecifiedError, qt_error_string(errno)); } return false; } return true; }
/*! Destructs the QFSFileEngine. */ QFSFileEngine::~QFSFileEngine() { Q_D(QFSFileEngine); if (d->closeFileHandle) { if (d->fh) { int ret; do { ret = fclose(d->fh); } while (ret == EOF && errno == EINTR); } else if (d->fd != -1) { int ret; do { ret = QT_CLOSE(d->fd); } while (ret == -1 && errno == EINTR); } } QList<uchar*> keys = d->maps.keys(); for (int i = 0; i < keys.count(); ++i) unmap(keys.at(i)); }
/*! Destroys a lock */ QLock::~QLock() { #ifndef QT_NO_QWS_SIGNALHANDLER QWSSignalHandler::instance()->removeLock(this); #endif while (locked()) unlock(); #if defined(QT_NO_SEMAPHORE) if (isValid()) QT_CLOSE(data->id); #elif defined(QT_POSIX_IPC) if (data->id != SEM_FAILED) sem_close(data->id); if (data->rsem != SEM_FAILED) sem_close(data->rsem); if (data->wsem != SEM_FAILED) sem_close(data->wsem); #endif if (data->owned) { #if defined(QT_NO_SEMAPHORE) unlink(data->file.constData()); #elif !defined(QT_POSIX_IPC) qt_semun semval; semval.val = 0; semctl(data->id, 0, IPC_RMID, semval); #else char ids[3] = { 'c', 'r', 'w' }; for (int i = 0; i < 3; ++i) { QByteArray file = data->file + ids[i]; sem_unlink(file.constData()); } #endif } delete data; data = 0; }
QVFbMouseHandler::~QVFbMouseHandler() { if (mouseFD >= 0) QT_CLOSE(mouseFD); }
bool QMakeSourceFileInfo::findDeps(SourceFile *file) { if(file->dep_checked || file->type == TYPE_UNKNOWN) return true; files_changed = true; file->dep_checked = true; struct stat fst; char *buffer = 0; int buffer_len = 0; { int fd; #if defined(_MSC_VER) && _MSC_VER >= 1400 if (_sopen_s(&fd, fixPathForFile(file->file, true).local().toLatin1().constData(), _O_RDONLY, _SH_DENYNO, _S_IREAD) != 0) fd = -1; #else fd = open(fixPathForFile(file->file, true).local().toLatin1().constData(), O_RDONLY); #endif if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode)) return false; buffer = getBuffer(fst.st_size); for(int have_read = 0; (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len)); buffer_len += have_read); QT_CLOSE(fd); } if(!buffer) return false; if(!file->deps) file->deps = new SourceDependChildren; int line_count = 1; for(int x = 0; x < buffer_len; ++x) { bool try_local = true; char *inc = 0; if(file->type == QMakeSourceFileInfo::TYPE_UI) { // skip whitespaces while(x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t')) ++x; if(*(buffer + x) == '<') { ++x; if(buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) && (*(buffer + x + 11) == ' ' || *(buffer + x + 11) == '>')) { for(x += 11; *(buffer + x) != '>'; ++x); int inc_len = 0; for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len); *(buffer + x + inc_len) = '\0'; inc = buffer + x; } else if(buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) && (*(buffer + x + 12) == ' ' || *(buffer + x + 12) == '>')) { for(x += 13; *(buffer + x) != '>'; ++x); //skip up to > while(x < buffer_len) { for(x++; *(buffer + x) != '<'; ++x); //skip up to < x++; if(buffer_len >= x + 7 && !strncmp(buffer+x, "header", 6) && (*(buffer + x + 6) == ' ' || *(buffer + x + 6) == '>')) { for(x += 7; *(buffer + x) != '>'; ++x); //skip up to > int inc_len = 0; for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len); *(buffer + x + inc_len) = '\0'; inc = buffer + x; break; } else if(buffer_len >= x + 14 && !strncmp(buffer+x, "/customwidget", 13) && (*(buffer + x + 13) == ' ' || *(buffer + x + 13) == '>')) { x += 14; break; } } } else if(buffer_len >= x + 8 && !strncmp(buffer + x, "include", 7) && (*(buffer + x + 7) == ' ' || *(buffer + x + 7) == '>')) { for(x += 8; *(buffer + x) != '>'; ++x) { if(buffer_len >= x + 9 && *(buffer + x) == 'i' && !strncmp(buffer + x, "impldecl", 8)) { for(x += 8; *(buffer + x) != '='; ++x); if(*(buffer + x) != '=') continue; for(++x; *(buffer+x) == '\t' || *(buffer+x) == ' '; ++x); char quote = 0; if(*(buffer+x) == '\'' || *(buffer+x) == '"') { quote = *(buffer + x); ++x; } int val_len; for(val_len = 0; true; ++val_len) { if(quote) { if(*(buffer+x+val_len) == quote) break; } else if(*(buffer + x + val_len) == '>' || *(buffer + x + val_len) == ' ') { break; } } //? char saved = *(buffer + x + val_len); *(buffer + x + val_len) = '\0'; if(!strcmp(buffer+x, "in implementation")) { //### do this } } } int inc_len = 0; for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len); *(buffer + x + inc_len) = '\0'; inc = buffer + x; } } //read past new line now.. for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x); ++line_count; } else if(file->type == QMakeSourceFileInfo::TYPE_QRC) { } else if(file->type == QMakeSourceFileInfo::TYPE_C) { for(int beginning=1; x < buffer_len; ++x) { // whitespace comments and line-endings for(; x < buffer_len; ++x) { if(*(buffer+x) == ' ' || *(buffer+x) == '\t') { // keep going } else if(*(buffer+x) == '/') { ++x; if(buffer_len >= x) { if(*(buffer+x) == '/') { //c++ style comment for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x); beginning = 1; } else if(*(buffer+x) == '*') { //c style comment for(++x; x < buffer_len; ++x) { if(*(buffer+x) == '*') { if(x < buffer_len-1 && *(buffer + (x+1)) == '/') { ++x; break; } } else if(qmake_endOfLine(*(buffer+x))) { ++line_count; } } } } } else if(qmake_endOfLine(*(buffer+x))) { ++line_count; beginning = 1; } else { break; } } if(x >= buffer_len) break; // preprocessor directive if(beginning && *(buffer+x) == '#') break; // quoted strings if(*(buffer+x) == '\'' || *(buffer+x) == '"') { const char term = *(buffer+(x++)); for(; x < buffer_len; ++x) { if(*(buffer+x) == term) { ++x; break; } else if(*(buffer+x) == '\\') { ++x; } else if(qmake_endOfLine(*(buffer+x))) { ++line_count; } } } beginning = 0; } if(x >= buffer_len) break; //got a preprocessor symbol ++x; while(x < buffer_len) { if(*(buffer+x) != ' ' && *(buffer+x) != '\t') break; ++x; } int keyword_len = 0; const char *keyword = buffer+x; while(x+keyword_len < buffer_len) { if(((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) && *(buffer+x+keyword_len) != '_') { for(x+=keyword_len; //skip spaces after keyword x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t'); x++); break; } else if(qmake_endOfLine(*(buffer+x+keyword_len))) { x += keyword_len-1; keyword_len = 0; break; } keyword_len++; } if(keyword_len == 7 && !strncmp(keyword, "include", keyword_len)) { char term = *(buffer + x); if(term == '<') { try_local = false; term = '>'; } else if(term != '"') { //wtf? continue; } x++; int inc_len; for(inc_len = 0; *(buffer + x + inc_len) != term && !qmake_endOfLine(*(buffer + x + inc_len)); ++inc_len); *(buffer + x + inc_len) = '\0'; inc = buffer + x; x += inc_len; } else if(keyword_len == 13 && !strncmp(keyword, "qmake_warning", keyword_len)) { char term = 0; if(*(buffer + x) == '"') term = '"'; if(*(buffer + x) == '\'') term = '\''; if(term) x++; int msg_len; for(msg_len = 0; (term && *(buffer + x + msg_len) != term) && !qmake_endOfLine(*(buffer + x + msg_len)); ++msg_len); *(buffer + x + msg_len) = '\0'; debug_msg(0, "%s:%d %s -- %s", file->file.local().toLatin1().constData(), line_count, keyword, buffer+x); x += msg_len; } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { const char term = *(buffer+(x++)); while(x < buffer_len) { if(*(buffer+x) == term) break; if(*(buffer+x) == '\\') { x+=2; } else { if(qmake_endOfLine(*(buffer+x))) ++line_count; ++x; } } } else { --x; } } if(inc) { if(!includes) includes = new SourceFiles; SourceFile *dep = includes->lookupFile(inc); if(!dep) { bool exists = false; QMakeLocalFileName lfn(inc); if(QDir::isRelativePath(lfn.real())) { if(try_local) { QString dir = findFileInfo(file->file).path(); if(QDir::isRelativePath(dir)) dir.prepend(qmake_getpwd() + "/"); if(!dir.endsWith("/")) dir += "/"; QMakeLocalFileName f(dir + lfn.local()); if(findFileInfo(f).exists()) { lfn = fixPathForFile(f); exists = true; } } if(!exists) { //path lookup for(QList<QMakeLocalFileName>::Iterator it = depdirs.begin(); it != depdirs.end(); ++it) { QMakeLocalFileName f((*it).real() + Option::dir_sep + lfn.real()); QFileInfo fi(findFileInfo(f)); if(fi.exists() && !fi.isDir()) { lfn = fixPathForFile(f); exists = true; break; } } } if(!exists) { //heuristic lookup lfn = findFileForDep(QMakeLocalFileName(inc), file->file); if((exists = !lfn.isNull())) lfn = fixPathForFile(lfn); } } else { exists = QFile::exists(lfn.real()); } if(!lfn.isNull()) { dep = files->lookupFile(lfn); if(!dep) { dep = new SourceFile; dep->file = lfn; dep->type = QMakeSourceFileInfo::TYPE_C; files->addFile(dep); includes->addFile(dep, inc, false); } dep->exists = exists; } } if(dep && dep->file != file->file) { dep->included_count++; if(dep->exists) { debug_msg(5, "%s:%d Found dependency to %s", file->file.real().toLatin1().constData(), line_count, dep->file.local().toLatin1().constData()); file->deps->addChild(dep); } } } } if(dependencyMode() == Recursive) { //done last because buffer is shared for(int i = 0; i < file->deps->used_nodes; i++) { if(!file->deps->children[i]->deps) findDeps(file->deps->children[i]); } } return true; }
/*! \internal */ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode) { Q_Q(QFSFileEngine); if (openMode & QIODevice::Unbuffered) { int flags = openModeToOpenFlags(openMode); // Try to open the file in unbuffered mode. do { fd = QT_OPEN(fileEntry.nativeFilePath().constData(), flags, 0666); } while (fd == -1 && errno == EINTR); // On failure, return and report the error. if (fd == -1) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(errno)); return false; } if (!(openMode & QIODevice::WriteOnly)) { // we don't need this check if we tried to open for writing because then // we had received EISDIR anyway. if (QFileSystemEngine::fillMetaData(fd, metaData) && metaData.isDirectory()) { q->setError(QFile::OpenError, QLatin1String("file to open is a directory")); QT_CLOSE(fd); return false; } } // Seek to the end when in Append mode. if (flags & QFile::Append) { int ret; do { ret = QT_LSEEK(fd, 0, SEEK_END); } while (ret == -1 && errno == EINTR); if (ret == -1) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(int(errno))); return false; } } fh = 0; } else { QByteArray fopenMode = openModeToFopenMode(openMode, fileEntry, metaData); // Try to open the file in buffered mode. do { fh = QT_FOPEN(fileEntry.nativeFilePath().constData(), fopenMode.constData()); } while (!fh && errno == EINTR); // On failure, return and report the error. if (!fh) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(int(errno))); return false; } if (!(openMode & QIODevice::WriteOnly)) { // we don't need this check if we tried to open for writing because then // we had received EISDIR anyway. if (QFileSystemEngine::fillMetaData(QT_FILENO(fh), metaData) && metaData.isDirectory()) { q->setError(QFile::OpenError, QLatin1String("file to open is a directory")); fclose(fh); return false; } } setCloseOnExec(fileno(fh)); // ignore failure // Seek to the end when in Append mode. if (openMode & QIODevice::Append) { int ret; do { ret = QT_FSEEK(fh, 0, SEEK_END); } while (ret == -1 && errno == EINTR); if (ret == -1) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(int(errno))); return false; } } fd = -1; } closeFileHandle = true; return true; }
bool QMakeSourceFileInfo::findMocs(SourceFile *file) { if(file->moc_checked) return true; files_changed = true; file->moc_checked = true; int buffer_len; char *buffer = 0; { struct stat fst; int fd; #if defined(_MSC_VER) && _MSC_VER >= 1400 if (_sopen_s(&fd, fixPathForFile(file->file, true).local().toLocal8Bit().constData(), _O_RDONLY, _SH_DENYRW, _S_IREAD) != 0) fd = -1; #else fd = open(fixPathForFile(file->file, true).local().toLocal8Bit().constData(), O_RDONLY); #endif if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode)) return false; //shouldn't happen buffer = getBuffer(fst.st_size); for(int have_read = buffer_len = 0; (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len)); buffer_len += have_read); QT_CLOSE(fd); } debug_msg(2, "findMocs: %s", file->file.local().toLatin1().constData()); int line_count = 1; bool ignore_qobject = false, ignore_qgadget = false; /* qmake ignore Q_GADGET */ /* qmake ignore Q_OBJECT */ for(int x = 0; x < buffer_len; x++) { if(*(buffer + x) == '/') { ++x; if(buffer_len >= x) { if(*(buffer + x) == '/') { //c++ style comment for(;x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x); } else if(*(buffer + x) == '*') { //c style comment for(++x; x < buffer_len; ++x) { if(*(buffer + x) == 't' || *(buffer + x) == 'q') { //ignore if(buffer_len >= (x + 20) && !strncmp(buffer + x + 1, "make ignore Q_OBJECT", 20)) { debug_msg(2, "Mocgen: %s:%d Found \"qmake ignore Q_OBJECT\"", file->file.real().toLatin1().constData(), line_count); x += 20; ignore_qobject = true; } else if(buffer_len >= (x + 20) && !strncmp(buffer + x + 1, "make ignore Q_GADGET", 20)) { debug_msg(2, "Mocgen: %s:%d Found \"qmake ignore Q_GADGET\"", file->file.real().toLatin1().constData(), line_count); x += 20; ignore_qgadget = true; } } else if(*(buffer + x) == '*') { if(buffer_len >= (x+1) && *(buffer + (x+1)) == '/') { ++x; break; } } else if(Option::debug_level && qmake_endOfLine(*(buffer + x))) { ++line_count; } } } } } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { const char term = *(buffer+(x++)); while(x < buffer_len) { if(*(buffer+x) == term) break; if(*(buffer+x) == '\\') { x+=2; } else { if(qmake_endOfLine(*(buffer+x))) ++line_count; ++x; } } } if(Option::debug_level && qmake_endOfLine(*(buffer+x))) ++line_count; if(((buffer_len > x+2 && *(buffer+x+1) == 'Q' && *(buffer+x+2) == '_') || (buffer_len > x+4 && *(buffer+x+1) == 'Q' && *(buffer+x+2) == 'O' && *(buffer+x+3) == 'M' && *(buffer+x+4) == '_')) && *(buffer + x) != '_' && (*(buffer + x) < 'a' || *(buffer + x) > 'z') && (*(buffer + x) < 'A' || *(buffer + x) > 'Z') && (*(buffer + x) < '0' || *(buffer + x) > '9')) { ++x; int match = 0; static const char *interesting[] = { "OBJECT", "GADGET", "M_OBJECT" }; for(int interest = 0, m1, m2; interest < 3; ++interest) { if(interest == 0 && ignore_qobject) continue; else if(interest == 1 && ignore_qgadget) continue; for(m1 = 0, m2 = 0; *(interesting[interest]+m1); ++m1) { if(*(interesting[interest]+m1) != *(buffer+x+2+m1)) { m2 = -1; break; } ++m2; } if(m1 == m2) { match = m2 + 2; break; } } if(match && *(buffer+x+match) != '_' && (*(buffer+x+match) < 'a' || *(buffer+x+match) > 'z') && (*(buffer+x+match) < 'A' || *(buffer+x+match) > 'Z') && (*(buffer+x+match) < '0' || *(buffer+x+match) > '9')) { if(Option::debug_level) { *(buffer+x+match) = '\0'; debug_msg(2, "Mocgen: %s:%d Found MOC symbol %s", file->file.real().toLatin1().constData(), line_count, buffer+x); } file->mocable = true; return true; } } } return true; }
/*! Destroys this keyboard handler and closes the connection to the keyboard device. */ QWSQnxKeyboardHandler::~QWSQnxKeyboardHandler() { if (keyboardFD != -1) QT_CLOSE(keyboardFD); }
/*! \internal */ bool QFSFileEnginePrivate::closeFdFh() { Q_Q(QFSFileEngine); if (fd == -1 && !fh #ifdef Q_OS_SYMBIAN && !symbianFile.SubSessionHandle() #ifndef QT_SYMBIAN_USE_NATIVE_FILEMAP && fileHandleForMaps == -1 #endif #endif ) return false; // Flush the file if it's buffered, and if the last flush didn't fail. bool flushed = !fh || (!lastFlushFailed && q->flush()); bool closed = true; tried_stat = 0; #if defined(Q_OS_SYMBIAN) && !defined(QT_SYMBIAN_USE_NATIVE_FILEMAP) // Map handle is always owned by us so always close it if (fileHandleForMaps >= 0) { QT_CLOSE(fileHandleForMaps); fileHandleForMaps = -1; } #endif // Close the file if we created the handle. if (closeFileHandle) { int ret; do { #ifdef Q_OS_SYMBIAN if (symbianFile.SubSessionHandle()) { symbianFile.Close(); ret = 0; } else #endif if (fh) { // Close buffered file. ret = fclose(fh) != 0 ? -1 : 0; } else { // Close unbuffered file. ret = QT_CLOSE(fd); } } while (ret == -1 && errno == EINTR); // We must reset these guys regardless; calling close again after a // failed close causes crashes on some systems. fh = 0; fd = -1; closed = (ret == 0); } // Report errors. if (!flushed || !closed) { if (flushed) { // If not flushed, we want the flush error to fall through. q->setError(QFile::UnspecifiedError, qt_error_string(errno)); } return false; } return true; }
/*! Destroys this mouse handler and closes the connection to the mouse device. */ QQnxMouseHandler::~QQnxMouseHandler() { QT_CLOSE(mouseFD); }
bool QDeviceDiscoveryStatic::checkDeviceType(const QString &device) { int fd = QT_OPEN(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0); if (Q_UNLIKELY(fd == -1)) { qWarning() << "Device discovery cannot open device" << device; return false; } qCDebug(lcDD) << "doing static device discovery for " << device; if ((m_types & Device_DRM) && device.contains(QLatin1String(QT_DRM_DEVICE_PREFIX))) { QT_CLOSE(fd); return true; } long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)]; long bitsKey[LONG_FIELD_SIZE(KEY_CNT)]; long bitsRel[LONG_FIELD_SIZE(REL_CNT)]; memset(bitsAbs, 0, sizeof(bitsAbs)); memset(bitsKey, 0, sizeof(bitsKey)); memset(bitsRel, 0, sizeof(bitsRel)); ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs); ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(bitsKey)), bitsKey); ioctl(fd, EVIOCGBIT(EV_REL, sizeof(bitsRel)), bitsRel); QT_CLOSE(fd); if ((m_types & Device_Keyboard)) { if (testBit(KEY_Q, bitsKey)) { qCDebug(lcDD) << "Found keyboard at" << device; return true; } } if ((m_types & Device_Mouse)) { if (testBit(REL_X, bitsRel) && testBit(REL_Y, bitsRel) && testBit(BTN_MOUSE, bitsKey)) { qCDebug(lcDD) << "Found mouse at" << device; return true; } } if ((m_types & (Device_Touchpad | Device_Touchscreen))) { if (testBit(ABS_X, bitsAbs) && testBit(ABS_Y, bitsAbs)) { if ((m_types & Device_Touchpad) && testBit(BTN_TOOL_FINGER, bitsKey)) { qCDebug(lcDD) << "Found touchpad at" << device; return true; } else if ((m_types & Device_Touchscreen) && testBit(BTN_TOUCH, bitsKey)) { qCDebug(lcDD) << "Found touchscreen at" << device; return true; } else if ((m_types & Device_Tablet) && (testBit(BTN_STYLUS, bitsKey) || testBit(BTN_TOOL_PEN, bitsKey))) { qCDebug(lcDD) << "Found tablet at" << device; return true; } } else if (testBit(ABS_MT_POSITION_X, bitsAbs) && testBit(ABS_MT_POSITION_Y, bitsAbs)) { qCDebug(lcDD) << "Found new-style touchscreen at" << device; return true; } } if ((m_types & Device_Joystick)) { if (testBit(BTN_A, bitsKey) || testBit(BTN_TRIGGER, bitsKey) || testBit(ABS_RX, bitsAbs)) { qCDebug(lcDD) << "Found joystick/gamepad at" << device; return true; } } return false; }
/*! Destroys this keyboard handler and closes the connection to the keyboard device. */ QWSQnxKeyboardHandler::~QWSQnxKeyboardHandler() { QT_CLOSE(keyboardFD); }