| Index: content/common/media/cdm_host_files.h
 | 
| diff --git a/content/common/media/cdm_host_files.h b/content/common/media/cdm_host_files.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..5ec1dafcc83ad8118b4bcf254468b10ee4c6ccdc
 | 
| --- /dev/null
 | 
| +++ b/content/common/media/cdm_host_files.h
 | 
| @@ -0,0 +1,110 @@
 | 
| +// 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_COMMON_MEDIA_CDM_HOST_FILES_H_
 | 
| +#define CONTENT_COMMON_MEDIA_CDM_HOST_FILES_H_
 | 
| +
 | 
| +#include <map>
 | 
| +#include <memory>
 | 
| +#include <vector>
 | 
| +
 | 
| +#include "base/files/file.h"
 | 
| +#include "base/files/file_path.h"
 | 
| +#include "base/lazy_instance.h"
 | 
| +#include "base/logging.h"
 | 
| +#include "base/memory/ptr_util.h"
 | 
| +#include "base/native_library.h"
 | 
| +#include "base/path_service.h"
 | 
| +#include "build/build_config.h"
 | 
| +#include "content/common/media/cdm_host_file.h"
 | 
| +#include "content/common/pepper_plugin_list.h"
 | 
| +#include "content/public/common/pepper_plugin_info.h"
 | 
| +#include "media/cdm/api/content_decryption_module_ext.h"
 | 
| +#include "media/cdm/cdm_paths.h"
 | 
| +
 | 
| +// On systems that use the zygote process to spawn child processes, we must
 | 
| +// open files in the zygote process.
 | 
| +#if defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MACOSX) && \
 | 
| +    !defined(OS_ANDROID)
 | 
| +#define POSIX_WITH_ZYGOTE 1
 | 
| +#endif
 | 
| +
 | 
| +namespace base {
 | 
| +class FilePath;
 | 
| +}
 | 
| +
 | 
| +namespace content {
 | 
| +
 | 
| +// Manages all CDM host files.
 | 
| +class CdmHostFiles {
 | 
| + public:
 | 
| +  CdmHostFiles();
 | 
| +  ~CdmHostFiles();
 | 
| +
 | 
| +#if defined(POSIX_WITH_ZYGOTE)
 | 
| +  // Opens CDM host files for all registered CDMs and set the global
 | 
| +  // CdmHostFiles instance.  On any failure, the global instance will not be
 | 
| +  // set and no file will be left open.
 | 
| +  static void CreateGlobalInstance();
 | 
| +
 | 
| +  // Takes and returns the global CdmHostFiles instance. The return value could
 | 
| +  // be nullptr if CreateGlobalInstance() failed.
 | 
| +  static std::unique_ptr<CdmHostFiles> TakeGlobalInstance();
 | 
| +#endif
 | 
| +
 | 
| +  // Opens CDM host files for the CDM adapter at |cdm_adapter_path| and returns
 | 
| +  // the created CdmHostFiles instance. Returns nullptr if any of the files
 | 
| +  // cannot be opened, in which case no file will be left open.
 | 
| +  static std::unique_ptr<CdmHostFiles> Create(
 | 
| +      const base::FilePath& cdm_adapter_path);
 | 
| +
 | 
| +  // Verifies |cdm_adapter_path| CDM files by calling the function exported
 | 
| +  // by the CDM. If unexpected error happens, all files will be closed.
 | 
| +  // Otherwise, the PlatformFiles are passed to the CDM which will close the
 | 
| +  // files later.
 | 
| +  // Only returns false if the CDM returns false (when there's an immediate
 | 
| +  // failure). Otherwise always returns true for backward compatibility, e.g.
 | 
| +  // when using an old CDM which doesn't implement the verification API.
 | 
| +  bool VerifyFiles(base::NativeLibrary cdm_adapter_library,
 | 
| +                   const base::FilePath& cdm_adapter_path);
 | 
| +
 | 
| + private:
 | 
| +#if defined(POSIX_WITH_ZYGOTE)
 | 
| +  // Opens all common files and CDM specific files for all registered CDMs.
 | 
| +  bool OpenFilesForAllRegisteredCdms();
 | 
| +#endif
 | 
| +
 | 
| +  // Opens all common files and CDM specific files for the CDM adapter
 | 
| +  // registered at |cdm_adapter_path|.
 | 
| +  bool OpenFiles(const base::FilePath& cdm_adapter_path);
 | 
| +
 | 
| +  // Opens common CDM host files shared by all CDMs. Upon failure, close all
 | 
| +  // files opened.
 | 
| +  bool OpenCommonFiles();
 | 
| +
 | 
| +  // Opens CDM specific files for the CDM adapter registered at
 | 
| +  // |cdm_adapter_path|. Returns whether all CDM specific files are opened.
 | 
| +  // Upon failure, close all files opened.
 | 
| +  bool OpenCdmFiles(const base::FilePath& cdm_adapter_path);
 | 
| +
 | 
| +  // Fills |cdm_host_files| with common and CDM specific files for
 | 
| +  // |cdm_adapter_path|. The ownership of those files are also transferred.
 | 
| +  // Returns true upon success where the remaining files will be closed.
 | 
| +  // Returns false upon any failure and all files will be closed.
 | 
| +  bool TakePlatformFiles(const base::FilePath& cdm_adapter_path,
 | 
| +                         std::vector<cdm::HostFile>* cdm_host_files);
 | 
| +
 | 
| +  void CloseAllFiles();
 | 
| +
 | 
| +  using ScopedFileVector = std::vector<std::unique_ptr<CdmHostFile>>;
 | 
| +  ScopedFileVector common_files_;
 | 
| +  std::map<base::FilePath, ScopedFileVector> cdm_specific_files_map_;
 | 
| +};
 | 
| +
 | 
| +// Returns whether the |cdm_adapter_path| corresponds to a known CDM.
 | 
| +bool IsCdm(const base::FilePath& cdm_adapter_path);
 | 
| +
 | 
| +}  // namespace content
 | 
| +
 | 
| +#endif  // CONTENT_COMMON_MEDIA_CDM_HOST_FILES_H_
 | 
| 
 |