--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pkiutilities/CTSecurityDialogs/NotifSrc/CTSecuritydialognotifier.cpp Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,385 @@
+/*
+* Copyright (c) 2002-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: Crypto Token Security Dialog Notifier
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CTSecurityDialogNotifier.h"
+#include "CTSecurityDialogsAO.h"
+#include <eikenv.h>
+#include <coemain.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <data_caging_path_literals.hrh>
+
+
+
+// CONSTANTS
+_LIT(KCTSecDlgDiskAndFile, "z:CTSecDlgs.rsc");
+_LIT(KCTCertManUiResDiskAndFile, "z:CertManUi.rsc");
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+GLDEF_C void Panic(TInt aPanicCode)
+ {
+ _LIT(KComponentName, "CTSecNotifier");
+ User::Panic(KComponentName, aPanicCode);
+ }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::CCTSecurityDialogNotifier
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCTSecurityDialogNotifier::CCTSecurityDialogNotifier():
+ iSaveReceipt(EFalse)
+ {
+ WIMSECURITYDIALOGS_CREATE
+ WIMSECURITYDIALOGS_WRITE_TIMESTAMP( "CCTSecurityDialogNotifier::CCTSecurityDialogNotifier()" );
+ iEikEnv = CEikonEnv::Static();
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::~CCTSecurityDialogNotifier()
+// -----------------------------------------------------------------------------
+//
+CCTSecurityDialogNotifier::~CCTSecurityDialogNotifier()
+ {
+ WIMSECURITYDIALOGS_DELETE
+ Cancel();
+ if ( iResourceFileOffset )
+ {
+ iEikEnv->DeleteResourceFile( iResourceFileOffset );
+ }
+ if ( iResourceFileOffset2 )
+ {
+ iEikEnv->DeleteResourceFile( iResourceFileOffset2 );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCTSecurityDialogNotifier* CCTSecurityDialogNotifier::NewL()
+ {
+ CCTSecurityDialogNotifier* self = new (ELeave) CCTSecurityDialogNotifier;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCTSecurityDialogNotifier::ConstructL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::Release()
+// -----------------------------------------------------------------------------
+//
+void CCTSecurityDialogNotifier::Release()
+ {
+ WIMSECURITYDIALOGS_WRITE_TIMESTAMP( "CCTSecurityDialogNotifier::Release" );
+ delete this;
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::RegisterL()
+// -----------------------------------------------------------------------------
+//
+CCTSecurityDialogNotifier::TNotifierInfo CCTSecurityDialogNotifier::RegisterL()
+ {
+ // Resource file loading
+ RFs& fs = iEikEnv->FsSession();
+
+ TFileName fileName;
+
+ TParse parse;
+ parse.Set(KCTSecDlgDiskAndFile, &KDC_RESOURCE_FILES_DIR, NULL);
+
+ fileName = parse.FullName();
+
+ BaflUtils::NearestLanguageFile( fs, fileName );
+ iResourceFileOffset = iEikEnv->AddResourceFileL( fileName );
+
+ parse.Set(KCTCertManUiResDiskAndFile, &KDC_RESOURCE_FILES_DIR, NULL);
+ fileName = parse.FullName();
+ BaflUtils::NearestLanguageFile( fs, fileName );
+ iResourceFileOffset2 = iEikEnv->AddResourceFileL( fileName );
+
+ return Info();
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::Info()
+// -----------------------------------------------------------------------------
+//
+CCTSecurityDialogNotifier::TNotifierInfo CCTSecurityDialogNotifier::Info() const
+ {
+ TNotifierInfo info;
+ info.iUid = KUidSecurityDialogNotifier;
+ info.iChannel = KUidSecurityDialogNotifier;
+ info.iPriority = ENotifierPriorityAbsolute;
+ return info;
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::StartL()
+// -----------------------------------------------------------------------------
+//
+void CCTSecurityDialogNotifier::StartL( const TDesC8& aBuffer, TInt aReplySlot,
+ const RMessagePtr2& aMessage )
+ {
+ WIMSECURITYDIALOGS_WRITE( "CCTSecurityDialogNotifier::StartL" );
+
+ TRAPD( err, DoStartL( aBuffer, aReplySlot, aMessage ) );
+ if( err )
+ {
+ if( !iSecurityDialogAODeleted )
+ {
+ delete iSecurityDialogAO;
+ iSecurityDialogAO = NULL;
+ }
+ if( !aMessage.IsNull() )
+ {
+ aMessage.Complete( err );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::DoStartL()
+// -----------------------------------------------------------------------------
+//
+void CCTSecurityDialogNotifier::DoStartL( const TDesC8& aBuffer, TInt aReplySlot,
+ const RMessagePtr2& aMessage )
+ {
+ // CCTSecurityDialogsAO sets the boolean iSecurityDialogAODeleted when it is
+ // constructed and resets it when it is destructed, so iSecurityDialogAODeleted
+ // tells whether the iSecurityDialogAO pointer is valid or not.
+ iSecurityDialogAO = CCTSecurityDialogsAO::NewL( this, iSecurityDialogAODeleted );
+
+ iSecurityDialogAO->StartLD( aBuffer, aReplySlot, aMessage );
+ // StartLD() deletes the iSecurityDialogAO object when it is ready processing the
+ // request. This may take some time, as CCTSecurityDialogsAO is active object, so
+ // iSecurityDialogAO object exists when the above StartLD() returns here. It will
+ // be deleted later when the operation completes. Started operation can be cancelled
+ // before it is completed by deleting the iSecurityDialogAO object.
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::StartL()
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CCTSecurityDialogNotifier::StartL(const TDesC8& /*aBuffer*/)
+ {
+ return KNullDesC8();
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::Cancel()
+// -----------------------------------------------------------------------------
+//
+void CCTSecurityDialogNotifier::Cancel()
+ {
+ WIMSECURITYDIALOGS_WRITE( "CCTSecurityDialogNotifier::Cancel" );
+
+ // If iSecurityDialogAO is not completed yet, we need to cancel it now.
+ // We can simply delete iSecurityDialogAO to cancel pending actions.
+ if( !iSecurityDialogAODeleted )
+ {
+ delete iSecurityDialogAO;
+ }
+ iSecurityDialogAO = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::UpdateL()
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CCTSecurityDialogNotifier::UpdateL(const TDesC8& /*aBuffer*/)
+ {
+ return KNullDesC8();
+ }
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::LoadResourceStringLC()
+// -----------------------------------------------------------------------------
+//
+HBufC* CCTSecurityDialogNotifier::LoadResourceStringLC( const TInt aType, const TDesC& aDynamicText, const TDesC& aDynamicText2 )
+ {
+ if ( aDynamicText2.Length() )
+ {
+ TDialogTypeItem item = GetDialogTypeItem( aType );
+ HBufC* stringWithDynamics = StringLoader::LoadL(item.iResourceIdentifier, iEikEnv);
+ CleanupStack::PushL(stringWithDynamics);
+
+ if ( aDynamicText.Length() && aDynamicText2.Length() )
+ {
+ _LIT(dynamicTextIdentifier, "%0U");
+
+ if (stringWithDynamics->Find(dynamicTextIdentifier) != KErrNotFound)
+ {
+ CleanupStack::PopAndDestroy(stringWithDynamics);
+
+ CDesCArrayFlat* strings = new (ELeave) CDesCArrayFlat(2);
+ CleanupStack::PushL(strings);
+
+ strings->AppendL( aDynamicText );
+ strings->AppendL( aDynamicText2 );
+
+ stringWithDynamics =
+ StringLoader::LoadL(item.iResourceIdentifier,
+ *strings, iEikEnv);
+
+ CleanupStack::PopAndDestroy(strings);
+
+ CleanupStack::PushL(stringWithDynamics);
+ }
+ else
+ {
+ HBufC* dynamicText = NULL;
+ _LIT(dynamicTextIdentifier, "%U");
+
+ if (stringWithDynamics->Find(dynamicTextIdentifier) != KErrNotFound)
+ {
+ CleanupStack::PopAndDestroy(stringWithDynamics); // stringWithDynamics, it wasn't final
+ TPtrC param;
+ if (item.iDynamicResourceIdentifier)
+ {
+ dynamicText = StringLoader::LoadL( item.iDynamicResourceIdentifier, iEikEnv );
+ CleanupStack::PushL( dynamicText );
+ param.Set( dynamicText->Des() );
+ }
+ else
+ {
+ param.Set( aDynamicText );
+ }
+ stringWithDynamics =
+ StringLoader::LoadL(item.iResourceIdentifier,
+ param, iEikEnv);
+ if (dynamicText)
+ {
+ CleanupStack::PopAndDestroy(dynamicText);
+ }
+ CleanupStack::PushL(stringWithDynamics);
+ }
+ else
+ {
+ }
+
+ }
+ }
+ return stringWithDynamics;
+ }
+ else
+ {
+ TDialogTypeItem item = GetDialogTypeItem( aType );
+ HBufC* stringWithDynamics = StringLoader::LoadL(item.iResourceIdentifier, iEikEnv);
+ CleanupStack::PushL(stringWithDynamics);
+ HBufC* dynamicText = NULL;
+
+ if (item.iDynamicResourceIdentifier || aDynamicText.Length())
+ {
+ _LIT(dynamicTextIdentifier, "%U");
+
+ if (stringWithDynamics->Find(dynamicTextIdentifier) != KErrNotFound)
+ {
+ CleanupStack::PopAndDestroy(stringWithDynamics); // stringWithDynamics, it wasn't final
+ TPtrC param;
+ if (item.iDynamicResourceIdentifier)
+ {
+ dynamicText = StringLoader::LoadL( item.iDynamicResourceIdentifier, iEikEnv );
+ CleanupStack::PushL( dynamicText );
+ param.Set( dynamicText->Des() );
+ }
+ else
+ {
+ param.Set( aDynamicText );
+ }
+ stringWithDynamics =
+ StringLoader::LoadL(item.iResourceIdentifier,
+ param, iEikEnv);
+ if (dynamicText)
+ {
+ CleanupStack::PopAndDestroy(dynamicText);
+ }
+ CleanupStack::PushL(stringWithDynamics);
+ }
+ else
+ {
+ }
+ }
+
+ return stringWithDynamics;
+ }
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCTSecurityDialogNotifier::GetDialogTypeItem()
+// -----------------------------------------------------------------------------
+//
+TDialogTypeItem CCTSecurityDialogNotifier::GetDialogTypeItem(const TInt aType)
+ {
+ // If the code panics here, then there's a TDialogType without
+ // any TDialogTypeItem-> Check KDialogTypeToResourceMapper, and add to the mapper!
+
+
+ // Find the corresponding resource to aType.
+ // Algorithm: Best guess : Let's take KDialogTypeToResourceMapper[aType]
+ // if its iDialogType field matches with aType -> HIT, OK
+ // if not, then browse through the whole resource mapper array. If found, ok,
+ // but if not, we will have to panic, as it is a developer error (fatal).
+
+ const TInt mapperCount = sizeof(KDialogTypeToResourceMapper) / sizeof(TDialogTypeItem);
+ __ASSERT_ALWAYS(aType < mapperCount, Panic(KErrOverflow));
+
+ TDialogTypeItem item = KDialogTypeToResourceMapper[aType];
+
+ if (item.iDialogType != aType)
+ {
+ TBool found(EFalse);
+
+ for (TInt i = 0; i < mapperCount; i++)
+ {
+ item = KDialogTypeToResourceMapper[i];
+ if (item.iDialogType == aType)
+ {
+ found = ETrue;
+ break;
+ } // if
+ } // for
+ __ASSERT_ALWAYS(found, Panic(KErrNotFound));
+ } // if
+ return item;
+ }
+
+