QSharedPointer<Messaging::ISender> Overlay::GetSender(const Connections::Id &to) { QSharedPointer<Messaging::ISender> sender = GetConnectionTable().GetConnection(to); if(!sender) { sender = QSharedPointer<Messaging::ISender>( new Connections::ForwardingSender(GetSharedPointer(), GetId(), to)); } return sender; }
/** * Used to process background events in CPU / I/O heavy portions * of the code. * @returns true if processing should continue, false if the round * is stopped */ inline bool ProcessEvents() { // Safe way to ensure the round doesn't close on us unexpectedly QSharedPointer<Round> round = GetSharedPointer(); QCoreApplication::processEvents(); QCoreApplication::sendPostedEvents(); bool stopped = round->Stopped(); return !stopped; }
void RelayForwarder::Send(const Id &to, const QByteArray &data, const QStringList &been) { if(to == _local_id) { _rpc->HandleData(QSharedPointer<ISender>( new ForwardingSender(GetSharedPointer(), _local_id, _local_id)), data); return; } if(been.isEmpty() || !Reverse(to, data, QStringList(), been)) { Forward(to, data, QStringList()); } }
QSharedPointer<RelayForwarder::ISender> RelayForwarder::GetSender(const Id &to) { QSharedPointer<ForwardingSender> *psender = _cache.take(to); if(!psender) { psender = new QSharedPointer<ForwardingSender>( new ForwardingSender(GetSharedPointer(), _local_id, to)); } QSharedPointer<ForwardingSender> sender(*psender); _cache.insert(to, psender); return sender; }
void BulkRound::ProcessMessages() { int size = _descriptors.size(); int index = 0; for(int idx = 0; idx < size; idx++) { QByteArray cleartext = ProcessMessage(idx, index); _cleartexts.append(cleartext); if(!cleartext.isEmpty()) { PushData(GetSharedPointer(), cleartext); } index += _descriptors[idx].Length(); } }
void BulkRound::HandleAggregatedBulkData(QDataStream &stream, const Id &from) { if(from == GetLocalId()) { return; } qDebug() << GetGroup().GetIndex(GetLocalId()) << GetLocalId().ToString() << ": received aggregated bulk data from " << GetGroup().GetIndex(from) << from.ToString(); if(GetGroup().GetLeader() != from) { throw QRunTimeError("Received aggregated bulk data from non-leader."); } if(_state != ReceivingLeaderData) { throw QRunTimeError("Not expected at this time."); } QVector<QByteArray> cleartexts; stream >> cleartexts; const QVector<Descriptor> &des = GetDescriptors(); if(cleartexts.count() != des.count()) { throw QRunTimeError("Cleartext count does not match descriptor count: " + QString::number(cleartexts.count()) + " " + QString::number(des.count())); } Hash hashalgo; for(int idx = 0; idx < cleartexts.count(); idx++) { QByteArray cleartext = cleartexts[idx]; QByteArray hash = hashalgo.ComputeHash(cleartext); if(hash != des[idx].CleartextHash()) { throw QRunTimeError("Cleartext hash does not match descriptor hash."); } if(!cleartext.isEmpty()) { PushData(GetSharedPointer(), cleartext); } } Finish(); }
void RelayForwarder::IncomingData(const Request ¬ification) { QVariantHash msg = notification.GetData().toHash(); Id destination = Id(msg.value("to").toString()); if(destination == Id::Zero()) { qWarning() << "Received a forwarded message without a destination."; return; } QStringList been = msg.value("been").toStringList(); if(destination == _local_id) { if(been.size() == 0) { qWarning() << "Received a forwarded message without any history."; return; } Id source = Id(been[0]); if(source == Id::Zero()) { qWarning() << "Received a forwarded message without a valid source."; } QSharedPointer<ForwardingSender> *psender = _cache.take(source); if(!psender || (*psender)->GetReverse().isEmpty()) { if(psender) { delete psender; } psender = new QSharedPointer<ForwardingSender>( new ForwardingSender(GetSharedPointer(), _local_id, source, been)); } QSharedPointer<ForwardingSender> sender(*psender); _cache.insert(source, psender); _rpc->HandleData(sender, msg.value("data").toByteArray()); return; } QStringList reverse = msg.value("reverse").toStringList(); QByteArray data = msg.value("data").toByteArray(); if(reverse.isEmpty() || !Reverse(destination, data, been, reverse)) { Forward(destination, data, been); } }
inline virtual void HandleData(const QSharedPointer<ISender> &, const QByteArray &data) { PushData(GetSharedPointer(), data); }
void Round::PushData(int uid, const QByteArray &data) { GetBuddyMonitor()->SetActiveNym(uid); PushData(GetSharedPointer(), data); }