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(); }
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); }
//### 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(); }
} 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); }