wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilscmmwrapper_s60.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 16:07:56 +0300
changeset 19 10810c91db26
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
 * Copyright (c) 2009 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:
 * This is a source file for CmmWrapperPrivate class.
 */

// INCLUDE FILES
#include <e32base.h>
#include <cmmanagerdef.h>
#include <cmconnectionmethodext.h>
#include <cmdestinationext.h>
#include <cmpluginwlandef.h>
#include "wlanqtutilscommon.h"
#include "wlanqtutilsiap.h"
#include "wlanqtutilswlanap.h"
#include "wlanqtutilswlaniap.h"
#include "wlanqtutilscmmwrapper.h"
#include "wlanqtutilscmmwrapper_s60_p.h"

#ifdef WLANQTUTILS_NO_OST_TRACES_FLAG
#include <opensystemtrace.h>
#else
#include "OstTraceDefinitions.h"
#endif
#ifdef OST_TRACE_COMPILER_IN_USE
#include "wlanqtutilscmmwrapper_s60Traces.h"
#endif


// =========== PRIVATE CLASS MEMBER FUNCTIONS ===============
//
// ---------------------------------------------------------
// CmmWrapperPrivate::CmmWrapperPrivate()
// Constructor
// ---------------------------------------------------------
//
CmmWrapperPrivate::CmmWrapperPrivate(CmmWrapper *wrapper) :
    q_ptr(wrapper)
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_CMMWRAPPERPRIVATE_ENTRY, this );
    
    TRAPD(err, iCmManagerExt.OpenL());
    if (err != KErrNone) {
        // todo
    }
    
    OstTraceFunctionExit1( CMMWRAPPERPRIVATE_CMMWRAPPERPRIVATE_EXIT, this );
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::CmmWrapperPrivate()
// Destructor
// ---------------------------------------------------------
//
CmmWrapperPrivate::~CmmWrapperPrivate()
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_CMMWRAPPERPRIVATEDESTR_ENTRY, this );
    
    iCmManagerExt.Close();

    OstTraceFunctionExit1( CMMWRAPPERPRIVATE_CMMWRAPPERPRIVATEDESTR_EXIT, this );
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::fetchIaps()
// ---------------------------------------------------------
//
int CmmWrapperPrivate::fetchIaps(QList<WlanQtUtilsIap*>& iapList)
    {    
    TRAPD(err, fetchIapsL(iapList));
    return err;
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::fetchIapsL()
// ---------------------------------------------------------
//
void CmmWrapperPrivate::fetchIapsL(QList<WlanQtUtilsIap*>& iapList)
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_FETCHIAPSL_ENTRY, this );
    
    // reset the list, just in case
    iapList.clear();
    
    //Array granularity 10
    RArray<TUint32> destinationIdArray = RArray<TUint32> (10);

    destinationIdArray.Reset();
    iCmManagerExt.AllDestinationsL(destinationIdArray);

    // looping all the SNAPs through
    QList<WlanQtUtilsIap*> snapsIapList;
    for (TInt i = 0; i < destinationIdArray.Count(); i++)
        {
        snapsIapList.clear();
        RCmDestinationExt dest;
        dest = iCmManagerExt.DestinationL(destinationIdArray[i]);
        TUint32 id = dest.Id();

        if (getIapListFromSnap(id, snapsIapList) == KErrNone)
            {
            iapList.append(snapsIapList);
            }
        }

    OstTraceFunctionExit1( CMMWRAPPERPRIVATE_FETCHIAPSL_EXIT, this );
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::createWlanIap()
// Creates a new WLAN IAP
// ---------------------------------------------------------
//
WlanQtUtilsWlanIap *CmmWrapperPrivate::createWlanIap(const WlanQtUtilsWlanAp *aWlanAp)
    {
    WlanQtUtilsWlanIap *iap = NULL;

    TRAPD(err, iap = createWlanIapL(aWlanAp));

    if (err != KErrNone)
        {
        // Todo: trace
        }
    return iap;
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::createWlanIapL()
// Creates a new WLAN IAP
// ---------------------------------------------------------
//
WlanQtUtilsWlanIap *CmmWrapperPrivate::createWlanIapL(const WlanQtUtilsWlanAp *aWlanAp)
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_CREATEWLANIAPL_ENTRY, this );
    
    // Create the new IAP
    RCmConnectionMethodExt plugin = iCmManagerExt.CreateConnectionMethodL(
            KUidWlanBearerType);
    CleanupClosePushL(plugin);

    // Convert QString to Symbian buffer
    TBufC<KMaxSsidLen> buffer(aWlanAp->ssid().utf16());

    WlanQtUtilsWlanSecMode secMode = aWlanAp->securityMode();
    int cmManagersSecMode = wlanQtUtils2CmmSecModeMap(secMode);

    plugin.SetStringAttributeL(CMManager::ECmName, buffer);
    plugin.SetStringAttributeL(CMManager::EWlanSSID, buffer);
    plugin.SetIntAttributeL(CMManager::EWlanSecurityMode, cmManagersSecMode);
    // Todo: other parameters such as security keys
