bool put_data::invoke(observer_ptr o) { if (m_done) { m_invoke_count = -1; return false; } // TODO: what if o is not an isntance of put_data_observer? This need to be // redesigned for better type saftey. put_data_observer* po = static_cast<put_data_observer*>(o.get()); entry e; e["y"] = "q"; e["q"] = "put"; entry& a = e["a"]; a["v"] = m_data.value(); a["token"] = po->m_token; if (m_data.is_mutable()) { a["k"] = std::string(m_data.pk().data(), item_pk_len); a["seq"] = m_data.seq(); a["sig"] = std::string(m_data.sig().data(), item_sig_len); if (!m_data.salt().empty()) { a["salt"] = m_data.salt(); } } return m_node.m_rpc.invoke(e, o->target_ep(), o); }
bool put_data::invoke(observer_ptr o) { if (m_done) return false; // TODO: what if o is not an instance of put_data_observer? This need to be // redesigned for better type safety. auto* po = static_cast<put_data_observer*>(o.get()); entry e; e["y"] = "q"; e["q"] = "put"; entry& a = e["a"]; a["v"] = m_data.value(); a["token"] = po->m_token; if (m_data.is_mutable()) { a["k"] = m_data.pk().bytes; a["seq"] = m_data.seq().value; a["sig"] = m_data.sig().bytes; if (!m_data.salt().empty()) { a["salt"] = m_data.salt(); } } m_node.stats_counters().inc_stats_counter(counters::dht_put_out); return m_node.m_rpc.invoke(e, o->target_ep(), o); }