void MrimMessages::handleMessageAck(MrimPacket &packet) { quint32 msgId = 0, flags = 0; QString from, plainText; packet.readTo(msgId); packet.readTo(flags); bool isAuth = (flags & MESSAGE_FLAG_AUTHORIZE); bool isUnicode = !(flags & MESSAGE_FLAG_CP1251); #ifndef NO_RTF_SUPPORT bool hasRtf = (flags & MESSAGE_FLAG_RTF); #endif bool isTyping = (flags & MESSAGE_FLAG_NOTIFY); packet.readTo(&from); packet.readTo(&plainText, isUnicode); MrimContact *contact = p->conn.data()->account()->roster()->getContact(from, true); // FIXME: Add handling messages from contacts not from roster if (!contact) return; if (isTyping) { contact->updateComposingState(); return; } if (!isAuth && !(flags & MESSAGE_FLAG_NORECV)) { sendDeliveryReport(from, msgId); } Message message; message.setIncoming(true); message.setChatUnit(contact); message.setTime(QDateTime::currentDateTime()); message.setText(plainText); #ifndef NO_RTF_SUPPORT if (hasRtf) { QString rtfMsg; packet.readTo(&rtfMsg); QString html; p->rtf->parse(rtfMsg, &plainText, &html); message.setProperty("html", html); if (!plainText.trimmed().isEmpty()) message.setText(plainText); } #endif contact->clearComposingState(); if (isAuth) { QEvent *event = new Authorization::Reply(Authorization::Reply::New, contact, message.text()); qApp->postEvent(Authorization::service(), event); } else { ChatLayer::get(contact, true)->appendMessage(message); } }
bool MrimConnection::handlePacket(MrimPacket& packet) { bool handled = true; switch (packet.msgType()) { case MRIM_CS_HELLO_ACK: { quint32 pingTimeout = 0; packet.readTo(pingTimeout); if (p->pingTimer->isActive()) { p->pingTimer->stop(); } p->pingTimer->setInterval(pingTimeout*1000); login(); } break; case MRIM_CS_LOGIN_ACK: p->pingTimer->start(); p->account->setAccountStatus(p->status); emit loggedIn(); break; case MRIM_CS_LOGIN_REJ: { QString reason; packet.readTo(&reason); loginRejected(reason); } break; case MRIM_CS_LOGOUT: { quint32 reason = 0; packet.readTo(reason); if (reason == LOGOUT_NO_RELOGIN_FLAG) { NotificationRequest request(Notification::System); request.setObject(p->account); request.setText(tr("Another client with same login connected!")); request.send(); //TODO: do not relogin } } break; case MRIM_CS_CONNECTION_PARAMS: //do nothing break; default: handled = false; break; } return handled; }
void MrimMessages::handleMessageStatus(MrimPacket &packet) { quint32 status = 0; packet.readTo(status); QString errString; MsgIdLink *msgLink = p->msgIdLink.take(packet.sequence()); ChatSession *sess = msgLink ? ChatLayer::instance()->getSession(msgLink->unit.data()) : 0; bool delivered = false; switch (status) { case MESSAGE_DELIVERED: delivered = true; break; case MESSAGE_REJECTED_NOUSER: errString = tr("No such user"); break; case MESSAGE_REJECTED_TOO_LARGE: errString = tr("Message too large"); break; case MESSAGE_REJECTED_LIMIT_EXCEEDED: errString = tr("Limit exceeded"); break; case MESSAGE_REJECTED_DENY_OFFMSG: errString = tr("User denied receiving offline messages"); break; case MESSAGE_REJECTED_DENY_OFFFLSH: errString = tr("User denied receiving offline flash movies"); break; default: errString = tr("Internal error"); break; } if (sess) { QApplication::instance()->postEvent(sess, new MessageReceiptEvent(msgLink->msgId, delivered)); } if (!errString.isEmpty()) { errString.prepend(tr("Message was not delivered!")+"\n"); NotificationRequest request(Notification::System); request.setObject(p->conn.data()->account()); request.setText(errString); request.send(); } }
void MrimConnection::sendPacket(MrimPacket &packet) { packet.writeTo(p->IMSocket()); }