locationtriggering/ltserver/ltserverlogic/src/lbtsimchangehandler.cpp
changeset 56 4e949f03ecc5
child 39 3efc7a0e8755
equal deleted inserted replaced
-1:000000000000 56:4e949f03ecc5
       
     1 /*
       
     2 * Copyright (c) 2008 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:  Sim change handler class definition
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32property.h> 
       
    20 #include <commdb.h>
       
    21 #include <startupdomainpskeys.h>
       
    22 #include "lbtgeocell.h"
       
    23 #include "lbttriggerfilterbyarea.h"
       
    24 #include "lbtlisttriggeroptions.h"
       
    25 #include "lbtcontainerlistoptions.h"
       
    26 #include "lbtcontainer.h"
       
    27 #include "lbtsessiontrigger.h"
       
    28 #include "lbtstartuptrigger.h"
       
    29 #include "lbttriggerconditionbase.h"
       
    30 #include "lbttriggerconditionarea.h"
       
    31 #include "lbtlisttriggeroptions.h"
       
    32 #include "lbtsimchangehandler.h"
       
    33 #include "lbtcleanuphandler.h"
       
    34 #include "lbtserverlogictriggerchangeobserver.h"
       
    35 #include "lbtlogger.h"
       
    36 
       
    37 // ======== LOCAL FUNCTIONS ========
       
    38 
       
    39 // ---------------------------------------------------------------------------
       
    40 // CLbtSimChangeHandler::NewL
       
    41 // ---------------------------------------------------------------------------
       
    42 //
       
    43 CLbtSimChangeHandler* CLbtSimChangeHandler::NewL( CLbtContainer& aContainer,
       
    44                                                   CLbtCleanupHandler& aCleanupHandler,
       
    45                                                   MLbtServerLogicTriggerChangeObserver& aTriggerChangeObserver )
       
    46     {
       
    47     FUNC_ENTER("CLbtSimChangeHandler::NewL");
       
    48     CLbtSimChangeHandler* self = new( ELeave ) CLbtSimChangeHandler( aContainer,aCleanupHandler,aTriggerChangeObserver );
       
    49     CleanupStack::PushL( self );
       
    50     self->ConstructL();
       
    51     CleanupStack::Pop( self );
       
    52     return self;
       
    53     }
       
    54 
       
    55 // ---------------------------------------------------------------------------
       
    56 // CLbtSimChangeHandler::CLbtSimChangeHandler
       
    57 // ---------------------------------------------------------------------------
       
    58 //   
       
    59 CLbtSimChangeHandler::CLbtSimChangeHandler( CLbtContainer& aContainer,CLbtCleanupHandler& aCleanupHandler,
       
    60                                             MLbtServerLogicTriggerChangeObserver& aTriggerChangeObserver):
       
    61                                             CActive( EPriorityNormal ),iContainer( aContainer ),
       
    62                                             iCleanupHandler( aCleanupHandler ),
       
    63                                             iTriggerChangeObserver( aTriggerChangeObserver ),
       
    64                                             iNwInfo(),iNwInfoPckg(iNwInfo), iLocArea()
       
    65     {
       
    66     CActiveScheduler::Add( this );
       
    67     }
       
    68 
       
    69 // ---------------------------------------------------------------------------
       
    70 // CLbtSimChangeHandler::~CLbtSimChangeHandler
       
    71 // ---------------------------------------------------------------------------
       
    72 //   
       
    73 CLbtSimChangeHandler::~CLbtSimChangeHandler()
       
    74     {
       
    75     FUNC_ENTER("CLbtSimChangeHandler::~CLbtSimChangeHandler");
       
    76     if( IsActive() )
       
    77         {
       
    78         Cancel();
       
    79         iContainer.RemoveObserver( this );
       
    80         }
       
    81         
       
    82     iSimProperty.Close();
       
    83     iMPhone.Close();
       
    84     iTelServer.Close();    
       
    85     iInvalidTriggers.Close();
       
    86     iValidTriggers.Close();    
       
    87     iTriggerList.ResetAndDestroy();    
       
    88     }
       
    89 
       
    90 // ---------------------------------------------------------------------------
       
    91 // CLbtSimChangeHandler::ConstructL
       
    92 // ---------------------------------------------------------------------------
       
    93 //   
       
    94 void CLbtSimChangeHandler::ConstructL()
       
    95     {
       
    96     InitialiseEtelL();
       
    97     iState = EStateIdle;
       
    98     User::LeaveIfError( iSimProperty.Attach( KPSUidStartup, 
       
    99                                              KPSSimChanged, EOwnerThread ) );
       
   100     }
       
   101     
       
   102 // ---------------------------------------------------------------------------
       
   103 // CLbtSimChangeHandler::ConstructL
       
   104 // ---------------------------------------------------------------------------
       
   105 //   
       
   106 void CLbtSimChangeHandler::StartToListenL()
       
   107     {
       
   108     FUNC_ENTER("CLbtSimChangeHandler::StartToListenL");
       
   109     TInt simChanged = 0;
       
   110     User::LeaveIfError( iSimProperty.Get( simChanged ) );
       
   111     
       
   112     if( simChanged == ESimChanged || simChanged == ESimNotChanged )
       
   113         {
       
   114         iState = EStateSimChangeEvent;
       
   115         SetActive();
       
   116         TRequestStatus* status = &iStatus;
       
   117         User::RequestComplete( status,KErrNone ); 
       
   118         }
       
   119     else if( simChanged == ESimChangedUninitialized  )
       
   120         {
       
   121         iState = EStateGetNetworkInfo;
       
   122         SetActive();
       
   123         TRequestStatus* status = &iStatus;
       
   124         User::RequestComplete( status,KErrNone ); 
       
   125         }
       
   126     else
       
   127         {
       
   128         SubscribeForSimChange();
       
   129         }   
       
   130     }
       
   131     
       
   132 // ---------------------------------------------------------------------------
       
   133 // CLbtSimChangeHandler::RunL
       
   134 // ---------------------------------------------------------------------------
       
   135 //      
       
   136 void CLbtSimChangeHandler::RunL()
       
   137     {
       
   138     FUNC_ENTER("CLbtSimChangeHandler::RunL");
       
   139     if( KErrNone == iStatus.Int() )
       
   140         {
       
   141         TLbtTriggerEventMask eventMask = 0;
       
   142         switch( iState )
       
   143             {
       
   144             case EStateSimChangeEvent:
       
   145                 GetCurrentNetworkInfo();
       
   146                 break;
       
   147             
       
   148             case EStateGetNetworkInfo:
       
   149                 ListCellTriggersL();
       
   150                 break; 
       
   151                     
       
   152             case EStateListTriggers:
       
   153                 EvaluateTriggers();
       
   154                 break;    
       
   155             
       
   156             case EStateEvaluateTriggers:
       
   157                 InvalidateDifferentNwTriggersL();
       
   158                 break;
       
   159              
       
   160             case EStateInvalidateTriggers:
       
   161                 // Here the observer is set to the get the information pertaining
       
   162                 // triggers that were changed to invalid
       
   163                 eventMask|= CLbtContainer::ELbtConTriggerValidityFieldChanged;
       
   164                 iContainer.SetChangeObserver( this,eventMask );
       
   165                 ValidateCurrentNwTriggersL();
       
   166                 break;
       
   167                 
       
   168             case EStateValidateTriggers:
       
   169                 // Here the observer is set to the get the information pertaining
       
   170                 // triggers that were changed to invalid
       
   171                 eventMask|= CLbtContainer::ELbtConTriggerValidityFieldChanged;
       
   172                 iContainer.SetChangeObserver( this,eventMask );
       
   173                 SubscribeForSimChange();
       
   174                 break;
       
   175             
       
   176             default:
       
   177                 break;        
       
   178             }
       
   179             
       
   180         }
       
   181     }
       
   182 
       
   183 // ---------------------------------------------------------------------------
       
   184 // CLbtSimChangeHandler::RunError
       
   185 // ---------------------------------------------------------------------------
       
   186 //      
       
   187 TInt CLbtSimChangeHandler::RunError( TInt /*aError*/ )
       
   188     {
       
   189     return KErrNone;
       
   190     }
       
   191 
       
   192 // ---------------------------------------------------------------------------
       
   193 // CLbtSimChangeHandler::GetCurrentNetworkInfo
       
   194 // ---------------------------------------------------------------------------
       
   195 //   
       
   196 void CLbtSimChangeHandler::GetCurrentNetworkInfo()
       
   197     {
       
   198     FUNC_ENTER("CLbtSimChangeHandler::GetCurrentNetworkInfo");
       
   199     TInt error = iMPhone.GetCurrentMode( iNetworkMode );
       
   200     if( KErrNone == error )
       
   201         {
       
   202         iMPhone.GetCurrentNetwork( iStatus,iNwInfoPckg,iLocArea );
       
   203         iState = EStateGetNetworkInfo;
       
   204         SetActive();
       
   205         }
       
   206     }
       
   207 
       
   208 // ---------------------------------------------------------------------------
       
   209 // CLbtSimChangeHandler::ListCellTriggers
       
   210 // ---------------------------------------------------------------------------
       
   211 //   
       
   212 void CLbtSimChangeHandler::ListCellTriggersL()
       
   213     {
       
   214     FUNC_ENTER("CLbtSimChangeHandler::ListCellTriggers");
       
   215     CLbtGeoCell* geoCell = CLbtGeoCell::NewLC();
       
   216                     
       
   217     CLbtTriggerFilterByArea* filter = CLbtTriggerFilterByArea::NewL();    
       
   218     filter->SetArea( geoCell );
       
   219     CleanupStack::Pop( geoCell );//Ownership is transfered to filter
       
   220     CleanupStack::PushL( filter );
       
   221     
       
   222     CLbtListTriggerOptions* listOptions = CLbtListTriggerOptions::NewL();    
       
   223     listOptions->SetFilter( filter );
       
   224     CleanupStack::Pop( filter ); //Ownership is transfered to listOptions
       
   225     CleanupStack::PushL( listOptions );    
       
   226     
       
   227     // We need only trigger Id and condition
       
   228     TLbtTriggerAttributeFieldsMask attributeMask = 0;
       
   229     attributeMask|= CLbtTriggerEntry::EAttributeId|
       
   230                     CLbtTriggerEntry::EAttributeCondition;
       
   231     listOptions->SetRetrievedFields( attributeMask , 0 );
       
   232     
       
   233     CLbtContainerListOptions* contianerListOptions = 
       
   234                                 CLbtContainerListOptions::NewL( listOptions,NULL );
       
   235                                 
       
   236     iTriggerList.Reset();                            
       
   237     iContainer.ListTriggers( contianerListOptions,iTriggerList,iAoOpcode,iStatus );
       
   238     iState = EStateListTriggers;
       
   239     SetActive();
       
   240     
       
   241     CleanupStack::Pop( listOptions );//Ownership is transfered to container list options
       
   242     }
       
   243 
       
   244 // ---------------------------------------------------------------------------
       
   245 // CLbtSimChangeHandler::EvaluateTriggers
       
   246 // ---------------------------------------------------------------------------
       
   247 //   
       
   248 void CLbtSimChangeHandler::EvaluateTriggers()
       
   249     {
       
   250     FUNC_ENTER("CLbtSimChangeHandler::EvaluateTriggers");    
       
   251     // If the count is zero,register again for sim change notification
       
   252     if( !iTriggerList.Count() )
       
   253         {
       
   254         SubscribeForSimChange();
       
   255         return;
       
   256         }
       
   257         
       
   258     // Reset the valid and invalid trigger arrays
       
   259     iInvalidTriggers.Reset();
       
   260     iValidTriggers.Reset();
       
   261     
       
   262     // Iterate through trigger list and mark the trigger that doesnt belong to this network
       
   263     for( TInt i=0;i<iTriggerList.Count();i++ )
       
   264         {
       
   265         CLbtTriggerEntry* triggerEntry = iTriggerList[i]->TriggerEntry();
       
   266         
       
   267         // Create the trigger entry object based on the type of trigger
       
   268     	CLbtTriggerEntry* trigger;
       
   269     	if( triggerEntry->Type() == CLbtTriggerEntry::ETypeStartup )
       
   270     		{
       
   271     		trigger = static_cast<CLbtStartupTrigger*>( triggerEntry );
       
   272     		}
       
   273     	else
       
   274     		{
       
   275     		trigger = static_cast<CLbtSessionTrigger*>( triggerEntry );
       
   276     		}
       
   277         
       
   278         if( trigger->GetCondition()->Type() == CLbtTriggerConditionBase::ETriggerConditionArea )
       
   279     		{
       
   280     		// Get the condition area base
       
   281     		CLbtTriggerConditionArea* conditionArea = 
       
   282     				static_cast<CLbtTriggerConditionArea*>(trigger->GetCondition());
       
   283     		
       
   284     		// Check if the area is a cell
       
   285     		if( conditionArea->TriggerArea()->Type() == CLbtGeoAreaBase::ECellular )
       
   286     			{
       
   287     			CLbtGeoCell* cellularArea = static_cast<CLbtGeoCell*>(conditionArea->TriggerArea());
       
   288     			
       
   289     			TInt ctNetworkCode, trNetworkCode;
       
   290                 TLex lex( iNwInfo.iNetworkId );
       
   291                 lex.Val( ctNetworkCode );
       
   292 
       
   293                 lex.Assign( cellularArea->NetworkIdentityCode() );
       
   294                 lex.Val( trNetworkCode );
       
   295                 
       
   296                 // If the network type,country code and network code of trigger 
       
   297                 // matches with current cell reading, add it to invalid trigger array
       
   298                 if( trNetworkCode != ctNetworkCode )
       
   299                     {
       
   300                     iInvalidTriggers.Append( trigger->Id() );
       
   301                     }
       
   302                 else if( trNetworkCode == ctNetworkCode  )
       
   303                     {
       
   304                     iValidTriggers.Append( trigger->Id() );
       
   305                     }
       
   306     			}
       
   307     		}
       
   308         }
       
   309     iState = EStateEvaluateTriggers; 
       
   310     SetActive();
       
   311     TRequestStatus* status = &iStatus;
       
   312     User::RequestComplete( status,KErrNone );    
       
   313     }
       
   314 
       
   315 // ---------------------------------------------------------------------------
       
   316 // CLbtSimChangeHandler::InvalidateTriggers
       
   317 // ---------------------------------------------------------------------------
       
   318 //   
       
   319 void CLbtSimChangeHandler::InvalidateDifferentNwTriggersL()
       
   320     {
       
   321     FUNC_ENTER("CLbtSimChangeHandler::InvalidateDifferentNwTriggers");
       
   322     // Change the validity of these triggers to InValid
       
   323     LOG("Invalidating Current N/W Triggers");
       
   324     iState = EStateInvalidateTriggers; 
       
   325     SetActive();
       
   326     if( iInvalidTriggers.Count() )
       
   327     	{
       
   328 	    iContainer.UpdateTriggersValidity( TLbtTriggerDynamicInfo::EInvalid,
       
   329                                            iInvalidTriggers,
       
   330                                            iAoOpcode,
       
   331                                            iStatus );
       
   332 		iCleanupHandler.AddTriggersForCleanupL( iInvalidTriggers );
       
   333     	}
       
   334     else    
       
   335     	{
       
   336     	TRequestStatus* status = &iStatus;
       
   337     	User::RequestComplete(status, KErrNone);
       
   338     	}
       
   339     }
       
   340 
       
   341 // ---------------------------------------------------------------------------
       
   342 // CLbtSimChangeHandler::ValidateTriggers
       
   343 // ---------------------------------------------------------------------------
       
   344 //   
       
   345 void CLbtSimChangeHandler::ValidateCurrentNwTriggersL()
       
   346     {
       
   347     FUNC_ENTER("CLbtSimChangeHandler::ValidateCurrentNwTriggers");
       
   348     LOG("Validating Current N/W Triggers");    
       
   349     // Change the validity of these triggers to Valid
       
   350     iState = EStateValidateTriggers; 
       
   351     SetActive();
       
   352     if( iValidTriggers.Count() )
       
   353     	{
       
   354         iContainer.UpdateTriggersValidity( TLbtTriggerDynamicInfo::EValid,
       
   355                                            iValidTriggers,
       
   356                                            iAoOpcode,
       
   357                                            iStatus );
       
   358         iCleanupHandler.RemoveTriggersFromCleanupL( iValidTriggers );
       
   359     	}
       
   360     else
       
   361     	{
       
   362     	TRequestStatus* status = &iStatus;
       
   363     	User::RequestComplete(status, KErrNone);
       
   364     	}    
       
   365     }
       
   366     
       
   367     
       
   368 // ---------------------------------------------------------------------------
       
   369 // CLbtSimChangeHandler::SubscribeForSimChange
       
   370 // ---------------------------------------------------------------------------
       
   371 //   
       
   372 void CLbtSimChangeHandler::SubscribeForSimChange()
       
   373     {
       
   374     FUNC_ENTER("CLbtSimChangeHandler::SubscribeForSimChange");
       
   375     iSimProperty.Subscribe( iStatus );
       
   376     iState = EStateSimChangeEvent;
       
   377     SetActive();   
       
   378     }
       
   379 
       
   380 // ---------------------------------------------------------------------------
       
   381 // CLbtSimChangeHandler::DoCancel
       
   382 // ---------------------------------------------------------------------------
       
   383 //   
       
   384 void CLbtSimChangeHandler::DoCancel()
       
   385     {
       
   386     FUNC_ENTER("CLbtSimChangeHandler::DoCancel");
       
   387     switch( iState )
       
   388         {
       
   389         case EStateSimChangeEvent:
       
   390             iSimProperty.Cancel();
       
   391             break;
       
   392         
       
   393         case EStateGetNetworkInfo:
       
   394             iMPhone.CancelAsyncRequest( EMobilePhoneGetCurrentNetwork );
       
   395             break;
       
   396         
       
   397         case EStateListTriggers:
       
   398         case EStateInvalidateTriggers:
       
   399         case EStateValidateTriggers:
       
   400             iContainer.CancelAsyncOperation( iAoOpcode );
       
   401             break;
       
   402         
       
   403         default:
       
   404             break;          
       
   405         }
       
   406     }
       
   407 
       
   408 // ---------------------------------------------------------------------------
       
   409 // CLbtSimChangeHandler::TriggerStoreChanged
       
   410 // ---------------------------------------------------------------------------
       
   411 //
       
   412 void CLbtSimChangeHandler::TriggerStoreChanged( RArray<TLbtTriggerId>& aTriggerIds,
       
   413                                                TLbtTriggerEventMask aEventMask,
       
   414                                                TLbtContainerChangedAreaType /*aAreaType*/,
       
   415                                                RArray<TUid>& aManagerUids )
       
   416     {
       
   417     // Remove observer
       
   418     iContainer.RemoveObserver( this );
       
   419     iTriggerChangeObserver.HandleTriggersChange( aTriggerIds,aManagerUids,aEventMask );
       
   420     }
       
   421 
       
   422 // ----------------------------------------------------------------------------
       
   423 // CLbtSimChangeHandler::InitialiseEtelL
       
   424 // ----------------------------------------------------------------------------
       
   425 //
       
   426 void CLbtSimChangeHandler::InitialiseEtelL()
       
   427     {
       
   428     FUNC_ENTER("CLbtSimChangeHandler::InitialiseEtelL");
       
   429     CCommsDatabase* const db = CCommsDatabase::NewL(ETrue); 
       
   430 	CleanupStack::PushL(db); 
       
   431 
       
   432 	TUint32 modemId = 0; 
       
   433 	db->GetGlobalSettingL(TPtrC(MODEM_PHONE_SERVICES_SMS), modemId); 
       
   434 	CCommsDbTableView* const view =
       
   435 	    db->OpenViewMatchingUintLC(TPtrC(MODEM), TPtrC(COMMDB_ID), modemId); 
       
   436 
       
   437 	TInt err = view->GotoFirstRecord();
       
   438 	if(err != KErrNone)
       
   439 	    {
       
   440         User::Leave(err);
       
   441 	    }
       
   442 
       
   443     HBufC* nameBuf = NULL;
       
   444     nameBuf = view->ReadLongTextLC(TPtrC(MODEM_TSY_NAME));
       
   445 
       
   446     User::LeaveIfError(iTelServer.Connect());
       
   447 	err = iTelServer.LoadPhoneModule(*nameBuf);
       
   448 	
       
   449 	if(err != KErrNone)
       
   450 	    {
       
   451         User::Leave(err);
       
   452 	    }
       
   453 		    
       
   454 	// For the phone information
       
   455 	RTelServer::TPhoneInfo info;
       
   456 
       
   457 	iTelServer.GetPhoneInfo(0, info); 
       
   458 	err = iMPhone.Open(iTelServer, info.iName);
       
   459 
       
   460 	if(err != KErrNone)
       
   461 	    {
       
   462         User::Leave(err);
       
   463 	    }
       
   464    
       
   465 	CleanupStack::PopAndDestroy(3); // nameBuf, view and db 
       
   466 	}
       
   467     
       
   468 //end of file
       
   469