#if 0
    // TODO the security settings API plugin needs to be initialized here
    // with the iap id.
    // Check if the key value has been given
    QString key = aWlanAp->securityKey();
    if ( key.length() > 0 )
        {
        // Set the security key values here
        if ( secMode == CMManager::EWlanSecModeWpa || 
             secMode == CMManager::EWlanSecModeWpa2 )
            {
            // Store the WPA key to the database using the security settings API
            TBufC<KMaxWEPKeyLen> bufKey(key.utf16());
            plugin.SetStringAttributeL( CMManager::EWlanWpaPreSharedKey, bufKey );
        
            }
        else if ( secMode == CMManager::EWlanSecModeWep )
            {
            // Store the WPA key to the database using the security settings API
            TBufC<KMaxWPAKeyLen> bufKey(key.utf16());
            plugin.SetStringAttributeL( CMManager::EWlanWepKey1, bufKey );
            }
        }
#endif

    plugin.UpdateL();

    TInt iapId = plugin.GetIntAttributeL(CMManager::ECmIapId);
    
    CleanupStack::PopAndDestroy(&plugin); // Close() called on "plugin"

    // Read details of the new IAP and create the WLAN IAP class
    RCmConnectionMethodExt connectionMethod = iCmManagerExt.ConnectionMethodL( iapId );
    WlanQtUtilsIap *newIap = getIapInfoL(connectionMethod);
    
    OstTraceFunctionExit1( CMMWRAPPERPRIVATE_CREATEWLANIAPL_EXIT, this );
    return qobject_cast<WlanQtUtilsWlanIap *>(newIap);
    }
    
// ---------------------------------------------------------
// CmmWrapperPrivate::moveIapToInternetSnap()
// ---------------------------------------------------------
//
void CmmWrapperPrivate::moveIapToInternetSnap( TInt32 aIapId )
    {
    TRAPD( err, moveIapToInternetSnapL( aIapId ) );
    if (err != KErrNone)
        {
        // todo: add trace
        }
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::moveIapToInternetSnapL()
// ---------------------------------------------------------
//
void CmmWrapperPrivate::moveIapToInternetSnapL( TInt32 aIapId )
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_MOVEIAPTOINTERNETSNAPL_ENTRY, this );
    
    // Read all destination(SNAP) settings into an array
    RArray<TUint32> destinations;
    CleanupClosePushL(destinations);
    iCmManagerExt.AllDestinationsL(destinations);
    RCmDestinationExt destination;
    // Loop through each destination
    for(TInt i = 0; i < destinations.Count(); i++)
        {
        destination = iCmManagerExt.DestinationL(destinations[i]);
        CleanupClosePushL(destination); 
        // Internet destination will always exist in the system.
        // Internet destination will have ESnapPurposeInternet set in its metadata.
        if (destination.MetadataL(CMManager::ESnapMetadataPurpose) == CMManager::ESnapPurposeInternet)
            {
            RCmConnectionMethodExt iap = iCmManagerExt.ConnectionMethodL( aIapId );
            CleanupClosePushL( iap );        
            destination.AddConnectionMethodL( iap );
            destination.UpdateL();
            CleanupStack::PopAndDestroy(); // iap
            }
        CleanupStack::PopAndDestroy(); // destination
        }
    CleanupStack::PopAndDestroy(); // destinations

    OstTraceFunctionExit1( CMMWRAPPERPRIVATE_MOVEIAPTOINTERNETSNAPL_EXIT, this );
    }
    
