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 "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 DCHECK_EQ(CONNECTING, state_); | 529 DCHECK_EQ(CONNECTING, state_); |
530 mcs_proto::LoginResponse* login_response = | 530 mcs_proto::LoginResponse* login_response = |
531 reinterpret_cast<mcs_proto::LoginResponse*>(protobuf.get()); | 531 reinterpret_cast<mcs_proto::LoginResponse*>(protobuf.get()); |
532 DVLOG(1) << "Received login response:"; | 532 DVLOG(1) << "Received login response:"; |
533 DVLOG(1) << " Id: " << login_response->id(); | 533 DVLOG(1) << " Id: " << login_response->id(); |
534 DVLOG(1) << " Timestamp: " << login_response->server_timestamp(); | 534 DVLOG(1) << " Timestamp: " << login_response->server_timestamp(); |
535 if (login_response->has_error() && login_response->error().code() != 0) { | 535 if (login_response->has_error() && login_response->error().code() != 0) { |
536 state_ = UNINITIALIZED; | 536 state_ = UNINITIALIZED; |
537 DVLOG(1) << " Error code: " << login_response->error().code(); | 537 DVLOG(1) << " Error code: " << login_response->error().code(); |
538 DVLOG(1) << " Error message: " << login_response->error().message(); | 538 DVLOG(1) << " Error message: " << login_response->error().message(); |
| 539 LOG(ERROR) << "Failed to log in to GCM, resetting connection."; |
| 540 connection_factory_->SignalConnectionReset( |
| 541 ConnectionFactory::LOGIN_FAILURE); |
539 mcs_error_callback_.Run(); | 542 mcs_error_callback_.Run(); |
540 return; | 543 return; |
541 } | 544 } |
542 | 545 |
543 if (login_response->has_heartbeat_config()) { | 546 if (login_response->has_heartbeat_config()) { |
544 heartbeat_manager_.UpdateHeartbeatConfig( | 547 heartbeat_manager_.UpdateHeartbeatConfig( |
545 login_response->heartbeat_config()); | 548 login_response->heartbeat_config()); |
546 } | 549 } |
547 | 550 |
548 state_ = CONNECTED; | 551 state_ = CONNECTED; |
(...skipping 30 matching lines...) Expand all Loading... |
579 MCSMessage(kHeartbeatAckTag, mcs_proto::HeartbeatAck())); | 582 MCSMessage(kHeartbeatAckTag, mcs_proto::HeartbeatAck())); |
580 return; | 583 return; |
581 case kHeartbeatAckTag: | 584 case kHeartbeatAckTag: |
582 DCHECK_GE(stream_id_in_, 1U); | 585 DCHECK_GE(stream_id_in_, 1U); |
583 DVLOG(1) << "Received heartbeat ack."; | 586 DVLOG(1) << "Received heartbeat ack."; |
584 // Do nothing else, all messages act as heartbeat acks. | 587 // Do nothing else, all messages act as heartbeat acks. |
585 return; | 588 return; |
586 case kCloseTag: | 589 case kCloseTag: |
587 LOG(ERROR) << "Received close command, resetting connection."; | 590 LOG(ERROR) << "Received close command, resetting connection."; |
588 state_ = LOADED; | 591 state_ = LOADED; |
589 connection_factory_->SignalConnectionReset(); | 592 connection_factory_->SignalConnectionReset( |
| 593 ConnectionFactory::CLOSE_COMMAND); |
590 return; | 594 return; |
591 case kIqStanzaTag: { | 595 case kIqStanzaTag: { |
592 DCHECK_GE(stream_id_in_, 1U); | 596 DCHECK_GE(stream_id_in_, 1U); |
593 mcs_proto::IqStanza* iq_stanza = | 597 mcs_proto::IqStanza* iq_stanza = |
594 reinterpret_cast<mcs_proto::IqStanza*>(protobuf.get()); | 598 reinterpret_cast<mcs_proto::IqStanza*>(protobuf.get()); |
595 const mcs_proto::Extension& iq_extension = iq_stanza->extension(); | 599 const mcs_proto::Extension& iq_extension = iq_stanza->extension(); |
596 switch (iq_extension.id()) { | 600 switch (iq_extension.id()) { |
597 case kSelectiveAck: { | 601 case kSelectiveAck: { |
598 PersistentIdList acked_ids; | 602 PersistentIdList acked_ids; |
599 if (BuildPersistentIdListFromProto(iq_extension.data(), | 603 if (BuildPersistentIdListFromProto(iq_extension.data(), |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 acked_incoming_ids, | 734 acked_incoming_ids, |
731 base::Bind(&MCSClient::OnGCMUpdateFinished, | 735 base::Bind(&MCSClient::OnGCMUpdateFinished, |
732 weak_ptr_factory_.GetWeakPtr())); | 736 weak_ptr_factory_.GetWeakPtr())); |
733 } | 737 } |
734 | 738 |
735 MCSClient::PersistentId MCSClient::GetNextPersistentId() { | 739 MCSClient::PersistentId MCSClient::GetNextPersistentId() { |
736 return base::Uint64ToString(base::TimeTicks::Now().ToInternalValue()); | 740 return base::Uint64ToString(base::TimeTicks::Now().ToInternalValue()); |
737 } | 741 } |
738 | 742 |
739 void MCSClient::OnConnectionResetByHeartbeat() { | 743 void MCSClient::OnConnectionResetByHeartbeat() { |
740 connection_factory_->SignalConnectionReset(); | 744 connection_factory_->SignalConnectionReset( |
| 745 ConnectionFactory::HEARTBEAT_FAILURE); |
741 } | 746 } |
742 | 747 |
743 void MCSClient::NotifyMessageSendStatus( | 748 void MCSClient::NotifyMessageSendStatus( |
744 const google::protobuf::MessageLite& protobuf, | 749 const google::protobuf::MessageLite& protobuf, |
745 MessageSendStatus status) { | 750 MessageSendStatus status) { |
746 if (GetMCSProtoTag(protobuf) != kDataMessageStanzaTag) | 751 if (GetMCSProtoTag(protobuf) != kDataMessageStanzaTag) |
747 return; | 752 return; |
748 | 753 |
749 const mcs_proto::DataMessageStanza* data_message_stanza = | 754 const mcs_proto::DataMessageStanza* data_message_stanza = |
750 reinterpret_cast<const mcs_proto::DataMessageStanza*>(&protobuf); | 755 reinterpret_cast<const mcs_proto::DataMessageStanza*>(&protobuf); |
751 message_sent_callback_.Run( | 756 message_sent_callback_.Run( |
752 data_message_stanza->device_user_id(), | 757 data_message_stanza->device_user_id(), |
753 data_message_stanza->category(), | 758 data_message_stanza->category(), |
754 data_message_stanza->id(), | 759 data_message_stanza->id(), |
755 status); | 760 status); |
756 } | 761 } |
757 | 762 |
758 void MCSClient::SetGCMStoreForTesting(GCMStore* gcm_store) { | 763 void MCSClient::SetGCMStoreForTesting(GCMStore* gcm_store) { |
759 gcm_store_ = gcm_store; | 764 gcm_store_ = gcm_store; |
760 } | 765 } |
761 | 766 |
762 } // namespace gcm | 767 } // namespace gcm |
OLD | NEW |