locationsystemui/locationsysui/locverifier/src/lpdrequestorprocessor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 31 Mar 2010 22:18:21 +0300
branchRCL_3
changeset 16 6fcbaa43369c
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201011 Kit: 201013

/*
* Copyright (c) 2002 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:  Processes requestor related data.
*
*/


// INCLUDE FILES
#include "lpdrequestorprocessor.h"
#include "lpdverifnotiflbmodel.h"
#include "lpdbasemodel.h"
#include "locconsts.h"
#include "locverifierdlgdebug.h"
#include <lbs/epos_cposrequestor.h>
#include <lbs/epos_cposcontactrequestor.h>
#include <lbs/epos_cposservicerequestor.h>
#include <EPos_CPosPrivacyNotifier.h>

// CONSTANTS
_LIT( KUnknownRequestor, "Unknown" );

// Unnamed namespace for local definitions

const TInt KRequestorsGranularity = 5;
#ifdef _DEBUG
_LIT( KPanicText, "CLpdRequestorProcessor" );
enum TPanicCode
    {
    KLpdErrGeneral = 1
    };
#endif


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::CLpdRequestorProcessor
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CLpdRequestorProcessor::CLpdRequestorProcessor() 
: iRequestors( KRequestorsGranularity),
  iSuplRequest ( 0 ),
  iSessionId ( 0 )
    {
    }

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CLpdRequestorProcessor* CLpdRequestorProcessor::NewL()
    {
    CLpdRequestorProcessor* self = new( ELeave ) CLpdRequestorProcessor;
    // Nothing to do in the Second Phase Constructor
    return self;
    }
    
// Destructor
CLpdRequestorProcessor::~CLpdRequestorProcessor()
    {
    iRequestors.ResetAndDestroy();
    }

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::ReadRequestorsL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool CLpdRequestorProcessor::ReadRequestorsL(
    const CPosPrivacyNotifier& aPosNotifier )
    {
    __ASSERT_DEBUG( aPosNotifier.CurrentRequest() != KPosNullQNRequestId,
                    HandleAssertErrorL() );

    this->ResetAndDestroyRequestors();
    
    TBool allRequestorIdsValid = ETrue;
	  CLocRequestorUtilsResolver* reqUtils = CLocRequestorUtilsResolver::NewL();
	  CleanupStack::PushL(reqUtils);
    // Let's read the requestors associated with the current request:
    TInt nofRequestors = aPosNotifier.RequestorCountL();

    for ( TInt i = 0; i < nofRequestors; i++ )
        {
        CPosRequestor* requestor = aPosNotifier.RequestorLC( i );
        if ( !reqUtils->RequestorIdValid( *requestor ) )
            { // mark that some requestor id is invalid
            allRequestorIdsValid = EFalse;
            }
   
        if( iSuplRequest )
           {
           TInt64 sessionId = RetrieveSessionId( requestor->RequestorIdString() );
           SetSessionId( sessionId );
           TPtrC RequestorName = RetrieveRequestorNameL(requestor->RequestorIdString());           
           requestor->SetRequestorIdL(requestor->RequestorIdFormat(), RequestorName);
           }
        User::LeaveIfError( iRequestors.Append( requestor ) );
        CleanupStack::Pop( requestor ); // iRequestors owns now the requestor
        }

    if ( nofRequestors == 0 )
        {
        allRequestorIdsValid = EFalse; // zero requestors == invalid
        }

    // Use Requestor Utils and resolve the requestor here itself
    reqUtils->ProcessRequestorsL(iRequestors);
    CleanupStack::PopAndDestroy(reqUtils);
    return allRequestorIdsValid;
    }

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::RtorNamesForVerifNotifL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CLpdBaseModel* CLpdRequestorProcessor::RtorNamesForVerifNotifL(
    CEikFormattedCellListBox& aListBox )
    {
    return CLpdVerifNotifLBModel::NewL( *this, aListBox );
    }

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::ResetAndDestroyRequestors
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CLpdRequestorProcessor::ResetAndDestroyRequestors()
    {
    iRequestors.ResetAndDestroy();
    }

void CLpdRequestorProcessor::SetRequestType( TInt aReqType )
    {
       iSuplRequest = aReqType ;
    } 
// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::Requestors
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
const RPointerArray<CPosRequestor>& CLpdRequestorProcessor::Requestors() const
    {
    return iRequestors;
    }

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::HandleAssertErrorL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CLpdRequestorProcessor::HandleAssertErrorL() const
    {
    #ifdef _DEBUG
        User::Panic( KPanicText, KLpdErrGeneral );
    #else
        User::Leave( KErrCorrupt );
    #endif
    }

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::RetrieveRequestorsL
// The Requestors information for the current request is read and returned.
// -----------------------------------------------------------------------------
//
RPosRequestorStack* CLpdRequestorProcessor::RetrieveRequestorsL( 
	const CPosPrivacyNotifier& aPosNotifier )
	{
    __ASSERT_DEBUG( aPosNotifier.CurrentRequest() != KPosNullQNRequestId,
                    HandleAssertErrorL() );

    RPosRequestorStack* requestors = new(ELeave) RPosRequestorStack;

    // Let's read the requestors associated with the current request:
    TInt nofRequestors = aPosNotifier.RequestorCountL();

    for ( TInt i = 0; i < nofRequestors; i++ )
        {
        CPosRequestor* requestor = aPosNotifier.RequestorLC( i );
        requestors->AppendL( requestor );
        CleanupStack::Pop( requestor ); // requestors owns now the requestor
        }

    // Return the Index of the Array where the requestor Arary is appended.
    return requestors;
	}

// -----------------------------------------------------------------------------
// CLpdRequestorProcessor::ReadRequestorsL
// Read the requestors passed as parameter. Resolve them and store in
// iRequestors member variable.
// -----------------------------------------------------------------------------
//
void CLpdRequestorProcessor::ReadRequestorsL( 
	const RPosRequestorStack& aRequestors )
	{
    TInt nofRequestors = aRequestors.Count();
	  CLocRequestorUtilsResolver* reqUtils = CLocRequestorUtilsResolver::NewL();
	  CleanupStack::PushL(reqUtils);

    for ( TInt i = 0; i < nofRequestors; i++ )
        {
        CPosRequestor* requestor;
        if( iSuplRequest )
            {
                TInt64 sessionId = RetrieveSessionId( aRequestors[i]->RequestorIdString() );
                SetSessionId( sessionId );
                TPtrC RequestorName = RetrieveRequestorNameL(aRequestors[i]->RequestorIdString());
                aRequestors[i]->SetRequestorIdL(aRequestors[i]->RequestorIdFormat(), RequestorName);
            }
        if (aRequestors[i]->RequestorType() == 
        	CPosRequestor::ERequestorService)
        	{
        	    requestor = CPosServiceRequestor::NewLC(
        					    	aRequestors[i]->RequestorIdFormat(),
        					    	aRequestors[i]->RequestorIdString());
        	}
        else
        	{
        	requestor = CPosContactRequestor::NewLC(
        						aRequestors[i]->RequestorIdFormat(),
        						aRequestors[i]->RequestorIdString());
        	}
        
        iRequestors.AppendL( requestor );
        CleanupStack::Pop( requestor ); // requestors owns now the requestor
        }

    // Return the Index of the Array where the requestor Arary is appended.
    // Use Requestor Utils and resolve the requestor here itself
    reqUtils->ProcessRequestorsL(iRequestors);
    CleanupStack::PopAndDestroy(reqUtils);
	}

TPtrC CLpdRequestorProcessor::RetrieveRequestorNameL(  const TDesC& aString )
{
    //Parse string and extract characters leaving last
    // 3 characters and return as requestor name. 
    //If requestor name not there, say unknown requestor
    if( aString.Length() > 3 )
    {
       TPtrC requestorName = aString.Left( aString.Length() - 3 );
       return requestorName;
    }
    else   
    {
    HBufC* buf = HBufC::NewL( KUnknownRequestor().Length() );
    buf->Des().Append( KUnknownRequestor );
    return buf->Des();
    }
}


TInt64 CLpdRequestorProcessor::RetrieveSessionId(  const TDesC& aString )
{
    //Parse string and return session id(last 3 characters)
    //after converting to TInt
    TInt sessId;
    TInt64 sessionId;
    TPtrC sessionIdPart = aString.Right( 3 );

    TLex lex( sessionIdPart );
    lex.Val( sessId );
    sessionId = sessId;
    return sessionId;
}

void CLpdRequestorProcessor::SetSessionId(  TInt64 aSessionId )
{
    iSessionId = aSessionId;
}
	
TInt64 CLpdRequestorProcessor::GetSessionId()
{
    return iSessionId;
}

// end of file