Fix chat example (fixes #16).

This commit is contained in:
Nathan Osman
2017-04-04 17:34:23 -07:00
parent 8e13f1644a
commit 82a5043649
6 changed files with 42 additions and 49 deletions

View File

@@ -20,45 +20,34 @@
* IN THE SOFTWARE.
*/
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QVariantMap>
#include "apihandler.h"
QVariantMap ApiHandler::get_messages(const QVariantMap &query)
void ApiHandler::messages(QHttpSocket *socket)
{
// Ensure an index was supplied
if (!query.contains("index")) {
return QVariantMap();
}
QJsonObject object;
object.insert("messages", QJsonArray::fromStringList(mMessages));
socket->writeJson(QJsonDocument(object));
}
int index = query.value("index").toInt();
QVariantList messages;
// Construct a list of all messages with an index higher than the one
// that was provided as a parameter
if (index >= -1 && index < mMessages.count()) {
for (QStringList::const_iterator i = mMessages.constBegin() + index + 1;
i != mMessages.constEnd(); ++i) {
QVariantMap data;
data.insert("index", i - mMessages.constBegin());
data.insert("message", *i);
messages.append(data);
void ApiHandler::messagesNew(QHttpSocket *socket)
{
QJsonDocument document;
if (socket->readJson(document)) {
QVariantMap data = document.object().toVariantMap();
if (data.contains("message")) {
mMessages.append(data.value("message").toString());
socket->writeHeaders();
socket->close();
return;
}
}
// Return the list of messages
QVariantMap data;
data.insert("messages", messages);
return data;
}
QVariantMap ApiHandler::post_newMessage(const QVariantMap &query, const QVariantMap &params)
{
// Ensure that a valid message was supplied
if (!params.contains("message")) {
return QVariantMap();
}
// Add the new message to the list
mMessages.append(params.value("message").toString());
return QVariantMap();
// If execution reaches this point, malformed data was supplied
socket->writeError(QHttpSocket::BadRequest);
}

View File

@@ -23,19 +23,19 @@
#ifndef CHAT_APIHANDLER_H
#define CHAT_APIHANDLER_H
#include <QObject>
#include <QStringList>
#include <QVariantMap>
#include <QHttpEngine/QObjectHandler>
#include <QHttpEngine/QHttpSocket>
class ApiHandler : public QObjectHandler
class ApiHandler : public QObject
{
Q_OBJECT
public Q_SLOTS:
QVariantMap get_messages(const QVariantMap &query);
QVariantMap post_newMessage(const QVariantMap &query, const QVariantMap &params);
void messages(QHttpSocket *socket);
void messagesNew(QHttpSocket *socket);
private:

View File

@@ -30,6 +30,7 @@
#include <QHttpEngine/QFilesystemHandler>
#include <QHttpEngine/QHttpHandler>
#include <QHttpEngine/QHttpServer>
#include <QHttpEngine/QObjectHandler>
#include "apihandler.h"
@@ -66,7 +67,10 @@ int main(int argc, char * argv[])
QFilesystemHandler handler(":/static");
handler.addRedirect(QRegExp("^$"), "/index.html");
ApiHandler apiHandler;
ApiHandler renameMe;
QObjectHandler apiHandler;
apiHandler.registerMethod("messages", &renameMe, &ApiHandler::messages);
apiHandler.registerMethod("messages/new", &renameMe, &ApiHandler::messagesNew);
handler.addSubHandler(QRegExp("api/"), &apiHandler);
QHttpServer server(&handler);

View File

@@ -32,7 +32,7 @@ body {
padding: 4px;
}
.messages {
.container {
padding: 10px;
}

View File

@@ -13,10 +13,12 @@
<textarea id="input" placeholder="Type here and press enter..."></textarea>
</div>
<div class="messages">
<div class="container">
<div class="message system">
Greetings! Welcome to the QHttpEngine chat demo. Please type a message using the entry box below.
</div>
<div class="messages">
</div>
</div>
<div class="spacer"></div>

View File

@@ -1,25 +1,23 @@
$(function() {
var index = -1,
$document = $(document),
var $document = $(document),
$messages = $('.messages');
// Retrieve all messages after the specified index
function update() {
$.ajax({
url: '/api/messages',
data: {index: index},
contentType: 'application/json',
complete: function() {
window.setTimeout(update, 2000);
},
success: function(data) {
$.each(data.messages, function(i, e) {
$messages.empty();
$.each(data.messages, function() {
$('<div>')
.addClass('message')
.text(e.message)
.text(this)
.appendTo($messages);
index = e.index;
});
$document.scrollTop(10000);
}
@@ -30,10 +28,10 @@ $(function() {
// Find the message input box and set the appropriate handler for [enter]
var $input = $('#input').focus().keypress(function(e) {
if(e.which == 13) {
if(e.which === 13) {
$.ajax({
type: 'POST',
url: '/api/newMessage',
url: '/api/messages/new',
data: JSON.stringify({message: $(this).val()}),
contentType: 'application/json'
});