--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailserver/cmailhandlerplugin/src/fsmailiconhandler.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,223 @@
+/*
+* Copyright (c) 2007 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: Mail icon off/on handling. Uses parts from previous Bridge
+* implementation.
+*
+*/
+
+
+#include "emailtrace.h"
+#include <e32property.h>
+
+#include "fsmailiconhandler.h"
+#include "fsnotificationhandlertimer.h"
+
+// Define startup Max retry counter for trying to set icon property
+static const TInt KMaxIconRetry = 5;
+
+// Timeout value for retrying to set the icon property again
+static const TInt KIconRetryTimeout = 10*1000*1000;
+
+
+CFSMailIconHandler* CFSMailIconHandler::NewL(
+ MFSNotificationHandlerMgr& aOwner )
+ {
+ FUNC_LOG;
+ CFSMailIconHandler* self =
+ new (ELeave) CFSMailIconHandler( aOwner );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CFSMailIconHandler::CFSMailIconHandler(
+ MFSNotificationHandlerMgr& aOwner ) :
+ CFSNotificationHandlerBase( aOwner ),
+ iState( EStarting ),
+ iRetryCount( 0 )
+ {
+ FUNC_LOG;
+ }
+
+void CFSMailIconHandler::ConstructL()
+ {
+ FUNC_LOG;
+ CFSNotificationHandlerBase::ConstructL();
+
+ iTimer = CFSNotificationHandlerTimer::NewL( *this );
+
+ // Initialize
+ TimerCallBackL( KErrNone );
+ }
+
+CFSMailIconHandler::~CFSMailIconHandler()
+ {
+ FUNC_LOG;
+ SetObserving( EFalse );
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// At startup this function will try up to KMaxIconRetry times
+// to set the inital Icon property. If the property still fails to be set, we will
+// assume that the Icon is not supported by the hardware, and we won't continue.
+// ---------------------------------------------------------------------------
+//
+void CFSMailIconHandler::TimerCallBackL( TInt aError )
+ {
+ FUNC_LOG;
+ // Active object request complete handler
+ if ( aError == KErrNone )
+ {
+
+ switch ( iState )
+ {
+ case EStarting:
+ {
+ TInt ret( KErrNone );
+ ret = TestIcon();
+
+ if ( KErrNone != ret )
+ {
+ // Setting Icon Failed
+ iRetryCount++;
+ if ( iRetryCount > KMaxIconRetry )
+ {
+ // Give up, assume Email Icon is Not supported
+ // Message store will not be observed for changes
+ ERROR_1( ret, "CFSMailIconHandler startup failed %d", ret );
+ iState = EFailed;
+ }
+ else
+ {
+ // Start a timer to wait 10 seconds
+ iTimer->After( KIconRetryTimeout );
+ }
+
+ }
+ else
+ {
+ SetObserving( ETrue );
+ iState = EStarted;
+ }
+
+ break;
+ }
+ case EStarted:
+ {
+ // Unexpected Icon started state
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ // Error
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// HandleEvent is implemented also here because we need to check the
+// Home Screen status.
+// ---------------------------------------------------------------------------
+//
+void CFSMailIconHandler::HandleEventL(
+ TFSMailEvent aEvent,
+ TFSMailMsgId aMailbox,
+ TAny* aParam1,
+ TAny* aParam2,
+ TAny* aParam3 )
+ {
+ FUNC_LOG;
+ // Event is checked also in CFSNotificationHandlerBase::HandleEventL.
+ // Implementation could be improved so that there would be no need
+ // for doing it twice. Now it must be done here as we don't want
+ // to check HS if this would not be a new mail. Also
+ // CFSNotificationHandlerBase::HandleEventL needs the check the event
+ // because CFSNotificationHandlerBase::HandleEventL is used in some
+ // cases alone. (without the kind of prechecking that this function
+ // does)
+ if ( aEvent == TFSEventNewMail )
+ {
+ CFSNotificationHandlerBase::HandleEventL( aEvent,
+ aMailbox,
+ aParam1,
+ aParam2,
+ aParam3 );
+ }
+ }
+
+TInt CFSMailIconHandler::SetProperty( TUid aCategory, TUint aKey, TInt aValue )
+ {
+ FUNC_LOG;
+ RProperty property;
+ TInt ret = property.Attach( aCategory, aKey );
+
+ if ( KErrNone == ret )
+ {
+ ret = property.Set( aValue );
+ }
+ ERROR_2( ret, "Error %d in setting property %d", ret, aKey )
+
+ property.Close();
+
+ return ret;
+ }
+
+TInt CFSMailIconHandler::TestIcon()
+ {
+ FUNC_LOG;
+ RProperty property;
+ TInt ret = property.Attach( KPSUidCoreApplicationUIs,
+ KCoreAppUIsNewEmailStatus );
+
+ // Intention here is just to test the icon by first readin it and then
+ // writing the same value back. Notice that it might be possible that
+ // something has turned the icon off in between the reading and writing.
+ // If thisproves to be a problem then change this.
+ if ( KErrNone == ret )
+ {
+ TInt currentValue( 0 );
+ ret = property.Get( currentValue );
+
+
+ if ( KErrNone == ret )
+ {
+ ret = property.Set( currentValue );
+ }
+ }
+ property.Close();
+ return ret;
+ }
+
+void CFSMailIconHandler::TurnNotificationOn()
+ {
+ FUNC_LOG;
+ SetProperty( KPSUidCoreApplicationUIs,
+ KCoreAppUIsNewEmailStatus, ECoreAppUIsNewEmail );
+ }
+
+void CFSMailIconHandler::TurnNotificationOff()
+ {
+ FUNC_LOG;
+ SetProperty( KPSUidCoreApplicationUIs,
+ KCoreAppUIsNewEmailStatus, ECoreAppUIsNoNewEmail );
+ }
+