OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "google_apis/gcm/engine/mcs_client.h" | 5 #include "google_apis/gcm/engine/mcs_client.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 acked_outgoing_persistent_ids, | 763 acked_outgoing_persistent_ids, |
764 base::Bind(&MCSClient::OnGCMUpdateFinished, | 764 base::Bind(&MCSClient::OnGCMUpdateFinished, |
765 weak_ptr_factory_.GetWeakPtr())); | 765 weak_ptr_factory_.GetWeakPtr())); |
766 | 766 |
767 HandleServerConfirmedReceipt(last_stream_id_received); | 767 HandleServerConfirmedReceipt(last_stream_id_received); |
768 } | 768 } |
769 | 769 |
770 void MCSClient::HandleSelectiveAck(const PersistentIdList& id_list) { | 770 void MCSClient::HandleSelectiveAck(const PersistentIdList& id_list) { |
771 std::set<PersistentId> remaining_ids(id_list.begin(), id_list.end()); | 771 std::set<PersistentId> remaining_ids(id_list.begin(), id_list.end()); |
772 | 772 |
773 StreamId last_stream_id_received = -1; | 773 StreamId last_stream_id_received = 0; |
774 | 774 |
775 // First check the to_resend_ queue. Acknowledgments are always contiguous, | 775 // First check the to_resend_ queue. Acknowledgments are always contiguous, |
776 // so if there's a pending message that hasn't been acked, all newer messages | 776 // so if there's a pending message that hasn't been acked, all newer messages |
777 // must also be unacked. | 777 // must also be unacked. |
778 while(!to_resend_.empty() && !remaining_ids.empty()) { | 778 while(!to_resend_.empty() && !remaining_ids.empty()) { |
779 const MCSPacketInternal& outgoing_packet = to_resend_.front(); | 779 const MCSPacketInternal& outgoing_packet = to_resend_.front(); |
780 if (remaining_ids.count(outgoing_packet->persistent_id) == 0) | 780 if (remaining_ids.count(outgoing_packet->persistent_id) == 0) |
781 break; // Newer message must be unacked too. | 781 break; // Newer message must be unacked too. |
782 remaining_ids.erase(outgoing_packet->persistent_id); | 782 remaining_ids.erase(outgoing_packet->persistent_id); |
783 NotifyMessageSendStatus(*outgoing_packet->protobuf, SENT); | 783 NotifyMessageSendStatus(*outgoing_packet->protobuf, SENT); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 base::Bind(&MCSClient::OnGCMUpdateFinished, | 832 base::Bind(&MCSClient::OnGCMUpdateFinished, |
833 weak_ptr_factory_.GetWeakPtr())); | 833 weak_ptr_factory_.GetWeakPtr())); |
834 | 834 |
835 // Resend any remaining outgoing messages, as they were not received by the | 835 // Resend any remaining outgoing messages, as they were not received by the |
836 // server. | 836 // server. |
837 DVLOG(1) << "Resending " << to_resend_.size() << " messages."; | 837 DVLOG(1) << "Resending " << to_resend_.size() << " messages."; |
838 while (!to_resend_.empty()) { | 838 while (!to_resend_.empty()) { |
839 to_send_.push_front(to_resend_.back()); | 839 to_send_.push_front(to_resend_.back()); |
840 to_resend_.pop_back(); | 840 to_resend_.pop_back(); |
841 } | 841 } |
| 842 base::MessageLoop::current()->PostTask( |
| 843 FROM_HERE, |
| 844 base::Bind(&MCSClient::MaybeSendMessage, |
| 845 weak_ptr_factory_.GetWeakPtr())); |
842 } | 846 } |
843 | 847 |
844 void MCSClient::HandleServerConfirmedReceipt(StreamId device_stream_id) { | 848 void MCSClient::HandleServerConfirmedReceipt(StreamId device_stream_id) { |
845 PersistentIdList acked_incoming_ids; | 849 PersistentIdList acked_incoming_ids; |
846 for (std::map<StreamId, PersistentIdList>::iterator iter = | 850 for (std::map<StreamId, PersistentIdList>::iterator iter = |
847 acked_server_ids_.begin(); | 851 acked_server_ids_.begin(); |
848 iter != acked_server_ids_.end() && | 852 iter != acked_server_ids_.end() && |
849 iter->first <= device_stream_id;) { | 853 iter->first <= device_stream_id;) { |
850 acked_incoming_ids.insert(acked_incoming_ids.end(), | 854 acked_incoming_ids.insert(acked_incoming_ids.end(), |
851 iter->second.begin(), | 855 iter->second.begin(), |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 reinterpret_cast<mcs_proto::DataMessageStanza*>(packet->protobuf.get()); | 905 reinterpret_cast<mcs_proto::DataMessageStanza*>(packet->protobuf.get()); |
902 CollapseKey collapse_key(*data_message); | 906 CollapseKey collapse_key(*data_message); |
903 if (collapse_key.IsValid()) | 907 if (collapse_key.IsValid()) |
904 collapse_key_map_.erase(collapse_key); | 908 collapse_key_map_.erase(collapse_key); |
905 } | 909 } |
906 | 910 |
907 return packet; | 911 return packet; |
908 } | 912 } |
909 | 913 |
910 } // namespace gcm | 914 } // namespace gcm |
OLD | NEW |