applayerprotocols/httptransportfw/core/TFilterConfigurationIter.cpp
changeset 0 b16258d2340f
child 13 26ce6fb6aee2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/core/TFilterConfigurationIter.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,207 @@
+// Copyright (c) 2001-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:
+//
+
+// System includes
+#include <http/cecomfilter.h>
+#include <httperr.h>
+#include <http/tfilterconfigurationiter.h>// Class signature
+
+// Local includes
+#include "CHTTPSession.h"
+
+// Standard constructor
+TFilterConfigurationIterator::TFilterConfigurationIterator(CHTTPSession* aSession)
+	:	iSession(aSession),
+		iFilterInfoList(aSession->iFilterInfoList),
+		iCurrentFilterIndex(0),
+		iFilterCount(0)
+	{
+	// Count the number of implicit and explicit filters
+	const TInt fullListCount = iFilterInfoList.Count();
+	for( TInt i=0; i<fullListCount; ++i )
+		{
+		switch(iFilterInfoList[i]->iCategory)
+			{
+			case TSessionFilterInfo::EImplicit:
+			case TSessionFilterInfo::EExplicit:
+				++iFilterCount;
+			default:
+				break;
+			}
+		}
+	}
+
+// Standard destructor
+TFilterConfigurationIterator::~TFilterConfigurationIterator()
+	{
+	}
+
+// Set current filter as the first one in the list
+EXPORT_C TInt TFilterConfigurationIterator::First()
+	{
+	if( iFilterCount == 0 )
+		return KErrNotFound;
+	else
+		{
+		// Find the first implicit or explicit filter
+		iCurrentFilterIndex = 0;
+		if( iFilterInfoList[iCurrentFilterIndex]->iCategory == TSessionFilterInfo::EMandatory )
+			return Next();
+		}
+
+	return KErrNone;
+	}
+
+// Set the current filter to the next filter in the list
+EXPORT_C TInt TFilterConfigurationIterator::Next()
+	{
+	__ASSERT_ALWAYS(iFilterCount, HTTPPanic::Panic(HTTPPanic::EInvalidFilterHandle));
+
+	// Check if the is at the end of the list
+	if( iCurrentFilterIndex == iFilterCount - 1 )
+		{
+		return KErrNotFound;
+		}
+	else
+		{
+		++iCurrentFilterIndex;
+		// If the next filter is a mandatory filter then move on to the next filter
+		if( iFilterInfoList[iCurrentFilterIndex]->iCategory == TSessionFilterInfo::EMandatory )
+			return Next();
+		}
+
+	return KErrNone;
+	}
+
+// Returns a boolean indicating whether the current filter is the first in the list
+EXPORT_C TBool TFilterConfigurationIterator::AtStart()
+	{
+	__ASSERT_ALWAYS(iFilterCount, HTTPPanic::Panic(HTTPPanic::EInvalidFilterHandle));
+	// Store the original list index
+	TInt originalListIndex = iCurrentFilterIndex;
+	// This will set the list index (iCurrentFilter) to the first filter
+	First();
+	if( originalListIndex == iCurrentFilterIndex )
+		return ETrue;
+	else
+		{
+		// Index has changed so revert back to the original index value
+		iCurrentFilterIndex = originalListIndex;
+		return EFalse;
+		}
+	}
+
+// Returns a boolean indicating whether the current filter is the last in the list
+EXPORT_C TBool TFilterConfigurationIterator::AtEnd()
+	{
+	__ASSERT_ALWAYS(iFilterCount, HTTPPanic::Panic(HTTPPanic::EInvalidFilterHandle));
+	// Store the original list index
+	TInt originalListIndex = iCurrentFilterIndex;
+
+	// See if the a next filter exists
+	if( Next() == KErrNotFound )
+		return ETrue;
+	else
+		{
+		// Index has changed so revert back to the original index value
+		iCurrentFilterIndex = originalListIndex;
+		return EFalse;
+		}
+	}
+
+// Set the current filter as the first filter that matches the data type passed in
+EXPORT_C TInt TFilterConfigurationIterator::FindByDataType(const TDesC8& aDataType)
+	{
+	// Store the original filter
+	TInt originalListIndex = iCurrentFilterIndex;
+
+	// Start from the start of the list
+	if( First() == KErrNotFound )
+		return KErrNotFound;
+	
+	do
+		{
+		// Loop through all the filters until a match is found
+		if( iFilterInfoList[iCurrentFilterIndex]->iFilterInfo->DataType().CompareF(aDataType) == 0 )
+			return KErrNone;
+		} 
+	while( Next() != KErrNotFound );
+	// If no match then set current filter back to the original filter
+	iCurrentFilterIndex = originalListIndex;
+	return KErrNotFound;
+	}
+
+// Get the information on the current filter
+EXPORT_C const TFilterInformation TFilterConfigurationIterator::CurrentFilterInformation() const
+	{
+	// Panic if the current filter has not been set using the First() method
+	__ASSERT_ALWAYS(iFilterCount, HTTPPanic::Panic(HTTPPanic::EInvalidFilterHandle));
+
+	// Determine what the filter category is
+	TFilterInformation::TFilterCategory currentFilterCategory;
+	if( iFilterInfoList[iCurrentFilterIndex]->iCategory == TSessionFilterInfo::EImplicit)
+		currentFilterCategory = TFilterInformation::EImplicitFilter;
+	else
+		currentFilterCategory = TFilterInformation::EExplicitFilter;
+	
+	// Determine if the filter has been loaded yet
+	TBool isFilterLoaded = EFalse;
+	if( iFilterInfoList[iCurrentFilterIndex]->iFilterPlugin != NULL )
+		isFilterLoaded = ETrue;
+
+	// Create a current filter information class containing the details of the filter
+	TFilterInformation currentFilterInformation(
+		iFilterInfoList[iCurrentFilterIndex]->iFilterInfo->DisplayName(),
+		iFilterInfoList[iCurrentFilterIndex]->iFilterInfo->DataType(),
+		iFilterInfoList[iCurrentFilterIndex]->iFilterInfo->Version(),
+		iFilterInfoList[iCurrentFilterIndex]->iFilterInfo->ImplementationUid(),
+		currentFilterCategory,
+		isFilterLoaded);
+
+	return currentFilterInformation;
+	}
+
+// Install the current filter
+EXPORT_C TInt TFilterConfigurationIterator::InstallCurrentFilter() const
+	{
+	__ASSERT_ALWAYS(iFilterCount, HTTPPanic::Panic(HTTPPanic::EInvalidFilterHandle));
+	if( iFilterInfoList[iCurrentFilterIndex]->iFilterPlugin != NULL )
+		return KErrAlreadyExists;
+	else
+		{
+		// Get the UID of the current filter
+		TUid filterUid = iFilterInfoList[iCurrentFilterIndex]->iFilterInfo->ImplementationUid();
+
+		// Install the filter through ECom
+		TRAPD(err, iFilterInfoList[iCurrentFilterIndex]->iFilterPlugin = 
+						CEComFilter::InstallFilterL(iSession->Handle(), filterUid));
+		return err;
+		}
+	}
+
+// Uninstall the current filter
+EXPORT_C TInt TFilterConfigurationIterator::UninstallCurrentFilter() const
+	{
+	__ASSERT_ALWAYS(iFilterCount, HTTPPanic::Panic(HTTPPanic::EInvalidFilterHandle));
+	if( iFilterInfoList[iCurrentFilterIndex]->iFilterPlugin == NULL )
+		return KErrNotFound;
+	else
+		{
+		// Delete the implementation and the filter should uninstall itself
+		delete iFilterInfoList[iCurrentFilterIndex]->iFilterPlugin;
+		iFilterInfoList[iCurrentFilterIndex]->iFilterPlugin = NULL;
+		return KErrNone;
+		}
+	}