コード例 #1
0
ファイル: Overlay.cpp プロジェクト: RoPe93/Dissent
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;
}
コード例 #2
0
ファイル: Round.hpp プロジェクト: ranzhao1/Dissent-1
 /**
  * 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;
 }
コード例 #3
0
ファイル: RelayForwarder.cpp プロジェクト: benjaminp/Dissent
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());
    }
}
コード例 #4
0
ファイル: RelayForwarder.cpp プロジェクト: benjaminp/Dissent
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;
}
コード例 #5
0
ファイル: BulkRound.cpp プロジェクト: applsdev/Dissent
  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();
    }
  }
コード例 #6
0
ファイル: BulkRound.cpp プロジェクト: applsdev/Dissent
  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();
  }
コード例 #7
0
ファイル: RelayForwarder.cpp プロジェクト: benjaminp/Dissent
void RelayForwarder::IncomingData(const Request &notification)
{
    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);
    }
}
コード例 #8
0
ファイル: Filter.hpp プロジェクト: ASchurman/Dissent
 inline virtual void HandleData(const QSharedPointer<ISender> &,
     const QByteArray &data)
 {
   PushData(GetSharedPointer(), data);
 }
コード例 #9
0
ファイル: Round.cpp プロジェクト: Orange9/Dissent
 void Round::PushData(int uid, const QByteArray &data)
 {
   GetBuddyMonitor()->SetActiveNym(uid);
   PushData(GetSharedPointer(), data);
 }