realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofileusimprovider.cpp
changeset 0 307788aac0a8
child 16 43c4dec3cb1f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofileusimprovider.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,368 @@
+// Copyright (c) 2005-2009 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:
+// Name          : Sipimsprofileusimprovider.cpp
+// Part of       : ProfileAgent
+// Version       : SIP/4.0 
+//
+
+
+
+#include "Sipimsprofileusimprovider.h"
+#include "sipprofileimsauthorization.h"
+#include "sipprofilesimauthorization.h"
+#include "sipimsprofilemccandmnc.h"
+#include "msipprofileimsauthenticationdataobserver.h"
+#include "Sipimsprofilesimrecord.h"
+#include "SipProfileLog.h"
+#include "authinfomonitor.h"
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::NewL
+// ----------------------------------------------------------------------------
+//
+CSIPProfileUsimProvider* CSIPProfileUsimProvider::NewL( 
+    CSIPProfileSIMRecord& aUserRecord,
+    RTelServer& aTelServer,
+    const RTelServer::TPhoneInfo& aPhoneInfo,
+    MSIPProfileIMSAuthenticationDataObserver& aObserver )
+    {    
+    CSIPProfileUsimProvider* self = 
+        new (ELeave) CSIPProfileUsimProvider( aUserRecord, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aTelServer, aPhoneInfo );
+    CleanupStack::Pop( self );
+    return self;    
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::CSIPProfileUsimProvider
+// ----------------------------------------------------------------------------
+//
+CSIPProfileUsimProvider::CSIPProfileUsimProvider( 
+    CSIPProfileSIMRecord& aUserRecord,
+    MSIPProfileIMSAuthenticationDataObserver& aObserver ) 
+ : iProfileSIMRecord( aUserRecord ),
+   iObserver( aObserver ),
+   iSIMSupported( EFalse ),
+   iUSimSupported( EFalse )
+	{	
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::ConstructL( 
+    RTelServer& aTelServer,
+    const RTelServer::TPhoneInfo& aPhoneInfo )
+    {
+    PROFILE_DEBUG1("CSIPProfileUsimProvider::ConstructL")
+    
+    User::LeaveIfError( iPhone.Open( aTelServer, aPhoneInfo.iName ) );
+
+	TUint32 caps;
+	User::LeaveIfError(iPhone.GetIccAccessCaps(caps));
+	if(caps & RMobilePhone::KCapsSimAccessSupported)
+		{
+		iSIMSupported = ETrue;
+		}
+	
+	if(caps & RMobilePhone::KCapsRUimAccessSupported)
+		{
+		}
+	
+	//usim supported
+	if(caps & RMobilePhone::KCapsUSimAccessSupported)
+		{			
+		iUSimSupported = ETrue;
+		}
+	
+	if(!iUSimSupported && iSIMSupported)
+		{
+		delete iAuthorization;
+		iAuthorization = NULL;
+		iAuthorizationSIM = 
+					CSIPProfileSIMAuthorization::NewL( *this , iPhone); 
+		iAuthorizationHomeNetwork = 
+					CSIPIMSProfileMCCandMNC::NewL( *this , iPhone);
+		}
+	else
+		{
+		if(iUSimSupported)
+			{
+			iAuthorization = CSIPProfileIMSAuthorization::NewL( *this,
+															    iPhone );
+			iAuthorizationSIM = 
+					CSIPProfileSIMAuthorization::NewL( *this , iPhone); 
+			iAuthorizationHomeNetwork = 
+					CSIPIMSProfileMCCandMNC::NewL( *this , iPhone);
+			iAuthInfoMonitor = CAuthInfoMonitor::NewL( *this, iPhone );
+			}
+		}
+	if(!iUSimSupported && !iSIMSupported)
+		{
+		User::Leave(KErrNotSupported);	
+		}
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::IsSIMSupported
+// ----------------------------------------------------------------------------
+//
+TBool CSIPProfileUsimProvider::IsSIMSupported()
+    {
+    return iSIMSupported;
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::IsUsimSupported
+// ----------------------------------------------------------------------------
+//
+TBool CSIPProfileUsimProvider::IsUsimSupported()
+    {
+    return iUSimSupported;
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::~CSIPProfileUsimProvider
+// ----------------------------------------------------------------------------
+//
+CSIPProfileUsimProvider::~CSIPProfileUsimProvider()
+    {
+    delete iAuthorization;
+    delete iAuthorizationSIM;
+    delete iAuthorizationHomeNetwork;
+    delete iAuthInfoMonitor;
+    iPhone.Close();
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::RequestL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::RequestL(TBool /*aUseSIM*/)
+    {
+    TBool requestmade = EFalse;
+    if (!iProfileSIMRecord.SIMPrivateIdentity().Length())
+  		{
+  		if (iAuthorizationSIM)
+  			{
+  			iAuthorizationSIM->RequestL();
+  			requestmade = ETrue;
+  			}
+		else
+			{
+			User::Leave(KErrArgument);
+			}
+  		}
+  		
+  	if (IsUsimSupported())
+		{
+  		if (!iProfileSIMRecord.PrivateIdentity().Length())
+  			{   
+    		iAuthorization->RequestL();
+    		requestmade = ETrue;
+  			}
+		}
+    if (!requestmade)
+    	{
+    	iObserver.AsyncDeltaTimer();
+    	}
+    }   
+            
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::Cancel
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::Cancel()
+    {
+    if (iAuthorization)
+    	{
+    	iAuthorization->Cancel();
+    	}
+    if(iAuthorizationSIM)
+    	{
+    	iAuthorizationSIM->Cancel();
+    	}
+    if(iAuthorizationHomeNetwork)
+    	{
+    	iAuthorizationHomeNetwork->Cancel();
+    	}
+    }
+        
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::AuthorizedL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::AuthorizedL()
+    {
+    if (iAuthorization)
+    	{
+    	RMobilePhone::CImsAuthorizationInfoV5& authorization = 
+                                            iAuthorization->Response();
+
+    	iProfileSIMRecord.SetPrivateIdL(authorization.iIMPI);
+    	iProfileSIMRecord.SetFirstPublicUserNameL(authorization.iIMPUArray[0]);
+    	iProfileSIMRecord.SetHomeNetworkDomainNameL(
+    									authorization.iHomeNetworkDomainName);
+    	iProfileSIMRecord.SetISIMPresent(
+    	    authorization.iAuthenticationDataSource == RMobilePhone::EFromISIM);
+    	
+    	iObserver.AuthorizedL();
+    	}
+    }    
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::AuthorizedSubscriberIdL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::AuthorizedSubscriberIdL()
+    {
+    iAuthorizationHomeNetwork->RequestL();
+    }    
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::AuthorizedHomeNetworkIdL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::AuthorizedHomeNetworkIdL()
+    {
+    DeriveValuesL();
+    }    
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::DeriveValuesL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::DeriveValuesL()
+    {    
+    _LIT8(Kimsmnc, "ims.mnc");
+    _LIT8(Kmcc, ".mcc");
+    _LIT8(K3gppnetwork, ".3gppnetwork.org");
+    _LIT8(Kato, "@");
+    _LIT8(Ksip, "sip:");
+    _LIT8(KZero, "0");
+    
+    //homenetwork domain name
+    TUint mncmcclength = 
+    		iAuthorizationHomeNetwork->NetworkIdentityCode().Length() 
+    		+ iAuthorizationHomeNetwork->NetworkCountryCode().Length();
+    if (iAuthorizationHomeNetwork->NetworkIdentityCode().Length() == 2)
+    	{
+    	mncmcclength = mncmcclength + 1;
+    	}
+    
+    TUint appendlength = Kimsmnc().Length() + Kmcc().Length() 
+    					+ K3gppnetwork().Length() + mncmcclength;
+    									
+    HBufC8* appendingResult = HBufC8::NewL(appendlength);
+	TPtr8 appendingResultPtr = appendingResult->Des();
+
+	appendingResultPtr.Append(Kimsmnc);
+	if (iAuthorizationHomeNetwork->NetworkIdentityCode().Length() == 2)
+    	{
+    	appendingResultPtr.Append(KZero);
+    	}
+	appendingResultPtr.Append(iAuthorizationHomeNetwork->NetworkIdentityCode());
+	appendingResultPtr.Append(Kmcc);
+	appendingResultPtr.Append(iAuthorizationHomeNetwork->NetworkCountryCode());
+	appendingResultPtr.Append(K3gppnetwork);
+    CleanupStack::PushL(appendingResult);
+    iProfileSIMRecord.SetSIMHomeNetworkDomainNameL(*appendingResult);
+    CleanupStack::Pop(appendingResult);
+    delete appendingResult;
+    appendingResult = NULL;
+    
+    //private user identity
+    appendlength = 0;
+    appendlength = iAuthorizationSIM->IMSI().Length() + Kato().Length() 
+    			+ Kimsmnc().Length() + mncmcclength + Kmcc().Length() 
+    			+ K3gppnetwork().Length();
+   
+    HBufC8* result = HBufC8::NewL(appendlength);
+	TPtr8 resultPtr = result->Des();
+	resultPtr.Append(iAuthorizationSIM->IMSI());
+	resultPtr.Append(Kato);
+	resultPtr.Append(Kimsmnc);
+	if (iAuthorizationHomeNetwork->NetworkIdentityCode().Length() == 2)
+    	{
+    	resultPtr.Append(KZero);
+    	}	
+	resultPtr.Append(iAuthorizationHomeNetwork->NetworkIdentityCode());	
+	resultPtr.Append(Kmcc);	
+	resultPtr.Append(iAuthorizationHomeNetwork->NetworkCountryCode());
+	resultPtr.Append(K3gppnetwork);
+    CleanupStack::PushL(result);
+    iProfileSIMRecord.SetSIMPrivateIdL(*result);    
+    CleanupStack::Pop(result);
+    delete result;
+    result = NULL;
+    
+    //public user identity
+    
+    appendlength = Ksip().Length() + 
+    			   iProfileSIMRecord.SIMPrivateIdentity().Length();
+    HBufC8* temp = HBufC8::NewL(appendlength);
+    TPtr8 tempPtr = temp->Des();
+    tempPtr = temp->Des();
+    tempPtr.Append(Ksip);
+	tempPtr.Append(iProfileSIMRecord.SIMPrivateIdentity());
+    
+    CleanupStack::PushL(temp);
+    iProfileSIMRecord.SetSIMFirstPublicUserNameL(*temp);
+    CleanupStack::Pop(temp);
+    delete temp;
+    temp = NULL;
+    iObserver.AuthorizedL();
+     }    
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::AuthorizationFailed
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::AuthorizationFailed()
+    {
+    iProfileSIMRecord.UserRecordFailed(KErrArgument);
+
+    iObserver.AuthorizationFailed();
+  }
+  
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::AuthorizationSIMFailed
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::AuthorizationSIMFailed()
+    {
+    iProfileSIMRecord.UserRecordFailed(KErrArgument);
+
+    iObserver.AuthorizationSIMFailed();
+  }
+
+// ----------------------------------------------------------------------------
+// CSIPProfileUsimProvider::AuthInfoUpdatedL
+// ----------------------------------------------------------------------------
+//
+void CSIPProfileUsimProvider::AuthInfoUpdatedL()
+	{
+	iProfileSIMRecord.ResetISIMValuesL();
+	iObserver.UpdateRegistrationsL();
+  	if (!iProfileSIMRecord.PrivateIdentity().Length())
+  		{   
+    	iAuthorization->RequestL();
+  		}
+	}
+
+// End of File