void QMQTT::ClientPrivate::onNetworkReceived(const QMQTT::Frame& frm) { QMQTT::Frame frame(frm); quint8 qos = 0; bool retain, dup; QString topic; quint16 mid = 0; quint8 header = frame.header(); quint8 type = GETTYPE(header); Message message; switch(type) { case CONNACK: frame.readChar(); handleConnack(frame.readChar()); break; case PUBLISH: qos = GETQOS(header); retain = GETRETAIN(header); dup = GETDUP(header); topic = frame.readString(); if( qos > QOS0) { mid = frame.readInt(); } message.setId(mid); message.setTopic(topic); message.setPayload(frame.data()); message.setQos(qos); message.setRetain(retain); message.setDup(dup); handlePublish(message); break; case PUBACK: case PUBREC: case PUBREL: case PUBCOMP: mid = frame.readInt(); handlePuback(type, mid); break; case SUBACK: mid = frame.readInt(); qos = frame.readChar(); // todo: send a subscribed signal (only in certain cases? mid? qos?) break; case UNSUBACK: // todo: send an unsubscribed signal (only certain cases? mid?) break; case PINGRESP: // todo: I know I'm suppose to do something with this. Look at specifications. break; default: break; } }
//--------------------------------------------- //--------------------------------------------- void Client::onReceived(Frame &frame) { quint8 qos = 0; bool retain, dup; QString topic; quint16 mid = 0; quint8 header = frame.header(); quint8 type = GETTYPE(header); Message message; qCDebug(client, "handleFrame: type=%d", type); switch(type) { case CONNACK: //skip reserved frame.readChar(); handleConnack(frame.readChar()); break; case PUBLISH: qos = GETQOS(header);; retain = GETRETAIN(header); dup = GETDUP(header); topic = frame.readString(); if( qos > MQTT_QOS0) { mid = frame.readInt(); } message.setId(mid); message.setTopic(topic); message.setPayload(frame.data()); message.setQos(qos); message.setRetain(retain); message.setDup(dup); handlePublish(message); break; case PUBACK: case PUBREC: case PUBREL: case PUBCOMP: mid = frame.readInt(); handlePuback(type, mid); break; case SUBACK: mid = frame.readInt(); qos = frame.readChar(); emit subacked(mid, qos); break; case UNSUBACK: emit unsubacked(mid); break; case PINGRESP: emit pong(); break; default: break; } }