multimediacommscontroller/mmccshared/inc/mccinternaldef.h
changeset 0 1bce908db942
child 15 f40c1a748eb9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccshared/inc/mccinternaldef.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,787 @@
+/*
+* Copyright (c) 2004-2007 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:    Mcc Internal definitions
+*
+*/
+
+
+
+
+#ifndef MCCINTERNALDEF_H
+#define MCCINTERNALDEF_H
+
+// INCLUDES
+#include <e32base.h>
+#include <mmf/common/mmfcontroller.h>
+#include <tconvbase64.h>  
+
+
+#include "rtpdef.h"
+#include "mmccinterfacedef.h"
+#include "mccinternalcodecs.h"
+#include "mccuids.hrh"
+
+// CONSTANTS
+const TUid KMccControllerUid        = { KImplUidMccController };
+const TUid KMccAmrFormatterUid      = { KDllUidAmrPayloadFormat };
+const TUid KMccJitterBufferUid      = { KDllUidMccJitterBuffer };
+const TUid KMccMultiplexerUid       = { KDllUidMccMultiplexer };
+const TUid KMccDtmfFormatterUid     = { KDllUidDTMFPayloadFormat };
+const TUid KMccMedianattraversalUid = { KImplUidMccmedianattraversal };
+
+const TInt KMaxBitrates = 12;
+
+// VoIP codecs have a two byte header
+const TInt KVoIPHeaderLength = 2;
+
+// VoIP codec header bytes can be audio, comfort noise or unvoiced non-sid
+// (null/no data) frame. Unvoiced non sid frame can be detected by header
+// byte being something else than audio or comfort noise.
+const TUint8 KVoIPAudioFrame = 1;
+const TUint8 KVoIPCNFrame = 2;
+
+// Bits per byte
+const TInt KBitsPerByte = 8;
+
+// Defines unassigned payload type
+const TUint8 KMccPTNotDefined = 128;
+
+// Used to define exitence of codec which is not supported by mcc
+const TUint32 KMccFourCCUnsupported = 0x4EEEEEEE;
+
+const TInt KMccFourCCArraySize = 10;
+
+// Use TPckgBuf<TInt> as a parameter value. Should not overlap with values from API.
+const TUint32 KMccPrerollTime = 60;
+
+// Increased RTP socket size in bytes, default socket size is around 4KB
+const TInt KMccIncreasedRtpSocketSize = 10000;
+
+// MACROS
+
+#ifdef _DEBUG
+    #define TRACE_MCC_CONTROLLER
+    #define TRACE_MCC_INTERFACE
+#endif
+
+
+#ifdef TRACE_MCC_CONTROLLER
+    #define MCC_CONTROLLER_WRITE(a) \
+    	{ _LIT( KName, a); RDebug::Print(KName); }
+    #define MCC_CONTROLLER_WRITE2(a, b) \
+    	{ _LIT(KName, a); RDebug::Print(KName, b); }
+   	#define MCC_CONTROLLER_WRITE3(a, b, c) \
+    	{ _LIT(KName, a); RDebug::Print(KName, b, c); }
+    #define MCC_CONTROLLER_WRITE4(a, b, c, d) \
+    	{ _LIT(KName, a); RDebug::Print(KName, b, c, d); }
+#else
+   	#define MCC_CONTROLLER_WRITE(a) 
+   	#define MCC_CONTROLLER_WRITE2(a, b)
+   	#define MCC_CONTROLLER_WRITE3(a, b, c)
+   	#define MCC_CONTROLLER_WRITE4(a, b, c, d)
+#endif
+
+#define MCC_CONTROL_ALL_ENDPOINTS(a) ( a == 0 )
+
+#define MCC_ENDPOINT_ID(a) reinterpret_cast<TUint32>( a )
+
+#define IS_MCC_EVENT(a)\
+( a.iEventType == KUidMediaTypeAudio ||\
+a.iEventType == KUidMediaTypeVideo ||\
+a.iEventType == KMccFileSinkUid ||\
+a.iEventType == KMccFileSourceUid ||\
+a.iEventType == KMccRtpSourceUid ||\
+a.iEventType == KMccRtpSinkUid ||\
+a.iEventType == KMccVideoSourceUid ||\
+a.iEventType == KMccVideoSinkUid ||\
+a.iEventType == KMccJitterBufferUid ||\
+a.iEventType == KMccAmrFormatterUid ||\
+a.iEventType == KMccMultiplexerUid ||\
+a.iEventType == KMccDtmfFormatterUid ||\
+a.iEventType == KMccAnySourceUid ||\
+a.iEventType == KMccAnySinkUid )
+
+#define MCC_STREAM_STATE_CHANGE_EVENT( aEvent )\
+( aEvent->iEventCategory == KMccEventCategoryStream &&\
+( aEvent->iEventType == KMccStreamPrepared ||\
+  aEvent->iEventType == KMccStreamStarted ||\
+  aEvent->iEventType == KMccStreamPaused ||\
+  aEvent->iEventType == KMccStreamResumed ||\
+  aEvent->iEventType == KMccStreamStopped ) )
+
+#define MCC_INTERNAL_ENDPOINT( aEndpointUid )\
+( aEndpointUid == KImplUidMccFileSource ||\
+  aEndpointUid == KImplUidMccFileSink ||\
+  aEndpointUid == KImplUidMccJitterBuffer ||\
+  aEndpointUid == KImplUidRtpDataSource ||\
+  aEndpointUid == KImplUidRtpDataSink ||\
+  aEndpointUid == KImplUidMccVideoSource ||\
+  aEndpointUid == KImplUidMccVideoSink ||\
+  aEndpointUid == KImplUidMccAnySource ||\
+  aEndpointUid == KImplUidMccAnySink )
+
+
+#define MCC_IS_AVC_USER_ENTRY( a ) \
+( a && a->iCodecInfo.iSdpName.CompareF( KAVCSdpName ) == 0 )
+
+#define MCC_IS_H263_USER_ENTRY( a ) \
+( a && ( a->iCodecInfo.iSdpName.CompareF( KH263SdpName ) == 0 || \
+a->iCodecInfo.iSdpName.CompareF( KH2632000SdpName ) == 0 || \
+a->iCodecInfo.iSdpName.CompareF( KH2631998SdpName ) == 0 ) )
+
+#define MCC_IS_AVC_PRIMARY_CODEC \
+( iUsers.Count() > 0 && MCC_IS_AVC_USER_ENTRY( iUsers[ 0 ] ) )
+
+#define MCC_IS_H263_PRIMARY_CODEC \
+( iUsers.Count() > 0 && MCC_IS_H263_USER_ENTRY( iUsers[ 0 ] ) )
+
+
+// DATA TYPES
+enum TMccMediaQualityCustomCmd
+    {
+    EStartMediaQualityObserving,
+    ECancelMediaQualityObserving
+    };
+
+enum TSrCustomCommandMessages
+    {
+    ERequestEventNotification = 0,
+    EMccClose,
+    EMccCreateSession,
+    EMccSetRemoteAddress,
+    EMccSetRemoteRtcpAddr,
+    EMccCloseSession,
+    EMccCreateLink,
+    EMccCloseLink,
+    EMccCreateStream,
+    EMccPrepareStream,
+    EMccInactivityTimerStart,
+    EMccInactivityTimerStop,
+    EMccDeleteStream,
+    EMccStartStream,
+    EMccStopStream,
+    EMccPauseStream,
+    EMccResumeStream,
+    EMccGetCodec,
+    EMccGetFmtpAttr,
+    EMccSetCodec,
+    EMccGetSupportedCodecs,
+    EMccStreamSettings,
+    EMccSetAudioPriority,
+    EMccCancel,
+    EMccSendMediaSignal,
+    EMccSendRtcpRR,
+    EMccSendRtcpSR,
+    EMccSendRtcpData,
+    EMccGetSupportedBitrates,
+    EMccGetSSRC,
+    EMccGetSinkId,
+    EMccGetSourceId,
+    EMccEnableViewFinder,
+    EMccDisableViewFinder,
+    EMccGetViewFinderSettings,
+    EMccGetCamInfo,
+    EMccGetNumOfCams,
+    EMccSetCamValue1,
+    EMccGetCamValue1,
+    EMccSetCamValue2,
+    EMccGetCamValue2,
+    EMccLinkExists,
+    EMccStreamsExists,
+    EMccUpdateDataSource,
+    EMccUpdateDataSink,
+    EMccReuse,
+    EMccSetAudioRoute,
+    EMccGetAudioRoute,
+    EMccSetEndpointParameter,
+    EMccGetEndpointParameter,
+    EMccGetReferenceCount,
+    EMccTranscodeFile,
+    EMccCancelTranscodeFile,
+    EMccBindContextIntoStream,
+    EMccRemoveContext
+    };
+    
+
+/*
+* Message class for redundancy configuration
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/    
+class TMccRedundancy
+    {
+    public:
+        TMccRedundancy() :
+            iSessionID( 0 ),
+            iLinkID( 0 ),
+            iStreamID( 0 ),
+            iStatus( EFalse ),
+            iRedundancyPT( 0 ),
+            iRedCount( 0 )
+            {}
+
+        TUint32 iSessionID;
+        TUint32 iLinkID;
+        TUint32 iStreamID;
+        TBool iStatus;
+        TUint8 iRedundancyPT;
+        TInt iRedCount;
+    };
+
+typedef TPckgBuf<TMccRedundancy> TMccRedundancyPckg;
+
+/*
+* Message class for creating Mcc sessions
+* @since Series 60 3.0
+* @lib MMccController.dll
+*/
+class TMccCreateSession
+    {
+    public:
+        TMccCreateSession() :
+            iSessionID( 0 )
+            {}
+
+        TUint32 iSessionID;
+    };
+
+typedef TPckgBuf<TMccCreateSession> TMccCreateSessionPckg;
+
+/*
+* Message class for creating Mcc links
+* @since Series 60 3.0
+* @lib MMccController.dll
+*/
+class TMccCreateLink
+    {
+    public:
+        TMccCreateLink() :
+            iSessionID( 0 ),
+            iLinkType( KMccLinkGeneral ),
+            iLinkID( 0 ),
+            iRemoteAddress( KInetAddrAny ),
+            iLocalAddress( KInetAddrAny ),
+    	    iLocalRtcpAddress( KInetAddrAny ),
+            iIapId( 0 ),
+            iIpTOS( 0 ),
+            iMediaSignaling( 0 )
+            {}
+
+        TUint32 iSessionID;
+        TInt iLinkType;
+        TUint32 iLinkID;
+        TInetAddr iRemoteAddress;
+        TInetAddr iLocalAddress;
+        TInetAddr iLocalRtcpAddress;
+        TInt iIapId;
+        TInt iIpTOS;
+        TInt iMediaSignaling;
+    };
+
+typedef TPckgBuf<TMccCreateLink> TMccCreateLinkPckg;
+    
+/*
+* Message class for starting Mcc inactivity timer
+* @since Series 60 3.0
+* @lib MMccController.dll
+*/
+class TMccInactivityTimer
+    {
+    public:
+        TMccInactivityTimer():
+            iSessionID( 0 ),
+            iLinkID( 0 ),
+            iStreamID( 0 ),
+            iTimeoutTime( 0 )
+            {}
+        
+        TUint32 iSessionID;
+        TUint32 iLinkID;
+        TUint32 iStreamID;
+        TUint32 iTimeoutTime;
+    };
+
+typedef TPckgBuf<TMccInactivityTimer> TMccInactivityTimerPckg;
+
+/*
+* Message class for session messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccSession
+    {
+    public:
+        TMccSession() :
+            iSessionID( 0 ),
+            iLinkID( 0 ),
+            iStreamID( 0 ),
+            iEndpointID( 0 ),
+            iStreamType( KMccAudioUplinkStream ),
+            iCodec(),
+            iFourCCArray( TFixedArray<TFourCC, KMccFourCCArraySize>() ),
+            iPort( 0 ),
+            iPayloadType( 0 ),
+            iEnableVAD( NULL ),
+            iPacketizationRate( 1 ),
+            iPTime( 20 ),
+            iMaxPTime( 200 )
+            {}
+
+        
+        TUint32 iSessionID;
+        TUint32 iLinkID;
+        TUint32 iStreamID;
+        TUint32 iEndpointID;
+        TInt iStreamType;
+        TFourCC iCodec;
+        TFixedArray<TFourCC, KMccFourCCArraySize> iFourCCArray;
+        TUint iPort;
+        TUint8 iPayloadType;
+        TBool iEnableVAD;
+        TInt iPacketizationRate;
+        TUint iPTime;
+        TUint iMaxPTime;
+    };
+
+typedef TPckgBuf<TMccSession> TMccSessionPckg;
+
+/*
+* Message class for stream messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccStream
+    {
+    public:
+        TMccStream() : 
+            iSessionID( 0 ),
+            iLinkID( 0 ),    
+            iStreamID( 0 ),
+            iEndpointID( 0 ),
+            iStreamType( KMccAudioUplinkStream ),
+            iCodec(),
+            iBitrate( 0 ),
+            iPriority( 0 ),
+            iPayloadType( 0 ),
+            iEnableVAD( NULL ),
+            iPacketizationRate( 1 ),
+            iPTime( 20 ),
+            iMaxPTime( 200 ),
+            iEnableRTCP( EFalse ),
+            iStreamPaused( EFalse )
+            {}
+
+        TUint32 iSessionID;
+        TUint32 iLinkID;
+        TUint32 iStreamID;
+        TUint32 iEndpointID;
+        TInt iStreamType;
+        TFourCC iCodec;
+        TInt iBitrate;
+        TInt iPriority;
+        TUint8 iPayloadType;
+        TBool iEnableVAD;
+        TInt iPacketizationRate;
+        TUint iPTime;
+        TUint iMaxPTime;
+        TBool iEnableRTCP;
+        TBool iStreamPaused;
+    };
+
+typedef TPckgBuf<TMccStream> TMccStreamPckg;
+
+/*
+* Message class for stream creation parameters
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccCreateStreamParam
+    {
+    public:
+        TMccCreateStreamParam() : 
+            iPayloadType( 0 ),
+            iFourCC( 0 ),
+            iStreamType( KMccAudioUplinkStream ),
+            iPrioritySettings(),
+            iStandByTimer( 0 )
+            {}
+        
+        TUint8 iPayloadType;
+        TFourCC iFourCC;
+        TInt iStreamType;
+        TMMFPrioritySettings iPrioritySettings;
+        TUint iStandByTimer;
+    };
+
+typedef TPckgBuf<TMccCreateStreamParam> TMccCreateStreamParamPckg;
+   
+/*
+* Message class for setting remote address
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccAddress
+    {
+    public:
+        TMccAddress() :
+            iSessionID( 0 ),
+            iLinkID( 0 ),
+            iStreamID( 0 ),
+            iAddress()
+            {}
+
+        TUint32 iSessionID;
+        TUint32 iLinkID;
+        TUint32 iStreamID;
+        TInetAddr iAddress;
+    };
+
+typedef TPckgBuf<TMccAddress> TMccAddressPckg;
+
+
+/*
+* Message class for setting remote address
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccSSRC
+    {
+    public:
+        TMccSSRC() :
+            iSSRC( 0 )
+            {}
+
+        TUint32 iSSRC;
+    };
+
+typedef TPckgBuf<TMccSSRC> TMccSSRCPckg;
+
+
+/*
+* Message class for payload messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccPayload
+    {
+    public:
+        TMccPayload() 
+            :
+            iSessionID( 0 ), 
+            iStreamID( 0 ),
+            iCurrentDlPacketCount( 0 ),
+            iRtcpType( 0 ),
+            iSSRC( 0 ),
+            iApp(),
+            iSdesParams(),
+            iReason( NULL ),
+            iEventType( 0 ),
+            iError( 0 )
+            {
+            iTimeStamps.iNTPTimeStampSec = 0;
+            iTimeStamps.iNTPTimeStampFrac = 0;
+            iTimeStamps.iTimeStamp = 0;
+            }
+
+        TUint32 iSessionID;
+        TUint32 iStreamID;
+        TInt iCurrentDlPacketCount;   
+        TInt iRtcpType;
+        TRtpSSRC iSSRC;
+        TRtcpApp iApp;
+        TTimeStamps iTimeStamps;
+        TRtpSdesParams iSdesParams;
+        TBuf8<KMaxRtcpReason> iReason;
+        TInt iEventType;
+        TInt iError;
+    };
+    
+typedef TPckgBuf<TMccPayload> TMccPayloadPckg;
+
+/*
+* Message class for bitrate messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccBitrates
+    {
+    public:
+        TMccBitrates()
+            {
+            for ( TInt i = 0; i < KMaxBitrates; i++ )
+                {
+                iBitrates[i] = 0;
+                }
+            }
+        TUint32 iBitrates[KMaxBitrates];
+    };
+
+typedef TPckgBuf<TMccBitrates> TMccBitratesPckg;
+
+	
+/**
+* Class for generic messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccGenericMessage
+    {
+    public:
+        inline TMccGenericMessage() :
+            iSessionID( 0 ),
+            iLinkID( 0 ),
+            iStreamID( 0 ),
+            iEndpointID( 0 ),
+            iMessageFunction( 0 ),
+            iParam1( KNullDesC8 ),
+            iParam2( 0 ),
+            iParam3( 0 ),
+            iParam4( 0 )
+        {   }
+        
+    public:
+        // Session ID
+        TUint32 iSessionID;
+        
+        // Link ID
+        TUint32 iLinkID;
+
+        // Stream ID
+        TUint32 iStreamID;
+        
+        // Stream ID
+        TUint32 iEndpointID;
+
+        // Message function
+        TInt iMessageFunction;
+        
+        TBuf8<256> iParam1;
+        
+        TUint32 iParam2;
+        
+        TReal iParam3;
+        
+        TInt iParam4;
+        
+    };
+    
+// Typedef so we can use it in IPC/ITC messages
+typedef TPckgBuf<TMccGenericMessage> TMccGenericMsgBuffer;    
+
+/**
+* Class for security use
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccSecurityDestination
+    {
+    public:
+        inline TMccSecurityDestination() :
+            iSessionID( 0 ),
+            iLinkID( 0 ),
+            iStreamID( 0 ),
+            iEndpointID( 0 )
+        {   }
+        
+    public:
+        // Session ID
+        TUint32 iSessionID;
+        
+        // Link ID
+        TUint32 iLinkID;
+
+        // Stream ID
+        TUint32 iStreamID;
+        
+        // Stream ID
+        TUint32 iEndpointID;
+        
+    };
+    
+typedef TPckgBuf<TMccSecurityDestination> TMccSecurityDestinationBuffer;
+
+/*
+* Mcc Event handling interface
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/    
+class MMccEventHandler
+    {
+public:
+
+    /**
+    * Pure virtual function SendMccEventToClient.
+    * Send Mcc event to client
+    * @since Series 60 3.0
+    * @param aEvent - [input] Event to be handled
+    * @return KErrNone if successful
+    */
+    virtual TInt SendMccEventToClient( TMccEvent& aEvent ) = 0;
+    
+    /**
+    * Event handling interface
+    * @since Series 60 3.0
+    * @param [input] aState The new state
+    * @param [input] aLink The link in which the state change occurred
+    * @return void
+    */
+    virtual void StateChange( TInt aState, TUint32 aLink ) = 0;
+
+    /**
+    * Error passing to the client
+    * @since Series 60 3.0
+    * @param [input] aError The error that occured
+    * @param [input] aLink The link in which the error occurred
+    * @return void
+    */
+    virtual void ErrorOccured( TInt aError, 
+                               TUint32 aSessionId,
+                               TUint32 aLinkId,
+    	                       TUint32 aStreamId, 
+    	                       TUint32 aEndpointId ) = 0;
+    };
+
+/*
+* Class encapsulating key-value pairs.
+* @since    Series 60 3.2
+* @lib      mmcccontroller.dll
+*/  
+template<class K, class V >
+class TMccKeyValuePair
+    {
+public:
+    
+    TMccKeyValuePair( K& aKey, V& aValue )
+        :
+        iKey( aKey ), iValue( aValue ) { };
+    
+    K Key() const { return iKey; };
+    
+    V Value() const { return iValue; };
+    
+    static TBool CompareKey( const K* aKey, const TMccKeyValuePair& aPair )
+        {
+        return ( aPair.iKey == *aKey );
+        }
+    
+    static TBool CompareValue( const V* aValue, const TMccKeyValuePair& aPair )
+        {
+        return ( aPair.iValue == *aValue );
+        }
+    
+public:
+    
+    K iKey;
+    V iValue;
+    };
+    
+
+/**
+* Methods for accessing elements in "user" array
+*/    
+template<class UserEntry>
+class MccUserArray
+    {
+    public:  
+      
+    static UserEntry* FindUserEntryForCurrent( 
+        RArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+        {
+        UserEntry entry( aEventHandler );
+        TIdentityRelation<UserEntry> comparison( UserMatch );
+        TInt index = aUsers.Find( entry, comparison );
+        if ( index != KErrNotFound )
+            {
+            return &aUsers[ index ];
+            }
+        return NULL;
+        }
+        
+    static void RemoveCurrentUser( 
+        RArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+        {
+        UserEntry entry( aEventHandler );
+        TIdentityRelation<UserEntry> comparison( UserMatch );
+        TInt index = aUsers.Find( entry, comparison );
+        if ( index != KErrNotFound )
+            {
+            aUsers.Remove( index );
+            }
+        }
+          
+    static TBool UserMatch( 
+        const UserEntry& aUser1, 
+        const UserEntry& aUser2 )
+        {
+        // First argument is always the search term
+        
+        TBool match( EFalse );
+        if ( aUser1.iEventHandler )
+            {
+            match = ( aUser1.iEventHandler == aUser2.iEventHandler );
+            }
+        return match;
+        }
+        
+     static UserEntry* FindUserEntryForCurrent( 
+        RPointerArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+        {
+        UserEntry entry( aEventHandler );
+        TIdentityRelation<UserEntry> comparison( UserMatch );
+        TInt index = aUsers.Find( &entry, comparison );
+        if ( index != KErrNotFound )
+            {
+            return aUsers[ index ];
+            }
+        return NULL;
+        }
+    
+    static TInt FindUserEntryIndexForCurrent( 
+        RPointerArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+        {
+        UserEntry entry( aEventHandler );
+        TIdentityRelation<UserEntry> comparison( UserMatch );
+        return aUsers.Find( &entry, comparison );
+        }
+        
+    static void RemoveCurrentUser( 
+        RPointerArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+        {
+        UserEntry entry( aEventHandler );
+        TIdentityRelation<UserEntry> comparison( UserMatch );
+        TInt index = aUsers.Find( &entry, comparison );
+        if ( index != KErrNotFound )
+            {
+            delete aUsers[ index ];
+            aUsers.Remove( index );
+            }
+        }
+    };
+
+class MccConversionUtility
+    {
+public:
+    
+    static HBufC8* Base64EncodeLC( const TDesC8& aInput )
+        {
+        const TUint KMccFileB64MaxSizeMod = 2;
+        HBufC8* output = HBufC8::NewLC( aInput.Length() * KMccFileB64MaxSizeMod );
+        TPtr8 ptrOutput( output->Des() );
+        TBase64 encoder;
+    	User::LeaveIfError( encoder.Encode( aInput, ptrOutput ) );
+    	return output;
+        }
+    };
+        
+#endif