msg_plat/mms_codec_client_api/tsrc/src/MmsCodecClientApiTestBlocks.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 17:05:03 +0000
branchRCL_3
changeset 83 26c290f28dd1
parent 60 7fdbb852d323
permissions -rw-r--r--
Removed duplicate instructions for creating some messaging MIFs

/*
* Copyright (c) 2002 - 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:   Description
*
*/




// [INCLUDE FILES] - do not remove
#include <e32svr.h>
#include <StifParser.h>
#include <Stiftestinterface.h>
#include <msvapi.h>
#include <msvids.h>
#include "MmsCodecClientApiTest.h"
#include "mmscodecclient.h"
#include "mmsconst.h"
#include "e32const.h"





// EXTERNAL DATA STRUCTURES


// EXTERNAL FUNCTION PROTOTYPES  


// CONSTANTS

#ifdef __WINSCW__
_LIT( KBinaryMessage, "\\mmsmessagebinaries\\m.mms");
_LIT( KBinaryMessage2, "\\mmsmessagebinaries\\multipartrelated.mms");
#else
_LIT( KBinaryMessage,  "%C:\\testing\\data\\mmsmessagebinaries\\m.mms");
_LIT( KBinaryMessage2, "%C:\\testing\\data\\mmsmessagebinaries\\multipartrelated.mms");
#endif
const TInt KMmsCodecClientChunkSize = 1024;
// MACROS


// LOCAL CONSTANTS AND MACROS


// MODULE DATA STRUCTURES


// LOCAL FUNCTION PROTOTYPES


// FORWARD DECLARATIONS


// ============================= LOCAL FUNCTIONS ===============================



// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::Delete
// Delete here all resources allocated and opened from test methods. 
// Called from destructor. 
// -----------------------------------------------------------------------------
//
void CMmsCodecClientApiTest::Delete() 
    {
	//CleanAllL();
	
    }

// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::RunMethodL
// Run specified method. Contains also table of test mothods and their names.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::RunMethodL( 
    CStifItemParser& aItem ) 
    {

    static TStifFunctionInfo const KFunctions[] =
        {  
        // Copy this line for every implemented function.
        // First string is the function name used in TestScripter script file.
        // Second is the actual implementation member function. 
        ENTRY( "Example", CMmsCodecClientApiTest::ExampleL ),
        ENTRY( "CreateNewMessageEntryL", CMmsCodecClientApiTest::CreateNewMessageEntryL ),
        ENTRY( "AddMMTestL", CMmsCodecClientApiTest::AddMMTestL ),
        ENTRY( "RelaceMMTestL", CMmsCodecClientApiTest::RelaceMMTestL ),
        ENTRY( "RetreiveMMTestL", CMmsCodecClientApiTest::RetreiveMMTestL ),
        ENTRY( "SendMMTestL", CMmsCodecClientApiTest::SendMMTestL ),
        ENTRY( "MoveMMTestL", CMmsCodecClientApiTest::MoveMMTestL ),
        ENTRY( "SetFlagsTest", CMmsCodecClientApiTest::SetFlagsTestL ),
        ENTRY( "InitializeChunkedRetrievingTestL", CMmsCodecClientApiTest::InitializeChunkedRetrievingTestL ),
        ENTRY( "DiskSpaceBelowCriticalLevelTestL", CMmsCodecClientApiTest::DiskSpaceBelowCriticalLevelTestL ),
        ENTRY( "InitializeChunkedAddingTestL", CMmsCodecClientApiTest::InitializeChunkedAddingTestL ),
        ENTRY( "InitializeChunkedReplacingTestL", CMmsCodecClientApiTest::InitializeChunkedReplacingTestL ),
        ENTRY( "DeleteMM", CMmsCodecClientApiTest::DeleteMMTestL ),
        ENTRY( "CleanMessageStore", CMmsCodecClientApiTest::CleanAllL ),
        
        
        
        //ADD NEW ENTRY HERE
        // [test cases entries] - Do not remove

        };

    const TInt count = sizeof( KFunctions ) / 
                        sizeof( TStifFunctionInfo );

    return RunInternalL( KFunctions, count, aItem );

    }

// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::ExampleL
// Example test method function.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::ExampleL( CStifItemParser& aItem )
    {

    // Print to UI
    _LIT( KMmsCodecClientApiTest, "MmsCodecClientApiTest" );
    _LIT( KExample, "In Example" );
    TestModuleIf().Printf( 0, KMmsCodecClientApiTest, KExample );
    // Print to log file
    iLog->Log( KExample );

    TInt i = 0;
    TPtrC string;
    _LIT( KParam, "Param[%i]: %S" );
    while ( aItem.GetNextString ( string ) == KErrNone )
        {
        TestModuleIf().Printf( i, KMmsCodecClientApiTest, 
                                KParam, i, &string );
        i++;
        }
   
    return KErrNone;

    }
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::CreateNewMessageEntryL
// Calls the method CreateNewMessageEntryL in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::CreateNewMessageEntryL()
    {
    TInt errorCount =2;
    iLog->Log(_L(" In CreateNewMessageEntryL Test"));
    TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvDraftEntryId;
    TInt error1 = iCodecClient->CreateNewMessageEntryL(folder, messageId);
    if(error1 == KErrNone)
       {
       iLog->Log(_L("Created New entry in Drafts Folder successfully"));
       errorCount--;
       }
    //Try creating the same message entry again.. It should return KErrArgument and delete the entry
    error1 = iCodecClient->CreateNewMessageEntryL(folder, messageId);
    if(error1 == KErrArgument)
          {
          iLog->Log(_L("Creating same entry in Drafts Folder again returned KErrArg "));
          errorCount--;
          }
    CleanAllL();
    return errorCount;
    }
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::AddMMTestL
// Calls the method AddMML in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::AddMMTestL()
    {
    TInt errorCount = 3;
    TInt error1;
    TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvDraftEntryId;
    TUint32 flags = 0;
    TBool unread = EFalse;
    //We are trying to call the AddMML function before calling CreateNewMessageEntryL() function.
    //The size of the encode buffer is also zero 
    //It should return with KErrArgument
    TRAPD(error2, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error2 != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror for the call made to AddMML before calling CreateNewMessageEntry()"));
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrArgument)
            {
        iLog->Log(_L("AddMML Returned with KErrArgument for not calling CreateNewMessageEntryL()"));
        errorCount--;
            }
        }
        
    //We are trying to call the AddMML function after calling CreateNewMessageEntryL() function.
    //The size of the encode buffer is  zero 
    //It should return KErrArgument    
    error1 = iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iEncodeBuffer = CBufFlat::NewL(1);
    iEncodeBuffer->ResizeL(0);
    if(error1!=KErrNone)
    	{
    	return error1;
    	}
    TRAPD(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL failed with error %d"),error);
        }
    else
        {
        iWait->Start();
         if(iWait->iStatus.Int() == KErrArgument)
            {
        iLog->Log(_L("AddMMTestL returned KErrArgument,when the passed buffer size is zero"));
        errorCount--;
            }
        }
    //We are trying to call the AddMML function after calling CreateNewMessageEntryL() function.
    //The size of the encode buffer is not zero 
    //It should return with KErrNone or KErrNotSupported if decoding fails...
    
    error1 = iCodecClient->CreateNewMessageEntryL(folder, messageId);
    if(error1!=KErrNone)
    	{
    	CleanAllL();
    	return error1;
    	}
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
   #endif		
   iLog->Log(iFilePath);
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
   // iEncodeBuffer->ResizeL(10);
    
    TRAPD(error3, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error3 != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error3);
        
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            iLog->Log(_L("AddMMTestL with valid parameters returned %d"),iWait->iStatus.Int());
            errorCount--;
            }
        }
    CleanAllL();
    return errorCount;
    }
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::RelaceMMTestL
// Calls the method RelaceMML in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::RelaceMMTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvDraftEntryId;
    TMsvId outbox = KMsvGlobalOutBoxIndexEntryIdValue;
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt error;
    TInt returnValue;
    TInt errorCount = 4;
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    error = iCodecClient->CreateNewMessageEntryL(folder, messageId);
    if(error!=KErrNone)
    	{
    	return error;
    	}
    //iEncodeBuffer->ResizeL(10);
    TRAPD(error1, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    
    if(error1 != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error1);
        returnValue = error1;
        }
    else
        {
        iWait->Start();
        returnValue = iWait->iStatus.Int();
        iLog->Log(_L("AddMMTestL returned %d"),iWait->iStatus.Int());
           
        }
    if(!returnValue)
	    {
     	iLog->Log(_L("Calling ReplaceMML with valid parameters"));
   	   	TRAPD(error3,iCodecClient->ReplaceMML(messageId, *iEncodeBuffer, flags, unread, iWait->iStatus));
   	   	
	    if(error3 != KErrNone)
	    	{
	    	iLog->Log(_L("Call to ReplaceMML failed with %d"),error3);
	   		}
	   	else
	   		{
	   		iWait->Start();
	   		iLog->Log(_L("ReplaceMML returned with state %d"),iWait->iStatus.Int());	
	   		errorCount--;
	   		}
	    }
	    
    //Try to call the ReplaceMML function when the state is EEntryCreated...
    //Should return with KErrArgument and changes the state to EIdle
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
   // iEncodeBuffer->ResizeL(10);
    iLog->Log(_L("Calling ReplaceMML with Invalid state"));
    TRAPD(err,iCodecClient->ReplaceMML(messageId, *iEncodeBuffer, flags, unread, iWait->iStatus));
    
    if(err != KErrNone)
    	{
    	iLog->Log(_L("Call to ReplaceMML passed even when the state is EEntryCreated"));
   		}
   	else
   		{
   		iWait->Start();
   		iLog->Log(_L("ReplaceMML returned with state %d"),iWait->iStatus.Int());	
   		errorCount--;
   		}
   	// Call the ReplaceMML method with an empty buffer
	iEncodeBuffer->ResizeL(0);
	iLog->Log(_L("Calling ReplaceMML with empty buffer"));
	TRAPD(error2,iCodecClient->ReplaceMML(messageId, *iEncodeBuffer, flags, unread, iWait->iStatus));
	
    if(error2 != KErrNone)
    	{
    	iLog->Log(_L("Call to ReplaceMML passed even when the buffer size is zero"));
   		}
   	else
   		{
   		iWait->Start();
   		iLog->Log(_L("ReplaceMML returned with state %d"),iWait->iStatus.Int());	
   		errorCount--;
   		}
   	//Call ReplaceMML to replace a message in OutBox, it should return with error.
   	
   	iLog->Log(_L("Calling ReplaceMML to replace a message in outbox"));
   	iCodecClient->CreateNewMessageEntryL(outbox, messageId);
   //	iEncodeBuffer->ResizeL(10);
  	TRAPD(error3, iCodecClient->AddMML(*iEncodeBuffer, outbox, flags, unread, messageId, iWait->iStatus ) );
  	
    if(error3 != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error1);
        
        }
    else
        {
        iWait->Start();
        returnValue = iWait->iStatus.Int();
        iLog->Log(_L("AddMMTestL returned %d"),iWait->iStatus.Int());
        
        }
    TRAPD(err4,iCodecClient->ReplaceMML(messageId, *iEncodeBuffer, flags, unread, iWait->iStatus));
    
    if(err4 != KErrNone)
    	{
    	iLog->Log(_L("Call to ReplaceMML passed even when the state is EEntryCreated"));
   		}
   	else
   		{
   		iWait->Start();
   		iLog->Log(_L("ReplaceMML returned with state %d"),iWait->iStatus.Int());	
   		errorCount--;
   		}
   CleanAllL();
	return errorCount;	
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::RetreiveMMTestL
// Calls the method RetreiveMML in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::RetreiveMMTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvDraftEntryId;	
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt returnValue;
    TInt errorCount = 2;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage2;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage2,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    iLog->Log(_L("Calling RetrieveMML with invalid state"));
    TRAPD( error1, iCodecClient->RetrieveMML( messageId, *iEncodeBuffer, folder, flags, unread, iWait->iStatus ) );
    
    if ( error1 != KErrNone )
        {
        iLog->Log( _L("Retrieve Message entry failed, left with error: %d"), error1 );
        
        }
    else
        {
        iWait->Start();
        iLog->Log( _L("Retrieve Message entry  completed with status: %d"), iWait->iStatus.Int() );
        errorCount--;
        }
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    TRAPD(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error1);
        returnValue = error1;
        }
    else
        {
        iWait->Start();
        returnValue = iWait->iStatus.Int();
        iLog->Log(_L("AddMMTestL returned %d"),iWait->iStatus.Int());
        }
    if(!returnValue)
	    {
	    iLog->Log(_L("Calling RetrieveMML with valid parameters"));
	    TRAP( error, iCodecClient->RetrieveMML( messageId, *iEncodeBuffer, folder, flags, unread, iWait->iStatus ) );
	    if ( error != KErrNone )
	        {
	        iLog->Log( _L("Retrieve Message entry failed, left with error: %d"), error );
	        }
	    else
	        {
	        iWait->Start();
	        iLog->Log( _L("Retrieve Message entry  completed with status: %d"), iWait->iStatus.Int() );
            errorCount--;
	        }
	    }
	CleanAllL();
	return errorCount;
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::SendMMTestL
// Calls the method SendMML in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//

