diff -r 798ee5f1972c -r 826cea16efd9 dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpMetaHeader.cpp --- a/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpMetaHeader.cpp Thu Aug 19 10:54:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,625 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Implementation of the Common Recording Engine RTP read class.* -*/ - - - - -// INCLUDE FILES -#include -#include -#include -#include "videoserviceutilsLogger.h" - -// CONSTANTS -// None - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::NewL -// Static two-phased constructor. Leaves object to cleanup stack. -// ----------------------------------------------------------------------------- -// -CRtpMetaHeader* CRtpMetaHeader::NewL( RFile& aFile, const TMetaMode& aMode ) - { - CRtpMetaHeader* self = CRtpMetaHeader::NewLC( aFile, aMode ); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::NewLC -// Static two-phased constructor. Leaves object to cleanup stack. -// ----------------------------------------------------------------------------- -// -CRtpMetaHeader* CRtpMetaHeader::NewLC( RFile& aFile, const TMetaMode& aMode ) - { - CRtpMetaHeader* self = new( ELeave ) CRtpMetaHeader( aFile, aMode ); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::CRtpMetaHeader -// C++ default constructor can NOT contain any code, that might leave. -// ----------------------------------------------------------------------------- -// -CRtpMetaHeader::CRtpMetaHeader( RFile& aFile, const TMetaMode& aMode ) - : iFile( aFile ), - iMode( aMode ), - iMetaData( NULL ), - iDataPtr( 0, 0 ), - iEsgDataPoint( KErrNotFound ), - iSrtpDataPoint( KErrNotFound ), - iSdpDataPoint( KErrNotFound ), - iMetaTotal( KErrNotFound ) - { - // None - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ConstructL() - { - LOG( "CRtpMetaHeader::ConstructL()" ); - - // Mode - if ( iMode == EMetaRead || iMode == EMetaUpdate ) - { - // Read whole meta area - ReadTintFromFileL( KMetaLengthPoint, iMetaTotal ); - - // Meta header has reasonable length? - if ( iMetaTotal > KMaxMetaHeaderLength || iMetaTotal <= 0 ) - { - LOG( "CRtpMetaHeader::ConstructL(), Meta Total Corrupted" ); - User::Leave( KErrCorrupt ); - } - - // Room for header - iMetaData = HBufC8::NewL( iMetaTotal ); - iDataPtr.Set( iMetaData->Des() ); - User::LeaveIfError( iFile.Read( KMetaLengthPoint, iDataPtr, iMetaTotal ) ); - - // All data exist in meta header? - if ( iDataPtr.Length() < iMetaTotal ) - { - LOG( "CRtpMetaHeader::ConstructL(), Meta Header Corrupted" ); - User::Leave( KErrCorrupt ); - } - - // ESG data point ( device info point + device info data ) - iEsgDataPoint = KDeviceInfoPoint + KStringLengthBytes + - iDataPtr[KDeviceInfoPoint]; - - // SRTP data point ( ESG data point + Service name + Program name ) - TInt snp( iEsgDataPoint + KStringLengthBytes + iDataPtr[iEsgDataPoint] ); - iSrtpDataPoint = snp + KStringLengthBytes + iDataPtr[snp]; - - // SDD file point ( SRTP data point + SRTP data ) - const TInt srtplen( CRtpUtil::GetValueL( - iDataPtr.Mid( iSrtpDataPoint, KIntegerBytes ) ) ); - User::LeaveIfError( srtplen ); - iSdpDataPoint = iSrtpDataPoint + KIntegerBytes + srtplen; - } - else // Write - { - iMetaData = HBufC8::NewL( 0 ); - // Room for meta length - iMetaTotal = KMetaLengthPoint; - AddIntegerL( KMetaLengthPoint, KErrNotFound ); - } - } - -// ----------------------------------------------------------------------------- -// Destructor -// -CRtpMetaHeader::~CRtpMetaHeader() -// ----------------------------------------------------------------------------- - { - LOG( "CRtpMetaHeader::~CRtpMetaHeader()" ); - - delete iMetaData; - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::SeekHeaderPoint -// Getter for seek header point. -// Returns: Point to seek header -// ----------------------------------------------------------------------------- -// -TInt CRtpMetaHeader::SeekHeaderPoint() - { - return iMetaTotal; - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::CommitL -// Writes meta header to the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::CommitL() - { - LOG( "CRtpMetaHeader::CommitL() in" ); - - User::LeaveIfError( iMetaTotal ); - User::LeaveIfError( ( iMetaTotal > KMaxMetaHeaderLength ) * KErrCorrupt ); - - if ( iMode == EMetaWrite ) - { - User::LeaveIfError( iEsgDataPoint ); - User::LeaveIfError( iSrtpDataPoint ); - User::LeaveIfError( iSdpDataPoint ); - - // Meta length - iDataPtr.Delete( KMetaLengthPoint, KIntegerBytes ); - AddIntegerL( KMetaLengthPoint, iMetaTotal ); - - User::LeaveIfError( iFile.Write( iDataPtr, iMetaTotal ) ); - } - - LOG( "CRtpMetaHeader::CommitL() out" ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteAttributesL -// Writes atributes to meta data header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteAttributesL( const SAttributes& aAtt ) - { - TInt data( 0 ); - data|= aAtt.iOngoing << KOngoingFlagShift; - data|= aAtt.iCompleted << KCompletedFlagShift; - data|= aAtt.iProtected << KProtectedFlagShift; - data|= aAtt.iFailed << KFailedFlagShift; - data|= aAtt.iVersion << KVersionFieldShift; - data|= aAtt.iQuality << KQualityFieldShift; - data|= aAtt.iPostRule << KPostRuleFieldShift; - data|= aAtt.iParental << KParentalFieldShift; - - AddIntegerL( KAttributesPoint, data ); - AddIntegerL( KPlayCountPoint, aAtt.iPlayCount ); - AddIntegerL( KPlaySpotPoint, aAtt.iPlaySpot ); - - // Reserved room for 4 integers - AddIntegerL( KReservedPoint1, 0 ); - AddIntegerL( KReservedPoint2, 0 ); - AddIntegerL( KReservedPoint3, 0 ); - AddIntegerL( KReservedPoint4, 0 ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteStartTimeL -// Writes start date/time info to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteStartTimeL( const TTime& aTime ) - { - AddTimeL( KStartTimePoint, aTime ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteEndTimeL -// Writes end date/time info to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteEndTimeL( const TTime& aTime ) - { - AddTimeL( KEndTimePoint, aTime ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteDurationL -// Writes duration of clip to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteDurationL( const TInt aDuration ) - { - AddIntegerL( KDurationPoint, aDuration ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteSeekArrayPointL -// Writes seek array point of clip to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteSeekArrayPointL( const TInt aPoint ) - { - AddIntegerL( KSeekArrayPoint, aPoint ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteUserIdL -// Writes user id to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteUserIdL( const TDesC& aId ) - { - WriteStringDataL( KUserIdPoint, aId ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteDeviceInfoL -// Writes device info to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteDeviceInfoL( const TDesC& aInfo ) - { - WriteStringDataL( KDeviceInfoPoint, aInfo ); - iEsgDataPoint = KDeviceInfoPoint + KStringLengthBytes + aInfo.Length(); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteEsgDataL -// Writes ESG data to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteEsgDataL( const TDesC& aService, const TDesC& aProgram ) - { - // Device info must exist first - User::LeaveIfError( iEsgDataPoint ); - - // Service name - WriteStringDataL( iEsgDataPoint, aService ); - - // Program name - const TInt prog( iEsgDataPoint + KStringLengthBytes + aService.Length() ); - WriteStringDataL( prog, aProgram ); - iSrtpDataPoint = prog + KStringLengthBytes + aProgram.Length(); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteSrtpDataL -// Writes SRTP data to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteSrtpDataL( const TDesC8& aSrtpData ) - { - // ESG data must exist first - User::LeaveIfError( iSrtpDataPoint ); - User::LeaveIfError( ( iMode!=EMetaWrite ) * KErrAccessDenied ); - - AddIntegerL( iSrtpDataPoint, aSrtpData.Length() ); - AddDataL( iSrtpDataPoint + KIntegerBytes, aSrtpData ); - iSdpDataPoint = iSrtpDataPoint + KIntegerBytes + aSrtpData.Length(); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteSdpDataL -// Writes SDP file data to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteSdpDataL( const TDesC8& aSdpData ) - { - // SRTP data must exist first - User::LeaveIfError( iSdpDataPoint ); - User::LeaveIfError( ( iMode != EMetaWrite ) * KErrAccessDenied ); - - if ( aSdpData.Length() ) - { - AddIntegerL( iSdpDataPoint, aSdpData.Length() ); - AddDataL( iSdpDataPoint + KIntegerBytes, aSdpData ); - } - else - { - AddIntegerL( iSdpDataPoint, 0 ); - } - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadAttributesL -// Reads attributes of meta data header from clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadAttributesL( SAttributes& aAtt ) - { - aAtt.iVersion = 0; - - // Attributes - HBufC8* bytes = iDataPtr.Mid( KAttributesPoint, KIntegerBytes ).AllocLC(); - TUint data( CRtpUtil::GetValueL( bytes->Des() ) ); - CleanupStack::PopAndDestroy( bytes ); - aAtt.iOngoing = ( data >> KOngoingFlagShift ) & ETrue; - aAtt.iCompleted = ( data >> KCompletedFlagShift ) & ETrue; - aAtt.iProtected = ( data >> KProtectedFlagShift ) & ETrue; - aAtt.iFailed = ( data >> KFailedFlagShift ) & ETrue; - aAtt.iVersion = ( TUint8 )( ( data >> KVersionFieldShift ) & 0xF ); - aAtt.iQuality = ( TUint8 )( ( data >> KQualityFieldShift ) & KMaxTUint8 ); - aAtt.iPostRule = ( TUint8 )( ( data >> KPostRuleFieldShift ) & KMaxTUint8 ); - aAtt.iParental = ( TUint8 )( ( data >> KParentalFieldShift ) & KMaxTUint8 ); - - // Play count - bytes = iDataPtr.Mid( KPlayCountPoint, KIntegerBytes ).AllocLC(); - aAtt.iPlayCount = CRtpUtil::GetValueL( bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - - // Play start spot - bytes = iDataPtr.Mid( KPlaySpotPoint, KIntegerBytes ).AllocLC(); - aAtt.iPlaySpot = CRtpUtil::GetValueL( bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - - // Reserved room for 4 integers - /* - bytes = iDataPtr.Mid( KReservedPoint1, KIntegerBytes ).AllocLC(); - aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - - bytes = iDataPtr.Mid( KReservedPoint2, KIntegerBytes ).AllocLC(); - aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - - bytes = iDataPtr.Mid( KReservedPoint3, KIntegerBytes ).AllocLC(); - aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - - bytes = iDataPtr.Mid( KReservedPoint4, KIntegerBytes ).AllocLC(); - aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - */ - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadStartTimeL -// Reads date/time of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadStartTimeL( TTime& aTime ) - { - GetTimeL( KStartTimePoint, aTime ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadEndTimeL -// Reads date/time of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadEndTimeL( TTime& aTime ) - { - GetTimeL( KEndTimePoint, aTime ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadDurationL -// Reads clip duration of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadDurationL( TInt& aDuration ) - { - HBufC8* bytes = iDataPtr.Mid( KDurationPoint, KIntegerBytes ).AllocLC(); - aDuration = CRtpUtil::GetValueL( bytes->Des() ); - User::LeaveIfError( aDuration ); - CleanupStack::PopAndDestroy( bytes ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadSeekArrayPointL -// Reads seek array point of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadSeekArrayPointL( TInt& aPoint ) - { - HBufC8* bytes = iDataPtr.Mid( KSeekArrayPoint, KIntegerBytes ).AllocLC(); - aPoint = CRtpUtil::GetValueL( bytes->Des() ); - User::LeaveIfError( aPoint ); - CleanupStack::PopAndDestroy( bytes ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadUserIdL -// Reads user id of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadUserIdL( TDes& aId ) - { - ReadStringDataL( KUserIdPoint, aId ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadDeviceInfoL -// Reads device info of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadDeviceInfoL( TDes& aInfo ) - { - ReadStringDataL( KDeviceInfoPoint, aInfo ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadEsgDataL -// Reads ESG data of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadEsgDataL( TDes& aService, TDes& aProgram ) - { - User::LeaveIfError( iEsgDataPoint ); - - // Service name - ReadStringDataL( iEsgDataPoint, aService ); - - // Program name - const TInt prog( iEsgDataPoint + KStringLengthBytes + aService.Length() ); - ReadStringDataL( prog, aProgram ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadSrtpDataL -// Reads SRTP data of meta header from the clip. -// ----------------------------------------------------------------------------- -// -HBufC8* CRtpMetaHeader::ReadSrtpDataL() - { - User::LeaveIfError( iSrtpDataPoint ); - - // Length - const TInt len( CRtpUtil::GetValueL( - iDataPtr.Mid( iSrtpDataPoint, KIntegerBytes ) ) ); - // Data - const TInt total( iSrtpDataPoint + KIntegerBytes + len ); - User::LeaveIfError( ( len < 0 || total > iDataPtr.MaxLength() ) * KErrCorrupt ); - HBufC8* buf = iDataPtr.Mid( iSrtpDataPoint + KIntegerBytes, len ).AllocL(); - return buf; - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadSdpDataL -// Reads SDP file data of meta header from the clip. -// ----------------------------------------------------------------------------- -// -HBufC8* CRtpMetaHeader::ReadSdpDataL() - { - User::LeaveIfError( iSdpDataPoint ); - - // Length - const TInt len( CRtpUtil::GetValueL( - iDataPtr.Mid( iSdpDataPoint, KIntegerBytes ) ) ); - // Data - const TInt total( iSdpDataPoint + KIntegerBytes + len ); - User::LeaveIfError( ( len <= 0 || total > iDataPtr.MaxLength() ) * KErrCorrupt ); - HBufC8* buf = iDataPtr.Mid( iSdpDataPoint + KIntegerBytes, len ).AllocL(); - return buf; - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::WriteStringDataL -// Writes data with length info to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::WriteStringDataL( const TInt aPosition, const TDesC& aData ) - { - const TInt len( aData.Length() ); - User::LeaveIfError( ( len > TInt( KMaxTUint8 ) ) * KErrArgument ); - User::LeaveIfError( ( iMode != EMetaWrite ) * KErrAccessDenied ); - - // Length - TBuf8 buf( KNullDesC8 ); - buf.Append( KCharSpace ); - buf[0] = ( TUint8 )( len ); - AddDataL( aPosition, buf ); - - // Data to 8-bit - HBufC8* data = HBufC8::NewLC( aData.Length() ); - TPtr8 ptr( data->Des() ); - ptr.Copy( aData ); - AddDataL( aPosition + KStringLengthBytes, ptr ); - CleanupStack::PopAndDestroy( data ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadStringDataL -// Reads data with length info of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadStringDataL( const TInt aPosition, TDes& aData ) - { - User::LeaveIfError( ( aPosition < 0 || aPosition > iDataPtr.Length() ) - * KErrArgument ); - const TInt len( iDataPtr[aPosition] ); - User::LeaveIfError( ( len < 0 || len > TInt( KMaxTUint8 ) ) * KErrCorrupt ); - User::LeaveIfError( ( len > aData.MaxLength() ) * KErrArgument ); - - aData.Copy( iDataPtr.Mid( aPosition + KStringLengthBytes, len ) ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::AddTimeL -// Writes data/time or duration of clip to meta header of the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::AddTimeL( const TInt aPosition, const TTime& aTime ) - { - HBufC8* bytes = CRtpUtil::MakeBytesLC( I64LOW( aTime.Int64() ) ); - AddDataL( aPosition, bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - - bytes = CRtpUtil::MakeBytesLC( I64HIGH( aTime.Int64() ) ); - AddDataL( aPosition + KIntegerBytes, bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::GetTimeL -// Reads time value of meta header from the clip. -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::GetTimeL( const TInt aPosition, TTime& aTime ) - { - TUint low( CRtpUtil::GetValueL( - iDataPtr.Mid( aPosition, KIntegerBytes ) ) ); - TUint high( CRtpUtil::GetValueL( - iDataPtr.Mid( aPosition + KIntegerBytes, KIntegerBytes ) ) ); - - aTime = TInt64( MAKE_TINT64( high, low ) ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::AddIntegerL -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::AddIntegerL( const TInt aPosition, const TInt aValue ) - { - HBufC8* bytes = CRtpUtil::MakeBytesLC( aValue ); - AddDataL( aPosition, bytes->Des() ); - CleanupStack::PopAndDestroy( bytes ); - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::AddDataL -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::AddDataL( const TInt aPosition, const TDesC8& aData ) - { - // Write must be in certain order - User::LeaveIfError( ( aPosition > iMetaTotal ) * KErrWrite ); - - switch ( iMode ) - { - case EMetaWrite: - iMetaTotal = iMetaData->Length() + aData.Length(); - iMetaData = iMetaData->ReAllocL( iMetaTotal ); - iDataPtr.Set( iMetaData->Des() ); - iDataPtr.Insert( aPosition, aData ); - break; - - case EMetaUpdate: - User::LeaveIfError( iFile.Write( aPosition, aData, aData.Length() ) ); - break; - - default: - User::Leave( KErrNotSupported ); - break; - } - } - -// ----------------------------------------------------------------------------- -// CRtpMetaHeader::ReadTintFromFileL -// ----------------------------------------------------------------------------- -// -void CRtpMetaHeader::ReadTintFromFileL( const TInt& aPosition, TInt& aValue ) - { - HBufC8* bytes = HBufC8::NewLC( KIntegerBytes ); - TPtr8 ptr( bytes->Des() ); - User::LeaveIfError( iFile.Read( aPosition, ptr, KIntegerBytes ) ); - - aValue = CRtpUtil::GetValueL( ptr ); - CleanupStack::PopAndDestroy( bytes ); - } - -// End of File