fmradio/fmradioengine/src/fmradiomobilenetworkinfolistener.cpp
branchRCL_3
changeset 20 93c594350b9a
parent 0 f3d95d9c00ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fmradio/fmradioengine/src/fmradiomobilenetworkinfolistener.cpp	Wed Sep 01 12:30:32 2010 +0100
@@ -0,0 +1,371 @@
+/*
+* Copyright (c) 2004-2007 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: Gets country code and network info from mobile network
+*
+*/
+
+
+// INCLUDES
+#ifdef __WINS__
+#include <centralrepository.h>
+#else
+#include <commsdattypesv1_1.h>
+#include <etel.h>
+#include <etelmm.h>
+#include <commsdat_partner.h>
+#endif
+
+#include "fmradionetworkchangeobserver.h"
+#include "fmradiomobilenetworkinfolistener.h"
+#include "fmradioenginecrkeys.h"
+
+using namespace CommsDat;
+
+
+#ifdef __WINS__
+// Default size for the cenrep query
+const TInt KFMRadioDefaultNetworkInfoBufferSize = 0x80; 
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+#ifdef __WINS__
+CFMRadioMobileNetworkInfoListener::CFMRadioMobileNetworkInfoListener(MFMRadioNetworkChangeObserver & aObserver) : 
+    CActive(CActive::EPriorityStandard), iNetworkChangeObserver(aObserver)
+#else
+CFMRadioMobileNetworkInfoListener::CFMRadioMobileNetworkInfoListener(MFMRadioNetworkChangeObserver & aObserver) : 
+    CActive(CActive::EPriorityStandard), iNetworkChangeObserver(aObserver), iNetworkInfo(), iNetworkInfoPckg(iNetworkInfo)
+#endif
+    {
+    }
+
+// EPOC default constructor can leave.
+void CFMRadioMobileNetworkInfoListener::ConstructL()
+    {
+
+#ifdef __WINS__
+    iSubscriberId = KNullDesC().AllocL();
+    
+    TRAPD( err, iRepository = CRepository::NewL( KCRUidFMRadioEngine ) )
+    if ( err == KErrNotFound )
+        {
+        // Central Repository not found, so don't request a notification
+        }
+    else if ( err != KErrNone )
+        {
+        User::Leave( err );
+        }
+    else 
+        {
+        // Read initial values from Central Repository
+        GetCenRepNetworkInfoL();
+		SaveNetworkInfo();
+        // Start listening
+        CActiveScheduler::Add( this );
+        User::LeaveIfError( iRepository->NotifyRequest( KFMRadioCREmulatorNetworkInfo, iStatus ) );
+        SetActive();
+        }
+#else
+	// Get default TSY from database.
+		
+	CMDBSession * db = CMDBSession::NewL(CMDBSession::LatestVersion());
+	CleanupStack::PushL(db);
+	
+	CMDBRecordSet<CCDModemBearerRecord> * set = new (ELeave) CMDBRecordSet<CCDModemBearerRecord>(KCDTIdModemBearerRecord);
+	CleanupStack::PushL(set);
+			
+	set->LoadL(*db);
+	
+	TInt index = 0;	
+	CCDModemBearerRecord * record = static_cast<CCDModemBearerRecord*>(set->iRecords[index++]);
+	
+	if(record->iTsyName.IsNull() && set->iRecords.Count() > index) // the first item is normally only a template
+		{
+		record = static_cast<CCDModemBearerRecord*>(set->iRecords[index++]);
+		}
+
+	TPtrC name(static_cast<const TDesC&>(record->iTsyName));
+	TBuf<KMaxTextLength> tsyName;
+	tsyName.Copy(name);
+	
+	CleanupStack::PopAndDestroy(set);
+	CleanupStack::PopAndDestroy(db);	
+
+	//  Open phone 
+	User::LeaveIfError(iTelServer.Connect());
+
+	// TSY module gets automatically unloaded when tel.Close() is called ( and tel is is CU-stack),
+	// so loaded TSY is also leave-safe
+	User::LeaveIfError(iTelServer.LoadPhoneModule(tsyName));
+	
+	// Get number of phones.
+	TInt phones(0);
+	User::LeaveIfError(iTelServer.EnumeratePhones(phones));
+
+	// Get phone info of first legal phone.
+	TInt legalPhoneIndex = KErrNotFound;
+	RTelServer::TPhoneInfo phoneInfo;
+	for (TInt i=0; i<phones && legalPhoneIndex == KErrNotFound; i++)
+		{
+		if (iTelServer.GetPhoneInfo(i, phoneInfo) == KErrNone)
+			{
+			if (phoneInfo.iNetworkType == RTelServer::ENetworkTypeMobileDigital)
+				{
+				legalPhoneIndex = i;
+				}
+			}
+		}
+	User::LeaveIfError(legalPhoneIndex);
+
+	// Open legal phone.
+	User::LeaveIfError(iPhone.Open(iTelServer, phoneInfo.iName));
+
+	TUint32 networkCaps;
+	User::LeaveIfError(iPhone.GetNetworkCaps(networkCaps));
+	TUint32 identityCaps;
+	User::LeaveIfError(iPhone.GetIdentityCaps(identityCaps));
+	// Check if we are allowed to get network info.
+	if (networkCaps & RMobilePhone::KCapsGetCurrentNetwork)
+		{
+		// Gather initial information synchronically.
+		iPhone.GetCurrentNetwork(iStatus, iNetworkInfoPckg, iLocation);
+		User::WaitForRequest(iStatus);
+		User::LeaveIfError(iStatus.Int());
+		SaveNetworkInfo();
+		// Start first notify request (if allowed).
+		if (networkCaps & RMobilePhone::KCapsNotifyCurrentNetwork)
+			{
+			CActiveScheduler::Add(this);
+			iPhone.NotifyCurrentNetworkChange(iStatus, iNetworkInfoPckg, iLocation);
+			SetActive();
+			}
+		}
+	else
+		{
+		// Leave if we are not allowed to get network info.
+		// Other action could also be considered!!!!
+		User::Leave(KErrNotSupported);
+		}
+	if(identityCaps & RMobilePhone::KCapsGetSubscriberId)
+		{
+		TRequestStatus stat;
+		RMobilePhone::TMobilePhoneSubscriberId subId;
+		iPhone.GetSubscriberId(stat, subId);
+		User::WaitForRequest(stat);
+		if(!stat.Int())
+			{
+			iSubscriberId = subId.AllocL();
+			}
+		else
+			{
+			iSubscriberId = KNullDesC().AllocL();
+			}
+		}
+#endif	
+  }
+
+
+// Two-phased constructor.
+CFMRadioMobileNetworkInfoListener* CFMRadioMobileNetworkInfoListener::NewL(MFMRadioNetworkChangeObserver & aObserver)
+    {
+    CFMRadioMobileNetworkInfoListener* self = new (ELeave) CFMRadioMobileNetworkInfoListener(aObserver);   
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+    
+// Destructor
+CFMRadioMobileNetworkInfoListener::~CFMRadioMobileNetworkInfoListener()
+	{
+	Cancel();
+#ifdef __WINS__
+    delete iRepository;
+    delete iEmulatorNetworkInfo;
+#else
+    iPhone.Close();
+    iTelServer.Close();
+#endif
+    delete iSubscriberId;
+	}
+
+
+// ---------------------------------------------------------
+// CFMRadioMobileNetworkInfoListener::RunL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CFMRadioMobileNetworkInfoListener::RunL()
+	{
+#ifdef __WINS__
+    GetCenRepNetworkInfoL();
+    SaveNetworkInfo();
+
+    User::LeaveIfError( iRepository->NotifyRequest( KFMRadioCREmulatorNetworkInfo, iStatus ) );
+    SetActive();
+#else
+	TInt statusCode = iStatus.Int();
+	if (statusCode == KErrNone)		// No other codes are returned (except error).
+		{
+		SaveNetworkInfo();
+		}
+	// Start new notify request.
+	iPhone.NotifyCurrentNetworkChange(iStatus, iNetworkInfoPckg, iLocation);
+	SetActive();
+#endif
+	}
+
+
+// ---------------------------------------------------------
+// CFMRadioMobileNetworkInfoListener::DoCancel
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CFMRadioMobileNetworkInfoListener::DoCancel()
+	{
+#ifdef __WINS__
+    iRepository->NotifyCancel( KFMRadioCREmulatorNetworkInfo );
+#else
+	iPhone.CancelAsyncRequest(EMobilePhoneNotifyCurrentNetworkChange);
+#endif
+	}
+
+// ---------------------------------------------------------
+// CFMRadioMobileNetworkInfoListener::SaveNetworkInfo
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CFMRadioMobileNetworkInfoListener::SaveNetworkInfo()
+	{
+#ifdef __WINS__
+    // iEmulatorNetworkInfo contains country code + network ID
+    if ( iEmulatorNetworkInfo && iEmulatorNetworkInfo->Length() > KFMRadioCREmulatorCountryCodeLength )
+        {
+        iCountryCode.Copy( iEmulatorNetworkInfo->Left( KFMRadioCREmulatorCountryCodeLength ) );
+        iNetworkId.Copy( iEmulatorNetworkInfo->Mid( KFMRadioCREmulatorCountryCodeLength, 
+            Min( iEmulatorNetworkInfo->Length() - KFMRadioCREmulatorCountryCodeLength, 
+                 iNetworkId.MaxLength() ) ) );
+        }
+    else
+        {
+        iCountryCode.Zero();
+        iNetworkId.Zero();
+        }
+#else
+	iNetworkInfo = iNetworkInfoPckg();
+	iNetworkId.Copy(iNetworkInfo.iNetworkId);
+	iCountryCode.Copy(iNetworkInfo.iCountryCode);
+#endif
+
+	// Create combine network ID and country code.
+	TBuf<20> compNetworkId;
+	compNetworkId.Append(iCountryCode);
+	// have to add '0' digit to the string to get correct id
+	// 24401 instead 2441, for example
+	if(iNetworkId.Length() < 2)
+		{
+		compNetworkId.AppendNum(static_cast<TInt64>(0));
+		}
+	compNetworkId.Append(iNetworkId);
+	TLex lexer(compNetworkId);
+	lexer.Val(iCompoundNetworkId);
+	if(iCompoundNetworkId != 0 && iPreviousCompoundNetworkId != iCompoundNetworkId)
+		{
+		if(iPreviousCompoundNetworkId != 0) 
+			{
+			iNetworkChangeObserver.NetworkIdChanged();
+			}
+		iPreviousCompoundNetworkId = iCompoundNetworkId;
+		}
+	}
+
+
+// ---------------------------------------------------------------------------
+// Reads network info from Central Repository
+// ---------------------------------------------------------------------------
+//
+#ifdef __WINS__
+void CFMRadioMobileNetworkInfoListener::GetCenRepNetworkInfoL()
+    {
+    TInt length = KFMRadioDefaultNetworkInfoBufferSize;
+    HBufC* valueString = HBufC::NewLC( length );
+    TInt error( KErrTooBig );
+
+    do
+        {
+        TPtr ptr = valueString->Des();
+
+        error = iRepository->Get( KFMRadioCREmulatorNetworkInfo, ptr );
+        if ( error == KErrTooBig )
+            {
+            CleanupStack::PopAndDestroy( valueString );
+            length = 2 * length;
+            valueString = HBufC::NewLC( length );
+            }
+        } while ( error == KErrTooBig );
+
+    if ( error ) 
+        {
+        TPtr ptr = valueString->Des();
+        ptr.Copy( KNullDesC() );	
+        }
+
+    CleanupStack::Pop( valueString );
+    delete iEmulatorNetworkInfo;
+    iEmulatorNetworkInfo = valueString;
+    }
+#endif
+
+
+// ---------------------------------------------------------
+// CFMRadioMobileNetworkInfoListener::CompoundNetworkId
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CFMRadioMobileNetworkInfoListener::CompoundNetworkId() const
+	{
+	return iCompoundNetworkId;
+	}
+
+// ---------------------------------------------------------
+// CFMRadioMobileNetworkInfoListener::CountryCode
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+const TDesC& CFMRadioMobileNetworkInfoListener::CountryCode() const
+	{
+	return iCountryCode;
+	}
+	
+// ---------------------------------------------------------
+// CFMRadioMobileNetworkInfoListener::SubscriberId
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+const TDesC& CFMRadioMobileNetworkInfoListener::SubscriberId() const
+	{
+	return *iSubscriberId;
+	}
+
+//  End of File