TInt CMmsCodecClientApiTest::SendMMTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvDraftEntryId;	
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt errorCount = 2;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    iLog->Log(_L("Calling SendMML with invalid state"));
    TRAPD( error1, iCodecClient->SendMML( messageId,iWait->iStatus ) );
    
    if ( error1 != KErrNone )
        {
        iLog->Log( _L("Sending Message entry failed, left with error: %d"), error1 );
        
        }
    else
        {
        iWait->Start();
         iLog->Log( _L("Sending Message entry  completed with status: %d"), iWait->iStatus.Int() );
         errorCount--;
         }
        
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    TRAPD(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error1);
        
        }
    else
        {
        iWait->Start();
        iLog->Log(_L("AddMMTestL returned %d"),iWait->iStatus.Int());
            
        }
    iLog->Log(_L("Calling SendMML with valid parameters"));
    TRAPD( error2, iCodecClient->SendMML( messageId,iWait->iStatus ) );
    
    if ( error2 != KErrNone )
        {
        iLog->Log( _L("Sending Message entry failed, left with error: %d"), error1 );
        
        }
    else
        {
        iWait->Start();
        iLog->Log( _L("Sending Message entry  completed with status: %d"), iWait->iStatus.Int() );
        errorCount--;
        }
    CleanAllL();	
	return errorCount;	
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::MoveMMTestL
// Calls the method MoveMML in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//

