Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/gmp/GMPLoader.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
 * vim: sw=4 ts=4 et :
3
 * This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef GMP_LOADER_H__
8
#define GMP_LOADER_H__
9
10
#include <stdint.h>
11
#include "prlink.h"
12
#include "gmp-entrypoints.h"
13
#include "mozilla/UniquePtr.h"
14
15
#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
16
#include "mozilla/Sandbox.h"
17
#endif
18
19
namespace mozilla {
20
namespace gmp {
21
22
class SandboxStarter {
23
public:
24
0
  virtual ~SandboxStarter() {}
25
  virtual bool Start(const char* aLibPath) = 0;
26
#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
27
  // On OS X we need to set Mac-specific sandbox info just before we start the
28
  // sandbox, which we don't yet know when the GMPLoader and SandboxStarter
29
  // objects are created.
30
  virtual void SetSandboxInfo(MacSandboxInfo* aSandboxInfo) = 0;
31
#endif
32
};
33
34
// Interface that adapts a plugin to the GMP API.
35
class GMPAdapter {
36
public:
37
0
  virtual ~GMPAdapter() {}
38
  // Sets the adapted to plugin library module.
39
  // Note: the GMPAdapter is responsible for calling PR_UnloadLibrary on aLib
40
  // when it's finished with it.
41
  virtual void SetAdaptee(PRLibrary* aLib) = 0;
42
43
  // These are called in place of the corresponding GMP API functions.
44
  virtual GMPErr GMPInit(const GMPPlatformAPI* aPlatformAPI) = 0;
45
  virtual GMPErr GMPGetAPI(const char* aAPIName,
46
                           void* aHostAPI,
47
                           void** aPluginAPI,
48
                           uint32_t aDecryptorId) = 0;
49
  virtual void GMPShutdown() = 0;
50
};
51
52
// Encapsulates activating the sandbox, and loading the GMP.
53
// Load() takes an optional GMPAdapter which can be used to adapt non-GMPs
54
// to adhere to the GMP API.
55
class GMPLoader {
56
public:
57
  GMPLoader();
58
59
  // Activates the sandbox, then loads the GMP library. If aAdapter is
60
  // non-null, the lib path is assumed to be a non-GMP, and the adapter
61
  // is initialized with the lib and the adapter is used to interact with
62
  // the plugin.
63
  bool Load(const char* aUTF8LibPath,
64
            uint32_t aLibPathLen,
65
            const GMPPlatformAPI* aPlatformAPI,
66
            GMPAdapter* aAdapter = nullptr);
67
68
  // Retrieves an interface pointer from the GMP.
69
  GMPErr GetAPI(const char* aAPIName,
70
                void* aHostAPI,
71
                void** aPluginAPI,
72
                uint32_t aDecryptorId);
73
74
  // Calls the GMPShutdown function exported by the GMP lib, and unloads the
75
  // plugin library.
76
  void Shutdown();
77
78
#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
79
  // On OS X we need to set Mac-specific sandbox info just before we start the
80
  // sandbox, which we don't yet know when the GMPLoader and SandboxStarter
81
  // objects are created.
82
  void SetSandboxInfo(MacSandboxInfo* aSandboxInfo);
83
#endif
84
85
  bool CanSandbox() const;
86
87
private:
88
  UniquePtr<SandboxStarter> mSandboxStarter;
89
  UniquePtr<GMPAdapter> mAdapter;
90
};
91
92
} // namespace gmp
93
} // namespace mozilla
94
95
#endif // GMP_LOADER_H__