coreapplicationuis/accfwuinotifier/src/AccFwUiNoteNotifier.cpp
changeset 0 2e3d3ce01487
child 9 332e7bf3b42f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/coreapplicationuis/accfwuinotifier/src/AccFwUiNoteNotifier.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,499 @@
+/*
+* Copyright (c) 2002-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:  Implementation of information note about connected accessory
+*
+*/
+
+
+// INCLUDE FILES
+#include <featmgr.h>
+#include <accfwnoteuinotifier.rsg>
+#include <data_caging_path_literals.hrh> 
+#include <aknnotewrappers.h>
+#include <SecondaryDisplay/SecondaryDisplayAccFwAPI.h>
+#include <bautils.h>
+
+#include "AccFwUiNoteNotifier.h"
+#include "acc_debug.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TUid KScreenOutputChannel = { 0x10282E0A };
+
+_LIT( KAccFwUiNotifierResource, "accfwnoteuinotifier.rsc" );
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::CAccFwUiNoteNotifier
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccFwUiNoteNotifier::CAccFwUiNoteNotifier()
+	: CActive( EPriorityStandard)
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::CAccFwUiNoteNotifier()" );
+
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::CAccFwUiNoteNotifier() - return void" );
+    }
+
+// Destructor
+CAccFwUiNoteNotifier::~CAccFwUiNoteNotifier()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::~CAccFwUiNoteNotifier()" );
+
+    delete iNote;
+    delete iNoteText;
+    CActive::Cancel();
+    
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccPolAccessoryPolicy::~CAccFwUiNoteNotifier() - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::ConstructL() 
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAccFwUiNoteNotifier::ConstructL()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::ConstructL()" );
+
+    //get pointer to CEikonEnv
+	iCoeEnv = CEikonEnv::Static();    
+
+    if ( !iCoeEnv )
+        {
+        User::Leave( KErrGeneral );        
+        }
+
+	//Open resource file
+    TFileName fileName;
+    fileName.Zero();
+
+    TFileName drivePath;
+    Dll::FileName( drivePath );
+
+    fileName.Append( TParsePtrC( drivePath ).Drive() );
+    fileName.Append( KDC_RESOURCE_FILES_DIR );
+    fileName.Append( KAccFwUiNotifierResource );
+
+    BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName );
+
+	//handle to resource file
+    iResourceFileOffset = iCoeEnv->AddResourceFileL( fileName );
+
+    //add to scheduler
+    CActiveScheduler::Add( this );
+    
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::ConstructL() - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::NewL() 
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAccFwUiNoteNotifier* CAccFwUiNoteNotifier::NewL()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::NewL()" );
+
+    CAccFwUiNoteNotifier* self = new ( ELeave ) CAccFwUiNoteNotifier;
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::CAccFwUiNoteNotifier::NewL() - return" );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::Release()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccFwUiNoteNotifier::Release()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Release() - enter" );
+
+    if ( iResourceFileOffset )
+        {
+        iCoeEnv->DeleteResourceFile( iResourceFileOffset );
+        }
+
+    iCoeEnv = NULL; // This is not owned, pointer needs to be zeroed
+
+    delete this;
+
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Release() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::RegisterL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CAccFwUiNoteNotifier::TNotifierInfo CAccFwUiNoteNotifier::RegisterL()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RegisterL() - enter" );
+    iInfo.iUid = KAccFwUiNoteNotifierUid;
+    iInfo.iChannel = KScreenOutputChannel;
+    iInfo.iPriority = ENotifierPriorityHigh;
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RegisterL() - return" );
+    return iInfo;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::Info()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CAccFwUiNoteNotifier::TNotifierInfo CAccFwUiNoteNotifier::Info() const
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Info() - enter" );
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Info() - return" );
+    return iInfo;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::StartL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CAccFwUiNoteNotifier::StartL( const TDesC8& /*aBuffer*/ )
+    {
+	API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - enter" );
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - return" );
+    return KNullDesC8();
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::StartL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccFwUiNoteNotifier::StartL(
+    const TDesC8& aBuffer, 
+    TInt /*aReplySlot*/,
+    const RMessagePtr2& aMessage)
+    {    
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - enter" );
+
+    // Heap buffer for default text
+    HBufC* defaultText = NULL;
+    TBool showNote = EFalse;
+
+    if ( aBuffer.Length() )
+        {
+		API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Default accessory selection or headphones information" );
+
+    	TInt value( 0 );
+    	TPckg<TInt> pckg( value );
+    	pckg.Copy( aBuffer );
+
+   		//get "default enhancement" string resource
+		API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Read default enhancement string" );
+        defaultText = iCoeEnv->AllocReadResourceLC( R_TEXT_DEFAULT_ENHANC );
+
+  		TPtrC enhancement;
+  		TBool enhancementOk( ETrue );
+
+  		if ( value != 0 )
+  		    {
+			API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Default selection" );
+
+  			enhancementOk = EFalse;
+            HBufC8* literals = iCoeEnv->AllocReadResourceAsDes8L( R_SELECTION_DIALOG_LITERALS );
+            TResourceReader reader;
+        	reader.SetBuffer( literals );
+
+			TInt count( reader.ReadInt16() );
+			API_TRACE_1( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Read literals, count %d", count );
+
+			// Find correct accessory literal
+			for ( TInt i = 0; i < count; i++ )
+			    {
+				//read from resource
+				TUint32 index( reader.ReadUint32() );
+				API_TRACE_1( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Read literal, index %d", index );
+
+				if ( index == value )
+				    {
+					API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Literal found!" );
+					// Literal found
+					enhancement.Set( reader.ReadTPtrC() );
+					enhancementOk = ETrue;
+					break;
+				    }
+				else
+				    {
+					API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Not found!" );
+					reader.ReadTPtrC();
+				    }
+			    }
+			    
+			delete literals;
+  		    }
+
+		if ( enhancementOk )
+		    {
+			API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Enhancement OK!" );
+			HBufC* noteStr = NULL;
+
+			// Headphones...
+			if ( value == 0x08 || value == 0x40 || value == 0 )
+			    {
+				API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Show headphones information!" );
+
+				// Default enhancement string if needed
+				if ( value != 0 )
+				    {
+					API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Show also default information!" );
+				 	noteStr = HBufC::NewL( defaultText->Length() + enhancement.Length() + 3 );
+
+				 	TPtr ptr( noteStr->Des() );	
+					ptr.Append( defaultText->Des() );
+					ptr.Append( ' ' );
+					ptr.Append( enhancement );
+					API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Default string ready!" );
+				    }
+
+				API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Read use phone mic string!" );
+                // Read resource use phone mic and default enhancement text...
+		   	    HBufC* usePhoneMicTextHolder = iCoeEnv->AllocReadResourceLC( R_TEXT_HEADPHONES_MIC );
+				
+				TBool chekcNoteStr( EFalse );
+				if ( noteStr )
+				    {
+					API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Add phone mic string to default accessory string!" );
+					CleanupStack::PushL( noteStr );
+					HBufC* temp = noteStr->ReAllocL( noteStr->Length() + 2 + usePhoneMicTextHolder->Length() + 1 );
+					CleanupStack::Pop( noteStr );
+					noteStr = temp;
+					chekcNoteStr = ETrue;
+					}
+				else
+				    {
+					API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Only use phone mic string!" );
+					noteStr = HBufC::NewL( usePhoneMicTextHolder->Length() + 1 );
+				    }
+
+			 	TPtr ptr( noteStr->Des() );	
+				
+				
+				if( chekcNoteStr )
+					{
+					ptr.Append( _L( ". " ) );
+					ptr.Append( usePhoneMicTextHolder->Des() );
+					}
+                else
+                	{
+                	ptr.Append( usePhoneMicTextHolder->Des() );
+                	}
+                // Cleanup
+                CleanupStack::PopAndDestroy( usePhoneMicTextHolder );
+
+				API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - String ready!" );
+			    }
+			else
+			    {
+				API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Create default accessory text!" );
+				//only default accessory text
+				noteStr = HBufC::NewL( defaultText->Length() + enhancement.Length() + 1 );
+            	TPtr ptr( noteStr->Des() );
+			
+				ptr.Append( defaultText->Des() );
+				ptr.Append( ' ' );
+				ptr.Append( enhancement );
+				API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Default accessory text ready!" );
+			    }
+
+            // Pass string to member string and free local copies
+            CleanupStack::PopAndDestroy( defaultText );
+            CleanupStack::PushL( noteStr );
+            iNoteText = HBufC::NewL( noteStr->Length() );
+            TPtr ptr( iNoteText->Des() );
+            ptr.Append( noteStr->Des() );
+            CleanupStack::PopAndDestroy( noteStr );
+            showNote = ETrue;
+		    }
+		else
+		    {
+			API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - No note" );
+            // No need to check this one, always set into cleanup stack
+            CleanupStack::PopAndDestroy( defaultText );
+            }
+        }
+    else
+        {
+        // Read resource string and adds heap buffer into cleanup stack.
+        // This needs to be before creating 'note' for correct cleanup handling
+        defaultText = iCoeEnv->AllocReadResourceLC( R_TEXT_UNSUPP_ACCESSORY_CONNECTED );
+        iNoteText = HBufC::NewL( defaultText->Length() );
+        TPtr ptr( iNoteText->Des() );
+        ptr.Append( defaultText->Des() );
+        CleanupStack::PopAndDestroy( defaultText );
+        showNote = ETrue;
+        }
+
+    iMessage = aMessage;
+    if( showNote )
+        {
+        if ( FeatureManager::FeatureSupported( KFeatureIdCoverDisplay ) )
+            {
+    		API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - Cover UI supported" );
+            iPublishNote = ETrue;
+            }
+
+    	iIsCancelled = EFalse;
+        SetActive();
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, KErrNone ); // RunL() function will get called
+        }
+    else
+        {
+        iMessage.Complete( KErrNone ); // Just complete the message
+        }
+                
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::RunL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+
+void CAccFwUiNoteNotifier::RunL()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RunL() - enter" );
+
+	if ( iIsCancelled )
+	    {
+		return;	
+	    }
+    
+    // Create note
+    iNote = new ( ELeave ) CAknNoteDialog(
+        CAknNoteDialog::ENoTone,
+        CAknNoteDialog::ELongTimeout );
+
+    iNote->PrepareLC( R_ACCFWUINOTIFIER_INFORMATION_NOTE ); // Adds to CleanupStack
+
+    if ( iPublishNote )
+        {
+        iNote->PublishDialogL( ECmdShowAccessoryNotSupportedNote, KCatAccFw );
+        iPublishNote = EFalse;
+        }
+
+    iNote->SetTextL( *iNoteText );
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::StartL() - iNote->RunLD()!" );
+    iNote->RunLD();
+    iNote = NULL;
+    delete iNoteText;
+    iNoteText = NULL;
+
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RunL() - Complete message" );
+	iMessage.Complete( KErrNone );
+
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RunL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::RunError()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+TInt CAccFwUiNoteNotifier::RunError(TInt aError)
+    {
+    API_TRACE_1( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RunError() - %d", aError );
+    if( !iMessage.IsNull() )
+        {
+        iMessage.Complete( aError );
+        }
+    aError = KErrNone;
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::RunError() - return" );
+    return aError;
+    }
+    
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::DoCancel()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAccFwUiNoteNotifier::DoCancel()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::DoCancel() - enter" );
+    if( !iMessage.IsNull() )
+        {
+        iMessage.Complete( KErrCancel );
+        }
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::DoCancel() - return" );
+    }
+    
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::Cancel()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccFwUiNoteNotifier::Cancel()
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Cancel() - enter" );
+
+    iIsCancelled = ETrue;
+    
+    if ( iNote )
+        {
+	   // Cancel active object, delete dialog and free resources
+        if ( IsActive() )
+            {
+            CActive::Cancel();    
+            }
+	    delete iNote;
+	    iNote = NULL;
+        delete iNoteText;
+        iNoteText = NULL;
+
+        API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Cancel() - Complete message with Cancel" );
+        iMessage.Complete( KErrCancel );
+        }
+
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::Cancel() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccFwUiNoteNotifier::UpdateL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CAccFwUiNoteNotifier::UpdateL( const TDesC8& /*aBuffer*/ )
+    {
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::UpdateL() - enter" );
+    API_TRACE_( "[AccFW: ACCFWUINOTIFIER] CAccFwUiNoteNotifier::UpdateL() - return" );
+    return KNullDesC8();
+    }
+
+//  End of File