htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/MessageMgmntHandler.cpp
branchRCL_3
changeset 43 48060abbbeaf
parent 42 d40e813b23c0
child 45 b3cee849fa46
--- a/htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/MessageMgmntHandler.cpp	Thu Jul 15 18:39:46 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2074 +0,0 @@
-/*
-* 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:  Functional implementation of HtiMessagesServicePlugin service
-*
-*/
-
-
-// INCLUDE FILES
-#include "HtiMessagesServicePlugin.h"
-#include "MessageMgmntHandler.h"
-
-#include <HtiDispatcherInterface.h>
-#include <HtiLogging.h>
-#include <mtclreg.h>
-#include <smscmds.h>
-#include <smtcmtm.h>
-#include <smuthdr.h>
-#include <smsclnt.h>
-#include <utf.h>
-#include <mmsclient.h>
-#include <mmsconst.h>
-#include <miutset.h>
-#include <irmsgtypeuid.h>
-#include <btmsgtypeuid.h>
-#include <biouids.h>
-#include <apgcli.h>
-#include <apmstd.h>
-#include <bautils.h>
-#include <obexclientmtm.h>
-#include <cmsvmimeheaders.h>
-#include <mmsvattachmentmanager.h>
-
-// CONSTANTS
-_LIT8( KErrorMissingCommand,        "Command was not given - message was empty" );
-_LIT8( KErrorUnrecognizedCommand,   "Unrecognized command" );
-_LIT8( KErrorInvalidParameters,     "Invalid command parameters");
-_LIT8( KErrorTooLongSmsBody,        "Too long SMS body" );
-_LIT8( KErrorInvalidId,             "Invalid SMS id parameter" );
-_LIT8( KErrorInvalidFolder,         "Invalid folder parameter" );
-_LIT8( KErrorItemNotFound,          "Item not found" );
-_LIT8( KErrorFailedDelete,          "Failed to delete item" );
-_LIT8( KErrorNotSupported,          "Not supported" );
-_LIT8( KErrorSmsSettingNotDefined,  "SMS settings not defined" );
-_LIT8( KErrorMmsSettingNotDefined,  "MMS settings not defined" );
-_LIT8( KErrorMailboxNotDefined,     "Mailbox not defined" );
-_LIT8( KErrorMsgTypeNotFound,       "Message type module not found" );
-_LIT8( KErrorMsgStoreOpenFailed,    "Could not open message store" );
-_LIT8( KErrorRfsConnectFailed,      "Could not connect to file server session" );
-_LIT8( KErrorAttachmentNotFound,    "Attachment not found" );
-_LIT8( KErrorInvalidFolderForSmartMsg, "Only inbox allowed for smart messages" );
-
-const static TInt KAddSmsCmdMinLength        = 7;
-const static TInt KAddMmsOrEmailCmdMinLength = 8;
-const static TInt KAddObexMsgCmdMinLength    = 6;
-const static TInt KAddSmartMsgCmdMinLength   = 11;
-const static TInt KAddAudioCmdMinLength      = 10;
-
-// ----------------------------------------------------------------------------
-CMessageMgmntHandler* CMessageMgmntHandler::NewL()
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::NewL" );
-    CMessageMgmntHandler* self = new (ELeave) CMessageMgmntHandler();
-    CleanupStack::PushL ( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    HTI_LOG_FUNC_OUT( "CMessageMgmntHandler::NewL: Done" );
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-CMessageMgmntHandler::CMessageMgmntHandler()
-    {
-    }
-
-// ----------------------------------------------------------------------------
-CMessageMgmntHandler::~CMessageMgmntHandler()
-    {
-    delete iMtmReg;
-    delete iSession;
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::ConstructL()
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::ConstructL" );
-    iSession = CMsvSession::OpenSyncL( *this );
-    iMtmReg = CClientMtmRegistry::NewL( *iSession );
-    HTI_LOG_FUNC_OUT( "CMessageMgmntHandler::ConstructL: Done" );
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::SetDispatcher( MHtiDispatcher* aDispatcher )
-    {
-    iDispatcher = aDispatcher;
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::ProcessMessageL( const TDesC8& aMessage,
-                                            THtiMessagePriority /*aPriority*/ )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::ProcessMessageL" );
-    HTI_LOG_FORMAT( "Msg length: %d", aMessage.Length() );
-
-    if ( aMessage.Length() == 0 )
-        {
-        SendErrorMessageL( KErrArgument, KErrorMissingCommand );
-        return;
-        }
-
-    switch ( aMessage[0] )
-        {
-        case CHtiMessagesServicePlugin::EAddSms:
-            HTI_LOG_TEXT( "Add SMS" );
-            HandleCreateSmsL( aMessage.Right( aMessage.Length() - 1 ) );
-            break;
-
-        case CHtiMessagesServicePlugin::EAddMms:
-        case CHtiMessagesServicePlugin::EAddAudioMsg: // special MMS sub type
-            HTI_LOG_TEXT( "Add MMS" );
-            HandleCreateMmsL( aMessage );
-            break;
-
-        case CHtiMessagesServicePlugin::EAddEmail:
-            HTI_LOG_TEXT( "Add Email" );
-            HandleCreateEmailL( aMessage );
-            break;
-
-        case CHtiMessagesServicePlugin::EAddIrMsg:
-            HTI_LOG_TEXT( "Add IR msg" );
-            HandleCreateObexMsgL( aMessage.Right( aMessage.Length() - 1 ),
-                                  TUid::Uid( KUidMsgTypeIrTInt32 ),
-                                  KUidMsgTypeIrUID );
-            break;
-
-        case CHtiMessagesServicePlugin::EAddBtMsg:
-            HTI_LOG_TEXT( "Add BT msg" );
-            HandleCreateObexMsgL( aMessage.Right( aMessage.Length() - 1 ),
-                                  TUid::Uid( KUidMsgTypeBtTInt32 ),
-                                  KUidMsgTypeBt );
-            break;
-
-        case CHtiMessagesServicePlugin::EAddSmartMsg:
-            HTI_LOG_TEXT( "Add smart msg" );
-            HandleCreateSmartMsgL( aMessage.Right( aMessage.Length() - 1 ) );
-            break;
-
-        case CHtiMessagesServicePlugin::EDeleteMessage:
-            HTI_LOG_TEXT( "Delete message" );
-            HandleDeleteMessageL( aMessage.Right( aMessage.Length() - 1 ) );
-            break;
-
-        case CHtiMessagesServicePlugin::EDeleteFolderContent:
-            HTI_LOG_TEXT( "Delete messages" );
-            HandleDeleteMessagesL( aMessage.Right( aMessage.Length() - 1 ) );
-            break;
-
-        default:
-            HTI_LOG_TEXT( "Unknown command" );
-            SendErrorMessageL( KErrUnknown, KErrorUnrecognizedCommand );
-            break;
-        }
-
-    HTI_LOG_FUNC_OUT( "CMessageMgmntHandler::ProcessMessageL: Done" );
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleCreateSmsL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleSmsImportFuncL" );
-
-    if ( ValidateAddSmsCommand( aData ) )
-        {
-        TInt position( 0 );
-        HBufC16* fromTo = ExtractDesLC( aData, position, 1 );
-        HBufC16* description = ExtractDesLC( aData, position, 1 );
-        HBufC16* body = ExtractDesLC( aData, position, 2 );
-        TBool isNew = (TBool)aData[position];
-        TBool isUnread = (TBool)aData[position+1];
-        TFolder folder = (TFolder)aData[position+2];
-
-        CSmsClientMtm* smsMtm = NULL;
-        TRAPD( err, smsMtm = ( CSmsClientMtm* )iMtmReg->NewMtmL(
-                KUidMsgTypeSMS ) );
-        if ( err || !smsMtm )
-            {
-            HTI_LOG_TEXT( "SMS message type module not found" );
-            SendErrorMessageL( KErrNotFound, KErrorMsgTypeNotFound );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        CleanupStack::PushL( smsMtm );
-
-        CMsvEntry* entry = CMsvEntry::NewL( *iSession,
-                                            KMsvGlobalInBoxIndexEntryId,
-                                            TMsvSelectionOrdering() );
-        CleanupStack::PushL( entry );
-
-        // get the default service
-        TMsvId defaultServiceId = 0;
-        TRAP( err, defaultServiceId = smsMtm->DefaultServiceL() );
-        if ( err )
-            {
-            HTI_LOG_FORMAT( "Could not get default service, err: %d", err );
-            SendErrorMessageL( err, KErrorSmsSettingNotDefined );
-            CleanupStack::PopAndDestroy( entry );
-            CleanupStack::PopAndDestroy( smsMtm );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-
-        // map the folder parameter to folder id
-        TMsvId folderId = KMsvGlobalInBoxIndexEntryId;
-        TRAP( err, folderId = MapFolderToIdL( folder ) );
-        if ( err )
-            {
-            HTI_LOG_FORMAT( "Invalid folder: %d", folder );
-            SendErrorMessageL( err, KErrorInvalidFolder );
-            CleanupStack::PopAndDestroy( entry );
-            CleanupStack::PopAndDestroy( smsMtm );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        entry->SetEntryL( folderId );
-
-        // mtm takes ownership of entry context
-        smsMtm->SetCurrentEntryL( entry );
-        CleanupStack::Pop( entry );
-
-        // create a new message
-        smsMtm->CreateMessageL( defaultServiceId );
-
-        if ( folder == EInbox )
-            {
-            CSmsHeader* smsHeader = &( smsMtm->SmsHeader() );
-            delete smsHeader;
-            smsHeader = NULL;
-            smsHeader = CSmsHeader::NewL( CSmsPDU::ESmsDeliver, smsMtm->Body() );
-            smsHeader->SetFromAddressL( fromTo->Des() );
-            }
-        else
-            {
-            smsMtm->AddAddresseeL( fromTo->Des() );
-
-            // set delivery settings
-            CSmsSettings* sendOptions = CSmsSettings::NewL();
-            CleanupStack::PushL( sendOptions );
-            sendOptions->CopyL( smsMtm->ServiceSettings() );
-            sendOptions->SetDelivery( ESmsDeliveryImmediately );
-
-            CSmsHeader* smsHeader = &( smsMtm->SmsHeader() );
-            smsHeader->SetSmsSettingsL( *sendOptions );
-            CleanupStack::PopAndDestroy( sendOptions );
-            }
-
-
-
-        // set body
-        smsMtm->Body().Reset();
-        smsMtm->Body().InsertL( 0, *body );
-
-        // save the message
-        smsMtm->SaveMessageL();
-
-        // get the entry of the message
-        TMsvEntry tentry = smsMtm->Entry().Entry();
-
-        // set the details field
-        tentry.iDetails.Set( fromTo->Des() );
-
-        // set the description field if it is given.
-        // (with no description the beginning of the message body
-        //  is used as a description)
-        if ( description->Length() > 0 )
-            {
-            tentry.iDescription.Set( description->Des() );
-            }
-
-        // final fine tuning
-        tentry.SetAttachment( EFalse );
-        tentry.iDate.UniversalTime();
-        tentry.SetVisible( ETrue );
-        tentry.SetInPreparation( EFalse );
-        tentry.SetUnread( isUnread );
-        tentry.SetNew( isNew );
-        tentry.SetComplete( ETrue );
-        tentry.SetSendingState( KMsvSendStateWaiting );
-        tentry.iServiceId = defaultServiceId;
-        tentry.iRelatedId = 0;
-        if ( folder == EInbox )
-            {
-            tentry.SetReadOnly( ETrue );
-            }
-
-        smsMtm->Entry().ChangeL( tentry );
-
-        // send the message, if it is in outbox
-        if ( folder == EOutbox )
-            {
-            CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
-            CleanupStack::PushL( selection );
-            selection->AppendL( tentry.Id() );
-
-            TBuf8<1> dummyParameter;
-            CMsvOperationWait* waiter = CMsvOperationWait::NewLC();
-            CMsvOperation* op = smsMtm->InvokeAsyncFunctionL(
-                    ESmsMtmCommandScheduleCopy, *selection,
-                    dummyParameter, waiter->iStatus );
-            CleanupStack::PushL( op );
-            waiter->Start();
-            CActiveScheduler::Start();
-            CleanupStack::PopAndDestroy( op );
-            CleanupStack::PopAndDestroy( waiter );
-            CleanupStack::PopAndDestroy( selection );
-            }
-
-        CleanupStack::PopAndDestroy( smsMtm );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-
-        TInt32 id = tentry.Id();
-        TBuf8<8> idStr;
-        idStr.Copy( ( TUint8* )( &id ), sizeof( id ) );
-        SendOkMsgL( idStr );
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleSmsImportFuncL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleCreateMmsL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleCreateMmsL" );
-
-    if ( !ValidateAddMmsOrAddEmailCommand( aData ) )
-        {
-        // Error message has been sent from validation method.
-        return;
-        }
-
-    // parse the parameters
-    TInt position( 0 );
-    TInt cmdCode = aData[position];
-    position++;
-    HBufC16* fromTo = ExtractDesLC( aData, position, 1 );
-    HBufC16* description = ExtractDesLC( aData, position, 1 );
-    HBufC8* body = NULL;
-    if ( cmdCode == CHtiMessagesServicePlugin::EAddMms )
-        {
-        body = ExtractDes8LC( aData, position, 2 );
-        }
-    else // Audio msg does not have body text
-        {
-        body = HBufC8::NewLC( 0 );
-        }
-    HBufC16* attPath = ExtractDesLC( aData, position, 1 );
-    TBool isNew = (TBool)aData[position];
-    TBool isUnread = (TBool)aData[position+1];
-    TFolder folder = (TFolder)aData[position+2];
-    TInt extraAttNum;
-    position += 3;
-    TInt len = aData.Length();
-    if( aData.Length() > position )
-        {
-        extraAttNum = (TInt)aData[position];
-        }
-    else
-        {
-        extraAttNum = 0;
-        }
-    position++;
-
-    HTI_LOG_TEXT( "Creating MMS Client MTM" );
-    CMmsClientMtm* mmsMtm = NULL;
-    TRAPD( err , mmsMtm = ( CMmsClientMtm* )iMtmReg->NewMtmL(
-            KUidMsgTypeMultimedia ) );
-    if ( err || !mmsMtm )
-        {
-        HTI_LOG_TEXT( "MMS message type module not found" );
-        SendErrorMessageL( KErrNotFound, KErrorMsgTypeNotFound );
-        CleanupStack::PopAndDestroy( attPath );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-        return;
-        }
-    CleanupStack::PushL( mmsMtm );
-
-    HTI_LOG_TEXT( "Creating MMS Client MTM" );
-    CMsvEntry* entry = CMsvEntry::NewL( *iSession,
-                                        KMsvGlobalInBoxIndexEntryId,
-                                        TMsvSelectionOrdering() );
-    CleanupStack::PushL( entry );
-
-    // get the default service
-    TMsvId defaultServiceId = 0;
-    TRAP( err, defaultServiceId = mmsMtm->DefaultServiceL() );
-    if ( err )
-        {
-        HTI_LOG_FORMAT( "Could not get default service, err: %d", err );
-        SendErrorMessageL( err, KErrorMmsSettingNotDefined );
-        CleanupStack::PopAndDestroy( entry );
-        CleanupStack::PopAndDestroy( mmsMtm );
-        CleanupStack::PopAndDestroy( attPath );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-        return;
-        }
-
-    // map the folder parameter to folder id
-    TMsvId folderId = KMsvGlobalInBoxIndexEntryId;
-    TRAP( err, folderId = MapFolderToIdL( folder ) );
-    if ( err )
-        {
-        HTI_LOG_FORMAT( "Invalid folder: %d", folder );
-        SendErrorMessageL( err, KErrorInvalidFolder );
-        CleanupStack::PopAndDestroy( entry );
-        CleanupStack::PopAndDestroy( mmsMtm );
-        CleanupStack::PopAndDestroy( attPath );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-        return;
-        }
-    entry->SetEntryL( folderId );
-
-    // mtm takes ownership of entry context
-    mmsMtm->SetCurrentEntryL( entry );
-    CleanupStack::Pop( entry );
-
-    HTI_LOG_TEXT( "Creating MMS..." );
-    mmsMtm->CreateMessageL( defaultServiceId );
-    mmsMtm->SetMessageClass( EMmsClassPersonal );
-    mmsMtm->SetExpiryInterval( 86400 );
-    mmsMtm->SetDeliveryTimeInterval( 0 );
-    mmsMtm->SetMessagePriority( EMmsPriorityNormal );
-    mmsMtm->SetSenderVisibility( EMmsMaximumSenderVisibility );
-    mmsMtm->SetDeliveryReport( EMmsDeliveryReportNo );
-    mmsMtm->SetReadReply( EMmsReadReplyYes );
-
-    if ( description->Length() > 0 )
-        {
-        mmsMtm->SetSubjectL( description->Des() );
-        }
-
-    if ( folder == EInbox )
-        {
-        mmsMtm->SetSenderL( fromTo->Des() );
-        }
-    else
-        {
-        mmsMtm->AddAddresseeL( fromTo->Des() );
-        }
-
-    // get an access to the message store
-    HTI_LOG_TEXT( "Getting message store..." );
-    CMsvStore* store = NULL;
-    TRAP( err, store = entry->EditStoreL() );
-    if ( err )
-        {
-        HTI_LOG_FORMAT( "Could not get access to message store, err: %d", err );
-        SendErrorMessageL( err, KErrorMsgStoreOpenFailed );
-        CleanupStack::PopAndDestroy( mmsMtm );
-        CleanupStack::PopAndDestroy( attPath );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-        return;
-        }
-    CleanupStack::PushL( store );
-
-    MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
-    // set body attachment only for normal MMS - audio message doesn't have body
-    if ( cmdCode == CHtiMessagesServicePlugin::EAddMms )
-        {
-        // Set the message body as attachment
-        // Use UTF-8 as charset because MMS created with MMS editor seems to
-        // save text attachments also as UTF-8.
-        HTI_LOG_TEXT( "Setting body..." );
-        CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
-        CleanupStack::PushL( mimeHeaders );
-        mimeHeaders->SetContentTypeL( _L8( "text" ) );
-        mimeHeaders->SetContentSubTypeL( _L8( "plain" ) );
-        mimeHeaders->SetMimeCharset( KMmsUtf8 );
-        mimeHeaders->SetSuggestedFilenameL( _L( "body.txt" ) );
-
-        // ownership of bodyAttachment will be transferred
-        CMsvAttachment* bodyAttachment = CMsvAttachment::NewL(
-                CMsvAttachment::EMsvFile );
-        CleanupStack::PushL( bodyAttachment );
-        bodyAttachment->SetAttachmentNameL( _L( "body.txt" ) );
-        bodyAttachment->SetMimeTypeL( _L8( "text/plain" ) );
-        mimeHeaders->StoreL( *bodyAttachment );
-
-        RFile textFile;
-        CleanupClosePushL( textFile );
-        CWaiter* waiter = CWaiter::NewLC();
-        attachMan.CreateAttachmentL( _L( "body.txt" ), textFile,
-                bodyAttachment, waiter->iStatus );
-        waiter->StartAndWait();
-        CleanupStack::PopAndDestroy( waiter );
-
-        // write the UTF-8 body data to attachment file
-        textFile.Write( *body );
-        CleanupStack::PopAndDestroy(); // textFile
-        CleanupStack::Pop( bodyAttachment ); // ownership transfered
-        CleanupStack::PopAndDestroy( mimeHeaders );
-        }
-
-    // get the entry of the message
-    TMsvEntry tentry = mmsMtm->Entry().Entry();
-
-    // set the details field
-    tentry.iDetails.Set( *fromTo );
-
-    // set the description field
-    if ( description->Length() > 0 )
-        {
-        tentry.iDescription.Set( description->Left( KMmsMaxDescription ) );
-        }
-    else
-        {
-        TBuf<KMmsMaxDescription> descr;
-        CnvUtfConverter::ConvertToUnicodeFromUtf8( descr, *body );
-        tentry.iDescription.Set( descr );
-        }
-
-    // if this is audio message, set the bio type uid
-    if ( cmdCode == CHtiMessagesServicePlugin::EAddAudioMsg )
-        {
-        tentry.iBioType = KUidMsgSubTypeMmsAudioMsg.iUid;
-        }
-
-    // handle attachment
-    TBool attachmentsExist = EFalse;
-	if ( attPath->Length() > 0 )
-		{
-		HTI_LOG_TEXT( "Handling attachment..." );
-		// check that attachment exists
-		RFs fsSession;
-		if ( fsSession.Connect() != KErrNone )
-			{
-			HTI_LOG_FORMAT( "Error in connecting to file server session: %d", err );
-			SendErrorMessageL( KErrCouldNotConnect, KErrorRfsConnectFailed );
-			CleanupStack::PopAndDestroy( store );
-			CleanupStack::PopAndDestroy( mmsMtm );
-			CleanupStack::PopAndDestroy( attPath );
-			CleanupStack::PopAndDestroy( body );
-			CleanupStack::PopAndDestroy( description );
-			CleanupStack::PopAndDestroy( fromTo );
-			return;
-			}
-
-		TBool fileExists = BaflUtils::FileExists( fsSession, attPath->Des() );
-		fsSession.Close();
-		if ( !fileExists )
-			{
-			HTI_LOG_TEXT( "Attachment file not found" );
-			SendErrorMessageL( KErrPathNotFound, KErrorAttachmentNotFound );
-			store->RevertL();
-			CleanupStack::PopAndDestroy( store );
-			CleanupStack::PopAndDestroy( mmsMtm );
-			CleanupStack::PopAndDestroy( attPath );
-			CleanupStack::PopAndDestroy( body );
-			CleanupStack::PopAndDestroy( description );
-			CleanupStack::PopAndDestroy( fromTo );
-			return;
-			}
-		else
-			{
-			// save the attachment
-			TParse parser;
-			parser.Set( *attPath, NULL, NULL);
-			TFileName shortFileName = parser.NameAndExt();
-
-			// get the mime type
-			RApaLsSession ls;
-			User::LeaveIfError( ls.Connect() );
-			CleanupClosePushL( ls );
-			TUid appUid;
-			TDataType dataType;
-			ls.AppForDocument( *attPath, appUid, dataType );
-			CleanupStack::PopAndDestroy(); // ls
-			TPtrC8 mimeType = dataType.Des8();
-
-			// attachment settings
-			// ownership of attachment will be transferred
-			CMsvAttachment* attachment = CMsvAttachment::NewL(
-					CMsvAttachment::EMsvFile );
-			attachment->SetAttachmentNameL( shortFileName );
-			attachment->SetMimeTypeL( mimeType );
-
-			// save
-			CWaiter* waiter = CWaiter::NewLC();
-			attachMan.AddAttachmentL( *attPath, attachment, waiter->iStatus );
-			waiter->StartAndWait();
-			CleanupStack::PopAndDestroy( waiter );
-			attachmentsExist = ETrue;
-			}
-		}
-
-    do
-		{
-		HBufC16* attPath2;
-       if(extraAttNum-- > 0)
-            {
-            attPath2 = ExtractDesLC( aData, position, 1 );
-            }
-        else
-            {
-            break;
-            }
-
-		if ( attPath2->Length() > 0 )
-			{
-			HTI_LOG_TEXT( "Handling attachment..." );
-			// check that attachment exists
-			RFs fsSession;
-			if ( fsSession.Connect() != KErrNone )
-				{
-				HTI_LOG_FORMAT( "Error in connecting to file server session: %d", err );
-				SendErrorMessageL( KErrCouldNotConnect, KErrorRfsConnectFailed );
-				CleanupStack::PopAndDestroy( store );
-				CleanupStack::PopAndDestroy( mmsMtm );
-				CleanupStack::PopAndDestroy( attPath );
-				CleanupStack::PopAndDestroy( body );
-				CleanupStack::PopAndDestroy( description );
-				CleanupStack::PopAndDestroy( fromTo );
-				CleanupStack::PopAndDestroy( attPath2 );
-				return;
-				}
-	
-			TBool fileExists = BaflUtils::FileExists( fsSession, attPath2->Des() );
-			fsSession.Close();
-			if ( !fileExists )
-				{
-				HTI_LOG_TEXT( "Attachment file not found" );
-				SendErrorMessageL( KErrPathNotFound, KErrorAttachmentNotFound );
-				store->RevertL();
-				CleanupStack::PopAndDestroy( store );
-				CleanupStack::PopAndDestroy( mmsMtm );
-				CleanupStack::PopAndDestroy( attPath );
-				CleanupStack::PopAndDestroy( body );
-				CleanupStack::PopAndDestroy( description );
-				CleanupStack::PopAndDestroy( fromTo );
-				CleanupStack::PopAndDestroy( attPath2 );
-				return;
-				}
-			else
-				{
-				// save the attachment
-				TParse parser;
-				parser.Set( *attPath2, NULL, NULL);
-				TFileName shortFileName = parser.NameAndExt();
-	
-				// get the mime type
-				RApaLsSession ls;
-				User::LeaveIfError( ls.Connect() );
-				CleanupClosePushL( ls );
-				TUid appUid;
-				TDataType dataType;
-				ls.AppForDocument( *attPath2, appUid, dataType );
-				CleanupStack::PopAndDestroy(); // ls
-				TPtrC8 mimeType = dataType.Des8();
-	
-				// attachment settings
-				// ownership of attachment will be transferred
-				CMsvAttachment* attachment = CMsvAttachment::NewL(
-						CMsvAttachment::EMsvFile );
-				attachment->SetAttachmentNameL( shortFileName );
-				attachment->SetMimeTypeL( mimeType );
-	
-				// save
-				CWaiter* waiter = CWaiter::NewLC();
-				attachMan.AddAttachmentL( *attPath2, attachment, waiter->iStatus );
-				waiter->StartAndWait();
-				CleanupStack::PopAndDestroy( waiter );
-				attachmentsExist = ETrue;
-				}
-
-			CleanupStack::PopAndDestroy( attPath2 );
-			}
-		} while(ETrue);
-    // save the changes made to the message store
-    store->CommitL();
-    CleanupStack::PopAndDestroy( store );
-
-    // save the message
-    mmsMtm->SaveMessageL();
-
-    // final fine tuning
-    tentry.SetAttachment( attachmentsExist );
-    tentry.iDate.UniversalTime();
-    tentry.SetVisible( ETrue );
-    tentry.SetInPreparation( EFalse );
-    if ( folder == EDrafts )
-        {
-        tentry.SetReadOnly( EFalse );
-        }
-    else
-        {
-        tentry.SetReadOnly( ETrue );
-        }
-    tentry.SetUnread( isUnread );
-    tentry.SetNew( isNew );
-    tentry.SetComplete( ETrue );
-    tentry.SetSendingState( KMsvSendStateWaiting );
-    tentry.iServiceId = defaultServiceId;
-    tentry.iRelatedId = 0;
-    tentry.iMtmData1 = KMmsMessageMRetrieveConf | KMmsMessageMobileTerminated;
-
-    mmsMtm->Entry().ChangeL( tentry );
-
-    HTI_LOG_TEXT( "MMS created and ready" );
-
-    // send the message, if it is in outbox
-    if ( folder == EOutbox )
-        {
-        HTI_LOG_TEXT( "MMS is in Outbox, sending it..." );
-
-        CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
-        CleanupStack::PushL( selection );
-        selection->AppendL( tentry.Id() );
-
-        CMsvOperationWait* waiter = CMsvOperationWait::NewLC();
-        CMsvOperation* op = mmsMtm->SendL( *selection,
-                                           waiter->iStatus,
-                                           tentry.iDate );
-        CleanupStack::PushL( op );
-        waiter->Start();
-        CActiveScheduler::Start();
-        CleanupStack::PopAndDestroy( op );
-        CleanupStack::PopAndDestroy( waiter );
-        CleanupStack::PopAndDestroy( selection );
-        }
-
-    HTI_LOG_TEXT( "Cleaning up" );
-    CleanupStack::PopAndDestroy( mmsMtm );
-    CleanupStack::PopAndDestroy( attPath );
-    CleanupStack::PopAndDestroy( body );
-    CleanupStack::PopAndDestroy( description );
-    CleanupStack::PopAndDestroy( fromTo );
-
-    // send the message id back
-    TInt32 id = tentry.Id();
-    TBuf8<8> idStr;
-    idStr.Copy( ( TUint8* )( &id ), sizeof( id ) );
-    SendOkMsgL( idStr );
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleCreateMmsL: Done");
-    }
-
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleCreateEmailL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleCreateEmailL" );
-
-    if ( ValidateAddMmsOrAddEmailCommand( aData ) )
-        {
-        // parse the parameters
-        TInt position( 1 ); // position 0 is command code
-        HBufC16* fromTo = ExtractDesLC( aData, position, 1 );
-        HBufC16* description = ExtractDesLC( aData, position, 1 );
-        HBufC16* body = ExtractDesLC( aData, position, 2 );
-        HBufC16* attPath = ExtractDesLC( aData, position, 1 );
-        TBool isNew = (TBool)aData[position];
-        TBool isUnread = (TBool)aData[position+1];
-        TFolder folder = (TFolder)aData[position+2];
-	    TInt extraAttNum;
-	    position += 3;
-	    TInt len = aData.Length();
-	    if( aData.Length() > position )
-	        {
-	        extraAttNum = (TInt)aData[position];
-	        }
-	    else
-	        {
-	        extraAttNum = 0;
-	        }
-	    position++;
-
-        HTI_LOG_TEXT( "Creating SMTP Client MTM" );
-        CSmtpClientMtm* smtpMtm = NULL;
-        TRAPD( err, smtpMtm = ( CSmtpClientMtm* )iMtmReg->NewMtmL(
-                KUidMsgTypeSMTP ) );
-        if ( err || !smtpMtm )
-            {
-            HTI_LOG_TEXT( "SMTP message type module not found" );
-            SendErrorMessageL( KErrNotFound, KErrorMsgTypeNotFound );
-            CleanupStack::PopAndDestroy( attPath );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        CleanupStack::PushL( smtpMtm );
-
-        HTI_LOG_TEXT( "Creating a new CMsvEntry" );
-        CMsvEntry* entry = CMsvEntry::NewL( *iSession,
-                                            KMsvGlobalInBoxIndexEntryId,
-                                            TMsvSelectionOrdering() );
-        CleanupStack::PushL( entry );
-
-        // get the default service
-        HTI_LOG_TEXT( "Getting the default service" );
-        TMsvId defaultServiceId = 0;
-        TRAP( err, defaultServiceId = smtpMtm->DefaultServiceL() );
-        if ( err )
-            {
-            HTI_LOG_FORMAT( "Could not get default service, err: %d", err );
-            SendErrorMessageL( err, KErrorMailboxNotDefined );
-            CleanupStack::PopAndDestroy( entry );
-            CleanupStack::PopAndDestroy( smtpMtm );
-            CleanupStack::PopAndDestroy( attPath );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-
-        // map the folder parameter to folder id
-        HTI_LOG_TEXT( "Mapping the folder parameter to folder id" );
-        TMsvId folderId = KMsvGlobalInBoxIndexEntryId;
-        TRAP( err, folderId = MapFolderToIdL( folder ) );
-        if ( err )
-            {
-            HTI_LOG_FORMAT( "Invalid folder: %d", folder );
-            SendErrorMessageL( err, KErrorInvalidFolder );
-            CleanupStack::PopAndDestroy( entry );
-            CleanupStack::PopAndDestroy( smtpMtm );
-            CleanupStack::PopAndDestroy( attPath );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        entry->SetEntryL( folderId );
-
-        // mtm takes ownership of entry context
-        smtpMtm->SetCurrentEntryL( entry );
-        CleanupStack::Pop( entry );
-
-        // create a message and set subject and body
-        smtpMtm->CreateMessageL( defaultServiceId );
-        smtpMtm->SetSubjectL( description->Des() );
-        smtpMtm->Body().Reset();
-        smtpMtm->Body().InsertL( 0, body->Des() );
-
-        // get the entry of the message
-        TMsvEntry tentry = smtpMtm->Entry().Entry();
-
-        // add addressee
-        smtpMtm->AddAddresseeL( fromTo->Des() );
-        tentry.iDetails.Set( fromTo->Des() );
-
-        // If creating to Inbox use other than KUidMsgTypeSMTP so that the
-        // mail displays "from" field and not "to" field.
-        if ( folder == EInbox )
-            {
-            tentry.iMtm = KUidMsgTypeIMAP4;
-            }
-
-        // set the description field same as the message subject
-        tentry.iDescription.Set( description->Des() );
-
-        // save the changes done above
-        smtpMtm->Entry().ChangeL( tentry );
-
-        // get an access to the message store
-        CMsvStore* store = entry->EditStoreL();
-        CleanupStack::PushL( store );
-        CImHeader* header = CImHeader::NewLC();
-        header->RestoreL( *store );
-        TUint charset = header->Charset();
-        CleanupStack::PopAndDestroy( header );
-        CleanupStack::PopAndDestroy( store );
-
-        // handle attachment
-        TBool attachmentsExist = EFalse;
-        if ( attPath->Length() > 0 )
-            {
-            // check that attachment exists
-            RFs fsSession;
-            if ( fsSession.Connect() != KErrNone )
-                {
-                HTI_LOG_FORMAT( "Error in connecting to file server session: %d", err );
-                SendErrorMessageL( KErrCouldNotConnect, KErrorRfsConnectFailed );
-                CleanupStack::PopAndDestroy( smtpMtm );
-                CleanupStack::PopAndDestroy( attPath );
-                CleanupStack::PopAndDestroy( body );
-                CleanupStack::PopAndDestroy( description );
-                CleanupStack::PopAndDestroy( fromTo );
-                return;
-                }
-            CleanupClosePushL( fsSession );
-
-            TBool fileExists = BaflUtils::FileExists( fsSession, attPath->Des() );
-            if ( !fileExists )
-                {
-                HTI_LOG_TEXT( "Attachment file not found" );
-                SendErrorMessageL( KErrPathNotFound, KErrorAttachmentNotFound );
-                CleanupStack::PopAndDestroy(); // fsSession
-                CleanupStack::PopAndDestroy( smtpMtm );
-                CleanupStack::PopAndDestroy( attPath );
-                CleanupStack::PopAndDestroy( body );
-                CleanupStack::PopAndDestroy( description );
-                CleanupStack::PopAndDestroy( fromTo );
-                return;
-                }
-            else
-                {
-                // get the mime type
-                HTI_LOG_TEXT( "Getting the attachment's mime type" );
-                RApaLsSession ls;
-                User::LeaveIfError( ls.Connect() );
-                TUid appUid;
-                TDataType dataType;
-                ls.AppForDocument( *attPath, appUid, dataType );
-                TPtrC8 mimeType = dataType.Des8();
-
-                HTI_LOG_TEXT( "Adding the attachment" );
-                CWaiter* waiter = CWaiter::NewLC();
-                smtpMtm->AddAttachmentL( attPath->Des(), mimeType, charset,
-                        waiter->iStatus );
-                waiter->StartAndWait();
-                CleanupStack::PopAndDestroy( waiter );
-                HTI_LOG_TEXT( "Attachment added succesfully" );
-                ls.Close();
-                attachmentsExist = ETrue;
-                }
-
-            CleanupStack::PopAndDestroy(); // fsSession
-            }
-
-		do
-			{
-			HBufC16* attPath2;
-			if(extraAttNum-- > 0)
-	            {
-	            attPath2 = ExtractDesLC( aData, position, 1 );
-	            }
-	        else
-	            {
-	            break;
-	            }
-            // check that attachment exists
-            RFs fsSession;
-            if ( fsSession.Connect() != KErrNone )
-                {
-                HTI_LOG_FORMAT( "Error in connecting to file server session: %d", err );
-                SendErrorMessageL( KErrCouldNotConnect, KErrorRfsConnectFailed );
-                CleanupStack::PopAndDestroy( smtpMtm );
-                CleanupStack::PopAndDestroy( attPath );
-                CleanupStack::PopAndDestroy( body );
-                CleanupStack::PopAndDestroy( description );
-                CleanupStack::PopAndDestroy( fromTo );
-                CleanupStack::PopAndDestroy( attPath2 );
-                return;
-                }
-            CleanupClosePushL( fsSession );
-
-            TBool fileExists = BaflUtils::FileExists( fsSession, attPath2->Des() );
-            if ( !fileExists )
-                {
-                HTI_LOG_TEXT( "Attachment file not found" );
-                SendErrorMessageL( KErrPathNotFound, KErrorAttachmentNotFound );
-                CleanupStack::PopAndDestroy(); // fsSession
-                CleanupStack::PopAndDestroy( smtpMtm );
-                CleanupStack::PopAndDestroy( attPath );
-                CleanupStack::PopAndDestroy( body );
-                CleanupStack::PopAndDestroy( description );
-                CleanupStack::PopAndDestroy( fromTo );
-                CleanupStack::PopAndDestroy( attPath2 );
-                return;
-                }
-            else
-                {
-                // get the mime type
-                HTI_LOG_TEXT( "Getting the attachment's mime type" );
-                RApaLsSession ls;
-                User::LeaveIfError( ls.Connect() );
-                TUid appUid;
-                TDataType dataType;
-                ls.AppForDocument( *attPath2, appUid, dataType );
-                TPtrC8 mimeType = dataType.Des8();
-
-                HTI_LOG_TEXT( "Adding the attachment" );
-                CWaiter* waiter = CWaiter::NewLC();
-                smtpMtm->AddAttachmentL( attPath2->Des(), mimeType, charset,
-                        waiter->iStatus );
-                waiter->StartAndWait();
-                CleanupStack::PopAndDestroy( waiter );
-                HTI_LOG_TEXT( "Attachment added succesfully" );
-                ls.Close();
-                attachmentsExist = ETrue;
-                }
-
-            CleanupStack::PopAndDestroy(); // fsSession
-			CleanupStack::PopAndDestroy( attPath2 );
-		} while(ETrue);
-
-        // save the message
-        smtpMtm->SaveMessageL();
-
-        // final fine tuning
-        TMsvEmailEntry temailEntry = static_cast<TMsvEmailEntry>( tentry );
-        temailEntry.SetMessageFolderType( EFolderTypeUnknown );
-        temailEntry.SetDisconnectedOperation( ENoDisconnectedOperations );
-        temailEntry.SetEncrypted( EFalse );
-        temailEntry.SetSigned( EFalse );
-        temailEntry.SetVCard( EFalse );
-        temailEntry.SetVCalendar( EFalse );
-        temailEntry.SetReceipt( EFalse );
-        temailEntry.SetMHTMLEmail( EFalse );
-        temailEntry.SetBodyTextComplete( ETrue );
-        temailEntry.SetAttachment( attachmentsExist );
-        temailEntry.iDate.UniversalTime();
-        temailEntry.SetVisible( ETrue );
-        temailEntry.SetInPreparation( EFalse );
-        temailEntry.SetSendingState( KMsvSendStateWaiting );
-        temailEntry.SetUnread( isUnread );
-        temailEntry.SetNew( isNew );
-        temailEntry.SetComplete( ETrue );
-        temailEntry.iServiceId = defaultServiceId;
-        temailEntry.iRelatedId = 0;
-
-        smtpMtm->Entry().ChangeL( temailEntry );
-
-        // get an access to the message store
-        store = entry->EditStoreL();
-        CleanupStack::PushL( store );
-
-        // set email header info
-        header = CImHeader::NewLC();
-        header->RestoreL( *store );
-        header->SetSubjectL( description->Des() );
-        header->SetFromL( fromTo->Des() );
-        header->SetReceiptAddressL( fromTo->Des() );
-        header->StoreL( *store );
-        store->CommitL();
-        CleanupStack::PopAndDestroy( header );
-        CleanupStack::PopAndDestroy( store );
-
-        // send the message, if it is in outbox
-        if ( folder == EOutbox )
-            {
-            HTI_LOG_TEXT( "E-Mail was created in outbox, marking it to be sent on next connection" );
-
-            CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
-            CleanupStack::PushL( selection );
-            selection->AppendL( temailEntry.Id() );
-
-            TBuf8<1> dummyParameter;
-            CMsvOperationActiveSchedulerWait* waiter =
-                    CMsvOperationActiveSchedulerWait::NewLC();
-            CMsvOperation* op = smtpMtm->InvokeAsyncFunctionL(
-                    KSMTPMTMSendOnNextConnection, *selection,
-                    dummyParameter, waiter->iStatus );
-            CleanupStack::PushL( op );
-            waiter->Start();
-            CleanupStack::PopAndDestroy( op );
-            CleanupStack::PopAndDestroy( waiter );
-            CleanupStack::PopAndDestroy( selection );
-            }
-
-        HTI_LOG_TEXT( "Cleaning up" );
-        CleanupStack::PopAndDestroy( smtpMtm );
-        CleanupStack::PopAndDestroy( attPath );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-
-        // send the message id back
-        TInt32 id = tentry.Id();
-        TBuf8<8> idStr;
-        idStr.Copy( ( TUint8* )( &id ), sizeof( id ) );
-        SendOkMsgL( idStr );
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleCreateEmailL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleCreateObexMsgL( const TDesC8& aData,
-                                                 TUid aMtmUid,
-                                                 TUid aMsgTypeUid )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleCreateObexMsgL" );
-
-    if ( ValidateAddObexMsgCommand( aData ) )
-        {
-        // parse the parameters
-        TInt position( 0 );
-        HBufC16* fromTo = ExtractDesLC( aData, position, 1 );
-        HBufC16* description = ExtractDesLC( aData, position, 1 );
-        HBufC16* attPath = ExtractDesLC( aData, position, 1 );
-        TBool isNew = (TBool)aData[position];
-        TBool isUnread = (TBool)aData[position+1];
-        TFolder folder = (TFolder)aData[position+2];
-
-        // Adding Obex messages to the outbox is not allowed
-        if ( folder == EOutbox )
-            {
-            HTI_LOG_TEXT( "Outbox not supported with Obex messages" );
-            SendErrorMessageL( KErrNotSupported, KErrorNotSupported );
-            CleanupStack::PopAndDestroy( attPath );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-
-        CObexClientMtm* obexMtm = NULL;
-        TRAPD( err, obexMtm = ( CObexClientMtm* )iMtmReg->NewMtmL( aMtmUid ) );
-        if ( err || !obexMtm )
-            {
-            HTI_LOG_TEXT( "Obex message type module not found" );
-            SendErrorMessageL( KErrNotFound, KErrorMsgTypeNotFound );
-            CleanupStack::PopAndDestroy( attPath );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        CleanupStack::PushL( obexMtm );
-
-        CMsvEntry* entry = CMsvEntry::NewL( *iSession,
-                                            KMsvGlobalInBoxIndexEntryId,
-                                            TMsvSelectionOrdering() );
-        CleanupStack::PushL( entry );
-
-        TMsvId defaultServiceId = 0;
-
-        // map the folder parameter to folder id
-        TMsvId folderId = KMsvGlobalInBoxIndexEntryId;
-        TRAP( err, folderId = MapFolderToIdL( folder ) );
-        if ( err )
-            {
-            HTI_LOG_FORMAT( "Invalid folder: %d", folder );
-            SendErrorMessageL( err, KErrorInvalidFolder );
-            CleanupStack::PopAndDestroy( entry );
-            CleanupStack::PopAndDestroy( obexMtm );
-            CleanupStack::PopAndDestroy( attPath );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        entry->SetEntryL( folderId );
-
-        // mtm takes ownership of entry context
-        obexMtm->SetCurrentEntryL( entry );
-        CleanupStack::Pop( entry );
-
-        // create a new message
-        obexMtm->CreateMessageL( defaultServiceId );
-
-        // get the entry of the message
-        TMsvEntry tentry = obexMtm->Entry().Entry();
-
-        // set subject
-        obexMtm->SetSubjectL( description->Des() );
-        tentry.iDescription.Set( description->Des() );
-
-        // set body, must be empty for obex messages
-        obexMtm->Body().Reset();
-
-        // set the details field and
-        tentry.iDetails.Set( fromTo->Des() );
-
-        // set mtm
-        tentry.iMtm = aMtmUid;
-        tentry.iType = KUidMsvMessageEntry;
-        tentry.iServiceId = KMsvUnknownServiceIndexEntryId;
-
-        // save the changes done above
-        obexMtm->Entry().ChangeL( tentry );
-
-        // save the message
-        obexMtm->SaveMessageL();
-
-        // final fine tuning
-        tentry.iDate.HomeTime();
-        tentry.SetVisible( ETrue );
-        tentry.SetInPreparation( EFalse );
-        tentry.SetUnread( isUnread );
-        tentry.SetNew( isNew );
-        tentry.SetComplete( ETrue );
-        obexMtm->Entry().ChangeL( tentry );
-
-        // handle attachment
-        if ( attPath->Length() > 0 )
-            {
-            // check that attachment exists
-            RFs fsSession;
-            if ( fsSession.Connect() != KErrNone )
-                {
-                HTI_LOG_FORMAT( "Error in connecting to file server session: %d", err );
-                SendErrorMessageL( KErrCouldNotConnect, KErrorRfsConnectFailed );
-                CleanupStack::PopAndDestroy( obexMtm );
-                CleanupStack::PopAndDestroy( attPath );
-                CleanupStack::PopAndDestroy( description );
-                CleanupStack::PopAndDestroy( fromTo );
-                return;
-                }
-
-            TBool fileExists = BaflUtils::FileExists( fsSession, attPath->Des() );
-            fsSession.Close();
-            if ( !fileExists )
-                {
-                HTI_LOG_TEXT( "Attachment file not found" );
-                SendErrorMessageL( KErrPathNotFound, KErrorAttachmentNotFound );
-                CleanupStack::PopAndDestroy( obexMtm );
-                CleanupStack::PopAndDestroy( attPath );
-                CleanupStack::PopAndDestroy( description );
-                CleanupStack::PopAndDestroy( fromTo );
-                return;
-                }
-            else
-                {
-                // create a new entry for the attachment
-                TMsvEntry attachTEntry;
-                attachTEntry.iType = KUidMsvAttachmentEntry;
-                attachTEntry.iServiceId = KMsvUnknownServiceIndexEntryId;
-                attachTEntry.iMtm = aMsgTypeUid; //save as bt message
-
-                entry->CreateL( attachTEntry );
-
-                CMsvEntry* attachEntry = iSession->GetEntryL( attachTEntry.Id() );
-                obexMtm->SetCurrentEntryL( attachEntry );
-
-                // get source file
-                TFileName sourceFileName = attPath->Des();
-
-                // get the mime type
-                RApaLsSession ls;
-                User::LeaveIfError( ls.Connect() );
-                CleanupClosePushL<RApaLsSession>(ls);
-                TUid appUid;
-                TDataType mimeType;
-                ls.AppForDocument( sourceFileName, appUid, mimeType );
-                CleanupStack::PopAndDestroy(); //ls
-
-                CWaiter* waiter = CWaiter::NewLC();
-
-                // add an attachment to the current message entry
-                obexMtm->AddAttachmentL( sourceFileName, mimeType.Des8(), 0,
-                        waiter->iStatus );
-                waiter->StartAndWait();
-                CleanupStack::PopAndDestroy( waiter );
-                }
-            }
-
-        CleanupStack::PopAndDestroy( obexMtm );
-        CleanupStack::PopAndDestroy( attPath );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-
-        // send the message id back
-        TInt32 id = tentry.Id();
-        TBuf8<8> idStr;
-        idStr.Copy( ( TUint8* )( &id ), sizeof( id ) );
-        SendOkMsgL( idStr );
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleCreateObexMsgL: Done");
-    }
-
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleCreateSmartMsgL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleCreateSmartMsgL" );
-
-    if ( ValidateAddSmartMsgCommand( aData ) )
-        {
-        TInt position( 0 );
-        HBufC16* fromTo = ExtractDesLC( aData, position, 1 );
-        HBufC16* description = ExtractDesLC( aData, position, 1 );
-        HBufC16* body = ExtractDesLC( aData, position, 2 );
-        TBool isNew = (TBool)aData[position];
-        TBool isUnread = (TBool)aData[position+1];
-        TFolder folder = (TFolder)aData[position+2];
-        TInt bioUidValue =   aData[position+3] +
-                           ( aData[position+4] << 8 ) +
-                           ( aData[position+5] << 16 ) +
-                           ( aData[position+6] << 24 );
-
-
-        // Smart messages can be created only to inbox.
-        // For sending smart messages, create a normal SMS with smart message
-        // content as a body and send it.
-        if ( folder != EInbox )
-            {
-            HTI_LOG_TEXT( "Invalid folder specified for smart message" );
-            SendErrorMessageL( KErrArgument, KErrorInvalidFolderForSmartMsg );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-
-            }
-
-        CSmsClientMtm* smsMtm = NULL;
-        TRAPD( err, smsMtm = ( CSmsClientMtm* )iMtmReg->NewMtmL( KUidMsgTypeSMS ) );
-        if ( err || !smsMtm )
-            {
-            HTI_LOG_TEXT( "SMS message type module not found" );
-            SendErrorMessageL( KErrNotFound, KErrorMsgTypeNotFound );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-        CleanupStack::PushL( smsMtm );
-
-        CMsvEntry* entry = CMsvEntry::NewL( *iSession,
-                KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering() );
-        CleanupStack::PushL( entry );
-
-        // get the default service
-        TMsvId defaultServiceId = 0;
-        TRAP( err, defaultServiceId = smsMtm->DefaultServiceL() );
-        if ( err )
-            {
-            HTI_LOG_FORMAT( "Could not get default service, err: %d", err );
-            SendErrorMessageL( err, KErrorSmsSettingNotDefined );
-            CleanupStack::PopAndDestroy( entry );
-            CleanupStack::PopAndDestroy( smsMtm );
-            CleanupStack::PopAndDestroy( body );
-            CleanupStack::PopAndDestroy( description );
-            CleanupStack::PopAndDestroy( fromTo );
-            return;
-            }
-
-        // no need for folder mapping, since only inbox allowed for smart messages
-        TMsvId folderId = KMsvGlobalInBoxIndexEntryId;
-        entry->SetEntryL( folderId );
-
-        // mtm takes ownership of entry context
-        smsMtm->SetCurrentEntryL( entry );
-        CleanupStack::Pop( entry );
-
-        // create a new message
-        smsMtm->CreateMessageL( defaultServiceId );
-
-        // update the message header
-        CSmsHeader* smsHeader = &( smsMtm->SmsHeader() );
-        delete smsHeader;
-        smsHeader = NULL;
-        smsHeader = CSmsHeader::NewL( CSmsPDU::ESmsSubmit, smsMtm->Body() );
-        smsHeader->SetFromAddressL( fromTo->Des() );
-
-        // set body, the actual BIO message content
-        smsMtm->Body().Reset();
-        smsMtm->Body().InsertL( 0, body->Des() );
-
-        // get the entry of the message
-        TMsvEntry tentry = smsMtm->Entry().Entry();
-
-        // set BIO message type specific data
-        tentry.iBioType = bioUidValue;
-        smsMtm->BioTypeChangedL( TUid::Uid( bioUidValue ) );
-
-        // set details field
-        tentry.iDetails.Set( fromTo->Des() );
-
-        // set the description field
-        tentry.iDescription.Set( description->Des() );
-
-        // set correct MTM type
-        tentry.iMtm= KUidBIOMessageTypeMtm;
-
-        // final fine tuning
-        tentry.SetAttachment( EFalse );
-        tentry.iDate.UniversalTime();
-        tentry.SetVisible( ETrue );
-        tentry.SetInPreparation( EFalse );
-        tentry.SetUnread( isUnread );
-        tentry.SetNew( isNew );
-        tentry.SetComplete( ETrue );
-        tentry.SetSendingState( KMsvSendStateWaiting );
-        tentry.iServiceId = defaultServiceId;
-        tentry.iRelatedId = 0;
-
-        // save the changes done above
-        smsMtm->Entry().ChangeL( tentry );
-
-        // save the message
-        smsMtm->SaveMessageL();
-
-        CleanupStack::PopAndDestroy( smsMtm );
-        CleanupStack::PopAndDestroy( body );
-        CleanupStack::PopAndDestroy( description );
-        CleanupStack::PopAndDestroy( fromTo );
-
-        TInt32 id = tentry.Id();
-        TBuf8<8> idStr;
-        idStr.Copy( ( TUint8* )( &id ), sizeof( id ) );
-        SendOkMsgL( idStr );
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleCreateSmartMsgL: Done");
-    }
-
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleDeleteMessageL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleDeleteMessageL" );
-
-    if ( aData.Length() != 4 )
-        {
-        HTI_LOG_TEXT( "CMessageMgmntHandler: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidId );
-        return;
-        }
-
-    TMsvId entryId =   aData[0] +
-                     ( aData[1] << 8 ) +
-                     ( aData[2] << 16 ) +
-                     ( aData[3] << 24 );
-    HTI_LOG_FORMAT( "CMessageMgmntHandler: Deleting one message, id: %d", entryId );
-    TMsvEntry entry;
-    TMsvId service;
-    User::LeaveIfError( iSession->GetEntry( entryId, service, entry ) );
-
-    CMsvEntry* parentCEntry = iSession->GetEntryL( entry.Parent() );
-    CleanupStack::PushL( parentCEntry );
-    TRAPD( err, parentCEntry->DeleteL( entry.Id() ) );
-    CleanupStack::PopAndDestroy( parentCEntry );
-
-    if ( err == KErrNone )
-        {
-        SendOkMsgL( KNullDesC8 );
-        }
-    else if ( err == KErrNotFound )
-        {
-        SendErrorMessageL( err, KErrorItemNotFound );
-        }
-    else
-        {
-        SendErrorMessageL( err, KErrorFailedDelete );
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleDeleteMessageL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleDeleteMessagesL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleDeleteMessagesFuncL" );
-
-    if ( aData.Length() != 2 )
-        {
-        HTI_LOG_TEXT( "CMessageMgmntHandler: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidFolder );
-        return;
-        }
-
-    if ( aData[0] == EAllFolders )
-        {
-        HandleDeleteFromAllFoldersL( (TMessageType)aData[1] );
-        }
-    else if ( aData[1] == EAllMessageTypes )
-        {
-        HandleDeleteAllMessageTypesL( (TFolder)aData[0] );
-        }
-    else
-        {
-        HandleDeleteFromFolderByTypeL( (TFolder)aData[0],
-                                       (TMessageType)aData[1] );
-        }
-
-    SendOkMsgL( KNullDesC8 );
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleDeleteMessagesFuncL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleDeleteFromAllFoldersL( TMessageType aType )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleDeleteFromAllFoldersL" );
-
-    if ( aType == EAllMessageTypes )
-        {
-        for ( TInt i = 1; i < ENumberOfFolders; i++ )
-            {
-            HandleDeleteAllMessageTypesL( (TFolder)i );
-            }
-        }
-    else
-        {
-        for ( TInt i = 1; i < ENumberOfFolders; i++ )
-            {
-            HandleDeleteFromFolderByTypeL( (TFolder)i, aType );
-            }
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleDeleteFromAllFoldersL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleDeleteAllMessageTypesL( TFolder aFolder )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleDeleteAllMessageTypesL" );
-
-    if ( aFolder == EAllFolders )
-        {
-        for ( TInt i = 1; i < ENumberOfMessageTypes; i++ )
-            {
-            HandleDeleteFromAllFoldersL( (TMessageType)i );
-            }
-        }
-    else
-        {
-        for ( TInt i = 1; i < ENumberOfMessageTypes; i++ )
-            {
-            HandleDeleteFromFolderByTypeL( aFolder, (TMessageType)i );
-            }
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleDeleteAllMessageTypesL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleDeleteFromFolderByTypeL( TFolder aFolder,
-                                                          TMessageType aType )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::HandleDeleteFromFolderByTypeL" );
-
-    TMsvId folderId = MapFolderToIdL( aFolder );
-    TUid msgTypeUid = MapMessageTypeToUidL( aType );
-
-    HTI_LOG_TEXT( "Deleting messages..." );
-    HTI_LOG_FORMAT( "Folder: %d", aFolder );
-    HTI_LOG_FORMAT( "Message type: %d", aType );
-
-    CMsvEntry* folder = CMsvEntry::NewL( *iSession,
-                                         folderId,
-                                         TMsvSelectionOrdering() );
-    CleanupStack::PushL( folder );
-    CMsvEntrySelection* sel = folder->ChildrenWithMtmL( msgTypeUid );
-
-    CleanupStack::PushL( sel );
-    HTI_LOG_FORMAT( "Found %d matching items", sel->Count() );
-
-    for ( TInt i = 0; i < sel->Count(); i++ )
-        {
-        TMsvId entryId = sel->At( i );
-        TMsvEntry entry;
-        TMsvId service;
-        User::LeaveIfError( iSession->GetEntry( entryId, service, entry ) );
-        if ( ( aType == EAudioMessage && entry.iBioType != KUidMsgSubTypeMmsAudioMsg.iUid ) ||
-                ( aType == EMMS && entry.iBioType == KUidMsgSubTypeMmsAudioMsg.iUid ) )
-            {
-            // do not delete audio messages when MMS deletion
-            // requested and vice versa
-            continue;
-            }
-        CMsvEntry* parentCEntry = iSession->GetEntryL( entry.Parent() );
-        CleanupStack::PushL( parentCEntry );
-        parentCEntry->DeleteL( entry.Id() );
-        CleanupStack::PopAndDestroy( parentCEntry );
-        }
-
-    CleanupStack::PopAndDestroy( sel );
-    CleanupStack::PopAndDestroy( folder );
-
-    if ( aType == EEmail )
-        {
-        HandleDeleteFromFolderByTypeL( aFolder, EEmailPOP3 );
-        HandleDeleteFromFolderByTypeL( aFolder, EEmailIMAP4 );
-        }
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::HandleDeleteFromFolderByTypeL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::SendOkMsgL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN("CMessageMgmntHandler::SendOkMsgL: Starting");
-
-    User::LeaveIfNull( iDispatcher );
-
-    HBufC8* temp = HBufC8::NewL( aData.Length() + 1 );
-    TPtr8 response = temp->Des();
-    response.Append( (TChar) CHtiMessagesServicePlugin::EResultOk );
-    response.Append( aData );
-    User::LeaveIfError( iDispatcher->DispatchOutgoingMessage(
-        temp, KHtiMessagesServiceUid ) );
-
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::SendOkMsgL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::SendErrorMessageL( TInt aError,
-                                              const TDesC8& aDescription )
-    {
-    HTI_LOG_FUNC_IN("CMessageMgmntHandler::SendErrorMessageL: Starting");
-    User::LeaveIfNull( iDispatcher );
-    User::LeaveIfError( iDispatcher->DispatchOutgoingErrorMessage(
-        aError, aDescription, KHtiMessagesServiceUid ) );
-    HTI_LOG_FUNC_OUT("CMessageMgmntHandler::SendErrorMessageL: Done");
-    }
-
-// ----------------------------------------------------------------------------
-TBool CMessageMgmntHandler::ValidateAddSmsCommand( const TDesC8& aData )
-    {
-    if ( aData.Length() < KAddSmsCmdMinLength )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmsCommand: Error: missing data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    TInt offset = 0;
-    TInt fromLength = aData[offset];
-
-    offset = 1 + fromLength;
-    if ( offset > aData.Length() - 1 )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmsCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt descrLength = aData[offset];
-
-    offset = offset + 1 + descrLength;
-    if ( offset > aData.Length() - 2 ) // body length in two bytes
-        {
-        HTI_LOG_TEXT( "ValidateAddSmsCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt bodyLength = aData[offset] + ( aData[offset+1] << 8 );
-
-    TInt wholeLength = 1 + fromLength +
-                       1 + descrLength +
-                       2 + bodyLength +
-                       1 + // is new
-                       1 + // is unread
-                       1;  // folder
-
-    if ( wholeLength != aData.Length() )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmsCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    if ( bodyLength > 160 )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmsCommand: Error: too long SMS body" );
-        SendErrorMessageL( KErrOverflow, KErrorTooLongSmsBody );
-        return EFalse;
-        }
-
-    return ETrue;
-    }
-
-
-// ----------------------------------------------------------------------------
-TBool CMessageMgmntHandler::ValidateAddMmsOrAddEmailCommand( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::ValidateAddMmsOrAddEmailCommand" );
-    if ( aData.Length() < KAddMmsOrEmailCmdMinLength + 1 ) // +1 = cmd code
-        {
-        HTI_LOG_TEXT( "Error: missing data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    if ( aData[0] == CHtiMessagesServicePlugin::EAddAudioMsg &&
-            aData.Length() < KAddAudioCmdMinLength + 1 ) // +1 = cmd code
-        {
-        HTI_LOG_TEXT( "ValidateAddMmsOrAddEmailCommand: Error: missing data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    TInt offset = 0;
-    TInt cmdCode = aData[offset];
-    offset++;
-    TInt fromToLength = aData[offset];
-    fromToLength++; // the length byte
-
-    offset = offset + fromToLength;
-    if ( offset > aData.Length() - 1 )
-        {
-        HTI_LOG_TEXT( "Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt descrLength = aData[offset];
-    descrLength++; // the length byte
-
-    offset = offset + descrLength;
-    TInt bodyLength = 0;
-    if ( cmdCode != CHtiMessagesServicePlugin::EAddAudioMsg )
-        {
-        if ( offset > aData.Length() - 2 ) // body length in two bytes
-            {
-            HTI_LOG_TEXT( "Error: wrong length of data" );
-            SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-            return EFalse;
-            }
-        bodyLength = aData[offset] + ( aData[offset+1] << 8 );
-        bodyLength += 2; // the body length bytes
-        }
-
-    offset = offset + bodyLength;
-    if ( offset > aData.Length() - 1 )
-        {
-        HTI_LOG_TEXT( ": wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt attPathLength = aData[offset];
-    if ( attPathLength == 0 && cmdCode == CHtiMessagesServicePlugin::EAddAudioMsg )
-        {
-        // attachment (the audio) is mandatory for audio message
-        HTI_LOG_TEXT( "Error: missing attachment" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    attPathLength++; // the length byte
-
-    TInt wholeLength = 1 + // command code
-                       fromToLength + descrLength +  bodyLength + attPathLength +
-                       1 + // is new
-                       1 + // is unread
-                       1;  // folder
-
-    TInt extraAttPathLength = 0;
-    TInt extraAttNum = 0;
-    TInt extraNumLen = 0;
-    if( wholeLength < aData.Length() )
-    	{
-    	offset = wholeLength;
-        extraAttNum = aData[offset];
-        offset ++;
-
-        extraNumLen = 1;
-
-	    while( offset < aData.Length() && extraAttNum > 0)
-	    	{
-	        extraAttPathLength += aData[offset];
-	        extraAttPathLength ++;
-	        extraAttNum --;
-	        offset += 1 + aData[offset];
-	    	}
-	    }
-
-	wholeLength += extraNumLen + extraAttPathLength;
-	
-    if ( wholeLength != aData.Length() )
-        {
-        HTI_LOG_TEXT( "Error: wrong length of data (wholeLength)" );
-        HTI_LOG_FORMAT( "Expected: %d", wholeLength );
-        HTI_LOG_FORMAT( "Was:      %d", aData.Length() );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    return ETrue;
-    }
-
-
-// ----------------------------------------------------------------------------
-TBool CMessageMgmntHandler::ValidateAddObexMsgCommand( const TDesC8& aData )
-    {
-    if ( aData.Length() < KAddObexMsgCmdMinLength )
-        {
-        HTI_LOG_TEXT( "ValidateAddObexMsgCommand: Error: missing data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    TInt offset = 0;
-    TInt fromToLength = aData[offset];
-
-    offset = 1 + fromToLength;
-    if ( offset > aData.Length() - 1 )
-        {
-        HTI_LOG_TEXT( "ValidateAddObexMsgCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt descrLength = aData[offset];
-
-    offset = offset + 1 + descrLength;
-    if ( offset > aData.Length() - 1 )
-        {
-        HTI_LOG_TEXT( "ValidateAddObexMsgCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt attPathLength = aData[offset];
-
-    TInt wholeLength = 1 + fromToLength +
-                       1 + descrLength +
-                       1 + attPathLength +
-                       1 + // is new
-                       1 + // is unread
-                       1;  // folder
-
-    if ( wholeLength != aData.Length() )
-        {
-        HTI_LOG_TEXT( "ValidateAddObexMsgCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    return ETrue;
-    }
-
-// ----------------------------------------------------------------------------
-TBool CMessageMgmntHandler::ValidateAddSmartMsgCommand( const TDesC8& aData )
-    {
-    if ( aData.Length() < KAddSmartMsgCmdMinLength )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmartMsgCommand: Error: missing data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    TInt offset = 0;
-    TInt fromToLength = aData[offset];
-
-    offset = 1 + fromToLength;
-    if ( offset > aData.Length() - 1 )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmartMsgCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt descrLength = aData[offset];
-
-    offset = offset + 1 + descrLength;
-    if ( offset > aData.Length() - 2 ) // body length in two bytes
-        {
-        HTI_LOG_TEXT( "ValidateAddSmartMsgCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-    TInt bodyLength = aData[offset] + ( aData[offset+1] << 8 );
-
-    TInt wholeLength = 1 + fromToLength +
-                       1 + descrLength +
-                       2 + bodyLength +
-                       1 + // is new
-                       1 + // is unread
-                       1 + // folder
-                       4;  // biomessage uid
-
-    if ( wholeLength != aData.Length() )
-        {
-        HTI_LOG_TEXT( "ValidateAddSmartMsgCommand: Error: wrong length of data" );
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        return EFalse;
-        }
-
-    return ETrue;
-    }
-
-
-// ----------------------------------------------------------------------------
-// Extracts UTF-8 data, converts it to Unicode and returns as 16-bit descriptor.
-// Within aData, read descriptor from aPosition:
-//  - first bytes tell the size of data for UTF8 formatted data
-//  - next bytes are the data as indicated by the size
-//  - position is finally set to the end of UTF8 data area
-// ----------------------------------------------------------------------------
-HBufC16* CMessageMgmntHandler::ExtractDesLC( const TDesC8& aUtf8Data,
-                                             TInt& aPosition,
-                                             TInt aSizeBytes )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::ExtractDesLC" );
-    TInt length = 0;
-    for ( TInt i = 0; i < aSizeBytes; i++ )
-        {
-        length += ( aUtf8Data[aPosition+i] << ( i * 8 ) );
-        }
-
-    if ( length < 0 ||
-         length > aUtf8Data.Mid( aPosition ).Length() )
-        {
-        User::Leave( KErrBadDescriptor );
-        }
-
-    HBufC16* result = NULL;
-
-    if ( length > 0 )
-        {
-        result = CnvUtfConverter::ConvertToUnicodeFromUtf8L(
-            aUtf8Data.Mid( aPosition + aSizeBytes, length ) );
-        HTI_LOG_TEXT( "ExtractDesLC: Conversion to Unicode done" );
-        CleanupStack::PushL( result );
-        }
-
-    else
-        {
-        result = HBufC16::NewLC( 0 );
-        }
-
-    aPosition += ( aSizeBytes + length );
-
-    HTI_LOG_FUNC_OUT( "CMessageMgmntHandler::ExtractDesLC" );
-    return result;
-    }
-
-
-// ----------------------------------------------------------------------------
-// Extracts UTF-8 data to 8-bit descriptor without doing any conversions.
-// ----------------------------------------------------------------------------
-HBufC8* CMessageMgmntHandler::ExtractDes8LC( const TDesC8& aUtf8Data,
-                                             TInt& aPosition,
-                                             TInt aSizeBytes )
-    {
-    HTI_LOG_FUNC_IN( "CMessageMgmntHandler::ExtractDes8LC" );
-    TInt length = 0;
-    for ( TInt i = 0; i < aSizeBytes; i++ )
-        {
-        length += ( aUtf8Data[aPosition+i] << ( i * 8 ) );
-        }
-
-    if ( length < 0 ||
-         length > aUtf8Data.Mid( aPosition ).Length() )
-        {
-        User::Leave( KErrBadDescriptor );
-        }
-
-    HBufC8* result = HBufC8::NewLC( length );
-
-    if ( length > 0 )
-        {
-        result->Des().Copy( aUtf8Data.Mid( aPosition + aSizeBytes, length ) );
-        }
-
-    aPosition += ( aSizeBytes + length );
-
-    HTI_LOG_FUNC_OUT( "CMessageMgmntHandler::ExtractDes8LC" );
-    return result;
-    }
-
-
-// ----------------------------------------------------------------------------
-TMsvId CMessageMgmntHandler::MapFolderToIdL( TFolder aFolder )
-    {
-    TMsvId id = 0;
-
-    switch ( aFolder )
-        {
-        case EInbox:  { id = KMsvGlobalInBoxIndexEntryId;   break; }
-        case EDrafts: { id = KMsvDraftEntryId;              break; }
-        case ESent:   { id = KMsvSentEntryId;               break; }
-        case EOutbox: { id = KMsvGlobalOutBoxIndexEntryId;  break; }
-        default:      { User::Leave( KErrArgument );        break; }
-        }
-
-    return id;
-    }
-
-// ----------------------------------------------------------------------------
-TUid CMessageMgmntHandler::MapMessageTypeToUidL( TMessageType aType )
-    {
-    TUid uid = { 0 };
-
-    switch ( aType )
-        {
-        case ESMS:          { uid = KUidMsgTypeSMS;            break; }
-        case EAudioMessage: // fall through - audio msg is MMS sub type
-        case EMMS:          { uid = KUidMsgTypeMultimedia;     break; }
-        case ESmartMessage: { uid = KUidBIOMessageTypeMtm;     break; }
-        case EEmail:        { uid = KUidMsgTypeSMTP;           break; }
-        case EEmailPOP3:    { uid = KUidMsgTypePOP3;           break; }
-        case EEmailIMAP4:   { uid = KUidMsgTypeIMAP4;          break; }
-        case EIrMessage:    { uid = KUidMsgTypeIrUID;          break; }
-        case EBtMessage:    { uid = KUidMsgTypeBt;             break; }
-        default:            { User::Leave( KErrArgument );     break; }
-        }
-
-    return uid;
-    }
-
-// ----------------------------------------------------------------------------
-void CMessageMgmntHandler::HandleSessionEventL( TMsvSessionEvent /*aEvent*/,
-                                                TAny* /*aArg1*/,
-                                                TAny* /*aArg2*/,
-                                                TAny* /*aArg3*/ )
-    {
-    }
-
-
-
-// ----------------------------------------------------------------------------
-CWaiter* CWaiter::NewL( TInt aPriority )
-    {
-    CWaiter* self = new(ELeave) CWaiter( aPriority );
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-CWaiter* CWaiter::NewLC( TInt aPriority )
-    {
-    CWaiter* self = new(ELeave) CWaiter( aPriority );
-    CleanupStack::PushL( self );
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-CWaiter::CWaiter( TInt aPriority ) : CActive( aPriority )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-// ----------------------------------------------------------------------------
-CWaiter::~CWaiter()
-    {
-    Cancel();
-    }
-
-// ----------------------------------------------------------------------------
-void CWaiter::StartAndWait()
-    {
-    iStatus = KRequestPending;
-    SetActive();
-    iWait.Start();
-    }
-
-// ----------------------------------------------------------------------------
-TInt CWaiter::Result() const
-    {
-    return iResult;
-    }
-
-// ----------------------------------------------------------------------------
-void CWaiter::RunL()
-    {
-    iResult = iStatus.Int();
-    iWait.AsyncStop();
-    }
-
-// ----------------------------------------------------------------------------
-void CWaiter::DoCancel()
-    {
-    iResult = KErrCancel;
-    if ( iStatus == KRequestPending )
-        {
-        TRequestStatus* status = &iStatus;
-        User::RequestComplete( status, KErrCancel );
-        }
-
-    iWait.AsyncStop();
-    }
-
-
-// End of file