diff -r 3a25f69541ff -r 4721bd00d3da locationcentre/lcservice/src/lcserviceimpl.cpp --- a/locationcentre/lcservice/src/lcserviceimpl.cpp Wed Apr 14 15:50:30 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,647 +0,0 @@ -/* -* Copyright (c) 2007 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: Location Centre API interface. -* -*/ - - -// SYSTEM INCLUDES -#include -#include -#include -#include -#include -#include - -// USER INCLUDES -#include "lcserviceimpl.h" -#include "lclocationappfilter.h" -#include "lcappexitobserver.h" -#include "lcnotification.h" -#include "lcapplauncher.h" -#include "lcipcparams.h" -#include "lcnotificationao.h" -#include "lciconloader.h" -#include "lcsyncoperation.h" -#include "lcpopuplistbox.h" -#include "lcdebug.h" - -// ----- Member funtions for CLcServiceImpl --------------------------------- - -// --------------------------------------------------------------------------- -// CLcServiceImpl::CLcServiceImpl -// --------------------------------------------------------------------------- -// -CLcServiceImpl::CLcServiceImpl() - { - // C++ Default constructor. No allocations or functions which can Leave - // should be called from here. - } - -// --------------------------------------------------------------------------- -// CLcServiceImpl::~CLcServiceImpl -// --------------------------------------------------------------------------- -// -CLcServiceImpl::~CLcServiceImpl() - { - // C++ Destructor. Free all resources associated with this class. - if ( iPopUp ) - { - iPopUp->CancelPopup(); - } - - // Delele the Pop-up list - delete iPopUpListBox; - - // Delete the Selected ID buffer - delete iSelectedAppId; - - // Delete filter parameters - delete iFilter; - - // Delete the Application information array - iAppArray.Reset(); - iAppArray.Close(); - - // Delete the Notification Active object - delete iNotificationAO; - - // Delete the Application launcher - delete iAppLauncher; - - // If there is an outstanding request then complete the same with KErrCancel. - if ( iAsyncOperation ) - { - iAsyncOperation->CancelGetLocationApplications(); - User::RequestComplete( iStatus, KErrCompletion ); - - // We can now delete the asynchronous operation - delete iAsyncOperation; - iAsyncOperation = NULL; - } - - // Close the session handle. The session handle is active throughout the - // lifetime of this class - iSession.Close(); - - } - -// --------------------------------------------------------------------------- -// CLcServiceImpl* CLcServiceImpl::NewL -// --------------------------------------------------------------------------- -// -CLcServiceImpl* CLcServiceImpl::NewL() - { - CLcServiceImpl* self = NewLC(); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CLcServiceImpl* CLcServiceImpl::NewLC -// --------------------------------------------------------------------------- -// -CLcServiceImpl* CLcServiceImpl::NewLC() - { - // Symbian Two phased constructor. Leaves the object on the Clean-up - // stack. - CLcServiceImpl* self = - new ( ELeave )CLcServiceImpl(); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::ConstructL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::ConstructL() - { - // Second phase of the two phase constructor. - - // Open a connection to the Location Centre Server - // The connection is opened at the class construction and Closed at the - // class deletion. This is done inorder to avoid delays during every - // operation - User::LeaveIfError( iSession.CreateSession()); - - // Create the Location application launcher. - iAppLauncher = CLcAppLauncher::NewL(); - - // Create the Notification AO - iNotificationAO = CLcNotificationAO::NewL( *this, iSession ); - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::LaunchLocationCentreL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::LaunchLocationCentreL( - const TLcLocationAppFilter& aLocationAppFilter, - CLcLocationAppInfo::TLcLaunchMode aLaunchMode, - MLcAppExitObserver* aChainedAppExitObserver ) - { - DEBUG("+ CLcServiceImpl::LaunchLocationCentreL") - // First select a Location based Application from the list - TPtrC identifier = SelectLocationApplicationL( aLocationAppFilter ); - if ( !identifier.Length()) - { - return; - } - - // Launch the corresponding application. - LaunchLocationApplicationL( identifier, aLaunchMode, aChainedAppExitObserver ); - DEBUG("- CLcServiceImpl::LaunchLocationCentreL") - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::LaunchLocationCentreL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::LaunchLocationCentreL( - const RPointerArray& aIncludeAppArray, - MLcAppExitObserver* aChainedAppExitObserver ) - { - // Form an array of applications identifiers which can be passed to the - // selection function - RArray appArray; - CleanupClosePushL( appArray ); - - TInt count = aIncludeAppArray.Count(); - for( TInt i = 0; i < count; i++ ) - { - User::LeaveIfError( appArray.Append( aIncludeAppArray[i]->Id())); - } - - // First select a Location based Application from the list - TPtrC identifier = SelectLocationApplicationL( appArray, ETrue ); - if ( !identifier.Length()) - { - return; - } - - CLcLocationAppInfo::TLcLaunchMode launchmode = CLcLocationAppInfo::EDefaultMode; - // Obtain the launch mode for that application - for ( TInt i = 0; i < count; i++ ) - { - if ( !appArray[i].Compare( identifier )) - { - launchmode = aIncludeAppArray[i]->LaunchMode(); - break; - } - } - - // Launch the corresponding application. - LaunchLocationApplicationL( identifier, launchmode, aChainedAppExitObserver ); - - // Pop and Destroy the application array - CleanupStack::PopAndDestroy(); - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::LaunchLocationCentreL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::LaunchLocationCentreL( - const RArray& aExcludeAppArray, - CLcLocationAppInfo::TLcLaunchMode aLaunchMode, - MLcAppExitObserver* aChainedAppExitObserver ) - { - // First select a Location based Application from the list - TPtrC identifier = SelectLocationApplicationL( aExcludeAppArray, EFalse ); - if ( !identifier.Length()) - { - return; - } - - // Launch the corresponding application. - LaunchLocationApplicationL( identifier, aLaunchMode, aChainedAppExitObserver ); - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::SelectLocationApplicationL -// --------------------------------------------------------------------------- -// -TPtrC CLcServiceImpl::SelectLocationApplicationL( - const TLcLocationAppFilter& aLocationAppFilter ) - { - // If the pop-up dialog is currently being displayed then cannot proceed with - // the request. - if ( iPopUp ) - { - User::Leave( KErrInUse ); - } - - iPopupOutStanding = ELcPopupWithFiltering; - - // Delete any existing filter. This condition should never occur. Just a safe - // check. - delete iFilter; - iFilter = NULL; - - // Copy the filter contents - iFilter = new ( ELeave ) TLcLocationAppFilter( aLocationAppFilter ); - - // Obtain the list of applications from the Location Centre Server and - // launch the Location Centre pop-up with that list. - CLcLocationAppInfoArray* array = GetLocationApplicationsL( aLocationAppFilter ); - - // The ownership of the array is transferred. - TPtrC appId(KNullDesC()); - TRAPD( error, appId.Set( SelectLocationApplicationL( array ))); - - // Delete the filter before any operation on the result - delete iFilter; - iFilter = NULL; - - // Handle Error - if ( error ) - { - if ( iPopUp ) - { - iPopUp->CancelPopup(); - } - iPopUp = NULL; - - delete iPopUpListBox; - iPopUpListBox = NULL; - - User::Leave( error ); - } - return appId; - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::SelectLocationApplicationL -// --------------------------------------------------------------------------- -// -TPtrC CLcServiceImpl::SelectLocationApplicationL( - const RArray& aAppArray, - TBool aIncludeFlag ) - { - // If the pop-up dialog is currently being displayed then cannot proceed with - // the request. - if ( iPopUp ) - { - User::Leave( KErrInUse ); - } - - // Reset and Destroy the existing array. - iAppArray.Reset(); - - if ( aIncludeFlag ) - { - iPopupOutStanding = ELcPopupWithSpecifiedApps; - } - else - { - iPopupOutStanding = ELcPopupWithoutSpecifedApps; - } - - // Create the array with the new elements - TInt count = aAppArray.Count(); - for ( TInt i = 0; i < count; i++ ) - { - User::LeaveIfError( iAppArray.Append( aAppArray[i] )); - } - - // Obtain the list of applications from the Location Centre Server and - // launch the Location Centre pop-up with that list. - CLcLocationAppInfoArray* array = - LcSyncOperation::GetLocationApplicationsL( iSession, - aAppArray, - aIncludeFlag ); - - // The ownership of the array is transferred. - TPtrC appId(KNullDesC()); - TRAPD( error, appId.Set( SelectLocationApplicationL( array ))); - - // Reset and destroy the array - iAppArray.Reset(); - - // Handle Error - if ( error ) - { - if ( iPopUp ) - { - iPopUp->CancelPopup(); - } - iPopUp = NULL; - - delete iPopUpListBox; - iPopUpListBox = NULL; - - User::Leave( error ); - } - return appId; - } - -// --------------------------------------------------------------------------- -// CLcLocationAppInfoArray* CLcServiceImpl::GetLocationApplicationsL -// --------------------------------------------------------------------------- -// -CLcLocationAppInfoArray* CLcServiceImpl::GetLocationApplicationsL( - const TLcLocationAppFilter& aLocationAppFilter ) - { - return LcSyncOperation::GetLocationApplicationsL( iSession, - aLocationAppFilter ); - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::GetLocationApplicationsL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::GetLocationApplications( - TRequestStatus& aStatus, - const TLcLocationAppFilter& aLocationAppFilter, - CLcLocationAppInfoArray*& aAppInfoArray) - { - TRAPD( error, GetLocationApplicationsL( aStatus, - aLocationAppFilter, - aAppInfoArray )); - if ( error ) - { - TRequestStatus* status = &aStatus; - User::RequestComplete( status , error ); - } - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::CancelGetLocationApplications -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::CancelGetLocationApplications() - { - // If there is an outstanding request then complete the same with KErrCancel. - if ( iAsyncOperation ) - { - iAsyncOperation->CancelGetLocationApplications(); - User::RequestComplete( iStatus, KErrCancel ); - - // We can now delete the asynchronous operation - delete iAsyncOperation; - iAsyncOperation = NULL; - } - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::LaunchLocationApplicationL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::LaunchLocationApplicationL( - const TDesC& aAppIdentifier, - CLcLocationAppInfo::TLcLaunchMode aLaunchMode, - MLcAppExitObserver* aChainedAppExitObserver ) - { - DEBUG("+ CLcServiceImpl::LaunchLocationApplicationL" ) - - // Obtain the Location Application Information from Location Centre Server. - CLcBasicAppInfo* appInfo = - LcSyncOperation::GetLocationAppInfoL( iSession, aAppIdentifier ); - CleanupStack::PushL( appInfo ); - - // Resolve the model in which the Application must be launched. - if ( aLaunchMode == CLcLocationAppInfo::EDefaultMode ) - { - // Since this is a Local copy we can use the same for handling - // Launch mode changes. - aLaunchMode = - static_cast( appInfo->LaunchMode()); - } - - // Now Launch the Location based Application or Content/Service - iAppLauncher->LaunchLocationApplicationL( - appInfo->ApplicationType(), - appInfo->ApplicationData(), - ( aLaunchMode == CLcLocationAppInfo::EStandAloneMode ) ? ETrue : EFalse, - appInfo->CommandLineParamters(), - aChainedAppExitObserver ); - - CleanupStack::PopAndDestroy( appInfo ); - - DEBUG("- CLcServiceImpl::LaunchLocationApplicationL" ) - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::SetObserverL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::SetObserverL( MLcNotification& aObserver ) - { - if ( iObserver ) - { - User::Leave( KErrAlreadyExists ); - } - - iObserver = &aObserver; - - iNotificationAO->IssueRequest(); - } - -// --------------------------------------------------------------------------- -// TInt CLcServiceImpl::RemoveObserver -// --------------------------------------------------------------------------- -// -TInt CLcServiceImpl::RemoveObserver() - { - if ( !iObserver ) - { - return KErrNotFound; - } - - iObserver = NULL; - - // If there is a popup outstanding then do nothing. If not remove the - // notification - if ( !iPopUp ) - { - iNotificationAO->CancelRequest(); - } - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::LcStatusChangedL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::LcStatusChangedL( TInt aErrorCode ) - { - // If we are displaying the pop-up then we need to transfer the changes - // to the pop-up first - if ( iPopUp ) - { - // Obtain the new list of applications from the Location Centre Server and - // update the Location Centre pop-up with that list. - CLcLocationAppInfoArray* array = NULL; - TInt error = KErrNone; - - switch( iPopupOutStanding ) - { - case ELcPopupWithFiltering: - { - // Incase we face any errors in retrival then we can Ignore the - // updations - TRAP( error, array = GetLocationApplicationsL( *iFilter )); - break; - } - case ELcPopupWithSpecifiedApps: - case ELcPopupWithoutSpecifedApps: - { - TBool includeflag = EFalse; - if ( iPopupOutStanding == ELcPopupWithSpecifiedApps ) - { - includeflag = ETrue; - } - - // Incase we face any errors in retrival then we can Ignore the - // updations - TRAP( error, array = LcSyncOperation::GetLocationApplicationsL( - iSession, iAppArray, includeflag )); - break; - } - default: - { - break; - } - } - - if ( !error && array ) - { - // The ownership of the array is transferred to the list box. - TRAP_IGNORE( CleanupStack::PushL( array ); - iPopUpListBox->UpdateListBoxL( array ); - CleanupStack::Pop( array ); - ); - } - else if ( KErrNotFound == error ) - { - if ( iPopUp ) - { - iPopUp->CancelPopup(); - } - iPopUp = NULL; - - delete iPopUpListBox; - iPopUpListBox = NULL; - } - } - - // Notify the client regarding the changes to Location Centre Registry - if ( iObserver ) - { - iObserver->LcStatusChangedL( aErrorCode ); - } - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::OperationComplete -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::OperationComplete( TInt aError ) - { - User::RequestComplete( iStatus, aError ); - - // We can now delete the asynchronous operation - delete iAsyncOperation; - iAsyncOperation = NULL; - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::GetLocationApplicationsL -// --------------------------------------------------------------------------- -// -void CLcServiceImpl::GetLocationApplicationsL( - TRequestStatus& aStatus, - const TLcLocationAppFilter& aLocationAppFilter, - CLcLocationAppInfoArray*& aAppInfoArray ) - { - aStatus = KRequestPending; - - // If there is an asynchronous operation then leave with KErrInUse - if ( iAsyncOperation ) - { - User::Leave( KErrInUse ); - } - - // Create the Asynchronous Operations class - iAsyncOperation = CLcAsyncOperation::NewL( iSession, *this ); - - // Set the status to KRequestPending - aStatus = KRequestPending; - iStatus = &aStatus; - - // Issue the request to the ASP - iAsyncOperation->GetLocationApplicationsL( aLocationAppFilter, - aAppInfoArray ); - } - -// --------------------------------------------------------------------------- -// void CLcServiceImpl::SelectLocationApplicationL -// --------------------------------------------------------------------------- -// -TPtrC CLcServiceImpl::SelectLocationApplicationL( - CLcLocationAppInfoArray* aAppInfoArray ) - { - // The App Info arrays ownership is tranferred to the List. So push it - // to the Cleanup stack until the ownership is completely transferred. - CleanupStack::PushL( aAppInfoArray ); - - iPopUpListBox = new ( ELeave ) CLcPopupListBox( aAppInfoArray ); - CleanupStack::Pop( aAppInfoArray ); - - // Construct the popup with the list - iPopUp = CAknPopupList::NewL( iPopUpListBox, - R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT, - AknPopupLayouts::EMenuGraphicWindow ); - iPopUpListBox->ConstructL( iPopUp ); - // iPopUp->SetBorder( AknBorderId::EAknBorderMenuPopup ); - - // Set up notification events - iNotificationAO->IssueRequest(); - - // Display the pop-up and let user selection. - TInt popupOk = iPopUp->ExecuteLD(); - iPopUp = NULL; - - // Only we are observing for notifications. We dont need it anymore - // Cancel it - if ( !iObserver ) - { - iNotificationAO->CancelRequest(); - } - - if ( popupOk ) - { - delete iSelectedAppId; - iSelectedAppId = NULL; - - iSelectedAppId = iPopUpListBox->AppInfoId().AllocL(); - - delete iPopUpListBox; - iPopUpListBox = NULL; - - return *iSelectedAppId; - } - else - { - delete iPopUpListBox; - iPopUpListBox = NULL; - - return TPtrC(); - } - } - -// End of File