locationtriggering/ltcontainer/src/lbtcontainerutilities.cpp
changeset 0 667063e416a2
equal deleted inserted replaced
-1:000000000000 0:667063e416a2
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Utility class for location triggering container
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32base.h>
       
    21 #include <lbttriggerfilterbyattribute.h>
       
    22 #include <s32mem.h>
       
    23 #include <lbttriggerfilterbyarea.h>
       
    24 #include <lbttriggerfiltercomposite.h>
       
    25 #include <lbtstartuptrigger.h>
       
    26 #include <lbtgeocircle.h>
       
    27 #include <lbtgeohybrid.h>
       
    28 #include <lbtgeocell.h>
       
    29 #include "lbtcontainerutilities.h"
       
    30 #include "lbttriggerfilterbyattribute.h"
       
    31 #include "lbtlisttriggeroptions.h"
       
    32 #include "lbtcontainerlistoptions.h"
       
    33 #include "lbtcontainertriggerfilter.h"
       
    34 #include "lbtcontainerareafilter.h"
       
    35 #include "lbtcontainerattrfilter.h"
       
    36 #include "lbtcontainercompfilter.h"
       
    37 #include "lbtcontainerupdatefilter.h"
       
    38 #include "lbtsecuritypolicy.h"
       
    39 #include "lbtcontainertriggerentry.h"
       
    40 #include "lbtlogger.h"
       
    41 
       
    42 //----------------------------------------------------------------------------
       
    43 // LbtContainerUtilities::GetContainerFilterBaseType
       
    44 //----------------------------------------------------------------------------
       
    45 //
       
    46 CLbtContainerFilterBase* LbtContainerUtilities::GetContainerFilterFromListOptionsLC( CLbtContainerListOptions* aListOptions )
       
    47 	{
       
    48 	FUNC_ENTER("LbtContainerUtilities::GetContainerFilterFromListOptions");
       
    49 	if(aListOptions == NULL)
       
    50 		{
       
    51 		User::Leave(KErrArgument);
       
    52 		}
       
    53 
       
    54 	CLbtListTriggerOptions* listOptions = aListOptions->ListOptions();
       
    55 	CLbtTriggerFilterBase *filter = NULL;
       
    56 	
       
    57 	if( listOptions != NULL )
       
    58         {
       
    59         filter = CloneFilterL(listOptions->Filter());
       
    60         }
       
    61     
       
    62     if(filter == NULL)
       
    63     	{
       
    64     	filter = CLbtTriggerFilterByAttribute::NewL();    	
       
    65         CLbtTriggerFilterByAttribute* attrFilter = static_cast<CLbtTriggerFilterByAttribute*> (filter);
       
    66         attrFilter->AddTriggerStateL(CLbtTriggerEntry::EStateEnabled);
       
    67         attrFilter->AddTriggerStateL(CLbtTriggerEntry::EStateDisabled);
       
    68     	}
       
    69     CleanupStack::PushL(filter);
       
    70     
       
    71     CLbtContainerFilter* contFilter = NULL;
       
    72     TBool containerFilterOnStack = EFalse;    
       
    73     if(aListOptions->ContainerFilter() != NULL)
       
    74     	{
       
    75     	containerFilterOnStack = ETrue;
       
    76     	contFilter = CLbtContainerFilter::NewL(aListOptions->ContainerFilter());
       
    77     	CleanupStack::PushL(contFilter);
       
    78     	}
       
    79 
       
    80     CLbtContainerFilterBase* retContainerFilter = NULL;
       
    81 	switch(filter->Type())
       
    82 		{
       
    83 		case CLbtTriggerFilterBase::EFilterByArea:
       
    84 			{
       
    85 			CLbtContainerAreaFilter* areaFilter = CLbtContainerAreaFilter::NewL(filter ,contFilter);
       
    86 		    retContainerFilter = areaFilter;
       
    87 		    break;
       
    88 			}
       
    89 		case CLbtTriggerFilterBase::EFilterByAttribute:
       
    90 			{
       
    91 			CLbtContainerAttrFilter* attrFilter = CLbtContainerAttrFilter::NewL(filter, contFilter);
       
    92 			retContainerFilter = attrFilter;
       
    93 			break;
       
    94 			}
       
    95 		case CLbtTriggerFilterBase::EFilterComposite:
       
    96 			{
       
    97 			CLbtContainerCompFilter* compFilter = CLbtContainerCompFilter::NewL(filter, contFilter);
       
    98 			retContainerFilter = compFilter;
       
    99 			break;
       
   100 			}
       
   101 		default:
       
   102 			{
       
   103 			// This is some filter which is not supported
       
   104 			User::Leave(KErrNotSupported);
       
   105 			break;
       
   106 			}
       
   107 		}	
       
   108 	if(containerFilterOnStack)
       
   109 		{
       
   110 		CleanupStack::Pop(contFilter); // Ownership taken by container filter
       
   111 		}	
       
   112 	CleanupStack::Pop(filter); // Ownership taken by container filter
       
   113 	CleanupStack::PushL(retContainerFilter);
       
   114 	return retContainerFilter;
       
   115 	}
       
   116 
       
   117 //----------------------------------------------------------------------------
       
   118 // LbtContainerUtilities::GetContainerFilterFromUpdateFilterLC
       
   119 //----------------------------------------------------------------------------
       
   120 //
       
   121 CLbtContainerFilterBase* LbtContainerUtilities::GetContainerFilterFromUpdateFilterLC( CLbtContainerUpdateFilter* aListOptions )
       
   122 	{
       
   123 	FUNC_ENTER("LbtContainerUtilities::GetContainerFilterFromUpdateFilterLC");
       
   124 	
       
   125 	if(aListOptions == NULL)
       
   126 		{
       
   127 		User::Leave(KErrArgument);
       
   128 		}
       
   129 	
       
   130 	CLbtTriggerFilterBase* filterBase = CloneFilterL(aListOptions->TrigInfoFilter());
       
   131 	CleanupStack::PushL(filterBase);
       
   132 	
       
   133 	CLbtContainerFilter* contFilter = NULL;
       
   134 	TBool containerFilterOnStack = EFalse;
       
   135 	if(aListOptions->ContainerFilter() != NULL)
       
   136 		{
       
   137 		containerFilterOnStack = ETrue;
       
   138 		contFilter = CLbtContainerFilter::NewL(aListOptions->ContainerFilter());
       
   139 		CleanupStack::PushL(contFilter);
       
   140 		}
       
   141     CLbtContainerFilterBase* filter = NULL;
       
   142     
       
   143     switch(filterBase->Type())
       
   144     	{
       
   145 		case CLbtTriggerFilterBase::EFilterByAttribute: 	
       
   146 			{
       
   147 			CLbtContainerAttrFilter* attrFilter = CLbtContainerAttrFilter::NewL(filterBase, contFilter);
       
   148 			filter = attrFilter;
       
   149 			break;
       
   150 			}
       
   151 		case CLbtTriggerFilterBase::EFilterByArea:
       
   152 			{
       
   153 			CLbtContainerAreaFilter* areaFilter = CLbtContainerAreaFilter::NewL(filterBase, contFilter);
       
   154 			filter = areaFilter;
       
   155 			break;
       
   156 			}									
       
   157 		case CLbtTriggerFilterBase::EFilterComposite:
       
   158 			{
       
   159 			CLbtContainerCompFilter* compFilter = CLbtContainerCompFilter::NewL(filterBase, contFilter);
       
   160 			filter = compFilter;
       
   161 			break;
       
   162 			}
       
   163 		default:
       
   164 			{
       
   165 			User::Leave(KErrNotSupported);
       
   166 			break;
       
   167 			}
       
   168     	}
       
   169     if(containerFilterOnStack)
       
   170 		{
       
   171 		CleanupStack::Pop(contFilter); // Ownership taken by container filter
       
   172 		}
       
   173     CleanupStack::Pop(); //filterBase, 
       
   174     CleanupStack::PushL(filter);
       
   175     return filter;
       
   176 	}
       
   177 
       
   178 //----------------------------------------------------------------------------
       
   179 // LbtContainerUtilities::CopyGeoAreaL
       
   180 //----------------------------------------------------------------------------
       
   181 //
       
   182 CLbtGeoAreaBase* LbtContainerUtilities::CopyGeoAreaL( CLbtGeoAreaBase* aGeoAreaBase )
       
   183     {
       
   184     CBufFlat* buffer = CBufFlat::NewL(512);
       
   185     CleanupStack::PushL(buffer);
       
   186                         
       
   187     RBufWriteStream writeStream;
       
   188     writeStream.Open( *buffer );
       
   189     CleanupClosePushL(writeStream);
       
   190     
       
   191     aGeoAreaBase->ExternalizeL( writeStream );
       
   192     writeStream.CommitL();
       
   193     CleanupStack::PopAndDestroy(&writeStream);
       
   194     
       
   195     RBufReadStream readStream;
       
   196     readStream.Open( *buffer );
       
   197     CleanupClosePushL(readStream);
       
   198     CLbtGeoAreaBase* trigArea = NULL;
       
   199     
       
   200     switch( aGeoAreaBase->Type() )
       
   201         {
       
   202         case CLbtGeoAreaBase::ECircle:
       
   203             {
       
   204             trigArea = CLbtGeoCircle::NewLC();
       
   205             break;
       
   206             }
       
   207         case CLbtGeoAreaBase::ECellular:
       
   208             {
       
   209             trigArea = CLbtGeoCell::NewLC();
       
   210             break;
       
   211             }
       
   212         case CLbtGeoAreaBase::EHybrid:
       
   213             {
       
   214             trigArea = CLbtGeoHybrid::NewLC();
       
   215             break;
       
   216             }
       
   217         default:
       
   218             {
       
   219             User::Leave( KErrArgument );
       
   220             }
       
   221         }
       
   222     
       
   223     trigArea->InternalizeL( readStream );
       
   224     CleanupStack::Pop(3); //trigArea, readStream and buffer
       
   225     readStream.Close();
       
   226     delete buffer;
       
   227     return trigArea; 
       
   228     }
       
   229 
       
   230 //----------------------------------------------------------------------------
       
   231 // LbtContainerUtilities::GetContainerFilterBaseType
       
   232 //----------------------------------------------------------------------------
       
   233 //
       
   234 CLbtTriggerFilterBase* LbtContainerUtilities::CloneFilterL(CLbtTriggerFilterBase* aFilter)
       
   235 	{
       
   236 	FUNC_ENTER("CLbtDbTriggersManager::CloneFilterL");
       
   237 
       
   238 	if(aFilter == NULL)
       
   239 		{
       
   240 		return NULL;
       
   241 		}
       
   242 
       
   243 	CBufFlat* buffer = CBufFlat::NewL(512);
       
   244 	CleanupStack::PushL(buffer);
       
   245 	
       
   246 	RBufWriteStream writeStream(*buffer);
       
   247 	CleanupClosePushL(writeStream);
       
   248 	
       
   249 	aFilter->ExternalizeL(writeStream);
       
   250 	CleanupStack::PopAndDestroy(); //writeStream
       
   251 
       
   252 	CLbtTriggerFilterBase* retFilter = NULL;
       
   253 	RBufReadStream stream(*buffer);
       
   254 	CleanupClosePushL(stream);
       
   255 
       
   256 	switch(aFilter->Type())
       
   257 		{
       
   258 		case CLbtTriggerFilterBase::EFilterByAttribute:
       
   259 			{
       
   260 			CLbtTriggerFilterByAttribute* attributeFilter = 
       
   261 								CLbtTriggerFilterByAttribute::NewLC();
       
   262 			attributeFilter->InternalizeL(stream);			
       
   263 			CleanupStack::Pop(attributeFilter);
       
   264 			retFilter = attributeFilter;
       
   265 			break;
       
   266 			}
       
   267 		case CLbtTriggerFilterBase::EFilterByArea:
       
   268 			{
       
   269 			CLbtTriggerFilterByArea* areaFilter = 
       
   270 								CLbtTriggerFilterByArea::NewLC();			
       
   271 			areaFilter->InternalizeL(stream);			
       
   272 			CleanupStack::Pop(areaFilter);
       
   273 			retFilter = areaFilter;
       
   274 			break;
       
   275 			}
       
   276 		case CLbtTriggerFilterBase::EFilterComposite:
       
   277 			{
       
   278 			CLbtTriggerFilterComposite* compositeFilter = 
       
   279 								CLbtTriggerFilterComposite::NewLC();
       
   280 			compositeFilter->InternalizeL(stream);			
       
   281 			CleanupStack::Pop(compositeFilter);
       
   282 			retFilter = compositeFilter;
       
   283 			break;
       
   284 			}
       
   285 		default:
       
   286 			{
       
   287 			User::Leave(KErrNotSupported);
       
   288 			break;
       
   289 			}
       
   290 		}
       
   291 	CleanupStack::PopAndDestroy(2); //stream, buffer
       
   292 	return retFilter;
       
   293 	}
       
   294 
       
   295 //----------------------------------------------------------------------------
       
   296 // LbtContainerUtilities::RunSecurityPolicy
       
   297 //----------------------------------------------------------------------------
       
   298 //
       
   299 TBool LbtContainerUtilities::RunSecurityPolicy( CLbtContainerTriggerEntry* aTriggerEntry, 
       
   300 												TLbtSecurityPolicy& aSecurityPolicy )
       
   301 	{
       
   302 	FUNC_ENTER("LbtContainerUtilities::RunSecurityPolicy");
       
   303 	// Check if the security policy is NULL
       
   304 	if(aSecurityPolicy.IsNull())
       
   305 		{
       
   306 		// No security policy required
       
   307 		return ETrue;
       
   308 		}
       
   309 	
       
   310 	// Check if the trigger's owner SID matches the secure id of the client
       
   311 	TSecureId ownerSecureId = aSecurityPolicy.GetOwnerSecureId();
       
   312 	
       
   313 	if(ownerSecureId.iId != KNullUidValue)
       
   314 		{
       
   315 		if(aTriggerEntry->ExtendedTriggerInfo()->OwnerSid() == ownerSecureId)
       
   316 			{
       
   317 			// The Secure ID of the policy matches the owner SID.
       
   318 			return ETrue;
       
   319 			}
       
   320 		
       
   321 		// Check if the secure id specified in the security policy matches the manager ui
       
   322 		if( aTriggerEntry->TriggerEntry()->ManagerUi() == ownerSecureId )
       
   323 			{
       
   324 			return ETrue;
       
   325 			}
       
   326 		}
       
   327 	
       
   328 	// Check if the security policies owner secure id and the secure id of the 
       
   329 	// trigger handling process are the same. If yes then the security check passes
       
   330 	CLbtTriggerEntry* triggerEntry = aTriggerEntry->TriggerEntry();	
       
   331 	if( triggerEntry->Type() == CLbtTriggerEntry::ETypeStartup)
       
   332 		{
       
   333 		CLbtStartupTrigger* startupTrigger = static_cast<CLbtStartupTrigger*>(triggerEntry);
       
   334 		TSecureId secureId;
       
   335 		TBuf16<KMaxFileName> fileName;
       
   336 		startupTrigger->GetProcessId(fileName, secureId);
       
   337 		if( secureId == aSecurityPolicy.GetOwnerSecureId() )
       
   338 			{
       
   339 			return ETrue;
       
   340 			}
       
   341 		}		
       
   342 	return EFalse;
       
   343 	}
       
   344 
       
   345 //----------------------------------------------------------------------------
       
   346 // LbtContainerUtilities::RunSecurityPolicy
       
   347 //----------------------------------------------------------------------------
       
   348 //
       
   349 TBool LbtContainerUtilities::RunSecurityPolicy( TUid& aOwnerUid,
       
   350 												TUid& aManagerUid,
       
   351 												TSecureId& aStartupProcessUid,
       
   352 												TLbtSecurityPolicy& aSecurityPolicy )
       
   353 	{
       
   354 	FUNC_ENTER("LbtContainerUtilities::RunSecurityPolicy-UID");
       
   355 	
       
   356 	// Check if the security policy is NULL
       
   357 	if(aSecurityPolicy.IsNull())
       
   358 		{
       
   359 		// No security policy required
       
   360 		return ETrue;
       
   361 		}
       
   362 	
       
   363 	// Check if the trigger's owner SID matches the secure id of the client
       
   364 	TSecureId ownerSecureId = aSecurityPolicy.GetOwnerSecureId();
       
   365 	
       
   366 	if(ownerSecureId.iId != KNullUidValue)
       
   367 		{
       
   368 		if( aOwnerUid == ownerSecureId )
       
   369 			{
       
   370 			// The Secure ID of the policy matches the owner SID.
       
   371 			return ETrue;
       
   372 			}
       
   373 		
       
   374 		// Check if the secure id specified in the security policy matches the manager ui
       
   375 		if( aManagerUid == ownerSecureId )
       
   376 			{
       
   377 			return ETrue;
       
   378 			}
       
   379 		
       
   380 		if( aStartupProcessUid == ownerSecureId )
       
   381 			{
       
   382 			return ETrue;
       
   383 			}	
       
   384 		}		
       
   385 	return EFalse;
       
   386 	}
       
   387 
       
   388 //end of file