wlanutilities/wlanlogin/ictswlanlogininterface/src/ictswlanlogininterface.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:18:40 +0300
branchRCL_3
changeset 24 63be7eb3fc78
permissions -rw-r--r--
Revision: 201029 Kit: 201035

/*
* 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:
* Entry library for launching Wlan Login application.
*/

// System includes

#include <xqservicerequest.h>
#include <xqappmgr.h>

// User includes

#include "ictswlanlogininterface.h"
#include "wlanloginservice.h"
#include "ictsqtwrapper.h"

#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "ictswlanlogininterfaceTraces.h"
#endif

/*!
    \class IctsWlanLoginInterface
    \brief This class provides a Qt API for running Internet connectivity test
           against WLAN accesspoint. If authentication is needed this component
           launches WLAN Login application through Qt Highway to render 
           authentication Web page.
*/

// External function prototypes

// Local constants

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

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

/*!
    Constructor.
*/
IctsWlanLoginInterface::IctsWlanLoginInterface(QObject *parent) :
    QObject(parent),
    mIctsWrapper(NULL),
    mAiwMgr(NULL),
    mAsyncRequest(NULL),
    mIapId(0),
    mNetId(0)
{   
   OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_CONSTRUCTOR_ENTRY);
   
   mAiwMgr = new XQApplicationManager();
   
   OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_CONSTRUCTOR_EXIT);
}

/*!
    Destructor.
*/
IctsWlanLoginInterface::~IctsWlanLoginInterface()
{ 
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_DESTRUCTOR_ENTRY);
    
    if (mAsyncRequest){
        delete mAsyncRequest;
    }
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_DESTRUCTOR_EXIT);
}

/*!
    Function for launching Wlan login application.
    
    @param [in] iapId Internet accesspoint id to be tested
    @param [in] netId network identifier of the connection to be used
*/
void IctsWlanLoginInterface::start(int iapId, int netId)
{    
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_START_ENTRY);
    
    // Create ICTS instance as we know needed parameters now
    mIctsWrapper = new IctsWrapper(iapId, netId, this);
    
    // Store identifiers for later use
    mIapId = iapId;
    mNetId = netId;
        
    bool connectStatus = connect( 
        mIctsWrapper,
        SIGNAL(connectivityTestResult(IctsWrapper::ConnectivityTestResult, QUrl)), 
        this, 
        SLOT(handleConnectivityTestResult(IctsWrapper::ConnectivityTestResult, QUrl)));    
    Q_ASSERT(connectStatus);
    
    mIctsWrapper->startConnectivityTest();
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_START_EXIT);
}

/*!
    Function for launching Wlan login application.
    
    @param [in] iapId Internet accesspoint id to be used
    @param [in] netId network id of the connection to be used
    @param [in] url Redirection URL to be loaded
    
*/
void IctsWlanLoginInterface::wlanLoginAppStart(int iapId, int netId, QUrl url)
{    
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_WLANLOGINAPPSTART_ENTRY);
    
    // Execution of asynchronous and embedded Wlan Login start
    mAsyncRequest = mAiwMgr->create(
        "wlanlogin",
        "com.nokia.symbian.IWlanLogin",
        "start(int,int,QUrl)",
        false);
   
    // The Wlan Login service must always exist
    Q_ASSERT(mAsyncRequest);

    // Connect result handling signal
    bool connectStatus = connect(
        mAsyncRequest, 
        SIGNAL(requestOk(const QVariant&)),
        this,
        SLOT(handleOk(const QVariant&)));
    Q_ASSERT(connectStatus == true);
    
    // Connect error handling signal or apply lastError function instead.
    connectStatus = connect(
        mAsyncRequest,
        SIGNAL(requestError(int,const QString&)),
        this,
        SLOT(handleError(int)));        // Error string is ignored.
    Q_ASSERT(connectStatus == true);

    // Set function parameters
    QList<QVariant> args;
    args << iapId;
    args << netId;
    args << url;
     
    mAsyncRequest->setArguments(args);
   
    // The service is set asynchronous
    mAsyncRequest->setSynchronous(false);
   
    // Send the request
    bool status = mAsyncRequest->send(); 
    Q_ASSERT(status);
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_WLANLOGINAPPSTART_EXIT);
}

