omaprovisioning/pnputil/src/PnpProvUtil.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:04:06 +0300
branchRCL_3
changeset 25 b183ec05bd8c
parent 0 b497e44ab2fc
child 26 19bba8228ff0
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-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:  provides interface for application to set UID and 
 *                provisioning adapters to set the settings application ID.
 *                PNPMS client get these values before activating service.
 *                This class can be used for launching online support in different modes
 *
*/


#include <PnpProvUtil.h>
#include <centralrepository.h>
#include "PnpUtilPrivateCRKeys.h"
#include <apgcli.h>
#include <apacmdln.h>

_LIT( KSpace," ");
_LIT( KQuote, "\"" );
_LIT( KServerParam, "s" );
_LIT( KPageParam, "p" );
_LIT( KReasonParam, "r" );
_LIT( KQueryParam, "q" );
_LIT( KAutoStartParam, "a" );
_LIT( KTokenOverrideParam, "t" );
_LIT( KServerPrefix, "www");
_LIT( KPageString, "page1");
_LIT( KHelpquery, "query");

const TUid KServiceHelpUID = { 0x10204338 };

const TInt KBufferMaxLength = 128; 
const TInt KBufferMinLength = 2;


// -----------------------------------------------------------------------------
// CPnpProvUtil::CPnpProvUtil
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CPnpProvUtil::CPnpProvUtil()
    {
    }

// -----------------------------------------------------------------------------
// CPnpProvUtil::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CPnpProvUtil::ConstructL()
    {
    //No values to assign	
    }

// -----------------------------------------------------------------------------
// CPnpProvUtil::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CPnpProvUtil* CPnpProvUtil::NewL()
    {

    CPnpProvUtil* self = NewLC();
    CleanupStack::Pop();

    return self; 
    }

// -----------------------------------------------------------------------------
// CPnpProvUtil::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CPnpProvUtil* CPnpProvUtil::NewLC()
    {
    CPnpProvUtil* self = new( ELeave ) CPnpProvUtil;

    CleanupStack::PushL( self );
    self->ConstructL();

    return self;
    }

// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
CPnpProvUtil::~CPnpProvUtil()
    {   
    }

// -----------------------------------------------------------------------------
// SetLaunchedApplicationDetailsL
// -----------------------------------------------------------------------------
EXPORT_C void CPnpProvUtil::SetApplicationUidL(TUint32 aUid)
    {
    // Set UID of application into Cenrep Key for identifying the application
    // that triggered PNPMS client for service activation

    TBuf<50> uidval;

    // In case of resetting the cenrep value 	 
    if(aUid == 0)
        uidval= KNullDesC;
    else	
        uidval.Num(aUid, EHex);

    SetCenrepValueL(KCRUidPnpUtil,KPnPProvUtilAppUID, uidval);
    }

// -----------------------------------------------------------------------------
// GetLaunchedApplicationDetailsL
// -----------------------------------------------------------------------------
EXPORT_C TUint32 CPnpProvUtil::GetApplicationUidL()
    {
    // Get UID of application from Cenrep set by SetApplicationUidL
    // Return application UID to PNPMS client for service activation

    TUint32 uidval = 0; 

    TBuf<50> buf;
    GetCenrepValueL(KCRUidPnpUtil,KPnPProvUtilAppUID,buf);

    // If Cenrep value is empty then return UID with 0

    if( buf.Compare(KNullDesC) != 0 ) 
        {
        TLex lex(buf);
        lex.Val(uidval, EHex);

        }

    return uidval;

    }

// -----------------------------------------------------------------------------
// SetProvAdapterAppIdL
// -----------------------------------------------------------------------------
EXPORT_C void CPnpProvUtil::SetProvAdapterAppIdL(TDesC& appID)
    {	

    // This function set Provisioning adapter Application ID
    // for example: Email Provisioning settings: 110,143 


    TBuf<KBufferMaxLength> getValue;
    GetCenrepValueL(KCRUidPnpUtil,KPnPProvUtilProvAdapID, getValue );

    // Passing Null reference indicates clearing the Provisioning application
    // ID keys

    if(appID.Compare(_L(""))==0)
        SetCenrepValueL(KCRUidPnpUtil,KPnPProvUtilProvAdapID, appID );
    else
        {
        // If same adapter requests to set more than one application ID then
        // new application ID will be appended to existing one 
        // for example: Email app can have more than one app ID(POP3 and IMPA4)

        if(getValue.Compare(_L("")))
            {
            getValue.Append(_L(","));
            getValue.Append(appID);	
            }
        else	
            {
            getValue.Append(appID); 
            }

        SetCenrepValueL(KCRUidPnpUtil,KPnPProvUtilProvAdapID, getValue );
        }



    }

// -----------------------------------------------------------------------------
// GetProvAdapterAppIdsL
// -----------------------------------------------------------------------------
EXPORT_C void CPnpProvUtil::GetProvAdapterAppIdsL(RPointerArray<HBufC>& array)
    {

    // Get list of provisioning application IDs set by a particular 
    // provisioning adapter

    TBuf<KBufferMaxLength> getValue;
    GetCenrepValueL(KCRUidPnpUtil,KPnPProvUtilProvAdapID, getValue);

    ParseValueL(getValue, array);

    TBufC<KBufferMinLength> buf(_L(""));
    SetProvAdapterAppIdL(buf);
    }

// -----------------------------------------------------------------------------
// LaunchOnlineSupportL
// -----------------------------------------------------------------------------

