普通文本  |  67行  |  1.64 KB

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