Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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();
    }
}
Ejemplo n.º 4
0
void MrimConnection::sendPacket(MrimPacket &packet)
{
    packet.writeTo(p->IMSocket());
}