Chrome Addon Is Randomly Sending Trash To My C++ Native Host Application
I'm trying to write a simple parental control app for my university project, but I'm a newbie in browser addons. I want to use Chrome addon to send hosts viewed by the user in real
Solution 1:
Based on this answer I have built a class that monitors "stdin", get the text and decode it using QFile:
nativemessenger.h
#ifndef NATIVEMESSENGER_H#define NATIVEMESSENGER_H#include<QObject>#include<QFile>classNativeMessenger : public QObject
{
Q_OBJECT
public:
explicitNativeMessenger(QObject *parent = nullptr);
public Q_SLOTS:
voidsendMessage(const QByteArray & message);
Q_SIGNALS:
voidmessageChanged(const QByteArray & message);
private Q_SLOTS:
voidreadyRead();
private:
QFile m_qin;
QFile m_qout;
};
#endif// NATIVEMESSENGER_H
nativemessenger.cpp
#include"nativemessenger.h"#include<QCoreApplication>#ifdef Q_OS_WIN#include<QWinEventNotifier>#include<windows.h>#else#include<QSocketNotifier>#endif
NativeMessenger::NativeMessenger(QObject *parent) : QObject(parent)
{
#ifdef Q_OS_WIN// https://developer.chrome.com/apps/nativeMessaging#native-messaging-debugging
_setmode(_fileno(stdin), _O_BINARY);
_setmode(_fileno(stdout), _O_BINARY);
#endif
m_qin.open(stdin, QIODevice::ReadOnly | QIODevice::Unbuffered);
m_qout.open(stdout, QIODevice::WriteOnly);
#ifdef Q_OS_WIN
QWinEventNotifier *m_notifier = newQWinEventNotifier(GetStdHandle(STD_INPUT_HANDLE));
connect(m_notifier, &QWinEventNotifier::activated, this, &NativeMessenger::readyRead);
#else
QSocketNotifier *m_notifier = newQSocketNotifier(fileno(stdin), QSocketNotifier::Read, this);
connect(m_notifier, &QSocketNotifier::activated, this, &NativeMessenger::readyRead);
#endif
}
voidNativeMessenger::sendMessage(const QByteArray &message){
quint32 len = message.length();
m_qout.write(reinterpret_cast<char *>(&len), sizeof(len));
m_qout.write(message);
m_qout.flush();
}
voidNativeMessenger::readyRead(){
m_qin.startTransaction();
quint32 length = 0;
qint64 rc = m_qin.read(reinterpret_cast<char *>(&length), sizeof(quint32));
if (rc == -1) {
m_qin.rollbackTransaction();
return;
}
QByteArray message = m_qin.read(length);
if (message.length() != int(length)) {
m_qin.rollbackTransaction();
return;
}
if (message.isEmpty()) {
m_qin.rollbackTransaction();
return;
}
m_qin.commitTransaction();
Q_EMIT messageChanged(message);
}
main.cpp
#include<QCoreApplication>#include<QJsonDocument>#include<QJsonObject>#include<QDebug>#include"nativemessenger.h"intmain(int argc, char *argv[]){
QCoreApplication a(argc, argv);
NativeMessenger listener;
QObject::connect(&listener, &NativeMessenger::messageChanged,
[&listener]
(const QByteArray & message){
// decode message
QJsonParseError error;
QJsonDocument json = QJsonDocument::fromJson(message, &error);
if(error.error != QJsonParseError::NoError){
qDebug() << error.errorString();
}
// build response
QJsonObject object
{
{"data", json.object()},
{"name", QCoreApplication::applicationName()}
};
QByteArray response = QJsonDocument(object).toJson(QJsonDocument::Compact);
// send response
listener.sendMessage(response);
});
return a.exec();
}
A complete example can be found here.
Post a Comment for "Chrome Addon Is Randomly Sending Trash To My C++ Native Host Application"