locationtriggering/ltcontainer/src/lbtcontainercompfilter.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:37:04 +0300
branchRCL_3
changeset 44 2b4ea9893b66
parent 0 667063e416a2
child 45 6b6920c56e2f
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* 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:
*
* Description: Implementation of composite filter class
*
*/


#include <s32strm.h>
#include <lbttriggerfilterbyattribute.h>
#include <lbttriggerfiltercomposite.h>
#include "lbtcontainerfilterbase.h"
#include "lbtcontainertriggerfilter.h"
#include "lbtcontainercompfilter.h"
#include "lbtcontainerareafilter.h"
#include "lbtcontainerattrfilter.h"
#include "lbtcontainerutilities.h"
#include "lbtlogger.h"



// ======== LOCAL FUNCTIONS ========

// ---------------------------------------------------------------------------
// CLbtContainerCompFilter::NewL()
//
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
CLbtContainerCompFilter* CLbtContainerCompFilter::NewL(CLbtTriggerFilterBase* aTrigFilter,CLbtContainerFilter* aContFilter)
    {
    FUNC_ENTER("CLbtContainerCompFilter::NewL");
  	CLbtContainerCompFilter* self = new( ELeave ) CLbtContainerCompFilter;
    CleanupStack::PushL( self );
    self->ConstructL(aTrigFilter,aContFilter);
	CleanupStack::Pop( self );    
    return self;
    }

void CLbtContainerCompFilter::ProcessFilter(CLbtContainerTriggerEntry* aEntry,TInt& aIsFilterPresent,TBool& aIsEntryRequested  )
	{
	FUNC_ENTER("CLbtContainerCompFilter::ProcessFilter");
	TInt isFilterPresent = 0;
	TBool isEntryRequested = EFalse;
	CLbtContainerFilter* contFilter = ContFilter();
	if(contFilter)
		{
		ProcessContFilter(aEntry,isFilterPresent,isEntryRequested);
		// if containerFilter attributes itself are not satisfied, return..
		// no use of processing further.
		
		if(isFilterPresent && !isEntryRequested)
			{
			aIsFilterPresent = isFilterPresent;
			aIsEntryRequested = isEntryRequested;
			return;
			}
		}
	for(TInt i=0;i<iFilterArray.Count();i++)
		{
		//Process for all the filters present in the composite filter
		iFilterArray[i]->ProcessFilter(aEntry,isFilterPresent,isEntryRequested);	
		// if any filter returs false, stop processing since API currenty only supports
		//AND composition.
		if(isFilterPresent && !isEntryRequested)
			break;
		}
	aIsFilterPresent = isFilterPresent;
	aIsEntryRequested = isEntryRequested;
	}

void CLbtContainerCompFilter::ProcessContFilter(CLbtContainerTriggerEntry* aEntry,TInt& aIsFilterPresent,TBool& aIsEntryRequested)
	{
	FUNC_ENTER("CLbtContainerCompFilter::ProcessContFilter");
	CLbtExtendedTriggerInfo* contExtInfo=aEntry->ExtendedTriggerInfo(); 
	TInt isFilterPresent = 0;
	TBool isEntryRequested = EFalse;
	TInt i;
	if(contExtInfo!=NULL)
             	{
                 if( iHystRadiusArray.Count()>0)  
                    {
                    isFilterPresent++;
                    isEntryRequested=EFalse;
                    for(i=0;i<iHystRadiusArray.Count();i++)
                	    {
                	    if(contExtInfo->HysteresisRadius()==iHystRadiusArray[i])
                    	    {
                    	    
                            isEntryRequested=ETrue;
                    	    }
                        
                	    }
                    }
                     
                    
                    if((isFilterPresent>0 && isEntryRequested  ) ||  isFilterPresent==0 )  
                        {
                        	if(iTriggerFiredArray.Count()>0)
                        		{
                        isFilterPresent++;
                        isEntryRequested=EFalse;
                        for(i=0;i<iTriggerFiredArray.Count();i++)
                    	    {
                    	    if(contExtInfo->IsTriggerFired()==iTriggerFiredArray[i])
                    		    {
                                isEntryRequested=ETrue;
                        
                    		    }
                   		    }
                        }
                      }
                        
                     if((isFilterPresent>0 && isEntryRequested && iSidArray.Count()>0) || (iSidArray.Count()>0 && isFilterPresent==0 ))  
                        {
                        isFilterPresent++;
                        isEntryRequested=EFalse;
                        for(i=0;i<iSidArray.Count();i++)
                    	    {
                    	    if(contExtInfo->OwnerSid()==iSidArray[i])
                        	    {
                        	    
                                isEntryRequested=ETrue;
                        	    }
                            
                    	    }
                        }     
                    
                    if((isFilterPresent>0 && isEntryRequested && iTriggerFireOnCreationArray.Count()>0) || (iTriggerFireOnCreationArray.Count()>0 && isFilterPresent==0 ))  
                        {
                        isFilterPresent++;
                        isEntryRequested=EFalse;
                        for(i=0;i<iTriggerFireOnCreationArray.Count();i++)
                    	    {
                    	    if(contExtInfo->IsTriggerFireOnCreation()==iTriggerFireOnCreationArray[i])
                        	    {
                        	    
                                isEntryRequested=ETrue;
                        	    }
                            
                    	    }
                        }  
                    
                    
                    } // end of if(contExtInfo!=NULL)
       aIsFilterPresent = isFilterPresent;
       aIsEntryRequested = isEntryRequested;	
	}
	
