пятница, октября 26, 2012

QT QML WebSocket + SocketIO

Так вышло, что практически все попытки работать в с++ с websocket и socketio в частности базируются на библиотеке websocket++. На её базе есть клиент для socket.io. Есть даже врапер для websocket++ в qt.
У имеющихся решений есть одна, но весьма важная проблема , которой уже 7 месяцев и решения её пока нет. В мастер ветке  websocket++ ивент луп boost::asio::io_service запрятан в глубь библиотеки и где-то в этой глубине что-то явно не так :)
Между тем старая (0.1) версия websocket++ этой проблемы лишена и работает достаточно стабильно - именно её я взял за основу.
В итоге есть очень легковесная реализация SocketIO на qml + js работающая поверх с++ websocket, экспортируемого в qml.

Что в итоге:
import QtQuick 1.1
import "." as Elem

Rectangle {
    function newsHandler(body) {
        console.log('We have news', JSON.stringify(body));
        socket.emit('my other event', 'hello man!');
    }

    width: 360
    height: 360

    MouseArea {
        anchors.fill: parent
        onClicked: {
            socket.connect();
        }
    }

    Elem.SocketIO {
        id: socket
        uri: 'ws://localhost:8080'
        Component.onCompleted: {
            registerEvent('news', newsHandler);
        }
    }
}

понедельник, октября 22, 2012

Qt QML User-Agent

Работая над qGNA нам потребовалось менять user-agent в QML части приложения. Как оказалось из коробки это не работает (QTBUG-20473) и разработчики не считают нужным эту проблему исправлять. Решение через это не работает для XMLHttpRequest в qml. Однако вот такое небольшое решение эту проблему помогает обойти:

var xhr = new XMLHttpRequest();
xhr.setRequestHeader('QtBug', 'QTBUG-20473\r\nUser-Agent: ' + yourUserAgent);