--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstaller/AppinstUi/Server/Src/SWInstSession.cpp Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,754 @@
+/*
+* Copyright (c) 2002-2009 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 module contains the implementation of CSWInstSession class
+* member functions.
+*
+*/
+
+
+// INCLUDE FILES
+#include <ecom/ecom.h>
+#include <w32std.h>
+#include <apgtask.h>
+#include <s32mem.h> //RDesReadStream
+
+#include "SWInstSession.h"
+#include "SWInstServer.h"
+#include "SWInstServerPanic.h"
+#include "SWInstInstallRequest.h"
+#include "SWInstUninstallRequest.h"
+#include "SWInstRequestStore.h"
+#include "SWInstPrivateUid.h"
+
+using namespace SwiUI;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::CSWInstSession
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSWInstSession::CSWInstSession()
+ {
+ }
+
+// Destructor
+CSWInstSession::~CSWInstSession()
+ {
+ if ( iCanceller )
+ {
+ iCanceller->Cancel();
+ delete iCanceller;
+ }
+
+ delete iRequestStore;
+ // Call final close for ecom
+ REComSession::FinalClose();
+
+ delete iHeapSourceUrl;
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::PrepareForExit
+// Prepare the session for exit.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::PrepareForExit( MRequestCallback* aExitCallback )
+ {
+ iExitCallback = aExitCallback;
+
+ // If we have any pending requests, cancel them all
+ if ( iRequestStore )
+ {
+ iRequestStore->CancelAllRequests();
+ }
+
+ if ( iExitCallback )
+ {
+ iExitCallback->RequestCompleted( KErrNone );
+ iExitCallback = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::ServiceL
+// Handles the received message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::ServiceL( const RMessage2& aMessage )
+ {
+ // Dispatch the message in trap harness.
+ TRAPD( result, HandleRequestL( aMessage ) );
+
+ if ( result == KErrBadDescriptor )
+ {
+ PanicClient( aMessage, ESWInstPanicBadDescriptor );
+ }
+
+ // In case of leave, we need to complete the client request here
+ else if ( result != KErrNone )
+ {
+ if ( iRequestStore )
+ {
+ CSWInstRequestObject* req = iRequestStore->GetRequest( aMessage.Function() );
+ if ( req && req->IsActive() )
+ {
+ req->Cancel();
+ }
+ else
+ {
+ // No active request found, we must complete the message manually
+ aMessage.Complete( result );
+ }
+ }
+ else
+ {
+ aMessage.Complete( result );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::ServiceError
+// Called back by the server framework if this sessions RunL function returns an
+// error.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::ServiceError( const RMessage2& aMessage, TInt aError )
+ {
+ // A bad descriptor error implies a badly programmed client, so panic it;
+ // otherwise use the default handling (report the error to the client)
+ if ( aError == KErrBadDescriptor )
+ {
+ PanicClient( aMessage, ESWInstPanicBadDescriptor );
+ }
+ CAknAppServiceBase::ServiceError( aMessage, aError );
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::CreateL
+// Completes construction of this server-side client session object.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::CreateL()
+ {
+ iRequestStore = CSWInstRequestStore::NewL();
+ CAknAppServiceBase::CreateL();
+ iAppInForeground = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::RequestCompleted
+// Called when request is completed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::RequestCompleted( TInt /*aResult*/ )
+ {
+ // Delete completed requests
+ iRequestStore->Flush();
+ TInt pendingRequests = iRequestStore->PendingRequestCount();
+
+ // See if we need to notify this completion
+ if( iExitCallback && !pendingRequests )
+ {
+ iExitCallback->RequestCompleted( KErrNone );
+ iExitCallback = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::Server
+// Returns reference to the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSWInstServer& CSWInstSession::Server()
+ {
+ return *static_cast<CSWInstServer*>( const_cast<CServer2*>
+ ( CSession2::Server() ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::HandleRequestL
+// Handles the request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::HandleRequestL( const RMessage2& aMessage )
+ {
+ TServerRequest opCode( ( TServerRequest ) aMessage.Function() );
+
+ // Send application to background if installation is silent. This way
+ // we do not block other apps if installation takes long time.
+ if ( opCode == ERequestSilentInstall && iAppInForeground ||
+ opCode == ERequestSilentInstallParams && iAppInForeground ||
+ opCode == ERequestSilentInstallHandle && iAppInForeground ||
+ opCode == ERequestSilentInstallParamsHandle && iAppInForeground )
+ {
+ SendAppToBackgroundL();
+ }
+
+ // Handle requests for the session.
+ switch ( opCode )
+ {
+ case ERequestCancelRequest:
+ {
+ // We need to cancel and destroy the corresponding request.
+ TInt functionToCancel( GetInt( aMessage, KRequestIpcSlot ) );
+ CSWInstRequestObject* requestObj = iRequestStore->GetRequest( functionToCancel );
+ if ( requestObj && requestObj->IsActive() )
+ {
+ requestObj->Cancel( aMessage );
+ }
+ else
+ {
+ // If we are cancelling we may have a dialog waiting. We need to
+ // use this special method to cancel dialog before exit.
+ // See error TSW ELBA-78SBTS
+ TRAP_IGNORE(
+ iCanceller = CommonUI::CCUICancelTimer::NewL( this );
+ iCanceller->StartCancelling();
+ );
+
+ aMessage.Complete( KErrNotFound );
+ }
+
+ break;
+ }
+
+ case ERequestInstall:
+ case ERequestInstallParams:
+ case ERequestSilentInstall:
+ case ERequestSilentInstallParams:
+ {
+ // Delete completed requests
+ iRequestStore->Flush();
+
+ CSWInstInstallRequest* installRequestObj = CSWInstInstallRequest::NewL( aMessage );
+ CleanupStack::PushL( installRequestObj );
+ // If store is full, this leaves with KSWInstErrBusy
+ iRequestStore->AddRequestL( installRequestObj ); // Ownership transfers to store
+ CleanupStack::Pop( installRequestObj );
+
+ TFileName fileName;
+ TInstallReq params;
+
+ // Parse filename
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KFileNameIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ aMessage.ReadL( KFileNameIpcSlot, fileName );
+
+ if ( opCode == ERequestInstall )
+ {
+ installRequestObj->Install( fileName, params );
+ }
+
+ else if( opCode == ERequestSilentInstall )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KOptionsIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // Parse install options
+ TInstallOptions options;
+ TPckg<TInstallOptions> optionsPckg( options );
+ aMessage.ReadL( KOptionsIpcSlot, optionsPckg );
+
+ installRequestObj->SilentInstall( fileName, params, options );
+ }
+
+ else if ( opCode == ERequestInstallParams )
+ {
+ //TSW JROL-7B8K6H
+ TPckg<TInstallReq> paramsPckg( params );
+ TInt desLength = aMessage.GetDesLength( KParamsIpcSlot );
+ __ASSERT_ALWAYS( desLength > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // If length is more then sizeof TInstallReqPckg, input data
+ // is stored to to heap. Read data to descriptor.
+ if ( desLength > sizeof( TInstallReq ) )
+ {
+ HBufC8* paramDescriptor = HBufC8::NewLC( desLength );
+ TPtr8 paramDesPtr = paramDescriptor->Des();
+ aMessage.ReadL( KParamsIpcSlot, paramDesPtr );
+ // Get install parameters and store URL to heap.
+ GetReqParamsL( *paramDescriptor, params );
+ CleanupStack::PopAndDestroy( paramDescriptor );
+ }
+ else
+ {
+ aMessage.ReadL( KParamsIpcSlot, paramsPckg );
+ }
+
+ installRequestObj->Install( fileName, params );
+ }
+
+ else if ( opCode == ERequestSilentInstallParams )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KParamsIpcSlot ) > 0 &&
+ aMessage.GetDesLength( KOptionsIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ //TSW JROL-7B8K6H
+ TPckg<TInstallReq> paramsPckg( params );
+ TInt desLength = aMessage.GetDesLength( KParamsIpcSlot );
+
+ // If length is more then sizeof TInstallReqPckg, input data
+ // is stored to to heap. Read data to descriptor.
+ if ( desLength > sizeof( TInstallReq ) )
+ {
+ HBufC8* paramDescriptor = HBufC8::NewLC( desLength );
+ TPtr8 paramDesPtr = paramDescriptor->Des();
+ aMessage.ReadL( KParamsIpcSlot, paramDesPtr );
+ // Get install parameters and store URL to heap.
+ GetReqParamsL( *paramDescriptor, params );
+ CleanupStack::PopAndDestroy( paramDescriptor );
+ }
+ // Read params to pckg if lenght is more then 0.
+ else
+ {
+ aMessage.ReadL( KParamsIpcSlot, paramsPckg );
+ }
+
+ // Parse install options
+ TInstallOptions options;
+ TPckg<TInstallOptions> optionsPckg( options );
+ aMessage.ReadL( KOptionsIpcSlot, optionsPckg );
+
+ installRequestObj->SilentInstall( fileName, params, options );
+ }
+
+ break;
+ }
+
+ case ERequestInstallHandle:
+ case ERequestInstallParamsHandle:
+ case ERequestSilentInstallHandle:
+ case ERequestSilentInstallParamsHandle:
+ {
+ // Delete completed requests
+ iRequestStore->Flush();
+
+ CSWInstInstallRequest* installRequestObj = CSWInstInstallRequest::NewL( aMessage );
+ CleanupStack::PushL( installRequestObj );
+ // If store is full, this leaves with KSWInstErrBusy
+ iRequestStore->AddRequestL( installRequestObj ); // Ownership transfers to store
+ CleanupStack::Pop( installRequestObj );
+
+ RFile file;
+ TInstallReq params;
+
+ // Get the file handle
+ User::LeaveIfError( file.AdoptFromClient( aMessage, KFileHandleIpcSlot, KFileSrvSessionIpcSlot ) );
+ CleanupClosePushL( file );
+
+ if ( opCode == ERequestInstallHandle )
+ {
+ installRequestObj->Install( file, params ); // Ownership of file transfers
+ CleanupStack::Pop(); // file
+ }
+
+ else if( opCode == ERequestSilentInstallHandle )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KOptionsIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // Parse install options
+ TInstallOptions options;
+ TPckg<TInstallOptions> optionsPckg( options );
+ aMessage.ReadL( KOptionsIpcSlot, optionsPckg );
+
+ installRequestObj->SilentInstall( file, params, options ); // Ownership of file transfers
+ CleanupStack::Pop(); // file
+ }
+
+ else if ( opCode == ERequestInstallParamsHandle )
+ {
+ TPckg<TInstallReq> paramsPckg( params );
+ TInt desLength = aMessage.GetDesLength( KParamsIpcSlot );
+ __ASSERT_ALWAYS( desLength > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // If length is more then sizeof TInstallReqPckg, input data
+ // is stored to to heap. Read data to descriptor.
+ if ( desLength > sizeof( TInstallReq ) )
+ {
+ HBufC8* paramDescriptor = HBufC8::NewLC( desLength );
+ TPtr8 paramDesPtr = paramDescriptor->Des();
+ aMessage.ReadL( KParamsIpcSlot, paramDesPtr );
+ // Get install parameters and store URL to heap.
+ GetReqParamsL( *paramDescriptor, params );
+ CleanupStack::PopAndDestroy( paramDescriptor );
+ }
+ else
+ {
+ aMessage.ReadL( KParamsIpcSlot, paramsPckg );
+ }
+
+ installRequestObj->Install( file, params ); // Ownership of file transfers
+ CleanupStack::Pop(); // file
+ }
+
+ else if ( opCode == ERequestSilentInstallParamsHandle )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KParamsIpcSlot ) > 0 &&
+ aMessage.GetDesLength( KOptionsIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ TPckg<TInstallReq> paramsPckg( params );
+ TInt desLength = aMessage.GetDesLength( KParamsIpcSlot );
+
+ // If length is more then sizeof TInstallReqPckg, input data
+ // is stored to to heap. Read data to descriptor.
+ if ( desLength > sizeof( TInstallReq ) )
+ {
+ HBufC8* paramDescriptor = HBufC8::NewLC( desLength );
+ TPtr8 paramDesPtr = paramDescriptor->Des();
+ aMessage.ReadL( KParamsIpcSlot, paramDesPtr );
+ // Get install parameters and store URL to heap.
+ GetReqParamsL( *paramDescriptor, params );
+ CleanupStack::PopAndDestroy( paramDescriptor );
+ }
+ else
+ {
+ aMessage.ReadL( KParamsIpcSlot, paramsPckg );
+ }
+
+ // Parse install options
+ TInstallOptions options;
+ TPckg<TInstallOptions> optionsPckg( options );
+ aMessage.ReadL( KOptionsIpcSlot, optionsPckg );
+
+ installRequestObj->SilentInstall( file, params, options ); // Ownership of file transfers
+ CleanupStack::Pop(); // file
+ }
+
+ break;
+ }
+
+ case ERequestUninstall:
+ case ERequestSilentUninstall:
+ {
+ // Delete completed requests
+ iRequestStore->Flush();
+
+ CSWInstUninstallRequest* uninstRequestObj = CSWInstUninstallRequest::NewL( aMessage );
+ CleanupStack::PushL( uninstRequestObj );
+ // If store is full, this leaves with KSWInstErrBusy
+ iRequestStore->AddRequestL( uninstRequestObj ); // Ownership transfers to store
+ CleanupStack::Pop( uninstRequestObj );
+
+ TUid uid;
+ HBufC8* mime = NULL;
+
+ if ( opCode == ERequestUninstall )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KMimeIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // Parse Uid
+ uid.iUid = GetInt( aMessage, KUidIpcSlot );
+
+ // Parse the mime
+ mime = HBufC8::NewLC( aMessage.GetDesLength( KMimeIpcSlot ) );
+ TPtr8 ptr( mime->Des() );
+ aMessage.ReadL( KMimeIpcSlot, ptr );
+
+ uninstRequestObj->Uninstall( uid, *mime );
+ CleanupStack::PopAndDestroy( mime );
+ }
+
+ else if ( opCode == ERequestSilentUninstall )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KOptionsIpcSlot ) > 0 &&
+ aMessage.GetDesLength( KMimeIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // Parse Uid
+ uid.iUid = GetInt( aMessage, KUidIpcSlot );
+
+ TUninstallOptions options;
+ // Parse uninstall options
+ TPckg<TUninstallOptions> optionsPckg( options );
+ aMessage.ReadL( KOptionsIpcSlot, optionsPckg );
+
+ // Parse the mime
+ mime = HBufC8::NewLC( aMessage.GetDesLength( KMimeIpcSlot ) );
+ TPtr8 ptr( mime->Des() );
+ aMessage.ReadL( KMimeIpcSlot, ptr );
+
+ uninstRequestObj->SilentUninstall( uid, *mime, options );
+ CleanupStack::PopAndDestroy( mime );
+ }
+
+ break;
+ }
+
+ case ERequestCustomUninstall:
+ case ERequestSilentCustomUninstall:
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KCommonParamsIpcSlot ) > 0 &&
+ aMessage.GetDesLength( KMimeIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ // Get the operation we need to perform
+ TOperation operation = (TOperation) GetInt( aMessage, KOperationIpcSlot );
+
+ // Get the params
+ HBufC8* params = HBufC8::NewLC( aMessage.GetDesLength( KCommonParamsIpcSlot ) );
+ TPtr8 paramPtr( params->Des() );
+ aMessage.ReadL( KCommonParamsIpcSlot, paramPtr );
+
+ // Parse the mime
+ HBufC8* mime = HBufC8::NewLC( aMessage.GetDesLength( KMimeIpcSlot ) );
+ TPtr8 mimePtr( mime->Des() );
+ aMessage.ReadL( KMimeIpcSlot, mimePtr );
+
+ // Delete completed requests
+ iRequestStore->Flush();
+
+ CSWInstUninstallRequest* uninstRequestObj = CSWInstUninstallRequest::NewL( aMessage );
+ CleanupStack::PushL( uninstRequestObj );
+ // If store is full, this leaves with KSWInstErrBusy
+ iRequestStore->AddRequestL( uninstRequestObj ); // Ownership transfers to store
+ CleanupStack::Pop( uninstRequestObj );
+
+ if ( opCode == ERequestSilentCustomUninstall )
+ {
+ __ASSERT_ALWAYS( aMessage.GetDesLength( KOptionsIpcSlot ) > 0,
+ User::Leave( KErrBadDescriptor ) );
+
+ TUninstallOptions options;
+ // Parse uninstall options
+ TPckg<TUninstallOptions> optionsPckg( options );
+ aMessage.ReadL( KOptionsIpcSlot, optionsPckg );
+
+ uninstRequestObj->SilentCustomUninstall( operation, options, *params, *mime );
+ }
+ else
+ {
+ uninstRequestObj->CustomUninstall( operation, *params, *mime );
+ }
+
+ CleanupStack::PopAndDestroy( 2, params );
+ }
+
+ break;
+
+ default:
+ CAknAppServiceBase::ServiceL( aMessage );
+ break;
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::SecurityCheckL
+// Virtual framework function that is called on receipt of a message from the
+// client. This allows the service implementation to define a security policy
+// for messages from the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CPolicyServer::TCustomResult CSWInstSession::SecurityCheckL( const RMessage2& aMsg,
+ TInt& aAction,
+ TSecurityInfo& aMissing )
+ {
+ switch ( aMsg.Function() )
+ {
+ case ERequestSilentInstall:
+ case ERequestSilentInstallParams:
+ case ERequestSilentUninstall:
+ case ERequestSilentInstallHandle:
+ case ERequestSilentInstallParamsHandle:
+
+ if ( aMsg.HasCapability( TCapability( ECapabilityTrustedUI ) ) )
+ {
+ // AllFiles capability required to install untrusted SW silently.
+ if( aMsg.Function() != ERequestSilentUninstall )
+ {
+ TInstallOptions options;
+ TPckg<TInstallOptions> optionsPckg( options );
+ aMsg.ReadL( KOptionsIpcSlot, optionsPckg );
+ if( options.iUntrusted == EPolicyAllowed )
+ {
+ if( !aMsg.HasCapability( TCapability( ECapabilityAllFiles ) ) )
+ {
+ return CPolicyServer::EFail;
+ }
+ }
+ }
+
+ return CPolicyServer::EPass;
+ }
+ else
+ {
+ return CPolicyServer::EFail;
+ }
+
+ case ERequestInstall:
+ case ERequestInstallParams:
+ case ERequestUninstall:
+ case ERequestInstallHandle:
+ case ERequestInstallParamsHandle:
+ case ERequestCancelRequest:
+ // No capabilities needed for these
+ return CPolicyServer::EPass;
+
+ default:
+ // Not recognized message, pass to CAknAppServiceBase
+ return CAknAppServiceBase::SecurityCheckL( aMsg, aAction, aMissing );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::GetInt
+// Helper to retrieve an int parameter from message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CSWInstSession::GetInt( const RMessage2& aMessage, TInt aIpcSlot )
+ {
+ switch ( aIpcSlot )
+ {
+ case 0:
+ return aMessage.Int0();
+ case 1:
+ return aMessage.Int1();
+ case 2:
+ return aMessage.Int2();
+ case 3:
+ return aMessage.Int3();
+ default:
+ return 0;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::SendAppToBackgroundL
+// Sends application to background. This is used in silent install to prevent
+// blocking of other applications UI.
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::SendAppToBackgroundL()
+ {
+ RWsSession ws;
+
+ if ( ws.Connect() == KErrNone )
+ {
+ CleanupClosePushL(ws);
+ TApaTaskList tasklist(ws);
+
+ TApaTask task = tasklist.FindApp( TUid::Uid(KSWInstSvrUid) );
+
+ if ( task.Exists() )
+ {
+ task.SendToBackground();
+ // Set to false, so we do not do this again.
+ iAppInForeground = EFalse;
+ }
+
+ CleanupStack::PopAndDestroy(); //ws
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::IsShowingDialog()
+// From MCUICancellable. Function returns always ETrue so StartCancelling()
+// function will start cancelling the dialog.
+// -----------------------------------------------------------------------------
+//
+TBool CSWInstSession::IsShowingDialog()
+ {
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::CancelEngine()
+// From MCUICancellable.
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::CancelEngine()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::ForceCancel()
+// From MCUICancellable.
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::ForceCancel()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::StartedCancellingL()
+// From MCUICancellable.
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::StartedCancellingL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSWInstSession::GetReqParamsL
+// Reads parameters from descriptor to TInstallReg and buffer.
+// -----------------------------------------------------------------------------
+//
+void CSWInstSession::GetReqParamsL( TDesC8& aParamsDes, TInstallReq& aParams )
+ {
+ // Delete previous URL.
+ delete iHeapSourceUrl;
+ iHeapSourceUrl = NULL;
+
+ RDesReadStream paramStream( aParamsDes );
+ CleanupClosePushL( paramStream );
+
+ TPckg<TInstallReq> paramsPckg( aParams );
+ // Read install parameters to pckg.
+ paramStream.ReadL( paramsPckg );
+ // Get length of url
+ TInt urlLength = paramStream.ReadInt32L();
+
+
+ // Check the url lenght.
+ // Note that given url length may be zero in some cases.
+ if( urlLength )
+ {
+ iHeapSourceUrl = HBufC::NewL( urlLength );
+ TPtr urlPtr = iHeapSourceUrl->Des();
+ // Get url to heap descriptor
+ paramStream.ReadL( urlPtr, urlLength );
+ // Set url's pointer.
+ TInstallReqHeapURL heapURL;
+ heapURL.iSourcePtr = iHeapSourceUrl;
+
+ TInstallReqURLPckg heapPckg( heapURL );
+ // Copy url pointer to TInstallReg params.
+ aParams.iSourceURL.Copy( heapPckg );
+ }
+
+ CleanupStack::PopAndDestroy( ¶mStream );
+ }
+
+// End of File