wlanapitest/wlanhaitest/wlan/src/T_RSocketServData.cpp
branchRCL_3
changeset 18 d3d7683d16f5
parent 0 c40eb8fe8501
--- /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 <commdb.h>				
+#include <wdbifwlansettings.h>			
+#include <apselect.h>     
+#include <aplistitem.h>
+#include <apdatahandler.h>
+#include <apaccesspointitem.h>
+/*@{*/
+//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<CCommsDbTableView*>(GetDataObjectL(commsdbtableName));
+        CCommsDatabase* commsDatabase =  static_cast<CCommsDatabase*>(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<KCommsDbSvrMaxColumnNameLength> 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; 		
+	}