1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef CAS_API_H_
18#define CAS_API_H_
19
20#include <vector>
21#include <utils/String8.h>
22
23//  Loadable CasPlugin shared libraries should define the entry points
24//  as shown below:
25//
26//  extern "C" {
27//      extern android::CasFactory *createCasFactory();
28//      extern android::DescramblerFactory *createDescramblerFactory();
29//  }
30
31namespace android {
32
33struct CasPlugin;
34
35struct CasPluginDescriptor {
36    int32_t CA_system_id;
37    String8 name;
38};
39
40typedef std::vector<uint8_t> CasData;
41typedef std::vector<uint8_t> CasSessionId;
42typedef std::vector<uint8_t> CasEmm;
43typedef std::vector<uint8_t> CasEcm;
44typedef void (*CasPluginCallback)(
45        void *appData,
46        int32_t event,
47        int32_t arg,
48        uint8_t *data,
49        size_t size);
50
51struct CasFactory {
52    CasFactory() {}
53    virtual ~CasFactory() {}
54
55    // Determine if the plugin can handle the CA scheme identified by CA_system_id.
56    virtual bool isSystemIdSupported(
57            int32_t CA_system_id) const = 0;
58
59    // Get a list of the CA schemes supported by the plugin.
60    virtual status_t queryPlugins(
61            std::vector<CasPluginDescriptor> *descriptors) const = 0;
62
63    // Construct a new instance of a CasPlugin given a CA_system_id
64    virtual status_t createPlugin(
65            int32_t CA_system_id,
66            uint64_t appData,
67            CasPluginCallback callback,
68            CasPlugin **plugin) = 0;
69
70private:
71    CasFactory(const CasFactory &);
72    CasFactory &operator=(const CasFactory &); /* NOLINT */
73};
74
75struct CasPlugin {
76    CasPlugin() {}
77    virtual ~CasPlugin() {}
78
79    // Provide the CA private data from a CA_descriptor in the conditional
80    // access table to a CasPlugin.
81    virtual status_t setPrivateData(
82            const CasData &privateData) = 0;
83
84    // Open a session for descrambling a program, or one or more elementary
85    // streams.
86    virtual status_t openSession(CasSessionId *sessionId) = 0;
87
88    // Close a previously opened session.
89    virtual status_t closeSession(const CasSessionId &sessionId) = 0;
90
91    // Provide the CA private data from a CA_descriptor in the program map
92    // table to a CasPlugin.
93    virtual status_t setSessionPrivateData(
94            const CasSessionId &sessionId,
95            const CasData &privateData) = 0;
96
97    // Process an ECM from the ECM stream for this session’s elementary stream.
98    virtual status_t processEcm(
99            const CasSessionId &sessionId,
100            const CasEcm &ecm) = 0;
101
102    // Process an in-band EMM from the EMM stream.
103    virtual status_t processEmm(
104            const CasEmm &emm) = 0;
105
106    // Deliver an event to the CasPlugin. The format of the event is specific
107    // to the CA scheme and is opaque to the framework.
108    virtual status_t sendEvent(
109            int32_t event,
110            int32_t arg,
111            const CasData &eventData) = 0;
112
113    // Native implementation of the MediaCas Java API provision method.
114    virtual status_t provision(
115            const String8 &provisionString) = 0;
116
117    // Native implementation of the MediaCas Java API refreshEntitlements method
118    virtual status_t refreshEntitlements(
119            int32_t refreshType,
120            const CasData &refreshData) = 0;
121
122private:
123    CasPlugin(const CasPlugin &);
124    CasPlugin &operator=(const CasPlugin &); /* NOLINT */
125};
126
127extern "C" {
128    extern android::CasFactory *createCasFactory();
129}
130
131} // namespace android
132
133#endif // CAS_API_H_
134