// ---------------------------------------------------------
// CmmWrapperPrivate::getIapListFromSnap()
// ---------------------------------------------------------
//
int CmmWrapperPrivate::getIapListFromSnap(TUint32 aDestId,
        QList<WlanQtUtilsIap*>& iapList)
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_GETIAPLISTFROMSNAP_ENTRY, this );
    
    RCmDestinationExt dest;
    TRAPD(err, dest = iCmManagerExt.DestinationL(aDestId));
    if (err != KErrNone)
        {
        OstTraceFunctionExit1( CMMWRAPPERPRIVATE_GETIAPLISTFROMSNAP_EXIT, this );
        return err;
        }

    // Copy IAPs from the SNAP into iapList.
    int destIapCount = dest.ConnectionMethodCount();
    for (TInt i = 0; i < destIapCount; i++)
        {
        WlanQtUtilsIap* iap = NULL;
        TRAP(err, iap = getIapInfoL(dest.ConnectionMethodL(i)));
        
        if (err == KErrNone)
            {
            iapList.append(iap);
            }
        }

    OstTraceFunctionExit1( DUP1_CMMWRAPPERPRIVATE_GETIAPLISTFROMSNAP_EXIT, this );
    return err;
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::getIapInfoL()
// ---------------------------------------------------------
//
WlanQtUtilsIap *CmmWrapperPrivate::getIapInfoL(
    RCmConnectionMethodExt aConnectionMethod)
    {
    OstTraceFunctionEntry1( CMMWRAPPERPRIVATE_GETIAPINFOL_ENTRY, this );
    
    TUint iapId = aConnectionMethod.GetIntAttributeL(CMManager::ECmIapId);
    
    TUint netId = aConnectionMethod.GetIntAttributeL(CMManager::ECmNetworkId);

    HBufC* iapName = aConnectionMethod.GetStringAttributeL(CMManager::ECmName);

    TUint iapBearerType = aConnectionMethod.GetIntAttributeL(CMManager::ECmBearerType);

    QString name = QString::fromUtf16(iapName->Ptr(), iapName->Length());
    WlanQtUtilsBearerType bearer;

    WlanQtUtilsIap* newIap = NULL;
    if (iapBearerType == KUidPacketDataBearerType)
        {
        bearer = WlanQtUtilsBearerTypeCellular;
        newIap = new WlanQtUtilsIap(iapId, netId, name, bearer);
        }
    else
        {
        TInt secModeFromCmManager =
                aConnectionMethod.GetIntAttributeL(CMManager::EWlanSecurityMode);
        WlanQtUtilsWlanSecMode secMode = cmm2WlanQtUtilsSecModeMap(secModeFromCmManager);
        bearer = WlanQtUtilsBearerTypeWlan;
        //Note ssid is set same as iap name
        WlanQtUtilsWlanIap* wlanIap = 
            new WlanQtUtilsWlanIap(iapId, netId, name, bearer, name, secMode);
        newIap = wlanIap;
        }

    OstTraceFunctionExit1( CMMWRAPPERPRIVATE_GETIAPINFOL_EXIT, this );
    return newIap;
    }

// ---------------------------------------------------------
// CmmWrapperPrivate::cmm2WlanQtUtilsSecModeMap()
// Maps CMManager's WLAN security mode into WlanQtUtilsWlanSecMode.
// CMManager uses sec mode type TConnMonSecurityMode defined
// in rconnmon.h.
// ---------------------------------------------------------
//
WlanQtUtilsWlanSecMode CmmWrapperPrivate::cmm2WlanQtUtilsSecModeMap(int aSecModeFromCmManager)
    {
    WlanQtUtilsWlanSecMode ret;
    switch (aSecModeFromCmManager)
        {
        case CMManager::EWlanSecModeWep:
            ret = WlanQtUtilsWlanSecModeWep;
            break;
        case CMManager::EWlanSecMode802_1x:
            ret = WlanQtUtilsWlanSecMode802_1x;
            break;
        case CMManager::EWlanSecModeWpa:
            ret = WlanQtUtilsWlanSecModeWpa;
            break;
        case CMManager::EWlanSecModeWpa2:
            ret = WlanQtUtilsWlanSecModeWpa2;
            break;
        default:
            ret = WlanQtUtilsWlanSecModeOpen;
            break;
        }
    
    return ret;
    }

// ---------------------------------------------------------
// Maps WlanQtUtilsWlanSecMode into CMManager's WLAN security mode
// (TWlanSecMode, defined in cmpluginwlandef.h).
// ---------------------------------------------------------
//
int CmmWrapperPrivate::wlanQtUtils2CmmSecModeMap(WlanQtUtilsWlanSecMode aWlanQtUtilsSecMode)
    {
    int ret;
    switch (aWlanQtUtilsSecMode)
        {
        case WlanQtUtilsWlanSecModeWep:
            ret = CMManager::EWlanSecModeWep;
            break;
        case WlanQtUtilsWlanSecMode802_1x:
            ret = CMManager::EWlanSecMode802_1x;
            break;
        case WlanQtUtilsWlanSecModeWpa:
            ret = CMManager::EWlanSecModeWpa;
            break;
        case WlanQtUtilsWlanSecModeWpa2:
            ret = CMManager::EWlanSecModeWpa2;
            break;
        default:
            ret = CMManager::EWlanSecModeOpen;
            break;
        }

    return ret;
    }

//end of file