diff -r a828660c511c -r d3d7683d16f5 wlanapitest/wlanhaitest/wlan/src/T_RSocketServData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanapitest/wlanhaitest/wlan/src/T_RSocketServData.cpp Wed Sep 01 12:41:05 2010 +0100 @@ -0,0 +1,431 @@ +/* +* Copyright (c) 2005-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: +* +*/ + + + +#include "t_rsocketservdata.h" +#include +#include +#include +#include +#include +#include +/*@{*/ +//LIT's params fron the ini file +_LIT(KWlanIap, "WLANIAP"); +_LIT(KWlanSsid, "DEFAULT_SSID"); +_LIT(KCommsDbTableView, "commsdbtableview"); +_LIT(KCommsDatabase, "commsdatabase"); +/*@}*/ + +/*@{*/ +//LIT's commands +_LIT(KCmdSetOutgoingIap, "SetOutgoingIap"); +_LIT(KCmdConnect, "Connect"); +_LIT(KCmdClose, "Close"); +/*@}*/ + + +/** + * Two phase constructor + * + * @leave system wide error + */ +CT_RSocketServData* CT_RSocketServData::NewL() + { + CT_RSocketServData * ret = new (ELeave) CT_RSocketServData(); + CleanupStack::PushL(ret); + ret->ConstructL(); + CleanupStack::Pop(ret); + return ret; + } + +/* + * public destructor + */ +CT_RSocketServData::~CT_RSocketServData() + { + if(iSocketServConnected) + { + Close(); + } + if(iSocketServ) + { + delete iSocketServ; + iSocketServ = NULL; + } + } + +/** + * Private constructor. First phase construction + */ +CT_RSocketServData::CT_RSocketServData() +: iSocketServ(NULL), + iSocketServConnected(EFalse), + iIapID(0) + { + } + +/** + * Second phase construction + * + * @internalComponent + * + * @return N/A + * + * @pre None + * @post None + * + * @leave system wide error + */ +void CT_RSocketServData::ConstructL() + { + iSocketServ = new (ELeave)RSocketServ(); + } + + +/** + * Return a pointer to the object that the data wraps + * + * @return pointer to the object that the data wraps + */ +TAny* CT_RSocketServData::GetObject() + { + return iSocketServ; + } + +void CT_RSocketServData::SetIapID(TUint32 aIapID) + { + iIapID = aIapID; + } + +/** + * Process a command read from the Ini file + * @param aCommand The command to process + * @param aSection The section get from the *.ini file of the project T_Wlan + * @param aAsyncErrorIndex Command index dor async calls to returns errors to + * @return TBool ETrue if the command is process + * @leave system wide error + */ +TBool CT_RSocketServData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/) + { + TBool ret = ETrue; + + if(aCommand == KCmdSetOutgoingIap) + { + DoCmdSetOutgoingIap(aSection); + } + else if(aCommand == KCmdConnect) + { + DoCmdConnect(); + } + else if(aCommand == KCmdClose) + { + DoCmdClose(); + } + else + { + ERR_PRINTF1(_L("Unknown command.")); + ret = EFalse; + } + return ret; + } + + +/** + * Get IAP, matching the name given (KWlanIap parameter read from the ini file). Set SSID of the + * IAP to the given value (KWlanSsid parameter read from the ini file). + * Store the ID of the IAP locally to allow using the IAP for connecting. + * If there are errors, are management for SetBlockResult() and SetError() + * @param aSection Section to review in the ini file for this command + * @return void + */ +void CT_RSocketServData::DoCmdSetOutgoingIap(const TTEFSectionName& aSection) + { + INFO_PRINTF1(_L("*START* CT_RSocketServData::DoCmdSetOutgoingIap")); + TBool dataOk = ETrue; + + TPtrC aIapName; + if(!GetStringFromConfig(aSection, KWlanIap, aIapName)) + { + ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KWlanIap); + SetBlockResult(EFail); + dataOk = EFalse; + } + + TPtrC aSsid; + if(!GetStringFromConfig(aSection, KWlanSsid, aSsid)) + { + ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KWlanSsid); + SetBlockResult(EFail); + dataOk = EFalse; + } + + TPtrC commsdbtableName; + if(!GetStringFromConfig(aSection, KCommsDbTableView, commsdbtableName)) + { + ERR_PRINTF2(_L("Error in getting parameter %S from INI file"),&KCommsDbTableView); + SetBlockResult(EFail); + dataOk = EFalse; + } + + TPtrC commsdbName; + if(!GetStringFromConfig(aSection, KCommsDatabase, commsdbName)) + { + ERR_PRINTF2(_L("Error in getting parameter %S from INI file"),&KCommsDatabase); + SetBlockResult(EFail); + dataOk = EFalse; + } + + if (dataOk) + { + // reset IAP id + SetIapID(0); + + TBool apFound = EFalse; + // Open view to IAP table, select all outgoing IAPs. + CCommsDbTableView* searchView = static_cast(GetDataObjectL(commsdbtableName)); + CCommsDatabase* commsDatabase = static_cast(GetDataObjectL(commsdbName)); + + // Make sure the view was available. + if( searchView != NULL && commsDatabase != NULL ) + { + CleanupStack::PushL(searchView); + INFO_PRINTF1(_L("Start browsing through the IAPs.")); + TInt error = searchView->GotoFirstRecord(); + + if( error == KErrNone ) + { + // Buffer for reading IAP names from CommsDat. Buffer size is set to + // maximum readable value from CommsDat. + TBuf iapName; + TUint32 iapID = 0; + INFO_PRINTF1(_L("CT_RSocketServData: CommsDat ready for searching, going through all outgoing IAPs")); + TUint32 iapservice = 0; + + TBool failed = EFalse; + + // Go through all IAPs. + while( error == KErrNone ) + { + iapName.FillZ(); + + // Read IAP ID and name from IAP table in CommsDat. + TRAPD(err, searchView->ReadTextL( TPtrC( COMMDB_NAME ), iapName )); + + if(err == KErrNone) + { + TRAP(err, searchView->ReadUintL( TPtrC( COMMDB_ID ), iapID )); + + if(err == KErrNone) + { + INFO_PRINTF3(_L("CT_RSocketServData: IAP (ID = [%d]): %S"), iapID, &iapName ); + + // Try to match the name with user input in the ini file. + if( iapName.Match( aIapName ) == KErrNone ) + { + INFO_PRINTF2(_L("CT_RSocketServData: Matching IAP name found with IAP ID = [%d]"), iapID ); + + apFound = ETrue; + + // Return the found IAP ID + SetIapID(iapID); + + // Read IAP service from IAP table in CommsDat. + TRAPD(err, searchView->ReadUintL( TPtrC( IAP_SERVICE ), iapservice )); + + if(err == KErrNone) + { + INFO_PRINTF2(_L("Service of the AP: %d"),iapservice); + + // Write the ssid given as a parameter in WLANServiceTable in CommsDat + INFO_PRINTF1(_L("CT_RSocketServData: Get WlanSettings from WLANServiceTable")); + CWLanSettings* wlanset = new (ELeave) CWLanSettings(); + CleanupStack::PushL( wlanset ); + + // Connect to CommsDat + err = wlanset->Connect(); + + if( err == KErrNone ) + { + // Get wlan settings corresponding IAP service info from IAP table + SWLANSettings wlanSettings; + err = wlanset->GetWlanSettings( iapservice, wlanSettings ); + + if( err == KErrNone ) + { + INFO_PRINTF2(_L("CT_RSocketServData: CommsDat: wlanSettings.Name = %S"), &wlanSettings.Name ); + INFO_PRINTF2(_L("CT_RSocketServData: CommsDat: wlanSettings.SSID = %S"), &wlanSettings.SSID ); + + // Set the new ssid from the ini file + wlanSettings.SSID = aSsid; + INFO_PRINTF2(_L("CT_RSocketServData: New value for wlanSettings.SSID = %S"), &wlanSettings.SSID ); + + // Write the new settings in CommsDat + err = wlanset->WriteWlanSettings(wlanSettings ); + + if( err == KErrNone ) + { + INFO_PRINTF1(_L("CT_RSocketServData: WlanSettings saved in CommsDat")); + wlanset->Disconnect(); + CleanupStack::PopAndDestroy( wlanset ); + } + else + { + ERR_PRINTF2(_L("CT_RSocketServData: WriteWlanSettings error: [%d]"), err ); + SetError(err); + failed = ETrue; + break; + } + } + else + { + ERR_PRINTF2(_L("CT_RSocketServData: Get WlanSettings error: [%d]"), err ); + SetError(err); + failed = ETrue; + break; + } + } + else + { + ERR_PRINTF2(_L("CT_RSocketServData: WLanSettings connect failed! [%d]"), err ); + SetError(err); + failed = ETrue; + break; + } + } + else + { + ERR_PRINTF2(_L("searchView->ReadUintL left with error %d"), err); + SetError(err); + failed = ETrue; + break; + } + } + + error = searchView->GotoNextRecord(); + if(error == KErrNotFound) + { + INFO_PRINTF2(_L("searchView->GotoNextRecord() not found [%d]"), error); + INFO_PRINTF1(_L("No more records to look for")); + } + else if(error != KErrNone) + { + ERR_PRINTF2(_L("searchView->GotoNextRecord() Failed with error = %d"),error); + SetError(err); + failed = ETrue; + break; + } + } + else + { + ERR_PRINTF2(_L("searchView->ReadUintL left with error %d"), err); + SetError(err); + failed = ETrue; + break; + } + } + else + { + ERR_PRINTF2(_L("searchView->ReadTextL left with error %d"), err); + SetError(err); + failed = ETrue; + break; + } + } + + CleanupStack::Pop( searchView ); + + //if( !failed && GetIapID() == 0 ) + // { + // ERR_PRINTF1(_L("No valid IAP found")); + // SetBlockResult(EFail); + // } + } + else + { + INFO_PRINTF2(_L("CT_RSocketServData: No IAPs found [%d]"), error ); + } + + if(apFound == EFalse) + { + CApAccessPointItem *wlan = CApAccessPointItem::NewLC(); + wlan->SetNamesL(aIapName); + wlan->SetBearerTypeL(EApBearerTypeWLAN); + wlan->WriteTextL(EApWlanNetworkName, aSsid); + CApDataHandler *handler = CApDataHandler::NewLC(*commsDatabase); + TUint32 apId = handler->CreateFromDataL(*wlan); + INFO_PRINTF4(_L("Add new IAP ID: %d, name:%S, SSID: %S"), apId,&aIapName,&aSsid); + SetIapID(apId); + CleanupStack::PopAndDestroy(2); + } + } + else + { + ERR_PRINTF1(_L("CT_RSocketServData: No IAPs found")); + ERR_PRINTF1(_L("CommsDat, no view and database were available.")); + SetBlockResult(EFail); + } + } + + INFO_PRINTF1(_L("*END* CT_RSocketServData::DoCmdSetOutgoingIap")); + } + +/** + * Command to calls RSocketServ::Connect. The error is management for SetError() helper + * @param + * @return + */ +void CT_RSocketServData::DoCmdConnect() + { + INFO_PRINTF1(_L("*START* CT_RSocketServData::DoCmdConnect")); + + TInt err = iSocketServ->Connect(); + if(err != KErrNone) + { + ERR_PRINTF1(_L("iSocketServ->Connect() Fail")); + SetError(err); + } + else + { + iSocketServConnected = ETrue; + } + + INFO_PRINTF1(_L("*END* CT_RSocketServData::DoCmdConnect")); + } +/** + * Command to close RSocketServ instance + * @param + * @return + */ +void CT_RSocketServData::DoCmdClose() + { + INFO_PRINTF1(_L("*START* CT_RSocketServData::DoCmdClose")); + Close(); + INFO_PRINTF1(_L("*END* CT_RSocketServData::DoCmdClose")); + } + +/** + * Helper for the command DoCmdCloseSocketServ: RSocketServ::Close + * @param + * @return + */ +void CT_RSocketServData::Close() + { + iSocketServ->Close(); + iSocketServConnected = EFalse; + }