diff -r 000000000000 -r 667063e416a2 locationtriggering/ltserver/ltserverlogic/src/lbtappchangehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationtriggering/ltserver/ltserverlogic/src/lbtappchangehandler.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,819 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This file defines the app removal handler +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include + +#include "lbttriggerfilterbyattribute.h" +#include "lbtappchangehandler.h" +#include "lbtcontainertriggerfilter.h" +#include "lbtcontainerupdatefilter.h" +#include "lbtcontainer.h" +#include "lbtcleanuphandler.h" +#include "lbtserverlogictriggerchangeobserver.h" +#include "lbtlogger.h" + +// CONSTANTS +_LIT(KMMCErrorChar, "<"); //if MMC card char retrieval failed, it is assigned. +_LIT(KCharColon, ":"); + +// LOCAL ENUMS + +enum + { + EOpNone, + EOpRegiseteredForInitialListPoplulation, + EOpRegiseteredForListPoplulation, + EOpRemovalTriggerDeletion, + EOpDeletionStartupProcessTriggers, + EOpRemovalListingStartupProcessTriggers, + EOpRemovalDeletingStartupProcessTriggers, + EOpRemovalTriggerInvalidation, + EOpMMCRemovalListingTriggers, + EOpMMCRemovalListingTriggerForStartupProcess, + EOpMMCInsertionListingTriggers, + EOpMMCInsertionListingTriggerForStartupProcess, + EOpRequestValidityChange + }; + + +// LOCAL STRUCTURES +struct TLbtAppInfo + { + TFileName iFullName; + TUid iUid; + }; + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CLbtAppRemovalHandler::NewL +// --------------------------------------------------------------------------- +// +CLbtAppChangeHandler* CLbtAppChangeHandler::NewL(CLbtContainer& aContainer, CLbtCleanupHandler& aCleanupHandler, + MLbtServerLogicTriggerChangeObserver& aTriggerChangeObserver) + { + FUNC_ENTER("CLbtAppChangeHandler::NewL"); + CLbtAppChangeHandler* self = new (ELeave) CLbtAppChangeHandler(aContainer,aCleanupHandler, + aTriggerChangeObserver); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::ConstructL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::ConstructL() + { + FUNC_ENTER("CLbtAppChangeHandler::ConstructL"); + User::LeaveIfError(iAppArcSession.Connect()); + MemoryCardChar(); + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::StartListeningL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::StartListeningL() + { + FUNC_ENTER("CLbtAppChangeHandler::StartListeningL"); + if(!iAppListNotifier) + { + iAppListNotifier = CApaAppListNotifier::NewL(this, CActive::EPriorityStandard); + + iAppArcSession.RegisterListPopulationCompleteObserver(iStatus); + iOperation = EOpRegiseteredForInitialListPoplulation; + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::FindElementInArray +// --------------------------------------------------------------------------- +// +TInt CLbtAppChangeHandler::FindElementInArray(RArray& aArray, TLbtAppInfo& aElement) + { + FUNC_ENTER("CLbtAppChangeHandler::FindElementInArray"); + // Parse the array to find out if the element is present + for(TInt i=0;i& aNewAppList) + { + FUNC_ENTER("CLbtAppChangeHandler::HandleAppListRemovalEvent"); + + RArray appRemovalList; + TBool appsInMMC = EFalse; + + /// Check which apps is un-installed/removed + for(TInt i=0;i= 0 ) + { + appsInMMC = ETrue; + } + } + } + + if( iAppList.Count() == 0 ) + { + iAppList.Reset(); + LOG("No application found removed"); + return; + } + + TInt error = KErrNone; + if( appsInMMC ) + { + TRAP(error, HandleMMCApplicationRemovalL() ); + } + else + { + TRAP(error, HandleApplicationUninstallationL()); + } + + if( error != KErrNone ) + { + iOperation = EOpNone; + } + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::HandleAppListAdditionEvent +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::HandleAppListAdditionEvent(RArray& aNewAppList) + { + FUNC_ENTER("CLbtAppChangeHandler::HandleAppListAdditionEvent"); + // Check which all app(s) have been added back + for(TInt i=0;i= 0 ) + { + // Append to the array only if the application resides on the MMC + iAppList.Append( appInfo ); + } + } + } + if(iAppList.Count() > 0) + { + TRAPD(error, SetValidTriggersOfApplicationsL()); + + if(error != KErrNone) + { + ERROR("SetValidTriggersOfApplicationsL error = %d", error); + iAppList.Close(); + iOperation = EOpNone; + } + } + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::SetValidTriggersOfApplicationsL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::SetValidTriggersOfApplicationsL() + { + FUNC_ENTER("CLbtAppChangeHandler::SetValidTriggersOfApplicationsL"); + // First do a list triggers to get the list of triggers owned by that application + iOperation = EOpMMCInsertionListingTriggers; + + CLbtListTriggerOptions* listOptions = CLbtListTriggerOptions::NewL(); + CleanupStack::PushL(listOptions); + + CLbtTriggerFilterByAttribute* attributeFilter = + CLbtTriggerFilterByAttribute::NewL(); + CleanupStack::PushL(attributeFilter); + attributeFilter->AddTriggerTypeL(CLbtTriggerEntry::ETypeStartup); + + listOptions->SetFilter(attributeFilter); + + // Retreive only the trigger id of the trigger + TLbtTriggerAttributeFieldsMask mask = CLbtTriggerEntry::EAttributeId; + listOptions->SetRetrievedFields(mask, 0); + + CLbtContainerFilter* containerFilter = CLbtContainerFilter::NewL(); + CleanupStack::PushL(containerFilter); + + for(TInt i=0;iAddOwnerSidInFilterL(iAppList[i].iUid); + } + + CLbtContainerListOptions* containerListOptions = CLbtContainerListOptions::NewL(listOptions, containerFilter); + CleanupStack::PushL(containerListOptions); + + CleanupStack::Pop(4); // containerListOptions, containerFilter, attributeFilter & listOptions + + iContainer.ListTriggers(containerListOptions, iTriggerEntries, iOpId, iStatus); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::HandleAppListEvent +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::HandleAppListEvent(TInt /*aEvent*/) + { + FUNC_ENTER("CLbtAppChangeHandler::HandleAppListEvent"); + if( iOperation == EOpNone && !IsActive() ) + { + iOperation = EOpRegiseteredForListPoplulation; + iAppArcSession.RegisterListPopulationCompleteObserver(iStatus); + SetActive(); + return; + } + iOperation = EOpNone; + RArray newAppList; + + // First get the set of installed applications in the system + iAppArcSession.GetAllApps(); + + TApaAppInfo appInfo; + TInt error = iAppArcSession.GetNextApp(appInfo); + + while(KErrNone == error) + { + TLbtAppInfo lbtAppInfo; + lbtAppInfo.iUid = appInfo.iUid; + lbtAppInfo.iFullName.Zero(); + lbtAppInfo.iFullName.Copy( appInfo.iFullName ); + + TRAPD(err, newAppList.AppendL(lbtAppInfo)); + if(err != KErrNone) + { + break; + } + error = iAppArcSession.GetNextApp(appInfo); + } + + LOG1("newAppList.Count():%d",newAppList.Count()); + LOG1("iCurrentInstalledApps.Count():%d",iCurrentInstalledApps.Count()); + + if(newAppList.Count() > iCurrentInstalledApps.Count()) + { + HandleAppListAdditionEvent(newAppList); + } + else + { + LOG("newAppList.Count() < iCurrentInstalledApps.Count()"); + HandleAppListRemovalEvent(newAppList); + } + + iCurrentInstalledApps.Reset(); + + for( TInt i=0;iAddTriggerTypeL(CLbtTriggerEntry::ETypeStartup); + + listOptions->SetFilter(attributeFilter); + + // Retreive only the trigger id of the trigger + TLbtTriggerAttributeFieldsMask mask = CLbtTriggerEntry::EAttributeId; + listOptions->SetRetrievedFields(mask, 0); + + CLbtContainerFilter* containerFilter = CLbtContainerFilter::NewL(); + CleanupStack::PushL(containerFilter); + + for(TInt i=0;iAddOwnerSidInFilterL(iAppList[i].iUid); + } + + CLbtContainerListOptions* containerListOptions = CLbtContainerListOptions::NewL(listOptions, containerFilter); + CleanupStack::PushL(containerListOptions); + + CleanupStack::Pop(4); // containerListOptions, containerFilter, attributeFilter & listOptions + + iContainer.ListTriggers(containerListOptions, iTriggerEntries, iOpId, iStatus); + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::ListTriggersOfStartupProcessL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::ListTriggersOfStartupProcessL() + { + FUNC_ENTER("CLbtAppChangeHandler::ListTriggersOfStartupProcessL"); + CLbtListTriggerOptions* listOptions = CLbtListTriggerOptions::NewL(); + CleanupStack::PushL(listOptions); + + CLbtTriggerFilterByAttribute* attributeFilter = + CLbtTriggerFilterByAttribute::NewL(); + CleanupStack::PushL(attributeFilter); + attributeFilter->AddTriggerTypeL(CLbtTriggerEntry::ETypeStartup); + + listOptions->SetFilter(attributeFilter); + + // Retreive only the trigger id of the trigger + TLbtTriggerAttributeFieldsMask mask = CLbtTriggerEntry::EAttributeId; + listOptions->SetRetrievedFields(mask, 0); + + CLbtContainerFilter* containerFilter = CLbtContainerFilter::NewL(); + CleanupStack::PushL(containerFilter); + + for(TInt i=0;iAddStartupProcessInFilterL( iAppList[i].iFullName ); + } + + CLbtContainerListOptions* containerListOptions = CLbtContainerListOptions::NewL(listOptions, containerFilter); + CleanupStack::PushL(containerListOptions); + + CleanupStack::Pop(4); // containerListOptions, containerFilter, attributeFilter & listOptions + + iContainer.ListTriggers(containerListOptions, iTriggerEntries, iOpId, iStatus); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::DeleteTriggersOfStartupProcessL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::DeleteTriggersOfStartupProcessL() + { + FUNC_ENTER("CLbtAppChangeHandler::DeleteTriggersOfStartupProcessL"); + CLbtContainerUpdateFilter* updateOptions = CLbtContainerUpdateFilter::NewL(); + CleanupStack::PushL(updateOptions); + + CLbtTriggerFilterByAttribute* attributeFilter = + CLbtTriggerFilterByAttribute::NewL(); + CleanupStack::PushL(attributeFilter); + attributeFilter->AddTriggerTypeL(CLbtTriggerEntry::ETypeStartup); + + updateOptions->SetTrigInfoFilter(attributeFilter); + + CLbtContainerFilter* containerFilter = CLbtContainerFilter::NewL(); + CleanupStack::PushL(containerFilter); + + for(TInt i=0;iAddStartupProcessInFilterL( iAppList[i].iFullName ); + } + updateOptions->SetContainerFilter(containerFilter); + + CleanupStack::Pop(3); // containerFilter, attributeFilter & updateOptions + + iContainer.DeleteTriggers(updateOptions, iOpId, iStatus); + SetActive(); + } + + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::IsMemoryCardPresent +// --------------------------------------------------------------------------- +// +TBool CLbtAppChangeHandler::IsMemoryCardPresent() + { + FUNC_ENTER("CLbtAppChangeHandler::IsMemoryCardPresent"); + + //retrieve memory card identifier + TInt drive; + TInt err = DriveInfo::GetDefaultDrive( + DriveInfo::EDefaultRemovableMassStorage, drive); + if( err != KErrNone ) + return EFalse; + + //connect to file server + RFs fs; + err = fs.Connect(); + + if(err != KErrNone) + { + return EFalse; + } + + //check if memory card is present + TUint status; + err = DriveInfo::GetDriveStatus( fs, drive, status ); + fs.Close(); + + if( err != KErrNone ) + return EFalse; + return ( status & DriveInfo::EDrivePresent ); + + } + +// --------------------------------------------------------------------------- +// void CLbtAppChangeHandler::MemoryCardChar() +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::MemoryCardChar() + { + TInt drive; + TInt err = DriveInfo::GetDefaultDrive( + DriveInfo::EDefaultRemovableMassStorage, drive); + //if memory card is not supported + if( err!=KErrNone ) + { + iMMCDriveChar.Copy(KMMCErrorChar); + return; + } + + //retrieve memory card character + RFs fs; + err = fs.Connect(); + if( err==KErrNone ) + { + TChar memChar; + fs.DriveToChar(drive,memChar); + iMMCDriveChar.Zero(); + iMMCDriveChar.Append( memChar ); + } + else + { + iMMCDriveChar.Copy(KMMCErrorChar); + } + iMMCDriveChar.Append(KCharColon); + fs.Close(); + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::RunL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::RunL() + { + FUNC_ENTER("CLbtAppChangeHandler::RunL"); + switch(iOperation) + { + case EOpRegiseteredForInitialListPoplulation: + { + // First get the set of installed applications in the system + iAppArcSession.GetAllApps(); + + TApaAppInfo appInfo; + TInt error = iAppArcSession.GetNextApp(appInfo); + + while(KErrNone == error) + { + TLbtAppInfo lbtAppInfo; + lbtAppInfo.iUid = appInfo.iUid; + lbtAppInfo.iFullName.Zero(); + lbtAppInfo.iFullName.Copy( appInfo.iFullName ); + + iCurrentInstalledApps.AppendL(lbtAppInfo); + error = iAppArcSession.GetNextApp(appInfo); + } + iOperation = EOpNone; + break; + } + case EOpRegiseteredForListPoplulation: + { + HandleAppListEvent(KErrNone); + break; + } + case EOpRemovalTriggerDeletion: + { + // Here the observer is set to the get the information pertaining + // triggers that were deleted. + TLbtTriggerEventMask eventMask = 0; + eventMask|= CLbtContainer::ELbtConTriggerDeleted; + iContainer.SetChangeObserver( this,eventMask ); + + // Delete triggers for which the un-installed application is the + // startup process + iOperation = EOpDeletionStartupProcessTriggers; + DeleteTriggersOfStartupProcessL(); + break; + } + case EOpRemovalListingStartupProcessTriggers: + { + // Here the observer is set to the get the information pertaining + // triggers that were deleted. + TLbtTriggerEventMask eventMask = 0; + eventMask|= CLbtContainer::ELbtConTriggerDeleted; + iContainer.SetChangeObserver( this,eventMask ); + + CLbtContainerFilter* containerFilter = CLbtContainerFilter::NewL(); + CleanupStack::PushL(containerFilter); + + for(TInt i=0;iAddOwnerSidInFilterL(iAppList[i].iUid); + } + + CLbtTriggerFilterByAttribute* filterByAttribute = + CLbtTriggerFilterByAttribute::NewL(); + CleanupStack::PushL(filterByAttribute); + filterByAttribute->AddTriggerTypeL(CLbtTriggerEntry::ETypeStartup); + + CLbtContainerUpdateFilter* updateFilter = CLbtContainerUpdateFilter::NewL(filterByAttribute ,containerFilter); + + iContainer.DeleteTriggers(updateFilter, iOpId, iStatus); + SetActive(); + iOperation = EOpRemovalDeletingStartupProcessTriggers; + break; + } + case EOpRemovalDeletingStartupProcessTriggers: + { + // Here the observer is set to the get the information pertaining + // triggers that were deleted. + TLbtTriggerEventMask eventMask = 0; + eventMask|= CLbtContainer::ELbtConTriggerDeleted; + iContainer.SetChangeObserver( this,eventMask ); + break; + } + + case EOpMMCInsertionListingTriggers: + case EOpMMCRemovalListingTriggers: + { + // Listing Triggers of startup process + LOG("Listing Triggers Over"); + + if( iOperation == EOpMMCInsertionListingTriggers ) + { + iOperation = EOpMMCInsertionListingTriggerForStartupProcess; + } + else + { + iOperation = EOpMMCRemovalListingTriggerForStartupProcess; + } + + ListTriggersOfStartupProcessL(); + iAppList.Close(); + LOG("Listing Triggers for startup Process"); + break; + } + case EOpMMCRemovalListingTriggerForStartupProcess: + case EOpMMCInsertionListingTriggerForStartupProcess: + { + LOG("Listing Trigger For startup Process Done"); + LOG1("iStatus = %d", iStatus.Int()); + LOG1("Triggers Count = %d", iTriggerEntries.Count()); + if(KErrNone == iStatus.Int()) + { + // The list operation is a success. Hence invalidate the triggers now + RArray triggerIds; + + for(TInt i=0;iTriggerEntry()->Id()); + } + + TLbtTriggerDynamicInfo::TLbtTriggerValidity validity; + + if(iOperation == EOpMMCRemovalListingTriggerForStartupProcess) + { + validity = TLbtTriggerDynamicInfo::EInvalid; + iCleanupHandler.AddTriggersForCleanupL( triggerIds ); + } + else + { + validity = TLbtTriggerDynamicInfo::EValid; + iCleanupHandler.RemoveTriggersFromCleanupL( triggerIds ); + } + + // update validity of the triggers + iContainer.UpdateTriggersValidity( validity, + triggerIds, + iOpId, + iStatus ); + SetActive(); + iOperation = EOpRequestValidityChange; + triggerIds.Close(); + iTriggerEntries.ResetAndDestroy(); + } + else + { + // Listing is not successful. Hence dont do anything + iOperation = EOpNone; + iTriggerEntries.ResetAndDestroy(); + iAppList.Reset(); + } + break; + } + case EOpRequestValidityChange: + { + // Here the observer is set to the get the information pertaining + // triggers that were changed to invalid + TLbtTriggerEventMask eventMask = 0; + eventMask|= CLbtContainer::ELbtConTriggerValidityFieldChanged; + iContainer.SetChangeObserver( this,eventMask ); + break; + } + default: + { + // Operation complete + iTriggerEntries.ResetAndDestroy(); + iAppList.Close(); + iOperation = EOpNone; + break; + } + } + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::RunError +// --------------------------------------------------------------------------- +// +TInt CLbtAppChangeHandler::RunError(TInt aError) + { + FUNC_ENTER("CLbtAppChangeHandler::RunError"); + iTriggerEntries.ResetAndDestroy(); + iAppList.Reset(); + ERROR("CLbtAppChangeHandler::RunError:%d", aError) + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::DoCancel +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::DoCancel() + { + FUNC_ENTER("CLbtAppChangeHandler::DoCancel"); + if(IsActive()) + { + switch(iOperation) + { + case EOpRegiseteredForInitialListPoplulation: + { + iAppArcSession.CancelListPopulationCompleteObserver(); + break; + } + default: + { + iContainer.CancelAsyncOperation(iOpId); + break; + } + } + } + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::HandleApplicationUninstallationL +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::HandleApplicationUninstallationL( ) + { + FUNC_ENTER("CLbtAppChangeHandler::HandleApplicationUninstallationL"); + // Since the application has been un-installed all the triggers that belong + // to the application has to be deleted + CLbtContainerFilter* containerFilter = CLbtContainerFilter::NewL(); + CleanupStack::PushL(containerFilter); + + for(TInt i=0;iAddOwnerSidInFilterL(iAppList[i].iUid); + } + + CLbtTriggerFilterByAttribute* filterByAttribute = + CLbtTriggerFilterByAttribute::NewL(); + CleanupStack::PushL(filterByAttribute); + filterByAttribute->AddTriggerTypeL(CLbtTriggerEntry::ETypeStartup); + + CLbtContainerUpdateFilter* updateFilter = CLbtContainerUpdateFilter::NewL(filterByAttribute ,containerFilter); + + iContainer.DeleteTriggers(updateFilter, iOpId, iStatus); + SetActive(); + iOperation = EOpRemovalTriggerDeletion; + CleanupStack::Pop(2); //filterByAttribute and containerFilter. Container takes ownership + } + +// --------------------------------------------------------------------------- +// Default Constructor +// --------------------------------------------------------------------------- +// +CLbtAppChangeHandler::CLbtAppChangeHandler(CLbtContainer& aContainer, CLbtCleanupHandler& aCleanupHandler, + MLbtServerLogicTriggerChangeObserver& aTriggerChangeObserver): + CActive(EPriorityStandard), + iContainer(aContainer), + iCleanupHandler(aCleanupHandler), + iTriggerChangeObserver(aTriggerChangeObserver) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CLbtAppChangeHandler::TriggerStoreChanged +// --------------------------------------------------------------------------- +// +void CLbtAppChangeHandler::TriggerStoreChanged( RArray& aTriggerIds, + TLbtTriggerEventMask aEventMask, + TLbtContainerChangedAreaType /*aAreaType*/, + RArray& aManagerUids ) + { + // Remove observer + iContainer.RemoveObserver( this ); + iTriggerChangeObserver.HandleTriggersChange( aTriggerIds,aManagerUids,aEventMask ); + } + +// --------------------------------------------------------------------------- +// Default Destructor +// --------------------------------------------------------------------------- +// +CLbtAppChangeHandler::~CLbtAppChangeHandler() + { + FUNC_ENTER("CLbtAppChangeHandler::~CLbtAppChangeHandler"); + if( IsActive() ) + { + Cancel(); + iContainer.RemoveObserver( this ); + } + iAppArcSession.Close(); + delete iAppListNotifier; + iCurrentInstalledApps.Close(); + iTriggerEntries.ResetAndDestroy(); + iAppList.Close(); + } +// end of file +