123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | // Copyright (C) 2012 Research In Motion// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include"qqnxnavigatorpps.h"#include <QDebug>#include <QHash>#include <QByteArray>#include <private/qcore_unix_p.h> QT_BEGIN_NAMESPACE const char*QQnxNavigatorPps::navigatorControlPath ="/pps/services/navigator/control";const size_tQQnxNavigatorPps::ppsBufferSize =4096;QQnxNavigatorPps::QQnxNavigatorPps(QObject *parent):QQnxAbstractNavigator(parent),m_fd(-1){}QQnxNavigatorPps::~QQnxNavigatorPps(){// close connection to navigatorif(m_fd != -1)qt_safe_close(m_fd);}boolQQnxNavigatorPps::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;}qCDebug(lcQpaQnxNavigator) <<"successfully connected to Navigator. fd="<< m_fd;return true;}boolQQnxNavigatorPps::requestInvokeUrl(const QByteArray &encodedUrl){if(!openPpsConnection())return false;returnsendPpsMessage("invoke", encodedUrl);}boolQQnxNavigatorPps::sendPpsMessage(const QByteArray &message,const QByteArray &data){ QByteArray ppsMessage ="msg::"+ message;if(!data.isEmpty()) ppsMessage +="\ndat::"+ data; ppsMessage +="\n";qCDebug(lcQpaQnxNavigator) <<"sending PPS message:\n"<< ppsMessage;// send pps message to navigator errno =0;int bytes =qt_safe_write(m_fd, ppsMessage.constData(), ppsMessage.size());if(Q_UNLIKELY(bytes == -1))qFatal("QQNX: failed to write navigator pps, errno=%d", errno);// allocate buffer for pps datachar buffer[ppsBufferSize];// attempt to read pps datado{ errno =0; bytes =qt_safe_read(m_fd, buffer, ppsBufferSize -1);if(Q_UNLIKELY(bytes == -1))qFatal("QQNX: failed to read navigator pps, errno=%d", errno);}while(bytes ==0);// ensure data is null terminated buffer[bytes] ='\0';qCDebug(lcQpaQnxNavigator) <<"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(Q_UNLIKELY(responseFields.contains("err"))) {qCritical() <<"navigator responded with error: "<< responseFields.value("err");return false;}}return true;}voidQQnxNavigatorPps::parsePPS(const QByteArray &ppsData, QHash<QByteArray, QByteArray> &messageFields){qCDebug(lcQpaQnxNavigator) <<"data="<< ppsData;// tokenize pps data into lines QList<QByteArray> lines = ppsData.split('\n');// validate pps objectif(Q_UNLIKELY(lines.empty() || lines.at(0) !="@control"))qFatal("QQNX: unrecognized pps object, data=%s", ppsData.constData());// parse pps object attributes and extract valuesfor(int i =1; i < lines.size(); i++) {// tokenize current attributeconst QByteArray &attr = lines.at(i);qCDebug(lcQpaQnxNavigator) <<"attr="<< attr;int firstColon = attr.indexOf(':');if(firstColon == -1) {// abort - malformed attributecontinue;}int secondColon = attr.indexOf(':', firstColon +1);if(secondColon == -1) {// abort - malformed attributecontinue;} QByteArray key = attr.left(firstColon); QByteArray value = attr.mid(secondColon +1);qCDebug(lcQpaQnxNavigator) <<"key="<< key <<"value="<< value; messageFields[key] = value;}} QT_END_NAMESPACE
|