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