wlansecuritysettings/wlaneapsettingsui/EapGtc/NotifierUi/src/GtcNotifDlgPlugin.cpp
branchRCL_3
changeset 46 c74b3d9f6b9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlansecuritysettings/wlaneapsettingsui/EapGtc/NotifierUi/src/GtcNotifDlgPlugin.cpp	Wed Sep 01 12:23:57 2010 +0100
@@ -0,0 +1,403 @@
+/*
+* Copyright (c) 2001-2010 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 GtcNotif dialog plugin.
+*
+*/
+
+/*
+* %version: 12.1.9 %
+*/
+
+// INCLUDE FILES
+#include <coemain.h>
+#include <eikenv.h>
+#include <bautils.h>
+#include <data_caging_path_literals.hrh>
+#include <gtcnotifdlgui.rsg>
+#include <e32base.h>
+#include <StringLoader.h>
+
+#include <e32property.h>            // For RProperty 
+#include <UikonInternalPSKeys.h>    // For KPSUidUikon and KUikGlobalNotesAllowed.
+
+#include "GtcNotifDlgPlugin.h"
+#include "GTCResponseQueryDialog.h"
+#include "GTCMessageDisplayDialog.h"
+
+
+// CONSTANTS
+static const TInt KMaxLengthOfGtcResponse = 256;
+
+// Ratio between ascii and unicode character sizes
+static const TUint KAsciiUnicodeRatio = 2;
+
+
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+// -----------------------------------------------------------------------------
+// CreateNotifiersL
+// -----------------------------------------------------------------------------
+//
+LOCAL_C void CreateNotifiersL( 
+                          CArrayPtrFlat< MEikSrvNotifierBase2 >* aNotifiers )
+    {
+    MEikSrvNotifierBase2 *serNotify;
+
+    serNotify = CGtcDialogPlugin::NewL();
+    CleanupStack::PushL( serNotify );
+    aNotifiers->AppendL( serNotify );
+    CleanupStack::Pop( serNotify );
+    }
+
+
+// -----------------------------------------------------------------------------
+// NotifierArray
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CArrayPtr< MEikSrvNotifierBase2 >* NotifierArray()
+    {
+    // NotifierArray() can't leave
+    CArrayPtrFlat< MEikSrvNotifierBase2 >* array = 
+            new CArrayPtrFlat< MEikSrvNotifierBase2 >( KPluginGranularity );
+
+    if ( array )
+        {
+        TRAPD( err, CreateNotifiersL( array ) );
+        
+        if( err )
+            {
+            TInt count = array->Count();
+
+            while( count-- )
+                {
+                ( *array )[ count ]->Release();
+                }
+
+            delete array;
+            array = NULL;
+            }
+        }
+
+    return( array );
+    }
+
+
+//////////////////////////////////////////////////////////////
+// Gtc dialog plugin
+/////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::CGtcDialogPlugin
+// -----------------------------------------------------------------------------
+//
+CGtcDialogPlugin::CGtcDialogPlugin()
+: iCancelled( EFalse ), 
+  iGtcMessageCancelled( EFalse )
+    {
+    iManager = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::~CGtcDialogPlugin
+// -----------------------------------------------------------------------------
+//
+CGtcDialogPlugin::~CGtcDialogPlugin()
+    {
+    CCoeEnv::Static()->DeleteResourceFile( iResource );
+
+    if ( !iGtcMessageCancelled )
+        {
+        delete iGTCMessageDisplayDlg;
+        }
+
+    if ( !iCancelled )
+        {
+        delete iGTCResponseQueryDlg;
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::RegisterL
+// -----------------------------------------------------------------------------
+//
+CGtcDialogPlugin::TNotifierInfo CGtcDialogPlugin::RegisterL()
+    {
+    iInfo.iUid      = KUidGtcDialog;
+    iInfo.iPriority = ENotifierPriorityHigh;
+    iInfo.iChannel  = KUidGtcDialog;
+    return iInfo;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::NewL
+// -----------------------------------------------------------------------------
+//
+CGtcDialogPlugin* CGtcDialogPlugin::NewL()
+    {
+    CGtcDialogPlugin* self = new ( ELeave ) CGtcDialogPlugin();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CGtcDialogPlugin::ConstructL()
+    {
+    TFileName fileName;
+
+    fileName.Append( KDriveZ );
+    fileName.Append( KDC_RESOURCE_FILES_DIR );
+    fileName.Append( KResourceFileName );
+
+    BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), fileName );
+    iResource = CCoeEnv::Static()->AddResourceFileL( fileName );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::StartL
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CGtcDialogPlugin::StartL( const TDesC8& /*aBuffer*/ )
+    {
+    return KNullDesC8().Ptr();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::StartL
+// -----------------------------------------------------------------------------
+//
+void CGtcDialogPlugin::StartL( const TDesC8&  aBuffer, 
+                               TInt aReplySlot, 
+                               const RMessagePtr2& aMessage )
+    {
+    iCancelled = EFalse;
+    iReplySlot = aReplySlot;
+    iMessage   = aMessage;
+     
+    // This object gets constructed only once where as this gets called many 
+    // times, if user is not answering the query. 
+    // So initialize everything here itself.
+    iGTCResponseQueryDlg = NULL;
+    iGTCMessageDisplayDlg = NULL;
+    iDataPtr = NULL;
+    iDataPckgPtr = NULL;
+    iGtcMessageCancelled = EFalse;
+
+    // We are about to display the password prompt.
+    // Since this part of the code can be executed during the bootup, check if
+    // the UI has really started up to display notes/dialogs.
+    TInt notesAllowed = 0;
+    TInt error = RProperty::Get( KPSUidUikon, KUikGlobalNotesAllowed, 
+                                 notesAllowed );
+
+    // The above call can return error. Don't care the error. What we care is
+    // if notesAllowed has turned to 1 from 0.
+    if ( notesAllowed )
+        {
+        // Display EAP-GTC message if there's one...
+        if ( aBuffer.Length() != 0 )
+            {
+            HBufC16* buffer = HBufC16::NewLC( aBuffer.Size() /
+                                                        KAsciiUnicodeRatio );
+            TPtr16 text = buffer->Des();
+            text.Copy( reinterpret_cast<TUint16 *>( const_cast<TUint8 *> (
+                                        aBuffer.Ptr() ) ), aBuffer.Size() /
+                                                        KAsciiUnicodeRatio );
+
+            iGTCMessageDisplayDlg = CGTCMessageDisplayDialog::NewL( text, 
+                                                                    this );
+            iGTCMessageDisplayDlg->ExecuteLD( R_MESSAGE_QUERY );
+
+            // Do not set iGTCMessageDisplayDlg to NULL here, because then
+            // a timeout cancel will cause a crash. Prevent double deletion
+            // by checking iGtcMessageCancelled in the destructor.
+
+            CleanupStack::PopAndDestroy( buffer );
+            }
+        else
+            {
+            // Show the data query directly since there is no message to display.
+            CompleteMessageDisplayL( KErrNone );
+            }
+        }
+
+    // In case if the notes are not allowed, this message gets completed when 
+    // EAPOL time out occurs and a subsequent call to cancel from 
+    // eap_am_type_securid_symbian_c::DoCancel().
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::UpdateL
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CGtcDialogPlugin::UpdateL( const TDesC8& /*aBuffer*/ )
+    {
+    return KNullDesC8().Ptr();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::Cancel
+// -----------------------------------------------------------------------------
+//
+void CGtcDialogPlugin::Cancel()
+    {
+    if ( !iCancelled )
+        {
+        iCancelled = ETrue;
+
+        if ( !iMessage.IsNull() )
+            {
+            iMessage.Complete( KErrCancel );
+            }
+
+        if ( iGTCResponseQueryDlg )
+            {
+            delete iGTCResponseQueryDlg;
+            iGTCResponseQueryDlg = NULL;
+            }
+
+        if ( !iGtcMessageCancelled && iGTCMessageDisplayDlg )
+            {
+            iGtcMessageCancelled = ETrue;
+            delete iGTCMessageDisplayDlg;
+            iGTCMessageDisplayDlg = NULL;
+            }
+        }
+
+    if( iDataPtr ) 
+        {
+        delete iDataPtr;
+        iDataPtr = NULL;
+        }
+
+    if( iDataPckgPtr ) 
+        {
+        delete iDataPckgPtr;
+        iDataPckgPtr = NULL;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::CompleteL
+// -----------------------------------------------------------------------------
+//
+void CGtcDialogPlugin::CompleteL( TInt aStatus )
+    { 
+    if ( aStatus == KErrNone  && !iMessage.IsNull() )
+        {
+        iMessage.WriteL( iReplySlot, *iDataPckgPtr);
+        }
+
+    iCancelled = ETrue;
+    
+    if ( !iMessage.IsNull() )
+        {
+        iMessage.Complete( aStatus );
+        }
+
+    if( iDataPtr ) 
+        {
+        delete iDataPtr;
+        iDataPtr = NULL;
+    }
+
+    if( iDataPckgPtr ) 
+        {
+        delete iDataPckgPtr;
+        iDataPckgPtr = NULL;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::Release
+// -----------------------------------------------------------------------------
+//
+void CGtcDialogPlugin::Release()
+    {
+    delete this;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::Info
+// -----------------------------------------------------------------------------
+//
+CGtcDialogPlugin::TNotifierInfo CGtcDialogPlugin::Info() const
+    {
+    return iInfo;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGtcDialogPlugin::CompleteMessageDisplayL
+// -----------------------------------------------------------------------------
+//
+void CGtcDialogPlugin::CompleteMessageDisplayL( TInt aStatus )
+    {
+    iGtcMessageCancelled = ETrue;
+
+    if ( aStatus == KErrNone )
+        {
+        // Now user has acknowledged the GTC message.
+        // Show the response query to enter the password.
+
+        iDataPtr = new( ELeave ) TEapGtcUsernamePasswordInfo;
+        iDataPckgPtr = new( ELeave ) TPckg<TEapGtcUsernamePasswordInfo>( 
+                                                                *iDataPtr );
+
+        TBuf16<KMaxLengthOfGtcResponse> response;
+
+        iGTCResponseQueryDlg = CGTCResponseQueryDialog::NewL( 
+                                                iDataPtr->iPasscode, this );
+
+        HBufC* text = StringLoader::LoadLC( R_GTC_RESPONSE );
+        iGTCResponseQueryDlg->SetPromptL( *text );
+        CleanupStack::PopAndDestroy( text );
+
+        iGTCResponseQueryDlg->ExecuteLD( R_GTC_PASSWORD_QUERY);
+
+        // Do not set iGTCResponseQueryDlg to NULL here, because then
+        // a timeout cancel will cause a crash. Prevent double deletion
+        // by checking iCancelled in the destructor.
+        }
+    else
+        {
+        // User probably cancelled the message, some how.
+        // Can not continue to show the password query.
+        if ( !iMessage.IsNull() )
+            {
+            iMessage.Complete( aStatus );
+            }
+        }
+    }
+
+
+// End of File