// Copyright 2016 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.

#ifndef CONTENT_RENDERER_MEDIA_STREAM_SECURE_DISPLAY_LINK_TRACKER_H_
#define CONTENT_RENDERER_MEDIA_STREAM_SECURE_DISPLAY_LINK_TRACKER_H_

#include <algorithm>
#include <vector>

// Tracks all connected links (video sinks / tracks), and reports if they are
// all secure for video capturing.
template <typename T>
class SecureDisplayLinkTracker {
 public:
  SecureDisplayLinkTracker() {}
  ~SecureDisplayLinkTracker() {}

  void Add(T* link, bool is_link_secure);
  void Remove(T* link);
  void Update(T* link, bool is_link_secure);
  bool is_capturing_secure() const { return insecure_links_.empty(); }

 private:
  // Record every insecure links.
  std::vector<T*> insecure_links_;

  DISALLOW_COPY_AND_ASSIGN(SecureDisplayLinkTracker);
};

template <typename T>
void SecureDisplayLinkTracker<T>::Add(T* link, bool is_link_secure) {
  DCHECK(std::find(insecure_links_.begin(), insecure_links_.end(), link) ==
         insecure_links_.end());

  if (!is_link_secure)
    insecure_links_.push_back(link);
}

template <typename T>
void SecureDisplayLinkTracker<T>::Remove(T* link) {
  auto it = std::find(insecure_links_.begin(), insecure_links_.end(), link);
  if (it != insecure_links_.end())
    insecure_links_.erase(it);
}

template <typename T>
void SecureDisplayLinkTracker<T>::Update(T* link, bool is_link_secure) {
  auto it = std::find(insecure_links_.begin(), insecure_links_.end(), link);
  if (it != insecure_links_.end()) {
    if (is_link_secure)
      insecure_links_.erase(it);
    return;
  }
  Add(link, is_link_secure);
}

#endif  // CONTENT_RENDERER_MEDIA_STREAM_SECURE_DISPLAY_LINK_TRACKER_H_
