blob: a5b7f42ddc1dd7b191fed6f5056bbe3945aac9a0 [file] [log] [blame]
// Copyright 2015 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.
#include "ui/display/manager/query_content_protection_task.h"
#include "base/bind.h"
#include "ui/display/manager/display_layout_manager.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/display/types/native_display_delegate.h"
namespace display {
QueryContentProtectionTask::QueryContentProtectionTask(
DisplayLayoutManager* layout_manager,
NativeDisplayDelegate* native_display_delegate,
int64_t display_id,
const ResponseCallback& callback)
: layout_manager_(layout_manager),
native_display_delegate_(native_display_delegate),
display_id_(display_id),
callback_(callback),
pending_requests_(0),
weak_ptr_factory_(this) {}
QueryContentProtectionTask::~QueryContentProtectionTask() {}
void QueryContentProtectionTask::Run() {
std::vector<DisplaySnapshot*> hdcp_capable_displays;
for (DisplaySnapshot* display : layout_manager_->GetDisplayStates()) {
// Query display if it is in mirror mode or client on the same display.
if (!layout_manager_->IsMirroring() && display->display_id() != display_id_)
continue;
response_.link_mask |= display->type();
switch (display->type()) {
case DISPLAY_CONNECTION_TYPE_UNKNOWN:
callback_.Run(response_);
return;
case DISPLAY_CONNECTION_TYPE_DISPLAYPORT:
case DISPLAY_CONNECTION_TYPE_DVI:
case DISPLAY_CONNECTION_TYPE_HDMI:
hdcp_capable_displays.push_back(display);
break;
case DISPLAY_CONNECTION_TYPE_INTERNAL:
case DISPLAY_CONNECTION_TYPE_VGA:
case DISPLAY_CONNECTION_TYPE_NETWORK:
// No protections for these types. Do nothing.
break;
case DISPLAY_CONNECTION_TYPE_NONE:
NOTREACHED();
break;
}
}
response_.success = true;
pending_requests_ = hdcp_capable_displays.size();
if (pending_requests_ != 0) {
for (DisplaySnapshot* display : hdcp_capable_displays) {
native_display_delegate_->GetHDCPState(
*display, base::Bind(&QueryContentProtectionTask::OnHDCPStateUpdate,
weak_ptr_factory_.GetWeakPtr()));
}
} else {
callback_.Run(response_);
}
}
void QueryContentProtectionTask::OnHDCPStateUpdate(bool success,
HDCPState state) {
response_.success &= success;
if (state == HDCP_STATE_ENABLED)
response_.enabled |= CONTENT_PROTECTION_METHOD_HDCP;
else
response_.unfulfilled |= CONTENT_PROTECTION_METHOD_HDCP;
pending_requests_--;
// Wait for all the requests to finish before invoking the callback.
if (pending_requests_ != 0)
return;
callback_.Run(response_);
}
} // namespace display