diff -r 000000000000 -r 164170e6151a securitydialogs/Securitynotifier/Src/SecurityNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/securitydialogs/Securitynotifier/Src/SecurityNotifier.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,477 @@ +/* +* 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 "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: +* SecurityNotifier implementation. Notifier calls appropriate +* dialog to be opened from SecUi. +* +*/ + + +#include "SecurityNotifier.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// LOCAL CONSTANTS AND MACROS + /***************************************************** + * Series 60 Customer / TSY + * Needs customer TSY implementation + *****************************************************/ + +const TInt KTriesToConnectServer( 2 ); +const TInt KTimeBeforeRetryingServerConnection( 50000 ); +const TInt PhoneIndex( 0 ); +const TInt KDelayPeriod(200000); + + +// ================= EXPORTED FUNCTIONS ==================== + +// --------------------------------------------------------- +// +// Lib main entry point: Creates an notifiers array. +// +// --------------------------------------------------------- +EXPORT_C CArrayPtr* NotifierArray() + { + CArrayPtrFlat* array = new CArrayPtrFlat(1); + + if (array) + { + TRAPD(err, + { + MEikSrvNotifierBase2* securityNotifier = CSecurityNotifier::NewL(); + CleanupStack::PushL(securityNotifier); + array->AppendL(securityNotifier); + CleanupStack::Pop(securityNotifier); + }); + + if (err) + { + TInt count = array->Count(); + while (count--) + (*array)[count]->Release(); + delete array; + array = NULL; + } + } + + return (array); + } + +// ================= LOCAL FUNCTIONS ======================= + +TBool IsAdminCall() + { + TBool isAdminCall = EFalse; + if(FeatureManager::FeatureSupported(KFeatureIdSapTerminalControlFw )) + { + RSCPClient scpClient; + if ( scpClient.Connect() == KErrNone ) + { + if ( scpClient.QueryAdminCmd( ESCPCommandLockPhone ) ) + { + #if defined(_DEBUG) + RDebug::Print(_L("CSecObsNotify::SCP admin command, no action required")); + #endif + + isAdminCall = ETrue; + } + + scpClient.Close(); + } + } + return isAdminCall; + } + + +// ================= CSecurityNotifier ======================= +// +// ---------------------------------------------------------- +// CSecurityNotifier::NewL() +// Create new CSecurityNotifier object. +// ---------------------------------------------------------- +// +MEikSrvNotifierBase2* CSecurityNotifier::NewL() + { + MEikSrvNotifierBase2* self = new(ELeave) CSecurityNotifier; + return self; + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::CSecurityNotifier() +// Default constructor: Sets the active object's priority and +// puts itself to the active scheduler stack. +// ---------------------------------------------------------- +// +CSecurityNotifier::CSecurityNotifier(): CActive(EPriorityStandard) + { + CActiveScheduler::Add(this); + TRAP_IGNORE( FeatureManager::InitializeLibL() ); + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::~CSecurityNotifier() +// Destructor +// ---------------------------------------------------------- +// +CSecurityNotifier::~CSecurityNotifier() + { + FeatureManager::UnInitializeLib(); + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::Release() +// Called when all resources allocated by notifiers should be freed. +// ---------------------------------------------------------- +// +void CSecurityNotifier::Release() + { + delete this; + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::Release() +// This function is called once when DLL is loaded. +// Adds CSecurityNotifier resource file to the list maintained by CCoeEnv. +// ---------------------------------------------------------- +// +MEikSrvNotifierBase2::TNotifierInfo CSecurityNotifier::RegisterL() + { + #if defined(_DEBUG) + RDebug::Print(_L("(SECURITYNOTIFIER)CSecurityNotifier::RegisterL()")); + #endif + iInfo.iUid = KSecurityNotifierUid; + iInfo.iChannel = KSecurityNotifierChannel; + iInfo.iPriority = ENotifierPriorityHigh; + return iInfo; + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::Info() +// Info +// ---------------------------------------------------------- +// +MEikSrvNotifierBase2::TNotifierInfo CSecurityNotifier::Info() const + { + #if defined(_DEBUG) + RDebug::Print(_L("(SECURITYNOTIFIER)CSecurityNotifier::Info()")); + #endif + return iInfo; + } + +// +// ---------------------------------------------------------- +// CSecurityNotifier::StartL() +// Will be called by the manager to start the notifier. The contents of +// the buffer are passed unchanged from the RNotifier call, and can be used +// by the notifier implementation. +// ---------------------------------------------------------- +// +TPtrC8 CSecurityNotifier::StartL(const TDesC8& /*aBuffer*/) + { + #if defined(_DEBUG) + RDebug::Print(_L("(SECURITYNOTIFIER)CSecurityNotifier::StartL()")); + #endif + TPtrC8 ret(KNullDesC8); + return (ret); + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::StartL() +// Asynchronic notifier launch. +// ---------------------------------------------------------- +// +void CSecurityNotifier::StartL(const TDesC8& aBuffer, TInt aReturnVal,const RMessagePtr2& aMessage) + { + #if defined(_DEBUG) + RDebug::Print(_L("(SECURITYNOTIFIER)CSecurityNotifier::StartL2()")); + #endif + TRAPD(err, GetParamsL(aBuffer, aReturnVal, aMessage)); + if (err) + { + aMessage.Complete(err); + User::Leave(err); + } + #if defined(_DEBUG) + RDebug::Print(_L("(SECURITYNOTIFIER)CSecurityNotifier::StartL2() Start BEGIN")); + #endif + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::GetParamsL() +// Initialize parameters and jump to RunL +// ---------------------------------------------------------- +// +void CSecurityNotifier::GetParamsL(const TDesC8& aBuffer, TInt aReturnVal, const RMessagePtr2& aMessage) + { + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + iMessage = aMessage; + iReturnVal = aReturnVal; + TBool skipQuery = EFalse; // In some cases the query is handled by some other entity and SecurityNotifier should skip it. + + #if defined(_DEBUG) + RDebug::Print(_L("(SECURITYNOTIFIER)CSecurityNotifier::GetParamsL() Start BEGIN")); + #endif + + + TSecurityNotificationPckg pckg; + pckg.Copy( aBuffer ); + iStartup = pckg().iStartup; + iEvent = static_cast(pckg().iEvent); + + +if(FeatureManager::FeatureSupported(KFeatureIdSapTerminalControlFw )) + { + if(iEvent == RMobilePhone::EPhonePasswordRequired) + { + skipQuery = IsAdminCall(); // SCP handles the call. + } +} + + if ( skipQuery ) + { + iMessage.Write( iReturnVal, TPckgBuf( KErrNone ) ); + iMessage.Complete( KErrNone ); + } + else + { + // Call SetActive() so RunL() will be called by the active scheduler + SetActive(); + iStatus = KRequestPending; + TRequestStatus* stat = &iStatus; + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::GetParamsL() End")); + #endif + User::RequestComplete(stat, KErrNone); // jump to RunL + } + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::RunL() +// Show query +// ---------------------------------------------------------- +void CSecurityNotifier::RunL() + { + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + /***************************************************** + * Series 60 Customer / TSY + * Needs customer TSY implementation + *****************************************************/ + + TInt err( KErrGeneral ); + TInt thisTry( 0 ); + RTelServer::TPhoneInfo PhoneInfo; + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() Start")); + #endif + /*All server connections are tried to be made KTriesToConnectServer times because occasional + fails on connections are possible, at least on some servers*/ + + // connect to ETel server + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() connect to ETel server")); + #endif + while ( ( err = iServer.Connect() ) != KErrNone && ( thisTry++ ) <= KTriesToConnectServer ) + { + User::After( KTimeBeforeRetryingServerConnection ); + } + User::LeaveIfError( err ); + + thisTry = 0; + + // load TSY + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() load TSY")); + #endif + err = iServer.LoadPhoneModule( KMmTsyModuleName ); + if ( err != KErrAlreadyExists ) + { + // may also return KErrAlreadyExists if something + // else has already loaded the TSY module. And that is + // not an error. + User::LeaveIfError( err ); + } + + // open phones + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() open phones")); + #endif + User::LeaveIfError(iServer.SetExtendedErrorGranularity(RTelServer::EErrorExtended)); + User::LeaveIfError(iServer.GetPhoneInfo(PhoneIndex, PhoneInfo)); + User::LeaveIfError(iPhone.Open(iServer,PhoneInfo.iName)); + RProperty Property; + CleanupClosePushL( Property ); + err = Property.Set(KPSUidStartup, KStartupSecurityCodeQueryStatus, ESecurityQueryActive); + User::LeaveIfError( err ); + + // initialize security ui + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() initialize security ui")); + #endif + CSecurityHandler* handler = new(ELeave) CSecurityHandler(iPhone); + CleanupStack::PushL(handler); + TSecUi::InitializeLibL(); + + TBool StartUp = iStartup; + + TInt secUiOriginatedQuery(ESecurityUIsSecUIOriginated); + err = KErrNone; + if(!StartUp) + { + err = Property.Get(KPSUidSecurityUIs, KSecurityUIsSecUIOriginatedQuery, secUiOriginatedQuery); + } + + // handle event + TInt result = KErrNone; + //Bring the window group to foreground + ( CEikonEnv::Static() )->BringForwards(ETrue); + + TRAPD( error, handler->HandleEventL( iEvent, iStartup, result ) ); + + + // if something went wrong cancel the code request + if (error) + { + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() ERROR: %d"), error); + #endif + TBool wcdmaSupported(FeatureManager::FeatureSupported( KFeatureIdProtocolWcdma )); + TBool upinSupported(FeatureManager::FeatureSupported( KFeatureIdUpin )); + switch (iEvent) + { + case RMobilePhone::EUniversalPinRequired: + if(wcdmaSupported || upinSupported) + { + iPhone.AbortSecurityCode(RMobilePhone::ESecurityUniversalPin); + } + break; + case RMobilePhone::EUniversalPukRequired: + if(wcdmaSupported || upinSupported) + { + iPhone.AbortSecurityCode(RMobilePhone::ESecurityUniversalPuk); + } + break; + case RMobilePhone::EPin1Required: + iPhone.AbortSecurityCode(RMobilePhone::ESecurityCodePin1); + break; + case RMobilePhone::EPuk1Required: + iPhone.AbortSecurityCode(RMobilePhone::ESecurityCodePuk1); + break; + case RMobilePhone::EPin2Required: + iPhone.AbortSecurityCode(RMobilePhone::ESecurityCodePin2); + break; + case RMobilePhone::EPuk2Required: + iPhone.AbortSecurityCode(RMobilePhone::ESecurityCodePuk2); + break; + case RMobilePhone::EPhonePasswordRequired: + iPhone.AbortSecurityCode(RMobilePhone::ESecurityCodePhonePassword); + break; + default: + break; + } + } + + // uninitialize security ui + CleanupStack::PopAndDestroy(handler); // handler + TSecUi::UnInitializeLib(); + Property.Set(KPSUidStartup, KStartupSecurityCodeQueryStatus, ESecurityQueryNotActive); + CleanupStack::PopAndDestroy( &Property ); + + //close ETel connection + if (iServer.Handle()) + { + iPhone.Close(); + iServer.UnloadPhoneModule(KMmTsyModuleName); + iServer.Close(); + } + + User::LeaveIfError(error); + + // Complete message and free resources + iMessage.Write( iReturnVal, TPckgBuf( result ) ); + iMessage.Complete(KErrNone); + iReturnVal = KErrNone; + //Leave the window group to foreground for a short time to absorb key presses so that autolock has time to activate. + if(!StartUp) + User::After(KDelayPeriod); + ( CEikonEnv::Static() )->BringForwards(EFalse); + #if defined(_DEBUG) + RDebug::Print(_L("CSecurityNotifier::RunL() End")); + #endif + } + +// ---------------------------------------------------------- +// This method will be called by framework (CActive) +// if active object is still active. +// Does nothing here. +// ---------------------------------------------------------- +// +void CSecurityNotifier::DoCancel() + { + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::Cancel() +// Will be called by the manager to stop the notifier. Nothing happens when +// a call to cancel is made on a notifier that hasn't started. +// ---------------------------------------------------------- +// +void CSecurityNotifier::Cancel() + { + } +// +// ---------------------------------------------------------- +// CSecurityNotifier::UpdateL() +// Will be called by the manager to update an already started notifier. +// The contents of the buffer are passed unchanged from the RNotifier call, +// and can be used by the notifier implementation +// Nothing happens when a call to update is made on a notifier that hasn't started. +// ---------------------------------------------------------- +// +TPtrC8 CSecurityNotifier::UpdateL(const TDesC8& /*aBuffer*/) + { + return TPtrC8(); + } +// +// ---------------------------------------------------------- +// CE32Dll() +// DLL entry point +// ---------------------------------------------------------- +// + +#ifndef EKA2 + +GLDEF_C TInt E32Dll( TDllReason /*aReason*/) + { + return KErrNone; + } + +#endif + +// end of file