locationtriggering/ltcontainer/src/lbtcontainercompfilter.cpp
changeset 0 667063e416a2
child 39 3efc7a0e8755
child 44 2b4ea9893b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationtriggering/ltcontainer/src/lbtcontainercompfilter.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,230 @@
+/*
+* 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((isFilterPresent>0 && isEntryRequested && iHystRadiusArray.Count()>0) || (iHystRadiusArray.Count()>0 && isFilterPresent==0 ))  
+                    {
+                    isFilterPresent++;
+                    isEntryRequested=EFalse;
+                    for(i=0;i<iHystRadiusArray.Count();i++)
+                	    {
+                	    if(contExtInfo->HysteresisRadius()==iHystRadiusArray[i])
+                    	    {
+                    	    
+                            isEntryRequested=ETrue;
+                    	    }
+                        
+                	    }
+                    }
+                     
+                    
+                    if((isFilterPresent>0 && isEntryRequested && iTriggerFiredArray.Count()>0) || (iTriggerFiredArray.Count()>0 && isFilterPresent==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);
+					iFilterArray.Append(attrFilter);
+					break;
+    				}
+    			case CLbtTriggerFilterBase::EFilterByArea:
+    				{
+    				CLbtContainerAreaFilter* areaFilter = CLbtContainerAreaFilter::NewL(filter,NULL);
+    				iFilterArray.Append(areaFilter);
+    				break;
+    				}
+    			case CLbtTriggerFilterBase::EFilterComposite:
+    				{
+    				CLbtContainerCompFilter* compFilter = CLbtContainerCompFilter::NewL(filter,NULL);
+    				iFilterArray.Append(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();
+	}
+