bool QQnxNavigatorPps::sendPpsMessage(const QByteArray &message, const QByteArray &data) { QByteArray ppsMessage = "msg::" + message; if (!data.isEmpty()) ppsMessage += "\ndat::" + data; ppsMessage += "\n"; qNavigatorDebug() << Q_FUNC_INFO << "sending PPS message:\n" << ppsMessage; // send pps message to navigator errno = 0; int bytes = qt_safe_write(m_fd, ppsMessage.constData(), ppsMessage.size()); if (bytes == -1) qFatal("QQNX: failed to write navigator pps, errno=%d", errno); // allocate buffer for pps data char buffer[ppsBufferSize]; // attempt to read pps data do { errno = 0; bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1); if (bytes == -1) qFatal("QQNX: failed to read navigator pps, errno=%d", errno); } while (bytes == 0); // ensure data is null terminated buffer[bytes] = '\0'; qNavigatorDebug() << Q_FUNC_INFO << "received PPS message:\n" << buffer; // process received message QByteArray ppsData(buffer); QHash<QByteArray, QByteArray> responseFields; parsePPS(ppsData, responseFields); if (responseFields.contains("res") && responseFields.value("res") == message) { if (responseFields.contains("err")) { qCritical() << "navigator responded with error: " << responseFields.value("err"); return false; } } return true; }
bool QQnxAbstractNavigator::invokeUrl(const QUrl &url) { if (!url.isValid() || url.isRelative()) return false; // not using QUrl::toEncoded() because for e.g. camera:// it creates camera: // which is not recognized by the navigator anymore const bool result = requestInvokeUrl(url.toString().toUtf8()); qNavigatorDebug() << Q_FUNC_INFO << "url=" << url << "result=" << result; return result; }
void QQnxNavigatorPps::parsePPS(const QByteArray &ppsData, QHash<QByteArray, QByteArray> &messageFields) { qNavigatorDebug() << Q_FUNC_INFO << "data=" << ppsData; // tokenize pps data into lines QList<QByteArray> lines = ppsData.split('\n'); // validate pps object if (lines.size() == 0 || lines.at(0) != "@control") qFatal("QQNX: unrecognized pps object, data=%s", ppsData.constData()); // parse pps object attributes and extract values for (int i = 1; i < lines.size(); i++) { // tokenize current attribute const QByteArray &attr = lines.at(i); qNavigatorDebug() << Q_FUNC_INFO << "attr=" << attr; int firstColon = attr.indexOf(':'); if (firstColon == -1) { // abort - malformed attribute continue; } int secondColon = attr.indexOf(':', firstColon + 1); if (secondColon == -1) { // abort - malformed attribute continue; } QByteArray key = attr.left(firstColon); QByteArray value = attr.mid(secondColon + 1); qNavigatorDebug() << Q_FUNC_INFO << "key=" << key; qNavigatorDebug() << Q_FUNC_INFO << "val=" << value; messageFields[key] = value; } }
bool QQnxNavigatorPps::openPpsConnection() { if (m_fd != -1) return true; // open connection to navigator errno = 0; m_fd = qt_safe_open(navigatorControlPath, O_RDWR); if (m_fd == -1) { qWarning("QQNX: failed to open navigator pps, errno=%d", errno); return false; } qNavigatorDebug() << Q_FUNC_INFO << "successfully connected to Navigator. fd=" << m_fd; return true; }