EngSrc/IEThreadEngine.cpp
changeset 3 93fff7023be8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EngSrc/IEThreadEngine.cpp	Fri Oct 15 10:18:29 2010 +0900
@@ -0,0 +1,221 @@
+/*
+* Copyright (c) 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: Juha Kauppinen, Mika Hokkanen
+* 
+* Description: Photo Browser
+*
+*/
+
+// INCLUDES
+#include <e32base.h> 
+#include <aknnotewrappers.h>
+
+#include "IEThreadEngine.h"
+#include "IEImageFinder.h"
+#include "ImagicConsts.h"
+
+
+// ----------------------------------------------------------------------------
+// CFileFinderThread::CFileFinderThread(CSharedIntermediator* aSMediator)
+//
+// Constructor.
+// ----------------------------------------------------------------------------
+CFileFinderThread::CFileFinderThread(
+        CIEFileLoader* aFileLoader, 
+        RArray<CImageData*>& aFileNameData, 
+        RArray<CImageData*>& aFaceFileNameData,
+        RCriticalSection* aCritical,
+        TDesC& aFileName) :
+    iCreatedThreads(EFalse),
+    iFileLoader(aFileLoader),
+    iFileNameData(aFileNameData),
+    iFaceFileNameData(aFaceFileNameData),
+    iCritical(aCritical)
+    {
+	iFilename.Copy(aFileName);
+	}
+
+// ----------------------------------------------------------------------------
+// CFileFinderThread::~CFileFinderThread(void)
+//
+// Destructor.
+// ----------------------------------------------------------------------------
+CFileFinderThread::~CFileFinderThread(void)
+	{
+	DP0_IMAGIC(_L("CFileFinderThread::~CFileFinderThread++"));
+	
+	if(iSMediator)
+	{
+		delete iSMediator;
+		iSMediator = NULL;
+	}
+	
+	// Thread should be killed allready, if thread is already killed this does nothing
+	iThreadOne.Kill(KErrNone);
+	
+	// Handles should be closed
+	iThreadOne.Close();
+	DP0_IMAGIC(_L("CFileFinderThread::~CFileFinderThread--"));
+	}
+
+CFileFinderThread* CFileFinderThread::NewL(
+        CIEFileLoader* aFileLoader,  
+        RArray<CImageData*>& aFileNameData, 
+        RArray<CImageData*>& aFaceFileNameData,
+        RCriticalSection* aCritical,
+        TDesC& aFileName)
+	{
+	CFileFinderThread* self = CFileFinderThread::NewLC(
+	        aFileLoader, 
+	        aFileNameData, 
+	        aFaceFileNameData,
+	        aCritical,
+	        aFileName);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CFileFinderThread* CFileFinderThread::NewLC(
+        CIEFileLoader* aFileLoader,  
+        RArray<CImageData*>& aFileNameData,
+        RArray<CImageData*>& aFaceFileNameData,
+        RCriticalSection* aCritical,
+        TDesC& aFileName)
+	{
+	CFileFinderThread* self = new (ELeave) CFileFinderThread(
+	        aFileLoader, 
+	        aFileNameData,
+	        aFaceFileNameData,
+	        aCritical,
+	        aFileName);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// Standard Symbian OS 2nd phase constructor
+void CFileFinderThread::ConstructL()
+	{
+	DP0_IMAGIC(_L("CFileFinderThread::ConstructL ++ --"));
+	}
+
+void CFileFinderThread::StartL()
+	{
+	DP0_IMAGIC(_L("CFileFinderThread::Start++"));
+	// Create threads only once
+	if ( iCreatedThreads == EFalse )
+		{
+		CreateThreadsL();
+		}
+	DP0_IMAGIC(_L("CFileFinderThread::Start--"));
+	}
+
+
+void CFileFinderThread::Stop()
+	{
+	//TRequestStatus aStatus;
+	//iThreadOne.Logon(aStatus);
+	//iThreadOne.Suspend();
+	}
+
+// ----------------------------------------------------------------------------
+// CFileFinderThread::ExecuteThread(TAny *aPtr)
+//
+// Threadfunction of threadOne. Executed only by threadOne.
+// ----------------------------------------------------------------------------
+TInt CFileFinderThread::ExecuteThreadOne(TAny *aPtr)
+	{
+	DP0_IMAGIC(_L("CFileFinderThread::ExecuteThreadOne++"));
+	
+	CMediator* aSMediator = static_cast<CMediator*>( aPtr );
+	
+	//Create cleanupstack	
+	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+	
+	//Test cleanup stack, additional cleanup stack must be prosessed under
+	//TRAP
+    //We can't use low level cleanup stack handling
+	TRAPD(error, CFileFinderThread::CreateFileFinderL(aSMediator));
+
+	delete cleanupStack;
+	
+	DP0_IMAGIC(_L("CFileFinderThread::ExecuteThreadOne--"));
+	
+	return 0;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CFileFinderThread::CreateActiveScheduler(CSharedIntermediator* aSMediator)
+//
+// Create ActiveScheduler for thread1.
+// ----------------------------------------------------------------------------
+void CFileFinderThread::CreateFileFinderL(CMediator* aSMediator)
+	{
+	DP0_IMAGIC(_L("CFileFinderThread::CreateFileFinderL++"));
+	// create a new active scheduler
+	CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;
+	CleanupStack::PushL(activeScheduler);
+
+	// use static function Install to install previously created scheduler
+	CActiveScheduler::Install(activeScheduler);
+	
+	//Create and use iTNImageFinder to handle in backround AO iFileNameData array filling
+	CIEImageFinder* TNImageFinder = new (ELeave) CIEImageFinder(
+	        aSMediator->iFileLoader, 
+            *aSMediator->iFileNameData,
+            *aSMediator->iFaceFileNameData,
+            aSMediator->iCritical);
+    
+	CleanupStack::PushL(TNImageFinder);
+	TNImageFinder->ConstructL();
+	TNImageFinder->StartFinderL(KFileString);
+
+	DP0_IMAGIC(_L("CFileFinderThread::CreateFileFinderL finder ended"));
+	aSMediator->iFileLoader->ImageFinderStopped();
+	aSMediator->iFileLoader->AllFilesAddedToFilenameArray();
+	
+	// Start active scheduler
+    //CActiveScheduler::Start();
+    
+    // Remove and delete scheduler and the rest.
+	CleanupStack::PopAndDestroy(2);
+	DP0_IMAGIC(_L("CFileFinderThread::CreateFileFinderL--"));
+	}
+
+
+// ----------------------------------------------------------------------------
+// CFileFinderThread::CreateThreadsL()
+//
+// Create thread1 and resume it. Activate thread1 listener.
+// ----------------------------------------------------------------------------
+void CFileFinderThread::CreateThreadsL()
+	{
+	DP0_IMAGIC(_L("CFileFinderThread::CreateThreadsL++"));
+	iSMediator = new (ELeave) CMediator();
+	
+	iSMediator->iFileLoader = iFileLoader;
+    iSMediator->iFileNameData = &iFileNameData;
+    iSMediator->iFaceFileNameData = &iFaceFileNameData;
+    iSMediator->iCritical = iCritical;
+    iSMediator->iFileName = iFilename;
+    
+	// Create thread which uses the same heap as main program.
+	iThreadOne.Create(_L("FileFinderThread"), ExecuteThreadOne, 12040, NULL, iSMediator);
+	//EPriorityNormal, EPriorityLess, EPriorityMuchLess
+	iThreadOne.SetPriority(EPriorityMuchLess);
+	iThreadOne.Resume();
+	
+	iCreatedThreads = ETrue;
+	DP0_IMAGIC(_L("CFileFinderThread::CreateThreadsL--"));
+	}
+