pushmtm/MtmUiSrc/PushLoadServiceOp.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /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.