satui/satplugin/aisatpluginsrc/caisatengine.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-2010 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:  The engine class of operator info plugin. Handles the
*                communication with Publish&Subscribe data.
*
*/


// INCLUDE FILES
#include    <AknIconArray.h>                // For itemsicon
#include    <gulicon.h>                     // For itemsicon
#include    <aknlayout.cdl.h>               // For TAknWindowLineLayout
#include    <aknlayoutscalable_avkon.cdl.h> // For scalable layouts
#include    <AknUtils.h>
#include    <AknIconUtils.h>

#include    "caisatengine.h"
#include    "caisatnotifier.h"
#include    "mpluginapi.h"
#include    "tflogger.h" 

// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
// Default constructor
// -----------------------------------------------------------------------------
//
CAiSatEngine::CAiSatEngine( MPluginAPI& aPlugin ) :
    iPlugin ( aPlugin ),
    iIcon( NULL ),
    iPreviousIconId( 0 )
    {
    }
    
// -----------------------------------------------------------------------------
// Two-phased constructor.
// Create instance of concrete ECOM interface implementation
// -----------------------------------------------------------------------------
CAiSatEngine* CAiSatEngine::NewL( MPluginAPI& aPlugin )
    {
    TFLOGSTRING( "CAiSatEngine::NewL called" )
    
    CAiSatEngine* self = new( ELeave )CAiSatEngine( aPlugin );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    TFLOGSTRING( "CAiSatEngine::NewL exits" )
    return self;
    }
    
// -----------------------------------------------------------------------------
// Destructor.
// Closes the connection to the P&S and deletes
// all the dynamic content.
// -----------------------------------------------------------------------------
//
CAiSatEngine::~CAiSatEngine()
    {
    TFLOGSTRING( "CAiSatEngine::~CAiSatEngine called" )

    delete iNotifier;
    
    // Delete icon and null the pointer.
    delete iIcon;
    iIcon = NULL;
           
    iSatService.Close();
    iSatSession.Close();
    
    TFLOGSTRING( "CAiSatEngine::~CAiSatEngine exits" )  
    }
    
// -----------------------------------------------------------------------------
// Offers information about the content
// Returns ETrue if there is content available, 
// EFalse if not.
// -----------------------------------------------------------------------------
//
TBool CAiSatEngine::HasContent()
    {
    TFLOGSTRING( "CAiSatEngine::HasContent called - exits" )
    return iNotifier->HasContent();
    }

// -----------------------------------------------------------------------------
// Retrieves the operator info text from RSatService
// -----------------------------------------------------------------------------
//
void CAiSatEngine::ContentText( TPtrC& aString )
    {
    TFLOGSTRING( "CAiSatEngine::ContentText called" )

    iNotifier->GetIdleTextString( aString );
    
    TFLOGSTRING( "CAiSatEngine::ContentText exits" )
    }
    
// -----------------------------------------------------------------------------
// Offers the Idle Mode icon
// -----------------------------------------------------------------------------
//
void CAiSatEngine::ContentIconL( CGulIcon*& aGulIcon )
    {
    TFLOGSTRING( "CAiSatEngine::ContentIconL called" )
            
    // Active Idle framework will release the bitmap we would
    // publish. So a new bitmap should be created to avoid
    // destroying the bitmap owned by UAA.
    if ( iIcon )
        {
        TFLOGSTRING( "CAiSatEngine::ContentIconL iIcon != NULL" )
        // The bitmap for publishing.
        CFbsBitmap* bitmapToPublish( NULL );    
                  
        bitmapToPublish = new (ELeave) CFbsBitmap;
        CleanupStack::PushL( bitmapToPublish );

        TSize size = iIcon->SizeInPixels();
        TInt error = bitmapToPublish->Create( size, iIcon->DisplayMode() ); 
        TFLOGSTRING2( "CFbsBitmap::Create returns %d", error )
        // Duplicate the bitmap owned by UAA into the new bitmap.
        if ( !error )
            {
            error = bitmapToPublish->Duplicate( iIcon->Handle() );
            TFLOGSTRING2( "CFbsBitmap::Duplicate returns %d", error )
            if ( !error )
                {
                // Create a icon from the bitmap and publish it.
                aGulIcon = CGulIcon::NewL( bitmapToPublish );
                CleanupStack::Pop( bitmapToPublish );        
                TFLOGSTRING( "CAiSatEngine::ContentIconL create GulIcon" )
                }
            } 
        if ( error )  
            {
            CleanupStack::PopAndDestroy( bitmapToPublish );
            aGulIcon = NULL;
            }        
        }   
    TFLOGSTRING( "CAiSatEngine::ContentIconL exits" )
    }

//------------------------------------------------------------------------------
// Loads icon provided by SIM from RSatIcon
//------------------------------------------------------------------------------
CFbsBitmap* CAiSatEngine::LoadIconL( TUint8 aIconId, 
    RSatService::TSatIconQualifier aIconQualifier  )
    {
    TFLOGSTRING( "CAiSatEngine::LoadIconL called" )
    CFbsBitmap* simIconBuffer( NULL ); 
    
    // If icon allready has been got from SIM (via satIcon and SATServer)
    // Because mechanism for fetching icon is very slow, it has been 
    // stored in class variable to make reasonable speed for 
    // Active Idle refreshing.
    if ( RSatService::ESatIconSelfExplanatory == aIconQualifier ||
         RSatService::ESatIconNotSelfExplanatory == aIconQualifier )
        {
        TFLOGSTRING( "CAiSatEngine::LoadIconL having icon" )
        RIconEf iconEf;
        CleanupClosePushL( iconEf );
    
        // Get icon info
        iSatService.GetIconInfoL( aIconId, iconEf );
        // Get the an available icon from info array.
        TInt infoCount( iconEf.Count() );
        TInt error( KErrNotFound );
        for ( TInt i = 0; i < infoCount && KErrNone != error; i++ )
            {
            TRAP( error, simIconBuffer = iSatService.GetIconL( iconEf[i] ) );
            }
            
        // Check whether the for loop ends without icon gotton.
        if ( error != KErrNone )
            {
            TFLOGSTRING2( "CAiSatEngine::LoadIconL: error=%d",error )
            simIconBuffer = NULL;
            }
            
        CleanupStack::PopAndDestroy( &iconEf );
        } 
    TFLOGSTRING( "CAiSatEngine::LoadIconL exit" )
    return simIconBuffer;
    }
    
