diff -r 000000000000 -r b497e44ab2fc omaprovisioning/provisioning/ProvisioningSC/Src/CWPProvisioningSC.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#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 + +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