securitydialogs/Securityobserver/Src/SecObsNotify.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitydialogs/Securityobserver/Src/SecObsNotify.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,392 @@
+/*
+* 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: 
+*       CSecObsNotify - starts and cancels notifier plug-ins.
+*       Handles PIN/PIN2/PUK/PUK2/... notifiers
+*
+*/
+
+
+//  Include Files
+#include    "SecObsNotify.h"
+#include    "SecurityObserver.h"
+#include    <SecurityNotifier.h>
+
+#ifndef RD_STARTUP_CHANGE
+#include    <SysStartup.h>
+#endif //RD_STARTUP_CHANGE
+
+#include    "SecurityObserver.hrh"
+
+#ifdef __SAP_TERMINAL_CONTROL_FW
+#include <SCPClient.h>
+#endif //__SAP_TERMINAL_CONTROL_FW
+
+//===========================================================
+//  MEMBER FUNCTIONS
+//===========================================================
+//
+// ----------------------------------------------------------
+// CSecObsNotify::NewL()
+// Constructs a new entry with given values.
+// ----------------------------------------------------------
+//
+CSecObsNotify* CSecObsNotify::NewL(CSecurityObserver* aObserver)
+    {
+    CSecObsNotify* self = new(ELeave) CSecObsNotify(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+//
+// ----------------------------------------------------------
+// CSecObsNotify::~CSecObsNotify
+// C++ destructor.
+// ----------------------------------------------------------
+//
+CSecObsNotify::~CSecObsNotify()
+    {
+    Cancel();
+    delete iPhoneObserver;
+    }
+//
+// ----------------------------------------------------------
+// CSecObsNotify::CSecObsNotify
+// C++ constructor
+// ----------------------------------------------------------
+//
+CSecObsNotify::CSecObsNotify(CSecurityObserver* aObserver) : CActive(0),
+                                 iObserver(aObserver),
+                                 iActiveNotifier(ESecurityNotifierNone),
+                                 iPendingNotifier(ESecurityNotifierNone)
+    {
+    }
+//
+// ----------------------------------------------------------
+// CSecObsNotify::ConstructL
+// Adds this active object to the scheduler.
+// ----------------------------------------------------------
+//
+void CSecObsNotify::ConstructL()
+    {
+    // Add this active object to the scheduler.
+    CActiveScheduler::Add(this);
+    iPhoneObserver = CPhoneObserver::NewL(this,iObserver);
+    }
+
+//
+// ----------------------------------------------------------
+// CSecObsNotify::RunL
+//
+// ----------------------------------------------------------
+//
+void CSecObsNotify::RunL()
+    {
+    #if defined(_DEBUG)
+	RDebug::Print(_L("CSecObsNotify::RunL()"));
+	#endif
+#ifndef RD_STARTUP_CHANGE
+
+#if defined(__PROTOCOL_WCDMA) || defined(__UPIN) 
+    if (iActiveNotifier == ESecurityNotifierUPin)
+        {
+        if (iObserver->IsUPinRequired() && !iObserver->IsUPukRequired() && SysStartup::State() != ESWStateNormal)
+            {
+            iPhoneObserver->Stop();
+            iPhoneObserver->Start(iActiveNotifier);
+            }
+        }
+  
+#endif //__PROTOCOL_WCDMA || __UPIN
+    if (iActiveNotifier == ESecurityNotifierPin1)
+        {
+        if (iObserver->IsPin1Required() && !iObserver->IsPuk1Required() && SysStartup::State() != ESWStateNormal)
+            {
+            iPhoneObserver->Stop();
+            iPhoneObserver->Start(iActiveNotifier);
+            }
+        }
+#endif // RD_STARTUP_CHANGE    
+
+    if (iActiveNotifier == ESecurityNotifierPuk1)
+        {
+        if (iObserver->IsPuk1Required())
+            {
+            iPhoneObserver->Stop();
+            iPhoneObserver->Start(iActiveNotifier);
+            }
+        }
+    #if defined(__PROTOCOL_WCDMA) || defined(__UPIN)
+    if (iActiveNotifier == ESecurityNotifierUPuk)
+        {
+        if (iObserver->IsUPukRequired())
+            {
+            iPhoneObserver->Stop();
+            iPhoneObserver->Start(iActiveNotifier);
+            }
+        }
+    #endif //__PROTOCOL_WCDMA || __UPIN
+
+#ifndef RD_STARTUP_CHANGE
+
+    if (iActiveNotifier == ESecurityNotifierSecurityCode)
+        {
+        #if defined(_DEBUG)
+	    RDebug::Print(_L("CSecObsNotify::RunL(): ESecurityNotifierSecurityCode"));
+	    #endif
+        if (iObserver->IsPassPhraseRequired() && SysStartup::State() != ESWStateNormal)
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::RunL(): ESecurityNotifierSecurityCode: IF"));
+	        #endif
+            iPhoneObserver->Stop();
+            iPhoneObserver->Start(iActiveNotifier);
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::RunL(): ESecurityNotifierSecurityCode: IF: END"));
+	        #endif
+            }
+        }
+#endif // RD_STARTUP_CHANGE 
+
+    CancelActiveNotifier();
+
+    if (iPendingNotifier != ESecurityNotifierNone)
+        {
+        #if defined(_DEBUG)
+	    RDebug::Print(_L("CSecObsNotify::RunL(): start pending notifier"));
+	    #endif
+        // previous notifier cancelled and we have pending notifier
+        StartNotifier(iPendingNotifier);
+
+#ifndef RD_STARTUP_CHANGE
+        #if defined(__PROTOCOL_WCDMA) || defined(__UPIN)
+        if(((iPendingNotifier == ESecurityNotifierPuk1) || (iPendingNotifier == ESecurityNotifierUPuk)) && iObserver->IsPassPhraseRequired())
+        #else
+        if((iPendingNotifier == ESecurityNotifierPuk1) && iObserver->IsPassPhraseRequired())
+        #endif //__PROTOCOL_WCDMA || __UPIN
+            { 
+            //PUK code query has been written in top of Sec code query in boot;
+            //it arrived before PIN code event was completed and Sec code event
+            //could be moved from pending to active. Putting sec code event
+            //back to pending event.
+            iPendingNotifier=ESecurityNotifierSecurityCode;
+            }
+        else
+            {
+            iPendingNotifier=ESecurityNotifierNone;
+            }
+#else // RD_STARTUP_CHANGE
+        iPendingNotifier=ESecurityNotifierNone;
+#endif // RD_STARTUP_CHANGE     
+        }
+  
+    }
+//
+// ----------------------------------------------------------
+// CSecObsNotify::CancelActiveNotifier
+// Cancels notifier
+// ----------------------------------------------------------
+//
+void CSecObsNotify::CancelActiveNotifier()
+    {
+    if (iActiveNotifier != ESecurityNotifierNone)
+        {
+        iNotifier.CancelNotifier(KSecurityNotifierUid);
+        iNotifier.Close();
+        iActiveNotifier=ESecurityNotifierNone;
+        }
+    }
+//
+// ----------------------------------------------------------
+// CSecObsNotify::StartNotifier
+// Starts given notifier asyncronously
+// ----------------------------------------------------------
+//
+void CSecObsNotify::StartNotifier( TSecurityNotifier aNotifierToStart )
+    {
+    #if defined(_DEBUG)
+	RDebug::Print(_L("CSecObsNotify::StartNotifier"));
+	#endif
+	    
+    #ifdef __SAP_TERMINAL_CONTROL_FW
+    // Check with the SCP Server whether this notification request resulted from an admin command,
+    // we're only interested in the security code events
+    if ( aNotifierToStart == ESecurityNotifierSecurityCode )        
+        {        
+        TBool isNormalCall = ETrue;
+        
+        RSCPClient SCPClient;
+        if ( SCPClient.Connect() == KErrNone )
+            {
+            if ( SCPClient.QueryAdminCmd( ESCPCommandLockPhone ) )
+                {
+                #if defined(_DEBUG)
+        	    RDebug::Print(_L("CSecObsNotify::SCP admin command, no action required"));
+	            #endif
+	    
+	            isNormalCall = EFalse;
+                }
+            
+            SCPClient.Close();            
+            }
+        
+        if ( !isNormalCall )
+            {
+            // Nothing further to be done in this method
+            return;
+            }
+        }
+    #endif //__SAP_TERMINAL_CONTROL_FW  
+    	
+    if(IsActive())
+        {
+        #if defined(_DEBUG)
+	    RDebug::Print(_L("CSecObsNotify::StartNotifier IsActive"));
+	    #endif
+        
+        if (iActiveNotifier != ESecurityNotifierNone)
+            {
+                #if defined(_DEBUG)
+	            RDebug::Print(_L("CSecObsNotify::StartNotifier: iActiveNotifier != ESecurityNotifierNone"));
+	            #endif
+                iPendingNotifier = aNotifierToStart; // to be started when previous has ended
+                return;
+            }
+
+        }
+    #if defined(_DEBUG)
+	RDebug::Print(_L("CSecObsNotify::StartNotifier: SWITCH"));
+	#endif
+	TInt err = KErrNone;
+    switch (aNotifierToStart)
+        {
+        #if defined(__PROTOCOL_WCDMA) || defined(__UPIN)
+        case ESecurityNotifierUPin:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: UPin"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KUPinRequired,iDummy);
+            break;
+            }
+        case ESecurityNotifierUPuk:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: UPuk"));
+	        #endif
+	        err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KUPukRequired,iDummy);
+            break;
+            }
+        #endif //__PROTOCOL_WCDMA
+        case ESecurityNotifierPin1:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: Pin1"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KPin1Required,iDummy);
+            break;
+            }
+        case ESecurityNotifierPuk1:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: Puk1"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KPuk1Required,iDummy);
+            break;
+            }
+        case ESecurityNotifierPin2:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: Pin2"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KPin2Required,iDummy);
+            break;
+            }
+        case ESecurityNotifierPuk2:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: Puk2"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KPuk2Required,iDummy);
+            break;
+            }
+        case ESecurityNotifierSecurityCode:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: Security Code"));
+	        #endif
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier ESecurityNotifierSecurityCode"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KPassPhraseRequired,iDummy);
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier SEC: StartNotifierAndGetResponse"));
+	        #endif
+            break;
+            }
+        case ESecuritySimLockRestrictionOn:
+            {
+            #if defined(_DEBUG)
+	        RDebug::Print(_L("CSecObsNotify::StartNotifier: Sim Lock"));
+	        #endif
+            err = iNotifier.Connect();
+            if(err == KErrNone)
+            	iNotifier.StartNotifierAndGetResponse(iStatus, KSecurityNotifierUid, KSimTerminated,iDummy);
+			break;
+            }
+        default:
+            iActiveNotifier = ESecurityNotifierNone;
+            return;
+        }
+    if (err != KErrNone)
+    {
+    	_LIT(panicCategory, "SecObsNotify PANIC");
+    	TInt reason(1);
+    	User::Panic(panicCategory, reason); 	
+    }
+    
+    iActiveNotifier = aNotifierToStart;
+    #if defined(_DEBUG)
+	RDebug::Print(_L("CSecObsNotify::StartNotifier SetActive"));
+	#endif
+    SetActive();
+    }
+
+//
+// ----------------------------------------------------------
+// CSecObsNotify::StartNotifier
+// Close open notifier
+// ----------------------------------------------------------
+//
+void CSecObsNotify::DoCancel()
+    {
+    CancelActiveNotifier();
+    }
+
+//  End of File