// 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 "android_webview/common/aw_media_drm_bridge_client.h"

#include <utility>

#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"

namespace android_webview {

namespace {

const size_t kGUIDLength = 36U;

#define RCHECK(x)                                    \
  if (!(x)) {                                        \
    LOG(ERROR) << "Can't parse key-system mapping: " \
               << key_system_uuid_mapping;           \
    return std::make_pair("", uuid);                 \
  }

media::MediaDrmBridgeClient::KeySystemUuidMap::value_type
CreateMappingFromString(const std::string& key_system_uuid_mapping) {
  std::vector<uint8_t> uuid;

  std::vector<std::string> tokens =
      base::SplitString(key_system_uuid_mapping, ",", base::KEEP_WHITESPACE,
                        base::SPLIT_WANT_NONEMPTY);
  RCHECK(tokens.size() == 2);

  std::string key_system;
  base::TrimWhitespaceASCII(tokens[0], base::TRIM_ALL, &key_system);

  std::string guid(tokens[1]);
  RCHECK(guid.length() == kGUIDLength);
  base::RemoveChars(guid, "-", &guid);
  RCHECK(base::HexStringToBytes(guid, &uuid));

  return std::make_pair(key_system, uuid);
}

}  // namespace

AwMediaDrmBridgeClient::AwMediaDrmBridgeClient(
    const std::vector<std::string>& key_system_uuid_mappings)
    : key_system_uuid_mappings_(key_system_uuid_mappings) {}

AwMediaDrmBridgeClient::~AwMediaDrmBridgeClient() {}

void AwMediaDrmBridgeClient::AddKeySystemUUIDMappings(KeySystemUuidMap* map) {
  for (const std::string& key_system_uuid_mapping : key_system_uuid_mappings_) {
    auto mapping = CreateMappingFromString(key_system_uuid_mapping);
    if (!mapping.first.empty())
      map->insert(mapping);
  }
}

media::MediaDrmBridgeDelegate*
AwMediaDrmBridgeClient::GetMediaDrmBridgeDelegate(
    const media::UUID& scheme_uuid) {
  if (scheme_uuid == widevine_delegate_.GetUUID())
    return &widevine_delegate_;
  return nullptr;
}

}  // namespace android_webview
