--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/harvester/harvesterplugins/RTPPlugin/src/harvesterrtpmetadatareader.cpp Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: Reads metadata from rtp clip meta header
+*
+*/
+
+#include "harvesterrtpmetadatareader.h"
+#include "harvesterrtpplugin.h"
+#include "harvesterlog.h"
+
+_LIT( KTxtSpace, " ");
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CHarvesterRtpMetaDataReader* CHarvesterRtpMetaDataReader::NewL(
+ const TDesC8* aFileBuffer )
+ {
+ CHarvesterRtpMetaDataReader* self =
+ new( ELeave ) CHarvesterRtpMetaDataReader( aFileBuffer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CHarvesterRtpMetaDataReader::~CHarvesterRtpMetaDataReader()
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader::~CHarvesterRtpMetaDataReader()" );
+ delete iMetaData;
+ }
+
+// ---------------------------------------------------------------------------
+// Read details from meta header
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRtpMetaDataReader::GetClipDetailsL(
+ CHarvesterRtpClipDetails& aDetails )
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader::GetClipDetailsL()" );
+
+ // Attributes
+ TPtrC8 bytes( iDataPtr.Mid( KAttributesPoint, KIntegerBytes ) );
+ TUint data( 0 );
+ User::LeaveIfError( GetValue( bytes, data ) );
+
+ // Recording quality
+ aDetails.iQuality =
+ ( TUint8 )( ( data >> KQualityFieldShift ) & KMaxTUint8 );
+ //Recording ongoing
+ aDetails.iRecOngoing =
+ ( data >> KOngoingFlagShift ) & ETrue;
+ // Recording completed
+ aDetails.iRecCompleted =
+ ( data >> KCompletedFlagShift ) & ETrue;
+ //Recording failed
+ aDetails.iRecFailed =
+ ( data >> KFailedFlagShift ) & ETrue;
+ //Parental rate
+ aDetails.iParental =
+ ( TUint8 )( ( data >> KParentalFieldShift ) & KMaxTUint8 );
+ // Post rule
+ TUint8 postRule =
+ ( TUint8 )( ( data >> KPostRuleFieldShift ) & KMaxTUint8 );
+
+ if ( postRule == KContentRightsLockToDevice )
+ {
+ aDetails.iPostRule = ETrue;
+ }
+ else
+ {
+ aDetails.iPostRule = EFalse;
+ }
+
+ // Duration
+ TUint duration( 0 );
+ TPtrC8 durationBytes ( iDataPtr.Mid( KDurationPoint, KIntegerBytes ) );
+ User::LeaveIfError( GetValue( durationBytes, duration ) );
+ duration /= 1000; //Convert to seconds
+ aDetails.iDuration = static_cast<TReal32>( duration );
+
+ // Title
+ GetProgramTitleL( aDetails.iTitle );
+ }
+
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CHarvesterRtpMetaDataReader::CHarvesterRtpMetaDataReader(
+ const TDesC8* aFileBuffer )
+ : iMetaTotal( KErrNotFound ),
+ iMetaData( NULL ),
+ iDataPtr( 0, 0 ),
+ iEsgDataPoint ( KErrNotFound ),
+ iFileBuffer( aFileBuffer )
+ {
+ // None
+ }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRtpMetaDataReader::ConstructL()
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader::ConstructL()" );
+ TPtrC8 bytes;
+
+ if ( iFileBuffer
+ && iFileBuffer->Length() > KIntegerBytes )
+ {
+ // Read whole meta area
+ bytes.Set( iFileBuffer->Mid( KMetaLengthPoint, KIntegerBytes ) );
+ }
+
+ TUint value ( 0 );
+ User::LeaveIfError( GetValue( bytes, value ) );
+
+ iMetaTotal = value;
+
+ if ( iMetaTotal > KMaxMetaHeaderLength || iMetaTotal <= 0 )
+ {
+ //Length not reasonable, metadata corrupted
+ WRITELOG( "CHarvesterRtpMetaDataReader - metadata corrupted, leave!" );
+ User::Leave( KErrCorrupt );
+ }
+
+ iMetaData = HBufC8::NewL( iMetaTotal );
+ *iMetaData = iFileBuffer->Mid( KMetaLengthPoint, iMetaTotal );
+
+ iDataPtr.Set( iMetaData->Des() );
+
+ // Check that all data exist in meta header
+ if ( iDataPtr.Length() < iMetaTotal )
+ {
+ //Meta header corrupted
+ WRITELOG( "CHarvesterRtpMetaDataReader - metaheader corrupted, leave!" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // ESG data point ( device info point + device info data )
+ iEsgDataPoint = KDeviceInfoPoint + KStringLengthBytes +
+ iDataPtr[KDeviceInfoPoint];
+
+ }
+
+// -----------------------------------------------------------------------------
+// Reads data with length info of meta header from the clip
+// -----------------------------------------------------------------------------
+//
+void CHarvesterRtpMetaDataReader::ReadStringDataL(
+ const TInt aPosition,
+ TPtrC8& aData )
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader::ReadStringDataL()" );
+
+ if ( aPosition < 0
+ || aPosition > iDataPtr.Length() )
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader - KErrArgument, leave!" );
+ User::Leave( KErrArgument );
+ }
+
+ const TInt len( iDataPtr[aPosition] );
+
+ if ( len < 0
+ || len > TInt( KMaxTUint8 ) )
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader - KErrCorrupt, leave!" );
+ User::Leave( KErrCorrupt );
+ }
+
+ aData.Set( iDataPtr.Mid( aPosition + KStringLengthBytes, len ) );
+ }
+
+// -----------------------------------------------------------------------------
+// Get value
+// -----------------------------------------------------------------------------
+//
+TInt CHarvesterRtpMetaDataReader::GetValue(
+ const TDesC8& aBytes,
+ TUint& aValue )
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader::GetValue()" );
+ if ( aBytes.Length() >= KIntegerBytes )
+ {
+ aValue = ( TUint )( aBytes[0] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[1] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[2] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[3] );
+ return KErrNone;
+ }
+
+ WRITELOG( "CHarvesterRtpMetaDataReader::GetValue() : KErrUnderFlow!" );
+ return KErrUnderflow;
+ }
+
+// -----------------------------------------------------------------------------
+// Get and format clip title
+// -----------------------------------------------------------------------------
+//
+void CHarvesterRtpMetaDataReader::GetProgramTitleL( TDes& aTitle )
+ {
+ WRITELOG( "CHarvesterRtpMetaDataReader::GetProgramTitleL()" );
+
+ User::LeaveIfError( iEsgDataPoint );
+ aTitle.Zero();
+
+ TUint32 totalLength( 0 );
+ TPtrC8 service;
+ TPtrC8 program;
+
+ ReadStringDataL( iEsgDataPoint, service );
+
+ totalLength += service.Length();
+ totalLength += KSpaceLength;
+
+ // Program name
+ const TInt progPos( iEsgDataPoint + KStringLengthBytes + service.Length() );
+ ReadStringDataL( progPos, program );
+
+ totalLength += program.Length();
+
+ HBufC8* title = HBufC8::NewLC( totalLength );
+ title->Des().Append( service.Ptr(), service.Length() );
+ title->Des().Append( KTxtSpace );
+ title->Des().Append( program.Ptr(), program.Length() );
+
+ if ( totalLength > KMaxProgramTitle )
+ {
+ //Make title fit in max title length
+ TPtrC8 titlePtr( *title );
+ aTitle.Copy( titlePtr.Mid( 0 , KMaxProgramTitle ) );
+ }
+ else
+ {
+ aTitle.Copy( *title );
+ }
+
+ CleanupStack::PopAndDestroy( title );
+ }
+