mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropdesc.cpp
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropdesc.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,716 @@
+/*
+* Copyright (c) 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:  Implement the operation: GetObjectPropDesc
+*
+*/
+
+#include <mtp/cmtptypeobjectpropdesc.h>
+#include <mtp/mtpprotocolconstants.h>
+#include <mtp/cmtptypestring.h>
+
+#include "cmediamtpdataprovidergetobjectpropdesc.h"
+#include "mediamtpdataproviderconst.h"
+#include "mmmtpdplogger.h"
+#include "mmmtpdpdefs.h"
+
+const TUint32 KMTPDescriptionLen = 0x00000200;
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::NewL
+// Two-phase construction method
+// -----------------------------------------------------------------------------
+//
+MMmRequestProcessor* CMediaMtpDataProviderGetObjectPropDesc::NewL( MMTPDataProviderFramework& aFramework,
+    MMTPConnection& aConnection,
+    MMmMtpDpConfig& aDpConfig )
+    {
+    CMediaMtpDataProviderGetObjectPropDesc* self =
+        new ( ELeave ) CMediaMtpDataProviderGetObjectPropDesc( aFramework,
+            aConnection,
+            aDpConfig );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::ConstructL
+// Two-phase construction method
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ConstructL()
+    {
+    CGetObjectPropDesc::ConstructL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::~CMediaMtpDataProviderGetObjectPropDesc
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CMediaMtpDataProviderGetObjectPropDesc::~CMediaMtpDataProviderGetObjectPropDesc()
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::CMediaMtpDataProviderGetObjectPropDesc
+// Standard c++ constructor
+// -----------------------------------------------------------------------------
+//
+CMediaMtpDataProviderGetObjectPropDesc::CMediaMtpDataProviderGetObjectPropDesc( MMTPDataProviderFramework& aFramework,
+    MMTPConnection& aConnection,
+    MMmMtpDpConfig& aDpConfig ) :
+    CGetObjectPropDesc( aFramework, aConnection, aDpConfig )
+    {
+
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceSpecificObjectPropertyL(TUint16 aPropCode)
+    {
+    switch (aPropCode)
+        {
+        // format specific
+        case EMTPObjectPropCodeArtist: // Artist
+        case EMTPObjectPropCodeTrack: // Track
+        case EMTPObjectPropCodeGenre: // Genre
+        case EMTPObjectPropCodeUseCount: // Use Count
+        case EMTPObjectPropCodeAlbumName: // Album Name
+        case EMTPObjectPropCodeAlbumArtist: // Album Artist
+        case EMTPObjectPropCodeOriginalReleaseDate: // Original Release Date
+        case EMTPObjectPropCodeComposer: // Composer
+        case EMTPObjectPropCodeParentalRating:
+            iObjectProperty = CMTPTypeObjectPropDesc::NewL( aPropCode );
+            break;
+
+        // Number of Channels (m)
+        case EMTPObjectPropCodeNumberOfChannels:
+            ServiceNumberOfChannelsL();
+            break;
+
+        // Sample Rate (HAS MINIMUM AND MAX VALUE)
+        case EMTPObjectPropCodeSampleRate:
+            ServiceCodeSampleRateL();
+            break;
+
+        // Audio Wave Codec (MAY REQUIRED LIMITED NUMBER TO BE PRODUCED)
+        case EMTPObjectPropCodeAudioWAVECodec:
+            ServiceCodeWaveCodecL();
+            break;
+
+        // Audio Bit Rate (MAY REQUIRED LIMITED NUMBER TO BE PRODUCED)
+        case EMTPObjectPropCodeAudioBitRate:
+            ServiceCodeAudioBitrateL();
+            break;
+
+        // Duration
+        case EMTPObjectPropCodeDuration:
+            ServiceDurationL();
+            break;
+
+        // Description
+        case EMTPObjectPropCodeDescription:
+            ServiceDescriptionL();
+            break;
+
+        case EMTPObjectPropCodeWidth:
+            ServiceRangeFormDescriptionL( aPropCode,
+                EMTPMinWidth,
+                EMTPMaxWidth,
+                EMTPStepWidth );
+            break;
+
+        case EMTPObjectPropCodeHeight:
+            ServiceRangeFormDescriptionL( aPropCode,
+                EMTPMinHeight,
+                EMTPMaxHeight,
+                EMTPStepHeight );
+            break;
+
+        case EMTPObjectPropCodeScanType:
+            ServiceScanTypeDescriptionL();
+            break;
+
+        case EMTPObjectPropCodeVideoFourCCCodec:
+            ServiceVideoFourCCCodecL();
+            break;
+
+        case EMTPObjectPropCodeVideoBitRate:
+            ServiceRangeFormDescriptionL( aPropCode,
+                EMTPWMVMinBitrate,
+                EMTPWMVMaxBitrate,
+                EMTPVideoBitrateStep,
+                ETrue );
+            break;
+
+        case EMTPObjectPropCodeFramesPerThousandSeconds:
+            ServiceRangeFormDescriptionL( aPropCode,
+                EMTPMinFramesPerThousandSeconds,
+                EMTPMaxFramesPerThousandSeconds,
+                EMTPStepFramesPerThousandSeconds );
+            break;
+
+        case EMTPObjectPropCodeKeyFrameDistance:
+            ServiceRangeFormDescriptionL( aPropCode,
+                EMTPMinKeyFrameDistance,
+                EMTPMaxKeyFrameDistance,
+                EMTPStepKeyFrameDistance );
+            break;
+
+        case EMTPObjectPropCodeEncodingProfile:
+            ServiceEncodingProfileDescriptionL();
+            break;
+
+        case EMTPObjectPropCodeDRMStatus:
+            ServiceDRMStatusL();
+            break;
+
+        case EMTPExtObjectPropCodeOmaDrmStatus:
+            ServiceOMADRMStatusL();
+            break;
+
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::ServiceDescriptionL()
+// Create Description and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceDescriptionL()
+    {
+    TMTPTypeUint32 uint32Data( KMTPDescriptionLen );
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeDescription,
+        CMTPTypeObjectPropDesc::ELongStringForm,
+        &uint32Data );
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::ServiceNumberOfChannelsL
+// Create list of possible Channel numbers and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceNumberOfChannelsL()
+    {
+    PRINT( _L( "MM MTP => CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeSampleRateL" ) );
+
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm = CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT16 );
+    CleanupStack::PushL( expectedForm ); // + expectedForm
+
+    TUint16 values[] =
+        {
+        EMTPChannelMono,
+        EMTPChannelStereo
+        };
+
+    TInt numValues =  sizeof ( values ) / sizeof ( values[0] ) ;
+
+    for ( TInt i = 0; i < numValues; i++ )
+        {
+        TMTPTypeUint16 data( values[i] );
+        expectedForm->AppendSupportedValueL( data );
+        }
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way :)
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeNumberOfChannels, *expectedForm );
+    CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeSampleRateL" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeSampleRateL
+// Create list of possible Sample rate list and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeSampleRateL()
+    {
+    // if some format does not support the sample rate,
+    // here still need an instance of CMTPTypeObjectPropDesc.
+    PRINT( _L( "MM MTP => CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeSampleRateL" ) );
+
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm =
+        CMTPTypeObjectPropDescEnumerationForm::NewLC( EMTPTypeUINT32 ); // + expectedForm
+
+    TUint32 values[] =
+        {
+        EMTPSampleRate8K ,
+        EMTPSampleRate16K,
+        EMTPSampleRate22_05K,
+        EMTPSampleRate24K,
+        EMTPSampleRate32K,
+        EMTPSampleRate44_1K,
+        EMTPSampleRate48K
+        };
+
+    TInt numValues = sizeof( values ) / sizeof( values[0] ) ;
+
+    for ( TInt i = 0; i < numValues; i++ )
+        {
+        TMTPTypeUint32 data( values[i] );
+        expectedForm->AppendSupportedValueL( data );
+        }
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way :)
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeSampleRate, CMTPTypeObjectPropDesc::EEnumerationForm, expectedForm );
+    CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeSampleRateL" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::ServiceWaveCodecL
+// Create list of possible bitrate types and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL()
+    {
+    PRINT1( _L( "MM MTP => CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL, format = 0x%x" ), iFormatCode );
+
+    CMTPTypeObjectPropDescEnumerationForm* form =
+    CMTPTypeObjectPropDescEnumerationForm::NewLC( EMTPTypeUINT32 ); // + form
+
+    switch (iFormatCode)
+        {
+        case EMTPFormatCodeWMA:
+        case EMTPFormatCodeWMV:
+        case EMTPFormatCodeASF:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL format = 0x%x" ), iFormatCode );
+            TMTPTypeUint32 data( EMTPAudioWAVECodecWMA );
+            form->AppendSupportedValueL( data );
+            }
+            break;
+
+        case EMTPFormatCodeMP3:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL format = 0x%x" ), iFormatCode );
+            TMTPTypeUint32 data( EMTPAudioWAVECodecMP3 );
+            form->AppendSupportedValueL( data );
+            }
+            break;
+
+        case EMTPFormatCodeMP4Container:
+        case EMTPFormatCode3GPContainer:
+        case EMTPFormatCodeAAC:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL format = 0x%x" ), iFormatCode );
+            TMTPTypeUint32 data( EMTPAudioWAVECodecAAC );
+            form->AppendSupportedValueL( data );
+            }
+            break;
+
+        case EMTPFormatCodeWAV:
+            {
+            PRINT1( _L("MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL format = 0x%x"), iFormatCode );
+            TMTPTypeUint32 data( EMTPAudioWAVECodecPCM );
+            form->AppendSupportedValueL( data );
+            }
+            break;
+
+        default:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL leave because of invalid formatcode = 0x%x" ), iFormatCode );
+            User::Leave(KErrNotSupported);
+            }
+            break;
+        }
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way :)
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeAudioWAVECodec, *form );
+    CleanupStack::PopAndDestroy( form ); // - form
+
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeWaveCodecL" ) );
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeAudioBitrateL()
+    {
+    PRINT1( _L("MM MTP => CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeAudioBitrate, format = 0x%x"), iFormatCode );
+
+    switch (iFormatCode)
+        {
+        case EMTPFormatCodeWMA:
+        case EMTPFormatCodeWMV:
+        case EMTPFormatCodeASF:
+            {
+            ServiceRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                EMTPWMAMinBitrate,
+                EMTPWMAMaxBitrate,
+                EMTPAudioBitrateStep );
+            }
+            break;
+
+        case EMTPFormatCodeMP3:
+            {
+            ServiceRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                EMTPMP3MinBitrate,
+                EMTPMP3MaxBitrate,
+                EMTPAudioBitrateStep );
+            }
+            break;
+
+        case EMTPFormatCodeAAC:
+            {
+            ServiceRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                EMTPAACMinBitrate,
+                EMTPAACMaxBitrate,
+                EMTPAudioBitrateStep );
+            }
+            break;
+
+        case EMTPFormatCodeWAV:
+            {
+            ServiceRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                EMTPPCMMinBitrate,
+                EMTPPCMMaxBitrate,
+                EMTPAudioBitrateStep );
+            }
+            break;
+
+        case EMTPFormatCodeMP4Container:
+        case EMTPFormatCode3GPContainer:
+            {
+            ServiceRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                EMTPAACPlusMinBitrate,
+                EMTPAACPlusMaxBitrate,
+                EMTPAudioBitrateStep );
+            }
+            break;
+
+        default:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeAudioBitRateL leave because of invalid formatcode = 0x%x" ), iFormatCode );
+            User::Leave( KErrNotSupported );
+            }
+        }
+
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderGetObjectPropDesc::ServiceCodeAudioBitRateL" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CGetObjectPropDesc::ServiceDurationL()
+// Create list of Duration types and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceDurationL()
+    {
+
+    PRINT( _L( "MM MTP => CMediaMtpDataProviderGetObjectPropDesc::ServiceDurationL" ) );
+
+    CMTPTypeObjectPropDescRangeForm* form = CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form
+
+    // Set expected values
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPMinDuration );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPMaxDuration );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPDurationStep );
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeDuration, *form );
+    CleanupStack::PopAndDestroy( form ); // - form
+
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderGetObjectPropDesc::ServiceDurationL" ) );
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceScanTypeDescriptionL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm =
+        CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT16 );
+    CleanupStack::PushL( expectedForm ); // + expectedForm
+
+    TUint16 values[] =
+        {
+        EMTPScanTypeProgressive
+        };
+
+    TInt numValues = sizeof ( values ) / sizeof ( values[0] ) ;
+    for ( TInt i = 0; i < numValues; i++ )
+        {
+        TMTPTypeUint16 data( values[i] );
+        expectedForm->AppendSupportedValueL( data );
+        }
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way :)
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeScanType, *expectedForm );
+    CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceVideoFourCCCodecL()
+    {
+    switch( iFormatCode )
+        {
+        case EMTPFormatCodeWMV:
+        case EMTPFormatCodeASF:
+            {
+            CMTPTypeObjectPropDescEnumerationForm* expectedForm =
+                CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT32 );
+            CleanupStack::PushL( expectedForm ); // + expectedForm
+
+            TUint32 values[] =
+                {
+                EMTPVideoFourCCCodecWMV3
+                };
+
+            TInt numValues = sizeof ( values ) / sizeof ( values[0] ) ;
+            for ( TInt i = 0; i < numValues; i++ )
+                {
+                TMTPTypeUint32 data( values[i] );
+                expectedForm->AppendSupportedValueL( data );
+                }
+
+            // comment out asf fourcc for mp2a and mp4a, not sure if this is needed
+            /*if ( iFormatCode == EMTPFormatCodeASF )
+                {
+                TUint32 additionalValues[] =
+                    {
+                    EMTPVideoFourCCCodecMP2A,
+                    EMTPVideoFourCCCodecMP4A
+                    };
+
+                for ( TInt j = 0; i < sizeof(additionalValues) / sizeof(additionalValues[0]) )
+                    {
+                    TMTPTypeUint32 data( additionalValues[i] );
+                    expectedForm->AppendSupportedValueL( data );
+                    }
+                }*/
+
+            // Althrough iObjectProperty is released in ServiceL(),
+            // release it here maybe a more safer way :)
+            if ( iObjectProperty != NULL )
+                {
+                delete iObjectProperty;
+                iObjectProperty = NULL;
+                }
+
+            iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeVideoFourCCCodec, *expectedForm );
+            CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+            }
+            break;
+
+        default:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceVideoFourCCCodecL leave because of invalid formatcode = 0x%x" ), iFormatCode );
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        }
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceVideoBitrateL()
+    {
+    switch( iFormatCode )
+        {
+        case EMTPFormatCodeWMV:
+        case EMTPFormatCodeASF:
+            {
+            ServiceRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                EMTPWMVMinBitrate,
+                EMTPWMVMaxBitrate,
+                EMTPVideoBitrateStep,
+                ETrue );
+            }
+            break;
+
+        default:
+            {
+            PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropDesc::ServiceVideoBitrateL leave because of invalid formatcode = 0x%x" ), iFormatCode );
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        }
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceEncodingProfileDescriptionL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm =
+        CMTPTypeObjectPropDescEnumerationForm::NewLC( EMTPTypeString ); // + expectedForm
+
+    CMTPTypeString* string = CMTPTypeString::NewLC( _L( "SP@LL" ) );
+    expectedForm->AppendSupportedValueL( *string );
+    string->SetL(_L("SP@ML"));
+    expectedForm->AppendSupportedValueL( *string );
+    string->SetL(_L("MP@LL"));
+    expectedForm->AppendSupportedValueL( *string );
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeString;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::EEnumerationForm;
+    propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadWrite;
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeEncodingProfile,
+        propertyInfo,
+        expectedForm );
+
+    CleanupStack::PopAndDestroy( string );
+    CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+    }
+
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceRangeFormDescriptionL( TUint16 aPropCode,
+    TUint32 aMinValue,
+    TUint32 aMaxValue,
+    TUint32 aStepValue,
+    TBool aIsReadOnly )
+    {
+    CMTPTypeObjectPropDescRangeForm* form =
+        CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form
+
+    // Set expected values
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, aMinValue );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, aMaxValue );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, aStepValue );
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeUINT32;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm;
+    propertyInfo.iGetSet = !aIsReadOnly;
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( aPropCode, propertyInfo, form );
+
+    CleanupStack::PopAndDestroy( form ); // - form
+    }
+
+// -----------------------------------------------------------------------------
+// CGetObjectPropDesc::ServiceDRMStatusL
+// Create list of possible DRM status and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceDRMStatusL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm =
+        CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT16 );
+    CleanupStack::PushL( expectedForm ); // + expectedForm
+
+    TUint16 values[] =
+        {
+        EMTPDrmNoProtection,
+        EMTPDrmProtection,
+        EMTPDrmReserveForMTP,
+        EMTPDrmVenderExtension
+        };
+
+    TInt numValues = sizeof ( values ) / sizeof ( values[0] ) ;
+    for ( TInt i = 0; i < numValues; i++ )
+        {
+        TMTPTypeUint16 data( values[i] );
+        expectedForm->AppendSupportedValueL( data );
+        }
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way :)
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeDRMStatus, *expectedForm );
+    CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+    }
+
+// -----------------------------------------------------------------------------
+// CMediaMtpDataProviderGetObjectPropDesc::ServiceOMADRMStatusL
+// Create list of possible OMA DRM status and create new ObjectPropDesc
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderGetObjectPropDesc::ServiceOMADRMStatusL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm =
+        CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT8 );
+    CleanupStack::PushL( expectedForm ); // + expectedForm
+
+    TUint8 values[] =
+        {
+        EMTPOMADrmNoProtection,
+        EMTPOMADrmProtection,
+        };
+
+    TInt numValues = sizeof ( values ) / sizeof ( values[0] ) ;
+    for ( TInt i = 0; i < numValues; i++ )
+        {
+        TMTPTypeUint8 data( values[i] );
+        expectedForm->AppendSupportedValueL( data );
+        }
+
+    // Althrough iObjectProperty is released in ServiceL(),
+    // release it here maybe a more safer way :)
+    if ( iObjectProperty != NULL )
+        {
+        delete iObjectProperty;
+        iObjectProperty = NULL;
+        }
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeUINT8;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::EEnumerationForm;
+
+    iObjectProperty = CMTPTypeObjectPropDesc::NewL( EMTPExtObjectPropCodeOmaDrmStatus,
+        propertyInfo,
+        expectedForm );
+    CleanupStack::PopAndDestroy( expectedForm ); // - expectedForm
+    }
+
+// end of file