/*!
    Function for handling request's response from QtHighway framework
    when transaction is OK. This is used only with asynchronous requests.
    
    @param [in] result Status received from WLAN Login application
*/
void IctsWlanLoginInterface::handleOk(const QVariant& result)
{
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_HANDLEOK_ENTRY);
    
    ictsResultType ictsRes = IctsFailed;
    
    // Handling of result received from service.
    int i = result.toInt();
    WlanLoginService::WlanLoginStatus status = 
        static_cast<WlanLoginService::WlanLoginStatus>(i);
    
    switch (status) {
        case WlanLoginService::WlanLoginStatusConnectionDropped:
        case WlanLoginService::WlanLoginStatusCancel:
            OstTrace0(
                TRACE_NORMAL, 
                ICTSWLANLOGININTERFACE_HANDLEOK_CANCEL_TRACE,
                "WlanLoginStatusCancel or WlanLoginStatusConnectionDropped received ");
            // User has canceled Wlan Login and it has to be stopped
            stop();
            ictsRes = IctsCanceled;
            break;
            
        case WlanLoginService::WlanLoginStatusNext:
            OstTrace0(
                TRACE_NORMAL, 
                ICTSWLANLOGININTERFACE_HANDLEOK_NEXT_TRACE,
                "WlanLoginStatusNext received");
            ictsRes = IctsHotspotPassed;
            break;
            
        case WlanLoginService::WlanLoginStatusFailed:
            OstTrace0( TRACE_NORMAL, 
                ICTSWLANLOGININTERFACE_HANDLEOK_FAILED_TRACE,
                "WlanLoginStatusFailed received ");
            stop();
            ictsRes = IctsFailed;
            break;
                  
        default:
            OstTrace0(
			    TRACE_NORMAL,
                ICTSWLANLOGININTERFACE_HANDLEOK_UNEXPECTED_STATUS_TRACE,
                "Unexpected WlanLoginStatus received");
            break;
            
    }
    emit ictsResult(ictsRes);
    
    delete mAsyncRequest;
    mAsyncRequest = NULL;
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_HANDLEOK_EXIT);
}

/*!
    Function for handling request's response from QtHighway framework
    when errors occured. This is used only with asynchronous requests.
    
    @param [in] errorCode Error code that was received
*/
void IctsWlanLoginInterface::handleError(int errorCode)
{    
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_HANDLEERROR_ENTRY);
    
    OstTrace1(
        TRACE_NORMAL,
        ICTSWLANLOGININTERFACE_ERRORCODE_TRACE,
        "errorCode=%d",
        errorCode);
    
    delete mAsyncRequest;
    mAsyncRequest = NULL;
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_HANDLEERROR_EXIT);
}

/*!
    Function for stopping launched Wlan login application.
*/
void IctsWlanLoginInterface::stop()
{ 
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_STOP_ENTRY);
    
    // Execution of synchronous and embedded Wlan Login stop
    QScopedPointer<XQAiwRequest> syncRequest(mAiwMgr->create(
         "wlanlogin",
         "com.nokia.symbian.IWlanLogin",
         "stop()",
         false));
   
    // The Wlan Login service must always exist
    Q_ASSERT(syncRequest);
   
    // The service is set synchronous
    syncRequest->setSynchronous(true);
   
    // Send the request
    bool status = syncRequest->send(); 
    Q_ASSERT(status);
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_STOP_EXIT);
}

/*!
    Function for handling connectivityTestResult signal
    
    @param [in] result Internet connectivity test result
    @param [in] redirectUrl Possible redirection URL. Valid only when HttpAuthenticationNeeded result received.
*/
void IctsWlanLoginInterface::handleConnectivityTestResult(IctsWrapper::ConnectivityTestResult result, QUrl redirectUrl)
{
    OstTraceFunctionEntry0(ICTSWLANLOGININTERFACE_HANDLECONNECTIVITYTESTRESULT_ENTRY);
   
    OstTrace1(TRACE_NORMAL,
        ICTSWLANLOGININTERFACE_HANDLECONNECTIVITYRESULT_RESULT_TRACE,
        "ConnectivityTestResult=%d",
        result);
        
    switch (result) 
        {
        case IctsWrapper::ConnectionOk:
            
            OstTrace1(
                TRACE_BORDER,
                ICTSWLANLOGININTERFACE_HANDLECONNECTIVITYTESTRESULT_EMIT_ICTSRESULT_PASSED,
                "IctsWlanLoginInterface::handleConnectivityTestResult emit ictsResult;result=%d",
                IctsPassed);
            
            emit ictsResult(IctsPassed);
            break;
            
        case IctsWrapper::HttpAuthenticationNeeded:
            // Inform client that Hotspot authentication is needed. 
            OstTrace0(
                TRACE_BORDER,
                ICTSWLANLOGININTERFACE_HANDLECONNECTIVITYTESTRESULT_EMIT_HOTSPOTCASE,
                "IctsWlanLoginInterface::handleConnectivityTestResult emit hotspotCase");
            
            emit hotspotCase();
            wlanLoginAppStart(mIapId, mNetId, redirectUrl);
            break;
            
        default:
            OstTrace1(
                TRACE_BORDER,
                ICTSWLANLOGININTERFACE_HANDLECONNECTIVITYTESTRESULT_EMIT_ICTS_RESULT_FAILED,
                "IctsWlanLoginInterface::handleConnectivityTestResult emit ictsResult;result=%d",
                IctsFailed);
            emit ictsResult(IctsFailed);
            break;
            
        }
    
    OstTraceFunctionExit0(ICTSWLANLOGININTERFACE_HANDLECONNECTIVITYTESTRESULT_EXIT);
}