summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2015-03-31 02:38:50 +0200
committerJavier <dev.git@javispedro.com>2015-03-31 02:38:50 +0200
commit631af0284a651f1698e4796c2e39aabb83a3bfca (patch)
treec7a2e0f5a898c4a68aa9482757718364ba93f83f
parent1a72dfb10bb0189e842c754b3550795538a79493 (diff)
downloadsaltoq-631af0284a651f1698e4796c2e39aabb83a3bfca.tar.gz
saltoq-631af0284a651f1698e4796c2e39aabb83a3bfca.zip
parse incoming card events
-rw-r--r--saltoqd/cardmanager.cpp97
-rw-r--r--saltoqd/cardmanager.h4
-rw-r--r--saltoqd/notificationmanager.cpp10
-rw-r--r--saltoqd/notificationmanager.h2
-rw-r--r--saltoqd/notificationmonitor.cpp4
-rw-r--r--saltoqd/toqmanager.cpp14
-rw-r--r--saltoqd/toqmanager.h4
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 <QtCore/QRegularExpression>
#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<CardDeck*, QString> p = unpackMessage(msg.payload);
+ CardDeck *deck = p.first;
+ if (!deck) {
+ return;
+ }
+ QHash<QString,QString> 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<CardDeck*,QString> 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<CardDeck*, QString>(deck, payload);
+}
+
+QHash<QString,QString> CardManager::unpackDictionary(const QString &data) const
+{
+ QHash<QString,QString> 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<CardDeck*>(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<CardDeck*>(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<Card*> 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<CardDeck *, QString> unpackMessage(const QByteArray &data) const;
+ QHash<QString,QString> 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<MonitoredNotification*>(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<MonitoredNotification*, Card*> _cards;
+ QMap<uint, Card*> _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
@@ -37,6 +37,10 @@ public:
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,
quint32 type, const QJsonObject &payload);