diff options
| author | Javier <dev.git@javispedro.com> | 2015-03-31 02:38:50 +0200 | 
|---|---|---|
| committer | Javier <dev.git@javispedro.com> | 2015-03-31 02:38:50 +0200 | 
| commit | 631af0284a651f1698e4796c2e39aabb83a3bfca (patch) | |
| tree | c7a2e0f5a898c4a68aa9482757718364ba93f83f /saltoqd | |
| parent | 1a72dfb10bb0189e842c754b3550795538a79493 (diff) | |
| download | saltoq-631af0284a651f1698e4796c2e39aabb83a3bfca.tar.gz saltoq-631af0284a651f1698e4796c2e39aabb83a3bfca.zip | |
parse incoming card events
Diffstat (limited to 'saltoqd')
| -rw-r--r-- | saltoqd/cardmanager.cpp | 97 | ||||
| -rw-r--r-- | saltoqd/cardmanager.h | 4 | ||||
| -rw-r--r-- | saltoqd/notificationmanager.cpp | 10 | ||||
| -rw-r--r-- | saltoqd/notificationmanager.h | 2 | ||||
| -rw-r--r-- | saltoqd/notificationmonitor.cpp | 4 | ||||
| -rw-r--r-- | saltoqd/toqmanager.cpp | 14 | ||||
| -rw-r--r-- | 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 <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); | 
