|  | // Copyright 2015 The Weave 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 "src/notification/pull_channel.h" | 
|  |  | 
|  | #include <base/bind.h> | 
|  | #include <base/location.h> | 
|  | #include <weave/provider/task_runner.h> | 
|  |  | 
|  | #include "src/notification/notification_delegate.h" | 
|  |  | 
|  | namespace weave { | 
|  |  | 
|  | const char kPullChannelName[] = "pull"; | 
|  |  | 
|  | PullChannel::PullChannel(base::TimeDelta pull_interval, | 
|  | provider::TaskRunner* task_runner) | 
|  | : pull_interval_{pull_interval}, task_runner_{task_runner} {} | 
|  |  | 
|  | std::string PullChannel::GetName() const { | 
|  | return kPullChannelName; | 
|  | } | 
|  |  | 
|  | bool PullChannel::IsConnected() const { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | void PullChannel::AddChannelParameters(base::DictionaryValue* channel_json) { | 
|  | // No extra parameters needed for "Pull" channel. | 
|  | } | 
|  |  | 
|  | void PullChannel::Start(NotificationDelegate* delegate) { | 
|  | CHECK(delegate); | 
|  | delegate_ = delegate; | 
|  | RePost(); | 
|  | } | 
|  |  | 
|  | void PullChannel::RePost() { | 
|  | CHECK(delegate_); | 
|  | weak_ptr_factory_.InvalidateWeakPtrs(); | 
|  | task_runner_->PostDelayedTask( | 
|  | FROM_HERE, | 
|  | base::Bind(&PullChannel::OnTimer, weak_ptr_factory_.GetWeakPtr()), | 
|  | pull_interval_); | 
|  | } | 
|  |  | 
|  | void PullChannel::Stop() { | 
|  | weak_ptr_factory_.InvalidateWeakPtrs(); | 
|  | delegate_ = nullptr; | 
|  | } | 
|  |  | 
|  | void PullChannel::UpdatePullInterval(base::TimeDelta pull_interval) { | 
|  | pull_interval_ = pull_interval; | 
|  | if (delegate_) | 
|  | RePost(); | 
|  | } | 
|  |  | 
|  | void PullChannel::OnTimer() { | 
|  | // Repost before delegate notification to give it a chance to stop channel. | 
|  | RePost(); | 
|  | base::DictionaryValue empty_dict; | 
|  | delegate_->OnCommandCreated(empty_dict, GetName()); | 
|  | } | 
|  |  | 
|  | }  // namespace weave |