TInt CMmsCodecClientApiTest::MoveMMTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvGlobalInBoxIndexEntryId;
    TMsvId sentFolder = KMsvSentEntryId;	
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt errorCount = 5;
    TInt error;
    CMsvEntry* cEntry = iSession->GetEntryL( KMsvRootIndexEntryId );
    CleanupStack::PushL( cEntry );
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage2;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage2,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    iLog->Log(_L("Calling MoveMML with invalid state"));
    TRAPD( error1, iCodecClient->MoveMML( messageId,KMsvDraftEntryId,iWait->iStatus ) );
    
    if ( error1 != KErrNone )
        {
        iLog->Log( _L("Moving Message entry failed, left with error: %d"), error1 );
        
        }
    else
        {
        iWait->Start();
		iLog->Log( _L("Moving Message entry  completed with status: %d"), iWait->iStatus.Int() );
		errorCount--;
         }
    iCodecClient->CreateNewMessageEntryL(folder, messageId);     
    TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        iLog->Log(_L("AddMMTestL returned %d"),iWait->iStatus.Int());
           
        }
    iLog->Log(_L("Moving message to Outbox"));
    TRAPD( error2, iCodecClient->MoveMML( messageId,KMsvGlobalOutBoxIndexEntryId,iWait->iStatus ) );
    
    if ( error2 != KErrNone )
        {
        iLog->Log( _L("Moving Message entry failed, left with error: %d"), error1 );
        
        }
    else
        {
        iWait->Start();
         iLog->Log( _L("Moving Message entry  completed with status: %d"), iWait->iStatus.Int() );
         errorCount--;
         }
    iLog->Log(_L("Calling MoveMML with samefolder as parent"));
    TRAPD( error4, iCodecClient->MoveMML( messageId,KMsvGlobalInBoxIndexEntryId,iWait->iStatus ) );
    
    if ( error4 != KErrNone )
        {
        iLog->Log( _L("Moving Message entry failed, left with error: %d"), error1 );
        
        }
    else
        {
        iWait->Start();
         iLog->Log( _L("Moving Message entry  completed with status: %d"), iWait->iStatus.Int() );
         errorCount--;
         }
         
    iLog->Log(_L("Moving Message to Sent folder"));
    TRAPD( error5, iCodecClient->MoveMML( messageId,KMsvSentEntryId,iWait->iStatus ) );
    
    if ( error5 != KErrNone )
        {
        iLog->Log( _L("Moving Message entry failed, left with error: %d"), error5 );
        
        }
    else
        {
        iWait->Start();
         iLog->Log( _L("Moving Message entry  completed with status: %d"), iWait->iStatus.Int() );
         errorCount--;
         }
    iCodecClient->CreateNewMessageEntryL(sentFolder, messageId);
    
    TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, sentFolder, flags, unread, messageId, iWait->iStatus ) );
    
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error1);
        
        }
    else
        {
        iWait->Start();
            iLog->Log(_L("AddMMTestL returned %d"),iWait->iStatus.Int());
            
        }
    iLog->Log(_L("Moving message to Inbox"));
    TRAPD( error3, iCodecClient->MoveMML( messageId,KMsvGlobalInBoxIndexEntryId,iWait->iStatus ) );
    
    if ( error3 != KErrNone )
        {
        iLog->Log( _L("Moving Message entry failed, left with error: %d"), error1 );
        }
    else
        {
        iWait->Start();
         iLog->Log( _L("Moving Message entry  completed with status: %d"), iWait->iStatus.Int() );
         errorCount--;
         }
    CleanupStack::PopAndDestroy(cEntry);   
    CleanAllL();  	
	return errorCount;	
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::SetFlagsTest
// Calls the method SetFlags() in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//

