emailuis/emailui/src/FSDelayedLoader.cpp
changeset 0 8466d47a6819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FSDelayedLoader.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,180 @@
+/*
+* 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:  Helper to do delayed processing after application startup
+*
+*/
+
+
+#include "emailtrace.h"
+#include <eikenv.h>
+#include"FSDelayedLoader.h"
+#include"FreestyleEmailUiConstants.h"
+#include "FreestyleEmailUiContactHandler.h"
+
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::InstanceL
+// 
+// -----------------------------------------------------------------------------
+//
+CFsDelayedLoader* CFsDelayedLoader::InstanceL()
+	{
+    FUNC_LOG;
+	CFsDelayedLoader* instance = static_cast<CFsDelayedLoader*>( CCoeEnv::Static( KDelayedLoaderUid ) );
+	if ( !instance )
+		{
+	    instance = new ( ELeave ) CFsDelayedLoader;
+	    CleanupStack::PushL( instance );
+	    instance->ConstructL();
+	    CleanupStack::Pop();
+	  	}
+    return instance;
+	}
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::ConstructL
+// 
+// -----------------------------------------------------------------------------
+//
+void CFsDelayedLoader::ConstructL()
+	{
+    FUNC_LOG;
+	iIdle = CIdle::NewL( CActive::EPriorityIdle );
+	iIdleCallback = new (ELeave) TCallBack( IdleCallbackFunction, this );
+	}
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::~CFsDelayedLoader
+// 
+// -----------------------------------------------------------------------------
+//
+CFsDelayedLoader::~CFsDelayedLoader()
+	{
+    FUNC_LOG;
+	iLoaders.Reset();
+
+	delete iContactHandler;
+
+	delete iIdleCallback;
+	if ( iIdle )
+	    {
+    	iIdle->Cancel();
+    	delete iIdle;
+	    }
+	}
+	
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::CFsDelayedLoader
+// 
+// -----------------------------------------------------------------------------
+//
+CFsDelayedLoader::CFsDelayedLoader(): CCoeStatic( KDelayedLoaderUid )
+	{
+    FUNC_LOG;
+	}
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::Start
+// 
+// -----------------------------------------------------------------------------
+//
+void CFsDelayedLoader::Start()
+	{
+    FUNC_LOG;
+	iLoaderIndex = 0;
+	iIdle->Start( *iIdleCallback );
+	}
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::GetPbkContactEngineL
+// 
+// -----------------------------------------------------------------------------
+//
+CFSEmailUiContactHandler* CFsDelayedLoader::GetContactHandlerL()
+	{
+    FUNC_LOG;
+	
+	if ( !iContactHandler )
+		{
+		iContactHandler = CFSEmailUiContactHandler::NewL( CEikonEnv::Static()->FsSession() );
+		}
+	
+	return iContactHandler;
+	}
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::IdleCallbackFunction
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CFsDelayedLoader::IdleCallbackFunction( TAny* aParam )
+	{
+    FUNC_LOG;
+	// load own items
+	CFsDelayedLoader* self = static_cast< CFsDelayedLoader* >( aParam );
+	TRAPD( error, self->GetContactHandlerL() );
+	if ( KErrNone != error )
+	    {
+	    //Panic!
+	    }
+	
+	// if there are no loaders we can stop the callback
+	if ( self->iLoaders.Count() <= 0 )
+		{
+		return 0;
+		}
+	
+	// handle loaders
+	TInt r = self->iLoaders[self->iLoaderIndex]->DelayLoadCallback();
+
+	if ( r	== 0 )
+		{
+		self->iLoaderIndex++;
+		if ( self->iLoaderIndex >= self->iLoaders.Count() )
+			{
+			return 0;
+			}
+		}
+		
+	return 1;
+	}
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::AppendLoader
+// 
+// -----------------------------------------------------------------------------
+//
+void CFsDelayedLoader::AppendLoader( MFsDelayedLoadingInterface& aLoader )
+	{
+    FUNC_LOG;
+	iLoaders.Append( &aLoader );
+	}
+
+// -----------------------------------------------------------------------------
+// CFsDelayedLoader::RemoveLoader
+// 
+// -----------------------------------------------------------------------------
+//
+void CFsDelayedLoader::RemoveLoader( MFsDelayedLoadingInterface& aLoader )
+	{
+    FUNC_LOG;
+	for ( TInt i=0; i<iLoaders.Count(); i++ )
+	    {
+	    if ( iLoaders[i] == &aLoader )
+	        {
+	        iLoaders.Remove( i );
+	        return;
+	        }
+	    }
+	}
+