Exemple #1
0
qint64 Session::recomposeAndSendQuery(Query *q) {
    if(!q)
        return 0;

    qCDebug(TG_CORE_SESSION) << "Resending query with previous msgId" << QString::number(q->msgId(), 16);
    q->setMsgId(encryptSendMessage((qint32 *)q->data(), q->dataLength(), 1));
    q->setSeqNo(m_seqNo - 1);
    qCDebug(TG_CORE_SESSION) << "new msgId is" << QString::number(q->msgId(), 16);
    q->setAcked(false);
    m_pendingQueries.insert(q->msgId(), q);
    return q->msgId();
}
Exemple #2
0
void Session::resendQuery(Query *q) {
    Q_ASSERT(q);
    //avoid resending if resend numbers is less than zero
    if (q->decreaseResends() < 0) {
        qCDebug(TG_CORE_SESSION) << "Max resend numbers reached for query with msgId" << QString::number(q->msgId(), 16) << ",query discarded";
        m_pendingQueries.remove(q->msgId());
        delete q;
    } else {
        qCDebug(TG_CORE_SESSION) << "Resending query with msgId" << QString::number(q->msgId(), 16);
        OutboundPkt p(mSettings);
        p.appendInt(TL_MsgContainer);
        p.appendInt(1);
        p.appendLong(q->msgId());
        p.appendInt(q->seqNo());
        p.appendInt(4 * q->dataLength());
        p.appendInts((qint32 *)q->data(), q->dataLength());
        encryptSendMessage(p.buffer(), p.length(), 0);
    }
}
//### query management
qint64 Session::sendQuery(OutboundPkt &outboundPkt, QueryMethods *methods, const QVariant &extra, const QString &name) {
    Q_ASSERT (m_sessionId);
    Q_ASSERT (m_dc->authKeyId());
    qint32 *data = outboundPkt.buffer();
    qint32 ints = outboundPkt.length();

    qCDebug(TG_CORE_SESSION) << "Sending query of size" << 4 * ints << "to DC" << m_dc->id() << "at" << peerName() << ":" << peerPort() << "by session" << QString::number(m_sessionId, 16);

    Query *q = new Query(this);
    q->setData(data, ints);
    q->setMsgId(encryptSendMessage(data, ints, 1));
    q->setSeqNo(m_seqNo - 1);
    qCDebug(TG_CORE_SESSION) << "msgId is" << QString::number(q->msgId(), 16);
    q->setMethods(methods);
    q->setAcked(false);
    q->setExtra(extra);
    q->setName(name);

    if (mSettings->resendQueries()) {
        connect(q, SIGNAL(timeout(Query*)), this, SLOT(resendQuery(Query*)), Qt::UniqueConnection);
        q->startTimer(QUERY_TIMEOUT);
    }
Exemple #4
0
//### query management
qint64 Session::sendQuery(OutboundPkt &outboundPkt, QueryMethods *methods, const QVariant &extra, const QString &name) {
    Q_ASSERT (m_sessionId);
    Q_ASSERT (m_dc->authKeyId());
    qint32 *data = outboundPkt.buffer();
    qint32 ints = outboundPkt.length();

    // prepend init connection header to outboundPkt if initConnectionNeeded
    // Note: 'wrap' needs to be declare outside of if to persist until encriptSendMessage is completed
    OutboundPkt wrap(mSettings);
    if (m_initConnectionNeeded) {
        wrap.initConnection();
        wrap.appendOutboundPkt(outboundPkt);
        data = wrap.buffer();
        ints = wrap.length();
        m_initConnectionNeeded = false;
    }

    qCDebug(TG_CORE_SESSION) << "Sending query of size" << 4 * ints << "to DC" << m_dc->id() << "at" << peerName() << ":" << peerPort() << "by session" << QString::number(m_sessionId, 16);

    Query *q = new Query(this);
    q->setData(data, ints);
    q->setMsgId(encryptSendMessage(data, ints, 1));
    q->setMainMsgId(q->msgId());
    q->setSeqNo(m_seqNo - 1);
    qCDebug(TG_CORE_SESSION) << "msgId is" << QString::number(q->msgId(), 16);
    q->setMethods(methods);
    q->setAcked(false);
    q->setExtra(extra);
    q->setName(name);

    if (mSettings->resendQueries()) {
        connect(q, &Query::timeout, this, &Session::resendQuery, Qt::UniqueConnection);
        q->startTimer(QUERY_TIMEOUT);
    }

    m_pendingQueries.insert(q->msgId(), q);

    return q->msgId();
}
Exemple #5
0
}

void Session::ackAll() {
    sendAcks(m_pendingAcks.keys());
}

void Session::sendAcks(const QList<qint64> &msgIds) {
    // verify that socket is connected. Don't send acks if state is other than connected.
    // In case the socket is not connected, pending acks will be sent when socket is
    // connected back again.
    if (state() != QAbstractSocket::ConnectedState) {
        return;
    }
    OutboundPkt p(mSettings);
    p.appendInt(TL_MsgsAck);
    p.appendInt(CoreTypes::typeVector);
    int n = msgIds.length();
    p.appendInt(n);
    Q_FOREACH (qint64 msgId, msgIds) {
        p.appendLong(msgId);
        qCDebug(TG_CORE_SESSION) << "Ack for msgId" << msgId;
        EventTimer* t = m_pendingAcks.take(msgId);
        if (t) {
            t->stop();
            delete t;
        }
    }
    qint64 sentAcksId = encryptSendMessage(p.buffer(), p.length(), 0);
    qCDebug(TG_CORE_SESSION) << "Sent Acks with id:" << QString::number(sentAcksId, 16);
}