blob: 8813e3cc6f97d8f7dd8988c007adcb8c7ccc3f1f [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <dcf/DrmRawContent.h>
DrmRawContent::DrmRawContent(istream& inRawData)
{
uint32_t count = inRawData.stream_size();
if (count <= MAX_PIECE_LEN)
{
uint8_t* data = new uint8_t[count];
if(!data)
{
return;
}
inRawData.read(data,count);
const uint8_t* dcf = data;
//parse DCF file header
if(false == parseDcfHeader(dcf))
{
delete []data;
return;
}
dcf = data;
dcf += FIX_HEADER_LEN;
if(dcf >= (data + count))
{
return;
}
// parse container box
FullBox conFullBox(dcf);
if(DCF_CONTAINER_BOX != conFullBox.getType())
{
return;
}
//check whether it is multipart DCF or not
do
{
uint64_t size = conFullBox.getSize();
mContainer.push_back(new DcfContainer(dcf,inRawData,dcf-data));
dcf += size;
// come to the end of raw content
if(dcf >= (data + count))
{
break;
}
conFullBox = FullBox(dcf);
}while(DCF_CONTAINER_BOX == conFullBox.getType());
// compute DCF hash using Sha1Agent
Sha1Agent drmSha1Hash;
drmSha1Hash.computeHash(data,dcf-data,mDcfHash);
//// parse mutable box
delete []data;
}
}
DrmRawContent::~DrmRawContent()
{
uint32_t size = mContainer.size();
for(uint32_t i = 0; i < size; i++)
{
delete mContainer[i];
}
mContainer.clear();
}
vector<DcfContainer*> DrmRawContent::getContents(void) const
{
return mContainer;
}
uint32_t DrmRawContent::getDcfHashLen() const
{
return DCF_HASH_LEN;
}
void DrmRawContent::getDcfHash(uint8_t* outDcfHash) const
{
if(outDcfHash)
{
memcpy(outDcfHash,mDcfHash,DCF_HASH_LEN);
}
return;
}
bool DrmRawContent::parseDcfHeader(const uint8_t* dcfHead)
{
if(!dcfHead)
{
return false;
}
if(FIX_HEADER_LEN != ntohl(*(uint32_t *)dcfHead))
{
return false;
}
dcfHead += 4;
uint32_t type = *(uint32_t *)dcfHead;
if(DCF_FILE_TYPE != type)
{
return false;
}
dcfHead += 4;
type = *(uint32_t *)dcfHead;
if(DCF_FILE_BRAND != type)
{
return false;
}
dcfHead += 4;
if(2 != ntohl(*(uint32_t *)dcfHead))
{
return false;
}
dcfHead += 4;
type = *(uint32_t *)dcfHead;
if(DCF_FILE_BRAND != type)
{
return false;
}
dcfHead += 4;
return true;
}