diff -r 000000000000 -r 522cd55cc3d7 locationcentre/lcservice/src/lcserviceimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationcentre/lcservice/src/lcserviceimpl.cpp Tue Feb 02 00:16:03 2010 +0200 @@ -0,0 +1,647 @@ +/* +* 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