TInt CMmsCodecClientApiTest::SetFlagsTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
	TMsvId nullMessageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvGlobalInBoxIndexEntryId;
    TMsvId outbox = KMsvGlobalOutBoxIndexEntryId;
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt error;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    iLog->Log(_L("Calling SetFlags() with invalid state"));
    error = iCodecClient->SetFlags(messageId, flags, unread );
    iLog->Log(_L("Set Flags returned %d"),error);
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iLog->Log(_L("Calling SetFlags() with invalid state and Null MessageId"));
    error = iCodecClient->SetFlags(nullMessageId, flags, unread );
    iLog->Log(_L("Set Flags returned %d"),error);
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
	
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
        }
    iLog->Log(_L("Calling SetFlags() valid params"));
    error = iCodecClient->SetFlags(messageId, flags, unread );
    iLog->Log(_L("Set Flags returned with %d"),error);
    iCodecClient->CreateNewMessageEntryL(outbox, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, outbox, flags, unread, messageId, iWait->iStatus ) );
	
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
        }
    iLog->Log(_L("Calling SetFlags() for message in OutBox"));
    error = iCodecClient->SetFlags(messageId, flags, unread );
    iLog->Log(_L("Set Flags returned with %d"),error);
    CleanAllL();
    return KErrNone;	
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::InitializeChunkedRetrievingTestL
// Calls the method InitializeChunkedRetrievingL() in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::InitializeChunkedRetrievingTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvGlobalInBoxIndexEntryId;
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt error;
    TInt size = 1;
    TBool lastChunk = EFalse;   
    TPtrC8 dataPart;
    TInt pos = 0;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iCodecClient->NextDataPart( dataPart, lastChunk ); //Calling Next Data Part with invalid state
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);	
    iLog->Log(_L("Calling InitializeChunkedRetrievingL() with invalid state"));
    TRAP( error, iCodecClient->InitializeChunkedRetrievingL( messageId, folder,flags, unread, size, iWait->iStatus ) );
    
    if ( error == KErrNone )
        {
        if ( iWait->iStatus.Int() == KErrNone )
            {
             iLog->Log( _L("InitializeChunkedRetrievingL Failed, should have returned error"));
            }
        else
        	{
             iLog->Log(_L("InitializeChunkedRetrievingL returned error %d"),error);
        	}
        }
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
	
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();	
        iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
        }
    
	TRAP( error, iCodecClient->InitializeChunkedRetrievingL( messageId, folder,flags, unread, size, iWait->iStatus ) );
	
    if ( error == KErrNone )
        {
        iWait->Start();
        if ( iWait->iStatus.Int() == KErrNone )
            {
            while ( !lastChunk && error == KErrNone )
	            {
	            error = iCodecClient->GetNextDataPart( dataPart, lastChunk ); //This is a correct context of GetNextDataPart
	            if ( error != KErrNone )
	                {
	                iLog->Log(_L("GetNextDataPart returned error %d"), error );
	                
	                }
	            if ( dataPart.Length() > 0 && error == KErrNone )
	                {
	                if ( iEncodeBuffer->Size() < pos + dataPart.Length() )
	                    {
	                    iEncodeBuffer->ResizeL( pos + dataPart.Length() );
	                    }
	                iEncodeBuffer->Write( pos, dataPart );
	                pos += dataPart.Length();
	                }
	            error = iCodecClient->ReleaseData();   
	            if ( error != KErrNone )
	                {
	                iLog->Log(_L("ReleaseData returned error %d"), error );
	                }
	            }
             iLog->Log( _L("InitializeChunkedRetrievingL Passed"));
            }
        else
        	{
             iLog->Log(_L("InitializeChunkedRetrievingL returned with status %d"),iWait->iStatus.Int());
        	}
        }
    else
        {
        iLog->Log(_L("InitializeChunkedRetrievingL left with error %d"),error);	
        }
    // The pass case is executed again to Cover the decision " if(iEncodeBuffer)" in CUT
    messageId = KMsvNullIndexEntryId;
    iFilePath = KBinaryMessage;
#ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
#endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);	
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
       	iWait->Start();	
        iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
        }
    
	TRAP( error, iCodecClient->InitializeChunkedRetrievingL( messageId, folder,flags, unread, size, iWait->iStatus ) );
	
    if ( error == KErrNone )
        {
        iWait->Start();
        if ( iWait->iStatus.Int() == KErrNone )
            {
            while ( !lastChunk && error == KErrNone )
	            {
	            error = iCodecClient->GetNextDataPart( dataPart, lastChunk ); //This is a correct context of GetNextDataPart
	            if ( error != KErrNone )
	                {
	                iLog->Log(_L("GetNextDataPart returned error %d"), error );
	                
	                }
	            if ( dataPart.Length() > 0 && error == KErrNone )
	                {
	                if ( iEncodeBuffer->Size() < pos + dataPart.Length() )
	                    {
	                    iEncodeBuffer->ResizeL( pos + dataPart.Length() );
	                    }
	                iEncodeBuffer->Write( pos, dataPart );
	                pos += dataPart.Length();
	                }
	            error = iCodecClient->ReleaseData();   
	            if ( error != KErrNone )
	                {
	                iLog->Log(_L("ReleaseData returned error %d"), error );
	                }
	            }
             iLog->Log( _L("InitializeChunkedRetrievingL Passed"));
            }
        else
        	{
             iLog->Log(_L("InitializeChunkedRetrievingL returned with status %d"),iWait->iStatus.Int());
        	}
        }
    else
        {
        iLog->Log(_L("InitializeChunkedRetrievingL left with error %d"),error);	
        }
    CleanAllL();
	return KErrNone;
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::DiskSpaceBelowCriticalLevelTestL
// Calls the method DiskSpaceBelowCriticalLevelL() in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//

