10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright 2012 Google Inc.
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Author: thorcarpenter@google.com (Thor Carpenter)
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Defines variant class ScreencastId that combines WindowId and DesktopId.
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_MEDIA_BASE_SCREENCASTID_H_
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_MEDIA_BASE_SCREENCASTID_H_
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string>
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/window.h"
132a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/windowpicker.h"
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass ScreencastId;
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<ScreencastId> ScreencastIdList;
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Used for identifying a window or desktop to be screencast.
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass ScreencastId {
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  enum Type { INVALID, WINDOW, DESKTOP };
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Default constructor indicates invalid ScreencastId.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ScreencastId() : type_(INVALID) {}
272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  explicit ScreencastId(const rtc::WindowId& id)
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : type_(WINDOW), window_(id) {
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  explicit ScreencastId(const rtc::DesktopId& id)
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : type_(DESKTOP), desktop_(id) {
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Type type() const { return type_; }
352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  const rtc::WindowId& window() const { return window_; }
362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  const rtc::DesktopId& desktop() const { return desktop_; }
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Title is an optional parameter.
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string& title() const { return title_; }
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_title(const std::string& desc) { title_ = desc; }
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsValid() const {
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (type_ == INVALID) {
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (type_ == WINDOW) {
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return window_.IsValid();
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return desktop_.IsValid();
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsWindow() const { return type_ == WINDOW; }
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsDesktop() const { return type_ == DESKTOP; }
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool EqualsId(const ScreencastId& other) const {
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (type_ != other.type_) {
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (type_ == INVALID) {
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return true;
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (type_ == WINDOW) {
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return window_.Equals(other.window());
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return desktop_.Equals(other.desktop());
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // T is assumed to be WindowDescription or DesktopDescription.
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  template<class T>
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static cricket::ScreencastIdList Convert(const std::vector<T>& list) {
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ScreencastIdList screencast_list;
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    screencast_list.reserve(list.size());
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (typename std::vector<T>::const_iterator it = list.begin();
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         it != list.end(); ++it) {
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ScreencastId id(it->id());
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      id.set_title(it->title());
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      screencast_list.push_back(id);
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return screencast_list;
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Type type_;
812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::WindowId window_;
822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::DesktopId desktop_;
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string title_;  // Optional.
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_MEDIA_BASE_SCREENCASTID_H_
89