simpleengine/engine/src/simpleengineimhandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:35:50 +0300
branchRCL_3
changeset 34 2669f8761a99
parent 0 c8caa15ef882
child 35 fbd2e7cec7ef
permissions -rw-r--r--
Revision: 201027 Kit: 201035

/*
* 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:  SIMPLE ENGINE IM Handler
*
*/


#include "simpleengineimhandler.h"
#include "simpleenginerequest.h"
#include "simpleinstantmsgobserver.h"
#include "simplesipconnection.h"
#ifdef _DEBUG
#include "simpledebugutils.h"
#endif


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


// ---------------------------------------------------------------------------
// CSimpleEngineImHandler::CSimpleEngineImHandler
// ---------------------------------------------------------------------------
//
CSimpleEngineImHandler::CSimpleEngineImHandler( MSimpleConnection& aConn,
    MSimpleInstantMsgObserver& aObserver ) : CSimpleClient( aConn ),
    iObserver( aObserver )
    {
    
    }

// ---------------------------------------------------------------------------
// CSimpleEngineImHandler::ConstructL
// ---------------------------------------------------------------------------
//
void CSimpleEngineImHandler::ConstructL()
    {
    BaseConstructL();
    
    // Enable instant message receiving
    ReceiveInstantMessageL();
    }

// ---------------------------------------------------------------------------
// CSimpleEngineImHandler::NewL
// ---------------------------------------------------------------------------
//
CSimpleEngineImHandler* CSimpleEngineImHandler::NewL(
    MSimpleConnection& aConn,
    MSimpleInstantMsgObserver& aObserver )
    {
    CSimpleEngineImHandler* self = new (ELeave) CSimpleEngineImHandler(
        aConn, aObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
#ifdef _DEBUG
    TSimpleLogger::Log( _L("CSimpleEngineImHandler::NewL this=%d"),
        (TInt)self );
#endif
    return self;
    }

// ---------------------------------------------------------------------------
// CSimpleEngineImHandler::~CSimpleEngineImHandler
// ---------------------------------------------------------------------------
//
CSimpleEngineImHandler::~CSimpleEngineImHandler()
    {
#ifdef _DEBUG
    TSimpleLogger::Log(
        _L("CSimpleEngineImHandler::~CSimpleEngineImHandler this=%d"),
        (TInt)this );
#endif
    }

// ---------------------------------------------------------------------------
// From class MSimpleInstantMessage
// Send instant message
// ---------------------------------------------------------------------------
//
TInt CSimpleEngineImHandler::SendInstantMessage( TPtrC8 aMsgContent,
    TPtrC8 aRecipient )
    {
#ifdef _DEBUG
    TSimpleLogger::Log( _L("CSimpleEngineImHandler::SendInstantMessage") );
#endif
    
    IncreaseOpId();
    TRAPD( error, DoSendInstantMessageRequestL( aMsgContent, aRecipient ) )
    
    if ( error )
        {
        return error;
        }
    
    return iOpId;
    }

// ----------------------------------------------------------
// From class MSimpleInstantMessage
// CSimpleEngineImHandler::Close
// ----------------------------------------------------------
//
void CSimpleEngineImHandler::Close()
    {
    delete this;
    }

// ---------------------------------------------------------------------------
// From class CSimpleClient
// Complete the open client request
// ---------------------------------------------------------------------------
//
void CSimpleEngineImHandler::Complete( TInt aOpId, TInt aStatus,
    MSimpleEngineRequest& aReq )
    {
#ifdef _DEBUG
    TSimpleLogger::Log(
        _L( "CSimpleEngineImHandler::Complete opid=%d, status=%d - Start"),
            aOpId, aStatus );
#endif
    
    if( MSimpleEngineRequest::EReceiveIM == aReq.RequestType() )
        {
        if( !aStatus )
            {
            iObserver.HandleReceiveTextMessage( aReq.Recipient(),
                aReq.ResponseData() );
            }
        // Open receive request was already deleted from SIP Utils side
        // Activate receiving again
        TRAP_IGNORE( ReceiveInstantMessageL() )
        }
    else if( MSimpleEngineRequest::ESendIM == aReq.RequestType() )
        {
        iObserver.SendInstantMsgReqComplete( aOpId, aStatus );
        
        // Delete the request as not needed anymore
        
        iRequest = MSimpleEngineRequest::ENone;
        // Delete corresponding request from another DLL too.
        aReq.ModifyType( MSimpleEngineRequest::EDestroy );
        TRAP_IGNORE( SendReqL( aReq ) );
        // delete request from this DLL.
        aReq.Destroy();
        }
    else
        {
        // Unknown request
        #ifdef _DEBUG
            TSimpleLogger::Log(
                _L( "CSimpleEngineImHandler::Complete - Unknown request") );
        #endif
        }
    
#ifdef _DEBUG
    TSimpleLogger::Log( _L( "CSimpleEngineImHandler::Complete - End") );
#endif
    }

// ---------------------------------------------------------------------------
// Do Send Instant Message request
// ---------------------------------------------------------------------------
//
void CSimpleEngineImHandler::DoSendInstantMessageRequestL( TPtrC8 aMsgContent,
    TPtrC8 aRecipient )
    {
#ifdef _DEBUG
    TSimpleLogger::Log(
        _L( "CSimpleEngineImHandler::DoSendInstantMessageRequestL - Start") );
#endif
    CSimpleEngineRequest* req = CSimpleEngineRequest::NewL( *this,
        MSimpleEngineRequest::ESendIM, iOpId );
    CleanupStack::PushL( req );
    
    req->SetRefresh( ETrue );
    req->SetRequestData( aMsgContent );
    req->SetRecipientL( aRecipient );
    
    // send a request to engine DLL
    SendReqL( *req );
    iRequestList.AddLast( *req );
    CleanupStack::Pop( req );
    iRequest = MSimpleEngineRequest::ESendIM;
    iSipStatus = KErrNone;
#ifdef _DEBUG
    TSimpleLogger::Log(
        _L( "CSimpleEngineImHandler::DoSendInstantMessageRequestL - End") );
#endif
    }

// ---------------------------------------------------------------------------
// Receive instant message
// ---------------------------------------------------------------------------
//
void CSimpleEngineImHandler::ReceiveInstantMessageL()   
    {
#ifdef _DEBUG
    TSimpleLogger::Log(
        _L( "CSimpleEngineImHandler::ReceiveInstantMessageL - Start") );
#endif
    IncreaseOpId();
    
    CSimpleEngineRequest* req = CSimpleEngineRequest::NewL( *this,
        MSimpleEngineRequest::EReceiveIM, iOpId );
    CleanupStack::PushL( req );
    
    req->SetRefresh( ETrue );
    // Send a request to engine DLL
    SendReqL( *req );
    iRequestList.AddLast( *req );
    CleanupStack::Pop( req );
    iRequest = MSimpleEngineRequest::EReceiveIM;
    iSipStatus = KErrNone;
#ifdef _DEBUG
    TSimpleLogger::Log(
        _L( "CSimpleEngineImHandler::ReceiveInstantMessageL - End") );
#endif 
    }