Index: remoting/protocol/jingle_session.cc |
diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc |
index 49b1f13deeaa98a3ed24c3ae1e95c1972fdc313d..f3d96a2994846c0b285b4d943c56a0f90264d68d 100644 |
--- a/remoting/protocol/jingle_session.cc |
+++ b/remoting/protocol/jingle_session.cc |
@@ -25,6 +25,7 @@ |
#include "remoting/protocol/transport.h" |
#include "remoting/signaling/iq_sender.h" |
#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" |
+#include "third_party/webrtc/libjingle/xmpp/constants.h" |
#include "third_party/webrtc/p2p/base/candidate.h" |
using buzz::XmlElement; |
@@ -220,9 +221,12 @@ void JingleSession::SendTransportInfo( |
peer_address_, JingleMessage::TRANSPORT_INFO, session_id_)); |
message->transport_info = std::move(transport_info); |
+ std::unique_ptr<buzz::XmlElement> stanza = message->ToXml(); |
+ stanza->AddAttr(buzz::QN_ID, message_queue_.GetNextOutgoingId()); |
+ |
auto request = session_manager_->iq_sender()->SendIq( |
- message->ToXml(), base::Bind(&JingleSession::OnTransportInfoResponse, |
- base::Unretained(this))); |
+ std::move(stanza), base::Bind(&JingleSession::OnTransportInfoResponse, |
+ base::Unretained(this))); |
if (request) { |
request->SetTimeout(base::TimeDelta::FromSeconds(kTransportInfoTimeout)); |
transport_info_requests_.push_back(std::move(request)); |
@@ -283,9 +287,12 @@ void JingleSession::Close(protocol::ErrorCode error) { |
void JingleSession::SendMessage(std::unique_ptr<JingleMessage> message) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ std::unique_ptr<buzz::XmlElement> stanza = message->ToXml(); |
+ stanza->AddAttr(buzz::QN_ID, message_queue_.GetNextOutgoingId()); |
+ |
auto request = session_manager_->iq_sender()->SendIq( |
- message->ToXml(), base::Bind(&JingleSession::OnMessageResponse, |
- base::Unretained(this), message->action)); |
+ std::move(stanza), base::Bind(&JingleSession::OnMessageResponse, |
+ base::Unretained(this), message->action)); |
int timeout = kDefaultMessageTimeout; |
if (message->action == JingleMessage::SESSION_INITIATE || |
@@ -369,8 +376,22 @@ void JingleSession::OnTransportInfoResponse(IqRequest* request, |
} |
} |
-void JingleSession::OnIncomingMessage(std::unique_ptr<JingleMessage> message, |
+void JingleSession::OnIncomingMessage(std::string id, |
+ std::unique_ptr<JingleMessage> message, |
const ReplyCallback& reply_callback) { |
+ std::unique_ptr<QueueItem> item( |
+ new QueueItem(std::move(message), reply_callback)); |
+ std::list<std::unique_ptr<QueueItem>> ordered = |
+ message_queue_.OnIncomingMessage(id, std::move(item)); |
+ for (auto it = ordered.begin(); it != ordered.end(); it++) { |
+ OnIncomingMessageInOrder(std::move(it->get()->message), |
+ it->get()->reply_callback); |
+ } |
+} |
+ |
+void JingleSession::OnIncomingMessageInOrder( |
+ std::unique_ptr<JingleMessage> message, |
+ const ReplyCallback& reply_callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (peer_address_ != message->from) { |
@@ -609,5 +630,11 @@ bool JingleSession::is_session_active() { |
state_ == AUTHENTICATING || state_ == AUTHENTICATED; |
} |
+JingleSession::QueueItem::QueueItem(std::unique_ptr<JingleMessage> message, |
+ const ReplyCallback& reply_callback) |
+ : message(std::move(message)), reply_callback(reply_callback) {} |
+ |
+JingleSession::QueueItem::~QueueItem() {} |
+ |
} // namespace protocol |
} // namespace remoting |