TInt CMmsCodecClientApiTest::DiskSpaceBelowCriticalLevelTestL()
	{
    iCodecClient->DiskSpaceBelowCriticalLevelL(KMmsIndexEntryExtra);
	return KErrNone;
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::InitializeChunkedAddingTestL
// Calls the method InitializeChunkedAddingL() in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::InitializeChunkedAddingTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvGlobalInBoxIndexEntryId;
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt error;
    TBool lastChunk = EFalse;   
    TPtrC8 dataPart;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
    iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
   #endif		
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);	
    iLog->Log(_L("Calling InitializeChunkedAddingL() with invalid state"));
    TRAP( error, iCodecClient->InitializeChunkedAddingL( KMsvDraftEntryId, messageId, flags, unread ) );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedAddingL Failed, should have returned error"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedAddingL returned error %d"),error);
    	}
        
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            //returnValue = iWait->iStatus.Int();
            iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
            }
        }
	TRAP( error, iCodecClient->InitializeChunkedAddingL( KMsvDraftEntryId, messageId, flags, unread ) );
	error = FeedDataInChunks( iCodecClient );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedAddingL passed"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedAddingL returned error %d"),error);
    	}
    TInt error1 = iCodecClient->GetNextDataPart( dataPart, lastChunk ); //Calling GetNextDataPart out of context...
    error1 = iCodecClient->ReleaseData(); //Calling Release Data Out of Context....
    
    // The pass case is executed again to Cover the decision " if(iEncodeBuffer)" in CUT
    messageId = KMsvNullIndexEntryId;
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            //returnValue = iWait->iStatus.Int();
            iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
            }
        }
	TRAP( error, iCodecClient->InitializeChunkedAddingL( KMsvDraftEntryId, messageId, flags, unread ) );
	error = FeedDataInChunks( iCodecClient );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedAddingL passed"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedAddingL returned error %d"),error);
    	}
    CleanAllL();
	return error;	
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::InitializeChunkedReplacingTestL
// Calls the method InitializeChunkedReplacingL() in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//
TInt CMmsCodecClientApiTest::InitializeChunkedReplacingTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvGlobalInBoxIndexEntryId;
    TMsvId outBox = KMsvGlobalOutBoxIndexEntryId;
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt error;
    TPtrC8 dataPart;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__  
	 iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
    #endif	 
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);	
    iLog->Log(_L("Calling InitializeChunkedReplacingL() with invalid state"));
    TRAP( error, iCodecClient->InitializeChunkedReplacingL(messageId, flags, unread ) );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedReplacingL Failed, should have returned error"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedReplacingL returned error %d"),error);
    	}
    iLog->Log(_L("Calling InitializeChunkedReplacingL() to replace message in Outbox"));   
    iCodecClient->CreateNewMessageEntryL(outBox, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, outBox, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            //returnValue = iWait->iStatus.Int();
            iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
            }
        }
	TRAP( error, iCodecClient->InitializeChunkedReplacingL( messageId, flags, unread ) );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedReplacingL Failed, should have returned error"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedReplacingL returned error %d"),error);
    	}
    iLog->Log(_L("Calling InitializeChunkedReplacingL() with valid parameters")); 
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            //returnValue = iWait->iStatus.Int();
            iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
            }
        }
	TRAP( error, iCodecClient->InitializeChunkedReplacingL( messageId, flags, unread ) );
	error = FeedDataInChunks( iCodecClient );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedReplacingL Passed"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedReplacingL returned error %d"),error);
    	}
    // The pass case is executed again to Cover the decision " if(iEncodeBuffer)" in CUT
    messageId = KMsvNullIndexEntryId;
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            //returnValue = iWait->iStatus.Int();
            iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
            }
        }
	TRAP( error, iCodecClient->InitializeChunkedReplacingL( messageId, flags, unread ) );
	error = FeedDataInChunks( iCodecClient );
    if ( error == KErrNone )
        {
        iLog->Log( _L("InitializeChunkedReplacingL Passed"));
        }
    else
    	{
         iLog->Log(_L("InitializeChunkedReplacingL returned error %d"),error);
    	}
    CleanAllL();
    return error;
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::DeleteMMTestL
// Calls the method DeleteMML() in CMmsCodecClient class.
// -----------------------------------------------------------------------------
//    
TInt CMmsCodecClientApiTest::DeleteMMTestL()
	{
	TMsvId messageId = KMsvNullIndexEntryId;
    TMsvId folder = KMsvGlobalInBoxIndexEntryId;
    TUint32 flags = 0;
    TBool unread = EFalse;
    TInt error = KErrNone;
    TPtrC8 dataPart;
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
    iFilePath = KBinaryMessage;
    #ifndef __WINSCW__	
	 iFilePath.Format(KBinaryMessage,69);/*69 Repesents E*/
    #endif	 
    FillBufferFromFileL( iFilePath,iFs,iEncodeBuffer);	
    iLog->Log(_L("Calling DeleteMM with invalid state"));
    iCodecClient->DeleteMM(messageId);
    if ( error == KErrNone )
        {
        iLog->Log( _L("DeleteMM Failed, should have left with error"));
        }
    else
    	{
         iLog->Log(_L("DeleteMM returned error %d"),error);
    	}
    iLog->Log(_L("Calling DeleteMM with valid parameters"));   
    iCodecClient->CreateNewMessageEntryL(folder, messageId);
	TRAP(error, iCodecClient->AddMML(*iEncodeBuffer, folder, flags, unread, messageId, iWait->iStatus ) );
    if(error != KErrNone)
        {
        iLog->Log(_L("AddMMTestL returned Errror %d "),error);
        }
    else
        {
        iWait->Start();
        if(iWait->iStatus.Int() == KErrNone || iWait->iStatus.Int() == KErrNotSupported)
            {
            //returnValue = iWait->iStatus.Int();
            iLog->Log(_L("AddMMTestL returned with %d"),iWait->iStatus.Int());
            }
        }
	error = iCodecClient->DeleteMM( messageId);
    if ( error == KErrNone )
        {
        iLog->Log( _L("DeleteMM Passed"));
        }
    else
    	{
         iLog->Log(_L("DeleteMM returned error %d"),error);
    	}
    CleanAllL();	
	return error;	
	}
