From 631af0284a651f1698e4796c2e39aabb83a3bfca Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 31 Mar 2015 02:38:50 +0200 Subject: parse incoming card events --- saltoqd/cardmanager.cpp | 97 ++++++++++++++++++++++++++++++++++++----- saltoqd/cardmanager.h | 4 ++ saltoqd/notificationmanager.cpp | 10 ++++- saltoqd/notificationmanager.h | 2 +- saltoqd/notificationmonitor.cpp | 4 ++ saltoqd/toqmanager.cpp | 14 ++++++ saltoqd/toqmanager.h | 4 ++ 7 files changed, 120 insertions(+), 15 deletions(-) diff --git a/saltoqd/cardmanager.cpp b/saltoqd/cardmanager.cpp index 5418104..1bf8dd4 100644 --- a/saltoqd/cardmanager.cpp +++ b/saltoqd/cardmanager.cpp @@ -1,3 +1,4 @@ +#include #include "cardmanager.h" Card::Card(const QString &id, QObject *parent) : @@ -153,6 +154,11 @@ Card* CardDeck::cardAt(int position) const return _deck.at(position); } +Card* CardDeck::cardAt(const QString &id) const +{ + return _ids.value(id); +} + void CardDeck::appendCard(Card *card) { insertCard(_deck.size(), card); @@ -215,7 +221,33 @@ CardManager::CardManager(FmsManager *fms, ToqManager *toq) : void CardManager::handleMessage(const ToqConnection::Message &msg) { - + QPair p = unpackMessage(msg.payload); + CardDeck *deck = p.first; + if (!deck) { + return; + } + QHash dict = unpackDictionary(p.second); + qDebug() << dict; + QString id = dict["id"]; + Card *card = deck->cardAt(id); + if (card) { + QString event = dict["event"]; + if (event == "open") { + card->setOpen(true); + } else if (event == "closed") { + card->setOpen(false); + } else if (event == "visible") { + card->setVisible(true); + } else if (event == "invisible") { + card->setVisible(false); + } else if (event == "selected") { + emit card->optionSelected(dict["eventdata"]); + } else { + qWarning() << "Unknown card event" << event; + } + } else { + qWarning() << "Card" << id << "not found in deck" << deck->package(); + } } void CardManager::installDeck(CardDeck *deck) @@ -246,7 +278,7 @@ QString CardManager::generateCardDescription(const QString &verb, Card *card) co { QString desc = verb + " { "; desc += QString("id = \"%1\", ").arg(card->id()); - desc += QString("version = 2, "); + desc += QString("version = 2, cardevents = \"true\", "); if (!card->header().isEmpty()) { desc += QString("header = \"%1\", ").arg(card->header()); } @@ -257,7 +289,7 @@ QString CardManager::generateCardDescription(const QString &verb, Card *card) co desc += QString("time = \"%1\", ").arg(card->dateTime().toMSecsSinceEpoch()); } if (!card->info().isEmpty()) { - desc += QString("title = \"%1\", ").arg(card->info()); + desc += QString("info = \"%1\", ").arg(card->info()); } if (!card->isVibrate()) { desc += QString("suppressvibe = \"true\", "); @@ -269,6 +301,47 @@ QString CardManager::generateCardDescription(const QString &verb, Card *card) co return desc; } +QByteArray CardManager::packMessage(CardDeck *deck, const QString &msg) const +{ + QByteArray data; + QByteArray target = QString("%1/%2").arg(deck->package()).arg(deck->application()).toUtf8(); + QByteArray payload = msg.toUtf8(); + + target.append('\0'); // Null terminated + + data.reserve(1 + target.size() + payload.size()); + data.append(char(target.size())); + data.append(target); + data.append(payload); + return data; +} + +QPair CardManager::unpackMessage(const QByteArray &data) const +{ + CardDeck *deck = 0; + QString payload; + int id_size = data.at(0); + QStringList id = QString::fromUtf8(data.mid(1, id_size)).split('/'); + deck = _decks.value(id.at(0)); + payload = QString::fromUtf8(data.mid(1 + id_size)); + if (!deck) { + qWarning() << "Deck with id" << id[0] << "not found"; + } + return QPair(deck, payload); +} + +QHash CardManager::unpackDictionary(const QString &data) const +{ + QHash dict; + const QRegularExpression re("(\\w+) = \"([^\"]*)\""); + QRegularExpressionMatchIterator it = re.globalMatch(data); + while (it.hasNext()) { + QRegularExpressionMatch m = it.next(); + dict.insert(m.captured(1), m.captured(2)); + } + return dict; +} + void CardManager::refreshDeck(CardDeck *deck) { Q_ASSERT(deck); @@ -282,13 +355,6 @@ void CardManager::refreshDeck(CardDeck *deck) data += generateCardDescription("NotifyCard", card); } -#if 0 - qDebug() << data; - data = QLatin1String( - "NotifyCard { id = \"jackpal.androidterm\", version = 2, app = \"Terminal\", title = \"Terminal\", time = \"1427073495379\", cardevents = \"true\", divider = \"true\", icon = \"fms:/jackpal.androidterm.img\", detail = { \"Ses de terminal en ejecucin\" } }\n" - "NotifyCard { id = \"com.android.vending\", version = 2, app = \"Google Play Store\", title = \"Simulador Chat\", time = \"1427073139463\", divider = \"true\", icon = \"fms:/com.android.vending.img\", detail = { \"Instalada correctamente\" } }\n"); -#endif - qDebug() << data; QString cardsFile = QString("/packages/%1/cards.dat").arg(deck->package()); @@ -317,8 +383,12 @@ void CardManager::handleDeckNeedsRefresh() void CardManager::handleCardAdded(Card *card) { CardDeck *deck = static_cast(sender()); + qDebug() << "Card added"; if (_toq->isConnected()) { - + QString cmd = generateCardDescription("PopupCard", card); + QByteArray payload = packMessage(deck, cmd); + qDebug() << cmd; + _toq->sendMessage(ToqConnection::AppMessagingEndpoint, ToqConnection::AppMessagingEndpoint + 1, 0x8000, payload); } } @@ -326,6 +396,9 @@ void CardManager::handleCardRemoved(Card *card) { CardDeck *deck = static_cast(sender()); if (_toq->isConnected()) { - + QString cmd = QString("DeleteCard { id = \"%1\" }\n").arg(card->id()); + QByteArray payload = packMessage(deck, cmd); + qDebug() << cmd; + _toq->sendMessage(ToqConnection::AppMessagingEndpoint, ToqConnection::AppMessagingEndpoint + 1, 0x8000, payload); } } diff --git a/saltoqd/cardmanager.h b/saltoqd/cardmanager.h index 863c4a6..5162a3b 100644 --- a/saltoqd/cardmanager.h +++ b/saltoqd/cardmanager.h @@ -95,6 +95,7 @@ public: QList cards() const; Card * cardAt(int position) const; + Card * cardAt(const QString &id) const; void appendCard(Card * card); void insertCard(int position, Card * card); @@ -132,6 +133,9 @@ public slots: private: QString generateCardDescription(const QString &verb, Card * card) const; + QByteArray packMessage(CardDeck *deck, const QString &msg) const; + QPair unpackMessage(const QByteArray &data) const; + QHash unpackDictionary(const QString &data) const; private slots: void refreshDeck(CardDeck *deck); diff --git a/saltoqd/notificationmanager.cpp b/saltoqd/notificationmanager.cpp index c78fffb..f6b626f 100644 --- a/saltoqd/notificationmanager.cpp +++ b/saltoqd/notificationmanager.cpp @@ -14,7 +14,8 @@ NotificationManager::NotificationManager(CardManager *card, ToqManager *toq) : void NotificationManager::handleNotification(MonitoredNotification *n) { - Card *card = new Card(QString::number(qint64(n->id()))); + uint notificationId = n->id(); + Card *card = new Card(QString::number(qint64(notificationId))); card->setHeader(n->sender()); card->setTitle(n->summary()); @@ -25,15 +26,20 @@ void NotificationManager::handleNotification(MonitoredNotification *n) connect(n, &MonitoredNotification::closed, this, &NotificationManager::handleClosedNotification); + _cards.insert(notificationId, card); _deck->appendCard(card); } void NotificationManager::handleClosedNotification() { MonitoredNotification *n = static_cast(sender()); - Card *card = _cards.take(n); + uint notificationId = n->id(); + Card *card = _cards.take(notificationId); if (card) { _deck->removeCard(card); card->deleteLater(); + } else { + qDebug() << "Notification" << notificationId << "does not have an attached card"; } + disconnect(n, 0, this, 0); } diff --git a/saltoqd/notificationmanager.h b/saltoqd/notificationmanager.h index ab6ccad..ce27a7d 100644 --- a/saltoqd/notificationmanager.h +++ b/saltoqd/notificationmanager.h @@ -22,7 +22,7 @@ private: NotificationMonitor *_monitor; CardManager *_card; CardDeck *_deck; - QMap _cards; + QMap _cards; }; #endif // NOTIFICATIONMANAGER_H diff --git a/saltoqd/notificationmonitor.cpp b/saltoqd/notificationmonitor.cpp index 5cff5f6..900b742 100644 --- a/saltoqd/notificationmonitor.cpp +++ b/saltoqd/notificationmonitor.cpp @@ -277,6 +277,8 @@ void NotificationMonitor::processIncomingNotification(quint32 id, const QVariant n->_body = content["body"].toString(); n->_timestamp = content["timestamp"].toDateTime(); + _notifs.insert(id, n); + emit notification(n); } } @@ -289,5 +291,7 @@ void NotificationMonitor::processCloseNotification(quint32 id, quint32 reason) _notifs.remove(id); emit n->closed(reason); n->deleteLater(); + } else { + qDebug() << " but it is not found"; } } diff --git a/saltoqd/toqmanager.cpp b/saltoqd/toqmanager.cpp index 331baaf..d7bef9c 100644 --- a/saltoqd/toqmanager.cpp +++ b/saltoqd/toqmanager.cpp @@ -57,6 +57,20 @@ void ToqManager::sendMessage(const ToqConnection::Message &msg) _conn->sendMessage(msg); } +void ToqManager::sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, quint16 transactionId, quint32 type, const QByteArray &payload) +{ + ToqConnection::Message msg(source, destination, transactionId, type, payload); + sendMessage(msg); +} + +quint16 ToqManager::sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, quint32 type, const QByteArray &payload) +{ + quint16 transactionId = newTransactionId(); + ToqConnection::Message msg(source, destination, transactionId, type, payload); + sendMessage(msg); + return transactionId; +} + void ToqManager::sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, quint16 transactionId, quint32 type, const QJsonObject &payload) { QJsonDocument doc(payload); diff --git a/saltoqd/toqmanager.h b/saltoqd/toqmanager.h index e3601f4..03eb0de 100644 --- a/saltoqd/toqmanager.h +++ b/saltoqd/toqmanager.h @@ -36,6 +36,10 @@ public: quint16 newTransactionId(); void sendMessage(const ToqConnection::Message &msg); + void sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, + quint16 transactionId, quint32 type, const QByteArray &payload); + quint16 sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, + quint32 type, const QByteArray &payload); void sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, quint16 transactionId, quint32 type, const QJsonObject &payload); quint16 sendMessage(ToqConnection::Endpoint source, ToqConnection::Endpoint destination, -- cgit v1.2.3