// 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