EXPORT_C void CPnpProvUtil::LaunchOnlineSupportL(TDesC& aUri,TConnectReason aConnectReason, TStartMode aMode, TBool aTokenOverride , TDesC& aQueryString )
    {

    TBuf<KBufferMaxLength> cmdLineString;

    // Get constructed command line string and pass it as command line argument for starting the application
    ConstructCmdLineStringL(aUri, aConnectReason, aMode, aTokenOverride, aQueryString,cmdLineString );


    //online Support is launched from Command Line Symbian Framework	 

    RApaLsSession appArcSession;
    User::LeaveIfError( appArcSession.Connect() );
    CleanupClosePushL( appArcSession );


    TApaAppInfo info;
    User::LeaveIfError( appArcSession.GetAppInfo( info,KServiceHelpUID  ) );

    CApaCommandLine* cmdLine = CApaCommandLine::NewLC();

    cmdLine->SetExecutableNameL( info.iFullName );

    TBuf8<KBufferMaxLength> params;
    params.Copy( cmdLineString.Left( KBufferMaxLength) );
    cmdLine->SetTailEndL( params );

    TInt err = appArcSession.StartApp( *cmdLine );
    if( err != KErrNone )
        {

        User::Leave( err );
        }
    CleanupStack::PopAndDestroy( cmdLine );
    CleanupStack::PopAndDestroy(); // appArcSession.Close();


    }

// -----------------------------------------------------------------------------
// ConstructUriWithPnPUtilL
// -----------------------------------------------------------------------------

EXPORT_C void CPnpProvUtil::ConstructUriWithPnPUtilL(TDes& /*aUri*/, TServers /*aServer*/)
    {
    User::Leave(KErrNotSupported);
    }


// -----------------------------------------------------------------------------
// SetCenrepValueL
// -----------------------------------------------------------------------------
void CPnpProvUtil::SetCenrepValueL(TUid aRepositoryUid,TUint32 aKey,TDesC& aValue)
    {

    // Set cenrep value to key specified as parameter to this function

    CRepository * rep = NULL;
    TInt errorStatus = KErrNone;
    TBuf<KBufferMaxLength> getValue(aValue);

    TRAPD( errVal, rep = CRepository::NewL(aRepositoryUid));

    if(errVal == KErrNone)
        {
        errorStatus =  rep->Set( aKey , getValue );
        }
    else
        {
        errorStatus = errVal;
        }

    if(rep)
        {
        delete rep;
        }


    if(errorStatus != KErrNone )
        {
        User::Leave(errorStatus);
        }


    }

// -----------------------------------------------------------------------------
// GetCenrepValueL
// -----------------------------------------------------------------------------
void CPnpProvUtil::GetCenrepValueL(TUid aRepositoryUid,TUint32 aKey, TDes& aValue)
    {

    // Get cenrep value of key specified as parameter to this function

    CRepository * rep = NULL;
    TInt errorStatus = KErrNone;

    TRAPD( errVal, rep = CRepository::NewL(aRepositoryUid));

    if(errVal == KErrNone)
        {
        errorStatus =  rep->Get( aKey , aValue );
        }
    else
        {
        errorStatus =  errVal;
        }

    if(rep)
        {
        delete rep;
        }


    if(errorStatus != KErrNone )
        {
        User::Leave(errorStatus);
        }

    }

// -----------------------------------------------------------------------------
// ParseValueL 
// -----------------------------------------------------------------------------

void CPnpProvUtil::ParseValueL(TDesC& aValue, RPointerArray<HBufC>& array )
    {

    // Parse buffer with comma as delimiter and return list of items	

    TLex aLex(aValue);

    while(aLex.Peek() != '\x00')
        {

        aLex.Mark();
        while(aLex.Peek()!=',' && aLex.Peek()!='\x00')
            aLex.Inc();

        TPtrC aPtr = aLex.MarkedToken(); 


        HBufC *buf18 = aPtr.AllocL();
        array.Append(buf18); 

        if(aLex.Peek()=='\x00') // end of string
            break; 

        aLex.Inc();

        }
    }


// -----------------------------------------------------------------------------
// ConstructCmdLineStringL
// -----------------------------------------------------------------------------

void CPnpProvUtil::ConstructCmdLineStringL(TDesC& aUri,TConnectReason aConnectReason, TStartMode aMode, TBool aTokenOverride, TDesC& aQueryString, TDes& aPnPUtilUri)
    {


    TInt tokennum;
    TBuf<KBufferMaxLength> cmdLineString;

    cmdLineString.Zero();

    cmdLineString.Append( KServerParam );
    cmdLineString.Append( KQuote );
    cmdLineString.Append( KServerPrefix );
    cmdLineString.Append( KQuote );

    cmdLineString.Append( KSpace );
    cmdLineString.Append( KPageParam );
    cmdLineString.Append( KQuote );
    cmdLineString.Append( KPageString );
    cmdLineString.Append( KQuote );

    cmdLineString.Append( KSpace );
    cmdLineString.Append( KReasonParam );
    cmdLineString.AppendNum( aConnectReason );

    // Non interactive mode of settings download is not supported at server side and only interactive mode is supported

    if(aMode == EStartInteractive)
        {
        cmdLineString.Append( KSpace );
        cmdLineString.Append( KAutoStartParam );
        cmdLineString.AppendNum( 0 );

        }
    else
        {
        //Silent mode is not supported by PnPMS server
        User::Leave(KErrNotSupported);
        }

    cmdLineString.Append( KSpace );
    cmdLineString.Append( KTokenOverrideParam );

    if(aTokenOverride == EFalse)
        tokennum = 0;
    else
        tokennum = 1;

    cmdLineString.AppendNum( tokennum );


    //Help Query parameter is not supported by Server so default "query" string will be set

    cmdLineString.Append( KSpace );
    cmdLineString.Append( KQueryParam );
    cmdLineString.Append( KQuote );
    cmdLineString.Append( KHelpquery );
    cmdLineString.Append( KQuote );

    aPnPUtilUri.Copy(cmdLineString);

    }