locationtriggering/ltcontainer/src/lbtdbtriggersmanager.cpp
changeset 56 4e949f03ecc5
equal deleted inserted replaced
-1:000000000000 56:4e949f03ecc5
       
     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:  This file defines the class that handles the storage
       
    15 *                of triggers in database.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include <sysutil.h>
       
    21 #include <etelmm.h>
       
    22 #include <lbtstartuptrigger.h>
       
    23 #include <lbttriggerconditionarea.h>
       
    24 #include <lbtgeocircle.h>
       
    25 #include <lbttriggerfilterbase.h>
       
    26 #include <lbttriggerfilterbyarea.h>
       
    27 #include <lbttriggerfilterbyattribute.h>
       
    28 #include <lbttriggerfiltercomposite.h>
       
    29 #include <lbtgeorect.h>
       
    30 #include <lbtgeocell.h>
       
    31 #include <lbtgeohybrid.h>
       
    32 #include <s32file.h>
       
    33 #include <bautils.h>
       
    34 #include "lbtdbtriggersmanager.h"
       
    35 #include "lbtdboperationao.h"
       
    36 #include "lbtcontainerextendedtriggerinfo.h"
       
    37 #include "lbtcontainertriggerfilter.h"
       
    38 #include "lbtcontainerfilterbase.h"
       
    39 #include "lbtcontainerareafilter.h"
       
    40 #include "lbtcontainerattrfilter.h"
       
    41 #include "lbtcontainercompfilter.h"
       
    42 #include "lbttriggerstoreobserver.h"
       
    43 #include "lbtcontainerutilities.h"
       
    44 #include "lbtserverconsts.h"
       
    45 #include "lbtlogger.h"
       
    46 
       
    47 
       
    48 _LIT(KLbtDbName,"lbt.db"); // Name of the Database file for storing triggers.
       
    49 _LIT(KTriggersTable,"Triggers"); // Name of the Table for Triggers
       
    50 _LIT(KCircularTriggersTable, "CircularTriggers");
       
    51 _LIT(KCellTriggersTable, "CellTriggers");
       
    52 _LIT(KHybridTriggersTable, "HybridTriggers");
       
    53 _LIT(KTriggersIndexId,"TriggerIdIndex"); // Index based on Trigger Id column
       
    54 _LIT(KCircTriggersIndexId,"CircularTriggerIdIndex");
       
    55 _LIT(KCellTriggersIndexId,"CellularTriggerIdIndex");
       
    56 _LIT(KHybridTriggersIndexId,"HybridTriggerIdIndex");
       
    57 
       
    58 // Names for the fields in the table
       
    59 _LIT(KLbtDbFieldId, "id");
       
    60 _LIT(KLbtDbFieldName, "name");
       
    61 _LIT(KLbtDbFieldType, "type");
       
    62 _LIT(KLbtDbFieldDirection, "direction");
       
    63 _LIT(KLbtDbFieldOwnerSid, "owner");
       
    64 _LIT(KLbtDbFieldManagerUiSid, "managerui");
       
    65 _LIT(KLbtDbFieldRearmTime, "rearmtime");
       
    66 _LIT(KLbtDbFieldStartupSid, "stprocess");
       
    67 _LIT(KLbtDbFieldStartupPath, "stprocesspath");
       
    68 _LIT(KLbtDbFieldStartupCommandLine, "stprocesscmdline");
       
    69 _LIT(KLbtDbFieldState, "state");
       
    70 _LIT(KLbtDbFieldIsTriggerFired, "IsFired");
       
    71 _LIT(KLbtDbFieldDistanceToLastLocation,"distance");
       
    72 _LIT(KLbtDbFieldValidity, "validity");
       
    73 _LIT(KLbtDbFieldIsTriggerFireOnCreation, "IsTriggerFireOnCreation");
       
    74 _LIT(KLbtDbTriggerAreaType, "triggerareatype");
       
    75 
       
    76 // Name for the fields in circular trigger table
       
    77 _LIT(KLbtCircTrigDbFieldId, "idcirculartrigger");
       
    78 _LIT(KLbtDbFieldCenterLat, "latitude");
       
    79 _LIT(KLbtDbFieldCenterLong, "longitude");
       
    80 _LIT(KLbtDbFieldRadius, "radius");
       
    81 _LIT(KLbtDbFieldHysteresis, "hysteresis");
       
    82 _LIT(KLbtDbFieldAreaLeft, "westlong");
       
    83 _LIT(KLbtDbFieldAreaRight, "eastlong");
       
    84 _LIT(KLbtDbFieldAreaTop, "northlat");
       
    85 _LIT(KLbtDbFieldAreaBottom, "southlat");
       
    86 _LIT(KLbtDbFieldTriggerFiredLat, "FiredLat");
       
    87 _LIT(KLbtDbFieldTriggerFiredLong, "FiredLong");
       
    88 _LIT(KLbtDbFieldTriggerFiredAlt, "FiredAlt");
       
    89 _LIT(KLbtDbFieldTriggerFiredHorizAcc, "FiredHorizAcc");
       
    90 _LIT(KLbtDbFieldTriggerFiredVertAcc, "FiredVertAcc");
       
    91 _LIT(KLbtDbFieldCellIdStream,"cellidstream");  // 9.2TB Column additions start
       
    92 
       
    93 // Name for the fields in cellular trigger table
       
    94 _LIT(KLbtCellTrigDbFieldId, "idcelltrigger");
       
    95 _LIT(KLbtCellTrigDbCountryCode, "countrycode");
       
    96 _LIT(KLbtCellTrigDbNetworkId, "networkid");
       
    97 _LIT(KLbtCellTrigDbNetworkType, "networktype");
       
    98 _LIT(KLbtCellTrigDbLAC, "locationcode");
       
    99 _LIT(KLbtCellTrigDbCellId, "cellid");
       
   100 
       
   101 // Name for fields in Hybrid trigger table
       
   102 _LIT(KLbtHybridTrigDbFieldId, "idhybridtrigger");
       
   103 _LIT(KLbtHybridDataStream, "hybriddatastream"); // Added for 9.2 TB. Older fields not valid from 9.2 TB
       
   104 
       
   105 // Constants for SQL Queries
       
   106 _LIT(KWhere, " WHERE ");
       
   107 _LIT(KLike, " = ");
       
   108 _LIT(KLessThanEqualTo, " <= ");
       
   109 _LIT(KGreaterThanEqualTo, " >= ");
       
   110 _LIT(KAnd, " AND ");
       
   111 
       
   112 // Enums for the coulumn ids in the common table
       
   113 enum TCommonDbColNum
       
   114 	{
       
   115 	ELbtDbFieldId = 1,
       
   116     ELbtDbFieldName,
       
   117     ELbtDbFieldType,
       
   118     ELbtDbFieldDirection,
       
   119     ELbtDbFieldOwnerSid,
       
   120     ELbtDbFieldManagerUiSid,
       
   121     ELbtDbFieldRearmTime,
       
   122     ELbtDbFieldStartupSid, 
       
   123     ELbtDbFieldStartupPath, 
       
   124     ELbtDbFieldStartupCommandLine,
       
   125     ELbtDbFieldState,
       
   126     ELbtDbFieldIsTriggerFired,
       
   127     ELbtDbFieldDistanceToLastLocation,
       
   128     ELbtDbFieldValidity,
       
   129     ELbtDbFieldIsTriggerFireOnCreation,
       
   130     ELbtDbTriggerAreaType,
       
   131     };
       
   132 
       
   133 // Enums for the column ids in the cicular trigger's db
       
   134 enum TCircleTriggerDbColNum
       
   135 	{
       
   136 	ECircleDbFieldId  = 1,
       
   137     ECircleDbFieldCenterLat,
       
   138     ECircleDbFieldCenterLong,
       
   139     ECircleDbFieldRadius,
       
   140     ECircleDbFieldHysteresis,
       
   141     ECircleDbFieldAreaLeft,
       
   142     ECircleDbFieldAreaRight,
       
   143     ECircleDbFieldAreaTop,
       
   144     ECircleDbFieldAreaBottom,
       
   145     ECircleDbFieldTriggerFiredLat,
       
   146     ECircleDbFieldTriggerFiredLong,
       
   147     ECircleDbFieldTriggerFiredAlt,
       
   148     ECircleDbFieldTriggerFiredHorizAcc,
       
   149     ECircleDbFieldTriggerFiredVertAcc,
       
   150     };
       
   151 
       
   152 // Enums for the column ids in the cellular trigger db
       
   153 enum TCellTriggerDbColNum
       
   154 	{
       
   155 	ECellDbFieldId  = 1,
       
   156 	ECellDbCountryCode,
       
   157 	ECellDbNetworkId,
       
   158 	ECellDbNetworkType,	
       
   159 	ECellDbLocationAreaCode,
       
   160 	ECellDbTriggerCellId,	
       
   161 	};
       
   162 
       
   163 // Enums added for 9.2 TB
       
   164 enum THybridTriggersDbColNum
       
   165     {
       
   166     EHybridDbFieldId = 1,
       
   167     EHybridDataStream
       
   168     };	
       
   169 	
       
   170 // SQL Query related constants
       
   171 const TInt KMaxSqlQueryLength = 256;
       
   172 
       
   173 // If less than the below % of the db is used for legitimate data then compaction is needed
       
   174 const TInt KDatabaseMinUsagePercentage = 60;
       
   175 const TInt KDatabaseMaxWastageBytes = (50 * 1024); // More than 50 KB cannot be wasted
       
   176 const TInt KStepCount(2); // Number of steps to be executed in one step for async operation
       
   177 
       
   178 // Assumption that the worst case time needed for compaction is the amount in seconds defined 
       
   179 // by KSecondsNeededForCompaction
       
   180 const TTimeIntervalSeconds KSecondsNeededForCompaction(15);
       
   181 
       
   182 _LIT(KSelect, "SELECT ");
       
   183 _LIT(KFrom, " FROM ");
       
   184 _LIT(KSelectAllFields, "* ");
       
   185 _LIT(KDelete,"DELETE ");
       
   186 
       
   187 #ifdef _DEBUG
       
   188     _LIT(KLbtCntDbPanic,"LBT: Db ");
       
   189     TInt KLbtCntDbSqlQueryError = -1;
       
   190 #endif
       
   191 
       
   192 // ======== MEMBER FUNCTIONS ========
       
   193 
       
   194 
       
   195 // ---------------------------------------------------------------------------
       
   196 // The Symbian 2 phase constructor
       
   197 // ---------------------------------------------------------------------------
       
   198 //
       
   199 CLbtDbTriggersManager* CLbtDbTriggersManager::NewL( ) 
       
   200     {
       
   201     CLbtDbTriggersManager* self = new(ELeave)CLbtDbTriggersManager( );
       
   202     CleanupStack::PushL( self );
       
   203     self->ConstructL();
       
   204     CleanupStack::Pop( self );
       
   205     return self;
       
   206     }
       
   207     
       
   208 
       
   209 // ---------------------------------------------------------------------------
       
   210 // Destructor
       
   211 // ---------------------------------------------------------------------------
       
   212 //
       
   213 CLbtDbTriggersManager::~CLbtDbTriggersManager()
       
   214     {
       
   215     FUNC_ENTER("CLbtDbTriggersManager::~CLbtDbTriggersManager");
       
   216     // Close all open Handles    
       
   217     delete iDbOperation;
       
   218     delete iSqlQuery;
       
   219     
       
   220     iIdArray.Close();
       
   221     
       
   222     if(iIsDbOpened)
       
   223     	{
       
   224     	// Compact the data base before going down
       
   225     	iDb.Compact();
       
   226     	}    
       
   227     iDb.Close();
       
   228     iFs.Close();
       
   229     }
       
   230 
       
   231 
       
   232 // ---------------------------------------------------------------------------
       
   233 // Specify the types of triggers supported by the Db Trigger Store
       
   234 // ---------------------------------------------------------------------------
       
   235 //
       
   236 TTriggerTypeMask CLbtDbTriggersManager::SupportedTriggerTypes()
       
   237     {
       
   238     return ( CLbtTriggerEntry::ETypeStartup );
       
   239     }
       
   240 
       
   241 
       
   242 // ---------------------------------------------------------------------------
       
   243 // Specify the types of triggers supported by the Db Trigger Store
       
   244 // ---------------------------------------------------------------------------
       
   245 //
       
   246 void CLbtDbTriggersManager::CreateTriggerL( CLbtContainerTriggerEntry &aEntry,
       
   247     										TRequestStatus& aStatus )
       
   248     {
       
   249     FUNC_ENTER("CLbtDbTriggersManager::CreateTriggerL-I");
       
   250     
       
   251     // This is just a safe check. While compaction is ongoing the
       
   252     // request is queued in container AO
       
   253     if(iDbOperation->IsCompactionOngoing())
       
   254     	{
       
   255         TRequestStatus* status = &aStatus;
       
   256     	User::RequestComplete(status, KErrServerBusy);
       
   257     	return;
       
   258     	}
       
   259  	
       
   260     // Save client data for create trigger
       
   261  	iCurrentOperation = EDbOpCreateTrigger;
       
   262     iEntry = &aEntry;
       
   263     iClientReqStatus = &aStatus;
       
   264     
       
   265     TInt size = 500;//ToDo: implement this GetSize( aEntry );
       
   266  	if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFs, size ) )
       
   267  	    {
       
   268  	    // Try Db Compaction in case we don't have enough disk space
       
   269         iDbOperation->CompactDb();
       
   270         iOperationState = EOpCompaction;
       
   271  	    }
       
   272  	else
       
   273  	    {
       
   274  	    iOperationState = EOpStateQuery;
       
   275  	    TInt error = AsyncPrepareViewOfCommonTable();
       
   276  	    
       
   277  	    if( error != KErrNone )
       
   278  	        {
       
   279  	        CompleteClientRequest( error );
       
   280  	        }
       
   281  	    }
       
   282     }
       
   283 
       
   284 // ---------------------------------------------------------------------------
       
   285 // CLbtDbTriggersManager::ResetCurrentStates
       
   286 // ---------------------------------------------------------------------------
       
   287 //
       
   288 void CLbtDbTriggersManager::ResetCurrentStates()
       
   289     {
       
   290     iOperationState = EOpStateNone;
       
   291     iCurrentOperation = EDbOpNone;
       
   292     iEntry = NULL;
       
   293     iClientReqStatus = NULL;
       
   294     iFilter = NULL;
       
   295     delete iFilterBase;
       
   296     iFilterBase = NULL;
       
   297     iView.Close();
       
   298     }
       
   299 
       
   300 // ---------------------------------------------------------------------------
       
   301 // CLbtDbTriggersManager::HandleTriggerCreationEventL
       
   302 // ---------------------------------------------------------------------------
       
   303 //
       
   304 void CLbtDbTriggersManager::HandleTriggerCreationEventL( )
       
   305     {
       
   306     FUNC_ENTER("CLbtDbTriggersManager::HandleTriggerCreationEventL");    
       
   307     
       
   308     switch(iOperationState)
       
   309         {
       
   310         case EOpStateQuery:
       
   311             {
       
   312             // Query is done. Now update the view
       
   313             TRAPD( err, CreateTriggerInViewL() );                        
       
   314             if( err == KErrNone )
       
   315                 {
       
   316                 CLbtTriggerEntry* trigger = iEntry->TriggerEntry();
       
   317                 if((trigger->State() == CLbtTriggerEntry::EStateEnabled) &&
       
   318                    (iEntry->DynInfo()->iValidity == TLbtTriggerDynamicInfo::EValid))
       
   319                     {
       
   320                     iCountOfEnabledAndValidTrigger++;
       
   321                     }
       
   322                 }
       
   323             CompleteClientRequest(err);
       
   324             CompactDbIfRequiredL();
       
   325             break;
       
   326             }
       
   327         case EOpCompaction:
       
   328             {
       
   329             TInt size = 500;//ToDo: implement this GetSize( aEntry );
       
   330             if ( !SysUtil::FFSSpaceBelowCriticalLevelL(&iFs, size) )
       
   331                 {
       
   332                 iOperationState = EOpStateQuery;
       
   333                 TInt error = AsyncPrepareViewOfCommonTable();
       
   334                 if( error != KErrNone )
       
   335                     {
       
   336                     CompleteClientRequest( KErrDiskFull );
       
   337                     }
       
   338                 }
       
   339             else
       
   340                 {
       
   341                 CompleteClientRequest( KErrDiskFull );
       
   342                 }
       
   343             break;
       
   344             }
       
   345         default:
       
   346             {
       
   347             CompleteClientRequest( KErrGeneral );
       
   348             break;
       
   349             }
       
   350         }
       
   351     }
       
   352 
       
   353 // ---------------------------------------------------------------------------
       
   354 // CLbtDbTriggersManager::HandleTriggerUpdationEventL
       
   355 // ---------------------------------------------------------------------------
       
   356 //
       
   357 void CLbtDbTriggersManager::HandleTriggerUpdationEventL()
       
   358     {
       
   359 
       
   360     // Sanity checks to be done here
       
   361     __ASSERT_DEBUG(iView.CountL() < 2, User::Panic(KLbtCntDbPanic, KLbtCntDbSqlQueryError) );
       
   362     
       
   363     switch(iOperationState)
       
   364         {
       
   365         case EOpStateQuery:
       
   366             {
       
   367             iView.FirstL();
       
   368             // check if view is empty, return KErrNotFound
       
   369             if( iView.IsEmptyL() || !iView.AtRow() )
       
   370                 {
       
   371                 CompleteClientRequest( KErrNotFound );
       
   372                 break;
       
   373                 }       
       
   374             // Start iterating through all the triggers in view            
       
   375             iOperationState = EOpStateIterating;
       
   376             iView.FirstL();
       
   377             }
       
   378             // Omitting break is intentional
       
   379        case EOpStateIterating:
       
   380             {  
       
   381             TPtr sql = iSqlQuery->Des();
       
   382             
       
   383             iView.GetL();
       
   384             CLbtContainerTriggerEntry* triggerEntry = RetrieveTriggerEntryFromDbL( iView );    
       
   385             TBool securityCheck = LbtContainerUtilities::RunSecurityPolicy( triggerEntry, iClientSecurityPolicy );
       
   386         
       
   387             if( securityCheck )
       
   388                 {
       
   389                 // if security check has passed then the trigger will be updated
       
   390                 AppendTriggerInfo( triggerEntry );
       
   391                 }
       
   392             else
       
   393                 {
       
   394                 CompleteClientRequest( KErrAccessDenied );
       
   395                 return;
       
   396                 }
       
   397             
       
   398             delete triggerEntry;
       
   399             iView.FirstL();
       
   400             iView.UpdateL();
       
   401         
       
   402             // Check the trigger type and update the appropriate view
       
   403             CLbtGeoAreaBase::TGeoAreaType triggerAreaType = static_cast<CLbtGeoAreaBase::TGeoAreaType>(iView.ColInt8(ELbtDbTriggerAreaType));
       
   404             CLbtStartupTrigger* trigger = static_cast<CLbtStartupTrigger*>(iEntry->TriggerEntry());
       
   405         
       
   406             // Check if the condition itself has to be replaced
       
   407             if( iAttrMask & CLbtTriggerEntry::EAttributeCondition )
       
   408                 {
       
   409                 CLbtTriggerConditionArea* cond=static_cast <CLbtTriggerConditionArea*> (trigger->GetCondition());
       
   410                 CLbtGeoAreaBase* areaBase = cond->TriggerArea();
       
   411             
       
   412                 // The area condition has changed
       
   413                 if( triggerAreaType != areaBase->Type() )
       
   414                     {
       
   415                     // Check if the trigger area type itself has been updated
       
   416                     RemoveTriggerConditionFromDb( iEntry->TriggerEntry()->Id(), triggerAreaType );
       
   417                     switch(areaBase->Type())
       
   418                         {
       
   419                         case CLbtGeoAreaBase::ECircle:
       
   420                             {
       
   421                             AddGeoCircleIntoDbL(trigger);
       
   422                             break;
       
   423                             }
       
   424                         case CLbtGeoAreaBase::ECellular:
       
   425                             {
       
   426                             AddGeoCellIntoDbL(trigger);
       
   427                             break;
       
   428                             }
       
   429                         case CLbtGeoAreaBase::EHybrid:
       
   430                             {
       
   431                             AddGeoHybridIntoDbL(trigger);
       
   432                             break;
       
   433                             }
       
   434                         default:
       
   435                             {
       
   436                             CompleteClientRequest( KErrArgument );
       
   437                             break;
       
   438                             }
       
   439                         }
       
   440                     
       
   441                     // Write the area type
       
   442                     iView.SetColL(ELbtDbTriggerAreaType,static_cast<TInt8>(areaBase->Type()));
       
   443                 
       
   444                     // Negate the Attribute condition so that it is not updated again
       
   445                     iAttrMask = iAttrMask & (~(CLbtTriggerEntry::EAttributeCondition));
       
   446                 
       
   447                     // Update trigger area type
       
   448                     triggerAreaType = areaBase->Type();
       
   449                     }
       
   450             
       
   451                     CLbtTriggerConditionArea::TDirection currentTriggerDirection = 
       
   452                             static_cast<CLbtTriggerConditionArea::TDirection>(iView.ColInt8(ELbtDbFieldDirection));
       
   453                     
       
   454                     if( currentTriggerDirection != cond->Direction() )
       
   455                         {
       
   456                         iView.SetColL( ELbtDbFieldDirection, static_cast<TInt8>((cond->Direction())) );
       
   457                         }
       
   458                     }    
       
   459     
       
   460             CLbtTriggerEntry::TLbtTriggerState currentState = 
       
   461                         static_cast<CLbtTriggerEntry::TLbtTriggerState>(iView.ColInt8(ELbtDbFieldState));
       
   462         
       
   463             if( (iEntry->TriggerEntry()->State() == CLbtTriggerEntry::EStateEnabled) && 
       
   464                 (currentState == CLbtTriggerEntry::EStateDisabled) )
       
   465                  {
       
   466                  iCountOfEnabledAndValidTrigger++;
       
   467                  }
       
   468             else if( (iEntry->TriggerEntry()->State() == CLbtTriggerEntry::EStateDisabled) && 
       
   469                      (currentState == CLbtTriggerEntry::EStateEnabled) )
       
   470                  {
       
   471                  iCountOfEnabledAndValidTrigger--;
       
   472                  }
       
   473         
       
   474             CLbtExtendedTriggerInfo* extdInfo = iEntry->ExtendedTriggerInfo();
       
   475             TLbtTriggerDynamicInfo* trigDynInfo = iEntry->DynInfo();
       
   476             
       
   477             //Check the masks and update the specified attributes
       
   478             if(trigger != NULL)
       
   479                 {
       
   480                 if( iAttrMask & CLbtTriggerEntry::EAttributeId )
       
   481                     {
       
   482                     iView.SetColL( ELbtDbFieldId, static_cast<TInt64>(trigger->Id()) );
       
   483                     }
       
   484         
       
   485                 if( iAttrMask & CLbtTriggerEntry::EAttributeName )
       
   486                     {
       
   487                     iView.SetColL( ELbtDbFieldName, trigger->Name() );
       
   488                     }
       
   489         
       
   490                 if( iAttrMask & CLbtTriggerEntry::EAttributeState )
       
   491                     {
       
   492                     iView.SetColL( ELbtDbFieldState, trigger->State() );
       
   493                     }
       
   494                 
       
   495                 if( iAttrMask & CLbtTriggerEntry::EAttributeRearmTime )
       
   496                     {
       
   497                     iView.SetColL( ELbtDbFieldRearmTime, trigger->TimeToRearm() );
       
   498                     }        
       
   499                 
       
   500                 if( iAttrMask & CLbtTriggerEntry::EAttributeStartUpCommandLine )
       
   501                     {
       
   502                     iView.SetColL( ELbtDbFieldStartupCommandLine, trigger->CommandLine() );          
       
   503                     }
       
   504               
       
   505                 if( iAttrMask & CLbtTriggerEntry::EAttributeCondition )
       
   506                     {
       
   507                     CLbtTriggerConditionArea* cond=static_cast <CLbtTriggerConditionArea*> (trigger->GetCondition());
       
   508                     
       
   509                     switch( triggerAreaType )
       
   510                         {
       
   511                         case CLbtGeoAreaBase::ECircle:
       
   512                             {
       
   513                             //Since the trigger type is circular get the appropriate tuple from the circular trigger table
       
   514                             RDbView circView;
       
   515                             sql.Zero();
       
   516                             sql.Append( KSelect );
       
   517                             sql.Append( KSelectAllFields );
       
   518                             sql.Append( KFrom );
       
   519                             sql.Append( KCircularTriggersTable );
       
   520                             sql.Append( KWhere );
       
   521                             sql.Append( KLbtCircTrigDbFieldId );
       
   522                             sql.Append( KLike );
       
   523                             sql.AppendNum(iEntry->TriggerEntry()->Id());
       
   524                             
       
   525                             TInt error = iDbOperation->ExecuteSyncQuery( circView, sql );
       
   526                             if(error != KErrNone)
       
   527                                 {
       
   528                                 circView.Close();
       
   529                                 User::Leave(error);
       
   530                                 }
       
   531         
       
   532                             CleanupClosePushL(circView);
       
   533                             circView.FirstL();     
       
   534                             if ( circView.IsEmptyL() || !circView.AtRow() )
       
   535                                 {
       
   536                                 CleanupStack::PopAndDestroy(1); //circView
       
   537                                 CompleteClientRequest( KErrNotFound );                                
       
   538                                 return;
       
   539                                 }
       
   540         
       
   541                             circView.UpdateL();
       
   542                             
       
   543                             // The area is of type circle
       
   544                             CLbtGeoCircle* area= static_cast <CLbtGeoCircle*> (cond->TriggerArea());
       
   545                     
       
   546                             circView.SetColL( ECircleDbFieldCenterLat, area->Center().Latitude() );
       
   547                             circView.SetColL( ECircleDbFieldCenterLong, area->Center().Longitude() );
       
   548                             circView.SetColL( ECircleDbFieldRadius, area->Radius() );
       
   549                             
       
   550                             if(extdInfo!=NULL)
       
   551                                 {
       
   552                                 if( iDataMask & CLbtContainerTriggerEntry::EContainerAttributeHysteresisRadius )
       
   553                                     {
       
   554                                     circView.SetColL( ECircleDbFieldHysteresis, extdInfo->HysteresisRadius() );
       
   555                                     }
       
   556                                 
       
   557                                 if( iDataMask & CLbtContainerTriggerEntry::EContainerAttributeRectTriggerArea )
       
   558                                     {                       
       
   559                                     circView.SetColL( ECircleDbFieldAreaLeft, extdInfo->TriggerReactangleArea().iTrigAreaWestLong );
       
   560                                     circView.SetColL( ECircleDbFieldAreaRight, extdInfo->TriggerReactangleArea().iTrigAreaEastLong );
       
   561                                     circView.SetColL( ECircleDbFieldAreaTop, extdInfo->TriggerReactangleArea().iTrigAreaNorthLat );
       
   562                                     circView.SetColL( ECircleDbFieldAreaBottom, extdInfo->TriggerReactangleArea().iTrigAreaSouthLat );
       
   563                                     }
       
   564                                
       
   565                                 if( iDataMask & CLbtContainerTriggerEntry::EContainerAttributeFireInfo )
       
   566                                     {
       
   567                                     TLbtTriggerFireInfo fireInfo = extdInfo->GetFiredInfo();
       
   568                                     TPosition pos;
       
   569                                     fireInfo.iFiredPositionInfo.GetPosition(pos);
       
   570                                   
       
   571                                     circView.SetColL(ECircleDbFieldTriggerFiredLat, pos.Latitude());
       
   572                                     circView.SetColL(ECircleDbFieldTriggerFiredLong, pos.Longitude());
       
   573                                     circView.SetColL(ECircleDbFieldTriggerFiredAlt, pos.Altitude());
       
   574                                     circView.SetColL(ECircleDbFieldTriggerFiredHorizAcc, pos.HorizontalAccuracy());
       
   575                                     circView.SetColL(ECircleDbFieldTriggerFiredVertAcc, pos.VerticalAccuracy());
       
   576                                     }
       
   577                                }
       
   578                             circView.PutL();
       
   579                             CleanupStack::PopAndDestroy(1); // circView
       
   580                             break;
       
   581                             }
       
   582                         case CLbtGeoAreaBase::ECellular:
       
   583                             {
       
   584                             //Since the trigger type is cell get the appropriate tuple from the cell trigger table
       
   585                             RDbView cellView;
       
   586                             sql.Zero();
       
   587                             sql.Append( KSelect );
       
   588                             sql.Append( KSelectAllFields );
       
   589                             sql.Append( KFrom );
       
   590                             sql.Append( KCellTriggersTable );
       
   591                             sql.Append( KWhere );
       
   592                             sql.Append( KLbtCellTrigDbFieldId );
       
   593                             sql.Append( KLike );
       
   594                             sql.AppendNum( iEntry->TriggerEntry()->Id() );
       
   595                             
       
   596                             TInt error = iDbOperation->ExecuteSyncQuery( cellView, sql );      
       
   597                             if( error != KErrNone )
       
   598                                 {
       
   599                                 cellView.Close();
       
   600                                 User::Leave(error);
       
   601                                 }       
       
   602                             
       
   603                             CleanupClosePushL( cellView );
       
   604                             cellView.FirstL();     
       
   605                             if ( cellView.IsEmptyL() || !cellView.AtRow() )
       
   606                                 {
       
   607                                 CleanupStack::PopAndDestroy(); //cellView
       
   608                                 CompleteClientRequest( KErrNotFound );                
       
   609                                 return;
       
   610                                 }
       
   611         
       
   612                             cellView.UpdateL();
       
   613                             
       
   614                             // The area is of type cell             
       
   615                             CLbtGeoCell* cell = static_cast <CLbtGeoCell*> (cond->TriggerArea());
       
   616                             
       
   617                             // Update the cell parameters
       
   618                             
       
   619                             // Update NCC
       
   620                             TLex lex( cell->NetworkCountryCode() );
       
   621                             TUint netCountryCode;
       
   622                             lex.Val( netCountryCode );
       
   623                             cellView.SetColL( ECellDbCountryCode, netCountryCode );
       
   624                             
       
   625                             // Update NIC
       
   626                             lex.Assign( cell->NetworkIdentityCode() );
       
   627                             TUint networkIdentityCode;
       
   628                             lex.Val( networkIdentityCode );             
       
   629                             cellView.SetColL( ECellDbNetworkId, networkIdentityCode );
       
   630                             
       
   631                             // Update Network Type
       
   632                             RMobilePhone::TMobilePhoneNetworkMode nwmode = cell->NetworkType();
       
   633                             if(nwmode == RMobilePhone::ENetworkModeGsm)
       
   634                                 {
       
   635                                 cellView.SetColL( ECellDbNetworkType, RMobilePhone::ENetworkModeGsm );
       
   636                                 }                       
       
   637                             else if(nwmode == RMobilePhone::ENetworkModeWcdma) 
       
   638                                 {
       
   639                                 cellView.SetColL( ECellDbNetworkType, RMobilePhone::ENetworkModeWcdma );
       
   640                                 }
       
   641                     
       
   642                             // Update LAC and Cell Id
       
   643                             cellView.SetColL( ECellDbLocationAreaCode, cell->LocationAreaCode());
       
   644                             cellView.SetColL( ECellDbTriggerCellId, cell->CellId());                    
       
   645                             cellView.PutL();
       
   646                             CleanupStack::PopAndDestroy(1); //cellView
       
   647                             break;
       
   648                             }
       
   649                         case CLbtGeoAreaBase::EHybrid:
       
   650                             {
       
   651                             RDbView hybridView;
       
   652                             sql.Zero();
       
   653                             sql.Append( KSelect );
       
   654                             sql.Append( KSelectAllFields );
       
   655                             sql.Append( KFrom );
       
   656                             sql.Append( KHybridTriggersTable );
       
   657                             sql.Append( KWhere );
       
   658                             sql.Append( KLbtHybridTrigDbFieldId );
       
   659                             sql.Append( KLike );
       
   660                             sql.AppendNum( iEntry->TriggerEntry()->Id() );
       
   661                             
       
   662                             TInt err = iDbOperation->ExecuteSyncQuery(hybridView, sql);    
       
   663                             if( err != KErrNone )
       
   664                                 {
       
   665                                 hybridView.Close();
       
   666                                 User::Leave(err);
       
   667                                 }
       
   668                             CleanupClosePushL(hybridView);                    
       
   669                             
       
   670                             hybridView.FirstL();     
       
   671                             if ( hybridView.IsEmptyL() || !hybridView.AtRow() )
       
   672                                 {
       
   673                                 CleanupStack::PopAndDestroy(); //hybridView
       
   674                                 CompleteClientRequest( KErrNotFound );                        
       
   675                                 return;
       
   676                                 }
       
   677                             
       
   678                             hybridView.UpdateL();
       
   679                             
       
   680                             // cast to hybrid area
       
   681                             CLbtGeoHybrid* hybrid = static_cast<CLbtGeoHybrid *>(cond->TriggerArea());                    
       
   682                             
       
   683                             // Externalize the hybrid areas into the DB
       
   684                             hybridView.SetColNullL( EHybridDataStream );
       
   685                             RDbColWriteStream writeStream;
       
   686                             writeStream.OpenLC(hybridView, EHybridDataStream);            
       
   687                             const RPointerArray<CLbtGeoAreaBase>& hybridAreas = hybrid->HybridArea();            
       
   688                             // Write the count into the the stream
       
   689                             writeStream.WriteInt32L( hybridAreas.Count() );
       
   690                             for( TInt i=0; i<hybridAreas.Count(); ++i )
       
   691                                 {
       
   692                                 // Write the area type
       
   693                                 writeStream.WriteInt32L( hybridAreas[i]->Type() );
       
   694                                 
       
   695                                 // Externalize the area data
       
   696                                 hybridAreas[i]->ExternalizeL(writeStream);
       
   697                                 }
       
   698                             writeStream.CommitL();
       
   699                             writeStream.Close();                    
       
   700                             hybridView.PutL();            
       
   701                             CleanupStack::PopAndDestroy( 2 ); // hybridView, writeStream
       
   702                             break;
       
   703                             }
       
   704                         default:
       
   705                             {
       
   706                             CompleteClientRequest( KErrArgument );
       
   707                             break;
       
   708                             }                    
       
   709                         }
       
   710                     }
       
   711                 }
       
   712             
       
   713              if(extdInfo!=NULL)
       
   714                 {                       
       
   715                 if( iDataMask & CLbtContainerTriggerEntry::EContainerAttributeIsFired )
       
   716                     {
       
   717                     iView.SetColL(ELbtDbFieldIsTriggerFired, extdInfo->IsTriggerFired());
       
   718                     }
       
   719                 
       
   720                 if( iDataMask & CLbtContainerTriggerEntry::EContainerAttributeOwnerSid )
       
   721                     {
       
   722                     iView.SetColL( ELbtDbFieldOwnerSid, extdInfo->OwnerSid().iId );
       
   723                     }        
       
   724                     
       
   725                 if( iDataMask & CLbtContainerTriggerEntry::EContainerAttributeIsTriggerFireOnCreation )
       
   726                     {
       
   727                     iView.SetColL( ELbtDbFieldIsTriggerFireOnCreation, extdInfo->IsTriggerFireOnCreation() );
       
   728                     }       
       
   729                 }
       
   730         
       
   731             if(trigDynInfo != NULL)
       
   732                 {
       
   733                 if( iDataMask & CLbtContainerTriggerEntry::EContainerDynInfoAttributeValidity )
       
   734                     {
       
   735                     iView.SetColL( ELbtDbFieldValidity, static_cast<TInt8>(trigDynInfo->iValidity) );
       
   736                     }
       
   737                 }
       
   738         
       
   739             // Flush the updates into the view/db
       
   740             iView.PutL();
       
   741             CompleteClientRequest( KErrNone );        
       
   742             CompactDbIfRequiredL();
       
   743             break;
       
   744             }
       
   745         default:
       
   746             {
       
   747             CompleteClientRequest( KErrGeneral );
       
   748             break;
       
   749             }
       
   750         }
       
   751     }
       
   752 
       
   753 // ---------------------------------------------------------------------------
       
   754 // CLbtDbTriggersManager::HandleTriggerStateUpdationEventL
       
   755 // ---------------------------------------------------------------------------
       
   756 //
       
   757 void CLbtDbTriggersManager::HandleTriggerStateUpdationEventL()
       
   758     {
       
   759     FUNC_ENTER("CLbtDbTriggersManager::HandleTriggerStateUpdationEventL");    
       
   760     
       
   761     switch(iOperationState)
       
   762         {
       
   763         case EOpStateQuery:
       
   764             {
       
   765             // check if view is empty, return KErrNotFound
       
   766             if( iView.IsEmptyL() )
       
   767                 {
       
   768                 CompleteClientRequest( KErrNotFound );
       
   769                 break;
       
   770                 }       
       
   771             // Start iterating through all the triggers in view            
       
   772             iOperationState = EOpStateIterating;
       
   773             iView.FirstL();
       
   774             }
       
   775             // Omitting break is intentional
       
   776         case EOpStateIterating:
       
   777             {            
       
   778             TUid ownerSid;
       
   779             TUid managerUi;
       
   780             TSecureId startupSid;
       
   781             TInt isTriggerPresent = 0; 
       
   782             TInt count = 0;
       
   783             while( iView.AtRow() && count < KStepCount )
       
   784                 {
       
   785                 ++count;
       
   786                 iView.GetL();    
       
   787                 // Check if the trigger satisfies the security policy
       
   788                 ownerSid.iUid = iView.ColUint32(ELbtDbFieldOwnerSid);
       
   789                 managerUi.iUid = iView.ColUint32(ELbtDbFieldManagerUiSid);
       
   790                 startupSid.iId = iView.ColUint32(ELbtDbFieldStartupSid);
       
   791                 
       
   792                 if( LbtContainerUtilities::RunSecurityPolicy( ownerSid,
       
   793                                                               managerUi,
       
   794                                                               startupSid,
       
   795                                                               iClientSecurityPolicy ) )
       
   796                     {
       
   797                     CLbtContainerTriggerEntry* entry = RetrieveTriggerEntryFromDbL( iView );
       
   798                     CleanupStack::PushL(entry);
       
   799                     
       
   800                     TInt isFilterPresent = 0;
       
   801                     TBool isEntryRequested = EFalse;
       
   802                     
       
   803                     iFilterBase->ProcessFilter(entry, isFilterPresent, isEntryRequested);
       
   804                     
       
   805                     if(isFilterPresent > 0 && isEntryRequested)
       
   806                         {
       
   807                         AppendTriggerInfo(entry);
       
   808                         isTriggerPresent++;
       
   809                         
       
   810                         iView.UpdateL();
       
   811                         iView.SetColL( ELbtDbFieldState, iState );
       
   812                         
       
   813                         if( iFireOnUpdate == ELbtTrue )
       
   814                             {
       
   815                             iView.SetColL( ELbtDbFieldIsTriggerFireOnCreation, ETrue );
       
   816                             }
       
   817                         else if( iFireOnUpdate == ELbtFalse )
       
   818                             {
       
   819                             iView.SetColL( ELbtDbFieldIsTriggerFireOnCreation, EFalse );
       
   820                             }
       
   821                         iView.PutL();
       
   822 
       
   823                         CLbtTriggerEntry* trigEntry = entry->TriggerEntry();
       
   824                                 
       
   825                         if( trigEntry->State() == CLbtTriggerEntry::EStateDisabled && 
       
   826                              iState == CLbtTriggerEntry::EStateEnabled )
       
   827                              {
       
   828                              iCountOfEnabledAndValidTrigger++;
       
   829                              }
       
   830                         else if( trigEntry->State() == CLbtTriggerEntry::EStateEnabled && 
       
   831                              iState == CLbtTriggerEntry::EStateDisabled)
       
   832                              {
       
   833                              iCountOfEnabledAndValidTrigger--;
       
   834                              }
       
   835                         }
       
   836                     CleanupStack::PopAndDestroy(entry);
       
   837                     }       
       
   838                 iView.NextL();       
       
   839                 }
       
   840             
       
   841             if( count >= KStepCount )
       
   842                 {
       
   843                 // Self complete to process next request
       
   844                 SelfComplete();
       
   845                 }
       
   846             else 
       
   847                 {
       
   848                 CompleteClientRequest( KErrNone );                               
       
   849                 CompactDbIfRequiredL();
       
   850                 }
       
   851             }
       
   852             break;
       
   853         default:
       
   854             {
       
   855             CompleteClientRequest( KErrGeneral );
       
   856             break;
       
   857             }
       
   858         }
       
   859     }
       
   860 
       
   861 // ---------------------------------------------------------------------------
       
   862 // CLbtDbTriggersManager::HandleTriggersDeletionEventL
       
   863 // ---------------------------------------------------------------------------
       
   864 //
       
   865 void CLbtDbTriggersManager::HandleTriggersDeletionEventL()
       
   866     {
       
   867     switch( iOperationState )
       
   868         {
       
   869         case EOpStateQuery:
       
   870             {
       
   871             // check if view is empty, return KErrNotFound
       
   872             if( iView.IsEmptyL() )
       
   873                 {
       
   874                 CompleteClientRequest( KErrNotFound );
       
   875                 break;
       
   876                 }
       
   877             
       
   878             // Start iterating through all the triggers in view            
       
   879             iOperationState = EOpStateIterating;
       
   880             iView.FirstL();
       
   881             }
       
   882             // Omitting break is intentional
       
   883         case EOpStateIterating:
       
   884             {
       
   885             TInt count = 0;
       
   886             while( count != KStepCount )
       
   887                 {
       
   888                 ++count;
       
   889                 if( iView.AtRow() )
       
   890                     {
       
   891                     iView.GetL();                            
       
   892                     TUid ownerSid;
       
   893                     TUid managerUi;
       
   894                     TSecureId startupSid;
       
   895                     
       
   896                     ownerSid.iUid = iView.ColUint32( ELbtDbFieldOwnerSid );
       
   897                     managerUi.iUid = iView.ColUint32( ELbtDbFieldManagerUiSid );
       
   898                     startupSid.iId = iView.ColUint32( ELbtDbFieldStartupSid );
       
   899                     
       
   900                     if( LbtContainerUtilities::RunSecurityPolicy( ownerSid,
       
   901                                                                   managerUi,
       
   902                                                                   startupSid,
       
   903                                                                   iClientSecurityPolicy ) )
       
   904                         {
       
   905                         CLbtContainerTriggerEntry* entry = RetrieveTriggerEntryFromDbL( iView );
       
   906                         CleanupStack::PushL( entry );
       
   907                         TInt isFilterPresent = 0;
       
   908                         TBool isEntryRequested = EFalse;
       
   909 
       
   910                         iFilterBase->ProcessFilter(entry, isFilterPresent, isEntryRequested);
       
   911                         if( isFilterPresent > 0 && isEntryRequested )
       
   912                             {
       
   913                             AppendTriggerInfo(entry);
       
   914                             CLbtTriggerEntry* trigEntry = entry->TriggerEntry();
       
   915                             
       
   916                             if( trigEntry->State() == CLbtTriggerEntry::EStateEnabled && 
       
   917                                 entry->DynInfo()->iValidity == TLbtTriggerDynamicInfo::EValid )
       
   918                                 {
       
   919                                 iCountOfEnabledAndValidTrigger--;
       
   920                                 }
       
   921                             
       
   922                             // TODO: Check if this will crash
       
   923                             DeleteTriggerL( entry->TriggerEntry()->Id() );
       
   924                             }
       
   925                         CleanupStack::PopAndDestroy( entry );
       
   926                         }
       
   927                     iView.NextL();
       
   928                     }                
       
   929                 }
       
   930 
       
   931             if( !iView.AtRow() )
       
   932                 {
       
   933                 CompleteClientRequest( KErrNone );
       
   934                 CompactDbIfRequiredL();
       
   935                 }
       
   936             else
       
   937                 {
       
   938                 SelfComplete();
       
   939                 }
       
   940             break;
       
   941             }
       
   942         default:
       
   943             {
       
   944             CompleteClientRequest( KErrGeneral );
       
   945             break;
       
   946             }
       
   947         }
       
   948     }
       
   949 
       
   950 //-------------------------------------------------------------------------------------------------
       
   951 // CLbtDbTriggersManager::HandleGetTriggersEventL
       
   952 //-------------------------------------------------------------------------------------------------
       
   953 // 
       
   954 void CLbtDbTriggersManager::HandleGetTriggersEventL( )
       
   955     {   
       
   956     /**
       
   957       * Once control reaches here it means that the Db Query
       
   958       * "Select * From table Triggers" has been executed and
       
   959       * the view contains all the rows.
       
   960       */
       
   961     
       
   962     TInt count = 0;
       
   963     while( iView.AtRow()  && count < KStepCount )
       
   964         {
       
   965         ++count;
       
   966         iView.GetL();
       
   967         TLbtTriggerId trigId = iView.ColInt64( ELbtDbFieldId );
       
   968         TInt index = iTriggerIds->Find(trigId);
       
   969 
       
   970         if( index != KErrNotFound )
       
   971             {
       
   972             CLbtContainerTriggerEntry* entry = RetrieveTriggerEntryFromDbL( iView );
       
   973             iTriggerIds->Remove( index );
       
   974         
       
   975             if( LbtContainerUtilities::RunSecurityPolicy( entry, iClientSecurityPolicy ) )
       
   976                 {
       
   977                 iTriggers->Append(entry);            
       
   978                 }
       
   979             else
       
   980                 {
       
   981                 delete entry;
       
   982                 }
       
   983             }
       
   984 
       
   985         iView.NextL();
       
   986         }
       
   987 
       
   988     if( count >= KStepCount )
       
   989         {
       
   990         // Self complete to process next request
       
   991         SelfComplete();
       
   992         }
       
   993     else // Operation is over
       
   994         {
       
   995         if(iTriggers->Count() == 0)
       
   996             {
       
   997             CompleteClientRequest( KErrNotFound );
       
   998             }
       
   999         else
       
  1000             {
       
  1001             CompleteClientRequest( KErrNone );
       
  1002             }
       
  1003         }
       
  1004     }
       
  1005 // ---------------------------------------------------------------------------
       
  1006 // CLbtDbTriggersManager::CompleteClientRequest
       
  1007 // ---------------------------------------------------------------------------
       
  1008 //
       
  1009 void CLbtDbTriggersManager::CompleteClientRequest(TInt aError)
       
  1010     {
       
  1011     FUNC_ENTER("CLbtDbTriggersManager::CompleteClientRequest");
       
  1012     if( iClientReqStatus )
       
  1013         User::RequestComplete(iClientReqStatus,aError);
       
  1014     ResetCurrentStates();
       
  1015     }
       
  1016 
       
  1017 // ---------------------------------------------------------------------------
       
  1018 // CLbtDbTriggersManager::AsyncPrepareViewOfCommonTable
       
  1019 // ---------------------------------------------------------------------------
       
  1020 //
       
  1021 TInt CLbtDbTriggersManager::AsyncPrepareViewOfCommonTable()
       
  1022     {
       
  1023     FUNC_ENTER("CLbtDbTriggersManager::PrepareViewsL");
       
  1024     TPtr sql = iSqlQuery->Des();
       
  1025     sql.Zero();
       
  1026     sql.Append( KSelect );
       
  1027     sql.Append( KSelectAllFields );
       
  1028     sql.Append( KFrom );
       
  1029     sql.Append( KTriggersTable );
       
  1030     
       
  1031     // First close the view just as a safe check
       
  1032     iView.Close();
       
  1033     
       
  1034     TInt error = iView.Prepare( iDb, TDbQuery( sql, EDbCompareFolded) );
       
  1035     if( error != KErrNone )
       
  1036         {
       
  1037         iView.Close();
       
  1038         }
       
  1039     else
       
  1040         {
       
  1041         iView.Evaluate(iStatus);
       
  1042         SetActive();
       
  1043         }    
       
  1044     return error;
       
  1045     }
       
  1046 
       
  1047 // ---------------------------------------------------------------------------
       
  1048 // CLbtDbTriggersManager::RetrieveTriggerEntryFromDbL
       
  1049 // Retreives a trigger entry from the first row in the views
       
  1050 // ---------------------------------------------------------------------------
       
  1051 //
       
  1052 CLbtContainerTriggerEntry* CLbtDbTriggersManager::RetrieveTriggerEntryFromDbL( RDbView& aMainView )
       
  1053 	{
       
  1054 	/**
       
  1055 	 * This function is coded under the assumption that aMainView has been initialized
       
  1056 	 * and other views have been un-initialized.
       
  1057  	 */
       
  1058 	FUNC_ENTER("CLbtDbTriggersManager::RetrieveTriggerEntryFromDbL");
       
  1059 	CLbtContainerTriggerEntry* entry = CLbtContainerTriggerEntry::NewL();
       
  1060 	CleanupStack::PushL(entry);
       
  1061 	
       
  1062 	CLbtStartupTrigger* clientEntry = CLbtStartupTrigger::NewL();
       
  1063 	CleanupStack::PushL(clientEntry);
       
  1064 	
       
  1065 	CLbtExtendedTriggerInfo* clientExtInfo = CLbtExtendedTriggerInfo::NewL();
       
  1066 	CleanupStack::PushL(clientExtInfo);
       
  1067 
       
  1068 	CLbtTriggerConditionArea* cond = CLbtTriggerConditionArea::NewL();
       
  1069 	CleanupStack::PushL(cond);
       
  1070 	
       
  1071 	TLbtTriggerId trigId = aMainView.ColInt64(ELbtDbFieldId);
       
  1072 	clientEntry->SetId(trigId);
       
  1073 	clientEntry->SetNameL(aMainView.ColDes16(ELbtDbFieldName));
       
  1074 	CLbtTriggerEntry::TLbtTriggerState state = 
       
  1075 			static_cast <CLbtTriggerEntry::TLbtTriggerState>(aMainView.ColInt8(ELbtDbFieldState));
       
  1076 	clientEntry->SetState(state);
       
  1077 	TSecureId sid;
       
  1078 	sid.iId = aMainView.ColUint32(ELbtDbFieldStartupSid);
       
  1079 	
       
  1080 	TUid managerUi;
       
  1081     managerUi.iUid=aMainView.ColUint32(ELbtDbFieldManagerUiSid);    
       
  1082 	clientEntry->SetManagerUi(managerUi);
       
  1083 	
       
  1084 	clientEntry->SetTimeToRearm( aMainView.ColInt32(ELbtDbFieldRearmTime) );
       
  1085 	
       
  1086 	clientEntry->SetProcessId(aMainView.ColDes16(ELbtDbFieldStartupPath),sid);
       
  1087 	
       
  1088 	clientEntry->SetCommandLineL( aMainView.ColDes16(ELbtDbFieldStartupCommandLine) ); 
       
  1089 	
       
  1090 	TInt fireOnCreation;
       
  1091 	fireOnCreation=aMainView.ColInt(ELbtDbFieldIsTriggerFireOnCreation);
       
  1092     clientExtInfo->SetTriggerFireOnCreation(fireOnCreation); 
       
  1093 	cond->SetDirection(static_cast<CLbtTriggerConditionArea::TDirection>(aMainView.ColInt8(ELbtDbFieldDirection)));
       
  1094 	
       
  1095 	TUid ownerSid;
       
  1096 	ownerSid.iUid=aMainView.ColUint32(ELbtDbFieldOwnerSid);
       
  1097 	clientExtInfo->SetOwnerSid(ownerSid); 
       
  1098    	clientExtInfo->SetTriggerFiredState(aMainView.ColInt(ELbtDbFieldIsTriggerFired)) ;
       
  1099 	
       
  1100 	TLbtTriggerFireInfo fireInfo;
       
  1101 	fireInfo.iAreaType = static_cast<CLbtGeoAreaBase::TGeoAreaType>(aMainView.ColInt8(ELbtDbTriggerAreaType));
       
  1102 	fireInfo.iTriggerId = aMainView.ColInt64(ELbtDbFieldId);
       
  1103 	clientExtInfo->SetFiredInfo(fireInfo);
       
  1104 	
       
  1105 	switch( aMainView.ColInt8(ELbtDbTriggerAreaType) )
       
  1106 	    {
       
  1107 	    case CLbtGeoAreaBase::ECircle:
       
  1108 	        {
       
  1109 	        TPtr sql = iSqlQuery->Des();
       
  1110 	        sql.Zero();
       
  1111 	        sql.Append( KSelect );
       
  1112 	        sql.Append( KSelectAllFields );
       
  1113 	        sql.Append( KFrom );
       
  1114 	        sql.Append( KCircularTriggersTable );
       
  1115 	        sql.Append( KWhere );
       
  1116 	        sql.Append( KLbtCircTrigDbFieldId );
       
  1117 	        sql.Append( KLike );
       
  1118 	        sql.AppendNum(trigId);    
       
  1119 	    
       
  1120 	        RDbView circView;
       
  1121 	        TInt error = iDbOperation->ExecuteSyncQuery( circView, sql );      
       
  1122 	        if(error != KErrNone)
       
  1123 	            {
       
  1124 	            circView.Close();
       
  1125 	            User::Leave(error);
       
  1126 	            }
       
  1127 
       
  1128 	        CleanupClosePushL( circView );
       
  1129 	        circView.FirstL();
       
  1130 	        circView.GetL();
       
  1131 	        TCoordinate center;
       
  1132 	        center.SetCoordinate(circView.ColReal64(ECircleDbFieldCenterLat),circView.ColReal64(ECircleDbFieldCenterLong));
       
  1133 	        CLbtGeoCircle* circle=CLbtGeoCircle::NewL(center,circView.ColReal64(ECircleDbFieldRadius));
       
  1134 	        cond->SetTriggerArea(circle);       
       
  1135 	        clientExtInfo->SetHysteresisRadius(circView.ColReal64(ECircleDbFieldHysteresis));
       
  1136 	        
       
  1137 	        CLbtExtendedTriggerInfo::TLbtTriggerRectArea rect;
       
  1138 	        rect.iTrigAreaSouthLat=circView.ColReal64(ECircleDbFieldAreaBottom);
       
  1139 	        rect.iTrigAreaNorthLat=circView.ColReal64(ECircleDbFieldAreaTop);
       
  1140 	        rect.iTrigAreaEastLong=circView.ColReal64(ECircleDbFieldAreaRight);
       
  1141 	        rect.iTrigAreaWestLong=circView.ColReal64(ECircleDbFieldAreaLeft);
       
  1142 	        clientExtInfo->SetTriggerRectangleArea(rect); 
       
  1143 	        
       
  1144 	        TPosition pos;
       
  1145 	        pos.SetCoordinate( circView.ColReal64(ECircleDbFieldTriggerFiredLat), 
       
  1146                                circView.ColReal64(ECircleDbFieldTriggerFiredLong),
       
  1147                                circView.ColReal32(ECircleDbFieldTriggerFiredAlt) );
       
  1148 	                           
       
  1149 	        TReal32 horAcc = circView.ColReal32(ECircleDbFieldTriggerFiredHorizAcc);
       
  1150 	        TReal32 verAcc = circView.ColReal32(ECircleDbFieldTriggerFiredVertAcc);
       
  1151 	        
       
  1152 	        if ( horAcc != -1)
       
  1153 	            {
       
  1154 	            pos.SetHorizontalAccuracy(horAcc);  
       
  1155 	            }
       
  1156 	        if(verAcc != -1)
       
  1157 	            {
       
  1158 	            pos.SetVerticalAccuracy(verAcc);    
       
  1159 	            }
       
  1160 	        fireInfo.iFiredPositionInfo.SetPosition(pos);
       
  1161 	        CleanupStack::PopAndDestroy(1); // circView
       
  1162 	        break;
       
  1163 	        }
       
  1164 	    case CLbtGeoAreaBase::ECellular:
       
  1165 	        {
       
  1166 	        TPtr sql = iSqlQuery->Des();
       
  1167 	        sql.Zero();
       
  1168 	        sql.Append( KSelect );
       
  1169 	        sql.Append( KSelectAllFields );
       
  1170 	        sql.Append( KFrom );
       
  1171 	        sql.Append( KCellTriggersTable );
       
  1172 	        sql.Append( KWhere );
       
  1173 	        sql.Append( KLbtCellTrigDbFieldId );
       
  1174 	        sql.Append( KLike );
       
  1175 	        sql.AppendNum( trigId );
       
  1176 	        
       
  1177 	        RDbView cellView;
       
  1178 	        TInt error = iDbOperation->ExecuteSyncQuery( cellView, sql );
       
  1179 	        if(error != KErrNone)
       
  1180 	            {
       
  1181 	            cellView.Close();
       
  1182 	            User::Leave(error);
       
  1183 	            }
       
  1184 	        
       
  1185 	        CleanupClosePushL( cellView );
       
  1186 	        cellView.FirstL();
       
  1187 	        cellView.GetL();
       
  1188 	    
       
  1189 	        TUint32 countryCode = cellView.ColUint32(ECellDbCountryCode);
       
  1190 	        TUint32 networkID = cellView.ColUint32(ECellDbNetworkId);
       
  1191 	        RMobilePhone::TMobilePhoneNetworkMode netType = static_cast<RMobilePhone::TMobilePhoneNetworkMode>(cellView.ColInt8(ECellDbNetworkType));
       
  1192 	        TUint32 locAreaCode = cellView.ColUint32(ECellDbLocationAreaCode);
       
  1193 	        TUint32 cellid = cellView.ColUint32(ECellDbTriggerCellId);
       
  1194 	        
       
  1195 	        RMobilePhone::TMobilePhoneNetworkIdentity networkCode;
       
  1196 	        networkCode.AppendNum( networkID );
       
  1197 	        
       
  1198 	        RMobilePhone::TMobilePhoneNetworkCountryCode setCountryCode;
       
  1199 	        setCountryCode.AppendNum( countryCode );
       
  1200 	        
       
  1201 	        CLbtGeoCell* cell= CLbtGeoCell::NewL( netType,
       
  1202 	                                              setCountryCode,
       
  1203 	                                              networkCode, 
       
  1204 	                                              locAreaCode,cellid );
       
  1205 	        cond->SetTriggerArea(cell);
       
  1206 	        CleanupStack::PopAndDestroy(1); // cellView	        
       
  1207 	        break;
       
  1208 	        }
       
  1209 	    case CLbtGeoAreaBase::EHybrid:
       
  1210             {
       
  1211             TPtr sql = iSqlQuery->Des();
       
  1212             RDbView view;
       
  1213             sql.Zero();
       
  1214             sql.Append( KSelect );
       
  1215             sql.Append( KSelectAllFields );
       
  1216             sql.Append( KFrom );
       
  1217             sql.Append( KHybridTriggersTable );
       
  1218             sql.Append( KWhere );
       
  1219             sql.Append( KLbtHybridTrigDbFieldId );
       
  1220             sql.Append( KLike );
       
  1221             sql.AppendNum( trigId );
       
  1222             
       
  1223             TInt error = iDbOperation->ExecuteSyncQuery( view, sql );
       
  1224             if(error != KErrNone)
       
  1225                 {
       
  1226                 view.Close();
       
  1227                 User::Leave(error);
       
  1228                 }
       
  1229             CleanupClosePushL(view);
       
  1230             
       
  1231             view.FirstL();
       
  1232             view.GetL();
       
  1233 
       
  1234             RPointerArray<CLbtGeoAreaBase> areaArray;
       
  1235             CleanupClosePushL( areaArray );
       
  1236             
       
  1237             RDbColReadStream readStream;
       
  1238             readStream.OpenLC(view, EHybridDataStream);
       
  1239             
       
  1240             // Get count of number of area base objects
       
  1241             TInt count = readStream.ReadInt32L();            
       
  1242             for( TInt i=0;i<count;++i )
       
  1243                 {
       
  1244                 // Create appropriate area type object
       
  1245                 CLbtGeoAreaBase* areaBase = NULL;
       
  1246                 switch( readStream.ReadInt32L() )
       
  1247                     {
       
  1248                     case CLbtGeoAreaBase::ECircle:
       
  1249                         {
       
  1250                         areaBase = CLbtGeoCircle::NewLC(); 
       
  1251                         break;
       
  1252                         }
       
  1253                     case CLbtGeoAreaBase::ECellular:
       
  1254                         {
       
  1255                         areaBase = CLbtGeoCell::NewLC();
       
  1256                         break;
       
  1257                         }                    
       
  1258                     default:
       
  1259                         {
       
  1260                         User::Leave( KErrArgument );
       
  1261                         break;
       
  1262                         }
       
  1263                     }
       
  1264                 areaBase->InternalizeL(readStream);
       
  1265                 areaArray.Append(areaBase);
       
  1266                 CleanupStack::Pop(1); //areaBase                
       
  1267                 }
       
  1268             
       
  1269             CLbtGeoHybrid* hybrid = CLbtGeoHybrid::NewLC(areaArray);
       
  1270             // Set the wlan area to the trigger
       
  1271             cond->SetTriggerArea( hybrid ); // cond takes ownership of hybrid            
       
  1272             CleanupStack::Pop(4); // hybrid, readStream, areaArray and view
       
  1273             readStream.Close();
       
  1274             view.Close();
       
  1275             areaArray.Close(); // Ownership of pointers taken by CLbtGeoHybrid
       
  1276             break;
       
  1277             }
       
  1278 	    }
       
  1279 			
       
  1280 	clientEntry->SetCondition(cond);	
       
  1281 	TLbtTriggerDynamicInfo* info = new (ELeave) TLbtTriggerDynamicInfo;
       
  1282 	info->iValidity=static_cast <TLbtTriggerDynamicInfo::TLbtTriggerValidity> (aMainView.ColInt8(ELbtDbFieldValidity));
       
  1283 	info->iDistanceToLatestLocation= aMainView.ColReal32(ELbtDbFieldDistanceToLastLocation) ;
       
  1284 	TPosition firedPosition;
       
  1285 	fireInfo.iFiredPositionInfo.GetPosition( firedPosition );
       
  1286 	info->iFiredLocality = firedPosition;
       
  1287 	
       
  1288 	entry->SetTriggerEntry(clientEntry);    
       
  1289 	entry->SetExtendedTriggerInfo(clientExtInfo);    
       
  1290 	entry->SetDynInfo(info);
       
  1291 	CleanupStack::Pop(4); // entry, clientEntry, clientExtInfo and cond
       
  1292 	return entry;	
       
  1293 	}
       
  1294 
       
  1295 // --------------------------------------------------------------------------
       
  1296 // CLbtDbTriggersManager::GetTriggersL
       
  1297 // ---------------------------------------------------------------------------
       
  1298 //
       
  1299 void CLbtDbTriggersManager::GetTriggersL( RArray<TLbtTriggerId>& aTriggerIds,
       
  1300 										  RPointerArray<CLbtContainerTriggerEntry>& aTriggers, 
       
  1301 										  TLbtSecurityPolicy& aSecurityPolicy,
       
  1302 										  TRequestStatus &aStatus )
       
  1303 	{
       
  1304 	FUNC_ENTER("CLbtDbTriggersManager::GetTriggersL");
       
  1305 	 aStatus = KRequestPending;
       
  1306 	 iClientReqStatus = &aStatus;
       
  1307 	// This is just a safe check. While compaction is ongoing the
       
  1308     // request is queued in container AO
       
  1309     if(iDbOperation->IsCompactionOngoing())
       
  1310     	{
       
  1311     	ERROR("COMPACTION ONGOING.THIS SHOULD NOT HAPPEN", KErrServerBusy);    	
       
  1312     	CompleteClientRequest( KErrServerBusy );
       
  1313     	return;
       
  1314     	}
       
  1315     
       
  1316     iClientSecurityPolicy = aSecurityPolicy;
       
  1317     iTriggers = &aTriggers;
       
  1318     iTriggerIds = &aTriggerIds;
       
  1319     iCurrentOperation = EDbOpGetTriggers;
       
  1320     // Prepare view for triggers
       
  1321     PrepareViewForTriggersL( aTriggerIds, iView );
       
  1322  
       
  1323     // rest of list triggers operation is in the method HandleGetTriggersEventL.
       
  1324     iView.FirstL();
       
  1325     SelfComplete();
       
  1326 	}
       
  1327 
       
  1328 // ---------------------------------------------------------------------------
       
  1329 // List the triggers in database based on filter
       
  1330 // ---------------------------------------------------------------------------
       
  1331 //
       
  1332 void CLbtDbTriggersManager::ListTriggersL( CLbtContainerListOptions* aFilter,
       
  1333     									   RPointerArray < CLbtContainerTriggerEntry >& aTriggers,
       
  1334     									   TLbtSecurityPolicy& aSecurityPolicy,
       
  1335     									   TRequestStatus &aStatus )
       
  1336     {
       
  1337     FUNC_ENTER("CLbtDbTriggersManager::ListTriggersL");
       
  1338     /** 
       
  1339      * Here is the alogirthm to do list triggers. The List Triggers
       
  1340      * has filter based on the various attributes of the trigger like,
       
  1341      * State, Validity, ManagerUi, area, Trigger Id etc.
       
  1342      * In order to list triggers based on these various constraints 
       
  1343      * we would have to construct a nested query. But since Symbian DBMS does
       
  1344      * not support nested queries, the idea is to implement this as follows.
       
  1345      *
       
  1346      * 1. For i = 1 to number of filter attributes in aFilter
       
  1347      * 2.      Construct a SQL query based on the attribute[i] value list.
       
  1348      * 3.      Execute this SQL query on the previously obtained view
       
  1349      * 4.      Obtain a view that contains only rows that have value matching
       
  1350      *             the value list for attribute[i] in aFilter.
       
  1351      * 5. Continue the loop till i < number of filter attributes in aFilter.
       
  1352      * 
       
  1353      * So the idea here is to repeatedly execute the query on the filtered
       
  1354      * list of triggers. Each time the query is executed on the already 
       
  1355      * updated db view.
       
  1356      *
       
  1357      * As of now this is not the Implementation. TODO: Fix this algo later.
       
  1358      */
       
  1359      
       
  1360     // This is just a safe check. While compaction is ongoing the
       
  1361     // request is queued in container AO
       
  1362     aStatus = KRequestPending;
       
  1363     iClientReqStatus = &aStatus;
       
  1364     
       
  1365     if(iDbOperation->IsCompactionOngoing())
       
  1366     	{
       
  1367     	CompleteClientRequest( KErrServerBusy );
       
  1368     	return;
       
  1369     	}
       
  1370 
       
  1371     if( aFilter == NULL )
       
  1372         {
       
  1373         CompleteClientRequest( KErrArgument );
       
  1374         return;
       
  1375         }
       
  1376 
       
  1377     // Check if this filter is application for the type of triggers supported by DB
       
  1378     CLbtListTriggerOptions* options = aFilter->ListOptions();    
       
  1379     if(options)
       
  1380     	{
       
  1381 		if( !IsFilterForDBTriggersL(options->Filter()) )
       
  1382 	    	{
       
  1383 	    	CompleteClientRequest( KErrNotFound );
       
  1384 	        return;
       
  1385 	    	}
       
  1386     	}
       
  1387     
       
  1388     // Store the parameters first for later references
       
  1389     iFilter = aFilter;
       
  1390     iTriggers = &aTriggers;
       
  1391     iClientSecurityPolicy = aSecurityPolicy;
       
  1392     iCurrentOperation = EDbOpListTriggers;
       
  1393 
       
  1394     // Prepare view for listing
       
  1395     PrepareViewForListingL( iView );
       
  1396     
       
  1397     // rest of list triggers operation is in the method HandleListTriggersEventL.
       
  1398     iView.FirstL();
       
  1399     iFilterBase = LbtContainerUtilities::GetContainerFilterFromListOptionsLC(iFilter);
       
  1400     CleanupStack::Pop(1); // iFilterBase
       
  1401     
       
  1402     SelfComplete();    
       
  1403     }
       
  1404 
       
  1405 //---------------------------------------------------------------------------
       
  1406 // CLbtDbTriggersManager::UpdateTriggerL
       
  1407 //---------------------------------------------------------------------------
       
  1408 //
       
  1409 void CLbtDbTriggersManager::UpdateTriggerL( CLbtContainerTriggerEntry& aEntry,
       
  1410     										TLbtTriggerDataMask aDataMask,
       
  1411     										TLbtTriggerAttributeFieldsMask aAttrMask,
       
  1412     										TLbtSecurityPolicy& aSecurityPolicy,
       
  1413     										TRequestStatus& aStatus )	
       
  1414     {
       
  1415     FUNC_ENTER("CLbtDbTriggersManager::UpdateTriggerL");
       
  1416     aStatus = KRequestPending;
       
  1417     iClientReqStatus = &aStatus;    
       
  1418     
       
  1419     // This is just a safe check. While compaction is ongoing the
       
  1420     // request is queued in container AO
       
  1421     if(iDbOperation->IsCompactionOngoing())
       
  1422     	{
       
  1423     	CompleteClientRequest( KErrServerBusy );
       
  1424     	return;
       
  1425     	}
       
  1426 
       
  1427     // Save user provided data
       
  1428     iClientSecurityPolicy = aSecurityPolicy;
       
  1429     iClientReqStatus = &aStatus;
       
  1430     iEntry = &aEntry;
       
  1431     iDataMask = aDataMask;
       
  1432     iAttrMask = aAttrMask;
       
  1433     
       
  1434     // Save the current operation and its state
       
  1435     iCurrentOperation = EDbOpUpdateTriggers;
       
  1436     iOperationState = EOpStateQuery;       
       
  1437     iIdArray.Reset();
       
  1438     
       
  1439     // Get the tuple from common db for which the primary key is the trigger id
       
  1440     TPtr sql = iSqlQuery->Des();
       
  1441     sql.Zero();
       
  1442     sql.Append( KSelect );
       
  1443     sql.Append( KSelectAllFields );
       
  1444     sql.Append( KFrom );
       
  1445     sql.Append( KTriggersTable );
       
  1446     sql.Append( KWhere );
       
  1447     sql.Append( KLbtDbFieldId );
       
  1448     sql.Append( KLike );
       
  1449     sql.AppendNum(aEntry.TriggerEntry()->Id());
       
  1450     
       
  1451     // First close the view just as a safe check
       
  1452     iView.Close();
       
  1453     
       
  1454     TInt error = iView.Prepare( iDb, TDbQuery( sql, EDbCompareFolded) );
       
  1455     if( error != KErrNone )
       
  1456         {
       
  1457         iView.Close();
       
  1458         CompleteClientRequest( error );
       
  1459         }
       
  1460     else
       
  1461         {
       
  1462         iView.Evaluate(iStatus);
       
  1463         SetActive();
       
  1464         }    
       
  1465     }
       
  1466 
       
  1467 //---------------------------------------------------------------------------
       
  1468 // CLbtDbTriggersManager::RemoveTriggerConditionFromDb
       
  1469 //---------------------------------------------------------------------------
       
  1470 //        
       
  1471 void CLbtDbTriggersManager::RemoveTriggerConditionFromDb( TLbtTriggerId aTriggerId, 
       
  1472                                                           CLbtGeoAreaBase::TGeoAreaType aAreaType )
       
  1473 	{
       
  1474 	RDbView view;
       
  1475 	TPtr sql = iSqlQuery->Des();
       
  1476 	
       
  1477 	sql.Zero();
       
  1478     sql.Append( KDelete );
       
  1479     sql.Append( KFrom );
       
  1480     
       
  1481     switch( aAreaType )
       
  1482         {
       
  1483         case CLbtGeoAreaBase::ECircle:
       
  1484             {
       
  1485             sql.Append( KCircularTriggersTable );
       
  1486             sql.Append( KWhere );
       
  1487             sql.Append( KLbtCircTrigDbFieldId );
       
  1488             break;
       
  1489             }
       
  1490         case CLbtGeoAreaBase::ECellular:
       
  1491             {
       
  1492             sql.Append( KCellTriggersTable );
       
  1493             sql.Append( KWhere );
       
  1494             sql.Append( KLbtCellTrigDbFieldId );
       
  1495             break;
       
  1496             }
       
  1497         case CLbtGeoAreaBase::EHybrid:
       
  1498             {
       
  1499             sql.Append( KHybridTriggersTable );
       
  1500             sql.Append( KWhere );
       
  1501             sql.Append( KLbtHybridTrigDbFieldId );
       
  1502             break;
       
  1503             }
       
  1504         }
       
  1505     
       
  1506     sql.Append( KLike );
       
  1507     sql.AppendNum( aTriggerId );
       
  1508     
       
  1509     // Execute the query to delete the entry
       
  1510     iDbOperation->ExecuteSyncQuery( view, sql );
       
  1511    	view.Close();
       
  1512     }
       
  1513 
       
  1514 //---------------------------------------------------------------------------
       
  1515 // CLbtDbTriggersManager::AddGeoCellIntoDbL
       
  1516 //---------------------------------------------------------------------------
       
  1517 //        
       
  1518 void CLbtDbTriggersManager::AddGeoCellIntoDbL( CLbtTriggerEntry* aTriggerEntry )
       
  1519 	{
       
  1520 	// Prepare view for cellular trigger table
       
  1521 	// Create the trigger	
       
  1522 	CLbtTriggerConditionArea* cond=static_cast <CLbtTriggerConditionArea*> (aTriggerEntry->GetCondition());
       
  1523 	if( cond->TriggerArea()->Type() != CLbtGeoAreaBase::ECellular )
       
  1524 	    {
       
  1525 	    User::Leave( KErrArgument );
       
  1526 	    }
       
  1527 	
       
  1528 	CLbtGeoCell* cell = static_cast<CLbtGeoCell* >(cond->TriggerArea());    
       
  1529 	RDbView view;
       
  1530     TPtr cellSql = iSqlQuery->Des();
       
  1531     cellSql.Zero();
       
  1532     cellSql.Append( KSelect );
       
  1533     cellSql.Append( KSelectAllFields );
       
  1534     cellSql.Append( KFrom );
       
  1535     cellSql.Append( KCellTriggersTable );
       
  1536     
       
  1537     TInt err = iDbOperation->ExecuteSyncQuery(view, cellSql);    
       
  1538     if( err != KErrNone )
       
  1539     	{
       
  1540     	view.Close();
       
  1541     	User::Leave(err);
       
  1542     	return;	
       
  1543     	}
       
  1544     CleanupClosePushL(view);
       
  1545 
       
  1546 	view.InsertL();
       
  1547 	view.SetColL( ECellDbFieldId, static_cast<TInt64>(aTriggerEntry->Id()) );
       
  1548 	
       
  1549 	// insert MNC
       
  1550 	TLex lex( cell->NetworkCountryCode() );
       
  1551 	TUint netCountryCode;
       
  1552 	lex.Val( netCountryCode );		
       
  1553 	view.SetColL( ECellDbCountryCode, netCountryCode );
       
  1554 	
       
  1555 	lex.Assign( cell->NetworkIdentityCode() );
       
  1556 	TUint networkIdentityCode;
       
  1557 	lex.Val( networkIdentityCode );		
       
  1558 	view.SetColL( ECellDbNetworkId, networkIdentityCode );
       
  1559 	
       
  1560     RMobilePhone::TMobilePhoneNetworkMode nwmode = cell->NetworkType();
       
  1561     if(nwmode == RMobilePhone::ENetworkModeGsm) 
       
  1562         {
       
  1563         view.SetColL( ECellDbNetworkType, RMobilePhone::ENetworkModeGsm);
       
  1564         }
       
  1565     else if(nwmode == RMobilePhone::ENetworkModeWcdma) 
       
  1566         {
       
  1567         view.SetColL( ECellDbNetworkType, RMobilePhone::ENetworkModeWcdma);
       
  1568         }
       
  1569 	
       
  1570     view.SetColL( ECellDbLocationAreaCode, cell->LocationAreaCode());	
       
  1571     view.SetColL( ECellDbTriggerCellId, cell->CellId());
       
  1572     view.PutL();
       
  1573     CleanupStack::PopAndDestroy(1); // view
       
  1574 	}
       
  1575 	
       
  1576 //---------------------------------------------------------------------------
       
  1577 // CLbtDbTriggersManager::AddGeoCircleIntoDbL
       
  1578 //---------------------------------------------------------------------------
       
  1579 //        
       
  1580 void CLbtDbTriggersManager::AddGeoCircleIntoDbL( CLbtTriggerEntry* aTriggerEntry )
       
  1581 	{
       
  1582 	CLbtTriggerConditionArea* cond = static_cast<CLbtTriggerConditionArea* >(aTriggerEntry->GetCondition());
       
  1583 	CLbtGeoAreaBase * areaBase = cond->TriggerArea();
       
  1584 	if( areaBase->Type() != CLbtGeoAreaBase::ECircle )
       
  1585 	    {
       
  1586         User::Leave( KErrArgument );
       
  1587 	    }
       
  1588 	
       
  1589 	// Prepare view from circlar triggers table
       
  1590 	RDbView view;
       
  1591 	TPtr circSql = iSqlQuery->Des();
       
  1592     circSql.Zero();
       
  1593     circSql.Append( KSelect );
       
  1594     circSql.Append( KSelectAllFields );
       
  1595     circSql.Append( KFrom );
       
  1596     circSql.Append( KCircularTriggersTable );
       
  1597 
       
  1598     TInt err = iDbOperation->ExecuteSyncQuery(view, circSql);    
       
  1599     if( err != KErrNone )
       
  1600     	{
       
  1601     	view.Close();
       
  1602     	User::Leave(err);
       
  1603     	return;	
       
  1604     	}
       
  1605     CleanupClosePushL(view);
       
  1606 	
       
  1607     CLbtGeoCircle* area = static_cast<CLbtGeoCircle* >(cond->TriggerArea());
       
  1608     
       
  1609     view.InsertL();
       
  1610     view.SetColL( ECircleDbFieldId, static_cast<TInt64>(aTriggerEntry->Id()) );	
       
  1611     view.SetColL( ECircleDbFieldCenterLat, area->Center().Latitude() );
       
  1612     view.SetColL( ECircleDbFieldCenterLong, area->Center().Longitude() );
       
  1613     view.SetColL( ECircleDbFieldRadius, area->Radius() );
       
  1614 
       
  1615 	TReal defaultValue = -1;
       
  1616 	TReal32 alt = -1;
       
  1617 	view.SetColL(ECircleDbFieldTriggerFiredLat,defaultValue);
       
  1618 	view.SetColL(ECircleDbFieldTriggerFiredLong,defaultValue);
       
  1619 	view.SetColL(ECircleDbFieldTriggerFiredAlt,alt);    	
       
  1620 	view.SetColL(ECircleDbFieldTriggerFiredHorizAcc,alt);
       
  1621 	view.SetColL(ECircleDbFieldTriggerFiredVertAcc,alt);	
       
  1622 	view.PutL(); // Complete insertion
       
  1623 	CleanupStack::PopAndDestroy(1); // view
       
  1624 	}
       
  1625 
       
  1626 //---------------------------------------------------------------------------
       
  1627 //---------------------------------------------------------------------------
       
  1628 // CLbtDbTriggersManager::AddGeoHybridIntoDbL
       
  1629 //---------------------------------------------------------------------------
       
  1630 //        
       
  1631 void CLbtDbTriggersManager::AddGeoHybridIntoDbL( CLbtTriggerEntry* aTriggerEntry )
       
  1632     {
       
  1633     CLbtTriggerConditionArea* cond = static_cast<CLbtTriggerConditionArea* >(aTriggerEntry->GetCondition());
       
  1634     CLbtGeoAreaBase * areaBase = cond->TriggerArea();
       
  1635     
       
  1636     if( areaBase->Type() != CLbtGeoAreaBase::EHybrid )
       
  1637         {
       
  1638         User::Leave(KErrArgument);
       
  1639         }
       
  1640     
       
  1641     RDbView view;
       
  1642     TPtr hybridSql = iSqlQuery->Des();
       
  1643     hybridSql.Zero();
       
  1644     hybridSql.Append( KSelect );
       
  1645     hybridSql.Append( KSelectAllFields );
       
  1646     hybridSql.Append( KFrom );
       
  1647     hybridSql.Append( KHybridTriggersTable );
       
  1648     
       
  1649     TInt err = iDbOperation->ExecuteSyncQuery(view, hybridSql);    
       
  1650     if( err != KErrNone )
       
  1651         {
       
  1652         view.Close();
       
  1653         User::Leave(err);
       
  1654         }
       
  1655     CleanupClosePushL(view);
       
  1656     view.InsertL();
       
  1657     
       
  1658     // cast to hybrid area
       
  1659     CLbtGeoHybrid* hybrid = static_cast<CLbtGeoHybrid *>(cond->TriggerArea());
       
  1660     
       
  1661     // Set Primary key, trigger id.
       
  1662     view.SetColL( EHybridDbFieldId ,static_cast<TInt32>(aTriggerEntry->Id()) );
       
  1663     
       
  1664     // Externalize the hybrid areas into the DB
       
  1665     view.SetColNullL( EHybridDataStream );
       
  1666     RDbColWriteStream writeStream;
       
  1667     writeStream.OpenLC(view, EHybridDataStream);            
       
  1668     const RPointerArray<CLbtGeoAreaBase>& hybridAreas = hybrid->HybridArea();            
       
  1669     // Write the count into the the stream
       
  1670     writeStream.WriteInt32L( hybridAreas.Count() );
       
  1671     for( TInt i=0; i<hybridAreas.Count(); ++i )
       
  1672         {
       
  1673         // Write the area type
       
  1674         writeStream.WriteInt32L( hybridAreas[i]->Type() );
       
  1675         
       
  1676         // Externalize the area data
       
  1677         hybridAreas[i]->ExternalizeL(writeStream);
       
  1678         }
       
  1679     writeStream.CommitL();
       
  1680     writeStream.Close();    
       
  1681     view.PutL();            
       
  1682     CleanupStack::PopAndDestroy( 2 ); // view, writeStream    
       
  1683     }
       
  1684 
       
  1685 //---------------------------------------------------------------------------
       
  1686 // CLbtDbTriggersManager::UpdateTriggersState
       
  1687 //---------------------------------------------------------------------------
       
  1688 //        
       
  1689 void  CLbtDbTriggersManager::UpdateTriggersStateL( CLbtTriggerEntry::TLbtTriggerState aState,
       
  1690 												   CLbtContainerUpdateFilter* aFilter,
       
  1691 												   TLbtFireOnUpdate aFireOnUpdate,
       
  1692 												   TLbtSecurityPolicy& aSecurityPolicy,
       
  1693 												   TRequestStatus& aStatus )
       
  1694     {
       
  1695     FUNC_ENTER("CLbtDbTriggersManager::UpdateTriggersState");
       
  1696     aStatus = KRequestPending;
       
  1697     iClientReqStatus = &aStatus;   
       
  1698     
       
  1699     // This is just a safe check. While compaction is ongoing the
       
  1700     // request is queued in container AO
       
  1701     if( iDbOperation->IsCompactionOngoing() )
       
  1702     	{    	 	
       
  1703     	CompleteClientRequest( KErrServerBusy );
       
  1704     	return;
       
  1705     	}
       
  1706    
       
  1707     if(aFilter==NULL)
       
  1708         {    
       
  1709         CompleteClientRequest( KErrArgument );   
       
  1710         return;
       
  1711         }
       
  1712     
       
  1713     // Save user provided data
       
  1714      iClientSecurityPolicy = aSecurityPolicy;    
       
  1715      iState = aState;
       
  1716      iFireOnUpdate = aFireOnUpdate;
       
  1717      iFilterBase = LbtContainerUtilities::GetContainerFilterFromUpdateFilterLC( aFilter );
       
  1718      CleanupStack::Pop(1); // iFilterBase
       
  1719      
       
  1720      // Save the current operation and its state
       
  1721      iCurrentOperation = EDbOpUpdateTriggersState;
       
  1722      iOperationState = EOpStateQuery;       
       
  1723      iIdArray.Reset();
       
  1724      
       
  1725      TInt error = AsyncPrepareViewOfCommonTable();
       
  1726             
       
  1727      if( error != KErrNone )
       
  1728         {
       
  1729         CompleteClientRequest( error );
       
  1730         }
       
  1731     }
       
  1732 
       
  1733 // --------------------------------------------------------------------------------------------
       
  1734 // CLbtDbTriggersManager::UpdateTriggersValidity
       
  1735 // --------------------------------------------------------------------------------------------
       
  1736 //                    
       
  1737 void CLbtDbTriggersManager::UpdateTriggersValidityL( TLbtTriggerDynamicInfo::TLbtTriggerValidity aValidity,
       
  1738 												     RArray <TLbtTriggerId>& aTriggerIds,
       
  1739 												     TLbtSecurityPolicy& aSecurityPolicy,
       
  1740 												     TRequestStatus& aStatus )
       
  1741     {
       
  1742     FUNC_ENTER("CLbtDbTriggersManager::UpdateTriggersValidity");
       
  1743     TRequestStatus* status = &aStatus;
       
  1744     aStatus = KRequestPending;
       
  1745     
       
  1746     // This is just a safe check. While compaction is ongoing the
       
  1747     // request is queued in container AO
       
  1748     if(iDbOperation->IsCompactionOngoing())
       
  1749         {       
       
  1750         User::RequestComplete(status, KErrServerBusy);
       
  1751         return;
       
  1752         }
       
  1753     
       
  1754     if(aTriggerIds.Count() == 0)
       
  1755         {
       
  1756         User::RequestComplete(status, KErrArgument);
       
  1757         return;
       
  1758         }
       
  1759 
       
  1760     iIdArray.Reset();
       
  1761     RDbView view;
       
  1762     PrepareViewForTriggersL( aTriggerIds, view );
       
  1763     
       
  1764     CleanupClosePushL( view );
       
  1765     view.FirstL();
       
  1766     while(view.AtRow())
       
  1767         {
       
  1768         view.GetL();
       
  1769         TLbtTriggerId triggerId = view.ColInt64(ELbtDbFieldId);
       
  1770         TInt index = aTriggerIds.Find(triggerId);
       
  1771         
       
  1772         if( KErrNotFound != index )
       
  1773             {
       
  1774             // This trigger is found in this db. So remove the trigger from the list
       
  1775             aTriggerIds.Remove(index);
       
  1776 
       
  1777             // Check if the trigger satisfies the security policy
       
  1778             TUid ownerSid;
       
  1779             TUid managerUi;
       
  1780             TSecureId startupSid;
       
  1781             
       
  1782             ownerSid.iUid = view.ColUint32(ELbtDbFieldOwnerSid);
       
  1783             managerUi.iUid = view.ColUint32(ELbtDbFieldManagerUiSid);
       
  1784             startupSid.iId = view.ColUint32(ELbtDbFieldStartupSid);
       
  1785             
       
  1786             if( LbtContainerUtilities::RunSecurityPolicy( ownerSid,
       
  1787                                                           managerUi,
       
  1788                                                           startupSid,
       
  1789                                                           aSecurityPolicy ) )
       
  1790                 {
       
  1791                 TLbtTriggerDynamicInfo::TLbtTriggerValidity currentValidity= 
       
  1792                         static_cast<TLbtTriggerDynamicInfo::TLbtTriggerValidity>(view.ColInt8(ELbtDbFieldValidity));
       
  1793                 
       
  1794                 if( currentValidity != aValidity )
       
  1795                     {
       
  1796                     view.UpdateL();
       
  1797                     view.SetColL( ELbtDbFieldValidity, static_cast<TInt8>(aValidity) );
       
  1798                     view.PutL();
       
  1799                     
       
  1800                     TLbtTriggerModifiedInfo info;
       
  1801                     info.iTriggerId = triggerId;
       
  1802                     info.iAreaType = static_cast<CLbtGeoAreaBase::TGeoAreaType>(view.ColInt8(ELbtDbTriggerAreaType));;
       
  1803                     iIdArray.Append(info);
       
  1804                     
       
  1805                     if( currentValidity == TLbtTriggerDynamicInfo::EInvalid &&
       
  1806                         aValidity == TLbtTriggerDynamicInfo::EValid)
       
  1807                         {
       
  1808                         iCountOfEnabledAndValidTrigger++;
       
  1809                         }
       
  1810                     else if(currentValidity == TLbtTriggerDynamicInfo::EValid &&
       
  1811                         aValidity == TLbtTriggerDynamicInfo::EInvalid)
       
  1812                         {
       
  1813                         iCountOfEnabledAndValidTrigger--;
       
  1814                         }
       
  1815                     }
       
  1816                 }
       
  1817             }
       
  1818         view.NextL();
       
  1819         }
       
  1820     CleanupStack::PopAndDestroy(); // view
       
  1821     User::RequestComplete( status, KErrNone );
       
  1822     }
       
  1823 
       
  1824 
       
  1825 // --------------------------------------------------------------------------------------------
       
  1826 // CLbtDbTriggersManager::UpdateTriggerFiredStateL
       
  1827 // --------------------------------------------------------------------------------------------
       
  1828 //    
       
  1829 void CLbtDbTriggersManager::UpdateTriggerFiredStateL( RArray<TLbtTriggerId>& aTriggerIds,
       
  1830 													  TBool aFireBool,
       
  1831 								                      TRequestStatus& aStatus )
       
  1832 	{
       
  1833 	FUNC_ENTER("CLbtDbTriggersManager::UpdateTriggerFiredStateL");
       
  1834     TRequestStatus* status = &aStatus;
       
  1835     aStatus = KRequestPending;
       
  1836     
       
  1837     // This is just a safe check. While compaction is ongoing the
       
  1838     // request is queued in container AO
       
  1839     if(iDbOperation->IsCompactionOngoing())
       
  1840     	{
       
  1841     	User::RequestComplete(status, KErrServerBusy);
       
  1842     	return;
       
  1843     	}
       
  1844     
       
  1845     if(aTriggerIds.Count() == 0)
       
  1846     	{
       
  1847     	User::RequestComplete(status, KErrArgument);
       
  1848     	return;
       
  1849     	}
       
  1850     
       
  1851     RDbView view;
       
  1852     PrepareViewForTriggersL( aTriggerIds, view );
       
  1853 
       
  1854   	TBool found = EFalse;
       
  1855   	CleanupClosePushL( view );
       
  1856   	view.FirstL();
       
  1857   	while(view.AtRow())
       
  1858     	{
       
  1859     	view.GetL();
       
  1860     	TLbtTriggerId triggerId = view.ColInt64(ELbtDbFieldId);
       
  1861     	
       
  1862     	if( KErrNotFound != aTriggerIds.Find(triggerId) )
       
  1863     		{
       
  1864     		TBool currentFiredFlag = view.ColInt(ELbtDbFieldIsTriggerFired);
       
  1865  	        found = ETrue;
       
  1866 	 	    if(currentFiredFlag != aFireBool)
       
  1867 	 	    	{
       
  1868 	 	    	view.UpdateL();	
       
  1869 	 	    	view.SetColL( ELbtDbFieldIsTriggerFired, aFireBool );
       
  1870 	 	    	view.PutL();
       
  1871 	 	    	}
       
  1872     		}
       
  1873     	view.NextL();
       
  1874     	}
       
  1875     CleanupStack::PopAndDestroy(); //view
       
  1876 
       
  1877     TInt error = KErrNone;
       
  1878     if(!found)
       
  1879     	{
       
  1880     	error = KErrNotFound;
       
  1881     	}
       
  1882     User::RequestComplete(status, error);
       
  1883 	}
       
  1884     
       
  1885 // --------------------------------------------------------------------------------------------
       
  1886 // CLbtDbTriggersManager::DeleteTriggersL
       
  1887 // --------------------------------------------------------------------------------------------
       
  1888 //
       
  1889 void CLbtDbTriggersManager::DeleteTriggersL( CLbtContainerUpdateFilter* aFilter,
       
  1890 											 TLbtSecurityPolicy& aSecurityPolicy,
       
  1891     										 TRequestStatus& aStatus )
       
  1892     {
       
  1893     FUNC_ENTER("CLbtDbTriggersManager::DeleteTriggersL");
       
  1894     
       
  1895     // Save user provided data
       
  1896     iClientSecurityPolicy = aSecurityPolicy;
       
  1897     iClientReqStatus = &aStatus;
       
  1898     
       
  1899     // This is just a safe check. While compaction is ongoing the
       
  1900     // request is queued in container AO
       
  1901     if(iDbOperation->IsCompactionOngoing())
       
  1902     	{
       
  1903     	CompleteClientRequest( KErrServerBusy );
       
  1904     	return;
       
  1905     	}
       
  1906     	
       
  1907     if(aFilter == NULL)
       
  1908         {        
       
  1909         CompleteClientRequest( KErrArgument );
       
  1910         return;
       
  1911         }
       
  1912     
       
  1913     if( !IsFilterForDBTriggersL(aFilter->TrigInfoFilter()) )
       
  1914     	{
       
  1915     	CompleteClientRequest( KErrNotFound );
       
  1916         return;
       
  1917     	}
       
  1918     
       
  1919     TInt error = AsyncPrepareViewOfCommonTable();            
       
  1920     if( error != KErrNone )
       
  1921         {
       
  1922         CompleteClientRequest( error );
       
  1923         return;
       
  1924         }
       
  1925     
       
  1926     
       
  1927     iFilterBase = LbtContainerUtilities::GetContainerFilterFromUpdateFilterLC( aFilter );
       
  1928     CleanupStack::Pop(1); // iFilterBase
       
  1929     
       
  1930     // Save the current operation and its state
       
  1931     iCurrentOperation = EDbOpDeleteTriggers;
       
  1932     iOperationState = EOpStateQuery;    
       
  1933 	iIdArray.Reset();    
       
  1934     }
       
  1935 
       
  1936 // --------------------------------------------------------------------------
       
  1937 // CLbtDbTriggersManager::SelfComplete
       
  1938 // --------------------------------------------------------------------------
       
  1939 // 
       
  1940 void CLbtDbTriggersManager::SelfComplete()
       
  1941     {
       
  1942     TRequestStatus* status = &iStatus;
       
  1943     iStatus = KRequestPending;
       
  1944     SetActive();
       
  1945     User::RequestComplete(status, KErrNone);
       
  1946     }
       
  1947   
       
  1948 
       
  1949 // --------------------------------------------------------------------------
       
  1950 // CLbtDbTriggersManager::DeleteTriggerL
       
  1951 // --------------------------------------------------------------------------
       
  1952 // 
       
  1953 void CLbtDbTriggersManager::DeleteTriggerL( TLbtTriggerId aTriggerId )
       
  1954     {
       
  1955     FUNC_ENTER("CLbtDbTriggersManager::DeleteTriggerL");
       
  1956         
       
  1957     CLbtGeoAreaBase::TGeoAreaType areaType = 
       
  1958     			static_cast<CLbtGeoAreaBase::TGeoAreaType>( iView.ColInt8(ELbtDbTriggerAreaType) );
       
  1959     
       
  1960     switch( areaType )
       
  1961         {
       
  1962         case CLbtGeoAreaBase::ECircle:
       
  1963             {
       
  1964             TPtr circSql = iSqlQuery->Des();
       
  1965             RDbView circView;
       
  1966             circSql.Zero();
       
  1967             circSql.Append( KSelect );
       
  1968             circSql.Append( KSelectAllFields );
       
  1969             circSql.Append( KFrom );
       
  1970             circSql.Append( KCircularTriggersTable );
       
  1971             circSql.Append( KWhere );
       
  1972             circSql.Append( KLbtCircTrigDbFieldId );
       
  1973             circSql.Append( KLike );
       
  1974             circSql.AppendNum(aTriggerId);
       
  1975 
       
  1976             TInt error = iDbOperation->ExecuteSyncQuery( circView, circSql );      
       
  1977             if(error != KErrNone)
       
  1978                 {
       
  1979                 circView.Close();
       
  1980                 User::Leave(error);
       
  1981                 }
       
  1982             CleanupClosePushL(circView);
       
  1983             circView.FirstL(); 
       
  1984             circView.GetL();
       
  1985             circView.DeleteL();
       
  1986             circView.Close();
       
  1987             CleanupStack::PopAndDestroy(1); // circView
       
  1988             break;
       
  1989             }
       
  1990         case CLbtGeoAreaBase::ECellular:
       
  1991             {
       
  1992             TPtr cellSql = iSqlQuery->Des();
       
  1993             cellSql.Zero();
       
  1994             cellSql.Append( KSelect );
       
  1995             cellSql.Append( KSelectAllFields );
       
  1996             cellSql.Append( KFrom );
       
  1997             cellSql.Append( KCellTriggersTable );
       
  1998             cellSql.Append( KWhere );
       
  1999             cellSql.Append( KLbtCellTrigDbFieldId );
       
  2000             cellSql.Append( KLike );
       
  2001             cellSql.AppendNum(aTriggerId);
       
  2002             
       
  2003             RDbView cellView;
       
  2004             TInt error = iDbOperation->ExecuteSyncQuery( cellView, cellSql );      
       
  2005             if(error != KErrNone)
       
  2006                 {
       
  2007                 cellView.Close();
       
  2008                 User::Leave(error);
       
  2009                 }
       
  2010             CleanupClosePushL(cellView);
       
  2011             cellView.FirstL();
       
  2012             cellView.GetL();
       
  2013             cellView.DeleteL();
       
  2014             cellView.Close();
       
  2015             CleanupStack::PopAndDestroy(1); // cellView
       
  2016             break;
       
  2017             }
       
  2018         case CLbtGeoAreaBase::EHybrid:
       
  2019             {
       
  2020             TPtr cellSql = iSqlQuery->Des();
       
  2021             cellSql.Zero();
       
  2022             cellSql.Append( KSelect );
       
  2023             cellSql.Append( KSelectAllFields );
       
  2024             cellSql.Append( KFrom );
       
  2025             cellSql.Append( KHybridTriggersTable );
       
  2026             cellSql.Append( KWhere );
       
  2027             cellSql.Append( KLbtHybridTrigDbFieldId );
       
  2028             cellSql.Append( KLike );
       
  2029             cellSql.AppendNum(aTriggerId);
       
  2030             
       
  2031             RDbView hybridView;
       
  2032             TInt error = iDbOperation->ExecuteSyncQuery( hybridView, cellSql );      
       
  2033             if(error != KErrNone)
       
  2034                 {
       
  2035                 hybridView.Close();
       
  2036                 User::Leave(error);
       
  2037                 }
       
  2038             CleanupClosePushL(hybridView);
       
  2039             hybridView.FirstL();
       
  2040             hybridView.GetL();
       
  2041             hybridView.DeleteL();
       
  2042             hybridView.Close();
       
  2043             CleanupStack::PopAndDestroy(1); // hybridView            
       
  2044             break;
       
  2045             }
       
  2046         }
       
  2047 
       
  2048     if(iIdArray.Count() == 0)
       
  2049     	{
       
  2050     	MLbtTriggerStore::TLbtTriggerModifiedInfo info;
       
  2051     	info.iTriggerId = aTriggerId;
       
  2052     	info.iAreaType = areaType;
       
  2053     	iIdArray.Append(info);
       
  2054     	}
       
  2055     
       
  2056     iView.DeleteL();
       
  2057     }
       
  2058 
       
  2059 // ---------------------------------------------------------------------------
       
  2060 // CLbtDbTriggersManager::RunL
       
  2061 // ---------------------------------------------------------------------------
       
  2062 //
       
  2063 void CLbtDbTriggersManager::RunL()
       
  2064     {
       
  2065     if( iStatus.Int() != KErrNone )
       
  2066         {
       
  2067         CompleteClientRequest( iStatus.Int() );
       
  2068         return;
       
  2069         }
       
  2070     
       
  2071     switch( iCurrentOperation )
       
  2072         {
       
  2073         case EDbOpCreateTrigger:
       
  2074             {
       
  2075             HandleTriggerCreationEventL();
       
  2076             break;
       
  2077             }
       
  2078         case EDbOpDeleteTriggers:
       
  2079             {
       
  2080             HandleTriggersDeletionEventL();
       
  2081             break;
       
  2082             }
       
  2083         case EDbOpListTriggers:
       
  2084             {
       
  2085             HandleListTriggersEventL();
       
  2086             break;
       
  2087             }
       
  2088         case EDbOpGetTriggers:
       
  2089            {
       
  2090            HandleGetTriggersEventL();
       
  2091            break;
       
  2092            }
       
  2093         case EDbOpUpdateTriggersState:
       
  2094             {
       
  2095             HandleTriggerStateUpdationEventL();
       
  2096             break;
       
  2097             }
       
  2098         case EDbOpUpdateTriggers:
       
  2099            {
       
  2100            HandleTriggerUpdationEventL();
       
  2101            break;
       
  2102            }
       
  2103         default:
       
  2104             {
       
  2105             //CompleteClientRequest( KErrGeneral );
       
  2106             break;
       
  2107             }
       
  2108         }
       
  2109     }
       
  2110 
       
  2111 // ---------------------------------------------------------------------------
       
  2112 // CLbtDbTriggersManager::RunError
       
  2113 // ---------------------------------------------------------------------------
       
  2114 //
       
  2115 TInt CLbtDbTriggersManager::RunError( TInt aError )
       
  2116     {
       
  2117     CompleteClientRequest( aError );
       
  2118     return KErrNone;
       
  2119     }
       
  2120 
       
  2121 // ---------------------------------------------------------------------------
       
  2122 // CLbtDbTriggersManager::DoCancel
       
  2123 // ---------------------------------------------------------------------------
       
  2124 //
       
  2125 void CLbtDbTriggersManager::DoCancel()
       
  2126     {
       
  2127     switch( iOperationState )
       
  2128         {
       
  2129         case EOpCompaction:
       
  2130             {
       
  2131             // Cancel compaction if ongoing
       
  2132             iDbOperation->Cancel();
       
  2133             break;
       
  2134             }
       
  2135         case EOpStateQuery:
       
  2136             {
       
  2137             iView.Cancel();
       
  2138             break;
       
  2139             }
       
  2140         case EOpStateIterating:
       
  2141         default:
       
  2142             {
       
  2143             break;
       
  2144             }
       
  2145         }
       
  2146     }
       
  2147 
       
  2148 // ---------------------------------------------------------------------------
       
  2149 // CLbtDbTriggersManager::PrepareViewForTriggersL
       
  2150 // ---------------------------------------------------------------------------
       
  2151 //    
       
  2152 void CLbtDbTriggersManager::PrepareViewForTriggersL( const RArray<TLbtTriggerId>& aTriggerIds, RDbView& aView )
       
  2153 	{
       
  2154 	FUNC_ENTER("CLbtDbTriggersManager::PrepareViewForTriggersL");
       
  2155 	TPtr sql = iSqlQuery->Des();
       
  2156     sql.Zero();
       
  2157     
       
  2158     if( !aTriggerIds.Count() )
       
  2159     	{
       
  2160     	User::Leave( KErrArgument );
       
  2161     	return;
       
  2162     	}
       
  2163 	
       
  2164 	sql.Append( KSelect );
       
  2165     sql.Append( KSelectAllFields );
       
  2166     sql.Append( KFrom );
       
  2167     sql.Append( KTriggersTable );
       
  2168     sql.Append( KWhere );
       
  2169 	sql.Append( KLbtDbFieldId );
       
  2170 	
       
  2171     if( aTriggerIds.Count() == 1 )
       
  2172     	{
       
  2173 	    sql.Append( KLike );
       
  2174 	    sql.AppendNum( aTriggerIds[0] );
       
  2175     	}
       
  2176     else
       
  2177     	{
       
  2178     	// Find the max and min of trigger ids so that we get only thos triggers
       
  2179     	// that fall into that bracket
       
  2180     	TInt min = 0xFFFFFFFF;
       
  2181     	TInt max = KLbtNullTriggerId;
       
  2182     	
       
  2183     	for(TInt i=0;i<aTriggerIds.Count();++i)
       
  2184     		{
       
  2185     		if(aTriggerIds[i] < min)
       
  2186     			{
       
  2187     			min = aTriggerIds[i];
       
  2188     			}
       
  2189 
       
  2190     		if(aTriggerIds[i] > max)
       
  2191     			{
       
  2192     			max = aTriggerIds[i];
       
  2193     			}
       
  2194     		}
       
  2195     	
       
  2196     	sql.Append( KLessThanEqualTo );
       
  2197     	sql.AppendNum( max );
       
  2198     	sql.Append( KAnd );
       
  2199     	sql.Append( KLbtDbFieldId );
       
  2200     	sql.Append( KGreaterThanEqualTo );
       
  2201     	sql.AppendNum( min );
       
  2202     	}
       
  2203     
       
  2204     TInt err = iDbOperation->ExecuteSyncQuery(aView, sql);    
       
  2205     if( err != KErrNone )
       
  2206     	{
       
  2207     	aView.Close();
       
  2208     	User::Leave(err);
       
  2209     	return;	
       
  2210     	}
       
  2211 	}
       
  2212 
       
  2213 // ---------------------------------------------------------------------------
       
  2214 // CLbtDbTriggersManager::AsyncPrepareViewForTriggersL
       
  2215 // ---------------------------------------------------------------------------
       
  2216 //    
       
  2217 TInt CLbtDbTriggersManager::AsyncPrepareViewForTriggers( const RArray<TLbtTriggerId>& aTriggerIds, RDbView& /*aView*/ )
       
  2218     {
       
  2219     FUNC_ENTER("CLbtDbTriggersManager::PrepareViewForTriggersL");
       
  2220     TPtr sql = iSqlQuery->Des();
       
  2221     sql.Zero();
       
  2222     
       
  2223     if( !aTriggerIds.Count() )
       
  2224         {
       
  2225         return KErrArgument;
       
  2226         }
       
  2227     
       
  2228     sql.Append( KSelect );
       
  2229     sql.Append( KSelectAllFields );
       
  2230     sql.Append( KFrom );
       
  2231     sql.Append( KTriggersTable );
       
  2232     sql.Append( KWhere );
       
  2233     sql.Append( KLbtDbFieldId );
       
  2234     
       
  2235     if( aTriggerIds.Count() == 1 )
       
  2236         {
       
  2237         sql.Append( KLike );
       
  2238         sql.AppendNum( aTriggerIds[0] );
       
  2239         }
       
  2240     else
       
  2241         {
       
  2242         // Find the max and min of trigger ids so that we get only thos triggers
       
  2243         // that fall into that bracket
       
  2244         TInt min = 0xFFFFFFFF;
       
  2245         TInt max = KLbtNullTriggerId;
       
  2246         
       
  2247         for(TInt i=0;i<aTriggerIds.Count();++i)
       
  2248             {
       
  2249             if(aTriggerIds[i] < min)
       
  2250                 {
       
  2251                 min = aTriggerIds[i];
       
  2252                 }
       
  2253 
       
  2254             if(aTriggerIds[i] > max)
       
  2255                 {
       
  2256                 max = aTriggerIds[i];
       
  2257                 }
       
  2258             }
       
  2259         
       
  2260         sql.Append( KLessThanEqualTo );
       
  2261         sql.AppendNum( max );
       
  2262         sql.Append( KAnd );
       
  2263         sql.Append( KLbtDbFieldId );
       
  2264         sql.Append( KGreaterThanEqualTo );
       
  2265         sql.AppendNum( min );
       
  2266         }
       
  2267    iView.Close();
       
  2268    
       
  2269    TInt err = iView.Prepare( iDb, TDbQuery(sql, EDbCompareFolded),KDbUnlimitedWindow );
       
  2270    // This should evaluate the query fully
       
  2271    if ( err == KErrNone )
       
  2272        {
       
  2273        iView.Evaluate(iStatus);
       
  2274        SetActive();
       
  2275        return KErrNone;
       
  2276        }
       
  2277    else
       
  2278        {
       
  2279        iView.Close();
       
  2280        return err;
       
  2281        }
       
  2282     }
       
  2283 
       
  2284 // ---------------------------------------------------------------------------
       
  2285 // CLbtDbTriggersManager::IsFilterForDBTriggersL
       
  2286 // ---------------------------------------------------------------------------
       
  2287 //    
       
  2288 TBool CLbtDbTriggersManager::IsFilterForDBTriggersL( CLbtTriggerFilterBase* aFilter )
       
  2289 	{
       
  2290 	if( aFilter == NULL )
       
  2291 		{
       
  2292 		return ETrue;
       
  2293 		}
       
  2294 	
       
  2295 	if( aFilter->Type() == CLbtTriggerFilterBase::EFilterByAttribute )
       
  2296 		{
       
  2297 		CLbtTriggerFilterByAttribute* attributeFilter = 
       
  2298 			static_cast<CLbtTriggerFilterByAttribute*>(aFilter);
       
  2299 		
       
  2300 		RArray<CLbtTriggerEntry::TType> triggerTypeArray;
       
  2301 		attributeFilter->GetTypeArrayL( triggerTypeArray );
       
  2302 		
       
  2303 		if( triggerTypeArray.Count() )
       
  2304 			{
       
  2305 			// If the trigger type does not have startup triggers then return EFalse
       
  2306 			if( !attributeFilter->IsTriggerTypeInFilter(CLbtTriggerEntry::ETypeStartup) )
       
  2307 				{
       
  2308 				return EFalse;
       
  2309 				}
       
  2310 			}
       
  2311 		triggerTypeArray.Close();
       
  2312 		}	
       
  2313 	return ETrue;
       
  2314 	}
       
  2315 
       
  2316 // ---------------------------------------------------------------------------
       
  2317 // CLbtDbTriggersManager::PrepareViewForListingL
       
  2318 // ---------------------------------------------------------------------------
       
  2319 //    
       
  2320 void CLbtDbTriggersManager::PrepareViewForListingL( RDbView& aView )
       
  2321 	{
       
  2322 	FUNC_ENTER("CLbtDbTriggersManager::PrepareViewsL");
       
  2323 	TPtr sql = iSqlQuery->Des();
       
  2324     sql.Zero();
       
  2325     sql.Append( KSelect );
       
  2326     sql.Append( KSelectAllFields );
       
  2327     sql.Append( KFrom );
       
  2328     sql.Append( KTriggersTable );
       
  2329     // As of now,create trigger operation on db side is implemented synchronously.So using Synchronous version.
       
  2330     
       
  2331     TInt err = iDbOperation->ExecuteSyncQuery( aView, sql );    
       
  2332     if( err != KErrNone )
       
  2333     	{
       
  2334     	aView.Close();
       
  2335     	User::Leave(err);
       
  2336     	return;	
       
  2337     	}
       
  2338 	}
       
  2339     
       
  2340 // ---------------------------------------------------------------------------
       
  2341 // Callback method that gets called when SQL Evaluation is completed.
       
  2342 // ---------------------------------------------------------------------------
       
  2343 //
       
  2344 void CLbtDbTriggersManager::DbSqlOperationCompletedL( TInt error )
       
  2345     {
       
  2346     FUNC_ENTER("CLbtDbTriggersManager::DbSqlOperationCompleted");
       
  2347     switch( iCurrentOperation )
       
  2348         {
       
  2349         case EDbOpCreateTrigger:
       
  2350             {
       
  2351             if ( KErrNone == error )
       
  2352                 {
       
  2353                 TRAP(error, CreateTriggerInViewL());
       
  2354                 }
       
  2355             User::RequestComplete(iClientReqStatus, error);
       
  2356             iClientReqStatus = NULL;
       
  2357             
       
  2358             if(KErrNone == error)
       
  2359             	{
       
  2360             	CompactDbIfRequiredL();
       
  2361             	}
       
  2362             	
       
  2363             iCurrentOperation = EDbOpNone;
       
  2364             }
       
  2365             break;
       
  2366             
       
  2367         default:
       
  2368             break;
       
  2369         }
       
  2370     }
       
  2371 
       
  2372 // ---------------------------------------------------------------------------
       
  2373 // CLbtDbTriggersManager::AppendTriggerInfo
       
  2374 //
       
  2375 // Appends the trigger info into the triggers modified array which is used for
       
  2376 // notifying observers
       
  2377 // ---------------------------------------------------------------------------
       
  2378 //
       
  2379 void CLbtDbTriggersManager::AppendTriggerInfo(CLbtContainerTriggerEntry* aEntry)
       
  2380 	{
       
  2381 	FUNC_ENTER("CLbtDbTriggersManager::AppendTriggerInfo");
       
  2382 	const CLbtTriggerConditionArea* conditionBase = 
       
  2383 			static_cast<const CLbtTriggerConditionArea*>(aEntry->TriggerEntry()->GetCondition());
       
  2384 	CLbtGeoAreaBase* areaBase = conditionBase->TriggerArea();
       
  2385 		    
       
  2386     TLbtTriggerModifiedInfo info;
       
  2387     info.iTriggerId = aEntry->TriggerEntry()->Id();
       
  2388     info.iAreaType = areaBase->Type();
       
  2389     info.iManagerUi = aEntry->TriggerEntry()->ManagerUi();
       
  2390     
       
  2391     TSecureId sid = aEntry->ExtendedTriggerInfo()->OwnerSid();
       
  2392     TUid ownerUid;
       
  2393     ownerUid.iUid = (TInt)(sid.iId);
       
  2394     info.iOwner = ownerUid;
       
  2395     
       
  2396     CLbtTriggerEntry* triggerEntry = aEntry->TriggerEntry();	
       
  2397 	if( triggerEntry->Type() == CLbtTriggerEntry::ETypeStartup)
       
  2398 		{
       
  2399 		CLbtStartupTrigger* startupTrigger = static_cast<CLbtStartupTrigger*>(triggerEntry);
       
  2400 		TSecureId secureId;
       
  2401 		TBuf16<KMaxFileName> fileName;
       
  2402 		startupTrigger->GetProcessId(fileName, secureId);
       
  2403 		TUid startupUid;
       
  2404 		startupUid.iUid = (TInt)(sid.iId);
       
  2405 		info.iStartupProcess = startupUid;
       
  2406 		}
       
  2407 	else
       
  2408 		{
       
  2409 		info.iStartupProcess = KNullUid;
       
  2410 		}
       
  2411         
       
  2412     iIdArray.Append(info);
       
  2413 	}
       
  2414 	
       
  2415 
       
  2416 // -----------------------------------------------------------------------------
       
  2417 // CLbtDbTriggersManager::TriggersModified
       
  2418 // -----------------------------------------------------------------------------
       
  2419 // 
       
  2420 void CLbtDbTriggersManager::TriggersModified(RArray<TLbtTriggerModifiedInfo>& aArray)
       
  2421 	 {
       
  2422 	 for( TInt i = 0;i<iIdArray.Count();i++ )
       
  2423 		 {
       
  2424 		 aArray.Append(iIdArray[i]);	
       
  2425 	     }
       
  2426 	 iIdArray.Reset();
       
  2427 	 } 
       
  2428  
       
  2429 // -----------------------------------------------------------------------------
       
  2430 // CLbtDbTriggersManager::ProcessListTriggers
       
  2431 // -----------------------------------------------------------------------------
       
  2432 //
       
  2433 void CLbtDbTriggersManager::ProcessListTriggers( CLbtContainerTriggerEntry* aEntry, 
       
  2434  												 TLbtTriggerAttributeFieldsMask aAttrMask,
       
  2435  												 TLbtTriggerDynamicInfoFieldsMask aDynInfoMask,
       
  2436  												 TLbtTriggerDataMask aDataMask )
       
  2437  	{
       
  2438  	FUNC_ENTER("CLbtDbTriggersManager::ProcessListTriggers");
       
  2439  	TLbtTriggerDynamicInfo* info = aEntry->DynInfo();
       
  2440     
       
  2441     CLbtStartupTrigger* clientEntry = static_cast<CLbtStartupTrigger*>( aEntry->TriggerEntry() );
       
  2442 
       
  2443     if( !(aDynInfoMask & TLbtTriggerDynamicInfo::EValidityStatus) )
       
  2444         {
       
  2445     	info->iValidity = TLbtTriggerDynamicInfo::EInvalid;
       
  2446     	}
       
  2447   
       
  2448     if( !(aDynInfoMask & TLbtTriggerDynamicInfo::EDistanceToLatestLocation) )
       
  2449         {
       
  2450     	info->iDistanceToLatestLocation = 0;
       
  2451     	}  
       
  2452         
       
  2453     if( !(aAttrMask & CLbtTriggerEntry::EAttributeId ) )
       
  2454     	{
       
  2455     	clientEntry->SetId(0);
       
  2456     	}
       
  2457                     	        
       
  2458     if( !(aAttrMask & CLbtTriggerEntry::EAttributeName) )
       
  2459     	{
       
  2460     	TRAP_IGNORE(clientEntry->SetNameL(KNullDesC));    	
       
  2461     	}   
       
  2462                     	        
       
  2463     if( !(aAttrMask & CLbtTriggerEntry::EAttributeState) )
       
  2464     	{    	
       
  2465     	clientEntry->SetState(CLbtTriggerEntry::EStateEnabled);    	
       
  2466     	} 
       
  2467     	
       
  2468     if( !(aAttrMask & CLbtTriggerEntry::EAttributeRequestor) )
       
  2469     	{
       
  2470     	// TBD
       
  2471     	}
       
  2472                             	
       
  2473     if( !(aAttrMask & CLbtTriggerEntry::EAttributeManagerUi) )
       
  2474     	{
       
  2475         TUid managerUi = TUid::Null();
       
  2476     	clientEntry->SetManagerUi(managerUi);
       
  2477     	}
       
  2478                             	
       
  2479     if( !(aAttrMask & CLbtTriggerEntry::EAttributeCondition) )
       
  2480     	{
       
  2481     	clientEntry->SetCondition(NULL);
       
  2482     	}
       
  2483                             	
       
  2484 	if( !(aAttrMask & CLbtTriggerEntry::EAttributeStartUpProcessId) )
       
  2485 		{
       
  2486 		TSecureId sid(0);		
       
  2487 	    clientEntry->SetProcessId( KNullDesC, sid );
       
  2488 		}
       
  2489 
       
  2490 	if( !(aDataMask & CLbtContainerTriggerEntry::EContainerAttributeRectTriggerArea) )
       
  2491 		{
       
  2492 	
       
  2493 		}
       
  2494  	}
       
  2495  	
       
  2496 //-------------------------------------------------------------------------------------------------
       
  2497 // CLbtDbTriggersManager::CompactDbIfRequiredL
       
  2498 //-------------------------------------------------------------------------------------------------
       
  2499 //
       
  2500 void CLbtDbTriggersManager::CompactDbIfRequiredL()
       
  2501 	{
       
  2502 	FUNC_ENTER("CLbtDbTriggersManager::CompactDbIfRequiredL");
       
  2503 	// First update the stats to get the accurate db size information
       
  2504 	User::LeaveIfError(iDb.UpdateStats());
       
  2505 	RDbDatabase::TSize size = iDb.Size();
       
  2506 	TReal wastedBytes = size.iSize * static_cast<TReal>(100 - size.iUsage)/100;
       
  2507 			
       
  2508 	// Check if the amount of legitimate data present in less than the minimum usage percentage
       
  2509 	if( size.iUsage < KDatabaseMinUsagePercentage &&
       
  2510 	    wastedBytes > KDatabaseMaxWastageBytes )
       
  2511 		{
       
  2512 		TTime currentTime;
       
  2513 		
       
  2514 		// Get the current time
       
  2515 		currentTime.UniversalTime();
       
  2516 		
       
  2517 		// Find the seconds we have to compact
       
  2518 		TTimeIntervalSeconds seconds;
       
  2519 		
       
  2520 		TInt error = currentTime.SecondsFrom(iTimeTillCompaction, seconds);
       
  2521 		
       
  2522 		// If error is not equal to KErrNone that means that iTimeTillCompaction has not been set appropriately
       
  2523 		if(seconds > KSecondsNeededForCompaction || error != KErrNone)
       
  2524 			{
       
  2525 			// Compaction is needed
       
  2526 			iDbOperation->CompactDb();
       
  2527 			}
       
  2528 		}
       
  2529 	}
       
  2530 
       
  2531 //-------------------------------------------------------------------------------------------------
       
  2532 // CLbtDbTriggersManager::HandleListTriggersEventL
       
  2533 //-------------------------------------------------------------------------------------------------
       
  2534 // 
       
  2535 void CLbtDbTriggersManager::HandleListTriggersEventL( )
       
  2536     {    
       
  2537     FUNC_ENTER("CLbtDbTriggersManager::HandleListTriggersEventL");
       
  2538     /**
       
  2539      * Once control reaches here it means that the Db Query
       
  2540      * "Select * From table Triggers" has been executed and
       
  2541      * the view contains all the rows.
       
  2542      */
       
  2543 
       
  2544     CLbtListTriggerOptions* listOptions = iFilter->ListOptions();
       
  2545     TLbtTriggerAttributeFieldsMask attrMask;
       
  2546     TLbtTriggerDynamicInfoFieldsMask dynInfoMask;
       
  2547     listOptions->GetRetrievedFields(attrMask,dynInfoMask);
       
  2548     TLbtTriggerDataMask dataMask = iFilter->DataMask();    
       
  2549 
       
  2550     TUid ownerSid;
       
  2551     TUid managerUi;
       
  2552     TSecureId startupSid;
       
  2553     TInt count = 0;
       
  2554     while( iView.AtRow() && count < KStepCount )
       
  2555     	{
       
  2556     	++count;
       
  2557     	iView.GetL();
       
  2558 		ownerSid.iUid = iView.ColUint32(ELbtDbFieldOwnerSid);
       
  2559     	managerUi.iUid = iView.ColUint32(ELbtDbFieldManagerUiSid);
       
  2560 		startupSid.iId = iView.ColUint32(ELbtDbFieldStartupSid);
       
  2561     	
       
  2562     	if( LbtContainerUtilities::RunSecurityPolicy( ownerSid,
       
  2563     												  managerUi,
       
  2564     												  startupSid,
       
  2565     												  iClientSecurityPolicy ) )
       
  2566     		{
       
  2567     		CLbtContainerTriggerEntry* entry = RetrieveTriggerEntryFromDbL( iView );    	
       
  2568 	    	TInt isFilterPresent = 0;
       
  2569 	    	TBool isEntryRequested = EFalse;	    	
       
  2570 	    	iFilterBase->ProcessFilter(entry, isFilterPresent, isEntryRequested);
       
  2571 
       
  2572 	    	if(isFilterPresent > 0 && isEntryRequested)
       
  2573 	    		{
       
  2574 	    		ProcessListTriggers(entry,attrMask,dynInfoMask,dataMask);
       
  2575 	    		iTriggers->Append(entry);
       
  2576 	    		}
       
  2577 	    	else
       
  2578 	    		{
       
  2579 	    		delete entry;
       
  2580 	    		}
       
  2581     		}
       
  2582 
       
  2583     	iView.NextL();
       
  2584     	}
       
  2585     
       
  2586     if( count >= KStepCount )
       
  2587         {
       
  2588         // Self complete to process next request
       
  2589         SelfComplete();
       
  2590         }
       
  2591     else // Operation is over
       
  2592 	    {
       
  2593 	    if(iTriggers->Count() == 0)
       
  2594 	        {
       
  2595 	        CompleteClientRequest( KErrNotFound );
       
  2596 	        }
       
  2597 	    else
       
  2598 	        {
       
  2599 	        CompleteClientRequest( KErrNone );
       
  2600 	        }
       
  2601 	    }
       
  2602     }
       
  2603 
       
  2604 
       
  2605 // ---------------------------------------------------------------------------
       
  2606 // Callback method that is called when an Incremental operation is executed
       
  2607 // on the database (like database compaction, recovery)
       
  2608 // ---------------------------------------------------------------------------
       
  2609 //
       
  2610 void CLbtDbTriggersManager::DbIncrementalOperationCompleted( TInt /*aError*/ )
       
  2611     {
       
  2612     FUNC_ENTER("CLbtDbTriggersManager::DbIncrementalOperationCompleted");
       
  2613     switch( iCurrentOperation )
       
  2614         {
       
  2615         case EDbOpCreateTrigger:
       
  2616             {
       
  2617             // Even if there is an error, it just means that Db Compaction
       
  2618             // failed. So lets try Create trigger once more even in case of
       
  2619             // failure. There is a remote possibility that some other process
       
  2620             // might have done some cleanup and created enough space for this
       
  2621             // trigger. So ignoring the error from compaction action here
       
  2622             // deliberately.
       
  2623             TInt error = KErrNone;
       
  2624             TRAP( error, HandleTriggerCreationEventL() );
       
  2625             if( error != KErrNone )
       
  2626                 {
       
  2627                 CompleteClientRequest( error );
       
  2628                 }
       
  2629             }
       
  2630             break;
       
  2631         default:
       
  2632         	{
       
  2633         	// Notfy the client that we are ready to serve requests again
       
  2634         	iObserver->NotifyTriggerStoreReadyToServe();
       
  2635         	break;
       
  2636         	}            
       
  2637         }
       
  2638     }
       
  2639 
       
  2640 // ---------------------------------------------------------------------------
       
  2641 // Constructor
       
  2642 // ---------------------------------------------------------------------------
       
  2643 //
       
  2644 CLbtDbTriggersManager::CLbtDbTriggersManager( )
       
  2645     : CActive(CActive::EPriorityStandard),
       
  2646       iDbOperation( NULL ),
       
  2647       iSqlQuery( NULL ),
       
  2648       iCurrentOperation( EDbOpNone ),
       
  2649       iOperationState( EOpStateNone ),
       
  2650       iFilterBase( NULL )
       
  2651     {
       
  2652     CActiveScheduler::Add(this);
       
  2653     iIdArray.Reset();
       
  2654     iCountOfEnabledAndValidTrigger=0;
       
  2655     }
       
  2656 
       
  2657 
       
  2658 // ---------------------------------------------------------------------------
       
  2659 // The 2nd phase Symbian Constructor
       
  2660 // ---------------------------------------------------------------------------
       
  2661 //
       
  2662 void CLbtDbTriggersManager::ConstructL()
       
  2663     {
       
  2664     FUNC_ENTER("CLbtDbTriggersManager::ConstructL");
       
  2665     
       
  2666     // db has not been opened yet
       
  2667     iIsDbOpened = EFalse;
       
  2668     
       
  2669     // Can't do much if the file server open fails. Hence just leave
       
  2670     // with that error code.
       
  2671     User::LeaveIfError(iFs.Connect());
       
  2672     
       
  2673     // Obtain the Db file path
       
  2674     TFileName dbFile;
       
  2675     iFs.SessionPath(dbFile);
       
  2676 
       
  2677     // Create the Database Directory ie the private directory of the process
       
  2678     iFs.MkDirAll(dbFile);
       
  2679     
       
  2680     // Generate the Db file
       
  2681     dbFile.Append(KLbtDbName);
       
  2682     
       
  2683     // Initialize the Database
       
  2684     TInt error = iDb.Open(iFs, dbFile);
       
  2685         
       
  2686     if ( error == KErrNotFound )
       
  2687         {
       
  2688         // The Db does not exist. Create the Db file
       
  2689         User::LeaveIfError(iDb.Create(iFs, dbFile));
       
  2690         CreateTablesInDbL();
       
  2691         }
       
  2692     else
       
  2693         {
       
  2694         User::LeaveIfError( error );
       
  2695         }
       
  2696     
       
  2697     // Successfully opened db
       
  2698     iIsDbOpened = ETrue;
       
  2699     
       
  2700     // Create the Db Operation Active Object
       
  2701     iDbOperation = CLbtDbOperationAO::NewL(iDb, this);
       
  2702 
       
  2703     // Allocate the SQL Query String    
       
  2704     iSqlQuery = HBufC::NewL(KMaxSqlQueryLength);
       
  2705     
       
  2706     iObserver = NULL;
       
  2707     
       
  2708     // List the set of all enabled and valid triggers    
       
  2709     RDbView view;
       
  2710     TPtr sql = iSqlQuery->Des();
       
  2711     sql.Zero();
       
  2712     sql.Append( KSelect );
       
  2713     sql.Append( KSelectAllFields );
       
  2714     sql.Append( KFrom );
       
  2715     sql.Append( KTriggersTable );
       
  2716     sql.Append( KWhere );
       
  2717     sql.Append( KLbtDbFieldValidity );
       
  2718     sql.Append( KLike );
       
  2719     sql.AppendNum( TLbtTriggerDynamicInfo::EValid );
       
  2720     sql.Append( KAnd );
       
  2721     sql.Append( KLbtDbFieldState );
       
  2722     sql.Append( KLike );
       
  2723     sql.AppendNum( CLbtTriggerEntry::EStateEnabled );
       
  2724     
       
  2725     CleanupClosePushL( view );
       
  2726     User::LeaveIfError( iDbOperation->ExecuteSyncQuery( view, sql ) );
       
  2727     iCountOfEnabledAndValidTrigger = view.CountL();
       
  2728     CleanupStack::PopAndDestroy(1); // view
       
  2729     }
       
  2730 
       
  2731 
       
  2732 // ---------------------------------------------------------------------------
       
  2733 // Create the Table in the Database as part of initialization of Container
       
  2734 // ---------------------------------------------------------------------------
       
  2735 //
       
  2736 void CLbtDbTriggersManager::CreateTablesInDbL( )
       
  2737     {
       
  2738     FUNC_ENTER("CLbtDbTriggersManager::CreateTablesInDbL");
       
  2739     CreateCommonTriggerAttributesTableL();
       
  2740     CreateCoordinateTriggersTableL();
       
  2741     CreateCellTriggersTableL();	
       
  2742 	CreateHybridTriggersTableL();
       
  2743     }
       
  2744 
       
  2745 
       
  2746 // --------------------------------------------------------------------------------------------
       
  2747 // CLbtDbTriggersManager::CreateCommonTriggerAttributesTableL
       
  2748 // --------------------------------------------------------------------------------------------
       
  2749 void CLbtDbTriggersManager::CreateCommonTriggerAttributesTableL()
       
  2750     {
       
  2751     CDbColSet* triggerColSet = CDbColSet::NewLC();
       
  2752         
       
  2753     // Id
       
  2754     triggerColSet->AddL(TDbCol(KLbtDbFieldId, EDbColInt64));
       
  2755     
       
  2756     // Name
       
  2757     triggerColSet->AddL(TDbCol(KLbtDbFieldName, EDbColText16, KLbtMaxNameLength - 1));
       
  2758     
       
  2759     // Trigger Type
       
  2760     triggerColSet->AddL(TDbCol(KLbtDbFieldType, EDbColInt8));
       
  2761     
       
  2762     // direction of Trigger (Entry type or Exit type)
       
  2763     triggerColSet->AddL(TDbCol(KLbtDbFieldDirection, EDbColInt8));
       
  2764 
       
  2765    
       
  2766     // SID of the Trigger Creator
       
  2767     triggerColSet->AddL(TDbCol(KLbtDbFieldOwnerSid, EDbColUint32));
       
  2768     
       
  2769     // SID of the Manager UI for this trigger
       
  2770     triggerColSet->AddL(TDbCol(KLbtDbFieldManagerUiSid, EDbColUint32));
       
  2771     
       
  2772     // Time to rearm a trigger
       
  2773     triggerColSet->AddL(TDbCol(KLbtDbFieldRearmTime, EDbColInt32));
       
  2774         
       
  2775     // SID of the trigger handling process
       
  2776     triggerColSet->AddL(TDbCol(KLbtDbFieldStartupSid, EDbColUint32));
       
  2777     
       
  2778     // Absolute path of the trigger handling process 
       
  2779     triggerColSet->AddL(TDbCol(KLbtDbFieldStartupPath, EDbColText16));
       
  2780     
       
  2781     // Commandline parameters for the trigger handling process
       
  2782     triggerColSet->AddL(TDbCol(KLbtDbFieldStartupCommandLine, EDbColText16));
       
  2783     
       
  2784     // State of the trigger
       
  2785     triggerColSet->AddL(TDbCol(KLbtDbFieldState, EDbColInt8));
       
  2786 
       
  2787     // Bool for trigger fire event
       
  2788     triggerColSet->AddL(TDbCol(KLbtDbFieldIsTriggerFired, EDbColBit));
       
  2789 
       
  2790     // The distance of this trigger from the last acquired location in strategy
       
  2791     triggerColSet->AddL(TDbCol(KLbtDbFieldDistanceToLastLocation, EDbColReal32));
       
  2792 
       
  2793     // Validity of the trigger
       
  2794     triggerColSet->AddL(TDbCol(KLbtDbFieldValidity, EDbColInt8));    
       
  2795     
       
  2796     // Trigger Fire on creation flag.
       
  2797     triggerColSet->AddL(TDbCol(KLbtDbFieldIsTriggerFireOnCreation, EDbColBit));
       
  2798 
       
  2799     // Trigger Area type ( Cell/Circular)
       
  2800     triggerColSet->AddL(TDbCol(KLbtDbTriggerAreaType, EDbColInt8));    
       
  2801     
       
  2802     User::LeaveIfError( iDb.CreateTable( KTriggersTable, *triggerColSet ) );
       
  2803     
       
  2804     // Create index key set based on Trigger Id
       
  2805     CDbKey* index = CDbKey::NewLC();
       
  2806     index->AddL(TDbKeyCol(KLbtDbFieldId));
       
  2807     index->AddL(TDbKeyCol(KLbtDbFieldOwnerSid));
       
  2808 
       
  2809     User::LeaveIfError(iDb.CreateIndex(KTriggersIndexId, KTriggersTable, *index));
       
  2810     CleanupStack::PopAndDestroy( 2 ); // index & triggerColSet
       
  2811     }
       
  2812 
       
  2813 // --------------------------------------------------------------------------------------------
       
  2814 // CLbtDbTriggersManager::CreateCoordinateTriggersTableL
       
  2815 // --------------------------------------------------------------------------------------------
       
  2816 void CLbtDbTriggersManager::CreateCoordinateTriggersTableL()
       
  2817     {
       
  2818     CDbColSet* circTriggerColSet = CDbColSet::NewLC();
       
  2819         
       
  2820     // Id
       
  2821 	circTriggerColSet->AddL(TDbCol(KLbtCircTrigDbFieldId, EDbColInt64));
       
  2822 	 // Trigger Condition center latitude
       
  2823 	circTriggerColSet->AddL(TDbCol(KLbtDbFieldCenterLat, EDbColReal64));
       
  2824 
       
  2825     // Trigger Condition center longitude
       
  2826     circTriggerColSet->AddL(TDbCol(KLbtDbFieldCenterLong, EDbColReal64));
       
  2827 
       
  2828     // Trigger Condition radius
       
  2829     circTriggerColSet->AddL(TDbCol(KLbtDbFieldRadius, EDbColReal64));
       
  2830 
       
  2831     // Trigger Condition Hysteresis radius
       
  2832     circTriggerColSet->AddL(TDbCol(KLbtDbFieldHysteresis, EDbColReal64));
       
  2833 
       
  2834     // The Square approximation of the trigger condition area. Used by 
       
  2835     // supervision for better supervision alogrithm.
       
  2836     circTriggerColSet->AddL(TDbCol(KLbtDbFieldAreaLeft, EDbColReal64));
       
  2837     
       
  2838     circTriggerColSet->AddL(TDbCol(KLbtDbFieldAreaRight, EDbColReal64));
       
  2839     
       
  2840     circTriggerColSet->AddL(TDbCol(KLbtDbFieldAreaTop, EDbColReal64));
       
  2841     
       
  2842     circTriggerColSet->AddL(TDbCol(KLbtDbFieldAreaBottom, EDbColReal64));
       
  2843     
       
  2844     circTriggerColSet->AddL(TDbCol(KLbtDbFieldTriggerFiredLat, EDbColReal64));
       
  2845     
       
  2846     circTriggerColSet->AddL(TDbCol(KLbtDbFieldTriggerFiredLong, EDbColReal64));
       
  2847 
       
  2848 	circTriggerColSet->AddL(TDbCol(KLbtDbFieldTriggerFiredAlt, EDbColReal32));
       
  2849     circTriggerColSet->AddL(TDbCol(KLbtDbFieldTriggerFiredHorizAcc, EDbColReal32));
       
  2850     
       
  2851     circTriggerColSet->AddL(TDbCol(KLbtDbFieldTriggerFiredVertAcc, EDbColReal32));
       
  2852     
       
  2853     // Cell id stream for cell ids of the area. Hybrid info
       
  2854     circTriggerColSet->AddL(TDbCol(KLbtDbFieldCellIdStream, EDbColLongText8));
       
  2855     User::LeaveIfError( iDb.CreateTable( KCircularTriggersTable, *circTriggerColSet ) );
       
  2856 
       
  2857     // Create index key set based on Trigger Id
       
  2858     CDbKey* circindex = CDbKey::NewLC();
       
  2859     circindex->AddL( TDbKeyCol(KLbtCircTrigDbFieldId) );
       
  2860 
       
  2861     User::LeaveIfError( iDb.CreateIndex(KCircTriggersIndexId, KCircularTriggersTable, *circindex) );
       
  2862     CleanupStack::PopAndDestroy( 2 ); // circindex & circTriggerColSet
       
  2863     }
       
  2864 
       
  2865 // --------------------------------------------------------------------------------------------
       
  2866 // CLbtDbTriggersManager::CreateCellTriggersTableL
       
  2867 // --------------------------------------------------------------------------------------------
       
  2868 void CLbtDbTriggersManager::CreateCellTriggersTableL( )
       
  2869     {
       
  2870     CDbColSet* cellTriggerColSet = CDbColSet::NewLC();
       
  2871 
       
  2872     // Cell Based Triggering : Create new col set for cell triggers and add fields
       
  2873     
       
  2874     // Id
       
  2875     cellTriggerColSet->AddL(TDbCol(KLbtCellTrigDbFieldId, EDbColInt64));
       
  2876     
       
  2877     // MCC
       
  2878  	cellTriggerColSet->AddL(TDbCol(KLbtCellTrigDbCountryCode, EDbColUint32));
       
  2879  	
       
  2880  	// MNC
       
  2881  	cellTriggerColSet->AddL(TDbCol(KLbtCellTrigDbNetworkId, EDbColUint32));
       
  2882  	
       
  2883  	// Network Type (GSM/WCDMA)
       
  2884  	cellTriggerColSet->AddL(TDbCol(KLbtCellTrigDbNetworkType, EDbColInt8));
       
  2885  	
       
  2886  	// LAC
       
  2887  	cellTriggerColSet->AddL(TDbCol(KLbtCellTrigDbLAC, EDbColUint32));
       
  2888  	
       
  2889  	// Cell ID
       
  2890  	cellTriggerColSet->AddL(TDbCol(KLbtCellTrigDbCellId, EDbColUint32)); 	
       
  2891  	
       
  2892  	User::LeaveIfError( iDb.CreateTable( KCellTriggersTable, *cellTriggerColSet ) );
       
  2893 	CleanupStack::PopAndDestroy( cellTriggerColSet );
       
  2894   
       
  2895 	// Create index key set based on Trigger Id
       
  2896 	CDbKey* cellindex = CDbKey::NewLC();
       
  2897 	cellindex->AddL(TDbKeyCol(KLbtCellTrigDbFieldId));
       
  2898 	
       
  2899     User::LeaveIfError(iDb.CreateIndex(KCellTriggersIndexId, KCellTriggersTable, *cellindex));
       
  2900     CleanupStack::PopAndDestroy(cellindex);
       
  2901     }
       
  2902 
       
  2903 // --------------------------------------------------------------------------------------------
       
  2904 // CLbtDbTriggersManager::CreateHybridTriggersTableL
       
  2905 // --------------------------------------------------------------------------------------------
       
  2906 void CLbtDbTriggersManager::CreateHybridTriggersTableL()
       
  2907     {
       
  2908     // Hybrid Triggers table : Create new column set
       
  2909     CDbColSet* hybridTriggerColSet = CDbColSet::NewLC();    
       
  2910 
       
  2911     // Id
       
  2912     hybridTriggerColSet->AddL( TDbCol(KLbtHybridTrigDbFieldId, EDbColUint32) );
       
  2913     
       
  2914     // Hybrid area base stream
       
  2915     hybridTriggerColSet->AddL( TDbCol(KLbtHybridDataStream, EDbColLongText8) );    
       
  2916     
       
  2917     User::LeaveIfError( iDb.CreateTable( KHybridTriggersTable, *hybridTriggerColSet ) );
       
  2918     CleanupStack::PopAndDestroy( hybridTriggerColSet );
       
  2919   
       
  2920     // Create index key set based on Trigger Id
       
  2921     CDbKey* cellindex = CDbKey::NewLC();
       
  2922     cellindex->AddL( TDbKeyCol(KLbtHybridTrigDbFieldId) );
       
  2923 
       
  2924     User::LeaveIfError( iDb.CreateIndex(KHybridTriggersIndexId, KHybridTriggersTable, *cellindex) );
       
  2925     CleanupStack::PopAndDestroy(cellindex);
       
  2926     }    
       
  2927 
       
  2928 // --------------------------------------------------------------------------------------------
       
  2929 // CLbtDbTriggersManager::CreateTriggerInViewL
       
  2930 // --------------------------------------------------------------------------------------------
       
  2931 void CLbtDbTriggersManager::CreateTriggerInViewL()
       
  2932     {
       
  2933     FUNC_ENTER("CLbtDbTriggersManager::CreateTriggerInViewL");
       
  2934     
       
  2935     CLbtStartupTrigger* trigger = static_cast<CLbtStartupTrigger* >(iEntry->TriggerEntry());
       
  2936     TLbtTriggerDynamicInfo* dynInfo = iEntry->DynInfo();
       
  2937     CLbtExtendedTriggerInfo* extdInfo = iEntry->ExtendedTriggerInfo();
       
  2938     CLbtTriggerConditionArea* cond = static_cast<CLbtTriggerConditionArea* >(trigger->GetCondition());
       
  2939     CLbtGeoAreaBase * areaBase = cond->TriggerArea();
       
  2940     
       
  2941     // Insert a Row in the View
       
  2942     iView.InsertL();  // Insert a row. Column order matches sql select statement
       
  2943 	
       
  2944 	 /* Cell Based Triggering : add fields in the various views based on the field values*/
       
  2945     iView.SetColL( ELbtDbFieldId, static_cast<TInt64>(trigger->Id()) );
       
  2946     iView.SetColL( ELbtDbFieldName, trigger->Name() );
       
  2947     iView.SetColL( ELbtDbFieldType, static_cast<TInt8>(trigger->Type()) );
       
  2948     iView.SetColL( ELbtDbFieldDirection, static_cast<TInt8>((cond->Direction())) );
       
  2949     iView.SetColL( ELbtDbFieldOwnerSid, extdInfo->OwnerSid().iId );
       
  2950     iView.SetColL( ELbtDbFieldManagerUiSid, static_cast<TUint32>(trigger->ManagerUi().iUid) ); 	
       
  2951     iView.SetColL( ELbtDbFieldRearmTime, trigger->TimeToRearm() );
       
  2952  	
       
  2953  	HBufC* startupProcFile = HBufC::NewLC( KMaxFileName );
       
  2954     TPtr startupFile = startupProcFile->Des();
       
  2955     TSecureId startupProcSid;
       
  2956  	trigger->GetProcessId( startupFile, startupProcSid );
       
  2957  	iView.SetColL( ELbtDbFieldStartupSid, startupProcSid );
       
  2958  	iView.SetColL( ELbtDbFieldStartupPath, *startupProcFile );
       
  2959  	CleanupStack::PopAndDestroy( startupProcFile );
       
  2960 
       
  2961  	iView.SetColL( ELbtDbFieldStartupCommandLine, trigger->CommandLine() );
       
  2962  	iView.SetColL( ELbtDbFieldState, trigger->State() );
       
  2963  	iView.SetColL(ELbtDbFieldIsTriggerFired, extdInfo->IsTriggerFired());
       
  2964  	iView.SetColL(ELbtDbFieldDistanceToLastLocation, static_cast<TReal32>(0.0) );
       
  2965  	iView.SetColL( ELbtDbFieldValidity, static_cast<TInt8>(dynInfo->iValidity) );
       
  2966  	iView.SetColL( ELbtDbFieldIsTriggerFireOnCreation, extdInfo->IsTriggerFireOnCreation() );
       
  2967  	
       
  2968     /* add local enum */
       
  2969  	iView.SetColL(ELbtDbTriggerAreaType,static_cast<TInt8>(areaBase->Type() ));
       
  2970  	
       
  2971  	iView.PutL(); // Complete insertion
       
  2972  	iView.Close();
       
  2973    
       
  2974     switch(areaBase->Type())
       
  2975         {
       
  2976         case CLbtGeoAreaBase::ECircle:
       
  2977             {
       
  2978             AddGeoCircleIntoDbL(trigger);
       
  2979             break;
       
  2980             }
       
  2981         case CLbtGeoAreaBase::ECellular:
       
  2982             {
       
  2983             AddGeoCellIntoDbL(trigger);
       
  2984             break;
       
  2985             }
       
  2986         case CLbtGeoAreaBase::EHybrid:
       
  2987             {
       
  2988             AddGeoHybridIntoDbL(trigger);
       
  2989             break;
       
  2990             }        
       
  2991         default:
       
  2992             {
       
  2993             break;
       
  2994             }
       
  2995         }
       
  2996     }
       
  2997 
       
  2998 //---------------------------------------------------------------------------
       
  2999 // CLbtDbTriggersManager::GetCountOfEnabledAndValidTriggers
       
  3000 //---------------------------------------------------------------------------
       
  3001 //
       
  3002 TInt CLbtDbTriggersManager::GetCountOfEnabledAndValidTriggers()
       
  3003 	{
       
  3004 	return iCountOfEnabledAndValidTrigger;
       
  3005 	}
       
  3006 
       
  3007 
       
  3008 //---------------------------------------------------------------------------
       
  3009 // CLbtDbTriggersManager::SetTimeTillCompaction
       
  3010 //---------------------------------------------------------------------------
       
  3011 //
       
  3012 void CLbtDbTriggersManager::SetTimeTillCompaction(TTime aTime)
       
  3013 	{
       
  3014 	iTimeTillCompaction = aTime;
       
  3015 	}
       
  3016 
       
  3017 //---------------------------------------------------------------------------
       
  3018 // CLbtDbTriggersManager::IsStoreBusy
       
  3019 //---------------------------------------------------------------------------
       
  3020 //
       
  3021 TBool CLbtDbTriggersManager::IsStoreBusy()
       
  3022 	{
       
  3023 	return iDbOperation->IsCompactionOngoing();
       
  3024 	}
       
  3025 
       
  3026 //---------------------------------------------------------------------------
       
  3027 // CLbtDbTriggersManager::SetStoreChangeObserver
       
  3028 //---------------------------------------------------------------------------
       
  3029 //
       
  3030 void CLbtDbTriggersManager::SetStoreChangeObserver(MLbtTriggerStoreObserver* aObserver)
       
  3031 	{
       
  3032 	iObserver = aObserver;
       
  3033 	}
       
  3034 
       
  3035 //---------------------------------------------------------------------------
       
  3036 // CLbtDbTriggersManager::CancelCurrentOperation
       
  3037 //---------------------------------------------------------------------------
       
  3038 //
       
  3039 TInt CLbtDbTriggersManager::CancelCurrentOperation()
       
  3040     {   
       
  3041     TInt error = KErrCancel;
       
  3042     switch( iCurrentOperation )
       
  3043         {
       
  3044         case EDbOpDeleteTriggers:
       
  3045             {
       
  3046             if( !iView.AtEnd() && !iView.AtBeginning() )
       
  3047                 {
       
  3048                 error = KLbtErrPartial;
       
  3049                 }
       
  3050             break;
       
  3051             }
       
  3052         case EDbOpUpdateTriggersState:
       
  3053             {
       
  3054             if( !iView.AtEnd() && !iView.AtBeginning() )
       
  3055                 {
       
  3056                 error = KLbtErrPartial;
       
  3057                 }
       
  3058             break;
       
  3059             }
       
  3060         }
       
  3061     CompleteClientRequest( KErrCancel );
       
  3062     Cancel();
       
  3063     return error;
       
  3064     }
       
  3065 	
       
  3066 // end of file
       
  3067 
       
  3068