diff -r 000000000000 -r ba25891c3a9e iaupdate/IAD/ui/src/iaupdatesession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/ui/src/iaupdatesession.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,398 @@ +/* +* Copyright (c) 2007-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 CIAUpdateSession class +* member functions. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include + +#include "iaupdatesession.h" +#include "iaupdateserver.h" + +// Parameters are transmitted from the client side to the server +#include "iaupdatetools.h" +#include "iaupdateclientdefines.h" +#include "iaupdateappui.h" +#include "iaupdatelauncheruids.h" +#include "iaupdatedebug.h" + +// CONSTANTS +const TSecureId KSIDBackgroundChecker = 0x200211f4; +const TSecureId KSIDLauncher = KIAUpdateLauncherUid; +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::CIAUpdateSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CIAUpdateSession::CIAUpdateSession() + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::CIAUpdateSession()"); + iEikEnv = CEikonEnv::Static(); + } + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::CIAUpdateSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CIAUpdateSession::~CIAUpdateSession() + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::~CIAUpdateSession() begin"); + CIAUpdateAppUi* appUi = + static_cast( iEikEnv->EikAppUi() ); + if ( appUi ) + { + appUi->HandleObserverRemoval(); + } + delete iMessage; + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::~CIAUpdateSession() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::ServiceL +// Handles the received message. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CIAUpdateSession::ServiceL( const RMessage2& aMessage ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::ServiceL() begin"); + // Dispatch the message in trap harness. + TRAPD( result, HandleRequestL( aMessage ) ); + // If HandleRequest Left, the message has to be completed + // here. Otherwise, the RequestCompleted callback will be called + // when the operations finishes + if ( result != KErrNone ) + { + IAUPDATE_TRACE_1("[IAUPDATE] HandleRequestL leave with error: %d", result ); + aMessage.Complete( result ); + } + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::ServiceL() end"); + } + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::ServiceError +// Called back by the server framework if this sessions RunL function returns an +// error. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CIAUpdateSession::ServiceError( const RMessage2& aMessage, TInt aError ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::ServiceError() begin"); + IAUPDATE_TRACE_1("[IAUPDATE] error code: %d", 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, ECIAUpdatePanicBadDescriptor ); + } + CAknAppServiceBase::ServiceError( aMessage, aError ); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::ServiceError() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::CreateL +// Completes construction of this server-side client session object. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CIAUpdateSession::CreateL() + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::CreateL() begin"); + CAknAppServiceBase::CreateL(); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::CreateL() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::RequestCompleted +// @see MIAUpdateRequestObserver::RequestCompleted +// ----------------------------------------------------------------------------- +// +void CIAUpdateSession::RequestCompleted( CIAUpdateResult* aResult, + TInt aCountOfAvailableUpdates, + TBool aUpdateNow, + TInt aError ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::RequestCompleted() begin"); + IAUPDATE_TRACE_1("[IAUPDATE] error code: %d", aError ); + + if ( !iMessage ) //be sure that there is still message to complete + { + IAUPDATE_TRACE("[IAUPDATE] No message to complete"); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::RequestCompleted() end"); + return; + } + + IAUpdateClientDefines::TIAUpdateServerFunctions functionId = + static_cast( iMessage->Function() ); + + TInt error( KErrNone ); + + switch( functionId ) + { + case IAUpdateClientDefines::EIAUpdateServerCheckUpdates: + { + TPckg availableUpdates( aCountOfAvailableUpdates ); + TPtr8 ptr1( availableUpdates ); + TRAP( error, iMessage->WriteL( 1, ptr1 ) ); + break; + } + + case IAUpdateClientDefines:: EIAUpdateServerShowUpdateQuery: + { + TPckg updateNow( aUpdateNow ); + TPtr8 ptr1( updateNow ); + TRAP( error, iMessage->WriteL( 1, ptr1 ) ); + break; + } + + case IAUpdateClientDefines::EIAUpdateServerShowUpdates: + { + TPckg successCount( aResult->SuccessCount() ); + TPtr8 ptr1( successCount ); + + TPckg failCount( aResult->FailCount() ); + TPtr8 ptr2( failCount ); + + TPckg cancelCount( aResult->CancelCount() ); + TPtr8 ptr3( cancelCount ); + + TRAP( error, + iMessage->WriteL( 1, ptr1 ); + iMessage->WriteL( 2, ptr2 ); + iMessage->WriteL( 3, ptr3 ); ); + break; + } + case IAUpdateClientDefines::EIAUpdateServerStartedByLauncher: + break; + default: + // We should never come here. + break; + } + + if ( error == KErrNone ) + { + // Writing of the data in to the message went ok. + // So, nothing to inform about that. + // Insert possible error code of the update operation. + error = aError; + } + + delete aResult; + aResult = NULL; + + iMessage->Complete( error ); + delete iMessage; + iMessage = NULL; + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::RequestCompleted() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::Server +// Returns reference to the server. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CIAUpdateServer& CIAUpdateSession::Server() + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::Server()"); + return *static_cast( const_cast + ( CSession2::Server() ) ); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::HandleRequestL +// Handles the request. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CIAUpdateSession::HandleRequestL( const RMessage2& aMessage ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::HandleRequestL() begin"); + + CIAUpdateAppUi* appUi = + static_cast( iEikEnv->EikAppUi() ); + // First value is the function number + IAUpdateClientDefines::TIAUpdateServerFunctions functionId = + static_cast( aMessage.Function() ); + IAUPDATE_TRACE_1("[IAUPDATE] function id: %d", functionId ); + + if ( functionId == IAUpdateClientDefines::EIAUpdateServerCancel ) + { + appUi->PotentialCancel(); + if ( iMessage ) //complete possible ongoing request + { + iMessage->Complete( KErrCancel ); + delete iMessage; + iMessage = NULL; + } + // Because cancel is sent synchronously from the client side, + // aMessage is different than the iMessage for other operation + // that is currently going on asynchronously. + // So, RequestCompleted above closed that connection. + // Now, inform the caller of the cancel operation + // that cancellation was success. + aMessage.Complete( KErrNone ); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::HandleRequestL() end"); + return; + } + + if ( functionId == IAUpdateClientDefines::EIAUpdateServerToForeground ) + { + appUi->HandleClientToForegroundL(); + aMessage.Complete( KErrNone ); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::HandleRequestL() end"); + return; + } + + if ( functionId == IAUpdateClientDefines::EIAUpdateServerSendWgId ) + { + TPckgBuf wgIdPkg( 0 ); + aMessage.ReadL( 0, wgIdPkg ); + TInt wgId = wgIdPkg(); + appUi->SetClientWgId( wgId ); + aMessage.Complete( KErrNone ); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::HandleRequestL() end"); + return; + } + + + if ( iMessage ) + { + // This session is used in a wrong way because the + // old operation has not been completed before new one is + // started. + User::Leave( KErrInUse ); + } + + iMessage = new( ELeave ) RMessage2( aMessage ); + if ( functionId == IAUpdateClientDefines::EIAUpdateServerStartedByLauncher ) + { + TPckgBuf refreshFromNetworkDeniedPkg( 0 ); + aMessage.ReadL( 0, refreshFromNetworkDeniedPkg ); + TBool refreshFromNetworkDenied = refreshFromNetworkDeniedPkg(); + appUi->StartedByLauncherL( *this, refreshFromNetworkDenied ); + } + else if ( functionId == IAUpdateClientDefines::EIAUpdateServerShowUpdateQuery ) + { + // Handle the update query dialog request + TUint id = aMessage.SecureId().iId; + appUi->ShowUpdateQueryRequestL( *this, id ); + } + else + { + // Handle update operation related requests. + HBufC8* data = NULL; + data = HBufC8::NewLC( aMessage.GetDesLength( 0 ) ); + TPtr8 ptr( data->Des() ); + aMessage.ReadL( 0, ptr ); + + CIAUpdateParameters* params( CIAUpdateParameters::NewLC() ); + IAUpdateTools::InternalizeParametersL( *params, *data ); + // Do not destroy, because ownership of params is transferred + // below. + CleanupStack::Pop( params ); + CleanupStack::PopAndDestroy( data ); + + if ( aMessage.SecureId() != KSIDBackgroundChecker ) + { + // other processes than backroundchecker are not allowed to cause refresh from network + params->SetRefresh( EFalse ); + } + switch( functionId ) + { + case IAUpdateClientDefines::EIAUpdateServerCheckUpdates: + appUi->CheckUpdatesRequestL( *this, params ); + break; + + case IAUpdateClientDefines::EIAUpdateServerShowUpdates: + appUi->ShowUpdatesRequestL( *this, params ); + break; + + default: + // We should never come here + delete params; + params = NULL; + break; + } + } + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::HandleRequestL() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateSession::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 CIAUpdateSession::SecurityCheckL( const RMessage2& aMsg, + TInt& /*aAction*/, + TSecurityInfo& /*aMissing*/ ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::SecurityCheckL() begin"); + + CPolicyServer::TCustomResult result = CPolicyServer::EFail; + switch ( aMsg.Function() ) + { + case IAUpdateClientDefines::EIAUpdateServerStartedByLauncher: + if ( aMsg.SecureId() == KSIDLauncher ) + { + result = CPolicyServer::EPass; + } + break; + case IAUpdateClientDefines::EIAUpdateServerCheckUpdates: + case IAUpdateClientDefines::EIAUpdateServerShowUpdates: + // no capability check is needed because SID is checked later + // that means that only bacgkroundchecker is allowed to initiate network refresh + + case IAUpdateClientDefines::EIAUpdateServerShowUpdateQuery: + case IAUpdateClientDefines::EIAUpdateServerCancel: + case IAUpdateClientDefines::EIAUpdateServerToForeground: + case IAUpdateClientDefines::EIAUpdateServerSendWgId: + // No capabilities needed + result = CPolicyServer::EPass; + break; + + default: + // Not recognized message + result = CPolicyServer::EFail; + } + IAUPDATE_TRACE_1("[IAUPDATE] result: %d", result ); + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSession::SecurityCheckL() end"); + return result; + } + + +// End of File