--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pushmtm/MtmUiSrc/PushLoadServiceOp.cpp Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,443 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: Implementation of CPushLoadServiceOp.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "PushLoadServiceOp.h"
+#include "PushMtmUiDef.h"
+#include "PushMtmUiPanic.h"
+#include "PushMtmLog.h"
+#include "PushMtmUtil.h"
+#include "PushMtmSettings.h"
+#include "PushAuthenticationUtilities.h"
+#include <push/CSIPushMsgEntry.h>
+#include <push/CSLPushMsgEntry.h>
+#include <eikenv.h>
+#include <apmstd.h>
+#include <schemehandler.h>
+#include <AknNoteWrappers.h>
+#include <PushEntry.h>
+#include <PushMtmUi.rsg>
+#include <AknQueryDialog.h>
+#include <bldvariant.hrh>
+#include <FeatMgr.h>
+#include <Uri16.h>
+#include <data_caging_path_literals.hrh>
+#include <f32file.h>
+
+// CONSTANTS
+
+_LIT( KDefaultScheme, "http://" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::NewL
+// ---------------------------------------------------------
+//
+CPushLoadServiceOp* CPushLoadServiceOp::NewL( CMsvSession& aSession,
+ TMsvId aEntryId,
+ TRequestStatus& aObserverStatus )
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::NewL")
+
+ CPushLoadServiceOp* self =
+ new (ELeave) CPushLoadServiceOp( aSession, aEntryId, aObserverStatus );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::NewL")
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::~CPushLoadServiceOp
+// ---------------------------------------------------------
+//
+CPushLoadServiceOp::~CPushLoadServiceOp()
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::~CPushLoadServiceOp")
+
+ Cancel();
+ delete iSchemeHandler;
+ FeatureManager::UnInitializeLib();
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::~CPushLoadServiceOp")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::StartL
+// ---------------------------------------------------------
+//
+void CPushLoadServiceOp::StartL()
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::StartL")
+
+ Cancel();
+
+ // Check expiration (SI specific).
+ if ( IsExpiredL( iTEntry ) )
+ {
+ PUSHLOG_WRITE(" Msg is expired.")
+ // The entry is expired.
+
+ // Display a confirmation dialog.
+ TParse* fileParser = new (ELeave) TParse;
+ CleanupStack::PushL( fileParser );
+ fileParser->Set( KPushMtmUiResourceFileAndDrive, &KDC_MTM_RESOURCE_DIR, NULL );
+ AssureResourceL( fileParser->FullName() );
+ CleanupStack::PopAndDestroy( fileParser ); // fileParser
+ fileParser = NULL;
+
+ HBufC* value = iCoeEnv.AllocReadResourceLC( R_PUSHLS_EXPIRED_NOTE );
+ CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
+ note->ExecuteLD( *value );
+ CleanupStack::PopAndDestroy( value ); // value
+
+ // Delete the expired message.
+ CMsvEntry* cParent = iMsvSession.GetEntryL( iTEntry.Parent() );
+ CleanupStack::PushL( cParent );
+ cParent->DeleteL( iEntryId );
+ CleanupStack::PopAndDestroy( cParent ); // cParent
+
+ // Nothing to do.
+ iDone = ETrue;
+ }
+
+ CPushMtmUiOperation::StartL();
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::StartL")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::CPushLoadServiceOp
+// ---------------------------------------------------------
+//
+CPushLoadServiceOp::CPushLoadServiceOp( CMsvSession& aSession,
+ TMsvId aEntryId,
+ TRequestStatus& aObserverStatus )
+: CPushMtmUiOperation( aSession, aEntryId, aObserverStatus ),
+ iDone( EFalse )
+ {
+ PUSHLOG_WRITE("CPushLoadServiceOp constructing")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::ConstructL
+// ---------------------------------------------------------
+//
+void CPushLoadServiceOp::ConstructL()
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::ConstructL")
+
+ FeatureManager::InitializeLibL();
+
+ CPushMtmUiOperation::ConstructL();
+
+ // Initialize iTEntry.
+ TMsvId service;
+ User::LeaveIfError( iMsvSession.GetEntry( iEntryId, service, iTEntry ) );
+ __ASSERT_ALWAYS( iTEntry.iMtm == KUidMtmWapPush,
+ UiPanic( EPushMtmUiPanBadMtm ) );
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::ConstructL")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::IsExpiredL
+// ---------------------------------------------------------
+//
+TBool CPushLoadServiceOp::IsExpiredL( const TMsvEntry& aTEntry ) const
+ {
+ TBool ret( EFalse );
+
+ if ( aTEntry.iBioType == KUidWapPushMsgSI.iUid )
+ {
+ CSIPushMsgEntry* si = CSIPushMsgEntry::NewL();
+ CleanupStack::PushL( si );
+ si->RetrieveL( iMsvSession, iEntryId );
+ // Check expiration if expiration time was set.
+ if ( si->Expires() != Time::NullTTime() )
+ {
+ TTime today;
+ today.UniversalTime();
+ if ( si->Expires() < today )
+ {
+ ret = ETrue;
+ }
+ }
+ CleanupStack::PopAndDestroy( si ); // si
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::RetrieveContextAndGetUrlLC
+// ---------------------------------------------------------
+//
+CPushMsgEntryBase* CPushLoadServiceOp::RetrieveContextAndGetUrlLC
+ ( TPtrC& aUrl ) const
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::RetrieveContextAndGetUrlLC");
+
+ CPushMsgEntryBase* context = NULL;
+ const TInt32 bioType( iTEntry.iBioType );
+
+ if ( bioType == KUidWapPushMsgSI.iUid )
+ {
+ context = CSIPushMsgEntry::NewL();
+ }
+ else if ( bioType == KUidWapPushMsgSL.iUid &&
+ FeatureManager::FeatureSupported( KFeatureIdPushSL ) )
+ {
+ context = CSLPushMsgEntry::NewL();
+ }
+ else
+ {
+ __ASSERT_DEBUG( EFalse, UiPanic( EPushMtmUiPanBadBioType ) );
+ User::Leave( KErrNotSupported );
+ }
+
+ CleanupStack::PushL( context );
+ context->RetrieveL( iMsvSession, iEntryId );
+
+ if ( bioType == KUidWapPushMsgSI.iUid )
+ {
+ CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, context );
+ aUrl.Set( si->Url() );
+ }
+ else if ( bioType == KUidWapPushMsgSL.iUid )
+ {
+ CSLPushMsgEntry* sl = STATIC_CAST( CSLPushMsgEntry*, context );
+ aUrl.Set( sl->Url() );
+ }
+ else
+ {
+ __ASSERT_DEBUG( EFalse, UiPanic( EPushMtmUiPanBadBioType ) );
+ }
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::RetrieveContextAndGetUrlLC");
+ return context;
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::AuthenticateL
+// ---------------------------------------------------------
+//
+TBool CPushLoadServiceOp::AuthenticateL( const CPushMsgEntryBase& aPushMsg,
+ const CPushMtmSettings& aMtmSettings ) const
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::AuthenticateL");
+
+ TBool isAuthenticated = ETrue; // by default.
+
+ if ( iTEntry.iBioType != KUidWapPushMsgSL.iUid )
+ {
+ PUSHLOG_WRITE(" Not SL");
+ isAuthenticated = ETrue; // No authentication needed.
+ }
+ else
+ {
+ // SL cache & execute-high message requires additional authentication.
+ CSLPushMsgEntry& sl = (CSLPushMsgEntry&)aPushMsg;
+
+ if ( sl.Action() == CSLPushMsgEntry::ESLPushMsgExecuteCache )
+ {
+ PUSHLOG_WRITE(" SL cache");
+ isAuthenticated = TPushAuthenticationUtil::
+ AuthenticateMsgL( aMtmSettings, aPushMsg );
+ if ( !isAuthenticated )
+ {
+ // Ask the user...
+ isAuthenticated = ExecuteUserQueryL( R_PUSHLS_SL_CACHE_NOT_AUTH );
+ }
+ }
+ else if
+ (
+ sl.Action() == CSLPushMsgEntry::ESLPushMsgExecuteHigh &&
+ aMtmSettings.ServiceLoadingType() == CPushMtmSettings::EAutomatic
+ )
+ {
+ PUSHLOG_WRITE(" SL high + auto");
+ isAuthenticated = TPushAuthenticationUtil::
+ AuthenticateMsgL( aMtmSettings, aPushMsg );
+ if ( !isAuthenticated )
+ {
+ // Ask the user...
+ isAuthenticated = ExecuteUserQueryL( R_PUSHLS_SL_NOT_AUTH );
+ }
+ }
+ else
+ {
+ PUSHLOG_WRITE(" Other SL");
+ isAuthenticated = ETrue; // No authentication needed.
+ }
+ }
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::AuthenticateL");
+ return isAuthenticated;
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::ExecuteUserQueryL
+// ---------------------------------------------------------
+//
+TBool CPushLoadServiceOp::ExecuteUserQueryL( TInt aResId ) const
+ {
+ CAknQueryDialog* queryDlg = CAknQueryDialog::NewL();
+ TInt userResponse = queryDlg->ExecuteLD( aResId );
+ TBool userWantsToDownload = ( userResponse == EAknSoftkeyYes );
+
+ return userWantsToDownload;
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::ValidateLC
+// ---------------------------------------------------------
+//
+HBufC* CPushLoadServiceOp::ValidateLC( TDesC& aUrl ) const
+ {
+ TUriParser uriParser;
+ TInt err = uriParser.Parse( aUrl );
+ User::LeaveIfError( err );
+ HBufC* validated = NULL;
+
+ if ( uriParser.IsPresent( EUriScheme ) )
+ {
+ // Just copy the original URL.
+ validated = aUrl.AllocLC();
+ }
+ else
+ {
+ // Add default scheme.
+ validated = HBufC::NewLC( aUrl.Length() + KDefaultScheme().Length() );
+ validated->Des().Copy( KDefaultScheme );
+ validated->Des().Append( aUrl );
+ }
+
+ return validated;
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::RunL
+// ---------------------------------------------------------
+//
+void CPushLoadServiceOp::RunL()
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::RunL")
+
+ if ( iDone )
+ {
+ PUSHLOG_WRITE(" Done")
+ SignalObserver( KErrNone );
+ }
+ else
+ {
+ TPtrC url;
+ CPushMsgEntryBase* context = RetrieveContextAndGetUrlLC( url );
+
+ CPushMtmSettings* mtmSettings = CPushMtmSettings::NewLC();
+ TBool msgAuthenticated = AuthenticateL( *context, *mtmSettings );
+ CleanupStack::PopAndDestroy( mtmSettings ); // mtmSettings
+
+ if ( !msgAuthenticated )
+ {
+ // Ready.
+ SignalObserver( KErrNone );
+ }
+ else
+ {
+ // OK, authenticated. Can be downloaded.
+
+ // Mark service read.
+ iMtmUtil->MarkServiceUnreadL( iEntryId, EFalse );
+
+ // Download the URL.
+ delete iSchemeHandler;
+ iSchemeHandler = NULL;
+ HBufC* validatedUrl = ValidateLC( url );
+ iSchemeHandler = CSchemeHandler::NewL( *validatedUrl );
+
+ if( (url.Mid(0,7).Compare(_L("http://")) == 0) || (url.Mid(0,8).Compare(_L("https://")) == 0))
+ {
+ TRAPD( err, iSchemeHandler->HandleUrlStandaloneL());
+ CleanupStack::PopAndDestroy( validatedUrl ); // validatedUrl
+ SignalObserver( err );
+ }
+ else
+ {
+ iSchemeHandler->Observer( this );
+ TRAPD(err, iSchemeHandler->HandleUrlEmbeddedL());
+ CleanupStack::PopAndDestroy( validatedUrl ); // validatedUrl
+ if( err != KErrNone)
+ SignalObserver( err );
+ }
+
+ }
+
+ CleanupStack::PopAndDestroy( context ); // context, needed for 'url'
+ }
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::RunL")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::DoCancel
+// ---------------------------------------------------------
+//
+void CPushLoadServiceOp::DoCancel()
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::DoCancel")
+ SignalObserver( KErrCancel );
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::DoCancel")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::RunError
+// ---------------------------------------------------------
+//
+TInt CPushLoadServiceOp::RunError( TInt aError )
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::RunError")
+ PUSHLOG_WRITE_FORMAT(" CPushLoadServiceOp::RunError <%d>",aError)
+
+ TRAP_IGNORE( ShowGlobalErrorNoteL( aError ) );
+ return CPushMtmUiOperation::RunError( aError );
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::RunError")
+ }
+
+// ---------------------------------------------------------
+// CPushLoadServiceOp::HandleServerAppExit
+// ---------------------------------------------------------
+//
+void CPushLoadServiceOp::HandleServerAppExit(TInt LOG_ONLY(aReason))
+ {
+ PUSHLOG_ENTERFN("CPushLoadServiceOp::HandleServerAppExit")
+ PUSHLOG_WRITE_FORMAT(" CPushLoadServiceOp::HandleServerAppExit <%d>",aReason)
+
+ // Ready.
+ SignalObserver( KErrNone );
+
+ PUSHLOG_LEAVEFN("CPushLoadServiceOp::HandleServerAppExit")
+ }
+
+// End of file.