--- /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 <s32mem.h>
+#include <aknsutils.h>
+#include <gulicon.h>
+#include <aknlists.h>
+#include <aknpopup.h>
+#include <avkon.rsg>
+
+// 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<CLcService::CLcLaunchParam>& aIncludeAppArray,
+ MLcAppExitObserver* aChainedAppExitObserver )
+ {
+ // Form an array of applications identifiers which can be passed to the
+ // selection function
+ RArray<TPtrC> 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<TPtrC>& 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<TPtrC>& 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<CLcLocationAppInfo::TLcLaunchMode>( 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