Chromium Code Reviews| Index: remoting/signaling/push_notification_subscriber.cc |
| diff --git a/remoting/signaling/push_notification_subscriber.cc b/remoting/signaling/push_notification_subscriber.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..cc52bca2c336b15e678e5b1c9fd695758a832dd6 |
| --- /dev/null |
| +++ b/remoting/signaling/push_notification_subscriber.cc |
| @@ -0,0 +1,80 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "remoting/signaling/push_notification_subscriber.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| +#include "remoting/base/logging.h" |
| +#include "remoting/signaling/iq_sender.h" |
| +#include "remoting/signaling/jid_util.h" |
| +#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" |
| + |
| +namespace remoting { |
| + |
| +namespace { |
| + |
| +const char kNsGooglePush[] = "google:push"; |
|
Sergey Ulanov
2015/05/16 00:56:08
maybe call it kGooglePushNamespace?
John Williams
2015/05/16 02:10:06
Done.
|
| + |
| +} // namespace |
| + |
| +PushNotificationSubscriber::PushNotificationSubscriber( |
| + SignalStrategy* signal_strategy, |
| + const std::string& push_channel) |
| + : signal_strategy_(signal_strategy), push_channel_(push_channel) { |
| + signal_strategy_->AddListener(this); |
| +} |
| + |
| +PushNotificationSubscriber::~PushNotificationSubscriber() { |
| + signal_strategy_->RemoveListener(this); |
| +} |
| + |
| +void PushNotificationSubscriber::OnSignalStrategyStateChange( |
| + SignalStrategy::State state) { |
| + if (state == SignalStrategy::CONNECTED) { |
| + HOST_LOG << "Subscribing to push notifications on channel: " |
|
Sergey Ulanov
2015/05/16 00:56:08
I think this should be VLOG()
John Williams
2015/05/16 02:10:06
Done.
|
| + << push_channel_ << "."; |
| + |
| + std::string bare_jid; |
| + SplitJidResource(signal_strategy_->GetLocalJid(), &bare_jid, nullptr); |
| + |
| + // Build a subscription request. |
| + buzz::XmlElement* subscribe_element = |
| + new buzz::XmlElement(buzz::QName(kNsGooglePush, "subscribe")); |
| + buzz::XmlElement* item_element = |
| + new buzz::XmlElement(buzz::QName(kNsGooglePush, "item")); |
| + subscribe_element->AddElement(item_element); |
| + item_element->SetAttr(buzz::QName("", "channel"), push_channel_); |
|
Sergey Ulanov
2015/05/16 00:56:08
here and everywhere else: use std::string() instea
John Williams
2015/05/16 02:10:06
Done.
|
| + item_element->SetAttr(buzz::QName("", "from"), ""); |
| + |
| + // Send the request. |
| + iq_sender_.reset(new IqSender(signal_strategy_)); |
| + iq_request_ = iq_sender_->SendIq( |
| + "set", bare_jid, make_scoped_ptr(subscribe_element), |
| + base::Bind(&PushNotificationSubscriber::OnSubscriptionResult, |
| + base::Unretained(this))); |
| + } |
| +} |
| + |
| +bool PushNotificationSubscriber::OnSignalStrategyIncomingStanza( |
| + const buzz::XmlElement* stanza) { |
| + // Ignore all XMPP stanzas. |
| + return false; |
| +} |
| + |
| +void PushNotificationSubscriber::OnSubscriptionResult( |
| + IqRequest* request, |
| + const buzz::XmlElement* response) { |
| + std::string response_type = response->Attr(buzz::QName("", "type")); |
| + if (response_type != "result") { |
| + LOG(ERROR) << "Invalid response type for subscription: " << response_type; |
| + } |
| + |
| + // The IqSender and IqRequest are no longer needed after receiving a |
| + // reply to the subscription request. |
| + iq_request_.reset(); |
| + iq_sender_.reset(); |
| +} |
| + |
| +} // namespace remoting |