void CLbtContainerCompFilter::RetrieveFilterDataL()
	{	
	FUNC_ENTER("CLbtContainerCompFilter::RetrieveFilterDataL");
	CLbtContainerFilter* contFilter = ContFilter();
	CLbtTriggerFilterBase* trigFilter = TrigFilter();
	CLbtTriggerFilterComposite* compFilter = static_cast<CLbtTriggerFilterComposite*>(trigFilter);
	
	if(contFilter)
       {
        contFilter->GetSidArrayL(&iSidArray) ;
        contFilter->GetHystRadiusArrayL(&iHystRadiusArray); 
        contFilter->GetRectAreaArrayL(&iTriggerRectAreaArray) ;
        contFilter->GetTriggerFiredArrayL(&iTriggerFiredArray) ;
        contFilter->GetTriggerFireOnCreationArrayL( &iTriggerFireOnCreationArray );
        
        }
    if(compFilter)
        {
        TInt numOfFilters = compFilter->NumberOfFilters();
        for(TInt i = 0;i< numOfFilters;i++)
        	{
        	CLbtTriggerFilterBase* filter = LbtContainerUtilities::CloneFilterL(compFilter->GetFilter(i));
        	CleanupStack::PushL(filter);
        	switch(filter->Type())
        		{
    		    case CLbtTriggerFilterBase::EFilterByAttribute:
    				{
    				CLbtContainerAttrFilter* attrFilter = CLbtContainerAttrFilter::NewL(filter,NULL);
    				CleanupStack::PushL( attrFilter );
					iFilterArray.AppendL(attrFilter);
					CleanupStack::Pop( attrFilter );
					break;
    				}
    			case CLbtTriggerFilterBase::EFilterByArea:
    				{
    				CLbtContainerAreaFilter* areaFilter = CLbtContainerAreaFilter::NewL(filter,NULL);
    				CleanupStack::PushL( areaFilter );
    				iFilterArray.AppendL(areaFilter);
    				CleanupStack::Pop( areaFilter );
    				break;
    				}
    			case CLbtTriggerFilterBase::EFilterComposite:
    				{
    				CLbtContainerCompFilter* compFilter = CLbtContainerCompFilter::NewL(filter,NULL);
    				CleanupStack::PushL( compFilter );
    				iFilterArray.AppendL(compFilter);
    				CleanupStack::Pop( compFilter );
    				break;
    				}
        		}
        	CleanupStack::Pop(filter); // ownership taken by the container filters
        	}        
        }    
	}

CLbtContainerCompFilter::CLbtContainerCompFilter()
	{
	
	}


CLbtContainerCompFilter::~CLbtContainerCompFilter()
	{
	FUNC_ENTER("CLbtContainerCompFilter::~CLbtContainerCompFilter");
	iFilterArray.ResetAndDestroy();
	iHystRadiusArray.Close();
	iTriggerRectAreaArray.Close();
	iTriggerFiredArray.Close();
	iSidArray.Close();
	iTriggerFireOnCreationArray.Close();
	}
 
void CLbtContainerCompFilter::ConstructL(CLbtTriggerFilterBase* aTrigFilter,CLbtContainerFilter* aContFilter)
	{
	FUNC_ENTER("CLbtContainerCompFilter::ConstructL");
	SetTrigFilter(aTrigFilter);
	SetContFilter(aContFilter);
	RetrieveFilterDataL();
	}