genericpositioningplugins/locationsuplpsy/src/suplpsycellidhandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 18:40:52 +0300
changeset 32 b12ea03c50a3
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* Copyright (c) 2008 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:  Cell Id implementaion in SUPL PSY.
*
*/


// INCLUDE FILES

#include <centralrepository.h> 
#include <commdb.h>

#include "suplpsylogging.h"
#include "suplpsycellidhandler.h"


// ============================ MEMBER FUNCTIONS OF CSuplPsyCellIdHandler ===============================

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::CSuplPsyCellIdHandler,constuctor
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//

CSuplPsyCellIdHandler::CSuplPsyCellIdHandler( MBasicCellIDListener& aObserver ) 
					    : CActive( EPriorityStandard ),
					      iNetworkInfoPkg( iNetworkInfo ),
					      iObserver( aObserver ),
					      iNetworkType( EUnknown ),
					      iCellIdInfo( NULL )
	{
	CActiveScheduler::Add( this );            
	}

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::ConstructL,two phase constuctor
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSuplPsyCellIdHandler::ConstructL()
    {
    TRACESTRING( "CSuplPsyCellIdHandler::ConstructL start" )
    iIsInitilized = EFalse;
    User::LeaveIfError( ConnectToETelL() );
    iIsInitilized = ETrue;	
    TRACESTRING( "CSuplPsyCellIdHandler::ConstructL end" )
    }

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::NewL,two phase constuctor
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CSuplPsyCellIdHandler* CSuplPsyCellIdHandler::NewL( MBasicCellIDListener& aObserver )
    {
    CSuplPsyCellIdHandler* self = new( ELeave ) CSuplPsyCellIdHandler( aObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }


// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::DoCancel
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSuplPsyCellIdHandler::DoCancel()
    {
	TRACESTRING( "CSuplPsyCellIdHandler::DoCancel start" )
	iPhone.CancelAsyncRequest( EMobilePhoneGetCurrentNetwork ); 
	TRACESTRING( "CSuplPsyCellIdHandler::DoCancel end" )           
    }            

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::~CSuplPsyCellIdHandler,Destructor
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CSuplPsyCellIdHandler::~CSuplPsyCellIdHandler()
    {
	TRACESTRING( "CSuplPsyCellIdHandler::~CSuplPsyCellIdHandler start" )
	Cancel();
	iPhone.Close(); 
	if ( iIsInitilized )
		{
		iTelServer.UnloadPhoneModule(iTsyName);	
		}
			
	iTelServer.Close();
	
	TRACESTRING( "CSuplPsyCellIdHandler::~CSuplPsyCellIdHandler end" )
    }
            
// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::GetCellID,For retriving the cell id information
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSuplPsyCellIdHandler::GetCellID( TCellIdInfo& aCellIdInfo )
    {
	TRACESTRING("CSuplPsyCellIdHandler::GetCellID start")
	if( IsActive() )
		{
		return;
		}
	iCellIdInfo = &aCellIdInfo;
	iPhone.GetCurrentNetwork( iStatus, iNetworkInfoPkg, iLocationInfo );
	SetActive();            
    TRACESTRING("CSuplPsyCellIdHandler::GetCellID end")
    }  
      

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::NetworkType
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CSuplPsyCellIdHandler::TNetworkTypeInfo CSuplPsyCellIdHandler::NetworkType() const
	{
	return iNetworkType;
	}

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::RunL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSuplPsyCellIdHandler::RunL()
    {
	TRACESTRING("CSuplPsyCellIdHandler::RunL start")
    
    TInt err = iStatus.Int();
    TRACESTRING2("Request Completed with Error Code: %d",err )
    	
	if ( err == KErrNone )
		{       
		HandleCellInfoL();
		}
	else
		{
		iObserver.BasicCellIDRequestCompletedL( KErrNotFound );    
		}
    TRACESTRING("CSuplPsyCellIdHandler::RunL end")
    }

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::HandleCellInfoL(),
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSuplPsyCellIdHandler::HandleCellInfoL()
	{
    TRACESTRING("CSuplPsyCellIdHandler::HandleCellInfoL start")
    
        
    switch (iNetworkInfo.iMode) 
    	{
        case RMobilePhone::ENetworkModeGsm:
        	{
        	TRACESTRING("GSM Network")
        	//For GSM Cell Information
			iNetworkType = EGSM;
			
			TInt    MCC=0;
			TInt64  MNC=0;
			TLex LexMCC(iNetworkInfo.iCountryCode);
			TLex LexMNC(iNetworkInfo.iNetworkId);

			LexMCC.Val(MCC);
			LexMNC.Val(MNC);
			TUint   LAC = iLocationInfo.iLocationAreaCode;
			TUint   CellId = iLocationInfo.iCellId;
					
			iCellIdInfo->iMCC = MCC;
			iCellIdInfo->iMNC = MNC;
			iCellIdInfo->iCid = CellId;
			iCellIdInfo->iLac = LAC;
								 
            TRACESTRING("Observers notified for GSM CellId information")
            iObserver.BasicCellIDRequestCompletedL(KErrNone);    
            break;                             
            }                    
        case RMobilePhone::ENetworkModeWcdma:
        	{
			TRACESTRING("WCDMA Network")
			//For WCDMA Cell Information
			iNetworkType = EWCDMA;
			
			TInt    MCC=0;
			TInt64  MNC=0;
			TLex LexMCC(iNetworkInfo.iCountryCode);
			TLex LexMNC(iNetworkInfo.iNetworkId);
			LexMCC.Val(MCC);
			LexMNC.Val(MNC);
			TUint  CellId = iLocationInfo.iCellId;
								
			iCellIdInfo->iMNC = MNC;
			iCellIdInfo->iMCC = MCC;
			iCellIdInfo->iCid = CellId;
														
	        TRACESTRING("Observers notified for WCDMA CellId information")
	        iObserver.BasicCellIDRequestCompletedL(KErrNone);    
            break;                             
            }                    
        default:            
        	{
                 
#ifdef _WINS_ 
            
            iNetworkType = EGSM;
			
			TInt    MCC=0;
			TInt64  MNC=0;
			TLex LexMCC(iNetworkInfo.iCountryCode);
			TLex LexMNC(iNetworkInfo.iNetworkId);

			LexMCC.Val(MCC);
			LexMNC.Val(MNC);
			TUint   LAC = iLocationInfo.iLocationAreaCode;
			TUint   CellId = iLocationInfo.iCellId;
					
			iCellIdInfo->iMCC = MCC;
			iCellIdInfo->iMNC = MNC;
			iCellIdInfo->iCid = CellId;
			iCellIdInfo->iLac = LAC;
								 
            TRACESTRING("Observers notified for GSM CellId information")
            iObserver.BasicCellIDRequestCompletedL(KErrNone);
#else             
            
            TRACESTRING("Unknown Network")
            iNetworkType = EUnknown;
            
            TRACESTRING("Observers notified with error for unknown network")
            iObserver.BasicCellIDRequestCompletedL(KErrNotFound);    
#endif	        
	        break;        	
            }                     
	    }
	TRACESTRING("CSuplPsyCellIdHandler::HandleCellInfoL end")
	}

// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::RunError, Will be called by framework,if RunL leaves.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CSuplPsyCellIdHandler::RunError(TInt /*aError*/)
	{
   	TRAP_IGNORE(iObserver.BasicCellIDRequestCompletedL(KErrNotFound));    
	return KErrNone;
	}
	
// -----------------------------------------------------------------------------
// CSuplPsyCellIdHandler::ConnectToETelL
// Connects to Telephony server & RMobilePhone
// Returns System wide error,if any occurs
// -----------------------------------------------------------------------------
//
TInt CSuplPsyCellIdHandler::ConnectToETelL()
	{
	TInt err = iTelServer.Connect(); 
	if(err != KErrNone)
		{
	    TRACESTRING2("Failed to connect with Error Code: %d",err )
        return err;
		}

	CCommsDatabase* const db = CCommsDatabase::NewL(EDatabaseTypeUnspecified); 
	CleanupStack::PushL(db); 

	TUint32 modemId = 0; 
	db->GetGlobalSettingL(TPtrC(MODEM_PHONE_SERVICES_SMS), modemId); 
	CCommsDbTableView* const view = db->OpenViewMatchingUintLC(TPtrC(MODEM), TPtrC(COMMDB_ID), 
																modemId); 
	err = view->GotoFirstRecord(); 
	if(err != KErrNone)
		{
		CleanupStack::PopAndDestroy(2,db);			
		return err;	
		}
	
	view->ReadTextL(TPtrC(MODEM_TSY_NAME), iTsyName); 
	err = iTelServer.LoadPhoneModule(iTsyName);
	if(err != KErrNone)
		{
		CleanupStack::PopAndDestroy(2,db);		
		return err;
		}
		

	// For the phone information
	RTelServer::TPhoneInfo info;

	iTelServer.GetPhoneInfo(0, info); 
	err = iPhone.Open(iTelServer, info.iName);
	CleanupStack::PopAndDestroy(2,db);					
	if(err != KErrNone)
		{
		return err;	
		}
	return err;
	}	
//  End of File