// -----------------------------------------------------------------------------
// CMmsCodecClientApiTest::FeedDataInChunks
// Method used to retrieve the data in chunks.
// -----------------------------------------------------------------------------
//	
TInt CMmsCodecClientApiTest::FeedDataInChunks( CMmsCodecClient* aCodecClient )
    {
    
    TInt error = KErrNone;
    TInt chunkSize = KMmsCodecClientChunkSize;
    TInt size = iEncodeBuffer->Size();
    
    // Number of full chunks
    TInt chunkNumber = size / chunkSize;
    TInt remainder = size % chunkSize;
    
    TInt pos = 0;    
    TPtrC8 messagePtr( iEncodeBuffer->Ptr( 0 ) );
    
    TBool lastChunk = EFalse;
    TInt i = 0;
    for ( i = 0; i < chunkNumber && error == KErrNone; i++ )
        {
        pos = i * chunkSize;
        TPtrC8 ptr( iEncodeBuffer->Ptr( 0 ).Mid( pos, chunkSize ) );
        error = aCodecClient->NextDataPart( ptr, lastChunk );
        }
        
    // last chunk

    if ( remainder > 0 && error == KErrNone )
        {
        TPtrC8 ptr2( iEncodeBuffer->Ptr( size - remainder ) );
        if ( ptr2.Length() > 0 )
            {
            error = aCodecClient->NextDataPart( ptr2, lastChunk );
            }
        }
        
    lastChunk = ETrue;
    TPtrC8 ptr3;
    if ( error == KErrNone )
        {
        aCodecClient->NextDataPart( ptr3, lastChunk );
        }
    return error;    
    }

void CMmsCodecClientApiTest::FillBufferFromFileL(const TDesC& aFilePath,RFs& aFs,CBufFlat* aEncodeBuffer)
    {
    TInt error = KErrNone;
    TEntry orgEntry;
    error = aFs.Entry( aFilePath, orgEntry );
    TInt size = orgEntry.iSize;
    RFile inFile;
        
    if ( aEncodeBuffer == NULL )
        {
        aEncodeBuffer = CBufFlat::NewL( size );
        }
    else
        {
        aEncodeBuffer->ResizeL( 0 );
        aEncodeBuffer->ResizeL( size );
        }

    error = inFile.Open( aFs, aFilePath, EFileShareReadersOnly );
    TPtr8 ptr = aEncodeBuffer->Ptr( 0 );
    if ( error == KErrNone )
        {
        error = inFile.Read( ptr, size );
        inFile.Close();
        }
    else
        {
        iLog->Log(_L("*** - can't read file"));
        }
    User::LeaveIfError( error ); 
    }
void CMmsCodecClientApiTest::CleanAllL()
	{

	iLog->Log(_L("In Clean All"));
	CleanBoxL(KMsvGlobalInBoxIndexEntryId,*iSession);
    CleanBoxL(KMsvGlobalOutBoxIndexEntryId,*iSession);
    CleanBoxL(KMsvSentEntryId,*iSession);
    CleanBoxL(KMsvDraftEntryId,*iSession);
    iLog->Log(_L("End of Clean All"));
    	
	}
void CMmsCodecClientApiTest::CleanBoxL(TMsvId aBoxId, CMsvSession& aSession)
    {
    iLog->Log(_L("In CleanBoxL"));
    CMsvEntry* cEntry = NULL;
    // delete all messages from the specified box
    cEntry = aSession.GetEntryL(KMsvRootIndexEntryId);
    CleanupStack::PushL(cEntry);
    cEntry->SetEntryL(aBoxId);
    // show invisible entries
    cEntry->SetSortTypeL( TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
    CMsvEntrySelection* msvEntrySelection = cEntry->ChildrenWithMtmL(KUidMsgTypeMultimedia);
    CleanupStack::PushL(msvEntrySelection);

    CMsvEntrySelection* selection = NULL;
    cEntry->SetSortTypeL( TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
    selection = cEntry->ChildrenWithMtmL(KUidMsgMMSNotification);
    CleanupStack::PushL( selection );
    if ( selection->Count() > 0 )
        {
        msvEntrySelection->AppendL( selection->Back( 0 ), selection->Count() );
        }
    CleanupStack::PopAndDestroy(); // selection

    int i;
    for (i = 0; i < msvEntrySelection->Count(); i++)
        {
        CMsvEntry* entry = aSession.GetEntryL( msvEntrySelection->At(i) );
        CleanupStack::PushL( entry );
        TMsvEntry tEntry = entry->Entry();
        tEntry.SetReadOnly(EFalse);
        entry->ChangeL(tEntry);
        cEntry->DeleteL( msvEntrySelection->At(i) );
        CleanupStack::PopAndDestroy( entry );
        }

    CleanupStack::PopAndDestroy(msvEntrySelection);
    CleanupStack::PopAndDestroy(cEntry);
    iLog->Log(_L("End of CleanBoxL"));
    }
// ========================== OTHER EXPORTED FUNCTIONS =========================
// None

//  [End of File] - Do not remove