--- /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