satui/satplugin/aisatpluginsrc/caisatengine.cpp
branchRCL_3
changeset 20 987c9837762f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satui/satplugin/aisatpluginsrc/caisatengine.cpp	Wed Sep 01 12:15:03 2010 +0100
@@ -0,0 +1,310 @@
+/*
+* 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