omaprovisioning/provisioning/ProvisioningSC/Src/CWPProvisioningSC.cpp
changeset 0 b497e44ab2fc
child 65 5cc2995847ea
child 77 9f85c58c0592
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omaprovisioning/provisioning/ProvisioningSC/Src/CWPProvisioningSC.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,408 @@
+/*
+* Copyright (c) 2002-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:  Reads a provisioning document from a SIM/WIM card
+*
+*/
+
+
+// INCLUDE FILES
+#include	"CWPProvisioningSC.h"
+
+#include	<eikdll.h>
+#include	<e32std.h>
+#include	<e32svr.h>
+#include	<e32base.h>
+#include	<CWPEngine.h>
+#include	<AknGlobalNote.h> 
+#include	<ProvisioningSC.rsg>
+#include	<WPAdapterUtil.h>
+#include	"MWPPhone.h"
+#include	"CWPPushMessage.h"
+#include	"CWPBootstrap.h"
+#include	"CWPImsiDbHandler.h"
+#include	"CWPWimHandler.h"
+#include	"CWPBioMsgHandler.h"
+#include	"WPPhoneFactory.h"
+#include	"ProvisioningDebug.h"
+#include	"WPProvScPaths.h"
+#include	<ProvSC.h>
+
+const TInt KPhoneRetryCount = 7;
+const TInt KPhoneRetryTimeout = 100000; 
+
+_LIT( KProvisioningSCThread, "ProvisioningSC" );
+
+// LOCAL FUNCTION PROTOTYPES
+
+// Initializes the server.
+LOCAL_C void InitProvScL();
+
+
+
+
+// ==================== LOCAL FUNCTIONS ====================
+
+LOCAL_C void InitProvScL()
+	{
+	FLOG( _L( "[ProvisioningSC] InitProvScL" ) );
+
+__UHEAP_MARK;
+
+	TBool acInstalled( EFalse );
+    // Scheduler exists before this point only in test code:
+	if( CActiveScheduler::Current()==NULL )
+		{
+		CActiveScheduler* ac = new (ELeave) CActiveScheduler;
+		CleanupStack::PushL( ac ) ;
+		CActiveScheduler::Install( ac );
+		acInstalled = ETrue;
+		}
+	
+	CWPProvisioningSC* reader = CWPProvisioningSC::NewLC();
+      RProcess::Rendezvous(KErrNone);
+	if ( reader->ReadFile() )  
+		{
+        FLOG( _L( "[ProvisioningSC] InitProvScL starting sched" ) );
+		CActiveScheduler::Start();  // start only if request issued
+		FLOG( _L( "[ProvisioningSC] InitProvScL, after shed start, continuing" ) );
+		}
+
+	CleanupStack::PopAndDestroy(  ); // reader
+	if( acInstalled )
+		{
+		FLOG( _L( "[ProvisioningSC] InitProvScL acinstalled - uninstalling." ) );
+		CActiveScheduler::Install( NULL ); // uninstall
+		CleanupStack::PopAndDestroy(); // ac
+		}
+
+__UHEAP_MARKEND;
+	}
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::CWPProvisioningSC
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CWPProvisioningSC::CWPProvisioningSC()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CWPProvisioningSC::ConstructL()
+    {
+    User::RenameThread( KProvisioningSCThread );
+	iImsiHandler = CWPImsiDbHandler::NewL(); // 1
+	TBool isOld = ProcessImsiL( iPhoneImsi ); 
+	if( !isOld )
+		{
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ConstructL new imsi" ) );
+		iWimHandler = CWPWimHandler::NewL( *this );
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ConstructL StoreImsi" ) );
+		iImsiHandler->StoreImsiL( iPhoneImsi );
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWPProvisioningSC* CWPProvisioningSC::NewL()
+    {
+	CWPProvisioningSC* self = CWPProvisioningSC::NewLC();
+	CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWPProvisioningSC* CWPProvisioningSC::NewLC()
+    {
+    CWPProvisioningSC* self = new( ELeave ) CWPProvisioningSC;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::Destructor
+// 
+// -----------------------------------------------------------------------------
+//
+CWPProvisioningSC::~CWPProvisioningSC()
+    {
+	delete iProvisioningDoc;
+	delete iImsiNumbers;
+	delete iWimHandler;
+	delete iImsiHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ReadCompletedL
+// -----------------------------------------------------------------------------
+//
+void CWPProvisioningSC::ReadCompletedL()
+	{
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ReadCompletedL" ) );
+	iProvisioningDoc = iWimHandler->DocL( );
+
+	TRAPD( err, StoreDocL( *iProvisioningDoc ));
+	if( err == KErrDiskFull || err == KErrNoMemory  )
+		{
+		ShowMemoryLowNoteL();
+		}
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ReadCompletedL stopping sched" ) );
+	CActiveScheduler::Stop();
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ReadCompletedL sched stopped" ) );
+	}	
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ReadCancelledL
+// -----------------------------------------------------------------------------
+//
+void CWPProvisioningSC::ReadCancelledL()
+	{
+	if( iWimHandler )
+		{
+		CActiveScheduler::Stop();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ReadErrorL
+// -----------------------------------------------------------------------------
+//
+void CWPProvisioningSC::ReadErrorL()
+	{
+	if( iWimHandler )
+		{
+		CActiveScheduler::Stop();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ProcessImsiL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CWPProvisioningSC::ProcessImsiL( TDes& aPhoneImsi )
+	{
+	TBool isOldImsi( ETrue );
+	if( iImsiHandler )
+		{
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ProcessImsiL" ) );
+		TInt err( KErrNotFound );
+		MWPPhone* phone = NULL; 
+		for ( TInt j = 0 ; j < KPhoneRetryCount ; j++ )
+			{
+			TRAP( err,  phone = WPPhoneFactory::CreateL() ); 
+			// note: phone not in cleanupstack
+			if ( err == KErrNone )
+				{
+				aPhoneImsi.Copy( phone->SubscriberId() ); // store imsi
+				delete phone; 
+				phone = NULL;
+				break;
+				}
+			User::After( KPhoneRetryTimeout );
+			}
+		User::LeaveIfError( err );
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ProcessImsiL imsiexistsL?" ) );
+		isOldImsi = iImsiHandler->ImsiExistsL( aPhoneImsi );
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ProcessImsiL imsiexistsL ok" ) );
+		}
+	return isOldImsi;
+	}
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ReadFileL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CWPProvisioningSC::ReadFile()
+	{
+    FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ReadFile" ) );	
+	if( iWimHandler )
+		{
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ReadFile wimhandler" ) );
+		iWimHandler->ReadProvFile( EBootStrap );
+		return ETrue;
+		}
+	else
+		{
+		FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::ReadFile wimhandler null" ) );
+		return EFalse;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::ShowMemoryLowNoteL
+//
+// -----------------------------------------------------------------------------
+//
+void CWPProvisioningSC::ShowMemoryLowNoteL()
+	{
+
+	TFileName fileName;
+	#ifndef __WINS__
+	fileName = RProcess().FileName();
+	#else
+	Dll::FileName( fileName );
+	#endif
+
+	HBufC* memLowText = WPAdapterUtil::ReadHBufCL( fileName,
+												KWPProvSCName,
+												R_TEXT_MEM_SUCS );
+    CleanupStack::PushL( memLowText );  // 1
+	CAknGlobalNote* note = CAknGlobalNote::NewLC();  // 2
+	note->ShowNoteL( EAknGlobalInformationNote, *memLowText );
+	CleanupStack::PopAndDestroy( 2 ); // note, memLowText
+	}
+
+// -----------------------------------------------------------------------------
+// CWPProvisioningSC::StoreDocL
+//
+// -----------------------------------------------------------------------------
+//
+
+void CWPProvisioningSC::StoreDocL( TDesC8& aProvDoc )
+	{
+    FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL" ) );
+    
+    HBufC8* convert = aProvDoc.Alloc();
+       
+    TPtr8 ptrBuffer( convert->Des() );
+
+	while ( ( ptrBuffer[ptrBuffer.Length()-1 ] == 0xFF ) && (ptrBuffer.Length() > 1 ) )
+	    {
+		FTRACE(RDebug::Print(_L("[ProvisioningSC] CWPProvisioningSC::StoreDocL ... deleting (%d)"), (ptrBuffer.Length()-1)));
+		ptrBuffer.Delete( ( ptrBuffer.Length()-1 ) , 1 );
+	    }
+	    
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL cleanup done" ) );
+        
+	aProvDoc = *convert;
+    delete convert;
+    
+    #ifdef _DEBUG
+    FHex(aProvDoc);
+    #endif
+    
+	CWPBioMsgHandler* msgHandler = CWPBioMsgHandler::NewLC(); // 1
+	CWPPushMessage* msg = msgHandler->CreateMessageLC( aProvDoc ); // 2
+	msg->SetAuthenticated( ETrue );
+
+    // 0. read the message into the engine
+    CWPEngine* engine = CWPEngine::NewLC();  // 3
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL2" ) );
+	#ifdef _DEBUG
+	FHex(msg->Body() );
+	#endif
+    engine->ImportDocumentL( msg->Body() );
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL3" ) );
+	engine->PopulateL();
+
+	// 1. process bootstrap
+    CWPBootstrap* bootstrap = CWPBootstrap::NewL( iPhoneImsi );
+    CleanupStack::PushL( bootstrap );// 4
+	FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL4" ) );
+    CWPBootstrap::TBootstrapResult bootstrapResult( 
+        bootstrap->BootstrapL( *msg, *engine, KNullDesC ) );
+    CleanupStack::PopAndDestroy(); // bootstrap, 4 
+	TBool haveSettings( engine->ItemCount() > 0 );
+
+	// 2.A Does the message contain bootstrap?
+	switch( bootstrapResult )
+		{
+	case CWPBootstrap::ESucceeded:
+			// fallthrough
+		case  CWPBootstrap::EBootstrapExists:
+		{
+		if( haveSettings ) 
+			{
+			FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL5" ) );
+			msgHandler->StoreMessageL( *msg );
+			FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL6" ) );
+			}
+		else
+			{
+			// no other settings than the TPS, store a note into inbox
+			// but first check that the TPS is not already defined
+			if(!( bootstrapResult == CWPBootstrap::EBootstrapExists ) )
+				{
+				FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL8" ) );
+				msgHandler->StoreMessageL( R_TEXT_PROV_SUCS, *msg );
+				FLOG( _L( "[ProvisioningSC] CWPProvisioningSC::StoreDocL9" ) );;
+				}
+			}
+		break;
+		}
+		// 2.B No bootstrap
+	case CWPBootstrap::ENoBootstrap:
+		{	
+		if( haveSettings )
+			{
+			// 2.B.I store settings into inbox
+			msgHandler->StoreMessageL( *msg );
+			}
+			// 2.B.II, no boostrap, no settings -> just ignore message.
+		break;
+		}	
+	default:
+		{
+		break;
+		}
+	} // switch
+	CleanupStack::PopAndDestroy( 3 ); // msg, handler, engine
+	}
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+// ---------------------------------------------------------
+// E32Main implements the executable entry function.
+// Note that because the target type of the ProvSC module
+// is EXEDLL, the entry point has different signature depending
+// on the build platform.
+// Creates a cleanup stack and runs the server.
+// Returns: Zero.
+
+#if defined (__WINS__)
+IMPORT_C TInt WinsMain();
+EXPORT_C TInt WinsMain()
+
+#else  //if defined(__EPOC32__)
+
+GLDEF_C TInt E32Main()
+
+#endif
+    {
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+    TRAPD( error, InitProvScL() );
+    if ( error ) error = 0; // prevent compiler warning	
+	delete cleanup;
+	return KErrNone; 
+    }
+
+//  End of File