1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef __DRM_ENGINE_BASE_H__ 18*ec779b8eSAndroid Build Coastguard Worker #define __DRM_ENGINE_BASE_H__ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <drm/drm_framework_common.h> 21*ec779b8eSAndroid Build Coastguard Worker #include "IDrmEngine.h" 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker namespace android { 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker /** 26*ec779b8eSAndroid Build Coastguard Worker * This class is an interface for plug-in developers 27*ec779b8eSAndroid Build Coastguard Worker * 28*ec779b8eSAndroid Build Coastguard Worker * Responsibility of this class is control the sequence of actual plug-in. 29*ec779b8eSAndroid Build Coastguard Worker * All each plug-in developer has to do is implement onXXX() type virtual interfaces. 30*ec779b8eSAndroid Build Coastguard Worker */ 31*ec779b8eSAndroid Build Coastguard Worker class DrmEngineBase : public IDrmEngine { 32*ec779b8eSAndroid Build Coastguard Worker public: 33*ec779b8eSAndroid Build Coastguard Worker DrmEngineBase(); 34*ec779b8eSAndroid Build Coastguard Worker virtual ~DrmEngineBase(); 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker public: 37*ec779b8eSAndroid Build Coastguard Worker DrmConstraints* getConstraints(int uniqueId, const String8* path, int action); 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker DrmMetadata* getMetadata(int uniqueId, const String8* path); 40*ec779b8eSAndroid Build Coastguard Worker 41*ec779b8eSAndroid Build Coastguard Worker status_t initialize(int uniqueId); 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker status_t setOnInfoListener(int uniqueId, const IDrmEngine::OnInfoListener* infoListener); 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker status_t terminate(int uniqueId); 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker bool canHandle(int uniqueId, const String8& path); 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); 50*ec779b8eSAndroid Build Coastguard Worker 51*ec779b8eSAndroid Build Coastguard Worker status_t saveRights(int uniqueId, const DrmRights& drmRights, 52*ec779b8eSAndroid Build Coastguard Worker const String8& rightsPath, const String8& contentPath); 53*ec779b8eSAndroid Build Coastguard Worker 54*ec779b8eSAndroid Build Coastguard Worker DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker String8 getOriginalMimeType(int uniqueId, const String8& path, int fd); 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker int checkRightsStatus(int uniqueId, const String8& path, int action); 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker status_t consumeRights(int uniqueId, sp<DecryptHandle>& decryptHandle, int action, 63*ec779b8eSAndroid Build Coastguard Worker bool reserve); 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker status_t setPlaybackStatus( 66*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position); 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker bool validateAction( 69*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8& path, int action, const ActionDescription& description); 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker status_t removeRights(int uniqueId, const String8& path); 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker status_t removeAllRights(int uniqueId); 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker status_t openConvertSession(int uniqueId, int convertId); 76*ec779b8eSAndroid Build Coastguard Worker 77*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker DrmSupportInfo* getSupportInfo(int uniqueId); 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker status_t openDecryptSession( 84*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, 85*ec779b8eSAndroid Build Coastguard Worker int fd, off64_t offset, off64_t length, const char* mime); 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker status_t openDecryptSession( 88*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, 89*ec779b8eSAndroid Build Coastguard Worker const char* uri, const char* mime); 90*ec779b8eSAndroid Build Coastguard Worker 91*ec779b8eSAndroid Build Coastguard Worker status_t openDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle, 92*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer& buf, const String8& mimeType); 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker status_t closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle); 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker status_t initializeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 97*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId, const DrmBuffer* headerInfo); 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker status_t decrypt(int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId, 100*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker status_t finalizeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 103*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId); 104*ec779b8eSAndroid Build Coastguard Worker 105*ec779b8eSAndroid Build Coastguard Worker ssize_t pread(int uniqueId, sp<DecryptHandle>& decryptHandle, 106*ec779b8eSAndroid Build Coastguard Worker void* buffer, ssize_t numBytes, off64_t offset); 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker protected: 109*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////// 110*ec779b8eSAndroid Build Coastguard Worker // Interface for plug-in developers // 111*ec779b8eSAndroid Build Coastguard Worker // each plug-in has to implement following method // 112*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////// 113*ec779b8eSAndroid Build Coastguard Worker /** 114*ec779b8eSAndroid Build Coastguard Worker * Get constraint information associated with input content 115*ec779b8eSAndroid Build Coastguard Worker * 116*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 117*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the protected content 118*ec779b8eSAndroid Build Coastguard Worker * @param[in] action Actions defined such as, 119*ec779b8eSAndroid Build Coastguard Worker * Action::DEFAULT, Action::PLAY, etc 120*ec779b8eSAndroid Build Coastguard Worker * @return DrmConstraints 121*ec779b8eSAndroid Build Coastguard Worker * key-value pairs of constraint are embedded in it 122*ec779b8eSAndroid Build Coastguard Worker * @note 123*ec779b8eSAndroid Build Coastguard Worker * In case of error, return NULL 124*ec779b8eSAndroid Build Coastguard Worker */ 125*ec779b8eSAndroid Build Coastguard Worker virtual DrmConstraints* onGetConstraints( 126*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8* path, int action) = 0; 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker /** 129*ec779b8eSAndroid Build Coastguard Worker * Get metadata information associated with input content 130*ec779b8eSAndroid Build Coastguard Worker * 131*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 132*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the protected content 133*ec779b8eSAndroid Build Coastguard Worker * @return DrmMetadata 134*ec779b8eSAndroid Build Coastguard Worker * key-value pairs of metadata 135*ec779b8eSAndroid Build Coastguard Worker * @note 136*ec779b8eSAndroid Build Coastguard Worker * In case of error, return NULL 137*ec779b8eSAndroid Build Coastguard Worker */ 138*ec779b8eSAndroid Build Coastguard Worker virtual DrmMetadata* onGetMetadata(int uniqueId, const String8* path) = 0; 139*ec779b8eSAndroid Build Coastguard Worker 140*ec779b8eSAndroid Build Coastguard Worker /** 141*ec779b8eSAndroid Build Coastguard Worker * Initialize plug-in 142*ec779b8eSAndroid Build Coastguard Worker * 143*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 144*ec779b8eSAndroid Build Coastguard Worker * @return status_t 145*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 146*ec779b8eSAndroid Build Coastguard Worker */ 147*ec779b8eSAndroid Build Coastguard Worker virtual status_t onInitialize(int uniqueId) = 0; 148*ec779b8eSAndroid Build Coastguard Worker 149*ec779b8eSAndroid Build Coastguard Worker /** 150*ec779b8eSAndroid Build Coastguard Worker * Register a callback to be invoked when the caller required to 151*ec779b8eSAndroid Build Coastguard Worker * receive necessary information 152*ec779b8eSAndroid Build Coastguard Worker * 153*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session. uniqueId is a random 154*ec779b8eSAndroid Build Coastguard Worker * number generated in the DRM service. If the DrmManagerClient 155*ec779b8eSAndroid Build Coastguard Worker * is created in native code, uniqueId will be a number ranged 156*ec779b8eSAndroid Build Coastguard Worker * from 0x1000 to 0x1fff. If it comes from Java code, the uniqueId 157*ec779b8eSAndroid Build Coastguard Worker * will be a number ranged from 0x00 to 0xfff. So bit 0x1000 in 158*ec779b8eSAndroid Build Coastguard Worker * uniqueId could be used in DRM plugins to differentiate native 159*ec779b8eSAndroid Build Coastguard Worker * OnInfoListener and Java OnInfoListener. 160*ec779b8eSAndroid Build Coastguard Worker * @param[in] infoListener Listener 161*ec779b8eSAndroid Build Coastguard Worker * @return status_t 162*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 163*ec779b8eSAndroid Build Coastguard Worker */ 164*ec779b8eSAndroid Build Coastguard Worker virtual status_t onSetOnInfoListener( 165*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const IDrmEngine::OnInfoListener* infoListener) = 0; 166*ec779b8eSAndroid Build Coastguard Worker 167*ec779b8eSAndroid Build Coastguard Worker /** 168*ec779b8eSAndroid Build Coastguard Worker * Terminate the plug-in 169*ec779b8eSAndroid Build Coastguard Worker * and release resource bound to plug-in 170*ec779b8eSAndroid Build Coastguard Worker * 171*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 172*ec779b8eSAndroid Build Coastguard Worker * @return status_t 173*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 174*ec779b8eSAndroid Build Coastguard Worker */ 175*ec779b8eSAndroid Build Coastguard Worker virtual status_t onTerminate(int uniqueId) = 0; 176*ec779b8eSAndroid Build Coastguard Worker 177*ec779b8eSAndroid Build Coastguard Worker /** 178*ec779b8eSAndroid Build Coastguard Worker * Get whether the given content can be handled by this plugin or not 179*ec779b8eSAndroid Build Coastguard Worker * 180*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 181*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path the protected object 182*ec779b8eSAndroid Build Coastguard Worker * @return bool 183*ec779b8eSAndroid Build Coastguard Worker * Returns true if this plugin can handle , false in case of not able to handle 184*ec779b8eSAndroid Build Coastguard Worker */ 185*ec779b8eSAndroid Build Coastguard Worker virtual bool onCanHandle(int uniqueId, const String8& path) = 0; 186*ec779b8eSAndroid Build Coastguard Worker 187*ec779b8eSAndroid Build Coastguard Worker /** 188*ec779b8eSAndroid Build Coastguard Worker * Executes given drm information based on its type 189*ec779b8eSAndroid Build Coastguard Worker * 190*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 191*ec779b8eSAndroid Build Coastguard Worker * @param[in] drmInfo Information needs to be processed 192*ec779b8eSAndroid Build Coastguard Worker * @return DrmInfoStatus 193*ec779b8eSAndroid Build Coastguard Worker * instance as a result of processing given input 194*ec779b8eSAndroid Build Coastguard Worker */ 195*ec779b8eSAndroid Build Coastguard Worker virtual DrmInfoStatus* onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) = 0; 196*ec779b8eSAndroid Build Coastguard Worker 197*ec779b8eSAndroid Build Coastguard Worker /** 198*ec779b8eSAndroid Build Coastguard Worker * Save DRM rights to specified rights path 199*ec779b8eSAndroid Build Coastguard Worker * and make association with content path 200*ec779b8eSAndroid Build Coastguard Worker * 201*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 202*ec779b8eSAndroid Build Coastguard Worker * @param[in] drmRights DrmRights to be saved 203*ec779b8eSAndroid Build Coastguard Worker * @param[in] rightsPath File path where rights to be saved 204*ec779b8eSAndroid Build Coastguard Worker * @param[in] contentPath File path where content was saved 205*ec779b8eSAndroid Build Coastguard Worker * @return status_t 206*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 207*ec779b8eSAndroid Build Coastguard Worker */ 208*ec779b8eSAndroid Build Coastguard Worker virtual status_t onSaveRights(int uniqueId, const DrmRights& drmRights, 209*ec779b8eSAndroid Build Coastguard Worker const String8& rightspath, const String8& contentPath) = 0; 210*ec779b8eSAndroid Build Coastguard Worker 211*ec779b8eSAndroid Build Coastguard Worker /** 212*ec779b8eSAndroid Build Coastguard Worker * Retrieves necessary information for registration, unregistration or rights 213*ec779b8eSAndroid Build Coastguard Worker * acquisition information. 214*ec779b8eSAndroid Build Coastguard Worker * 215*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 216*ec779b8eSAndroid Build Coastguard Worker * @param[in] drmInfoRequest Request information to retrieve drmInfo 217*ec779b8eSAndroid Build Coastguard Worker * @return DrmInfo 218*ec779b8eSAndroid Build Coastguard Worker * instance as a result of processing given input 219*ec779b8eSAndroid Build Coastguard Worker */ 220*ec779b8eSAndroid Build Coastguard Worker virtual DrmInfo* onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) = 0; 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker /** 223*ec779b8eSAndroid Build Coastguard Worker * Retrieves the mime type embedded inside the original content 224*ec779b8eSAndroid Build Coastguard Worker * 225*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 226*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the protected content 227*ec779b8eSAndroid Build Coastguard Worker * @param[in] fd descriptor of the protected content as a file source 228*ec779b8eSAndroid Build Coastguard Worker * @return String8 229*ec779b8eSAndroid Build Coastguard Worker * Returns mime-type of the original content, such as "video/mpeg" 230*ec779b8eSAndroid Build Coastguard Worker */ 231*ec779b8eSAndroid Build Coastguard Worker virtual String8 onGetOriginalMimeType(int uniqueId, const String8& path, int fd) = 0; 232*ec779b8eSAndroid Build Coastguard Worker 233*ec779b8eSAndroid Build Coastguard Worker /** 234*ec779b8eSAndroid Build Coastguard Worker * Retrieves the type of the protected object (content, rights, etc..) 235*ec779b8eSAndroid Build Coastguard Worker * using specified path or mimetype. At least one parameter should be non null 236*ec779b8eSAndroid Build Coastguard Worker * to retrieve DRM object type 237*ec779b8eSAndroid Build Coastguard Worker * 238*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 239*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the content or null. 240*ec779b8eSAndroid Build Coastguard Worker * @param[in] mimeType Mime type of the content or null. 241*ec779b8eSAndroid Build Coastguard Worker * @return type of the DRM content, 242*ec779b8eSAndroid Build Coastguard Worker * such as DrmObjectType::CONTENT, DrmObjectType::RIGHTS_OBJECT 243*ec779b8eSAndroid Build Coastguard Worker */ 244*ec779b8eSAndroid Build Coastguard Worker virtual int onGetDrmObjectType( 245*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8& path, const String8& mimeType) = 0; 246*ec779b8eSAndroid Build Coastguard Worker 247*ec779b8eSAndroid Build Coastguard Worker /** 248*ec779b8eSAndroid Build Coastguard Worker * Check whether the given content has valid rights or not 249*ec779b8eSAndroid Build Coastguard Worker * 250*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 251*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the protected content 252*ec779b8eSAndroid Build Coastguard Worker * @param[in] action Action to perform (Action::DEFAULT, Action::PLAY, etc) 253*ec779b8eSAndroid Build Coastguard Worker * @return the status of the rights for the protected content, 254*ec779b8eSAndroid Build Coastguard Worker * such as RightsStatus::RIGHTS_VALID, RightsStatus::RIGHTS_EXPIRED, etc. 255*ec779b8eSAndroid Build Coastguard Worker */ 256*ec779b8eSAndroid Build Coastguard Worker virtual int onCheckRightsStatus(int uniqueId, const String8& path, int action) = 0; 257*ec779b8eSAndroid Build Coastguard Worker 258*ec779b8eSAndroid Build Coastguard Worker /** 259*ec779b8eSAndroid Build Coastguard Worker * Consumes the rights for a content. 260*ec779b8eSAndroid Build Coastguard Worker * If the reserve parameter is true the rights is reserved until the same 261*ec779b8eSAndroid Build Coastguard Worker * application calls this api again with the reserve parameter set to false. 262*ec779b8eSAndroid Build Coastguard Worker * 263*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 264*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the decryption session 265*ec779b8eSAndroid Build Coastguard Worker * @param[in] action Action to perform. (Action::DEFAULT, Action::PLAY, etc) 266*ec779b8eSAndroid Build Coastguard Worker * @param[in] reserve True if the rights should be reserved. 267*ec779b8eSAndroid Build Coastguard Worker * @return status_t 268*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 269*ec779b8eSAndroid Build Coastguard Worker */ 270*ec779b8eSAndroid Build Coastguard Worker virtual status_t onConsumeRights(int uniqueId, sp<DecryptHandle>& decryptHandle, 271*ec779b8eSAndroid Build Coastguard Worker int action, bool reserve) = 0; 272*ec779b8eSAndroid Build Coastguard Worker 273*ec779b8eSAndroid Build Coastguard Worker /** 274*ec779b8eSAndroid Build Coastguard Worker * Informs the DRM Engine about the playback actions performed on the DRM files. 275*ec779b8eSAndroid Build Coastguard Worker * 276*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 277*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the decryption session 278*ec779b8eSAndroid Build Coastguard Worker * @param[in] playbackStatus Playback action (Playback::START, Playback::STOP, Playback::PAUSE) 279*ec779b8eSAndroid Build Coastguard Worker * @param[in] position Position in the file (in milliseconds) where the start occurs. 280*ec779b8eSAndroid Build Coastguard Worker * Only valid together with Playback::START. 281*ec779b8eSAndroid Build Coastguard Worker * @return status_t 282*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 283*ec779b8eSAndroid Build Coastguard Worker */ 284*ec779b8eSAndroid Build Coastguard Worker virtual status_t onSetPlaybackStatus( 285*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, 286*ec779b8eSAndroid Build Coastguard Worker int64_t position) = 0; 287*ec779b8eSAndroid Build Coastguard Worker 288*ec779b8eSAndroid Build Coastguard Worker /** 289*ec779b8eSAndroid Build Coastguard Worker * Validates whether an action on the DRM content is allowed or not. 290*ec779b8eSAndroid Build Coastguard Worker * 291*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 292*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the protected content 293*ec779b8eSAndroid Build Coastguard Worker * @param[in] action Action to validate (Action::PLAY, Action::TRANSFER, etc) 294*ec779b8eSAndroid Build Coastguard Worker * @param[in] description Detailed description of the action 295*ec779b8eSAndroid Build Coastguard Worker * @return true if the action is allowed. 296*ec779b8eSAndroid Build Coastguard Worker */ 297*ec779b8eSAndroid Build Coastguard Worker virtual bool onValidateAction(int uniqueId, const String8& path, 298*ec779b8eSAndroid Build Coastguard Worker int action, const ActionDescription& description) = 0; 299*ec779b8eSAndroid Build Coastguard Worker 300*ec779b8eSAndroid Build Coastguard Worker /** 301*ec779b8eSAndroid Build Coastguard Worker * Removes the rights associated with the given protected content 302*ec779b8eSAndroid Build Coastguard Worker * 303*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 304*ec779b8eSAndroid Build Coastguard Worker * @param[in] path Path of the protected content 305*ec779b8eSAndroid Build Coastguard Worker * @return status_t 306*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 307*ec779b8eSAndroid Build Coastguard Worker */ 308*ec779b8eSAndroid Build Coastguard Worker virtual status_t onRemoveRights(int uniqueId, const String8& path) = 0; 309*ec779b8eSAndroid Build Coastguard Worker 310*ec779b8eSAndroid Build Coastguard Worker /** 311*ec779b8eSAndroid Build Coastguard Worker * Removes all the rights information of each plug-in associated with 312*ec779b8eSAndroid Build Coastguard Worker * DRM framework. 313*ec779b8eSAndroid Build Coastguard Worker * 314*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 315*ec779b8eSAndroid Build Coastguard Worker * @return status_t 316*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 317*ec779b8eSAndroid Build Coastguard Worker */ 318*ec779b8eSAndroid Build Coastguard Worker virtual status_t onRemoveAllRights(int uniqueId) = 0; 319*ec779b8eSAndroid Build Coastguard Worker 320*ec779b8eSAndroid Build Coastguard Worker /** 321*ec779b8eSAndroid Build Coastguard Worker * This API is for Forward Lock based DRM scheme. 322*ec779b8eSAndroid Build Coastguard Worker * Each time the application tries to download a new DRM file 323*ec779b8eSAndroid Build Coastguard Worker * which needs to be converted, then the application has to 324*ec779b8eSAndroid Build Coastguard Worker * begin with calling this API. 325*ec779b8eSAndroid Build Coastguard Worker * 326*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 327*ec779b8eSAndroid Build Coastguard Worker * @param[in] convertId Handle for the convert session 328*ec779b8eSAndroid Build Coastguard Worker * @return status_t 329*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 330*ec779b8eSAndroid Build Coastguard Worker */ 331*ec779b8eSAndroid Build Coastguard Worker virtual status_t onOpenConvertSession(int uniqueId, int convertId) = 0; 332*ec779b8eSAndroid Build Coastguard Worker 333*ec779b8eSAndroid Build Coastguard Worker /** 334*ec779b8eSAndroid Build Coastguard Worker * Accepts and converts the input data which is part of DRM file. 335*ec779b8eSAndroid Build Coastguard Worker * The resultant converted data and the status is returned in the DrmConvertedInfo 336*ec779b8eSAndroid Build Coastguard Worker * object. This method will be called each time there are new block 337*ec779b8eSAndroid Build Coastguard Worker * of data received by the application. 338*ec779b8eSAndroid Build Coastguard Worker * 339*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 340*ec779b8eSAndroid Build Coastguard Worker * @param[in] convertId Handle for the convert session 341*ec779b8eSAndroid Build Coastguard Worker * @param[in] inputData Input Data which need to be converted 342*ec779b8eSAndroid Build Coastguard Worker * @return Return object contains the status of the data conversion, 343*ec779b8eSAndroid Build Coastguard Worker * the output converted data and offset. In this case the 344*ec779b8eSAndroid Build Coastguard Worker * application will ignore the offset information. 345*ec779b8eSAndroid Build Coastguard Worker */ 346*ec779b8eSAndroid Build Coastguard Worker virtual DrmConvertedStatus* onConvertData( 347*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int convertId, const DrmBuffer* inputData) = 0; 348*ec779b8eSAndroid Build Coastguard Worker 349*ec779b8eSAndroid Build Coastguard Worker /** 350*ec779b8eSAndroid Build Coastguard Worker * Informs the Drm Agent when there is no more data which need to be converted 351*ec779b8eSAndroid Build Coastguard Worker * or when an error occurs. Upon successful conversion of the complete data, 352*ec779b8eSAndroid Build Coastguard Worker * the agent will inform that where the header and body signature 353*ec779b8eSAndroid Build Coastguard Worker * should be added. This signature appending is needed to integrity 354*ec779b8eSAndroid Build Coastguard Worker * protect the converted file. 355*ec779b8eSAndroid Build Coastguard Worker * 356*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 357*ec779b8eSAndroid Build Coastguard Worker * @param[in] convertId Handle for the convert session 358*ec779b8eSAndroid Build Coastguard Worker * @return Return object contains the status of the data conversion, 359*ec779b8eSAndroid Build Coastguard Worker * the header and body signature data. It also informs 360*ec779b8eSAndroid Build Coastguard Worker * the application on which offset these signature data 361*ec779b8eSAndroid Build Coastguard Worker * should be appended. 362*ec779b8eSAndroid Build Coastguard Worker */ 363*ec779b8eSAndroid Build Coastguard Worker virtual DrmConvertedStatus* onCloseConvertSession(int uniqueId, int convertId) = 0; 364*ec779b8eSAndroid Build Coastguard Worker 365*ec779b8eSAndroid Build Coastguard Worker /** 366*ec779b8eSAndroid Build Coastguard Worker * Returns the information about the Drm Engine capabilities which includes 367*ec779b8eSAndroid Build Coastguard Worker * supported MimeTypes and file suffixes. 368*ec779b8eSAndroid Build Coastguard Worker * 369*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 370*ec779b8eSAndroid Build Coastguard Worker * @return DrmSupportInfo 371*ec779b8eSAndroid Build Coastguard Worker * instance which holds the capabilities of a plug-in 372*ec779b8eSAndroid Build Coastguard Worker */ 373*ec779b8eSAndroid Build Coastguard Worker virtual DrmSupportInfo* onGetSupportInfo(int uniqueId) = 0; 374*ec779b8eSAndroid Build Coastguard Worker 375*ec779b8eSAndroid Build Coastguard Worker /** 376*ec779b8eSAndroid Build Coastguard Worker * Open the decrypt session to decrypt the given protected content 377*ec779b8eSAndroid Build Coastguard Worker * 378*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 379*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the current decryption session 380*ec779b8eSAndroid Build Coastguard Worker * @param[in] fd File descriptor of the protected content to be decrypted 381*ec779b8eSAndroid Build Coastguard Worker * @param[in] offset Start position of the content 382*ec779b8eSAndroid Build Coastguard Worker * @param[in] length The length of the protected content 383*ec779b8eSAndroid Build Coastguard Worker * @return 384*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success 385*ec779b8eSAndroid Build Coastguard Worker */ 386*ec779b8eSAndroid Build Coastguard Worker virtual status_t onOpenDecryptSession( 387*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, 388*ec779b8eSAndroid Build Coastguard Worker int fd, off64_t offset, off64_t length) = 0; 389*ec779b8eSAndroid Build Coastguard Worker 390*ec779b8eSAndroid Build Coastguard Worker /** 391*ec779b8eSAndroid Build Coastguard Worker * Open the decrypt session to decrypt the given protected content 392*ec779b8eSAndroid Build Coastguard Worker * 393*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 394*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the current decryption session 395*ec779b8eSAndroid Build Coastguard Worker * @param[in] fd File descriptor of the protected content to be decrypted 396*ec779b8eSAndroid Build Coastguard Worker * @param[in] offset Start position of the content 397*ec779b8eSAndroid Build Coastguard Worker * @param[in] length The length of the protected content 398*ec779b8eSAndroid Build Coastguard Worker * @param[in] mime Mime type of the protected content 399*ec779b8eSAndroid Build Coastguard Worker * drm plugin may do some optimization since the mime type is known. 400*ec779b8eSAndroid Build Coastguard Worker * @return 401*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success 402*ec779b8eSAndroid Build Coastguard Worker */ onOpenDecryptSession(int,sp<DecryptHandle> &,int,off64_t,off64_t,const char *)403*ec779b8eSAndroid Build Coastguard Worker virtual status_t onOpenDecryptSession( 404*ec779b8eSAndroid Build Coastguard Worker int /* uniqueId */, sp<DecryptHandle>& /* decryptHandle */, 405*ec779b8eSAndroid Build Coastguard Worker int /* fd */, off64_t /* offset */, off64_t /* length */, 406*ec779b8eSAndroid Build Coastguard Worker const char* /* mime */) { 407*ec779b8eSAndroid Build Coastguard Worker 408*ec779b8eSAndroid Build Coastguard Worker return DRM_ERROR_CANNOT_HANDLE; 409*ec779b8eSAndroid Build Coastguard Worker } 410*ec779b8eSAndroid Build Coastguard Worker 411*ec779b8eSAndroid Build Coastguard Worker /** 412*ec779b8eSAndroid Build Coastguard Worker * Open the decrypt session to decrypt the given protected content 413*ec779b8eSAndroid Build Coastguard Worker * 414*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 415*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the current decryption session 416*ec779b8eSAndroid Build Coastguard Worker * @param[in] uri Path of the protected content to be decrypted 417*ec779b8eSAndroid Build Coastguard Worker * @return 418*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success 419*ec779b8eSAndroid Build Coastguard Worker */ 420*ec779b8eSAndroid Build Coastguard Worker virtual status_t onOpenDecryptSession( 421*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, 422*ec779b8eSAndroid Build Coastguard Worker const char* uri) = 0; 423*ec779b8eSAndroid Build Coastguard Worker 424*ec779b8eSAndroid Build Coastguard Worker /** 425*ec779b8eSAndroid Build Coastguard Worker * Open the decrypt session to decrypt the given protected content 426*ec779b8eSAndroid Build Coastguard Worker * 427*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 428*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the current decryption session 429*ec779b8eSAndroid Build Coastguard Worker * @param[in] uri Path of the protected content to be decrypted 430*ec779b8eSAndroid Build Coastguard Worker * @param[in] mime Mime type of the protected content. The corresponding 431*ec779b8eSAndroid Build Coastguard Worker * drm plugin may do some optimization since the mime type is known. 432*ec779b8eSAndroid Build Coastguard Worker * @return 433*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success 434*ec779b8eSAndroid Build Coastguard Worker */ onOpenDecryptSession(int,sp<DecryptHandle> &,const char *,const char *)435*ec779b8eSAndroid Build Coastguard Worker virtual status_t onOpenDecryptSession( 436*ec779b8eSAndroid Build Coastguard Worker int /* uniqueId */, sp<DecryptHandle>& /* decryptHandle */, 437*ec779b8eSAndroid Build Coastguard Worker const char* /* uri */, const char* /* mime */) { 438*ec779b8eSAndroid Build Coastguard Worker 439*ec779b8eSAndroid Build Coastguard Worker return DRM_ERROR_CANNOT_HANDLE; 440*ec779b8eSAndroid Build Coastguard Worker } 441*ec779b8eSAndroid Build Coastguard Worker 442*ec779b8eSAndroid Build Coastguard Worker /** 443*ec779b8eSAndroid Build Coastguard Worker * Open the decrypt session to decrypt the given protected content 444*ec779b8eSAndroid Build Coastguard Worker * 445*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 446*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the current decryption session 447*ec779b8eSAndroid Build Coastguard Worker * @param[in] buf Data to initiate decrypt session 448*ec779b8eSAndroid Build Coastguard Worker * @param[in] mimeType Mime type of the protected content 449*ec779b8eSAndroid Build Coastguard Worker * @return 450*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success 451*ec779b8eSAndroid Build Coastguard Worker */ onOpenDecryptSession(int,sp<DecryptHandle> &,const DrmBuffer &,const String8 &)452*ec779b8eSAndroid Build Coastguard Worker virtual status_t onOpenDecryptSession(int /* uniqueId */, 453*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle>& /* decryptHandle */, 454*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer& /* buf */, 455*ec779b8eSAndroid Build Coastguard Worker const String8& /* mimeType */) { 456*ec779b8eSAndroid Build Coastguard Worker return DRM_ERROR_CANNOT_HANDLE; 457*ec779b8eSAndroid Build Coastguard Worker } 458*ec779b8eSAndroid Build Coastguard Worker 459*ec779b8eSAndroid Build Coastguard Worker /** 460*ec779b8eSAndroid Build Coastguard Worker * Close the decrypt session for the given handle 461*ec779b8eSAndroid Build Coastguard Worker * 462*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 463*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the decryption session 464*ec779b8eSAndroid Build Coastguard Worker * @return status_t 465*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 466*ec779b8eSAndroid Build Coastguard Worker */ 467*ec779b8eSAndroid Build Coastguard Worker virtual status_t onCloseDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle) = 0; 468*ec779b8eSAndroid Build Coastguard Worker 469*ec779b8eSAndroid Build Coastguard Worker /** 470*ec779b8eSAndroid Build Coastguard Worker * Initialize decryption for the given unit of the protected content 471*ec779b8eSAndroid Build Coastguard Worker * 472*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 473*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptId Handle for the decryption session 474*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptUnitId ID Specifies decryption unit, such as track ID 475*ec779b8eSAndroid Build Coastguard Worker * @param[in] headerInfo Information for initializing decryption of this decrypUnit 476*ec779b8eSAndroid Build Coastguard Worker * @return status_t 477*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 478*ec779b8eSAndroid Build Coastguard Worker */ 479*ec779b8eSAndroid Build Coastguard Worker virtual status_t onInitializeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 480*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId, const DrmBuffer* headerInfo) = 0; 481*ec779b8eSAndroid Build Coastguard Worker 482*ec779b8eSAndroid Build Coastguard Worker /** 483*ec779b8eSAndroid Build Coastguard Worker * Decrypt the protected content buffers for the given unit 484*ec779b8eSAndroid Build Coastguard Worker * This method will be called any number of times, based on number of 485*ec779b8eSAndroid Build Coastguard Worker * encrypted streams received from application. 486*ec779b8eSAndroid Build Coastguard Worker * 487*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 488*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptId Handle for the decryption session 489*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptUnitId ID Specifies decryption unit, such as track ID 490*ec779b8eSAndroid Build Coastguard Worker * @param[in] encBuffer Encrypted data block 491*ec779b8eSAndroid Build Coastguard Worker * @param[out] decBuffer Decrypted data block 492*ec779b8eSAndroid Build Coastguard Worker * @param[in] IV Optional buffer 493*ec779b8eSAndroid Build Coastguard Worker * @return status_t 494*ec779b8eSAndroid Build Coastguard Worker * Returns the error code for this API 495*ec779b8eSAndroid Build Coastguard Worker * DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED 496*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED, 497*ec779b8eSAndroid Build Coastguard Worker * DRM_ERROR_DECRYPT for failure. 498*ec779b8eSAndroid Build Coastguard Worker */ 499*ec779b8eSAndroid Build Coastguard Worker virtual status_t onDecrypt(int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId, 500*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) = 0; 501*ec779b8eSAndroid Build Coastguard Worker 502*ec779b8eSAndroid Build Coastguard Worker /** 503*ec779b8eSAndroid Build Coastguard Worker * Finalize decryption for the given unit of the protected content 504*ec779b8eSAndroid Build Coastguard Worker * 505*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 506*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the decryption session 507*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptUnitId ID Specifies decryption unit, such as track ID 508*ec779b8eSAndroid Build Coastguard Worker * @return status_t 509*ec779b8eSAndroid Build Coastguard Worker * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure 510*ec779b8eSAndroid Build Coastguard Worker */ 511*ec779b8eSAndroid Build Coastguard Worker virtual status_t onFinalizeDecryptUnit( 512*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId) = 0; 513*ec779b8eSAndroid Build Coastguard Worker 514*ec779b8eSAndroid Build Coastguard Worker /** 515*ec779b8eSAndroid Build Coastguard Worker * Reads the specified number of bytes from an open DRM file. 516*ec779b8eSAndroid Build Coastguard Worker * 517*ec779b8eSAndroid Build Coastguard Worker * @param[in] uniqueId Unique identifier for a session 518*ec779b8eSAndroid Build Coastguard Worker * @param[in] decryptHandle Handle for the decryption session 519*ec779b8eSAndroid Build Coastguard Worker * @param[out] buffer Reference to the buffer that should receive the read data. 520*ec779b8eSAndroid Build Coastguard Worker * @param[in] numBytes Number of bytes to read. 521*ec779b8eSAndroid Build Coastguard Worker * @param[in] offset Offset with which to update the file position. 522*ec779b8eSAndroid Build Coastguard Worker * 523*ec779b8eSAndroid Build Coastguard Worker * @return Number of bytes read. Returns -1 for Failure. 524*ec779b8eSAndroid Build Coastguard Worker */ 525*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t onPread(int uniqueId, sp<DecryptHandle>& decryptHandle, 526*ec779b8eSAndroid Build Coastguard Worker void* buffer, ssize_t numBytes, off64_t offset) = 0; 527*ec779b8eSAndroid Build Coastguard Worker }; 528*ec779b8eSAndroid Build Coastguard Worker 529*ec779b8eSAndroid Build Coastguard Worker }; 530*ec779b8eSAndroid Build Coastguard Worker 531*ec779b8eSAndroid Build Coastguard Worker #endif /* __DRM_ENGINE_BASE_H__ */ 532*ec779b8eSAndroid Build Coastguard Worker 533