// ---------------------------------------------------------------------------
// Formulates response to SatIcon API
// ---------------------------------------------------------------------------
//
void CAiSatEngine::HandleNotifyL()
    {
    TFLOGSTRING( "CAiSatEngine::HandleNotifyL called" )
    TUint8 id( iNotifier->IdleIconId() );
    RSatService::TSatIconQualifier iconQualifier( 
        iNotifier->IdleIconQualifier() );

    if ( !HasContent() && RSatService::ESatIconNoIcon == iconQualifier )
        {
        // Removal of text = No text and no icon
        TFLOGSTRING( "CAiSatNotifier::HasContent ETrue remove text success" )
        SendSatResponseL( RSatService::ESATIdleSuccess );
        }
    else
        {
        TFLOGSTRING2( "CAiSatEngine::HandleNotifyL Icon: %d", iconQualifier )
        if ( RSatService::ESatIconNoIcon == iconQualifier)
            {
            TFLOGSTRING( "CAiSatEngine::HandleNotifyL ESatIconNoIcon" )
            SendSatResponseL( RSatService::ESATIdleSuccess );
            }        
        else if ( RSatService::ESatIconSelfExplanatory == iconQualifier ||
                  RSatService::ESatIconNotSelfExplanatory == iconQualifier )
            {
            SendSatResponseL( RSatService::ESATIdleSuccess );
            TFLOGSTRING( "CAiSatEngine::HandleNotify icon & success resp" )
            }
        else if ( RSatService::ESatIconNotSelfExplanatory != iconQualifier &&
                  RSatService::ESatIconNoIcon != iconQualifier )
            {
            SendSatResponseL( RSatService::ESATIdleSuccessRequestedIconNotDisplayed );
            TFLOGSTRING( "CAiSatEngine: KSATIdleSuccessRequestedIconNotDisplayed" )
            }
        else
            {
            TFLOGSTRING( "CAiSatEngine::HandleNotifyL others" )
            // Report error
            SendSatResponseL( RSatService::ESATIdleMeUnableToProcessCmd );
            }            
        }

    TFLOGSTRING( "CAiSatEngine::HandleNotify exit" )
    }
       
// ---------------------------------------------------------------------------
// Get Idle mode data first, and load icon for publishing
// ---------------------------------------------------------------------------
//       
void CAiSatEngine::PrepareIdleModeDataL( TBool& aDupIcon, TBool& aDupText )
    {
    TFLOGSTRING( "CAiSatEngine::PrepareGetIdleModeDataL called" )
    
    // Get icon Id, icon qualifier and text.
    iNotifier->GetIdleModeDataL( aDupIcon, aDupText );
    
    // Load icon, and check whether it is the same with previous one.
    // if not, Load icon, otherwise, do nothing.
    TUint8 id ( iNotifier->IdleIconId() );   
    RSatService::TSatIconQualifier iconQualifier( 
        iNotifier->IdleIconQualifier() );
        
    if ( !( RSatService::ESatIconNoIcon == iconQualifier ) ||
         !( id == iPreviousIconId && iIcon ) ) 
        {
        TFLOGSTRING( "CAiSatEngine::PrepareIdleModeDataL load icon" )
        delete iIcon;
        iIcon = NULL;
        
        // The bitmap is fetched from UAA.
        iIcon = LoadIconL( id, iconQualifier ); 
        iPreviousIconId = id;  
        }
    TFLOGSTRING( "CAiSatEngine::PrepareGetIdleModeDataL exits" )
    }
    
// ---------------------------------------------------------------------------
// Symbian 2nd phase constructor can leave
// ---------------------------------------------------------------------------
//
void CAiSatEngine::ConstructL()
    {
    TFLOGSTRING( "CAiSatEngine::ConstructL called" )
    
    iSatSession.ConnectL();    
    TFLOGSTRING( "CAiSatEngine::ConstructL connect sat session" )
    
    iSatService.OpenL( iSatSession );
    TFLOGSTRING( "CAiSatEngine::ConstructL open sat service" )    
    
    iNotifier = CAiSatNotifier::NewL( iPlugin, iSatService );   
    User::LeaveIfError( iNotifier->Start() );
    
    TFLOGSTRING( "CAiSatEngine::ConstructL exits" )
    }
    
// ---------------------------------------------------------------------------
// Sends SAT response to RSatIcon
// ---------------------------------------------------------------------------
//
void CAiSatEngine::SendSatResponseL(
    const RSatService::TSATIdleResult& aResponse ) const
    {
    TFLOGSTRING( "CAiSatEngine::SendSatResponseL called")

    iSatService.SetIdleModeTextResponse( aResponse );

    TFLOGSTRING( "CAiSatEngine::SendSatResponseL exits" )
    }
      
// End Of File