wlanutilities/wpswizard/src/cwpsactiverunner.cpp
author William Roberts <williamr@symbian.org>
Thu, 22 Jul 2010 16:44:32 +0100
branchGCC_SURGE
changeset 47 b3d8f88532b7
parent 19 10810c91db26
parent 46 2fbd1d709fe7
permissions -rw-r--r--
Catchup to latest Symbian^4

/*
 * Copyright (c) 2010 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: Implementation of middleware wrapper class
 *
 *
 */
// System includes
#include <wlanmgmtcommon.h>
#include <e32math.h>

// User includes
#include "cwpsactiverunner.h"

// External function prototypes

//Constants
static const TInt KArrayGranularity = 4;
static const TInt KDefaultPinLength = 10;

// Trace includes
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "cwpsactiverunnerTraces.h"
#endif

/*!
 \class CWpsActiveRunner
 \brief CWpsActiveRunner is a wrapper class wlan Mgmt engine interface.
 The wrapper class for wlan management engine calls
 */

// ======== LOCAL FUNCTIONS ========

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

/*!
 * Creates the instance of active runner which encapsulates the wlan mgmt
 * interface middleware calls
 *
 *
 * \param MWpsActiveRunnerCallback[in] call back interface to notify the
 *      completion of the middleware calls
 */
CWpsActiveRunner* CWpsActiveRunner::NewL(MWpsActiveRunnerCallback& aObserver)
{
    OstTraceFunctionEntry0( CWPSACTIVERUNNER_NEWL_ENTRY );
    CWpsActiveRunner* self = new (ELeave) CWpsActiveRunner(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    OstTraceFunctionExit0( CWPSACTIVERUNNER_NEWL_EXIT );
    return self;
}

/*!
 * Creates the instance of active runner which encapsulates the wlan mgmt
 * interface middleware calls
 *
 *
 * \param MWpsActiveRunnerCallback[in] call back interface to notify the
 *      completion of the middleware calls
 */
CWpsActiveRunner::CWpsActiveRunner(MWpsActiveRunnerCallback& aObserver) :
    CActive(EPriorityStandard),
    iObserver(aObserver),
    isCancelTriggered(false),
    iWLANMgmtClient(NULL),
    iIapParametersArray(NULL)
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_CWPSACTIVERUNNER_ENTRY, this );
    OstTraceFunctionExit1( CWPSACTIVERUNNER_CWPSACTIVERUNNER_EXIT, this );
}

/*!
 * ConstructL, Two phased constructor.
 *
 */
void CWpsActiveRunner::ConstructL()
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_CONSTRUCTL_ENTRY, this );

    CActiveScheduler::Add(this);
    InitializeL();
    OstTraceFunctionExit1( CWPSACTIVERUNNER_CONSTRUCTL_EXIT, this );
}

/*!
 * Initializes the member variables for making the middleware calls
 *
 */

void CWpsActiveRunner::InitializeL()
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_INITIALIZEL_ENTRY, this );
    iWLANMgmtClient = CWlanMgmtClient::NewL();
    iIapParametersArray = new (ELeave) CArrayFixSeg<
        TWlanProtectedSetupCredentialAttribute> (KArrayGranularity);
    
    OstTraceFunctionExit1( CWPSACTIVERUNNER_INITIALIZEL_EXIT, this );
}

/*!
 * Destructor
 *
 */
CWpsActiveRunner::~CWpsActiveRunner()
{
    OstTraceFunctionEntry0( DUP1_CWPSACTIVERUNNER_CWPSACTIVERUNNER_ENTRY );
    Cancel();
    delete iWLANMgmtClient;
    delete iIapParametersArray;
    OstTraceFunctionExit0( DUP1_CWPSACTIVERUNNER_CWPSACTIVERUNNER_EXIT );
}

/*!
 * Initiates the call to the middleware
 *
 * \param aSsid[in] The network ssid to which we have to connect
 * \param aPin[in] The pin to be used for WPS negotiating
 */
void CWpsActiveRunner::StartSetup(RBuf8& aSsid, int aPin)
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_STARTSETUP_ENTRY, this );
    TWlanSsid ssid;
    TWlanWpsPin pin;

    isCancelTriggered = false;
    ssid.Copy(aSsid);
    TBuf8<KDefaultPinLength> pinCode;

    if (aPin == 0) {
        pinCode.AppendFill('0', 8);
    }
    else {
        pinCode.AppendNum(aPin);
    }

    pin.Copy(pinCode);

    iWLANMgmtClient->RunProtectedSetup(iStatus, ssid, pin, *iIapParametersArray);

    SetActive();

    OstTraceFunctionExit1( CWPSACTIVERUNNER_STARTSETUP_EXIT, this );
}

/*!
 * RunL implementation
 */
void CWpsActiveRunner::RunL()
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_RUNL_ENTRY, this );

    TInt completionCode = iStatus.Int();
    QList<TWlanProtectedSetupCredentialAttribute> credentials;

    if(!isCancelTriggered) {

        if (completionCode < KErrNone) {
            //Raise Error
        QT_TRYCATCH_LEAVING(iObserver.WpsActiveRunnerStopped(credentials, completionCode));
        }
        else {
            TInt len = iIapParametersArray->Length();
            TInt count;
            for(count=0;count<iIapParametersArray->Count();count++)
                {
                TWlanProtectedSetupCredentialAttribute attr =(*iIapParametersArray)[count];
                credentials.append(attr);
                }
            QT_TRYCATCH_LEAVING(iObserver.WpsActiveRunnerStopped(credentials,completionCode));

        }
    }

    OstTraceFunctionExit1( CWPSACTIVERUNNER_RUNL_EXIT, this );
}

/*!
 * Cancels the ongoing call
 */
void CWpsActiveRunner::DoCancel()
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_DOCANCEL_ENTRY, this );
    isCancelTriggered = true;
    if(iWLANMgmtClient)
        {
        iWLANMgmtClient->CancelProtectedSetup();
        }
    OstTraceFunctionExit1( CWPSACTIVERUNNER_DOCANCEL_EXIT, this );
}

/*!
 * Handles the error usecase
 */
TInt CWpsActiveRunner::RunError(TInt aError)
{
    OstTraceFunctionEntry1( CWPSACTIVERUNNER_RUNERROR_ENTRY, this );

    OstTrace1( TRACE_ERROR, CWPSACTIVERUNNER_RUNERROR, "CWpsActiveRunner::RunError;aError=%d", aError );

    QList<TWlanProtectedSetupCredentialAttribute> credentials;
    if(iWLANMgmtClient)
        {
        iWLANMgmtClient->CancelProtectedSetup();
        }

    QT_TRYCATCH_LEAVING(iObserver.WpsActiveRunnerStopped(credentials, aError));

    return 0;
}