--- /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();
+ }
+