wvuing/wvuiave/AppSrc/CCAReactiveAuthorization.cpp
branchRCL_3
changeset 13 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCAReactiveAuthorization.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,440 @@
+/*
+* Copyright (c) 2006 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:  Reactive authorization handling utilities
+*
+*/
+
+
+//INCLUDES
+#include "CCAReactiveAuthorization.h"
+#include "CCAAppUi.h"
+#include "IMDialogUtils.h"
+#include "StringLoader.h"
+#include "IMUtils.h"
+#include "CCAContactEditor.h"
+#include "CAUtils.h"
+#include "CCABlockingUI.h"
+#include "ChatDebugAssert.h"
+#include "MCAReactiveAuthPC.h"
+#include "MCASettingsPC.h"
+#include "MCAProcessManager.h"
+#include "MCABlockingPC.h"
+#include <chatNG.rsg>
+#include <chatNG.mbg>
+#include "CCAUINGUtils.h"
+#include "CCAPCUtils.h"
+
+// The Settings have been moved to Cenrep (also retained in the Resource file),
+// so the enums for keys and central repository header is added here
+#include 	"VariantKeys.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::CCAReactiveAuthorization
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCAReactiveAuthorization::CCAReactiveAuthorization( CCAAppUi& aAppUi,
+                                                    MCAReactiveAuthPC* aReactiveAuthPC )
+        : iAppUi( aAppUi ),
+        iReactiveAuthPC( aReactiveAuthPC )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAReactiveAuthorization* CCAReactiveAuthorization::NewLC( CCAAppUi& aAppUi,
+                                                           MCAReactiveAuthPC* aReactiveAuthPC )
+    {
+    CCAReactiveAuthorization* temp =
+        new( ELeave )CCAReactiveAuthorization( aAppUi, aReactiveAuthPC );
+    CleanupStack::PushL( temp );
+    temp->ConstructL();
+    return temp;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAReactiveAuthorization* CCAReactiveAuthorization::NewL( CCAAppUi& aAppUi,
+                                                          MCAReactiveAuthPC* aReactiveAuthPC )
+    {
+    CCAReactiveAuthorization* temp = CCAReactiveAuthorization::NewLC( aAppUi, aReactiveAuthPC );
+    CleanupStack::Pop( temp );
+    return temp;
+    }
+
+// Destructor
+CCAReactiveAuthorization::~CCAReactiveAuthorization()
+    {
+    delete iIdle;
+    delete iBlockingUI;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCAReactiveAuthorization::ConstructL()
+    {
+    iIdle = CIdle::NewL( CActive::EPriorityIdle );
+
+    // iBlockingUI is constructed when it's needed,
+    // because of the login speedup
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::HandleRAPendingReqL
+// New pending request
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAReactiveAuthorization::HandleRAPendingReqL()
+    {
+    if ( ! IMUtils::IntResourceValueL(
+             RSC_CHAT_VARIATION_REACTIVE_PRESENCE_AUTH ) )
+        {
+        // no RA active
+        return;
+        }
+
+    // launch consumer method via CIdle
+    if ( !iIdle->IsActive() && !iRequestPending )
+        {
+        // not active, launch it again
+        iIdle->Start( TCallBack( ConsumerCallback, this ) );
+        iRequestPending = ETrue;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::HandleRAStatusL
+// New RA status message
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAReactiveAuthorization::HandleRAStatusL()
+    {
+    if ( ! IMUtils::IntResourceValueL(
+             RSC_CHAT_VARIATION_REACTIVE_PRESENCE_AUTH ) )
+        {
+        // no RA active
+        return;
+        }
+
+    // launch consumer via CIdle
+    if ( ! iIdle->IsActive() && !iRequestPending )
+        {
+        // not active, launch it again
+        iIdle->Start( TCallBack( ConsumerCallback, this ) );
+        iRequestPending = ETrue;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::HandleRAError
+// Error case, some of the RA observer methods left.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAReactiveAuthorization::HandleRAError( TInt aError )
+    {
+    if ( aError )
+        {
+        CActiveScheduler::Current()->Error( aError );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::ConsumerCallback
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAReactiveAuthorization::ConsumerCallback( TAny* aInstance )
+    {
+    return static_cast<CCAReactiveAuthorization*>( aInstance )->Consumer();
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::Consumer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAReactiveAuthorization::Consumer()
+    {
+    TRAPD( err, iRequestPending = DoConsumerL() );
+
+    if ( err )
+        {
+        CActiveScheduler::Current()->Error( err );
+        iRequestPending = EFalse;
+        }
+
+    return iRequestPending;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::DoConsumerL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAReactiveAuthorization::DoConsumerL()
+    {
+    // 1. get pending messages from IM Presence
+    //   - handle queue
+    // 2. Get pending statuses from IM Presence
+    //   - handle queue
+    // 3. If both queues are empty, get out
+
+
+
+    HBufC* userId = HBufC::NewLC( KMaxWVIDLength );
+
+    // since this method got called, there has to be at least one (1) in either
+    // array
+    TPtr userIdPtr( userId->Des() );
+    TInt id = 0;
+    TInt lastPendingPos = 0;
+
+    // eat up the request queue
+    // can get the whole list at once on pc side( like have been done for
+    // status queue) n then handle here
+    // can do later if it is a performance issue
+    while ( iReactiveAuthPC->GetNextPendingRARequestL( id, userIdPtr,
+                                                       lastPendingPos ) )
+        {
+        // keep on emptying the queue
+        TBool response = DoHandleRAPendingReqL( *userId );
+        iReactiveAuthPC->SendReactiveAuthResponseL( id, response );
+        }
+
+
+    // eat up the status queue
+    CDesCArray* userIdsArray =  new ( ELeave ) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( userIdsArray );
+
+    iReactiveAuthPC->GetListOfRAStatusL( userIdPtr, *userIdsArray );
+    TInt count = userIdsArray->Count();
+    for ( TInt i( 0 ); i < count; i++ )
+        {
+        // the user rejected us
+        DoHandleRAStatusL( userIdsArray->MdcaPoint( i ) );
+        }
+
+    CleanupStack::PopAndDestroy( userIdsArray );
+    CleanupStack::PopAndDestroy( userId );
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::DoHandleRAPendingReqL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCAReactiveAuthorization::DoHandleRAPendingReqL( const TDesC& aId )
+    {
+    // reactive authorization pending request
+
+    TBool accepted = EFalse;
+
+
+    TInt authorizePresence = iAppUi.GetProcessManager().GetSettingsInterface()
+                             ->GetIntValuePC( TEnumsPC::EAuthorizeIMPresence, NULL );
+    if ( !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HAVEPRESENCEAUTH ) )
+        {
+        // if VARIATION_HAVEPRESENCEAUTH is disabled, we always show RA query
+        authorizePresence = TEnumsPC::EFriends;
+        }
+
+    switch ( authorizePresence )
+        {
+        case TEnumsPC::EAllValue:
+            {
+            accepted = ETrue;
+            break;
+            }
+        case TEnumsPC::ENobody:
+            {
+            accepted = EFalse;
+            break;
+            }
+        case TEnumsPC::EFriends:
+            {
+            // check if we have that contact
+
+            TBool isContactFound( iReactiveAuthPC->FindAnyContactL( aId ) );
+            MCABlockingPC* blockingPC = iAppUi.GetProcessManager().GetBlockingInterface();
+            TBool isContactBlocked = blockingPC->IsContactBlocked( aId );
+
+            if ( isContactFound && !isContactBlocked )
+                {
+                // we have the user in our contactlist
+                accepted = ETrue;
+                }
+            else if ( isContactBlocked )
+                {
+                // we have the user in our blocked list
+                accepted = EFalse;
+                }
+            else
+                {
+                TInt aliasErr( 0 );
+                HBufC* aliasTxt = NULL;
+                HBufC* queryTxt = NULL;
+
+                // Get alias
+
+                TRAP( aliasErr, aliasTxt = iReactiveAuthPC->GetAliasL( aId ) );
+                CleanupStack::PushL( aliasTxt );
+
+                TBool validAlias( EFalse );
+                if ( aliasTxt )
+                    {
+                    validAlias = TBool( aliasTxt->Length() );
+                    }
+
+                if ( aliasErr == KErrNotFound || !validAlias )
+                    {
+                    // no alias, use wvid
+                    queryTxt = StringLoader::LoadLC(
+                                   R_QTN_CHAT_REACTIVE_AUTHORIZE_QUERY,
+                                   CCAPCUtils::DisplayId( aId ) );
+                    }
+                else
+                    {
+                    if ( aliasErr == KErrNone )
+                        {
+                        // alias found
+                        queryTxt = StringLoader::LoadLC( R_QTN_CHAT_REACTIVE_AUTHORIZE_QUERY,
+                                                         *aliasTxt );
+                        }
+                    else
+                        {
+                        // all other errors
+                        User::Leave( aliasErr );
+                        }
+                    }
+
+                // Ask from user to accept authorization
+                TInt result = IMDialogUtils::DisplayQueryDialogL(
+                                  R_GENERIC_YES_NO_CONFIRMATION_QUERY,
+                                  *queryTxt );
+
+                CleanupStack::PopAndDestroy( queryTxt );
+                CleanupStack::PopAndDestroy( aliasTxt );
+
+                if ( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes ) )
+                    {
+                    // recipient has accepted authorization
+                    accepted = ETrue;
+
+                    // we don't have the contact,
+                    // so ask if the user wants to add it
+                    queryTxt = StringLoader::LoadLC( R_QTN_CHAT_REACTIVE_ADD_LIST,
+                                                     CCAPCUtils::DisplayId( aId ) );
+                    result = IMDialogUtils::DisplayQueryDialogL(
+                                 R_GENERIC_YES_NO_CONFIRMATION_QUERY,
+                                 *queryTxt );
+
+                    CleanupStack::PopAndDestroy( queryTxt );
+
+                    if ( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes ) )
+                        {
+                        // verify that we have a contact list
+                        if ( CCAUINGUtils::VerifyContactlistL() ==
+                             CCAUINGUtils::EChatNoContactList )
+                            {
+                            // Could not create contact list
+                            break;
+                            }
+
+                        // add the contact to friends list
+                        TBool contactSaved = EFalse;
+
+                        CCAContactEditor* contactEditor =
+                            CCAContactEditor::NewL( -1, contactSaved );
+                        TInt err;
+                        TRAP( err, contactEditor->EditContactLD(
+                                  TEnumsPC::EAddToContact, KNullDesC(), aId ) );
+                        }
+                    }
+                else
+                    {
+                    // user did not auth, ask whether to block
+                    queryTxt = StringLoader::LoadLC( R_QTN_CHAT_REACTIVE_BLOCK,
+                                                     CCAPCUtils::DisplayId( aId ) );
+                    result = IMDialogUtils::DisplayQueryDialogL(
+                                 R_GENERIC_YES_NO_CONFIRMATION_QUERY, *queryTxt );
+                    CleanupStack::PopAndDestroy( queryTxt );
+
+                    if ( ( result == EAknSoftkeyOk ) ||
+                         ( result == EAknSoftkeyYes ) )
+                        {
+                        // make sure that blocking interface exists
+                        iAppUi.FinalizeChatConstructionL();
+
+                        // block the contact
+                        if ( !iBlockingUI )
+                            {
+
+                            iBlockingUI = CCABlockingUI::NewL( blockingPC );
+
+                            }
+
+                        iBlockingUI->BlockUserL( aId );
+                        }
+
+                    accepted = EFalse;
+                    }
+                }
+            break;
+            }
+        default:
+            {
+            // We should not get here... some strange value
+            __CHAT_ASSERT_DEBUG( EFalse );
+            break;
+            }
+        }
+
+    return accepted;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAReactiveAuthorization::DoHandleRAStatusL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAReactiveAuthorization::DoHandleRAStatusL( const TDesC& aId )
+    {
+    // reactive authorization status
+    HBufC* text = StringLoader::LoadLC(
+                      R_QTN_CHAT_REACTIVE_NOT_AUTHORIZED, CCAPCUtils::DisplayId( aId ) );
+    IMDialogUtils::DisplayNoteDialogL( *text, R_AVKON_SOFTKEYS_OK_EMPTY__OK,
+                                       CAknNoteDialog::ENoTimeout );
+    CleanupStack::PopAndDestroy( text );
+    }
+
+// End of file
+