Fixed a JSBridge potential memory leak

parent 4e93a67a
...@@ -2,9 +2,8 @@ function changeContent(id, content) ...@@ -2,9 +2,8 @@ function changeContent(id, content)
{ {
var n=document.getElementById(id); var n=document.getElementById(id);
if(typeof(n)!="undefined") if(typeof(n)!="undefined")
n.innerHTML="ESTICAZZI"; n.innerHTML=content;
} }
function notify(content) function notify(content)
{ {
if(typeof(notifycb)=="function") if(typeof(notifycb)=="function")
...@@ -17,7 +16,24 @@ function msgalert(content) ...@@ -17,7 +16,24 @@ function msgalert(content)
else else
alert(content); alert(content);
} }
function publicReceived(user, msg)
{
if(typeof(public_received)=="function")
{
public_received(user, msg);
} else {
n = document.getElementById("chatarea");
if(typeof(n)!="undefined")
{
var newel = document.createElement('p');
newel.innerHTML="<"+user+"> "+msg;
n.appendChild(newel);
n.scollTop = n.scrollHeight;
}
}
}
SkyliveX.changeContent.connect(changeContent); SkyliveX.changeContent.connect(changeContent);
SkyliveX.notify.connect(notify); SkyliveX.notify.connect(notify);
SkyliveX.alert.connect(msgalert); SkyliveX.alertmsg.connect(msgalert);
SkyliveX.public_received.connect(publicReceived);
...@@ -93,33 +93,6 @@ ...@@ -93,33 +93,6 @@
</div> </div>
<div id="right"> <div id="right">
<div id="chatarea"> <div id="chatarea">
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>CHAT</p>
<p>PIPPO</p>
</div> </div>
<div id="chatlist"> <div id="chatlist">
<p>user1</p> <p>user1</p>
......
...@@ -48,6 +48,7 @@ void SkyliveProtocol::startPlugin() ...@@ -48,6 +48,7 @@ void SkyliveProtocol::startPlugin()
std::cout << "SkyliveProtocol initialized in thread " << thread() << std::endl; std::cout << "SkyliveProtocol initialized in thread " << thread() << std::endl;
registerHandler((QString)"connectTelescopes", &SkyliveProtocol::handle_connect); registerHandler((QString)"connectTelescopes", &SkyliveProtocol::handle_connect);
registerHandler((QString)"putlogin", &SkyliveProtocol::handle_putlogin); registerHandler((QString)"putlogin", &SkyliveProtocol::handle_putlogin);
registerHandler((QString)"publicChatSend", &SkyliveProtocol::handle_publicsend);
//pktTimer = new QTimer(); //pktTimer = new QTimer();
//QObject::connect(pktTimer, SIGNAL(timeout()), this, SLOT(processPackets())); //QObject::connect(pktTimer, SIGNAL(timeout()), this, SLOT(processPackets()));
...@@ -138,9 +139,16 @@ void SkyliveProtocol::processPackets() ...@@ -138,9 +139,16 @@ void SkyliveProtocol::processPackets()
{ {
sendPacket("PONG", "NIL"); sendPacket("PONG", "NIL");
} }
if(pkt.cmd=="CPUBLIC") else if(pkt.cmd=="CPUBLIC")
{ {
QList<QString> paramlist = pkt.params.split(PARAM_SEPARATOR);
if(paramlist.size() > 1) // For safety
{
SKMessage pmsg("publicchatrcv");
pmsg.parameters.insert("username", QByteArray::fromPercentEncoding(paramlist[0].toLocal8Bit()));
pmsg.parameters.insert("msg", QByteArray::fromPercentEncoding(paramlist[1].toLocal8Bit()));
sendMessage(pmsg);
}
} }
else if(pkt.cmd=="CPRIVAT") else if(pkt.cmd=="CPRIVAT")
{ {
...@@ -149,6 +157,10 @@ void SkyliveProtocol::processPackets() ...@@ -149,6 +157,10 @@ void SkyliveProtocol::processPackets()
else if(pkt.cmd=="STATUS") else if(pkt.cmd=="STATUS")
{ {
}
else if(pkt.cmd=="ULIST")
{
} }
else if(pkt.cmd=="ENABLE") else if(pkt.cmd=="ENABLE")
{ {
...@@ -328,6 +340,19 @@ void SkyliveProtocol::handle_putlogin(SKMessage msg) ...@@ -328,6 +340,19 @@ void SkyliveProtocol::handle_putlogin(SKMessage msg)
} }
void SkyliveProtocol::handle_publicsend(SKMessage msg)
{
if(msg.parameters.size() > 0)
{
QString cmd("CPUBLIC");
QList<QString> paramlist;
QByteArray message(msg.parameters[0].toLocal8Bit());
paramlist.append(message.toPercentEncoding());
sendPacket(cmd, paramlist);
}
}
void SkyliveProtocol::clientConnected() void SkyliveProtocol::clientConnected()
{ {
SM_TCPCLIENT = CONNECTED; SM_TCPCLIENT = CONNECTED;
......
...@@ -108,6 +108,7 @@ class SkyliveProtocol : public QObject, SkylivexPluginInterface ...@@ -108,6 +108,7 @@ class SkyliveProtocol : public QObject, SkylivexPluginInterface
void registerHandler(QString type, SKHandlerFunction handler); void registerHandler(QString type, SKHandlerFunction handler);
void handle_connect(SKMessage msg); void handle_connect(SKMessage msg);
void handle_putlogin(SKMessage msg); void handle_putlogin(SKMessage msg);
void handle_publicsend(SKMessage msg);
void sendPacket(const char* cmd, const char* params); void sendPacket(const char* cmd, const char* params);
void sendPacket(QString &cmd, QString &params); void sendPacket(QString &cmd, QString &params);
void sendPacket(SKProtoMsg &pkt); void sendPacket(SKProtoMsg &pkt);
......
...@@ -60,8 +60,15 @@ MainWin::MainWin(QString &htmlfile) ...@@ -60,8 +60,15 @@ MainWin::MainWin(QString &htmlfile)
setAttribute(Qt::WA_OpaquePaintEvent, false); setAttribute(Qt::WA_OpaquePaintEvent, false);
setHtmlFile(htmlfile); setHtmlFile(htmlfile);
resize(250,200); resize(250,200);
//jsbridge.mwin=qobject_cast<MainWin *>(this);
//page()->mainFrame()->addToJavaScriptWindowObject("SkyliveX", &jsbridge);
jsbridge.mwin=qobject_cast<MainWin *>(this); jsbridge = new JSBridge();
jsbridge->mwin = qobject_cast<MainWin *>(this);
page()->mainFrame()->addToJavaScriptWindowObject("SkyliveX", jsbridge);
connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(refreshJsObject()));
registerHandler((QString)"coreStarted", (SKHandlerFunction)&MainWin::handle_corestarted); registerHandler((QString)"coreStarted", (SKHandlerFunction)&MainWin::handle_corestarted);
registerHandler((QString)"telescopeConnected", (SKHandlerFunction)&MainWin::handle_connected); registerHandler((QString)"telescopeConnected", (SKHandlerFunction)&MainWin::handle_connected);
...@@ -70,6 +77,10 @@ MainWin::MainWin(QString &htmlfile) ...@@ -70,6 +77,10 @@ MainWin::MainWin(QString &htmlfile)
registerHandler((QString)"notify", (SKHandlerFunction)&MainWin::handle_notify); registerHandler((QString)"notify", (SKHandlerFunction)&MainWin::handle_notify);
registerHandler((QString)"loginok", (SKHandlerFunction)&MainWin::handle_loginres); registerHandler((QString)"loginok", (SKHandlerFunction)&MainWin::handle_loginres);
registerHandler((QString)"loginfailed", (SKHandlerFunction)&MainWin::handle_loginres); registerHandler((QString)"loginfailed", (SKHandlerFunction)&MainWin::handle_loginres);
registerHandler((QString)"publicchatrcv", (SKHandlerFunction)&MainWin::handle_chatreceived);
} }
MainWin::~MainWin() MainWin::~MainWin()
...@@ -86,6 +97,15 @@ void MainWin::dragMoveEvent(QDragMoveEvent *ev) ...@@ -86,6 +97,15 @@ void MainWin::dragMoveEvent(QDragMoveEvent *ev)
} }
*/ */
void MainWin::refreshJsObject()
{
//page()->mainFrame()->addToJavaScriptWindowObject("SkyliveX", &jsbridge);
jsbridge = new JSBridge();
jsbridge->mwin = qobject_cast<MainWin *>(this);
page()->mainFrame()->addToJavaScriptWindowObject("SkyliveX", jsbridge);
}
void MainWin::setHtmlFile(QString &fname) void MainWin::setHtmlFile(QString &fname)
{ {
...@@ -93,8 +113,8 @@ void MainWin::setHtmlFile(QString &fname) ...@@ -93,8 +113,8 @@ void MainWin::setHtmlFile(QString &fname)
filename.open(QIODevice::ReadOnly); filename.open(QIODevice::ReadOnly);
htmlFileCont = QString::fromUtf8(filename.readAll().constData()); htmlFileCont = QString::fromUtf8(filename.readAll().constData());
setHtml(htmlFileCont, baseUrl); setHtml(htmlFileCont, baseUrl);
page()->mainFrame()->addToJavaScriptWindowObject("SkyliveX", &jsbridge); //page()->mainFrame()->addToJavaScriptWindowObject("SkyliveX", &jsbridge);
//jsbridge.mwin=qobject_cast<MainWin *>(this);
} }
void MainWin::setHtmlFile(QString &fname, bool borders, bool transparentbg) void MainWin::setHtmlFile(QString &fname, bool borders, bool transparentbg)
...@@ -184,20 +204,23 @@ void MainWin::handle_corestarted(SKMessage &msg) ...@@ -184,20 +204,23 @@ void MainWin::handle_corestarted(SKMessage &msg)
{ {
msg.handle = "connectTelescopes"; msg.handle = "connectTelescopes";
sendMessage(msg); sendMessage(msg);
jsbridge.notify("Connecting..."); //jsbridge.notify("Connecting...");
jsbridge->notify("Connecting...");
} }
void MainWin::handle_connected(SKMessage &msg) void MainWin::handle_connected(SKMessage &msg)
{ {
std::cout << "Connected by " << msg.sender.toStdString() << std::endl; std::cout << "Connected by " << msg.sender.toStdString() << std::endl;
jsbridge.notify("Connected"); //jsbridge.notify("Connected");
jsbridge->notify("Connected");
} }
void MainWin::handle_asklogin(SKMessage &msg) void MainWin::handle_asklogin(SKMessage &msg)
{ {
std::cout << "asklogin by " << msg.sender.toStdString() << std::endl; std::cout << "asklogin by " << msg.sender.toStdString() << std::endl;
jsbridge.notify("Logging in"); //jsbridge.notify("Logging in");
jsbridge->notify("Logging in");
QString html("gui/login.html"); QString html("gui/login.html");
setHtmlFile(html, true, false); setHtmlFile(html, true, false);
resize(250, 200); resize(250, 200);
...@@ -207,13 +230,15 @@ void MainWin::handle_asklogin(SKMessage &msg) ...@@ -207,13 +230,15 @@ void MainWin::handle_asklogin(SKMessage &msg)
void MainWin::handle_alert(SKMessage &msg) void MainWin::handle_alert(SKMessage &msg)
{ {
if(msg.parameters.contains("msg")) if(msg.parameters.contains("msg"))
jsbridge.alert(msg.parameters["msg"]); //jsbridge.alertmsg(msg.parameters["msg"]);
jsbridge->alertmsg(msg.parameters["msg"]);
} }
void MainWin::handle_notify(SKMessage &msg) void MainWin::handle_notify(SKMessage &msg)
{ {
if(msg.parameters.contains("msg")) if(msg.parameters.contains("msg"))
jsbridge.notify(msg.parameters["msg"]); //jsbridge.notify(msg.parameters["msg"]);
jsbridge->notify(msg.parameters["msg"]);
} }
void MainWin::handle_loginres(SKMessage &msg) void MainWin::handle_loginres(SKMessage &msg)
...@@ -231,6 +256,18 @@ void MainWin::handle_loginres(SKMessage &msg) ...@@ -231,6 +256,18 @@ void MainWin::handle_loginres(SKMessage &msg)
} }
} }
void MainWin::handle_chatreceived(SKMessage &msg)
{
if(msg.handle=="publicchatrcv")
{
if(msg.parameters.contains("msg") && msg.parameters.contains("username"))
{
//jsbridge.public_received(msg.parameters["username"], msg.parameters["msg"]);
jsbridge->public_received(msg.parameters["username"], msg.parameters["msg"]);
}
}
}
void JSBridge::changePageContent(QString elementid, QString content) void JSBridge::changePageContent(QString elementid, QString content)
{ {
......
...@@ -64,7 +64,8 @@ class JSBridge : public QObject ...@@ -64,7 +64,8 @@ class JSBridge : public QObject
signals: signals:
void changeContent(QString elementid, QString content); void changeContent(QString elementid, QString content);
void notify(QString content); void notify(QString content);
void alert(QString content); void alertmsg(QString content);
void public_received(QString user, QString content);
public slots: public slots:
void pushLogin(QString username, QString password); void pushLogin(QString username, QString password);
...@@ -88,7 +89,8 @@ class MainWin : public QWebView ...@@ -88,7 +89,8 @@ class MainWin : public QWebView
QUrl baseUrl; QUrl baseUrl;
QString htmlfile; QString htmlfile;
QString htmlFileCont; QString htmlFileCont;
JSBridge jsbridge; //JSBridge jsbridge;
JSBridge* jsbridge;
private: private:
QHash<QString, SKHandlerFunction> _handlers; QHash<QString, SKHandlerFunction> _handlers;
...@@ -107,9 +109,13 @@ class MainWin : public QWebView ...@@ -107,9 +109,13 @@ class MainWin : public QWebView
void handle_alert(SKMessage &msg); void handle_alert(SKMessage &msg);
void handle_notify(SKMessage &msg); void handle_notify(SKMessage &msg);
void handle_loginres(SKMessage &msg); void handle_loginres(SKMessage &msg);
void handle_chatreceived(SKMessage &msg);
void toggleBorders(bool borders); void toggleBorders(bool borders);
void toggleTransparentBackground(bool transparentbg); void toggleTransparentBackground(bool transparentbg);
private slots:
void refreshJsObject();
public slots: public slots:
void msgFromCore(SKMessage &msg); void msgFromCore(SKMessage &msg);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment