diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/src/XcapEarlyIms.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/src/XcapEarlyIms.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,444 @@ +/* +* Copyright (c) 2005 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: CXcapEarlyIms +* +*/ + + + + +// INCLUDE FILES +#ifdef _DEBUG + #include + #include + #include +#endif +#include +#include +#include +#include +#include +#include "XcapEarlyIms.h" +#include "XcapUtilsInterface.h" + +// ---------------------------------------------------------- +// CXcapEarlyIms::CXcapEarlyIms +// +// ---------------------------------------------------------- +// +CXcapEarlyIms::CXcapEarlyIms() : CActive( EPriorityNormal ), + iRequestComplete( EFalse ), + iSimType( ESimTypeUnknown ) + + { + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXcapEarlyIms* CXcapEarlyIms::NewL() + { + CXcapEarlyIms* self = new ( ELeave ) CXcapEarlyIms(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------- +// CXcapEarlyIms::~CXcapEarlyIms +// +// ---------------------------------------------------- +// +CXcapEarlyIms::~CXcapEarlyIms() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::~CXcapEarlyIms()" ) ); + #endif + delete iImpu; + delete iImpi; + delete iAuthData; + delete iRetriever; + iPhone.Close(); + iServer.Close(); + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::ConstructL() + { + #ifdef _DEBUG + DeleteLogFileL(); + WriteToLog( _L8( "CXcapEarlyIms::ConstructL()" ) ); + #endif + #ifndef __FAKE_IMPU__ + TName tsyName; + TInt numPhone = 0; + TBool found = EFalse; + RTelServer::TPhoneInfo phoneInfo; + User::LeaveIfError( iServer.Connect() ); + TBuf tsyModuleName; + ModuleNameL( tsyModuleName ); + User::LeaveIfError( iServer.LoadPhoneModule( tsyModuleName ) ); + User::LeaveIfError( iServer.EnumeratePhones( numPhone ) ); + for( TInt i = 0;!found && i < numPhone;i++ ) + { + User::LeaveIfError( iServer.GetTsyName( i, tsyName ) ); + User::LeaveIfError( iServer.GetPhoneInfo( i, phoneInfo ) ); + if( tsyName.CompareF( tsyModuleName ) == 0 ) + found = ETrue; + } + __ASSERT_ALWAYS( found, User::Leave( KErrNotFound ) ); + User::LeaveIfError( iPhone.Open( iServer, phoneInfo.iName ) ); + SelectSimTypeL(); + #endif + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::RequestSimDataL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapEarlyIms::RequestSimDataL( MXcapEarlyImsObs* aObserver ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::RequestSimDataL()" ) ); + #endif + #ifdef __FAKE_IMPU__ + iStatus = KRequestPending; + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + #else + if( !IsActive() ) + { + TUint32 caps( 0 ); + User::LeaveIfError( iPhone.GetIdentityCaps( caps ) ); + if( !( caps & RMobilePhone::KCapsGetSubscriberId ) ) + User::Leave( KErrNotSupported ); + iPhone.GetSubscriberId( iStatus, iImsi ); + iRequestPhase = TRequestAuth; + iRequestComplete = EFalse; + SetActive(); + } + #endif + iObserver = aObserver; + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::PublicIDL +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapEarlyIms::PublicIDL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::PublicIDL()" ) ); + #endif + #ifdef __FAKE_IMPU__ + return KXcapFakeImpu(); + #else + if( iRequestComplete && iRequestPhase == TRequestIdle ) + { + switch( iSimType ) + { + case ESimTypeWcdma: + return iAuthData->iIMPUArray[0]; + case ESimTypeGsm: + return DeriveL(); + default: + return TPtrC8(); + } + } + else return TPtrC8(); + #endif + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::DeriveL +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapEarlyIms::DeriveL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::DeriveL()" ) ); + #endif + _LIT8( KImsMnc, "ims.mnc" ); + _LIT8( KMcc, ".mcc" ); + _LIT8( K3gppnetwork, ".3gppnetwork.org"); + _LIT8( KAt, "@"); + _LIT8( KSip, "sip:"); + _LIT8( KZero, "0"); + TPtrC networkDesc( iNetworkInfoPckg().iNetworkId ); + TPtrC countryDesc( iNetworkInfoPckg().iCountryCode ); + TInt nwlength = networkDesc.Length() + countryDesc.Length(); + if( networkDesc.Length() == 2 ) + nwlength = nwlength + 1; + //private user identity + TInt impiLength = iImsi.Length() + KAt().Length() + KImsMnc().Length() + + nwlength + KMcc().Length() + K3gppnetwork().Length(); + iImpi = HBufC8::NewL( impiLength ); + TPtr8 impiDesc( iImpi->Des() ); + impiDesc.Append( iImsi ); + impiDesc.Append( KAt ); + impiDesc.Append( KImsMnc ); + if( networkDesc.Length() == 2 ) + impiDesc.Append( KZero ); + impiDesc.Append( networkDesc ); + impiDesc.Append( KMcc ); + impiDesc.Append( countryDesc ); + impiDesc.Append( K3gppnetwork ); + //public user identity + TInt impuLength = KSip().Length() + impiDesc.Length(); + iImpu = HBufC8::NewL( impuLength ); + TPtr8 impuDesc( iImpu->Des() ); + impuDesc.Append( KSip ); + impuDesc.Append( impiDesc ); + #ifdef _DEBUG + WriteToLog( _L8( " IMPI: %S" ), &impiDesc ); + WriteToLog( _L8( " IMPU: %S" ), &impuDesc ); + #endif + return impuDesc; + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::SelectSimTypeL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::SelectSimTypeL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::SelectSimTypeL()" ) ); + #endif + TUint32 caps; + User::LeaveIfError( iPhone.GetIccAccessCaps( caps ) ); + if( caps & RMobilePhone::KCapsSimAccessSupported ) + { + if( caps & RMobilePhone::KCapsUSimAccessSupported ) + { + #ifdef _DEBUG + WriteToLog( _L8( " USIM Card" ) ); + #endif + iSimType = ESimTypeWcdma; + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " 2G SIM Card" ) ); + #endif + iSimType = ESimTypeGsm; + } + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " No SIM Card" ) ); + #endif + iSimType = ESimTypeUnknown; + } + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::RunL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::RunL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::RunL()" ) ); + WriteToLog( _L8( " Status: %d" ), iStatus.Int() ); + WriteToLog( _L8( " Request phase: %d" ), iRequestPhase ); + #endif + #ifdef __FAKE_IMPU__ + iObserver->RequestComplete( KErrNone ); + #else + if( iStatus.Int() == KErrNone ) + { + switch( iRequestPhase ) + { + case TRequestIdle: + break; + case TRequestAuth: + { + #ifdef _DEBUG + HBufC8* buf = HBufC8::NewLC( iImsi.Length() ); + TPtr8 desc( buf->Des() ); + desc.Copy( iImsi ); + WriteToLog( _L8( " IMSI retrieved: %S" ), &desc ); + CleanupStack::PopAndDestroy(); //buf + #endif + iPhone.GetHomeNetwork( iStatus, iNetworkInfoPckg ); + iRequestPhase = TRequestNetwork; + SetActive(); + } + break; + case TRequestNetwork: + { + #ifdef _DEBUG + HBufC8* nwid = HBufC8::NewLC( iNetworkInfoPckg().iNetworkId.Length() ); + HBufC8* country = HBufC8::NewLC( iNetworkInfoPckg().iCountryCode.Length() ); + TPtr8 desc1( nwid->Des() ); + TPtr8 desc2( country->Des() ); + desc1.Copy( iNetworkInfoPckg().iNetworkId ); + desc2.Copy( iNetworkInfoPckg().iCountryCode ); + WriteToLog( _L8( " Home network info retrieved" ) ); + WriteToLog( _L8( " Network ID: %S" ), &desc1 ); + WriteToLog( _L8( " Country code: %S" ), &desc2 ); + CleanupStack::PopAndDestroy( 2 ); //country, nwid + #endif + if( iSimType == ESimTypeWcdma ) + { + iAuthData = RMobilePhone::CImsAuthorizationInfoV5::NewL(); + iRetriever = CAsyncRetrieveAuthorizationInfo::NewL( iPhone, *iAuthData ); + iRequestPhase = TRequestUsimAuth; + iRetriever->Start( iStatus ); + SetActive(); + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Request complete" ) ); + #endif + iObserver->RequestComplete( KErrNone ); + iRequestPhase = TRequestIdle; + iRequestComplete = ETrue; + } + } + break; + case TRequestUsimAuth: + { + #ifdef _DEBUG + RMobilePhone::TAuthorizationDataSource source( + iAuthData->iAuthenticationDataSource ); + TBuf8<4> sourceDesc( source == RMobilePhone::EFromUSIM + ? _L8( "USIM" ) : _L8( "ISIM" ) ); + WriteToLog( _L8( " USIM auth retrieved" ) ); + WriteToLog( _L8( " IMPI: %S" ), &iAuthData->iIMPI ); + WriteToLog( _L8( " IMPU: %S" ), &iAuthData->iIMPUArray[0] ); + WriteToLog( _L8( " Domain: %S" ), &iAuthData->iHomeNetworkDomainName ); + WriteToLog( _L8( " AuthDataSource: %S" ), &sourceDesc ); + #endif + iObserver->RequestComplete( KErrNone ); + iRequestPhase = TRequestIdle; + iRequestComplete = ETrue; + } + break; + default: + break; + } + } + else iObserver->RequestComplete( iStatus.Int() ); + #endif + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::DoCancel +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::DoCancel() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::DoCancel() - State: %d" ), iRequestPhase ); + #endif + switch( iRequestPhase ) + { + case TRequestIdle: + break; + case TRequestAuth: + iPhone.CancelAsyncRequest( EMobilePhoneGetSubscriberId ); + break; + case TRequestNetwork: + iPhone.CancelAsyncRequest( EMobilePhoneGetHomeNetwork ); + break; + case TRequestUsimAuth: + delete iRetriever; + iRetriever = NULL; + break; + default: + break; + } + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::ModuleNameL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::ModuleNameL( TDes& aModuleName ) const + { + __ASSERT_ALWAYS( aModuleName.MaxSize() >= KCommsDbSvrMaxFieldLength, User::Leave( KErrArgument ) ); + using namespace CommsDat; + CMDBSession* db = CMDBSession::NewLC( KCDLatestVersion ); + CMDBField* field = new ( ELeave ) CMDBField( KCDTIdModemPhoneServicesSMS ); + CleanupStack::PushL( field ); + field->SetRecordId( 1 ); + field->LoadL( *db ); + TUint32 modemId = *field; + CMDBField* tsyField = new ( ELeave ) CMDBField( KCDTIdTsyName ); + CleanupStack::PushL( tsyField ); + tsyField->SetRecordId( modemId ); + tsyField->LoadL( *db ); + aModuleName = *tsyField; + CleanupStack::PopAndDestroy( 3 ); //tsyField, field, db + } + +#ifdef _DEBUG +// ---------------------------------------------------- +// CXcapEarlyIms::WriteToLog +// +// ---------------------------------------------------- +// +void CXcapEarlyIms::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + RFileLogger::Write( KUtilsLogDir, KUtilsLogFile, EFileLoggingModeAppend, buf ); + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::DeleteLogFileL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::DeleteLogFileL() + { + RFs session; + TBuf<32> log( _L( "C:\\logs\\XDM\\" ) ); + User::LeaveIfError( session.Connect() ); + CFileMan* manager = CFileMan::NewL( session ); + log.Append( KUtilsLogFile ); + manager->Delete( log ); + session.Close(); + delete manager; + manager = NULL; + } +#endif //_DEBUG + + + + + +// End of File