Revision: 200949
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:39:25 +0200
changeset 0 857a3e953887
child 1 e329958deeba
Revision: 200949 Kit: 200951
emulatorlan/data/EnableLanConnection.cmd
emulatorlan/data/configchange.pl
emulatorlan/data/ethernetced.xml
emulatorlan/data/s60_32_default_snaps.xml
emulatorlan/group/bld.inf
group/bld.inf
layers.sysdef.xml
nettools/conntest/Engine/HttpHandler.cpp
nettools/conntest/Engine/ProgressNotifier.cpp
nettools/conntest/Engine/QosObserver.cpp
nettools/conntest/Engine/SendTimer.cpp
nettools/conntest/Engine/SocketsEngine.cpp
nettools/conntest/Engine/SocketsRead.cpp
nettools/conntest/Engine/SocketsWrite.cpp
nettools/conntest/Engine/TimeOutTimer.cpp
nettools/conntest/Engine/alractiveobject.cpp
nettools/conntest/Engine/ipdumpengine.cpp
nettools/conntest/aif/ConnTestaif.rss
nettools/conntest/aif/context_pane_icon.bmp
nettools/conntest/aif/context_pane_icon_mask.bmp
nettools/conntest/aif/list_icon.bmp
nettools/conntest/aif/list_icon_mask.bmp
nettools/conntest/data/ConnTest.rss
nettools/conntest/data/ConnTest_caption.rss
nettools/conntest/data/ConnTest_reg.rss
nettools/conntest/group/ConnTest.mmp
nettools/conntest/group/bld.inf
nettools/conntest/group/ethernet.ini
nettools/conntest/group/icons_aif_bitmaps_dc.mk
nettools/conntest/inc/ConnTest.pan
nettools/conntest/inc/ConnTest.rh
nettools/conntest/inc/ConnTestApp.h
nettools/conntest/inc/ConnTestAppUi.h
nettools/conntest/inc/ConnTestContainer.h
nettools/conntest/inc/ConnTestDocument.h
nettools/conntest/inc/ConnTestView.h
nettools/conntest/inc/CustomPrefsData.h
nettools/conntest/inc/CustomPrefsItemList.h
nettools/conntest/inc/HttpHandler.h
nettools/conntest/inc/ProgressNotifier.h
nettools/conntest/inc/ProgressNotifyHandler.h
nettools/conntest/inc/QosObserver.h
nettools/conntest/inc/SendTimer.h
nettools/conntest/inc/SettingData.h
nettools/conntest/inc/SettingItemList.h
nettools/conntest/inc/SocketsEngine.h
nettools/conntest/inc/SocketsRead.h
nettools/conntest/inc/SocketsWrite.h
nettools/conntest/inc/TimeOutNotify.h
nettools/conntest/inc/TimeOutTimer.h
nettools/conntest/inc/Utils.h
nettools/conntest/inc/alractiveobject.h
nettools/conntest/inc/conntest.hrh
nettools/conntest/inc/conntest.loc
nettools/conntest/inc/datasendnotifyhandler.h
nettools/conntest/inc/ipdumpengine.h
nettools/conntest/inc/uinotify.h
nettools/conntest/install/ConnTest.pkg
nettools/conntest/probe/EABI/probeU.DEF
nettools/conntest/probe/bmarm/probeu.def
nettools/conntest/probe/bwins/probeu.def
nettools/conntest/probe/data/probe.esk
nettools/conntest/probe/group/ABLD.BAT
nettools/conntest/probe/group/bld.inf
nettools/conntest/probe/group/probe.mmp
nettools/conntest/probe/inc/family.h
nettools/conntest/probe/inc/prt.h
nettools/conntest/probe/inc/sap.h
nettools/conntest/probe/src/family.cpp
nettools/conntest/probe/src/prt.cpp
nettools/conntest/probe/src/sap.cpp
nettools/conntest/rom/ConnTest.iby
nettools/conntest/src/ConnTestApp.cpp
nettools/conntest/src/ConnTestAppUi.cpp
nettools/conntest/src/ConnTestContainer.cpp
nettools/conntest/src/ConnTestDocument.cpp
nettools/conntest/src/ConnTestView.cpp
nettools/conntest/src/CustomPrefsData.cpp
nettools/conntest/src/CustomPrefsItemList.cpp
nettools/conntest/src/SettingData.cpp
nettools/conntest/src/SettingItemList.cpp
nettools/conntest/src/Utils.cpp
nettools/group/bld.inf
package_definition.xml
sysdef_1_4_0.dtd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulatorlan/data/EnableLanConnection.cmd	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,19 @@
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: Command file for project emulatorlan 
+rem
+
+call configchange.pl --config ethernetWithCommDB --kernel EKA2 --target winscw --variant UDEB
+call \epoc32\RELEASE\winscw\udeb\dbcreator.exe -dtextshell -Mconsole -- E
+call \epoc32\RELEASE\winscw\udeb\dbcreator.exe -dtextshell -- f:c:\S60_32_default_snaps.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulatorlan/data/configchange.pl	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,272 @@
+#
+# Copyright (c) 2004 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: The script can 
+# - create a working ethernet setup with "ethernet" config option 
+# - restore previous setup with "restore" config option 
+#
+
+use Getopt::Long;
+use Cwd;
+
+my $config="default";
+my $target="default";
+my $kernel="default";
+my $showhelp='0';
+
+my $etherNif;
+my $etherMac;
+my $etherSpeed;
+
+# this variable is passed as an argument to netcards.exe
+# specifies which interface to use in case of multiple interfaces
+
+my $interface=0;
+
+$/ = "\n";
+
+GetOptions('config=s' => \$config, 'kernel=s' => \$kernel, 'target=s' => \$target, 'variant=s' => \$variant, 'help' => \$showhelp, 'interface:i' => \$interface);
+
+$config = lc( $config );
+$kernel = lc( $kernel );
+$target = lc( $target );
+$variant = lc( $variant );
+
+
+if( $showhelp || ( $kernel ne "eka1" && $kernel ne "eka2" ) ||
+ ( $target ne "wins" && $target ne "winscw" ) ||
+ ( $config ne "ethernetwithcommdb" && $config ne "restorecommdb" && $config ne "ethernetnocommdb" ) ||
+ ( $variant ne "udeb" && $variant ne "urel" ) )
+	{
+	print "Command usage: configchange --config [ethernetWithCommDB|restoreCommDB|ethernetNoCommDB] --kernel [EKA1|EKA2] --target [wins|winscw] --variant [UDEB|UREL]\n";
+	print "\t\t--config   \tSelect required configuration\n";
+	print "\t\t--kernel   \tKernel variant\n";
+	print "\t\t--target   \tTarget emulator\n";
+	print "\t\t--variant  \tBuild type\n";
+	print "\t\t--interface  \tInterface Number\n";
+	print "\t\t--help   \tThis text\n";
+	exit 0;
+	}
+
+my $epocroot = &getEpocroot;
+my $drive = &getDrive;
+
+if( $config ne "restorecommdb" )
+	{
+	# must be creating some ethernet setup
+	if( $config eq "ethernetwithcommdb" )
+		{
+		# write an appropriate commDB setup
+		print( "Setting up CommDB for ethernet\n" );
+		system( "$drive\\$epocroot\\epoc32\\release\\$target\\$variant\\ceddump -dtextshell --" ) == 0 
+				or die "Error running ceddump!\n";
+		system( "move $drive\\$epocroot\\epoc32\\$target\\c\\cedout.cfg $drive\\$epocroot\\epoc32\\$target\\c\\nonethernetced.cfg" ) == 0
+				or die "Failed to rename cedout.cfg!\n";
+		system( "$drive\\$epocroot\\epoc32\\release\\$target\\$variant\\ced -dtextshell -- -i c:\\EthernetCed.xml") == 0
+				or die "Error running ced!\n";
+  		}
+  	print( "Running Netcards to obtain adapter info\n" );
+	system( "$drive\\$epocroot\\epoc32\\tools\\netcards $interface" ) == 0
+			or die "Error running netcards!\n";
+
+	open ( INFILE, "ethernet.ini" ) or die "Can't find netcards output file, ethernet.ini!\n";					 # get from current directory where netcards wrote it to
+
+	if ($kernel eq "eka1")
+		{
+	   	open ( ETHERMAC, ">$drive\\$epocroot\\epoc32\\$target\\c\\system\\data\\ethermac.dat" ) or die "Can't open $drive\\$epocroot\\epoc32\\$target\\c\\system\\data\\ethermac.dat!\n";
+	   	open ( ETHERDRV, ">$drive\\$epocroot\\epoc32\\$target\\c\\system\\data\\etherdriver.dat" ) or die "Can't open $drive\\$epocroot\\epoc32\\$target\\c\\system\\data\\etherdriver.dat!\n";
+	   	}
+
+	while( <INFILE> )
+		{
+		chomp;
+	   	my $sLine = $_;
+
+		if( $sLine =~ /ETHER_NIF=(.*)/i )
+			{
+			#print "Matched ETHER_NIF\n";
+			if ($kernel eq "eka1")
+				{
+				print ETHERDRV "$1";
+    			}
+			else
+				{
+				$etherNif = $1;
+				}
+			}
+		elsif( $sLine =~ /ETHER_MAC=(.*)/i )
+			{
+		#print "Matched ETHER_MAC\n";
+			if ($kernel eq "eka1")
+				{
+				print ETHERMAC "$1";
+    			}
+			else
+				{
+				$etherMac = $1;
+    			}
+			}
+		elsif( $sLine =~ /ETHER_SPEED=(.*)/i )
+			{
+			#print "Matched ETHER_SPEED\n";
+			if ($kernel eq "eka2")
+				{
+				$etherSpeed = $1;
+    			}
+			}
+		#print "line: $sLine\n";
+		}
+	if ($kernel eq "eka1")
+		{
+		close( ETHERDRV );
+		close( ETHERMAC );
+  		}
+  	else
+  		{
+  		# do the insertion to epoc.ini
+  		&generateEpocIni;
+    	}
+	close( INFILE );
+	}
+else
+	{
+	if( -f "$drive\\$epocroot\\epoc32\\$target\\c\\nonethernetced.cfg" )
+		{
+		system( "$drive\\$epocroot\\epoc32\\release\\$target\\$variant\\ced -i c:\\nonethernetced.cfg" ) == 0
+				or die "Can't find backup ced file!\n";
+		system( "move $drive\\$epocroot\\epoc32\\$target\\c\\nonethernetced.cfg $drive\\$epocroot\\epoc32\\$target\\c\\cedout.cfg") == 0
+				or die "Can't rename backup ced file!\n";
+		}
+	else
+		{
+		print "No restore file found!\n";
+		}
+	}
+
+
+
+
+#
+# Determines, validates, and returns EPOCROOT.
+#
+sub getEpocroot
+{
+    my $epocroot = $ENV{EPOCROOT};
+    die "ERROR: Must set the EPOCROOT environment variable.\n"
+	if (!defined($epocroot));
+    $epocroot =~ s-/-\\-go;	# for those working with UNIX shells
+    die "ERROR: EPOCROOT must be an absolute path, " .
+	"not containing a drive letter.\n" if ($epocroot !~ /^\\/);
+    die "ERROR: EPOCROOT must not be a UNC path.\n" if ($epocroot =~ /^\\\\/);
+    die "ERROR: EPOCROOT must end with a backslash.\n" if ($epocroot !~ /\\$/);
+    die "ERROR: EPOCROOT must specify an existing directory.\n"
+	if (!-d $epocroot);
+    return $epocroot;
+}
+
+#
+# Determines and returns the current drive, if any.
+#
+sub getDrive
+{
+    my $wd = cwd;
+    my $drive;
+    if($wd =~ /^([a-zA-Z]:)/) {
+	$drive = $1;
+    } else {
+	# Perhaps we're on a machine that has no drives.
+	$drive = "";
+    }
+    return $drive;
+}
+
+#
+#
+#
+sub generateEpocIni
+{
+	my @outLines;
+	my $length = 0;
+	my $needToAppend = TRUE;
+	my $epocIniAlreadyExists = FALSE;
+	my $finished = FALSE;
+ 	print "generating epoc ini\n";
+	if ( -e "$drive\\$epocroot\\epoc32\\data\\epoc.ini" )
+	   {
+	   $epocIniAlreadyExists = TRUE;
+ 	   open( EPOCINI, "+<$drive\\$epocroot\\epoc32\\data\\epoc.ini" );
+	   seek( EPOCINI, 0, 0 );
+	   while( <EPOCINI> )
+	   		{
+			chomp;
+	   		my $sLine = $_;
+			if( $sLine =~ /ETHER_NIF=(.*)/i )
+				{
+				#print "matched etherNIF\n";
+				$length = length( $etherNif );
+    			substr( $sLine, (index( $sLine, "=" )+1), $length ) = $etherNif;
+				$needToAppend = FALSE;
+				}
+			elsif( $sLine =~ /ETHER_MAC=(.*)/i )
+				{
+				#print "Matched ETHER_MAC\n";
+				$length = length( $etherMac );
+				substr( $sLine, (index( $sLine, "=" )+1), $length ) = $etherMac;
+				$needToAppend = FALSE;
+	    		}
+			elsif( $sLine =~ /ETHER_SPEED=(.*)/i )
+				{
+				#print "Matched etherSpeed\n";
+    			$length = length( $etherSpeed );
+				substr( $sLine, (index( $sLine, "=" )+1), $length ) = $etherSpeed;
+				$needToAppend = FALSE;
+	   			}
+			push( @outLines, $sLine );
+			push( @outLines, "\n" );
+	   		}
+	   	if ( $needToAppend eq FALSE )
+	   	   	{
+	   	   	print "Writing new settings into epoc.ini\n";
+	   	   	# we have read the entire file and replaced what we need to
+	   	   	# now lets write it back to the file
+		   	seek( EPOCINI, 0, 0 );
+	   	   	print EPOCINI @outLines;
+	   	   	$finished = TRUE;
+           	}
+        close ( EPOCINI );
+		}
+
+	if ( $finished eq FALSE )
+	    {
+       	if ( ($needToAppend eq TRUE) && ($epocIniAlreadyExists eq TRUE) )
+       	    {
+       	    print "Appending settings to current epoc.ini\n";
+       	  	# we must append all the settings onto the end of the current epoc.ini
+	   	  	open( EPOCINI, ">>$drive\\$epocroot\\epoc32\\data\\epoc.ini" ) or die "Can't open epoc.ini!\n";
+       	  	}
+    	elsif ( $epocIniAlreadyExists eq FALSE )
+       	 	{
+       	 	print "Creating new epoc.ini\n";
+       	  	# create new file
+	   	  	open( EPOCINI, ">$drive\\$epocroot\\epoc32\\data\\epoc.ini" );
+       	  	}
+
+		print EPOCINI "\nETHER_NIF=";
+	   	print EPOCINI "$etherNif\n";
+	   	print EPOCINI "ETHER_MAC=";
+	   	print EPOCINI "$etherMac\n";
+	   	print EPOCINI "ETHER_SPEED=";
+	   	print EPOCINI "$etherSpeed\n";
+	   	close ( EPOCINI );
+     	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulatorlan/data/ethernetced.xml	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,1897 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+        CommDB Settings File
+        Copyright (c) 2003-2004, Symbian Ltd.
+        All Rights Reserved
+-->
+<CommDB:Config xmlns="SymbianOS.Generic.Comms-Infras.CommDB"
+               xmlns:CommDB="SymbianOS.Generic.Comms-Infras.CommDB"
+               xmlns:xlink="http://www.w3.org/1999/xlink"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="SymbianOS.Generic.Comms-Infras.CommDB CommDB.xsd">
+
+<InformationTable>
+</InformationTable>
+
+<NetworkTable>
+    <Network operation="add">
+        <Name>Intranet</Name>
+    </Network>
+    <Network operation="add">
+        <Name>mRouter</Name>
+    </Network>
+</NetworkTable>
+
+<ModemBearerTable>
+    <ModemBearer operation="template">
+        <Name>Default Modem</Name>
+        <Agent>CSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>0</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>Null Modem 115200bps</Name>
+        <Agent>CSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>US Robotics Sportster</Name>
+        <Agent>CSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>57600</Rate>
+        <Handshaking>244</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>AFTERDIALUNTILANSWER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT&amp;F1</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT&amp;d2</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>Dacom Surfer</Name>
+        <Agent>CSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>57600</Rate>
+        <Handshaking>244</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>AFTERDIALUNTILANSWER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT&amp;F</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT&amp;d2</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>GSM Mobile Phone via Infrared</Name>
+        <Agent>CSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>IRCOMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>IRCOMM</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>196</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>17</XonChar>
+        <XoffChar>19</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>ATZ</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>GSM Mobile Phone via Serial</Name>
+        <Agent>CSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>19200</Rate>
+        <Handshaking>196</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>17</XonChar>
+        <XoffChar>19</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>ATZ</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>GPRS Ericsson R520m via IR</Name>
+        <Agent>PSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>IRCOMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>IRCOMM</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>17</XonChar>
+        <XoffChar>19</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>ATZ</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>GPRS Ericsson R520m/T68i via Serial</Name>
+        <Agent>PSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>19200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>17</XonChar>
+        <XoffChar>19</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>ATZ</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <IspInitString>*99***1#</IspInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>GPRS Motorola Mobile Phone via Serial</Name>
+        <Agent>PSD.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>57600</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>17</XonChar>
+        <XoffChar>19</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>ATZ</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>WinTunnel Modem</Name>
+        <Agent>null.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::6</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>180</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>30</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>60</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>mRouterWinsBearer</Name>
+        <Agent>mRouterAgent.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>WINS::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>WINSCSY</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>9999</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>180</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>30</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>mRouterRs232Bearer</Name>
+        <Agent>mRouterAgent.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>COMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECUART</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>9999</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>180</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>30</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>mRouterIrBearer</Name>
+        <Agent>mRouterAgent.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>IRCOMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>IRCOMM</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>9999</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>180</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>30</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>mRouterBtBearer</Name>
+        <Agent>mRouterAgent.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>BTCOMM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>BTCOMM</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>9999</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>180</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>30</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+    <ModemBearer operation="add">
+        <Name>mRouterUsbBearer</Name>
+        <Agent>mRouterAgent.agt</Agent>
+        <IfName>PPP</IfName>
+        <PortName>ACM::0</PortName>
+        <TSYName>MM</TSYName>
+        <CSYName>ECACM</CSYName>
+        <DataBits>8</DataBits>
+        <StopBits>1</StopBits>
+        <Parity>NONE</Parity>
+        <Rate>115200</Rate>
+        <Handshaking>4</Handshaking>
+        <SpecialRate>0</SpecialRate>
+        <XonChar>0</XonChar>
+        <XoffChar>0</XoffChar>
+        <FaxClassPref>AUTO</FaxClassPref>
+        <SpeakerPref>NEVER</SpeakerPref>
+        <SpeakerVolPref>QUIET</SpeakerVolPref>
+        <ModemInitString>AT</ModemInitString>
+        <DataInitString>AT</DataInitString>
+        <FaxInitString>AT</FaxInitString>
+        <DialPauseLength>S8=</DialPauseLength>
+        <SpeakerVolContorlLow>L0</SpeakerVolContorlLow>
+        <SpeakerVolControlMedium>L1</SpeakerVolControlMedium>
+        <SpeakerVolControlHigh>L2</SpeakerVolControlHigh>
+        <SpeakerAlwaysOff>M0</SpeakerAlwaysOff>
+        <SpeakerOnUntilCarrier>M1</SpeakerOnUntilCarrier>
+        <SpeakerAlwaysOn>M2</SpeakerAlwaysOn>
+        <SpeakerOnAfterUntilCarrier>M3</SpeakerOnAfterUntilCarrier>
+        <DialToneWaitModifier>W</DialToneWaitModifier>
+        <CallProgress1>X1</CallProgress1>
+        <CallProgress2>X2</CallProgress2>
+        <CallProgress3>X3</CallProgress3>
+        <CallProgress4>X4</CallProgress4>
+        <EchoOff>E0</EchoOff>
+        <VerboseText>V1</VerboseText>
+        <QuietOff>Q0</QuietOff>
+        <QuietOn>Q1</QuietOn>
+        <DialCommandStateModifier>;</DialCommandStateModifier>
+        <OnLine>O</OnLine>
+        <ResetConfiguration>Z</ResetConfiguration>
+        <ReturnToFactoryDefs>&amp;F</ReturnToFactoryDefs>
+        <DCDOnDuringLink>&amp;C1</DCDOnDuringLink>
+        <DTRHangUp>&amp;D2</DTRHangUp>
+        <DSRAlwaysOn>&amp;S0</DSRAlwaysOn>
+        <RTSCTSHandshake>&amp;K3</RTSCTSHandshake>
+        <XonXoffHandshake>&amp;K4</XonXoffHandshake>
+        <EscapeCharacter>+</EscapeCharacter>
+        <EscapeGuardPeriod>S12</EscapeGuardPeriod>
+        <NoDialTone>NO DIAL TONE</NoDialTone>
+        <Busy>BUSY</Busy>
+        <NoAnswer>NO ANSWER</NoAnswer>
+        <Carrier>CARRIER</Carrier>
+        <Connect>CONNECT</Connect>
+        <CompressionClass5>COMPRESSION:CLASS 5</CompressionClass5>
+        <CompressionV42bis>COMPRESSION:V.42 bis</CompressionV42bis>
+        <CompressionNone>COMPRESSION:NONE</CompressionNone>
+        <ProtocolLAPD>PROTOCOL:LAPD</ProtocolLAPD>
+        <ProtocolALT>PROTOCOL:ALT</ProtocolALT>
+        <ProtocolALTCELLULAR>PROTOCOL:ALT-CELLULAR</ProtocolALTCELLULAR>
+        <ProtocolNone>PROTOCOL:NONE</ProtocolNone>
+        <MessageCentreNumber>+44123456789</MessageCentreNumber>
+        <MessageValidityPeriod>1440</MessageValidityPeriod>
+        <MessageDeliveryReport>FALSE</MessageDeliveryReport>
+        <MinimumSignalLevel>9905</MinimumSignalLevel>
+        <LastSocketActivityTimeout>9999</LastSocketActivityTimeout>
+        <LastSessionClosedTimeout>180</LastSessionClosedTimeout>
+        <LastSocketClosedTimeout>30</LastSocketClosedTimeout>
+        <SIRSettings>0</SIRSettings>
+        <CommRole>0</CommRole>
+    </ModemBearer>
+</ModemBearerTable>
+
+<LANBearerTable>
+    <LANBearer operation="add">
+	<Name>LANBearer</Name>
+	<Agent>nullagt.agt</Agent>
+	<IfName>ethint</IfName>
+	<LDDFilename>enet</LDDFilename>
+	<LDDName>=Ethernet</LDDName>
+	<PDDFilename>ethernet</PDDFilename>
+	<PDDName>Ethernet.Wins</PDDName>
+	<PacketDriverName>EtherPkt.drv</PacketDriverName>
+	<LastSocketActivityTimeout>-1</LastSocketActivityTimeout>
+	<LastSessionClosedTimeout>-1</LastSessionClosedTimeout>
+	<LastSocketClosedTimeout>-1</LastSocketClosedTimeout>
+    </LANBearer>
+</LANBearerTable>
+
+<DialInISPTable>
+    <DialInISP operation="template">
+        <Name>Default Dial In ISP</Name>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>Default Dial In ISP</Description>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <UseEdge>FALSE</UseEdge>
+    </DialInISP>
+    <DialInISP operation="add">
+        <Name>Dial In ISP01</Name>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>Dial In ISP01</Description>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <UseEdge>FALSE</UseEdge>
+    </DialInISP>
+</DialInISPTable>
+
+<DialOutISPTable>
+    <DialOutISP operation="template">
+        <Name>Default Dial Out ISP</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>TRUE</PromptForLogin>
+        <IfPromptForAuth>TRUE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>Default Dial Out ISP</Description>
+        <DefaultTelNum>Default Dial Out ISP</DefaultTelNum>
+        <LoginName>TRUE</LoginName>
+        <LoginPass>TRUE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>FALSE</IfNetworks>
+        <IfAuthName>TRUE</IfAuthName>
+        <IfAuthPass>TRUE</IfAuthPass>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>NT RAS</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>TRUE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>Test</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginScript>CHARMAP \[windows-1252\]\nLOOP 10\n{\nSEND &quot;CLIENT&quot;+&lt;0x0d&gt;\nWAIT 3\n{\n&quot;SERVER&quot; OK\n}\n}\nEXIT KErrNoAnswer$\n\nOK:\nEXIT\n</LoginScript>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>RasUser</IfAuthName>
+        <IfAuthPass>pass</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>ISP01</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>TRUE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>PlaceHolder for ISP01</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>xxx</IfAuthName>
+        <IfAuthPass>yyy</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>ISP02</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>TRUE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>PlaceHolder for ISP02</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>xxx</IfAuthName>
+        <IfAuthPass>yyy</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>ISP03</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>TRUE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>PlaceHolder for ISP03</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>xxx</IfAuthName>
+        <IfAuthPass>yyy</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>ISP04</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>TRUE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>PlaceHolder for ISP04</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>xxx</IfAuthName>
+        <IfAuthPass>yyy</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>ISP05</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>TRUE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>PlaceHolder for ISP05</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>xxx</IfAuthName>
+        <IfAuthPass>yyy</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+    <DialOutISP operation="add">
+        <Name>mRouterDialOutIsp</Name>
+        <DialResolution>TRUE</DialResolution>
+        <UseLoginScript>FALSE</UseLoginScript>
+        <PromptForLogin>FALSE</PromptForLogin>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <Description>mRouterDialOutIsp</Description>
+        <Type>INTERNETONLY</Type>
+        <DefaultTelNum>INTERNETONLY</DefaultTelNum>
+        <LoginName>FALSE</LoginName>
+        <LoginPass>FALSE</LoginPass>
+        <DisplayPCT>FALSE</DisplayPCT>
+        <IfParams>FALSE</IfParams>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>IfAuthPass=</IfAuthName>
+        <IfAuthPass>AuthRetries=0</IfAuthPass>
+        <AuthRetries>0</AuthRetries>
+        <IfCallbackEnabled>FALSE</IfCallbackEnabled>
+        <CallbackTimeout>0</CallbackTimeout>
+        <IpAddr>TRUE</IpAddr>
+        <IpNetMask>TRUE</IpNetMask>
+        <IpGateway>TRUE</IpGateway>
+        <IpNameServer1>TRUE</IpNameServer1>
+        <IpNameServer2>TRUE</IpNameServer2>
+        <EnableIPHeaderComp>FALSE</EnableIPHeaderComp>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <EnableSWComp>FALSE</EnableSWComp>
+        <BearerService>0</BearerService>
+        <BearerProtocol>UNSPECIFIED</BearerProtocol>
+        <RlpVersion>0</RlpVersion>
+        <IwfToMs>0</IwfToMs>
+        <MsToIwf>0</MsToIwf>
+        <AckTimer>0</AckTimer>
+        <RetransmissionAttempts>0</RetransmissionAttempts>
+        <ResequencePeriod>0</ResequencePeriod>
+        <V42Compression>0</V42Compression>
+        <V42Codewords>0</V42Codewords>
+        <V42MaxLength>0</V42MaxLength>
+        <Asymmetry>0</Asymmetry>
+        <UserInitUpgrade>FALSE</UserInitUpgrade>
+        <UseEdge>FALSE</UseEdge>
+    </DialOutISP>
+</DialOutISPTable>
+
+<AgentLookupTable>
+</AgentLookupTable>
+
+<CDMA2000PacketServiceTable>
+    <CDMA2000PacketService operation="add">
+        <Name>test name cdma2000</Name>
+        <IwfName>Test2000</IwfName>
+        <ServiceOption>HIGHSPEEDCDMA2000DATA</ServiceOption>
+        <PdpType>IPV4</PdpType>
+        <ReqFwdPriority>PRIORITY04</ReqFwdPriority>
+        <ReqRevPriority>PRIORITY04</ReqRevPriority>
+        <ReqFwdBitrate>32KBPS</ReqFwdBitrate>
+        <ReqRevBitrate>32KBPS</ReqRevBitrate>
+        <ReqFwdLoss>LOSS1</ReqFwdLoss>
+        <ReqRevLoss>LOSS1</ReqRevLoss>
+        <ReqFwdMaxdelay>40MS</ReqFwdMaxdelay>
+        <ReqRevMaxdelay>40MS</ReqRevMaxdelay>
+        <MinFwdBitrate>32KBPS</MinFwdBitrate>
+        <MinRevBitrate>32KBPS</MinRevBitrate>
+        <AccptFwdLoss>LOSS2</AccptFwdLoss>
+        <AccptRevLoss>LOSS2</AccptRevLoss>
+        <AccptFwdMaxdelay>120MS</AccptFwdMaxdelay>
+        <AccptRevMaxdelay>120MS</AccptRevMaxdelay>
+        <DataCompression>FALSE</DataCompression>
+        <HeaderCompression>FALSE</HeaderCompression>
+        <AnonymousAccess>FALSE</AnonymousAccess>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>RasUser</IfAuthName>
+        <IfAuthPass>pass</IfAuthPass>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <AuthRetries>1</AuthRetries>
+        <IpNetMask>0.255.255.255</IpNetMask>
+        <IpGateway>10.0.0.1</IpGateway>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <EnableLCPExtension>TRUE</EnableLCPExtension>
+        <DisablePlainTextAuth>TRUE</DisablePlainTextAuth>
+        <ApType>2</ApType>
+        <QosWarningTimeout>1000000</QosWarningTimeout>
+        <RlpMode>TRANSPARENT</RlpMode>
+        <CDMAMobileIP>FALSE</CDMAMobileIP>
+        <CDMAMobileIPTimeout>10000000</CDMAMobileIPTimeout>
+    </CDMA2000PacketService>
+</CDMA2000PacketServiceTable>
+
+<DefaultCDMA2000Table>
+</DefaultCDMA2000Table>
+
+<ChargecardTable>
+    <Chargecard operation="add">
+        <Name>Dummy BT Chargecard</Name>
+        <AccountNumber>144,12345678</AccountNumber>
+        <Pin>0000</Pin>
+        <LocalRule>HG</LocalRule>
+        <NatRule>HFG</NatRule>
+        <IntlRule>HEFG</IntlRule>
+    </Chargecard>
+    <Chargecard operation="add">
+        <Name>Dummy Mercury Chargecard</Name>
+        <AccountNumber>0500800800,,12345678</AccountNumber>
+        <Pin>****</Pin>
+        <LocalRule>HG</LocalRule>
+        <NatRule>J,K,0FG</NatRule>
+        <IntlRule>HEFG</IntlRule>
+    </Chargecard>
+</ChargecardTable>
+
+<ConnectionPreferencesTable>
+</ConnectionPreferencesTable>
+
+<GlobalSettingsTable>
+    <GlobalSettings operation="add">
+        <Name>GlobalSettingsTable1</Name>
+        <WAPAccess>WAPAccessPoint.Default Dial In ISP</WAPAccess>
+        <RedialAttempts>3</RedialAttempts>
+        <SmsBearer>WAPSMSBearer.WAPSMSBearerTable1</SmsBearer>
+        <SmsReceiveMode>2</SmsReceiveMode>
+        <GPRSAttachMode>1</GPRSAttachMode>
+        <AcceptIncomingGprs>1</AcceptIncomingGprs>
+        <ConnectionAttempts>2</ConnectionAttempts>
+        <ModemForDataAndFax>2</ModemForDataAndFax>
+        <ModemForPhoneServicesAndSMS>2</ModemForPhoneServicesAndSMS>
+        <LocationForDataAndFax>Location.Office</LocationForDataAndFax>
+        <LocationForPhoneServicesAndSMS>Location.Office</LocationForPhoneServicesAndSMS>
+        <GPRSClassCBearer>GSM</GPRSClassCBearer>
+        <DefaultNetwork>Network.Intranet</DefaultNetwork>
+        <BearerAvailabilityCheckTSY>mm</BearerAvailabilityCheckTSY>
+    </GlobalSettings>
+</GlobalSettingsTable>
+
+<IncomingGPRSTable>
+    <IncomingGPRS operation="add">
+        <Name>Incoming GPRS Settings PlaceHolder</Name>
+        <APN>Test</APN>
+        <PDPType>IPV4</PDPType>
+        <PDPAddress>0.0.0.0</PDPAddress>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>TRUE</IpDNSAddrFromServer>
+        <ReqPrecedence>1</ReqPrecedence>
+        <ReqDelay>1</ReqDelay>
+        <ReqReliability>1</ReqReliability>
+        <ReqPeakThroughput>1</ReqPeakThroughput>
+        <ReqMeanThroughput>1</ReqMeanThroughput>
+        <MinPrecedence>1</MinPrecedence>
+        <MinDelay>1</MinDelay>
+        <MinReliability>1</MinReliability>
+        <MinPeakThroughput>1</MinPeakThroughput>
+        <MinMeanThroughput>1</MinMeanThroughput>
+        <DataCompression>FALSE</DataCompression>
+        <HeaderCompression>FALSE</HeaderCompression>
+        <AnonymousAccess>FALSE</AnonymousAccess>
+        <IfNetworks>ip</IfNetworks>
+        <IfAuthName>RasUser</IfAuthName>
+        <IfAuthPass>pass</IfAuthPass>
+        <AuthRetries>1</AuthRetries>
+        <IpNameServer1>0.0.0.0</IpNameServer1>
+        <IpNameServer2>0.0.0.0</IpNameServer2>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <GprsUseEdge>FALSE</GprsUseEdge>
+    </IncomingGPRS>
+</IncomingGPRSTable>
+
+<OutgoingGPRSTable>
+    <OutgoingGPRS operation="add">
+        <Name>GPRS01</Name>
+        <APN>gprs01APNPlaceHolder</APN>
+        <PDPType>IPV4</PDPType>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>FALSE</IpDNSAddrFromServer>
+        <ReqPrecedence>0</ReqPrecedence>
+        <ReqDelay>0</ReqDelay>
+        <ReqReliability>0</ReqReliability>
+        <ReqPeakThroughput>0</ReqPeakThroughput>
+        <ReqMeanThroughput>0</ReqMeanThroughput>
+        <MinPrecedence>0</MinPrecedence>
+        <MinDelay>0</MinDelay>
+        <MinReliability>0</MinReliability>
+        <MinPeakThroughput>0</MinPeakThroughput>
+        <MinMeanThroughput>0</MinMeanThroughput>
+        <DataCompression>FALSE</DataCompression>
+        <HeaderCompression>FALSE</HeaderCompression>
+        <AnonymousAccess>FALSE</AnonymousAccess>
+        <IfNetworks>ip</IfNetworks>
+        <AuthRetries>1</AuthRetries>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <GprsUseEdge>FALSE</GprsUseEdge>
+        <GprsAccessPointType>0</GprsAccessPointType>
+        <QosWarningTimeout>0</QosWarningTimeout>
+    </OutgoingGPRS>
+    <OutgoingGPRS operation="add">
+        <Name>GPRS02</Name>
+        <APN>gprs02APNPlaceHolder</APN>
+        <PDPType>IPV4</PDPType>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>FALSE</IpDNSAddrFromServer>
+        <ReqPrecedence>0</ReqPrecedence>
+        <ReqDelay>0</ReqDelay>
+        <ReqReliability>0</ReqReliability>
+        <ReqPeakThroughput>0</ReqPeakThroughput>
+        <ReqMeanThroughput>0</ReqMeanThroughput>
+        <MinPrecedence>0</MinPrecedence>
+        <MinDelay>0</MinDelay>
+        <MinReliability>0</MinReliability>
+        <MinPeakThroughput>0</MinPeakThroughput>
+        <MinMeanThroughput>0</MinMeanThroughput>
+        <DataCompression>FALSE</DataCompression>
+        <HeaderCompression>FALSE</HeaderCompression>
+        <AnonymousAccess>FALSE</AnonymousAccess>
+        <IfNetworks>ip</IfNetworks>
+        <AuthRetries>1</AuthRetries>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <GprsUseEdge>FALSE</GprsUseEdge>
+        <GprsAccessPointType>0</GprsAccessPointType>
+        <QosWarningTimeout>0</QosWarningTimeout>
+    </OutgoingGPRS>
+    <OutgoingGPRS operation="add">
+        <Name>GPRS03</Name>
+        <APN>gprs03APNPlaceHolder</APN>
+        <PDPType>IPV4</PDPType>
+        <IfPromptForAuth>FALSE</IfPromptForAuth>
+        <IpAddrFromServer>TRUE</IpAddrFromServer>
+        <IpDNSAddrFromServer>FALSE</IpDNSAddrFromServer>
+        <ReqPrecedence>0</ReqPrecedence>
+        <ReqDelay>0</ReqDelay>
+        <ReqReliability>0</ReqReliability>
+        <ReqPeakThroughput>0</ReqPeakThroughput>
+        <ReqMeanThroughput>0</ReqMeanThroughput>
+        <MinPrecedence>0</MinPrecedence>
+        <MinDelay>0</MinDelay>
+        <MinReliability>0</MinReliability>
+        <MinPeakThroughput>0</MinPeakThroughput>
+        <MinMeanThroughput>0</MinMeanThroughput>
+        <DataCompression>FALSE</DataCompression>
+        <HeaderCompression>FALSE</HeaderCompression>
+        <AnonymousAccess>FALSE</AnonymousAccess>
+        <IfNetworks>ip</IfNetworks>
+        <AuthRetries>1</AuthRetries>
+        <EnableLCPExtension>FALSE</EnableLCPExtension>
+        <DisablePlainTextAuth>FALSE</DisablePlainTextAuth>
+        <GprsUseEdge>FALSE</GprsUseEdge>
+        <GprsAccessPointType>0</GprsAccessPointType>
+        <QosWarningTimeout>0</QosWarningTimeout>
+    </OutgoingGPRS>
+</OutgoingGPRSTable>
+
+<DefaultGPRSTable>
+    <DefaultGPRS operation="add">
+        <Name>Dummy Default GPRS Settings</Name>
+        <APN>Access point name</APN>
+        <PDPType>IPV6</PDPType>
+        <PDPAddress>www.wid.com</PDPAddress>
+        <Usage>1</Usage>
+        <Precedence>1</Precedence>
+        <Delay>1</Delay>
+        <Reliability>1</Reliability>
+        <PeakThroughput>1</PeakThroughput>
+        <MeanThroughput>1</MeanThroughput>
+        <MinPrecedence>1</MinPrecedence>
+        <MinDelay>1</MinDelay>
+        <MinReliability>1</MinReliability>
+        <MinPeakThroughput>1</MinPeakThroughput>
+        <MinMeanThroughput>1</MinMeanThroughput>
+        <DataCompression>TRUE</DataCompression>
+        <HeaderCompression>TRUE</HeaderCompression>
+        <GprsUseEdge>FALSE</GprsUseEdge>
+        <AnonymousAccess>TRUE</AnonymousAccess>
+    </DefaultGPRS>
+</DefaultGPRSTable>
+
+<ProxyTable>
+</ProxyTable>
+
+<LocationTable>
+    <Location operation="template">
+        <Name>Default Location</Name>
+        <Mobile>TRUE</Mobile>
+        <UsePulseDial>FALSE</UsePulseDial>
+        <WaitForDialTone>FALSE</WaitForDialTone>
+        <PauseAfterDialout>0</PauseAfterDialout>
+        <IntlPrefixCode>+</IntlPrefixCode>
+        <NatPrefixCode>0</NatPrefixCode>
+        <NatCode>44</NatCode>
+        <AreaCode>44</AreaCode>
+        <DialOutCode>44</DialOutCode>
+        <DisableCallWaitingCode>44</DisableCallWaitingCode>
+    </Location>
+    <Location operation="add">
+        <Name>Office</Name>
+        <Mobile>FALSE</Mobile>
+        <UsePulseDial>FALSE</UsePulseDial>
+        <WaitForDialTone>FALSE</WaitForDialTone>
+        <PauseAfterDialout>0</PauseAfterDialout>
+        <IntlPrefixCode>00</IntlPrefixCode>
+        <NatPrefixCode>0</NatPrefixCode>
+        <NatCode>44</NatCode>
+        <AreaCode>171</AreaCode>
+        <DialOutCode>9,</DialOutCode>
+        <DisableCallWaitingCode>9,</DisableCallWaitingCode>
+    </Location>
+    <Location operation="add">
+        <Name>Office Direct Dial</Name>
+        <Mobile>FALSE</Mobile>
+        <UsePulseDial>FALSE</UsePulseDial>
+        <WaitForDialTone>FALSE</WaitForDialTone>
+        <PauseAfterDialout>0</PauseAfterDialout>
+        <IntlPrefixCode>00</IntlPrefixCode>
+        <NatPrefixCode>0</NatPrefixCode>
+        <NatCode>44</NatCode>
+        <AreaCode>171</AreaCode>
+        <DialOutCode>171</DialOutCode>
+        <DisableCallWaitingCode>171</DisableCallWaitingCode>
+    </Location>
+    <Location operation="add">
+        <Name>Mobile</Name>
+        <Mobile>TRUE</Mobile>
+        <UsePulseDial>FALSE</UsePulseDial>
+        <WaitForDialTone>FALSE</WaitForDialTone>
+        <PauseAfterDialout>0</PauseAfterDialout>
+        <IntlPrefixCode>+</IntlPrefixCode>
+        <NatPrefixCode>0</NatPrefixCode>
+        <NatCode>44</NatCode>
+        <AreaCode>44</AreaCode>
+        <DialOutCode>44</DialOutCode>
+        <DisableCallWaitingCode>44</DisableCallWaitingCode>
+    </Location>
+    <Location operation="add">
+        <Name>Home</Name>
+        <Mobile>FALSE</Mobile>
+        <UsePulseDial>TRUE</UsePulseDial>
+        <WaitForDialTone>TRUE</WaitForDialTone>
+        <PauseAfterDialout>0</PauseAfterDialout>
+        <IntlPrefixCode>00</IntlPrefixCode>
+        <NatPrefixCode>0</NatPrefixCode>
+        <NatCode>44</NatCode>
+        <AreaCode>181</AreaCode>
+        <DialOutCode>181</DialOutCode>
+        <DisableCallWaitingCode>181</DisableCallWaitingCode>
+    </Location>
+</LocationTable>
+
+<SecureSocketTable>
+    <SecureSocket operation="add">
+        <Name>SecureSocketTable1</Name>
+        <ProtocolName>ssl3.0</ProtocolName>
+        <ProtoLibrary>ssladaptor.dll</ProtoLibrary>
+    </SecureSocket>
+    <SecureSocket operation="add">
+        <Name>SecureSocketTable2</Name>
+        <ProtocolName>tls1.0</ProtocolName>
+        <ProtoLibrary>ssladaptor.dll</ProtoLibrary>
+    </SecureSocket>
+</SecureSocketTable>
+
+<BTDeviceTable>
+</BTDeviceTable>
+
+<BTPersistTable>
+</BTPersistTable>
+
+<BTSecurityTable>
+</BTSecurityTable>
+
+<BTDefaultTable>
+</BTDefaultTable>
+
+<WAPAccessPointTable>
+    <WAPAccessPoint operation="template">
+        <Name>Default Dial In ISP</Name>
+        <CurrentBearer>WAPIPBearer</CurrentBearer>
+    </WAPAccessPoint>
+    <WAPAccessPoint operation="add">
+        <Name>Ethernet Static IP</Name>
+        <CurrentBearer>WAPIPBearer</CurrentBearer>
+        <StartPage>www.wapstart.com</StartPage>
+    </WAPAccessPoint>
+    <WAPAccessPoint operation="add">
+        <Name>Ethernet Dynamic IP</Name>
+        <CurrentBearer>WAPIPBearer</CurrentBearer>
+        <StartPage>www.wapstart.com</StartPage>
+    </WAPAccessPoint>
+</WAPAccessPointTable>
+
+<WAPIPBearerTable>
+    <WAPIPBearer operation="template">
+        <Name>WAPIPBearerTable1</Name>
+        <AccessPoint>WAPAccessPoint.-1</AccessPoint>
+        <GatewayAddress>0</GatewayAddress>
+        <WSPOption>CONNECTIONLESS</WSPOption>
+        <Security>FALSE</Security>
+        <IAPRef>IAP.-1</IAPRef>
+        <ProxyPortNumber>0</ProxyPortNumber>
+        <ProxyLogin>0</ProxyLogin>
+        <ProxyPassword>0</ProxyPassword>
+    </WAPIPBearer>
+</WAPIPBearerTable>
+
+<WAPSMSBearerTable>
+    <WAPSMSBearer operation="template">
+        <Name>WAPSMSBearerTable1</Name>
+        <AccessPoint>WAPAccessPoint.-1</AccessPoint>
+        <GatewayAddress>0</GatewayAddress>
+        <WSPOption>CONNECTIONLESS</WSPOption>
+        <Security>FALSE</Security>
+        <ServiceCentreAddress>0</ServiceCentreAddress>
+    </WAPSMSBearer>
+    <WAPSMSBearer operation="add">
+        <Name>WAPSMSBearerTable2</Name>
+        <AccessPoint>WAPAccessPoint.Ethernet Dynamic IP</AccessPoint>
+        <GatewayAddress>+4412345678901</GatewayAddress>
+        <WSPOption>CONNECTIONORIENTED</WSPOption>
+        <Security>FALSE</Security>
+        <ServiceCentreAddress>+442071234567</ServiceCentreAddress>
+    </WAPSMSBearer>
+</WAPSMSBearerTable>
+
+<VirtualBearerTable>
+</VirtualBearerTable>
+
+<VpnServiceTable>
+</VpnServiceTable>
+
+
+</CommDB:Config>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulatorlan/data/s60_32_default_snaps.xml	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Variant xmlns:xi="http://www.w3.org/2001/xinclude">
+    <Global>
+    <Attachmode>whenneeded</Attachmode>
+    <DefaultDnIcon>11</DefaultDnIcon>
+    <PriorityLan>0</PriorityLan>
+    <PriorityWlan>1</PriorityWlan>
+    <PriorityPan>2</PriorityPan>
+    <PriorityGprsOut>3</PriorityGprsOut>
+    <PriorityGprsIn>4</PriorityGprsIn>
+    <PriorityCdma2k>5</PriorityCdma2k>
+    <PriorityDialOut>7</PriorityDialOut>
+    <PriorityDialIn>8</PriorityDialIn>
+    <PriorityVpn></PriorityVpn>
+    <PriorityMip></PriorityMip>
+    <UIPriorityLan>9</UIPriorityLan>
+    <UIPriorityWlan>0</UIPriorityWlan>
+    <UIPriorityPan>8</UIPriorityPan>
+    <UIPriorityGprsOut>1</UIPriorityGprsOut>
+    <UIPriorityGprsIn>2</UIPriorityGprsIn>
+    <UIPriorityCdma2k>3</UIPriorityCdma2k>
+    <UIPriorityDialOut>4</UIPriorityDialOut>
+    <UIPriorityDialIn>5</UIPriorityDialIn>
+    <UIPriorityVpn>6</UIPriorityVpn>
+    <UIPriorityMip>7</UIPriorityMip>
+    <DefaultConnectionType>Destination</DefaultConnectionType>
+    <DefaultConnectionName>Internet</DefaultConnectionName>
+    </Global>
+    <LAN_APs>
+    <LAN_AP>
+      <ConnectionName>Incorrect ethernet setup 1</ConnectionName>
+    	<Protected>No</Protected>
+			<Hidden>No</Hidden>
+			<HiddenAgent>No</HiddenAgent>	
+			<Highlighted>No</Highlighted>
+			<Seamlessness>ConfirmFirst</Seamlessness>
+			<StartingPage/>
+			<PrimaryNameServer>194.72.6.51</PrimaryNameServer>
+			<SecondaryNameServer>194.72.6.52</SecondaryNameServer>
+			<ProxyServerAddress/>
+			<ProxyPortNumber/>
+			<ProxyProtocolName/>
+			<LanIfNetworks>ip</LanIfNetworks>
+			<LanIpNetMask>255.255.255.0</LanIpNetMask>
+			<LanIpGateway>10.32.194.254</LanIpGateway>
+			<PhoneIP>10.32.194.251</PhoneIP>
+			<IpAddrFromServer>False</IpAddrFromServer>
+      <IpDNSAddrFromServer>True</IpDNSAddrFromServer>
+      <ConfigDaemonManagerName>NonExistingServ</ConfigDaemonManagerName>
+      <ConfigDaemonName>NonExistingServ</ConfigDaemonName>
+    </LAN_AP>
+    <LAN_AP>
+      <ConnectionName>Ethernet with Daemon Static IP</ConnectionName>
+    	<Protected>No</Protected>
+			<Hidden>No</Hidden>
+			<HiddenAgent>No</HiddenAgent>	
+			<Highlighted>No</Highlighted>
+			<Seamlessness>ConfirmFirst</Seamlessness>
+			<StartingPage/>
+			<PrimaryNameServer>194.72.6.51</PrimaryNameServer>
+			<SecondaryNameServer>194.72.6.52</SecondaryNameServer>
+			<ProxyServerAddress/>
+			<ProxyPortNumber/>
+			<ProxyProtocolName/>
+			<LanIfNetworks>ip</LanIfNetworks>
+			<LanIpNetMask>255.255.255.0</LanIpNetMask>
+			<LanIpGateway>192.168.20.2</LanIpGateway>
+			<PhoneIP>192.168.20.13</PhoneIP>
+			<IpAddrFromServer>False</IpAddrFromServer>
+      <IpDNSAddrFromServer>True</IpDNSAddrFromServer>
+      <ConfigDaemonManagerName>NetCfgExtnDhcp</ConfigDaemonManagerName>
+      <ConfigDaemonName>!DhcpServ</ConfigDaemonName>
+    </LAN_AP>
+    <LAN_AP>
+      <ConnectionName>Ethernet with Daemon Dynamic IP</ConnectionName>
+    	<Protected>No</Protected>
+			<Hidden>No</Hidden>
+			<HiddenAgent>No</HiddenAgent>	
+			<Highlighted>No</Highlighted>
+			<Seamlessness>ConfirmFirst</Seamlessness>
+			<StartingPage/>
+			<PrimaryNameServer>194.72.6.51</PrimaryNameServer>
+			<SecondaryNameServer>194.72.6.52</SecondaryNameServer>
+			<ProxyServerAddress/>
+			<ProxyPortNumber/>
+			<ProxyProtocolName/>
+			<LanIfNetworks>ip</LanIfNetworks>
+			<LanIpNetMask>255.255.255.0</LanIpNetMask>
+			<LanIpGateway>10.32.194.254</LanIpGateway>
+			<PhoneIP>10.32.194.251</PhoneIP>
+			<IpAddrFromServer>True</IpAddrFromServer>
+      <IpDNSAddrFromServer>True</IpDNSAddrFromServer>
+      <ConfigDaemonManagerName>NetCfgExtnDhcp</ConfigDaemonManagerName>
+      <ConfigDaemonName>!DhcpServ</ConfigDaemonName>
+    </LAN_AP>
+    </LAN_APs>
+    <DNs>
+        <DN>
+            <Name>Internet</Name>
+            <Metadata>Internet</Metadata>
+            <Protection>2</Protection>
+            <Hidden>No</Hidden>
+            <HiddenAgent>No</HiddenAgent>
+            <Highlighted>Yes</Highlighted>
+            <Icon>0</Icon>
+            <EmbeddedDN></EmbeddedDN>
+            <IAP></IAP>
+            <IAP2></IAP2>
+            <IAP3></IAP3>
+            <IAP4></IAP4>
+            <IAP5></IAP5>
+            <IAP6></IAP6>
+            <IAP7></IAP7>
+            <IAP8></IAP8>
+            <IAP9></IAP9>
+            <IAP10></IAP10>
+        </DN>
+        <DN>
+            <Name>MMS</Name>
+            <Metadata>MMS</Metadata>
+            <Protection>2</Protection>
+            <Hidden>No</Hidden>
+            <HiddenAgent>Yes</HiddenAgent>
+            <Highlighted>No</Highlighted>
+            <Icon>2</Icon>
+            <EmbeddedDN></EmbeddedDN>
+            <IAP></IAP>
+            <IAP2></IAP2>
+            <IAP3></IAP3>
+            <IAP4></IAP4>
+            <IAP5></IAP5>
+            <IAP6></IAP6>
+            <IAP7></IAP7>
+            <IAP8></IAP8>
+            <IAP9></IAP9>
+            <IAP10></IAP10>
+        </DN>
+        <DN>
+            <Name>Operator</Name>
+            <Metadata>Operator</Metadata>
+            <Protection>2</Protection>
+            <Hidden>No</Hidden>
+            <HiddenAgent>No</HiddenAgent>
+            <Highlighted>No</Highlighted>
+            <Icon>4</Icon>
+            <EmbeddedDN></EmbeddedDN>
+            <IAP></IAP>
+            <IAP2></IAP2>
+            <IAP3></IAP3>
+            <IAP4></IAP4>
+            <IAP5></IAP5>
+            <IAP6></IAP6>
+            <IAP7></IAP7>
+            <IAP8></IAP8>
+            <IAP9></IAP9>
+            <IAP10></IAP10>
+        </DN>
+    </DNs>
+</Variant>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulatorlan/group/bld.inf	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2007 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:  Build information file for project emulatorlan
+*
+*/
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../data/configchange.pl             /epoc32/tools/configchange.pl
+../data/EnableLanConnection.cmd     /epoc32/tools/EnableLanConnection.cmd
+../data/ethernetced.xml             /epoc32/winscw/c/ethernetced.xml
+../data/s60_32_default_snaps.xml    /epoc32/winscw/c/s60_32_default_snaps.xml
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+
+//  End of File
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/group/bld.inf	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2001-2006 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:  Build information file for conntools. 
+*
+*/
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+#include "../nettools/group/bld.inf"
+#include "../emulatorlan/group/bld.inf"
+
+PRJ_TESTMMPFILES
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/layers.sysdef.xml	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
+  <!ENTITY layer_real_source_path "sf/app/conntools" >
+]>
+
+<SystemDefinition name="conntools" schema="1.4.0">
+  <systemModel>
+    <layer name="app_layer">
+      <module name="conntools">
+        <unit unitID="netdo.conntools" mrp="" bldFile="&layer_real_source_path;/group" name="conntools" />
+      </module>
+    </layer>
+  </systemModel>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/HttpHandler.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,770 @@
+/*
+* Copyright (c) 2006-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: HttpHandler is used for HTTP connection components testing
+*
+*/
+
+// INCLUDE FILES
+#include <commdb.h>
+
+#include "HttpHandler.h"
+#include "uinotify.h"
+#include "SettingData.h"
+#include "Utils.h"
+#include "ConnTest.pan"
+#include "conntest.hrh"
+
+// CONSTANTS
+
+// Size of buffer used when submitting request bodies
+//const TInt KMaxSubmitSize = 2048;
+const TInt KMaxHeaderNameLen = 32;
+const TInt KMaxHeaderValueLen = 128;
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+
+// Standard headers used by default
+_LIT8(KUserAgent, "User-Agent: Nokia6600/1.0");
+_LIT8(KAccept, "*/*");
+
+
+enum THttpExampleClientPanics
+{
+    EReqBodySumitBufferNotAllocated,
+        KBodyWithInvalidSize,
+        KCouldntNotifyBodyDataPart
+};
+
+
+
+//============================================================
+//
+// Implementation of CHttpClient
+//
+//============================================================
+
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::CHttpClient(MUINotify& aConsole)
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CHttpClient::CHttpClient(MUINotify& aConsole)
+: iReqBodySubmitBufferPtr(0,0), iConsole(aConsole)
+{
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::~CHttpClient()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CHttpClient::~CHttpClient()
+{
+    delete iReqBodySubmitBuffer;
+    delete iTransObs;
+    iHttpSession.Close();
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::NewLC(MUINotify& aConsole)
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CHttpClient* CHttpClient::NewLC(MUINotify& aConsole)
+{
+    CHttpClient* me = new(ELeave) CHttpClient(aConsole);
+    CleanupStack::PushL(me);
+    me->ConstructL();
+    return me;
+}
+
+// ----------------------------------------------------------------------------
+// CHttpClient::NewL(MUINotify& aConsole)
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CHttpClient* CHttpClient::NewL(MUINotify& aConsole)
+{
+    CHttpClient* me = NewLC(aConsole);
+    CleanupStack::Pop(me);
+    return me;
+}
+
+// ----------------------------------------------------------------------------
+// CHttpClient::ConstructL()
+// EPOC two-phased constructor
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::ConstructL()
+{
+    iHttpSession.OpenL();
+    
+    // Install this class as the callback for authentication requests
+    InstallAuthenticationL(iHttpSession);
+    
+    iTransObs = CHttpEventHandler::NewL(iConsole);
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::SetHttpConnectionInfo()
+// Set RConnection and RSocketServ as session properties, if
+// http fw does not use it's own connection.
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::SetHttpConnectionInfoL( TBool aUseOwnConnection, 
+                                          RConnection& aConnection, 
+                                          RSocketServ& aSocketServ )
+{
+    TInt result;
+    TBuf<16> serviceType;
+    TUint32 serviceId;
+    TBuf<100> query;
+    TBuf<100> proxyAddr;
+    TBuf8<100> proxyAddr2;
+    TUint32 proxyPort;
+    TUint connCount;
+    CCommsDatabase* TheDb;
+    RStringF proxyName;
+    
+    // Trick to get new values into use    
+    iHttpSession.Close();
+    iHttpSession.OpenL();
+    
+    RStringPool strPool = iHttpSession.StringPool();
+    
+    // Remove first session properties just in case.
+    RHTTPConnectionInfo connInfo = iHttpSession.ConnectionInfo();
+    
+    // Clear RConnection and Socket Server instances
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EHttpSocketServ,RHTTPSession::GetTable()));
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EHttpSocketConnection,RHTTPSession::GetTable()));
+    
+    // Clear the proxy settings
+    THTTPHdrVal proxyUsage(strPool.StringF(HTTP::EUseProxy,RHTTPSession::GetTable()));
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EProxyUsage,RHTTPSession::GetTable()));
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EProxyAddress,RHTTPSession::GetTable()));
+    
+    if(!aUseOwnConnection)
+    {
+        // RConnection has been started, set proxy (if defined) and RConnection and
+        // Socket Server session properties.
+        
+        // Proxy
+        result = aConnection.EnumerateConnections(connCount);
+        User::LeaveIfError(result);
+        
+        //
+        // Get service and service type for this connection
+        //
+        query.Format(_L("%s\\%s"), IAP, IAP_SERVICE);
+        result = aConnection.GetIntSetting(query, serviceId);
+        
+        query.Format(_L("%s\\%s"), IAP, IAP_SERVICE_TYPE);
+        result = aConnection.GetDesSetting(query, serviceType);
+        User::LeaveIfError(result);
+        
+        TheDb = CCommsDatabase::NewL();
+        CleanupStack::PushL(TheDb);
+        
+        CCommsDbTableView* view = TheDb->OpenViewOnProxyRecordLC(serviceId, serviceType);
+        result = view->GotoFirstRecord();
+        
+        if(result == KErrNone)
+        {
+            // This IAP uses proxy, set it to http session
+            view->ReadUintL(TPtrC(PROXY_PORT_NUMBER), proxyPort);
+            HBufC* k = view->ReadLongTextLC(TPtrC(PROXY_SERVER_NAME));
+            proxyAddr.Copy(k->Des());
+            proxyAddr.AppendFormat(_L(":%d"), proxyPort);
+            
+            proxyAddr2.Copy(proxyAddr);
+            
+            CleanupClosePushL(proxyName);
+            proxyName = iHttpSession.StringPool().OpenFStringL(proxyAddr2);
+            connInfo.SetPropertyL( strPool.StringF(HTTP::EProxyUsage,RHTTPSession::GetTable()), 
+                                   proxyUsage );
+            connInfo.SetPropertyL( strPool.StringF(HTTP::EProxyAddress,RHTTPSession::GetTable()), 
+                                   proxyName );
+            CleanupStack::PopAndDestroy(&proxyName); // proxyName
+            CleanupStack::PopAndDestroy(k); //k
+            
+            RDebug::Print(_L("ConnTest: Proxy address: %S"), &proxyAddr);
+        }
+        CleanupStack::PopAndDestroy(view); // view
+        CleanupStack::PopAndDestroy(TheDb); // TheDb
+        
+        // RConnection and Socket Server
+        connInfo.SetPropertyL ( 
+            strPool.StringF(HTTP::EHttpSocketServ, RHTTPSession::GetTable()), 
+            THTTPHdrVal (aSocketServ.Handle()) );
+        
+        TInt connPtr1 = REINTERPRET_CAST(TInt, &aConnection);
+        connInfo.SetPropertyL ( 
+            strPool.StringF(HTTP::EHttpSocketConnection, 
+            RHTTPSession::GetTable() ), THTTPHdrVal (connPtr1) );    
+        
+    }
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::InvokeHttpMethodL()
+// Create the transaction, set the headers and body and start the transaction
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::InvokeHttpMethodL(const CSettingData* aData, TBool aHasBody, TBool aIsSecure)
+{
+    
+    iSettingData = (CSettingData*)aData;
+    
+    RStringPool strPool = iHttpSession.StringPool();
+    RStringF method = strPool.StringF(HTTP::EGET,RHTTPSession::GetTable());
+    
+    if(aHasBody)
+    {
+        method = strPool.StringF(HTTP::EPOST,RHTTPSession::GetTable());
+        
+        delete iReqBodySubmitBuffer;
+        iReqBodySubmitBuffer = NULL;
+        iReqBodySubmitBuffer = HBufC8::NewMaxL(KSendDataSize);
+        iReqBodySubmitBufferPtr.Set(iReqBodySubmitBuffer->Des());
+                
+        // Create body chunk
+        Utils::CreateDataChunk(iReqBodySubmitBufferPtr, aData->iPacketSize);
+        iDataChunkCount = 0;
+    }
+    else
+    {
+        method = strPool.StringF(HTTP::EGET,RHTTPSession::GetTable());
+    }
+        
+    TBuf8<256> aUri;
+    
+    if(aIsSecure)
+        aUri.Copy(_L8("https://"));
+    else
+        aUri.Copy(_L8("http://"));
+    
+    aUri.Append(aData->iServerName);
+    
+    // Don't add the port for https
+    if(!aIsSecure)
+        aUri.AppendFormat(_L8(":%d"), aData->iPort);
+    
+    // Add '/' if it is not included in the given page name
+    if(!((TChar)aData->iHttpPage[0] == '/'))
+    {
+        aUri.Append(_L8("/"));
+    }
+    aUri.Append(aData->iHttpPage);
+    
+    TUriParser8 uri; 
+    uri.Parse(aUri);
+    iTrans = iHttpSession.OpenTransactionL(uri, *iTransObs, method);
+    RHTTPHeaders hdr = iTrans.Request().GetHeaderCollection();
+    
+    // Add headers appropriate to all methods
+    SetHeaderL(hdr, HTTP::EUserAgent, KUserAgent);
+    SetHeaderL(hdr, HTTP::EAccept, KAccept);
+    
+    if (aHasBody)
+    {
+        // Content type header
+        TBuf8<KMaxContentTypeSize> contTypeBuf;
+        contTypeBuf.Copy(iReqBodyContentType);
+        RStringF contTypeStr = iHttpSession.StringPool().OpenFStringL(contTypeBuf);
+        THTTPHdrVal contType(contTypeStr);
+        hdr.SetFieldL( iHttpSession.StringPool().StringF( HTTP::EContentType,
+                                                          RHTTPSession::GetTable() ),
+                       contType );
+        contTypeStr.Close();
+        
+        MHTTPDataSupplier* dataSupplier = this;
+        iTrans.Request().SetBody(*dataSupplier);
+    }
+    
+    iTrans.SubmitL();
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::GetNextDataPart
+// Return next data chunk to be posted.
+// ----------------------------------------------------------------------------
+//
+TBool CHttpClient::GetNextDataPart(TPtrC8& aDataPart)
+{
+    
+    aDataPart.Set(iReqBodySubmitBufferPtr);
+
+    if(iDataChunkCount == 0)
+    {
+        iConsole.PrintNotify(_L("Sending body...\n"));
+        iLastTimeStamp.UniversalTime();
+    }
+
+    ++iDataChunkCount;
+    iNoMoreDate = iDataChunkCount < iSettingData->iPackets ? EFalse : ETrue;
+    
+    return iNoMoreDate;
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::ReleaseData
+// Data has been posted, release the data chunk.
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::ReleaseData()
+{
+    if (iNoMoreDate==EFalse)
+    {
+        TRAPD(err, iTrans.NotifyNewRequestBodyPartL());
+        if (err != KErrNone)
+            User::Panic(KPanicConnTest, KCouldntNotifyBodyDataPart);
+    }
+    else
+    {
+        DisplayTimeElapsed();
+    }
+    return;
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::OverallDataSize
+// Return size of the data to be posted.
+// ----------------------------------------------------------------------------
+//
+TInt CHttpClient::OverallDataSize()
+{
+    TInt size = (iSettingData->iPackets)*(iSettingData->iPacketSize);
+    return size;
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::Reset()
+// Method from MHTTPDataSupplier
+// ----------------------------------------------------------------------------
+//
+TInt CHttpClient::Reset()
+{
+    return KErrNotSupported;
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::DisplayTimeElapsed()
+// Calculate and display throughput for POST.
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::DisplayTimeElapsed()
+{
+    // Throughput calculation
+    TInt size = OverallDataSize();
+    TBuf8<128> b(_L8("Body sent\n"));
+    Utils::CalculateThroughput(b, iLastTimeStamp, size);
+    
+    b.Append(_L("\n\n"));
+    iConsole.PrintNotify(b);    
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::SetHeaderL()
+// Set HTTP request header for http fw.
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue)
+{
+    RStringF valStr = iHttpSession.StringPool().OpenFStringL(aHdrValue);
+    THTTPHdrVal val(valStr);
+    aHeaders.SetFieldL(iHttpSession.StringPool().StringF(aHdrField,RHTTPSession::GetTable()), val);
+    valStr.Close();
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::SetPerformance
+// Turn on/off performance measurement
+// ----------------------------------------------------------------------------
+//
+void CHttpClient::SetPerformance(const TBool aValue)
+{
+    iDoPerformance = aValue;
+    iTransObs->SetPerformance(aValue);
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpClient::GetCredentialsL()
+// Called when a authenticated page is requested. Asks the user for a username
+// and password that would be appropriate for the url that was supplied.
+// ----------------------------------------------------------------------------
+//
+TBool CHttpClient::GetCredentialsL(const TUriC8& aURI, RString aRealm, 
+                                   RStringF aAuthenticationType,
+                                   RString& aUsername, 
+                                   RString& aPassword)
+                                   
+{
+    TBuf<80> scratch;
+    TBuf8<80> scratch8;
+    scratch8.Format(_L8("Enter credentials for URL %S, realm %S"), &aURI.UriDes(), &aRealm.DesC());
+    scratch.Copy(scratch8);
+    //	iUtils->Test().Printf(_L("%S\n"), &scratch);
+    scratch.Copy(aAuthenticationType.DesC());
+    //	iUtils->Test().Printf(_L("Using %S authentication\n"), &scratch);
+    //	iUtils->GetAnEntry(_L("Username (or QUIT to give up): "), scratch);
+    scratch8.Copy(scratch);
+    if (scratch8.CompareF(_L8("quit")))
+    {
+        TRAPD(err, aUsername = aRealm.Pool().OpenStringL(scratch8));
+        if (!err)
+        {
+            //			iUtils->GetAnEntry(_L("Password: "), scratch);
+            scratch8.Copy(scratch);
+            TRAP(err, aPassword = aRealm.Pool().OpenStringL(scratch8));
+            if (!err)
+                return ETrue;
+        }
+    }
+    return EFalse;
+}
+
+
+
+//=============================================================================
+//
+// Implementation of class CHttpEventHandler
+//
+//=============================================================================
+
+
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::NewLC(MUINotify& aConsole)
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CHttpEventHandler* CHttpEventHandler::NewLC(MUINotify& aConsole)
+{
+    CHttpEventHandler* me = new(ELeave)CHttpEventHandler(aConsole);
+    CleanupStack::PushL(me);
+    me->ConstructL();
+    return me;
+}
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::NewL(MUINotify& aConsole)
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CHttpEventHandler* CHttpEventHandler::NewL(MUINotify& aConsole)
+{
+    CHttpEventHandler* me = NewLC(aConsole);
+    CleanupStack::Pop(me);
+    return me;
+}
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::ConstructL()
+// EPOC two-phased constructor
+// ----------------------------------------------------------------------------
+//
+void CHttpEventHandler::ConstructL()
+{
+}
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::CHttpEventHandler(MUINotify& aConsole)
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CHttpEventHandler::CHttpEventHandler(MUINotify& aConsole)
+: iConsole(aConsole)
+{
+}
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::~CHttpEventHandler()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CHttpEventHandler::~CHttpEventHandler()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+// HTTP event receiver.
+// ----------------------------------------------------------------------------
+//
+void CHttpEventHandler::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+{
+    switch (aEvent.iStatus)
+    {
+    case THTTPEvent::EGotResponseHeaders:
+        {
+            // HTTP response headers have been received. We can determine now if there is
+            // going to be a response body to save.
+            RHTTPResponse resp = aTransaction.Response();
+            TInt status = resp.StatusCode();
+            RStringF statusStr = resp.StatusText();
+            TBuf<32> statusStr16;
+            statusStr16.Copy(statusStr.DesC());
+            TBuf<64> st;
+            st.Format(_L("Status: %d (%S)\n"), status, &statusStr16);
+            iConsole.PrintNotify(st);
+            
+            
+            // Dump the headers
+            if(!iDoPerformance)
+                DumpRespHeadersL(aTransaction);
+            
+            // Note! For some reason resp.HasBody() returns False although
+            // there is body (Tomcat, index.jsp), so this doesn't work.
+            // Maybe it checks the Content-Length header?
+            if (resp.HasBody() && (status >= 200) && (status < 300) && (status != 204))
+            {
+                TInt dataSize = resp.Body()->OverallDataSize();
+                if (dataSize >= 0)
+                {
+                    TBuf<64> st;
+                    st.Format(_L("Response body size is %d\n"), dataSize);
+                    iConsole.PrintNotify(st);
+                }
+                else
+                {
+                    iConsole.PrintNotify(_L("Response body size is unknown\n"));
+                }
+            }
+            
+            if(iDoPerformance)
+            {
+                iConsole.PrintNotify(_L("Getting body...\n"));
+                iStartTime.UniversalTime();
+            }
+            iBodySize = 0;
+            
+        } break;
+    case THTTPEvent::EGotResponseBodyData:
+        {
+            // Get the body data supplier
+            iRespBody = aTransaction.Response().Body();
+            
+            TPtrC8 dataChunk;
+            iRespBody->GetNextDataPart(dataChunk);
+            iBodySize += dataChunk.Length();
+            
+            if(!iDoPerformance)
+                DumpRespBody(aTransaction);
+            
+            iRespBody->ReleaseData();
+        } break;
+    case THTTPEvent::EResponseComplete:
+        {
+            // The transaction's response is complete
+            
+            TBuf8<128> b(_L8("Got body\n"));
+            
+            if(iDoPerformance)
+                Utils::CalculateThroughput(b, iStartTime, iBodySize);
+            
+            iConsole.PrintNotify(b);
+            
+        } break;
+    case THTTPEvent::ESucceeded:
+        {
+            iConsole.PrintNotify(_L("Transaction Successful\n"));
+            aTransaction.Close();
+            //CActiveScheduler::Stop();
+        } break;
+    case THTTPEvent::EFailed:
+        {
+            iConsole.PrintNotify(_L("Transaction Failed\n"));
+            aTransaction.Close();
+            //CActiveScheduler::Stop();
+        } break;
+    case THTTPEvent::ERedirectedPermanently:
+        {
+            iConsole.PrintNotify(_L("Permanent Redirection\n"));
+        } break;
+    case THTTPEvent::ERedirectedTemporarily:
+        {
+            iConsole.PrintNotify(_L("Temporary Redirection\n"));
+        } break;
+    default:
+        {
+            TBuf<32> text;
+            text.Format(_L("<unrecognised event: %d>\n"), aEvent.iStatus);
+            iConsole.PrintNotify(text);
+            // close off the transaction if it's an error
+            if (aEvent.iStatus < 0)
+            {
+                aTransaction.Close();
+                //CActiveScheduler::Stop();
+            }
+        } break;
+    }
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::MHFRunError(TInt aError, RHTTPTransaction /*aTransaction*/, const THTTPEvent& /*aEvent*/)
+// Error handler
+// ----------------------------------------------------------------------------
+//
+TInt CHttpEventHandler::MHFRunError(TInt aError, RHTTPTransaction /*aTransaction*/, const THTTPEvent& /*aEvent*/)
+{
+    TBuf<64> text;
+    text.Format(_L("MHFRunError fired with error code %d\n"), aError);
+    iConsole.PrintNotify(text);
+    return KErrNone;
+}
+
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::DumpRespHeadersL(RHTTPTransaction& aTrans)
+// Print HTTP headers on console.
+// ----------------------------------------------------------------------------
+//
+void CHttpEventHandler::DumpRespHeadersL(RHTTPTransaction& aTrans)
+{
+    RHTTPResponse resp = aTrans.Response();
+    RStringPool strP = aTrans.Session().StringPool();
+    RHTTPHeaders hdr = resp.GetHeaderCollection();
+    THTTPHdrFieldIter it = hdr.Fields();
+    
+    TBuf<KMaxHeaderNameLen>  fieldName16;
+    TBuf<KMaxHeaderValueLen> fieldVal16;
+    
+    while (it.AtEnd() == EFalse)
+    {
+        RStringTokenF fieldName = it();
+        RStringF fieldNameStr = strP.StringF(fieldName);
+        THTTPHdrVal fieldVal;
+        
+        //TPtrC8 rawField;
+        //if (hdr.GetRawField(fieldNameStr,rawField) == KErrNone)
+        
+        if (hdr.GetField(fieldNameStr,0,fieldVal) == KErrNone)
+        {
+            const TDesC8& fieldNameDesC = fieldNameStr.DesC();
+            fieldName16.Copy(fieldNameDesC.Left(KMaxHeaderNameLen));
+            switch (fieldVal.Type())
+            {
+            case THTTPHdrVal::KTIntVal:
+                {
+                    TBuf<200> a;
+                    a.Format(_L("%S: %d\n"), &fieldName16, fieldVal.Int());
+                    iConsole.PrintNotify(a);
+                }
+                break;
+            case THTTPHdrVal::KStrFVal:
+                {
+                    RStringF fieldValStr = strP.StringF(fieldVal.StrF());
+                    const TDesC8& fieldValDesC = fieldValStr.DesC();
+                    fieldVal16.Copy(fieldValDesC.Left(KMaxHeaderValueLen));
+                    TBuf<200> a;
+                    a.Format(_L("%S: %S\n"), &fieldName16, &fieldVal16);
+                    iConsole.PrintNotify(a);
+                }
+                break;
+            case THTTPHdrVal::KStrVal:
+                {
+                    RString fieldValStr = strP.String(fieldVal.Str());
+                    const TDesC8& fieldValDesC = fieldValStr.DesC();
+                    fieldVal16.Copy(fieldValDesC.Left(KMaxHeaderValueLen));
+                    TBuf<200> a;
+                    a.Format(_L("%S: %S\n"), &fieldName16, &fieldVal16);
+                    iConsole.PrintNotify(a);
+                }
+                break;
+            case THTTPHdrVal::KDateVal:
+                {
+                    _LIT(KDateString,"%D%M%Y%/0%1%/1%2%/2%3%/3");
+                    TDateTime date = fieldVal.DateTime();
+                    TBuf<40> dateTimeString;
+                    TTime t(date);
+                    t.FormatL(dateTimeString,KDateString);
+                    TBuf<200> a;
+                    a.Format(_L("%S: %S\n"), &fieldName16, &dateTimeString);
+                    iConsole.PrintNotify(a);
+                } 
+                break;
+            default:
+                {
+                    TBuf<200> a;
+                    a.Format(_L("%S: <unrecognised value type>\n"), &fieldName16);
+                    iConsole.PrintNotify(a);
+                }
+                break;
+            }
+            
+            // Display realm for WWW-Authenticate header
+            RStringF wwwAuth = strP.StringF(HTTP::EWWWAuthenticate,RHTTPSession::GetTable());
+            if (fieldNameStr == wwwAuth)
+            {
+                // check the auth scheme is 'basic'
+                RStringF basic = strP.StringF(HTTP::EBasic,RHTTPSession::GetTable());
+                RStringF realm = strP.StringF(HTTP::ERealm,RHTTPSession::GetTable());
+                THTTPHdrVal realmVal;
+                if ((fieldVal.StrF() == basic) && 
+                    (!hdr.GetParam(wwwAuth, realm, realmVal)))
+                {
+                    RStringF realmValStr = strP.StringF(realmVal.StrF());
+                    fieldVal16.Copy(realmValStr.DesC());
+                    TBuf<200> a;
+                    a.Format(_L("Realm is: %S\n"), &fieldVal16);
+                    iConsole.PrintNotify(a);
+                }
+            }
+        }
+        ++it;
+    }
+}
+
+// ----------------------------------------------------------------------------
+// CHttpEventHandler::DumpRespBody(RHTTPTransaction& aTrans)
+// Print body size on console.
+// ----------------------------------------------------------------------------
+//
+void CHttpEventHandler::DumpRespBody(RHTTPTransaction& aTrans)
+{
+    MHTTPDataSupplier* body = aTrans.Response().Body();
+    TPtrC8 dataChunk;
+    TBool isLast = body->GetNextDataPart(dataChunk);
+    
+    TBuf<32> b;
+    b.Format(_L("-body size: %d\n"), dataChunk.Length());
+    iConsole.PrintNotify(b);
+    //DumpIt(dataChunk);
+    if (isLast)
+        iConsole.PrintNotify(_L("Got last data chunk.\n"));
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/ProgressNotifier.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2006 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: CProgressNotifier is used to notify about 
+* the current state of the request
+*
+*/
+
+// INCLUDE FILES
+#include "ProgressNotifier.h"
+#include "ProgressNotifyHandler.h"
+
+
+// ================= MEMBER FUNCTIONS =========================================
+
+// ----------------------------------------------------------------------------
+// CProgressNotifier::NewL(...)
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CProgressNotifier* CProgressNotifier::NewL(RConnection& aConnection,
+                                           MProgressNotifyHandler& aHandler)
+{
+    CProgressNotifier* self = CProgressNotifier::NewLC(aConnection, aHandler);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ----------------------------------------------------------------------------
+// CProgressNotifier::NewLC(...)
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CProgressNotifier* CProgressNotifier::NewLC(RConnection& aConnection,
+                                            MProgressNotifyHandler& aHandler)
+{
+    CProgressNotifier* self = new (ELeave) CProgressNotifier(aConnection, aHandler);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+// ----------------------------------------------------------------------------
+// CProgressNotifier::CProgressNotifier(...)
+// First-phase constructor
+// ----------------------------------------------------------------------------
+//
+CProgressNotifier::CProgressNotifier(RConnection& aConnection,
+                                     MProgressNotifyHandler& aHandler)
+: CActive(EPriorityStandard),
+iConnection(aConnection),
+iHandler(aHandler)
+{
+}
+
+// ----------------------------------------------------------------------------
+// CProgressNotifier::~CProgressNotifier()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CProgressNotifier::~CProgressNotifier()
+{
+    Cancel();
+}
+
+// ----------------------------------------------------------------------------
+// CProgressNotifier::ConstructL()
+// Second-phase constructor
+// ----------------------------------------------------------------------------
+//
+void CProgressNotifier::ConstructL()
+{
+    CActiveScheduler::Add(this);
+}
+
+// ---------------------------------------------------------
+// Start waiting for the progress notifications.
+// ---------------------------------------------------------
+void CProgressNotifier::StartNotify()
+{
+    ASSERT(!IsActive());
+	iConnection.ProgressNotification(iProgressBuf, iStatus);
+	SetActive();
+}
+
+// ---------------------------------------------------------
+// CProgressNotifier::RunL()
+// Called when request has completed.
+// ---------------------------------------------------------
+//
+void CProgressNotifier::RunL()
+{
+    // Active object request complete handler.
+    if(iStatus == KErrNone)
+    {
+        NotifyL();
+    }
+    else
+    {
+        iHandler.ProgressNotifyError(iStatus.Int());
+    }
+}
+
+// ---------------------------------------------------------
+// CProgressNotifier::DoCancel()
+// Cancel ongoing requests.
+// ---------------------------------------------------------
+//
+void CProgressNotifier::DoCancel()
+{
+    iConnection.CancelProgressNotification();
+}
+
+// ---------------------------------------------------------
+// CProgressNotifier::Notify()
+// Get the current stage and issue a new request, unless 
+// the interface has gone down. Inform the progress
+// notification handler about a new notification.
+// ---------------------------------------------------------
+//
+void CProgressNotifier::NotifyL()
+{
+    // Store the values into temporary variables, otherwise we might send incorrect
+    // values to iHandler, because iProgressBuf might get immediately overwritten
+    // if progress notifications are already available.
+    //
+    // Note! This object is also sometimes deleted in iHandler.ProgressNotifyReceived
+    // call (not nice, but no other workaround possible), so order of following calls
+    // is crucial.
+    
+    TInt stage = iProgressBuf().iStage;
+    TInt error = iProgressBuf().iError;
+    
+    // Issue new notification
+    iConnection.ProgressNotification(iProgressBuf, iStatus);
+    SetActive();
+
+    // Inform handler about notification
+    iHandler.ProgressNotifyReceivedL(stage, error);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/QosObserver.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2002-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:  Implementation of class CQosObserver.
+*
+*/
+
+// INCLUDE FILES
+#include "QosObserver.h"
+#include "UINotify.h"
+
+
+// ================= MEMBER FUNCTIONS =========================================
+
+
+// ----------------------------------------------------------------------------
+// CQosObserver::CQosObserver(...)
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CQosObserver::CQosObserver(MUINotify& aConsole)
+: iConsole(aConsole)
+{
+}
+
+// ----------------------------------------------------------------------------
+// CQosObserver::~CQosObserver()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CQosObserver::~CQosObserver()
+{
+}
+
+
+// ---------------------------------------------------------
+// CQosObserver::Event(const CQoSEventBase& aQosEvent)
+// QoS event receiver.
+// ---------------------------------------------------------
+//
+void CQosObserver::Event(const CQoSEventBase& aQosEvent)
+{
+    iConsole.PrintNotify(_L("KK"));
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/SendTimer.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2006 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: CSendTimer is used for sending data at specified intervals
+*
+*/
+
+#include "SendTimer.h"
+#include "SocketsEngine.h"
+
+// ---------------------------------------------------------
+// CSendTimer::NewL(const TInt aPriority, CSocketsEngine* aEngine)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSendTimer* CSendTimer::NewL(const TInt aPriority, CSocketsEngine* aEngine)
+{
+    CSendTimer* self = CSendTimer::NewLC(aPriority, aEngine);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+
+// ---------------------------------------------------------
+// CSendTimer::NewLC(const TInt aPriority, CConnTestView* aView)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSendTimer* CSendTimer::NewLC(const TInt aPriority, CSocketsEngine* aEngine)
+{
+    CSendTimer* self = new (ELeave) CSendTimer(aPriority, aEngine);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+
+// ---------------------------------------------------------
+// CSendTimer::CSendTimer(const TInt aPriority, CConnTestView* aView)
+// Constructor
+// ---------------------------------------------------------
+//
+CSendTimer::CSendTimer(const TInt aPriority, CSocketsEngine* aEngine)
+: CTimer(aPriority), iEngine(aEngine)
+{
+}
+
+
+// ---------------------------------------------------------
+// CSendTimer::~CSendTimer()
+// Destructor
+// ---------------------------------------------------------
+//
+CSendTimer::~CSendTimer()
+{
+    Cancel();
+}
+
+
+// ---------------------------------------------------------
+// CSendTimer::ConstructL()
+// EPOC two-phased constructor
+// ---------------------------------------------------------
+//
+void CSendTimer::ConstructL()
+{
+    CTimer::ConstructL();
+    CActiveScheduler::Add(this);
+}
+
+// ---------------------------------------------------------
+// CSendTimer::RunL()
+// Timer event has been generated and timer request completed.
+// ---------------------------------------------------------
+//
+void CSendTimer::RunL()
+{
+    // Timer request has completed, so notify the timer's owner
+    iEngine->DoSendDataL();    
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/SocketsEngine.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,2076 @@
+/*
+ * Copyright (c) 2006-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: CSocketsEngine implements an engine for connection
+ * component checking: Interface opening/closing, connecting,
+ * sending/receiving data, etc.
+ * CSocketsEngine is an active object
+ *
+ */
+
+// INCLUDE FILES
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_sock_partner.h>
+#include <es_enum_internal.h>
+#endif
+#include <eikgted.h>
+#include <in_sock.h>
+#include <e32svr.h>
+#include <es_enum.h>
+#include <commdb.h>
+#include <in_iface.h>
+#include <apgcli.h>
+#include <apaid.h>
+
+#include "SocketsEngine.h"
+#include "TimeOutTimer.h"
+#include "SocketsRead.h"
+#include "SocketsWrite.h"
+#include "ProgressNotifier.h"
+#include "ConnTest.pan"
+#include "uinotify.h"
+#include "HttpHandler.h"
+#include "SettingData.h"
+#include "CustomPrefsData.h"
+#include "Utils.h"
+#include "SendTimer.h"
+#include "alractiveobject.h"
+
+#include <hal.h>
+#include <hal_data.h>
+
+#include <cmmanagerext.h>
+#include <cmdestinationext.h>
+#include <cmapplicationsettingsui.h>
+
+// CONSTANTS
+const TInt KTimeOut = 120000000; // 2 minutes time-out
+
+_LIT(KDefaultServerName, "127.0.0.1");
+const TInt KDefaultPortNumber = 25;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CSocketsEngine::NewL(MUINotify& aConsole)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSocketsEngine* CSocketsEngine::NewL( MUINotify& aConsole )
+    {
+    CSocketsEngine* self = CSocketsEngine::NewLC( aConsole );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::NewLC(MUINotify& aConsole)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSocketsEngine* CSocketsEngine::NewLC( MUINotify& aConsole )
+    {
+    CSocketsEngine* self = new (ELeave) CSocketsEngine( aConsole );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::CSocketsEngine(MUINotify& aConsole)
+// EPOC constructor
+// ---------------------------------------------------------
+//
+CSocketsEngine::CSocketsEngine( MUINotify& aConsole ) :
+    CActive( EPriorityStandard ), iConsole( aConsole ), iPort(
+            KDefaultPortNumber ), iServerName( KDefaultServerName )
+    {
+    iStartTime = 0;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::~CSocketsEngine()
+// Destructor
+// ---------------------------------------------------------
+//
+CSocketsEngine::~CSocketsEngine()
+    {
+    Cancel();
+    if (iProgressNotifier)
+        {
+        iProgressNotifier->Cancel();
+        }
+
+    delete iSocketsRead;
+    iSocketsRead = NULL;
+
+    delete iSocketsWrite;
+    iSocketsWrite = NULL;
+
+    delete iProgressNotifier;
+    iProgressNotifier = NULL;
+
+    delete iTimer;
+    iTimer = NULL;
+
+    delete iSendTimer;
+
+    delete iHttpClient;
+    iHttpClient = NULL;
+
+    if (iData)
+        {
+        delete iData;
+        iData = NULL;
+        }
+    //delete pointer to mobility API
+    if (iMobility)
+        {
+        delete iMobility;
+        iMobility = NULL;
+        }
+
+    delete iExtPrefs;
+    delete iPrefsList;
+
+    // Note! Closing order matters. Panic occurs if the
+    // closing is made in different order. 
+
+    iConnection.Close();
+    iSocket.Close();
+    iSocketServ.Close();
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ConstructL()
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+void CSocketsEngine::ConstructL()
+    {
+    ChangeStatus( EInterfaceDown );
+
+    iData = HBufC8::NewL( KMaxSendBuffer);
+    // Start a timer
+    iTimer = CTimeOutTimer::NewL( EPriorityHigh, *this );
+
+    CActiveScheduler::Add( this );
+
+    // Open channel to Socket Server
+    User::LeaveIfError( iSocketServ.Connect() );
+
+    // Open connection
+    User::LeaveIfError( iConnection.Open( iSocketServ ) );
+
+    // Create socket read and write active objects
+    iSocketsRead = CSocketsRead::NewL( iConsole, iSocket, *this );
+    iSocketsWrite = CSocketsWrite::NewL( iConsole, iSocket, *this );
+
+    // Create interface notification active object
+    iProgressNotifier = CProgressNotifier::NewL( iConnection, *this );
+    iProgressNotifier->StartNotify();
+
+    //
+    // HTTP framework initialization
+    //
+    iHttpClient = CHttpClient::NewL( iConsole );
+    iHttpClient->SetHttpConnectionInfoL( ETrue, iConnection, iSocketServ );
+
+    // Timer for sending multiple packets
+    if (!iSendTimer)
+        {
+        iSendTimer = CSendTimer::NewL( EPriorityHigh, this );
+        }
+
+    iUseTTime = EFalse;
+    TInt freq;
+    TInt err = HAL::Get( HAL::EFastCounterFrequency, freq );
+    if (err != KErrNone || freq == 0)
+        {
+        iUseTTime = ETrue;
+        }
+
+    //set mobility API flag to false
+    iIsRegisteredToMobAPI = EFalse;
+    SetSocketEngineConnType( ETypeUnknown );
+
+    iExtPrefs = new (ELeave) TExtendedConnPref;
+    iPrefsList = TConnPrefList::NewL();
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::GetSocketEngineState()
+// Return the current state of the socket engine.
+// ---------------------------------------------------------
+//
+CSocketsEngine::TSocketsEngineState CSocketsEngine::GetSocketEngineState()
+    {
+    return iEngineStatus;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::GetSocketEngineRoamingState()
+// ---------------------------------------------------------
+// 
+CSocketsEngine::TRoamingUIState CSocketsEngine::GetSocketEngineRoamingState()
+    {
+    return iRoamingState;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::GetMobilityAPI()
+// ---------------------------------------------------------
+// 
+CALRActiveObject* CSocketsEngine::GetMobilityAPI()
+    {
+    return iMobility;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::GetSocketEngineConnType()
+// Return the current connection type of the socket engine.
+// ---------------------------------------------------------
+//
+CSocketsEngine::TSocketsEngineStartType CSocketsEngine::GetSocketEngineConnType()
+    {
+    return iSockEngineStartType;
+    }
+// ---------------------------------------------------------
+// CSocketsEngine::SetSocketEngineConnType()
+// Set the current conn type of the socket engine.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::SetSocketEngineConnType( const CSocketsEngine::TSocketsEngineStartType aConnStartType )
+    {
+    iSockEngineStartType = aConnStartType;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::StartConnWithSnapL()
+// Start the connection with snap
+// ---------------------------------------------------------
+//
+void CSocketsEngine::StartConnWithSnapL( TBool aConnect )
+    {
+    if (iEngineStatus == EConnected || iEngineStatus == EInterfaceUp)
+        {
+        return;
+        }
+
+    //start the connection  dialog
+    CCmApplicationSettingsUi* settings = CCmApplicationSettingsUi::NewL();
+    CleanupStack::PushL( settings );
+    TCmSettingSelection selection;
+    settings->RunApplicationSettingsL( selection );
+    CleanupStack::PopAndDestroy( settings );
+
+    switch (selection.iResult)
+        {
+        case CMManager::EConnectionMethod:
+            {
+            // start connection with Iap Id
+            iPrefs.SetIapId( selection.iId );
+            iPrefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+
+            StartTickCount();
+            iConnection.Start( iPrefs, iStatus );
+            break;
+            }
+        case CMManager::EDestination:
+            {
+            TConnSnapPref pref;
+            
+            pref.SetSnap( selection.iId );
+
+            StartTickCount();
+            //start connection with snap Id
+            iConnection.Start( pref, iStatus );
+            //Set connection type as Snap	
+            SetSocketEngineConnType( ESnap );
+            
+            break;
+            }
+        case CMManager::EAlwaysAsk:
+            {
+            // For testing start without preferences
+            StartTickCount();
+            iConnection.Start( iStatus );
+            ChangeStatus( EStartingInterface );
+            iConnectAfterStartup = ETrue;
+            SetActive();
+            return;
+            }
+        default:
+            {
+            RDebug::Print( _L("ConnTest: Invalid selection"));
+            return;
+            }
+        }
+
+    ChangeStatus( EStartingInterface );
+    //specify if a connection is needed after interface startup(
+    iConnectAfterStartup = aConnect;
+    SetActive();
+    
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::StartInterfaceL(TBool aConnect)
+// Start interface
+// ---------------------------------------------------------
+//
+void CSocketsEngine::StartInterfaceL( TSocketsEngineStartType aStartType,
+        TBool aConnect )
+    {
+    RDebug::Print( _L("ConnTest: StartInterfaceL( Start type = %d )"), aStartType );
+    if (iEngineStatus == EConnected || iEngineStatus == EInterfaceUp)
+        {
+        RDebug::Print( _L("ConnTest: Selection cancelled!"));
+        return;
+        }
+
+    SetSocketEngineConnType( aStartType );
+
+    if (aStartType == EAskIap)
+        {
+        // Get IAP id
+        TUint32 iapId;
+        TInt popupOk = Utils::AskIapIdL( iapId );
+        
+        if (!popupOk)
+            {
+            RDebug::Print( _L("ConnTest: Selection cancelled!"));
+            return;
+            }
+        RDebug::Print( _L("ConnTest: Selected IAP id=%d"), iapId );
+
+        // Create overrides
+        iPrefs.SetIapId( iapId );
+        iPrefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+        }
+    else if (aStartType == ENetworkId)
+        {
+        // Get network id
+        TUint32 nwkId;
+        TInt popupOk = Utils::AskNetworkIdL( nwkId );
+        
+        if (!popupOk)
+            {
+            RDebug::Print( _L("ConnTest: Selection cancelled!"));
+            return;
+            }
+        RDebug::Print( _L("ConnTest: Selected Network id=%d"), nwkId );
+
+        // Create overrides
+        iPrefs.SetNetId( nwkId );
+        iPrefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+        }
+
+    // Start the timer after the dialogs
+    StartTickCount();
+
+    // ...And now there are few different kinds of iConnection.Start() functions to call...
+    if (aStartType == EExtPrefs)
+        {
+        iPrefsList->AppendL( iExtPrefs );
+        iConnection.Start( *iPrefsList, iStatus );
+        iPrefsList->Remove( 0 );
+        }
+    else if (aStartType == EExtPrefsInternet)
+        {
+        TExtendedConnPref* tmpExtPrefs = new (ELeave) TExtendedConnPref;
+        tmpExtPrefs->SetSnapPurpose( CMManager::ESnapPurposeInternet );
+        iPrefsList->AppendL( tmpExtPrefs );
+        iConnection.Start( *iPrefsList, iStatus );
+        iPrefsList->Remove( 0 );
+        delete tmpExtPrefs;
+        }
+    else if (aStartType == ENoPrefs)
+        {
+        iConnection.Start( iStatus );
+        }
+    else // (aStartType == EAskIap || aStartType == ENetworkId) - Other values aren't used.
+        {
+        iConnection.Start( iPrefs, iStatus );
+        }
+
+    ChangeStatus( EStartingInterface );
+    iConnectAfterStartup = aConnect;
+    SetActive();
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::RegisterToMobilityAPI(TBool aConnect)
+// Register to mobility API
+// ---------------------------------------------------------
+//
+void CSocketsEngine::RegisterToMobilityAPIL()
+    {
+    if (iEngineStatus == EConnected || iEngineStatus == EInterfaceUp)
+        {
+        if (!iIsRegisteredToMobAPI)
+            {
+            iConsole.PrintNotify( _L("RegisterToMobilityAPI\n"));
+            //create the listener active object
+            iMobility = CALRActiveObject::NewL( iConsole,
+                    (MMobilityProtocolResp*)this );
+            iMobility->OpenL( iConnection );
+            iIsRegisteredToMobAPI = ETrue;
+            }
+        }
+    else
+        {
+        iConsole.PrintNotify( _L("Could not register\n"));
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::UnRegisterToMobilityAPI(TBool aConnect)
+// UnRegister from mobility API
+// ---------------------------------------------------------
+//
+void CSocketsEngine::UnRegisterFromMobilityAPI()
+    {
+    if (iIsRegisteredToMobAPI && iMobility) //&& 
+    //(iEngineStatus == EConnected || iEngineStatus == EInterfaceUp || iEngineStatus == EConnecting))
+        {
+        delete iMobility;
+        iMobility = NULL;
+        iConsole.PrintNotify( _L("Unregister MobilityAPI\n"));
+        }
+    iIsRegisteredToMobAPI = EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::Error()
+// ---------------------------------------------------------
+// 
+void CSocketsEngine::Error( TInt aError )
+    {
+    TBuf8<64> text;
+    text.AppendFormat( _L8("MobilityError: %d\n"), aError );
+    iConsole.PrintNotify( text );
+    UnRegisterFromMobilityAPI();
+    iRoaming = ERoamingOff;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::PreferredCarrierAvailable()
+// ---------------------------------------------------------
+// 
+void CSocketsEngine::PreferredCarrierAvailable( TAccessPointInfo aOldAP,
+        TAccessPointInfo aNewAP,
+        TBool aIsUpgrade,
+        TBool aIsSeamless )
+    {
+    // silence warnings
+    aOldAP = aOldAP;
+    aIsUpgrade = aIsUpgrade;
+    aIsSeamless = aIsSeamless;
+
+    TBuf8<64> text;
+    
+    if (iRoaming == ERoamingAutomatic)
+        {
+        text.AppendFormat( _L8("Migrating to %i\n"), aNewAP.AccessPoint() );
+        iMobility->MigrateToPreferredCarrier();
+        iRoamingState = EIdle;
+        }
+    else if (iRoaming == ERoamingManual)
+        {
+        text.AppendFormat( _L8("Preferred IAP %i Available\n"), aNewAP.AccessPoint() );
+        iRoamingState = EPendingPreferredCarrier;
+        iConsole.PopupNotify( _L("Migrate or Ignore available"));
+        }
+    else
+        {
+        text.AppendFormat( _L8("Unexpected PreferrredCarrier %i\n"), aNewAP.AccessPoint() );
+        iRoamingState = EIdle;
+        iMobility->IgnorePreferredCarrier();
+        }
+    iConsole.PrintNotify( text );
+    }
+// ---------------------------------------------------------
+// CSocketsEngine::NewCarrierActive()
+// ---------------------------------------------------------
+// 
+void CSocketsEngine::NewCarrierActive( TAccessPointInfo aNewAP,
+        TBool aIsSeamless )
+    {
+    // silence warning
+    aIsSeamless = aIsSeamless;
+
+    TBuf8<64> text;
+    
+    if (iRoaming == ERoamingAutomatic)
+        {
+        iRoamingState = EIdle;
+        iMobility->NewCarrierAccepted();
+        }
+    else if (iRoaming == ERoamingManual)
+        {
+        text.AppendFormat( _L8("IAP %i pending accept\n"), aNewAP.AccessPoint() );
+        iRoamingState = EPendingNewCarrierActive;
+        iConsole.PopupNotify( _L("Accept or Reject available"));
+        }
+    else
+        {
+        iRoamingState = EIdle;
+        text.AppendFormat( _L8("Unexpected NewCarrierActive %i\n"), aNewAP.AccessPoint() );
+        iMobility->NewCarrierRejected();
+        }
+    iConsole.PrintNotify( text );
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::
+// ---------------------------------------------------------
+//
+void CSocketsEngine::Migrate()
+    {
+    if (iRoaming != ERoamingManual)
+        {
+        User::Panic( KPanicSocketsEngine, EConnTestBadRoamingStatus );
+        }
+    iMobility->MigrateToPreferredCarrier();
+    iConsole.PrintNotify( _L("Migration requested"));
+    iRoamingState = EIdle;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::
+// ---------------------------------------------------------
+//
+void CSocketsEngine::Ignore()
+    {
+    if (iRoaming != ERoamingManual)
+        {
+        User::Panic( KPanicSocketsEngine, EConnTestBadRoamingStatus );
+        }
+    iMobility->IgnorePreferredCarrier();
+    iConsole.PrintNotify( _L("Ignored new carrier"));
+    iRoamingState = EIdle;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::
+// ---------------------------------------------------------
+//
+void CSocketsEngine::AcceptCarrier()
+    {
+    if (iRoaming != ERoamingManual)
+        {
+        User::Panic( KPanicSocketsEngine, EConnTestBadRoamingStatus );
+        }
+    iMobility->NewCarrierAccepted();
+    iConsole.PrintNotify( _L("Accepted carrier"));
+    iRoamingState = EIdle;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::
+// ---------------------------------------------------------
+//
+void CSocketsEngine::RejectCarrier()
+    {
+    if (iRoaming != ERoamingManual)
+        {
+        User::Panic( KPanicSocketsEngine, EConnTestBadRoamingStatus );
+        }
+    iMobility->NewCarrierRejected();
+    iConsole.PrintNotify( _L("Rejected carrier"));
+    iRoamingState = EIdle;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::StartCloseInterfaceL()
+// Start interface for testing RConnection::Close
+// ---------------------------------------------------------
+//
+void CSocketsEngine::StartCloseInterfaceL()
+    {
+    if (iEngineStatus == EConnected || iEngineStatus == EInterfaceUp)
+        {
+        // Already started, simply return
+        return;
+        }
+
+    // Get IAP id
+    TUint32 iapId;
+    TInt popupOk = Utils::AskIapIdL( iapId );
+    
+    if (!popupOk)
+        {
+        // Selection cancelled
+        return;
+        }
+    RDebug::Print( _L("ConnTest: Selected IAP id=%d"), iapId );
+
+    iCloseConnection = new (ELeave) RConnection;
+
+    User::LeaveIfError( iCloseConnection->Open( iSocketServ ) );
+
+    // Create overrides
+    iPrefs.SetIapId( iapId );
+    iPrefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+
+    ChangeStatus( EStartingInterface );
+
+    iCloseConnection->Start( iPrefs, iStatus );
+    SetActive();
+
+    iTempProgressNotifier = CProgressNotifier::NewL( *iCloseConnection, *this );
+    iTempProgressNotifier->StartNotify();
+    
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::StopInterfaceL()
+// Shutdown interface
+// ---------------------------------------------------------
+//
+void CSocketsEngine::StopInterfaceL()
+    {
+    // Note! Socket is not closed here, because in connected
+    // state only Disconnect menu item is available. Therefore
+    // interface cannot be stopped when connection is open.
+    //
+    // iProgressNotifier->Cancel() is called in ProgressNotifyReceived
+    // method after KLinkLayerClosed has been received.
+    //
+
+    //unregister from mobility API if registered
+    UnRegisterFromMobilityAPI();
+    SetSocketEngineConnType( ETypeUnknown );
+    
+    if (iEngineStatus == EConnected || iEngineStatus == EInterfaceUp)
+        {
+        iConnection.Stop();
+        ChangeStatus( EInterfaceDown );
+        iHttpClient->SetHttpConnectionInfoL( ETrue, iConnection, iSocketServ );
+        
+        if (iCloseConnection)
+            {
+            // So if we are here, interface was started for testing RConnection::Close,
+            // and the corresponding RConnection instance needs to be deleted.
+            iCloseConnection->Close();
+            delete iCloseConnection;
+            iCloseConnection = NULL;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::CloseInterface()
+// Close interface
+// ---------------------------------------------------------
+//
+void CSocketsEngine::CloseInterface()
+    {
+    if (iCloseConnection)
+        {
+        iCloseConnection->Close();
+        delete iCloseConnection;
+        iCloseConnection = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ConnectL()
+// Check whether the address is valid IP address. If it's not
+// calls DNS to solve the name.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::ConnectL()
+    {
+    // Just in case (does nothing if interface has already been started)
+    StartInterfaceL( EAskIap, ETrue );
+    
+    // Initiate connection process
+    if ((iEngineStatus == EInterfaceUp) || (iEngineStatus == ETimedOut))
+        {
+        TInetAddr addr;
+        if (addr.Input( iServerName ) == KErrNone)
+            {
+            // server name is already a valid ip address
+            ConnectL( addr );
+            }
+        else // need to look up name using dns
+            {
+            // Initiate DNS
+            User::LeaveIfError( iResolver.Open( iSocketServ, KAfInet,
+                    KProtocolInetUdp, iConnection ) );
+            // DNS request for name resolution
+            StartTickCount();
+            iResolver.GetByName( iServerName, iNameEntry, iStatus );
+
+            ChangeStatus( ELookingUp );
+            // Request time out
+            iTimer->After( KTimeOut );
+            SetActive();
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ConnectL()
+// Connect to socket
+// ---------------------------------------------------------
+//                          
+void CSocketsEngine::ConnectL( const TInetAddr& aAddr ) // <a name="ConnectL32">
+    {
+    
+    // Initiate attempt to connect to a socket by IP address	
+    if ((iEngineStatus == EInterfaceUp) || (iEngineStatus == ETimedOut))
+        {
+        // Open a TCP socket
+        iSocket.Close(); // Just in case
+        User::LeaveIfError( iSocket.Open( iSocketServ, KAfInet, iSocketType,
+                iProtocol, iConnection ) );
+
+        // Set up address information
+        iAddress = aAddr;
+        iAddress.SetPort( iPort );
+
+        // Initiate socket connection
+        StartTickCount();
+        iSocket.Connect( iAddress, iStatus );
+        ChangeStatus( EConnecting );
+        SetActive();
+        
+        // Start a timeout
+        iTimer->After( KTimeOut );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::Disconnect()
+// Shutdown socket
+// ---------------------------------------------------------
+//
+void CSocketsEngine::Disconnect()
+    {
+    if (iEngineStatus == EListening && iProtocol == KProtocolInetTcp)
+        {
+        iListeningSocket.CancelAccept();
+        iListeningSocket.Close();
+        // Remember to close the socket on reader RunL()
+        }
+    if (iEngineStatus == EConnected || iEngineStatus == EListening)
+        {
+        iSocketsRead->Cancel();
+        iSocketsWrite->Cancel();
+
+        // have to do this.
+        iTimer->Cancel();
+
+        // Use Close() instead of Shutdown(). This way we
+        // can handle the situation, where server initiates
+        // the closing process, and sends RST signal instead
+        // of FIN. If server sends RST and Shutdown() is used,
+        // engine stays in EDisconnecting state forever.
+        iSocket.Close();
+        
+        ChangeStatus( EInterfaceUp );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ListenL()
+// Opens listening socket
+// ---------------------------------------------------------
+//
+void CSocketsEngine::ListenL()
+    {
+    // Initiate attempt to connect to a socket by IP address	
+    if ((iEngineStatus == EInterfaceUp) || (iEngineStatus == ETimedOut))
+        {
+        // Open a TCP socket
+        iSocket.Close(); // Just in case
+        iListeningSocket.Close();
+
+        // Set up address information
+        iAddress.SetFamily( 0 );
+        iAddress.SetPort( iPort );
+        switch (iProtocol)
+            {
+            case KProtocolInetTcp:
+                User::LeaveIfError( iSocket.Open( iSocketServ ) );
+                User::LeaveIfError( iListeningSocket.Open( iSocketServ,
+                        KAfInet, iSocketType, iProtocol, iConnection ) );
+                // Bind a port
+                iListeningSocket.Bind( iAddress );
+                // Listens a socket
+                iListeningSocket.Listen( 1 ); // Only one connection allowed
+                // Accepts one connection
+                iListeningSocket.Accept( iSocket, iStatus );
+                ChangeStatus( EListening );
+                SetActive();
+                break;
+            case KProtocolInetUdp:
+                User::LeaveIfError( iSocket.Open( iSocketServ, KAfInet,
+                        iSocketType, iProtocol, iConnection ) );
+                iSocket.Bind( iAddress );
+                ChangeStatus( EListening );
+                iStatus = KErrNone;
+                RunL(); // ugly.
+                break;
+            default:
+                User::Leave( KErrNotSupported );
+                break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::Write()
+// Write data to socket
+// ---------------------------------------------------------
+//
+void CSocketsEngine::WriteL( const TDesC8& aData )
+    {
+    RDebug::Print( _L("ConnTest: Sending data, length = %d"),aData.Length() );
+
+    iSocketsRead->SetPerformance( EFalse );
+    
+    // Write data to socket
+    if (iEngineStatus == EConnected)
+        {
+        iSocketsWrite->IssueWriteL( aData, &iAddress, iProtocol );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::Write()
+// Write data to socket aCount times
+// ---------------------------------------------------------
+//
+void CSocketsEngine::WriteFloodL( const TDesC8& aData, TInt aCount )
+    {
+    // Write data to socket
+    if (iEngineStatus == EConnected)
+        {
+        iThroughputStartTime.UniversalTime();
+        iSocketsWrite->IssueWriteL( aData, &iAddress, iProtocol, aCount );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::SendHttpRequestOverSocketL(TBool aHasBody)
+// Write HTTP request to socket
+// ---------------------------------------------------------
+//
+void CSocketsEngine::SendHttpRequestOverSocketL( TBool aHasBody,
+        TBool aDoPerformance )
+    {
+    iSocketsRead->SetPerformance( aDoPerformance );
+
+    TBuf8<256> req;
+    
+    if (aHasBody)
+        {
+        // Send HTTP POST
+        req.Copy( _L8("POST "));
+
+        // Add '/' if it is not included in the given page name
+        if (!((TChar)iSettingData->iHttpPage[0] == '/'))
+            {
+            req.Append( _L8("/"));
+            }
+
+        req.Append( iSettingData->iHttpPage );
+        req.Append( _L8(" HTTP/1.1\r\n"));
+        req.Append( _L8("Host: "));
+        req.Append( iSettingData->iServerName );
+        req.Append( _L8(":"));
+        req.AppendNum( iSettingData->iPort );
+        req.AppendFormat( _L8("\r\nContent-Length: %d"), iSettingData->iPacketSize
+                * iSettingData->iPackets );
+        req.Append( _L8("\r\n\r\n"));
+        
+        iSocketsWrite->IssueWriteL( req, &iAddress, iProtocol,
+                iSettingData->iPacketSize, iSettingData->iPackets );
+        }
+    else
+        {
+        // Send HTTP GET
+        req.Copy( _L8("GET "));
+
+        // Add '/' if it is not included in the given page name
+        if (!((TChar)iSettingData->iHttpPage[0] == '/'))
+            {
+            req.Append( _L8("/"));
+            }
+
+        req.Append( iSettingData->iHttpPage );
+        req.Append( _L8(" HTTP/1.1\r\n"));
+        req.Append( _L8("Host: "));
+        req.Append( iSettingData->iServerName );
+        req.Append( _L8(":"));
+        req.AppendNum( iSettingData->iPort );
+        req.Append( _L8("\r\n\r\n"));
+
+        StartTickCount();
+        iSocketsWrite->IssueWriteL( req, &iAddress, iProtocol );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::Read()
+// Read data from socket
+// ---------------------------------------------------------
+//
+void CSocketsEngine::Read()
+    {
+    // Initiate read of data from socket
+    if ((iEngineStatus == EConnected) && (!iSocketsRead->IsActive()))
+        {
+        iSocketsRead->Start( &iAddress, iProtocol );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::RunL()
+// 
+// ---------------------------------------------------------
+//
+void CSocketsEngine::RunL()
+    {
+    // Active object request complete handler.
+    // iEngineStatus flags what request was made, so its
+    // completion can be handled appropriately
+    iTimer->Cancel(); // Cancel TimeOut timer before completion
+    TBuf<64> text( _L(""));
+    switch (iEngineStatus)
+        {
+        case EInterfaceDown:
+            // Just in case, if status is changed in ProgressNotifyReceived
+            // method before this method is called
+            break;
+        case EStartingInterface:
+            text.Format( _L("RConnection::Start()"));
+            StopTickCount( text );
+            // Interface startup request
+            if (iStatus == KErrNone)
+                {
+                // Interface started successfully
+                ChangeStatus( EInterfaceUp );
+
+                if (iCloseConnection)
+                    {
+                    iHttpClient->SetHttpConnectionInfoL( EFalse,
+                            *iCloseConnection, iSocketServ );
+                    }
+                else
+                    {
+                    iHttpClient->SetHttpConnectionInfoL( EFalse, iConnection,
+                            iSocketServ );
+                    }
+
+                if ( ( iSockEngineStartType == ESnap ||
+                       iSockEngineStartType == EExtPrefs ||
+                       iSockEngineStartType == EExtPrefsInternet ) &&
+                     ( iRoaming == ERoamingAutomatic || iRoaming == ERoamingManual ) )
+                    {
+                    RegisterToMobilityAPIL();
+                    }
+                
+                if (iConnectAfterStartup)
+                    {
+                    ConnectL();
+                    }
+                }
+            else
+                {
+                iConsole.ErrorNotify( _L("<CSocketsEngine> Startup failed"), iStatus.Int() );
+                ChangeStatus( EInterfaceDown );
+                SetSocketEngineConnType( ETypeUnknown );
+                }
+            break;
+            
+        case EConnecting:
+            // IP connection request
+            text.Format( _L("RSocket::Connect()"));
+            StopTickCount( text );
+            if (iStatus == KErrNone)
+            // Connection completed successfully
+                {
+                ChangeStatus( EConnected );
+                Read(); //Start CSocketsRead Active object
+                }
+            else
+                {
+                iConsole.ErrorNotify( _L("<CSocketsEngine> Conn. failed"), iStatus.Int() );
+                ChangeStatus( EInterfaceUp );
+                }
+            break;
+            
+        case ELookingUp:
+            text.Format( _L("RHostResolver::GetByName()"));
+            StopTickCount( text );
+            iResolver.Close();
+            if (iStatus == KErrNone)
+                {
+                // DNS look up successful
+                iNameRecord = iNameEntry();
+                // Extract domain name and IP address from name record
+                PrintTextToConsole( _L("\r\nDomain name = "));
+                PrintTextToConsole( iNameRecord.iName );
+                TBuf<64> ipAddr;
+                TInetAddr::Cast( iNameRecord.iAddr ).Output( ipAddr );
+                iConsole.PrintNotify( _L("\r\nIP address = "));
+                PrintTextToConsole( ipAddr );
+                PrintTextToConsole( _L("\r\n"));
+                // And connect to the IP address
+                ChangeStatus( EInterfaceUp );
+                ConnectL( TInetAddr::Cast( iNameRecord.iAddr ) );
+                }
+            else
+                {
+                // DNS lookup failed
+                iConsole.ErrorNotify( _L("<CSocketsEngine> DNS lookup failed"), iStatus.Int() );
+                ChangeStatus( EInterfaceUp );
+                }
+            break;
+        case EListening:
+            // Listening socket accept returned
+            if (iStatus == KErrNone && !iSocketsRead->IsActive())
+            // Connection established
+                {
+                //ChangeStatus(EConnected); Might as well be in listening state.
+                // This how we can keep accepting several connections
+                // Initiate read of data from socket
+                iSocketsRead->StartRAWRead( &iAddress, iProtocol );
+                }
+            else
+                {
+                iConsole.ErrorNotify( _L("<CSocketsEngine> Accept. failed"), iStatus.Int() );
+                iListeningSocket.Close();
+                iSocket.Close();
+                ChangeStatus( EInterfaceUp );
+                }
+            
+            break;
+        case EDisconnecting:
+            if (iStatus == KErrNone)
+                {
+                iSocket.Close();
+                ChangeStatus( EInterfaceUp );
+                }
+            break;
+            
+        default:
+            // Ignore the state check here, because it might happen that state
+            // has already been altered in ProgressNotifyReceived method.
+            break;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::DoCancel()
+// Cancel ongoing operations
+// ---------------------------------------------------------
+//
+void CSocketsEngine::DoCancel()
+    {
+    iTimer->Cancel();
+    
+    // Cancel ongoing operation
+    switch (iEngineStatus)
+        {
+        case EStartingInterface:
+
+            if (iCloseConnection)
+                {
+                iCloseConnection->Close();
+                delete iCloseConnection;
+                iCloseConnection = NULL;
+                }
+            else
+                {
+                iConnection.Stop();
+                }
+            
+            UnRegisterFromMobilityAPI();
+            SetSocketEngineConnType( ETypeUnknown );
+            ChangeStatus( EInterfaceDown );
+            
+            break;
+        case EConnecting:
+            iSocket.CancelConnect();
+            iSocket.Close();
+            ChangeStatus( EInterfaceUp );
+            break;
+        case ELookingUp:
+            // Cancel look up attempt
+            iResolver.Cancel();
+            iResolver.Close();
+            ChangeStatus( EInterfaceUp );
+            break;
+        case EDisconnecting:
+            ChangeStatus( EInterfaceUp );
+            iSocket.Close();
+            break;
+        case EListening:
+            ChangeStatus( EInterfaceUp );
+            iListeningSocket.CancelAccept();
+            iListeningSocket.Close();
+            iSocket.Close();
+            break;
+        default:
+            User::Panic( KPanicSocketsEngine, EConnTestBadStatus );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ChangeStatus(TSocketsEngineState aNewStatus)
+// Set new status for socket engine and update the status
+// line in console window.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::ChangeStatus( TSocketsEngineState aNewStatus )
+    {
+    // Update the status (and the status display)
+    switch (aNewStatus)
+        {
+        case EInterfaceDown:
+            iConsole.SetStatus( _L("Interface stopped"));
+            break;
+        case EStartingInterface:
+            iConsole.SetStatus( _L("Starting interface..."));
+            break;
+        case EInterfaceUp:
+            iConsole.SetStatus( _L("Interface up"));
+            break;
+        case EConnecting:
+            iConsole.SetStatus( _L("Connecting..."));
+            break;
+        case EConnected:
+            iConsole.SetStatus( _L("Connected"));
+            break;
+        case EListening:
+            iConsole.SetStatus( _L("Listening"));
+            break;
+        case ETimedOut:
+            iConsole.SetStatus( _L("Timed out"));
+            break;
+        case ELookingUp:
+            iConsole.SetStatus( _L("Looking up..."));
+            break;
+        case ELookUpFailed:
+            iConsole.SetStatus( _L("Look up failed"));
+            break;
+        case EConnectFailed:
+            iConsole.SetStatus( _L("Failed"));
+            break;
+        case EDisconnecting:
+            iConsole.SetStatus( _L("Disconnecting..."));
+            break;
+        default:
+            User::Panic( KPanicSocketsEngine, EConnTestBadStatus );
+            break;
+        }
+    iEngineStatus = aNewStatus;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::PrintTextToConsole(const TDesC& aDes)
+// Helper function for printing notifications, text
+// formatting added.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::PrintTextToConsole( const TDesC& aDes )
+    {
+    // Print some text on the console
+    iConsole.PrintNotify( aDes ); // Try if this works on real hw
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::SetConnectionData(const CSettingData* aData)
+// Set connection information.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::SetConnectionData( const CSettingData* aData )
+    {
+    iServerName.Copy( aData->iServerName );
+    iPort = aData->iPort;
+
+    switch (aData->iProtocol)
+        {
+        case 0:
+            iProtocol = KProtocolInetTcp;
+            iSocketType = KSockStream;
+            break;
+        case 1:
+            iProtocol = KProtocolInetUdp;
+            iSocketType = KSockDatagram;
+            break;
+        default:
+            iProtocol = KProtocolInetTcp;
+            iSocketType = KSockStream;
+            break;
+        }
+
+    iRoaming = (TRoamingSetting)aData->iRoaming;
+
+    iHttpPage = aData->iHttpPage;
+    
+    iSettingData = (CSettingData*)aData;
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::SetCustomPrefs(const CCustomPrefsData* aData)
+// Set custom preferences information.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::SetCustomPrefsData( const CCustomPrefsData* aData )
+    {
+    iCustomPrefsData = (CCustomPrefsData*)aData;
+    iExtPrefs->SetSnapPurpose( (CMManager::TSnapPurpose)aData->iSnapPurpose );
+    iExtPrefs->SetSnapId( aData->iSnapId );
+    iExtPrefs->SetIapId( aData->iIapId );
+    iExtPrefs->SetBearerSet( aData->iBearerSet );
+    iExtPrefs->SetNoteBehaviour( aData->iNoteBehaviour );
+    iExtPrefs->SetDisconnectDialog( aData->iDisconnectDialog );
+    iExtPrefs->SetConnSelectionDialog( aData->iConnSelectionDialog );
+    iExtPrefs->SetForcedRoaming( aData->iForcedRoaming );
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ConnectionInfo()
+// Display information about current connection and sockets
+// ---------------------------------------------------------
+//
+void CSocketsEngine::ConnectionInfoL()
+    {
+    TInt result;
+    TBuf<40> val;
+    TBuf<40> network;
+    TBuf<20> query;
+    TName name;
+    TUint connCount;
+    TUint i, j;
+    TConnectionEnumArg args;
+    TUint32 networkId;
+    RApaLsSession appSess;
+    TApaAppInfo appInfo;
+    
+    User::LeaveIfError( appSess.Connect() );
+    CleanupClosePushL( appSess );
+
+    HBufC* buf = HBufC::NewLC( 2048 );
+    TPtr infoBuf = buf->Des();
+    
+    infoBuf.AppendFormat( _L("===============\n"));
+    infoBuf.AppendFormat( _L("Connection info:\n"));
+
+    // Connection name.
+    result = iConnection.Name( name );
+    User::LeaveIfError( result );
+    RDebug::Print( _L("ConnTest: Connection name: %S"), &name );
+
+    // Get connection info
+    result = iConnection.EnumerateConnections( connCount );
+    User::LeaveIfError( result );
+    RDebug::Print( _L("ConnTest: Number of connections: %d"), connCount );
+    infoBuf.AppendFormat( _L("Connections: %d\n"), connCount );
+
+    if (connCount == 0)
+        {
+        infoBuf.AppendFormat( _L("---------------\n"));
+        PrintTextToConsole( infoBuf );
+        CleanupStack::PopAndDestroy( buf ); // buf
+        CleanupStack::PopAndDestroy( &appSess );
+        return;
+        }
+
+    //
+    // Get active connection info
+    //
+    infoBuf.AppendFormat( _L("Active connection:\n"));
+
+    // IAP name
+    query.Format( _L("%s\\%s"), IAP, COMMDB_NAME);
+    result = iConnection.GetDesSetting(query, val);
+    if(result == KErrNone)
+        {
+        RDebug::Print(_L("ConnTest: IAP/Name value: %S"), &val);
+        infoBuf.AppendFormat(_L("-IAP: %S\n"), &val);
+        }
+
+    // Network id
+            query.Format(_L("%s\\%s"), IAP, IAP_NETWORK);
+            result = iConnection.GetIntSetting(query, networkId);
+            if(result == KErrNone)
+                {
+                // Get the corresponding network name for this id,
+            // it is user friendlier.
+            RDebug::Print(_L("ConnTest: NetworkId: %d"), networkId);
+
+            // Network name
+            CCommsDatabase* TheDb;
+
+            TheDb = CCommsDatabase::NewL();
+            CleanupStack::PushL(TheDb);
+
+            CCommsDbTableView* view = TheDb->OpenViewMatchingUintLC( TPtrC(NETWORK),
+                    TPtrC(COMMDB_ID),
+                    networkId );
+            result = view->GotoFirstRecord();
+
+            if(result == KErrNone)
+                {
+                view->ReadTextL(TPtrC(COMMDB_NAME), network);
+                RDebug::Print(_L("ConnTest: Network name: %S"), &network);
+                infoBuf.AppendFormat(_L("-net: %S\n"), &network);
+                }
+            CleanupStack::PopAndDestroy(view);
+            CleanupStack::PopAndDestroy(TheDb);
+            }
+
+        // Note! The following doesn't work, because NETWORK table
+        // is not among those tables where information can be
+        // fetched this way. (Perhaps in future.)
+        /*    
+         // Network name
+         query.Format(_L("%s\\%s"), NETWORK, COMMDB_NAME);
+         result = iConnection.GetDesSetting(query, network);
+         RDebug::Print(_L("IAP/Name value: %S"), &val);
+         infoBuf.AppendFormat(_L("Network name: %S\n"), &network);
+         
+         // Network id
+         query.Format(_L("%s\\%s"), NETWORK, COMMDB_ID);
+         result = iConnection.GetIntSetting(query, networkId);
+         RDebug::Print(_L("IAP/Name value: %d"), networkId);
+         infoBuf.AppendFormat(_L("Network id: %d\n"), networkId);
+         */
+
+        // Print transferred data
+        TPckg<TUint> uplinkVolume(0);
+        TPckg<TUint> downlinkVolume(0);
+        TRequestStatus status;
+        iConnection.DataTransferredRequest(uplinkVolume, downlinkVolume, status);
+        User::WaitForRequest(status);
+        if(status.Int() == KErrNone)
+            {
+            infoBuf.AppendFormat(_L("-up=%d, down=%d\n"), uplinkVolume(), downlinkVolume());
+            }
+
+        for(i = 1; i <= connCount; i++)
+            {
+            infoBuf.AppendFormat(_L("\nConnection %d:\n"), i);
+            TPckgBuf<TConnectionInfo> connInfo;
+            result = iConnection.GetConnectionInfo(i, connInfo);
+            User::LeaveIfError(result);
+            RDebug::Print(_L("ConnTest: IapId: %d, NetId: %d"), connInfo().iIapId, connInfo().iNetId);
+            infoBuf.AppendFormat(_L(" -IapId=%d, NetId=%d\n"), connInfo().iIapId, connInfo().iNetId);
+
+            // Get info about clients using this connection
+            args.iIndex = i;
+            TConnEnumArgBuf enumBuf(args);
+
+            TConnectionGetClientInfoArg clientInfoArg;
+            clientInfoArg.iIndex = 1;
+            TConnGetClientInfoArgBuf clientInfoBuf(clientInfoArg);
+
+            TConnectionClientInfo clientInfo;
+
+            result = iConnection.Control(KCOLConnection, KCoEnumerateConnectionClients, enumBuf);
+            User::LeaveIfError(result);
+            infoBuf.AppendFormat(_L(" -clients: %d\n"), enumBuf().iCount);
+
+            for(j = 1; j <= enumBuf().iCount; j++)
+                {
+                clientInfoBuf().iIndex = j;
+                result = iConnection.Control( KCOLConnection,
+                        KCoGetConnectionClientInfo,
+                        clientInfoBuf );
+                User::LeaveIfError(result);
+                clientInfo = clientInfoBuf().iClientInfo;
+
+                TInt id = clientInfo.iProcessId;
+                RDebug::Print(_L("ConnTest: ProcessId: %d"), id);
+
+                // Get application  name
+#ifndef __WINS__
+            result = appSess.GetAppInfo(appInfo, clientInfo.iUid);
+            if(result == KErrNone)
+                {
+                infoBuf.AppendFormat(_L("   client %d=%S\n"), j, &(appInfo.iCaption));
+                }
+            else
+                {
+                // Servers don't have caption name (e.g. Connection Monitor server)
+                infoBuf.AppendFormat(_L("   client %d=%x\n"), j, clientInfo.iUid);
+                }
+#else
+            infoBuf.AppendFormat(_L("   client %d=N/A in WINS\n"), j);
+#endif        
+            }
+
+        // Get info about sockets using this connection
+        TConnectionGetSocketInfoArg socketInfoArg;
+        socketInfoArg.iIndex = i;
+        TConnGetSocketInfoArgBuf socketInfoBuf(socketInfoArg);
+        TConnectionSocketInfo socketInfo;
+
+        result = iConnection.Control( KCOLConnection,
+                KCoEnumerateConnectionSockets,
+                enumBuf);
+        User::LeaveIfError(result);
+        infoBuf.AppendFormat(_L(" -sockets: %d\n"), enumBuf().iCount);
+
+        for(j = 1; j <= enumBuf().iCount; j++)
+            {
+            socketInfoBuf().iIndex = j;
+            result = iConnection.Control( KCOLConnection,
+                    KCoGetConnectionSocketInfo,
+                    socketInfoBuf );
+            User::LeaveIfError(result);
+            socketInfo = socketInfoBuf().iSocketInfo;
+
+            TUint id = socketInfo.iAddressFamily;
+            TBuf<5> prot;
+            socketInfo.iProtocol == KProtocolInetTcp ? prot.Copy(_L("tcp")) : prot.Copy(_L("udp"));
+
+            TSockAddr sa = socketInfo.iSourceAddress;
+            TSockAddr da = socketInfo.iDestinationAddress;
+
+            TInetAddr& source = TInetAddr::Cast(sa);
+            TInetAddr& dest = TInetAddr::Cast(da);
+
+            TBuf<20> a1;
+            source.Output(a1);
+
+            TBuf<20> a2;
+            dest.Output(a2);
+
+            RDebug::Print(_L("ConnTest: ProcessId: %d"), id);
+            infoBuf.AppendFormat(_L("  %d. socket: %S\n   %S->\n   %S\n"), j, &prot, &a1, &a2);
+            }
+        } // for (i...  
+    infoBuf.AppendFormat(_L("---------------\n"));
+    PrintTextToConsole(infoBuf);
+    CleanupStack::PopAndDestroy(buf);
+    CleanupStack::PopAndDestroy(&appSess);
+    }
+
+    // ---------------------------------------------------------
+    // CSocketsEngine::SendHttpFrameworkRequestL()
+    // Send HTTP request
+    // ---------------------------------------------------------
+    //
+void CSocketsEngine::SendHttpFrameworkRequestL( TBool aHasBody,
+        TBool aDoPerformance,
+        TBool aIsSecure )
+    {
+    iHttpClient->SetPerformance( aDoPerformance );
+    iHttpClient->InvokeHttpMethodL( iSettingData, aHasBody, aIsSecure );
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::ProgressNotifyReceivedL(TInt aStage)
+// Progress notification has been received, display the
+// stage in output window.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::ProgressNotifyReceivedL( TInt aStage, TInt aError )
+    {
+    
+    TBuf8<64> text;
+    text.AppendFormat( _L8("Progress: %d, %d"), aStage, aError );
+
+    TBuf8<16> error;
+    error.Format( _L8(", %d"), aError );
+
+    switch (aStage)
+        {
+        case KConnectionUninitialised: // 0
+            iConsole.PrintNotify( _L8("Connection uninit"));
+            iConsole.PrintNotify( error );
+            break;
+        case KStartingSelection: // 1000
+            iConsole.PrintNotify( _L8("Starting selection"));
+            iConsole.PrintNotify( error );
+            break;
+        case KFinishedSelection: // 2000
+            iConsole.PrintNotify( _L8("Finished selection"));
+            iConsole.PrintNotify( error );
+            
+            if (iCloseConnection)
+                {
+                // We are starting RConnection instance for testing RConnection::Close.
+                // At this point we can attach the monitoring RConnection instance to
+                // interface, and delete the temporary progress notifier.
+                //
+                // We may loose few progress notifications at start up, that's small
+                // prize compared to advantages: we get correct notifications when
+                // interface goes down, which is the essential part of this test.
+
+                TBuf<20> query;
+                TUint32 networkId;
+                TInt result;
+                TInt err( KErrNone );
+                TConnectionInfo info;
+                TPckg<TConnectionInfo> pckgInfo( info );
+                
+                // Network id
+                query.Format( _L("%s\\%s"), IAP, IAP_NETWORK);
+                result = iCloseConnection->GetIntSetting(query, networkId);
+                if(result == KErrNone)
+                    {
+                    info.iIapId = iPrefs.IapId();
+                    info.iNetId = networkId;
+                    }
+                err = iConnection.Attach( pckgInfo, RConnection::EAttachTypeMonitor );
+                if ( err != KErrNone )
+                    {
+                    iConsole.ErrorNotify(_L("Attaching failed"), err);
+                    }
+                iTempProgressNotifier->Cancel();
+                delete iTempProgressNotifier;
+                iTempProgressNotifier = NULL;
+                }
+            break;
+            case KConnectionFailure: // 2001
+                        iConsole.PrintNotify(_L8("Connection failure"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KMinAgtProgress: // 2500
+                        iConsole.PrintNotify(_L8("Min agt progress"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KConnectionOpen: // 3500
+                        iConsole.PrintNotify(_L8("Connection open"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KConnectionClosed: // 4500
+                        iConsole.PrintNotify(_L8("Connection closed"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KMaxAgtProgress: // 5500
+                        iConsole.PrintNotify(_L8("Max agent progress"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KMinNifProgress: // 6000
+                        iConsole.PrintNotify(_L8("Min nif progress"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KLinkLayerOpen: // 7000
+                        iConsole.PrintNotify(_L8("Link layer open"));
+                        iConsole.PrintNotify(error);
+                        break;
+                        case KLinkLayerClosed: // 8000
+                        iConsole.PrintNotify(_L8("Link layer closed"));
+                        iConsole.PrintNotify(error);
+                        iHttpClient->SetHttpConnectionInfoL(ETrue, iConnection, iSocketServ);
+
+                        switch (iEngineStatus)
+                            {
+                            case EStartingInterface:
+                            // This case will occur, if username/password prompt dialog
+                            // is used and cancel is selected in dialog, and when error
+                            // occurs during interface startup.
+                            break;
+                            case EInterfaceDown:
+                            // EInterfaceDown must be handled also, because this
+                            // state has been set in StopInterface method.
+                            break;
+                            case EListening:
+                            iListeningSocket.CancelAccept();
+                            iListeningSocket.Close();
+                            // FALLTHROUGH
+                            case ELookingUp:
+                            // Cancel everything depending on state.
+                            iResolver.Cancel();
+                            iResolver.Close();
+                            // FALLTHROUGH
+                            case EConnected:
+                            iSocketsRead->Cancel();
+                            iSocketsWrite->Cancel();
+                            // FALLTHROUGH
+                            case EConnecting:
+                            // This looks awful, but is required because of the fall through
+                            // and buggy implementation of the CancelConnect.
+                            if( EConnecting == iEngineStatus )
+                                {
+                                iSocket.CancelConnect();
+                                }
+                            // FALLTHROUGH
+                            case EDisconnecting:
+                            iSocket.Close();
+                            // FALLTHROUGH
+                            case EInterfaceUp:
+                            if (iRoaming == ERoamingOff)
+                                {
+                                UnRegisterFromMobilityAPI();
+                                SetSocketEngineConnType(ETypeUnknown);
+                                ChangeStatus(EInterfaceDown);
+                                }
+                            else
+                                {
+                                iConsole.PrintNotify(_L8("MobilitySession lost!\n"));
+                                UnRegisterFromMobilityAPI();
+                                SetSocketEngineConnType(ETypeUnknown);
+                                ChangeStatus(EInterfaceDown);
+                                }
+                            break;
+                            default:
+                            User::Panic(KPanicSocketsEngine, EConnTestBadStatus);
+                            break;
+                            }
+
+                        break;
+                        case KMaxNifProgress: // 9000
+                        iConsole.PrintNotify(_L8("Max nif progress\n"));
+                        break;
+                        default:
+                        iConsole.PrintNotify(text);
+                        }
+                    iConsole.PrintNotify(_L8("\f"));
+                    }
+
+                // ---------------------------------------------------------
+                // CSocketsEngine::ProgressNotifyError(TInt aStatus)
+                // Some error has occurred while receiving progress
+                // notifications.
+                // ---------------------------------------------------------
+                //
+void CSocketsEngine::ProgressNotifyError( TInt aStatus )
+    {
+    iConsole.ErrorNotify( _L("<CProgressNotifier> Notify failed"), aStatus );
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::TimerExpired()
+// Cancel ongoing operations
+// ---------------------------------------------------------
+//
+void CSocketsEngine::TimerExpired()
+    {
+    Cancel();
+    iConsole.ErrorNotify( _L("<CSocketsEngine> Timed out"), KErrTimedOut );
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::InterfaceInfoL()
+// Print information about interfaces.
+// ---------------------------------------------------------
+//
+void CSocketsEngine::InterfaceInfoL()
+    {
+    TBuf<128> t;
+    TAutoClose<RSocketServ> ss;
+    User::LeaveIfError( ss.iObj.Connect() );
+    ss.PushL();
+
+    TAutoClose<RSocket> sock;
+    User::LeaveIfError( sock.iObj.Open( ss.iObj, _L("udp")) );
+    sock.PushL();
+
+    User::LeaveIfError(
+            sock.iObj.SetOpt( KSoInetEnumInterfaces, KSolInetIfCtrl ) );
+
+    TProtocolDesc in;
+    User::LeaveIfError( sock.iObj.Info( in ) );
+
+    TPckgBuf<TSoInetInterfaceInfo> info, next;
+    
+    TInt res = sock.iObj.GetOpt( KSoInetNextInterface, KSolInetIfCtrl, info );
+    if (res != KErrNone)
+        {
+        User::Leave( res );
+        }
+    TInt count = 0;
+    while (res == KErrNone)
+        {
+        res = sock.iObj.GetOpt( KSoInetNextInterface, KSolInetIfCtrl, next );
+
+        if (info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
+            {
+            t.Format( _L("Interface %d\n"),count++ );
+            PrintTextToConsole( t );
+            t.Format( _L("Name \"%S\"\n"), &info().iName );
+            PrintTextToConsole( t );
+
+            t.Format( _L("State "));
+            switch (info().iState)
+                {
+                case EIfPending:
+                    t.AppendFormat( _L("pending\n"));
+                    break;
+                case EIfUp:
+                    t.AppendFormat( _L("up\n"));
+                    break;
+                case EIfBusy:
+                    t.AppendFormat( _L("busy\n"));
+                    break;
+                default:
+                    t.AppendFormat( _L("down\n"));
+                    break;
+                }
+
+            t.AppendFormat( _L("Mtu %d\n"), info().iMtu );
+            t.AppendFormat( _L("Speed Metric %d\n"), info().iSpeedMetric );
+
+            t.Format( _L("Features:"));
+            info().iFeatures & KIfIsLoopback ? t.AppendFormat( _L(" loopback")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfIsDialup ? t.AppendFormat( _L(" dialup")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfIsPointToPoint ? t.AppendFormat( _L(" pointtopoint")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfCanBroadcast ? t.AppendFormat( _L(" canbroadcast")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfCanMulticast ? t.AppendFormat( _L(" canmulticast")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfCanSetMTU ? t.AppendFormat( _L(" cansetmtu")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfHasHardwareAddr ? t.AppendFormat( _L(" hardwareaddr")) : t.AppendFormat( _L(""));
+            info().iFeatures & KIfCanSetHardwareAddr ? t.AppendFormat( _L(" cansethardwareaddr")) : t.AppendFormat( _L(""));
+            t.AppendFormat( _L("\n"));
+
+            TName address;
+            info().iAddress.Output( address );
+            t.Format( _L("Addr: %S\n"), &address );
+
+            if (info().iAddress.IsLinkLocal())
+                {
+                t.AppendFormat( _L("  -link local\n"));
+                }
+            else if (info().iAddress.IsSiteLocal())
+                {
+                t.AppendFormat( _L("  -site local\n"));
+                }
+            else
+                {
+                t.AppendFormat( _L("  -global\n"));
+                }
+            PrintTextToConsole( t );
+
+            info().iBrdAddr.Output( address );
+            info().iDefGate.Output( address );
+            t.Format( _L("Gatew: %S\n"), &address );
+            info().iNameSer1.Output( address );
+            t.AppendFormat( _L("DNS 1: %S\n"), &address );
+            info().iNameSer2.Output( address );
+            t.AppendFormat( _L("DNS 2: %S\n"), &address );
+            PrintTextToConsole( t );
+            
+            if (info().iHwAddr.Family() != KAFUnspec)
+                {
+                PrintTextToConsole( _L("Hardware address "));
+                TUint j;
+                for (j = sizeof(SSockAddr); j < sizeof(SSockAddr) + 6; ++j)
+                    {
+                    if (j < (TUint)info().iHwAddr.Length())
+                        {
+                        t.Format( _L("%02X"), info().iHwAddr[j] );
+                        PrintTextToConsole( t );
+                        }
+                    else
+                        {
+                        PrintTextToConsole( _L("??"));
+                        }
+                    if (j < sizeof(SSockAddr) + 5)
+                        {
+                        PrintTextToConsole( _L("-"));
+                        }
+                    else
+                        {
+                        PrintTextToConsole( _L("\n"));
+                        }
+                    }
+                }
+            }
+        if (res == KErrNone)
+            {
+            info = next;
+            PrintTextToConsole( _L("\n"));
+            }
+        else
+            {
+            PrintTextToConsole( _L("\n"));
+            }
+        }
+    t.Format( _L("Total %d interfaces\n"),count );
+    PrintTextToConsole( t );
+
+    sock.Pop();
+    ss.Pop();
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::SetWLANQoS()
+// Set QoS for WLAN
+// ---------------------------------------------------------
+//
+void CSocketsEngine::SetWLANQoS( TInt aClass )
+    {
+    TInt opt;
+    TInt err;
+    TBuf<64> t;
+    
+    if (iEngineStatus != EConnected)
+        {
+        t.Copy( _L("\nConnect first!\n"));
+        PrintTextToConsole( t );
+        return;
+        }
+
+    err = iSocket.GetOpt( KSoIpTOS, KSolInetIp, opt );
+
+    opt = opt >> 2;
+
+    if (err == KErrNone)
+        {
+        t.Format( _L("Old TOS: %x\n"), opt );
+        }
+    else
+        {
+        t.Format( _L("Cannot get TOS opt\n"));
+        }
+
+    PrintTextToConsole( t );
+
+    switch (aClass)
+        {
+        case 7:
+            err = iSocket.SetOpt( KSoIpTOS, KSolInetIp, 0xE0 );
+            break;
+        case 5:
+            err = iSocket.SetOpt( KSoIpTOS, KSolInetIp, 0xA0 );
+            break;
+        case 3:
+            err = iSocket.SetOpt( KSoIpTOS, KSolInetIp, 0x60 );
+            break;
+        case 1:
+            err = iSocket.SetOpt( KSoIpTOS, KSolInetIp, 0x20 );
+            break;
+        case 0:
+            err = iSocket.SetOpt( KSoIpTOS, KSolInetIp, 0x0 );
+            break;
+        default:
+            break;
+        }
+
+    err = iSocket.GetOpt( KSoIpTOS, KSolInetIp, opt );
+
+    opt = opt >> 2;
+
+    if (err == KErrNone)
+        {
+        t.Format( _L("New TOS: %x\n"), opt );
+        }
+    else
+        {
+        t.Format( _L("Cannot set TOS opt\n"));
+        }
+    
+    PrintTextToConsole( t );
+    
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::QoS1()
+// 
+// ---------------------------------------------------------
+//
+void CSocketsEngine::QoS1()
+    {
+    /*TQoSSelector selector;
+     selector.setAddr(iSocket);
+     
+     RQoSPolicy policy;
+     policy.Open(selector);
+     
+     CQosParameters* parameters = GetparametersL();
+     policy.NotifyEvent(iObserver);
+     policy.SetQoS(*parameters);
+     
+     policy.GetQoS();
+     policy.Close();
+     */
+    }
+
+// ---------------------------------------------------------
+// CSocketsEngine::QoS2()
+// 
+// ---------------------------------------------------------
+//
+void CSocketsEngine::QoS2()
+    {
+    /*CQosParameters* parameters = GetparametersL();
+     
+     RQoSChannel channel;
+     
+     channel.Open(iSocket);
+     channel.NotifyEvent(iObserver);
+     channel.SetQoS(*parameters);
+     
+     channel.Join(iSocket2); 
+     
+     channel.Leave(ISocket);
+     
+     channel.Close();
+     */
+    }
+// ----------------------------------------------------------------------------
+// CSocketsEngine::SendDataL
+// Start the sending of the data
+// ----------------------------------------------------------------------------
+//
+void CSocketsEngine::SendDataL( const TBuf8<KSendDataSize> aData )
+    {
+    RDebug::Print( _L("ConnTest: SendDataL: size = %d"),aData.Length() );
+    iSendCount = 0;
+    iData->Des().Copy( aData );
+    iData->Des().ZeroTerminate();
+    iSocket.SetOpt( KSoUdpSynchronousSend, KSolInetUdp, 1 );
+
+    iTroughputDataSize = 0;
+    iThroughputStartTime.UniversalTime();
+    
+    DoSendDataL();
+    }
+
+// ----------------------------------------------------------------------------
+// CSocketsEngine::DoSendDataL
+// Do the actual sending of the data
+// ----------------------------------------------------------------------------
+//
+void CSocketsEngine::DoSendDataL()
+    {
+    if (iSendCount++ < (iSettingData->iPackets))
+        {
+        // Delay is given in milliseconds, timer uses microseconds.
+        if (iSettingData->iDelay != 0)
+            {
+            if (iSettingData->iProtocol == 1) //  1 == UDP here. Only way to send udp is raw data
+                {
+                RDebug::Print(
+                        _L("ConnTest: DoSendDataL: inserting seq number %d"),iSendCount );
+                TUint32* seqNumberPointer = (TUint32*)(iData->Des().Ptr());
+                *seqNumberPointer = ByteOrder::Swap32( iSendCount ); // put sequence number into to the packet
+                }
+            WriteL( *iData );
+            iSendTimer->After( (iSettingData->iDelay) * 1000 );
+            }
+        else
+            {
+            WriteFloodL( *iData, iSettingData->iPackets );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// Notifys when a packet has been sent
+// aAmount is th amount of data that has been sent
+// ---------------------------------------------------------
+//
+void CSocketsEngine::NotifySend( TInt aAmount )
+    {
+    if (iThroughputStartTime != 0)
+        {
+        
+        iTroughputDataSize += aAmount;
+        TInt size = iSettingData->iPacketSize;
+        if (iSettingData->iPacketSize > KSendDataSize)
+            {
+            size = KSendDataSize;
+            }
+        // We add 1 for each packet since the create packet appends an extra \n
+        // after each packet
+        if (iTroughputDataSize == (iSettingData->iPackets * size))
+        // + iSettingData->iPackets) )
+            {
+            TBuf8<256> text;
+            Utils::CalculateThroughput( text, iThroughputStartTime,
+                    iTroughputDataSize );
+            iThroughputStartTime = 0;
+            iConsole.PrintNotify( text );
+            iTroughputDataSize = 0;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// Marks starting time into memory
+//
+// ---------------------------------------------------------
+//
+void inline CSocketsEngine::StartTickCount()
+    {
+    if (!iUseTTime)
+        {
+        iStartTime = User::FastCounter();
+        }
+    else
+        {
+        iStartTTime.UniversalTime();
+        iStartTime = 1; // Non null. iStartTime is also used as flag.
+        }
+    
+    }
+
+// ---------------------------------------------------------
+// Calculates time interval using tick count and prints it
+//
+// ---------------------------------------------------------
+//
+void CSocketsEngine::StopTickCount( const TDesC& aComponentName )
+    {
+    TBuf<128> text;
+    if (!iUseTTime)
+        {
+        TUint32 currentTime = User::FastCounter();
+        currentTime = currentTime - iStartTime;
+
+        if (iStartTime == 0)
+            {
+            return; //do not print if start time hasn't been initialized.
+            }
+        iStartTime = 0;
+
+        TInt freq = 0;
+        TInt err = HAL::Get( HAL::EFastCounterFrequency, freq );
+        if (err != KErrNone || freq == 0)
+            {
+            text.Format( _L("FastCounter error: %d \n"),err );
+            }
+        else
+            {
+            currentTime = (currentTime * 1000.0) / freq;
+            text.Format( _L("%u ms by "), currentTime );
+            text.Append( aComponentName );
+            text.Append( _L("\n"));
+            }
+        }
+    else
+        {
+        TTime currentTime;
+        currentTime.UniversalTime();
+
+        if (iStartTime == 0)
+            {
+            return; //do not print if start time hasn't been initialized.
+            }
+        TTimeIntervalMicroSeconds interval = currentTime.MicroSecondsFrom(
+                iStartTTime );
+        iStartTime = 0;
+
+        TBuf<32> app;
+        app.Format( _L("%u ms by "), interval.Int64() / 1000 );
+        text.Append( app );
+        text.Append( aComponentName );
+        }
+    
+    PrintTextToConsole( text );
+    }
+
+// end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/SocketsRead.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,349 @@
+/*
+* Copyright (c) 2006-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: CSocketsRead is an active obejct that reads data from
+* an already open socket and calculates some metrics from the data read
+*
+*/
+
+// INCLUDE FILES
+#include "SocketsRead.h"
+#include "SocketsEngine.h"
+#include "uinotify.h"
+#include "Utils.h"
+
+
+// ---------------------------------------------------------
+// CSocketsRead::NewL(MUINotify& aConsole, RSocket& aSocket)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSocketsRead* CSocketsRead::NewL(MUINotify& aConsole, RSocket& aSocket, CSocketsEngine& aEngine)
+{
+    CSocketsRead* self = CSocketsRead::NewLC(aConsole, aSocket, aEngine);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------
+// CSocketsRead::NewLC(MUINotify& aConsole, RSocket& aSocket)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSocketsRead* CSocketsRead::NewLC(MUINotify& aConsole, RSocket& aSocket, CSocketsEngine& aEngine)
+{
+    CSocketsRead* self = new (ELeave) CSocketsRead(aConsole, aSocket, aEngine);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+// ---------------------------------------------------------
+// CSocketsRead::CSocketsRead(MUINotify& aConsole, RSocket& aSocket)
+// Constructor
+// ---------------------------------------------------------
+//
+CSocketsRead::CSocketsRead(MUINotify& aConsole, RSocket& aSocket, CSocketsEngine& aEngine)
+: CActive(/*EPriorityStandard*/EPriorityHigh),
+iEngine(aEngine),
+iSocket(aSocket),
+iConsole(aConsole)
+{
+}
+
+// ---------------------------------------------------------
+// CSocketsRead::~CSocketsRead()
+// Destructor
+// ---------------------------------------------------------
+//
+CSocketsRead::~CSocketsRead()
+{
+    Cancel();
+}
+
+// ---------------------------------------------------------
+// CSocketsRead::ConstructL()
+// EPOC two-phased constructor
+// ---------------------------------------------------------
+//
+void CSocketsRead::ConstructL()
+{
+    CActiveScheduler::Add(this);
+}
+
+
+// ---------------------------------------------------------
+// CSocketsRead::Start(TInetAddr* aAddress, TUint aProtocol)
+// Initiate a read from socket.
+// ---------------------------------------------------------
+//
+void CSocketsRead::Start(TInetAddr* aAddress, TUint aProtocol)
+{
+    iAddress = aAddress;
+    iProtocol = aProtocol;
+
+    // Initiate a new read from socket into iBuffer
+    if (!IsActive())
+    {
+        IssueRead();
+    }
+}
+
+// ---------------------------------------------------------
+// CSocketsRead::StartRAWRead()
+// Start RAW read
+// ---------------------------------------------------------
+//
+
+void CSocketsRead::StartRAWRead(TInetAddr* aAddress, TUint aProtocol)
+	{
+    iAddress = aAddress;
+    iProtocol = aProtocol;
+    iBodySize = 0; // REMEMBER TO DO THIS, OR OTHERWISE WE THINK THIS IS HTTP TRAFFIC
+    iDoPerformance = ETrue;
+	iUdpPacketCounter = 0;
+	
+    // Initiate a new read from socket into iBuffer
+    iConsole.PrintNotify(_L("Getting data...\n"));
+    iDoCount = ETrue;
+    iStartTime.UniversalTime();
+    iReceivedBytes = 0;
+    
+    if (!IsActive())
+    {
+        IssueRead();
+	}
+}
+
+
+// ---------------------------------------------------------
+// CSocketsRead::IssueRead()
+// Receive data.
+// ---------------------------------------------------------
+//
+void CSocketsRead::IssueRead()
+{
+    // Initiate a new read from socket into iBuffer
+    ASSERT(!IsActive());
+    
+    switch(iProtocol)
+    {
+    case KProtocolInetTcp:
+        iSocket.RecvOneOrMore(iBuffer, 0, iStatus, iDummyLength);
+        break;
+    case KProtocolInetUdp:
+    	iBuffer.Zero();
+        iSocket.RecvFrom(iBuffer, *iAddress, 0, iStatus/*, iDummyLength*/);
+        break;
+    }    
+    SetActive();
+}
+
+
+// ---------------------------------------------------------
+// CSocketsRead::SetPerformance(const TBool aValue)
+// Set performance calculation on/off
+// ---------------------------------------------------------
+//
+void CSocketsRead::SetPerformance(const TBool aValue)
+{
+    iDoPerformance = aValue;
+    iReceivedBytes = 0;
+    iDoCount = EFalse;
+    
+    //TInt recBuf;
+    //iSocket.SetOpt(KSORecvBuf, KSOLSocket, 200000);
+    //iSocket.GetOpt(KSORecvBuf, KSOLSocket, recBuf);
+}
+
+
+// ---------------------------------------------------------
+// CSocketsRead::RunL()
+// Called when request has completed.
+// ---------------------------------------------------------
+//
+void CSocketsRead::RunL()
+    {
+    // Active object request complete handler
+    if (iStatus == KErrNone)
+        {
+        // Character has been read from socket
+        if(iDoPerformance)
+            {
+            if(!iDoCount)
+                {
+                iHeaders.Append(iBuffer.Left(iHeaders.MaxLength() - iHeaders.Length()));
+                iHeaders.LowerCase();
+
+                TInt end = iHeaders.Find(_L8("\r\n\r\n"));
+                TInt emptyLine = iBuffer.Find(_L8("\r\n\r\n"));
+
+                if(!(end == KErrNotFound))
+                    {
+                    TInt cl = iHeaders.Find(_L8("content-length:"));
+
+                    if(!(cl == KErrNotFound))
+                        {
+                        TBuf8<512> temp;
+                        temp = iHeaders.Mid(cl, end - cl);
+
+                        TInt st = temp.Locate(':');
+                        TInt endcl = temp.Find(_L8("\r\n"));
+
+                        if ( endcl != KErrNotFound )
+                            {
+                            // not the last line in headers.
+                            temp = temp.Mid(st+1, endcl - st);                            
+                            }
+                        else
+                            {
+                            temp = temp.Mid(st+1);                            
+                            }
+                        
+                        temp.Trim();
+
+                        TLex8 lex(temp);
+                        TInt err = lex.Val(iBodySize);
+
+                        if(err == KErrNone)
+                            {
+                            iConsole.PrintNotify(_L("Getting body...\n"));
+                            iDoCount = ETrue;
+                            iStartTime.UniversalTime();
+                            iReceivedBytes = iBuffer.Length() - emptyLine - 4; 
+                            }
+                        }
+                    }
+                }
+            else
+                {          
+                iReceivedBytes += iBuffer.Length();
+                if (iProtocol == KProtocolInetUdp)
+                    {
+                    if (iUdpPacketCounter == 0)
+                        iStartTime.UniversalTime(); // Start time calculation from the first received packet.
+                    iUdpPacketCounter++;
+                    if (iUdpPacketCounter == KMaximumPacketCount)
+                        {
+                        TBuf8<128> b(_L8("Got data\n"));
+                        TInt ploss = CalculatePacketLoss();
+                        Utils::CalculateThroughput(b, iStartTime, iReceivedBytes);
+                        iEngine.Disconnect();
+                        b.AppendFormat(_L8("Ploss: %d %%\n"),ploss);
+                        iConsole.PrintNotify(b);
+                        return; // do not issue any request.
+                        }
+                    else if (iUdpPacketCounter > KMaximumPacketCount)
+                        {
+                        iConsole.PrintNotify(_L8("Unexpected state\n"));
+                        iEngine.Disconnect();
+                        iSocket.Close();
+                        return;
+                        }
+
+                    }
+                }
+
+            // Check if all the data has been received
+            if(iReceivedBytes == iBodySize)
+                {
+                // Throughput calculation
+                TBuf8<128> b(_L8("Got body\n"));
+                Utils::CalculateThroughput(b, iStartTime, iReceivedBytes);
+                iConsole.PrintNotify(b);
+                iHeaders.Zero();
+                iDoCount = EFalse;
+                }
+            }
+        else
+            {            
+            iConsole.PrintNotify(iBuffer);
+            }
+
+        IssueRead(); // Immediately start another read
+        }
+    else
+        {
+        if( iStatus.Int() == KErrEof || 
+                iStatus.Int() == KErrDisconnected || 
+                iStatus.Int() == KErrCancel )
+            {
+            TBuf<64> text(_L("HTTP Get Completed"));
+            iEngine.StopTickCount(text);
+            // Remote server closed the socket
+            if (iBodySize == 0) // We don't know how much we are expecting data so we calculate throughput here
+                {
+                iReceivedBytes += iBuffer.Length();
+                // Throughput calculation
+                TBuf8<128> b(_L8("Got body\n"));
+                Utils::CalculateThroughput(b, iStartTime, iReceivedBytes);
+                iConsole.PrintNotify(b);
+                }
+            TBuf<64> note;
+            note.Format(_L("\nSocket closed: (%d)\n"), iStatus.Int());
+            iEngine.Disconnect();
+            iConsole.PrintNotify(note);
+            }
+        else if(iStatus.Int() == KErrTimedOut)
+            {
+            // LastSocketActivityTimeout has been elapsed
+            TBuf<64> note;
+            note.Copy(_L("\nLastSocketActivityTimeOut elapsed\n\n"));
+            iEngine.Disconnect();
+            iConsole.PrintNotify(note);
+            }
+        else
+            {
+            // Error: pass it up to user interface
+            TBuf<50> err;
+            err.Format(_L("\nCSocketsRead error %d\n"), iStatus.Int());
+            iConsole.PrintNotify(err);
+            }
+        iSocket.Close();  // error is always fatal.      
+        }	
+    }
+
+// ---------------------------------------------------------
+// CSocketsRead::DoCancel()
+// Cancel ongoing requests.
+// ---------------------------------------------------------
+//
+void CSocketsRead::DoCancel()
+{
+    // Cancel asychronous read request
+    iSocket.CancelRead();
+    // If we were accepting raw UDP-traffic, we should stop and analyse.
+    if (iBodySize == 0 && iProtocol == KProtocolInetUdp && iReceivedBytes != 0)
+	{
+        TBuf8<128> b(_L8("Got body\n"));
+        Utils::CalculateThroughput(b, iStartTime, iReceivedBytes);
+        iConsole.PrintNotify(b);
+	}
+}
+
+// ---------------------------------------------------------
+// CSocketsRead::CalculatePacketLoss()
+// Calculates packet loss rate
+// @return ploss percentage
+// ---------------------------------------------------------
+//
+TInt32 CSocketsRead::CalculatePacketLoss()
+{
+	TUint32* seqNumberPointer = (TUint32*)(iBuffer.Ptr());
+	TUint32 sequenceNumberOfThisPacket = ByteOrder::Swap32( *seqNumberPointer );
+	if(sequenceNumberOfThisPacket != 0)
+	    return (100 - (100 * iUdpPacketCounter) / sequenceNumberOfThisPacket);
+	else return 100;
+}
+
+// EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/SocketsWrite.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,414 @@
+/*
+ * Copyright (c) 2006-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: CSocketsWrite is an active object which implements data
+ * sending through an already open socket using UDP or TCP
+ *
+ */
+
+// INCLUDE FILES
+#include <e32svr.h>
+
+#include "SocketsWrite.h"
+#include "TimeOutTimer.h"
+#include "ConnTest.pan"
+#include "uinotify.h"
+#include "Utils.h"
+#include "conntest.hrh"
+#include "datasendnotifyhandler.h"
+
+// CONSTANTS
+static const TInt KTimeOut = 30000000; // 30 seconds time-out
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::NewL(MUINotify& aConsole, RSocket& aSocket, MDataSendNotifyHandler& aSendHandler)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSocketsWrite* CSocketsWrite::NewL( MUINotify& aConsole, 
+        RSocket& aSocket, 
+        MDataSendNotifyHandler& aSendHandler )
+    {
+    CSocketsWrite* self = CSocketsWrite::NewLC(aConsole, aSocket, aSendHandler);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::NewLC(MUINotify& aConsole, RSocket& aSocket, MDataSendNotifyHandler& aSendHandler)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CSocketsWrite* CSocketsWrite::NewLC( MUINotify& aConsole, 
+        RSocket& aSocket, 
+        MDataSendNotifyHandler& aSendHandler )
+    {
+    CSocketsWrite* self = new (ELeave) CSocketsWrite(aConsole, aSocket, aSendHandler);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::CSocketsWrite(MUINotify& aConsole, RSocket& aSocket, MDataSendNotifyHandler& aSendHandler)
+// Constructor
+// ---------------------------------------------------------
+//
+CSocketsWrite::CSocketsWrite( MUINotify& aConsole, 
+        RSocket& aSocket, 
+        MDataSendNotifyHandler& aSendHandler ):
+        CActive(EPriorityStandard),
+        iSocket(aSocket),
+        iConsole(aConsole),
+        iPackets(0),
+        iPacketSize(0),
+        iReqBodySubmitBufferPtr(0,0),
+        iSendHandler(aSendHandler)
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::~CSocketsWrite()
+// Destructor
+// ---------------------------------------------------------
+//
+CSocketsWrite::~CSocketsWrite()
+    {
+    Cancel();
+    delete iReqBodySubmitBuffer;
+    delete iTimer;
+    iTimer = NULL;
+    if(iTransferBuffer)
+        {
+        delete iTransferBuffer;
+        iTransferBuffer = NULL;
+        }
+    if(iWriteBuffer)
+        {
+        delete iWriteBuffer;
+        iWriteBuffer = NULL;
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::ConstructL()
+// EPOC two-phased constructor
+// ---------------------------------------------------------
+//
+void CSocketsWrite::ConstructL()
+    {
+    CActiveScheduler::Add(this);
+
+    iTransferBuffer = HBufC8::NewL(KMaxSendBuffer);
+    iWriteBuffer = HBufC8::NewL(KMaxSendBuffer);
+
+    iTimeOut = KTimeOut; 
+    iTimer = CTimeOutTimer::NewL(10, *this);
+    iWriteStatus = EWaiting;
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::RunL()
+// Called when request has completed.
+// ---------------------------------------------------------
+//
+void CSocketsWrite::RunL()
+    {
+    if(!iFlood)
+        {   
+        RDebug::Print(_L("ConnTest: CSocketsWrite::RunL - iStatus = %d"), iStatus.Int());
+        }
+    // Active object request complete handler
+    if (iStatus == KErrNone)
+        {
+        switch(iWriteStatus)
+            {
+            // Character has been written to socket
+            case ESending:
+                if(!iFlood)
+                    SendNextPacket();
+                else
+                    DoFloodWrite();
+                break;
+            default:
+                User::Panic(KPanicSocketsWrite, EConnTestBadStatus);
+                break;
+            };
+        }
+    else 
+        {
+        // Error: pass it up to user interface
+        iTimer->Cancel();
+        TBuf<50> err;
+        err.Format(_L("\nCSocketsWrite error %d\n"), iStatus.Int());
+        //iConsole.ErrorNotify(_L("\nCSocketsWrite error"), iStatus.Int());
+        iConsole.PrintNotify(err);
+        iWriteStatus = ECommsFailed;
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::DoCancel()
+// Cancel ongoing requests.
+// ---------------------------------------------------------
+//
+void CSocketsWrite::DoCancel()
+    {	
+    RDebug::Print(_L("CSocketsWrite::DoCancel"));
+
+    // Cancel asychronous write request
+    iSocket.CancelWrite();
+
+    iTimer->Cancel();
+    }
+
+
+// ---------------------------------------------------------
+// CSocketsWrite::IssueWriteL()
+// Add data into buffer for sending.
+// ---------------------------------------------------------
+//
+void CSocketsWrite::IssueWriteL(const TDesC8& aData, TInetAddr* aAddress, TUint aProtocol)
+    {
+    RDebug::Print(_L("ConnTest: CSocketsWrite::IssueWriteL - aData.Length = %d"), aData.Length());
+
+    iFlood = EFalse;
+    iAddress = aAddress;
+    iProtocol = aProtocol;
+
+    // Write data to a stream socket
+    if ((aData.Length() + iTransferBuffer->Length()) > iTransferBuffer->Des().MaxLength())
+        {
+        RDebug::Print(_L("ConnTest: CSocketsWrite::IssueWriteL - data doesn't fit in the transferbuffer"));
+        RDebug::Print( _L( 
+                "ConnTest: CSocketsWrite::IssueWriteL - data length = %d, buffer length = %d, buffer max length = %d"),
+                aData.Length(), iTransferBuffer->Length(), iTransferBuffer->Des().MaxLength() );
+        // Not enough space in buffer
+        User::Leave(KErrOverflow);
+        }
+
+    // Add new data to buffer
+    iTransferBuffer->Des().Append(aData);
+
+    if (!IsActive())
+        {
+        SendNextPacket();
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsWrite::IssueWriteL()
+// Flood data over socket
+// ---------------------------------------------------------
+//
+void CSocketsWrite::IssueWriteL( const TDesC8& aData, 
+        TInetAddr* aAddress, 
+        TUint aProtocol, 
+        TInt aCount )
+    {
+    RDebug::Print(_L("ConnTest: CSocketsWrite::IssueWriteL - flood, packet count=%d"), aCount);
+    RDebug::Print(_L("ConnTest: CSocketsWrite::IssueWriteL - aData.Length = %d"), aData.Length());
+    iFlood = ETrue;
+    iCount = 0;
+    iPackets = aCount;
+    iPacketSize = aData.Length();
+
+    iAddress = aAddress;
+    iProtocol = aProtocol;
+
+    // Write data to a stream socket
+    if (aData.Length() > iTransferBuffer->Des().MaxLength())
+        {
+        // Not enough space in buffer
+        User::Leave(KErrOverflow);
+        }
+
+    // Add new data to buffer
+    iTransferBuffer->Des().Zero();
+    iTransferBuffer->Des().Append(aData);
+    iWriteBuffer->Des().Copy(*iTransferBuffer);
+    if (!IsActive())
+        {
+        DoFloodWrite();
+        }
+    }
+
+// -------------------------------------------------------------------------
+// CSocketsWrite::IssueWriteL()
+// Add data into buffer for sending POST request, initializes body data.
+// -------------------------------------------------------------------------
+//
+void CSocketsWrite::IssueWriteL( const TDesC8& aData, 
+        TInetAddr* aAddress, 
+        TUint aProtocol, 
+        TInt aPacketSize, 
+        TInt aPackets )
+    {
+    RDebug::Print(_L("ConnTest: CSocketsWrite::IssueWriteL - aData.Length = %d"), aData.Length());
+    iFlood = EFalse;
+
+    iPackets = aPackets;
+    iPacketSize = aPacketSize;
+
+    delete iReqBodySubmitBuffer;
+    iReqBodySubmitBuffer = NULL;
+    iReqBodySubmitBuffer = HBufC8::NewMaxL(KSendDataSize);
+    iReqBodySubmitBufferPtr.Set(iReqBodySubmitBuffer->Des());
+
+    // Create body chunk
+    Utils::CreateDataChunk(iReqBodySubmitBufferPtr, iPacketSize);
+    iDataChunkCount = 0;
+
+    IssueWriteL(aData, aAddress, aProtocol);
+    }
+
+// ---------------------------------------------------------
+// CSocketsWrite::SendNextPacket()
+// Write data from buffer to socket.
+// ---------------------------------------------------------
+//
+void CSocketsWrite::SendNextPacket()
+    {
+    RDebug::Print(_L("ConnTest: CSocketsWrite::SendNextPacket - iTransferBuffer.Length = %d, iPackets = %d"), iTransferBuffer->Length(), iPackets);
+
+    iTimer->Cancel(); // Cancel TimeOut timer
+    iWriteStatus = EWaiting;
+
+    if (iTransferBuffer->Length() > 0)
+        {
+        // Move data from transfer buffer to actual write buffer
+        iWriteBuffer->Des().Copy(*iTransferBuffer);
+        iTransferBuffer->Des().Zero();
+
+        switch(iProtocol)
+            {
+            case KProtocolInetTcp:
+                iSocket.Write(*iWriteBuffer, iStatus); // Initiate actual write
+                break;
+
+            case KProtocolInetUdp:
+                iSocket.SendTo(*iWriteBuffer, *iAddress, 0, iStatus);
+                break;
+            }
+        iSendHandler.NotifySend(iWriteBuffer->Length());
+        // Request timeout
+        iTimer->After(iTimeOut);
+        SetActive();
+        iWriteStatus = ESending;
+        }
+    else if(iPackets)
+        {
+        // We are sending body data, i.e. this is POST request
+        if(iDataChunkCount == 0)
+            {
+            iConsole.PrintNotify(_L("Sending body...\n"));
+            iSentBytes = 0;
+            iStartTime.UniversalTime();
+            }
+
+        TBool noMoreData = iDataChunkCount < iPackets ? EFalse : ETrue;
+        ++iDataChunkCount;
+
+        if(noMoreData)
+            {
+            // Throughput calculation
+            TBuf8<128> b(_L8("Body sent\n"));
+            Utils::CalculateThroughput(b, iStartTime, iSentBytes);
+
+            b.Append(_L("\n\n"));
+            iConsole.PrintNotify(b);
+
+            iPackets = 0;
+            iPacketSize = 0;
+            iSentBytes = 0;
+
+            return;
+            }
+
+        iSentBytes += iReqBodySubmitBufferPtr.Length();
+        iSocket.Write(iReqBodySubmitBufferPtr, iStatus); 
+        SetActive();
+        iWriteStatus = ESending;
+
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsWrite::DoFloodWrite()
+// Floods the data to the socket
+// ---------------------------------------------------------
+//
+void CSocketsWrite::DoFloodWrite()
+    {
+    //RDebug::Print(_L("ConnTest: CSocketsWrite::DoFloodWrite: %d"),iCount); // eats CPU
+    iTimer->Cancel(); // Cancel TimeOut timer
+    iWriteStatus = EWaiting;
+    if (iCount != iPackets)
+        {
+        if( iTransferBuffer->Length() > 0)
+            {
+            switch(iProtocol)
+                {
+                case KProtocolInetTcp:
+                    iSocket.Write(*iWriteBuffer, iStatus); // Initiate actual write
+                    break;
+
+                case KProtocolInetUdp:
+                    {
+                    TUint32* seqNumberPointer = (TUint32*)(iTransferBuffer->Des().Ptr());
+                    *seqNumberPointer = ByteOrder::Swap32( iCount ); // put sequence number into to the packet
+                    iSocket.SendTo(*iTransferBuffer, *iAddress, 0, iStatus);
+                    break;
+                    }
+                default:
+                    iConsole.ErrorNotify(_L("Unsupproted protocol\n\n"),KErrNotSupported );
+                    return;
+                }
+
+            iCount++;
+            iTimer->After(iTimeOut);
+            SetActive();
+            iWriteStatus = ESending;
+            }
+        }
+    else
+        {
+        iTransferBuffer->Des().Zero();
+        iWriteBuffer->Des().Zero();
+        iSendHandler.NotifySend(iPacketSize*iPackets);   
+        iFlood = EFalse;
+        iCount = 0;
+        iPackets = 0;
+        iPacketSize = 0; 	    
+        }
+    }
+
+// ---------------------------------------------------------
+// CSocketsWrite::TimerExpired()
+// Timeout, show error notification.
+// ---------------------------------------------------------
+//
+void CSocketsWrite::TimerExpired()
+    {
+    Cancel();
+    iWriteStatus = ECommsFailed;
+    iConsole.ErrorNotify(_L("Write operation timed out\n"), KErrTimedOut);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/TimeOutTimer.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2006 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: CTimeOutTimer is used to generate time out events
+*
+*/
+
+#include "TimeOutTimer.h"
+#include "TimeOutNotify.h"
+
+
+// ---------------------------------------------------------
+// CTimeOutTimer::NewL(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CTimeOutTimer* CTimeOutTimer::NewL(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
+{
+    CTimeOutTimer* self = CTimeOutTimer::NewLC(aPriority, aTimeOutNotify);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+
+// ---------------------------------------------------------
+// CTimeOutTimer::NewLC(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+CTimeOutTimer* CTimeOutTimer::NewLC(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
+{
+    CTimeOutTimer* self = new (ELeave) CTimeOutTimer(aPriority, aTimeOutNotify);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+// ---------------------------------------------------------
+// CTimeOutTimer::CTimeOutTimer(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
+// Constructor
+// ---------------------------------------------------------
+//
+CTimeOutTimer::CTimeOutTimer(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
+: CTimer(aPriority), iNotify(aTimeOutNotify)
+{
+}
+
+// ---------------------------------------------------------
+// CTimeOutTimer::~CTimeOutTimer()
+// Destructor
+// ---------------------------------------------------------
+//
+CTimeOutTimer::~CTimeOutTimer()
+{
+    Cancel();
+}
+
+// ---------------------------------------------------------
+// CTimeOutTimer::ConstructL()
+// EPOC two-phased constructor
+// ---------------------------------------------------------
+//
+void CTimeOutTimer::ConstructL()
+{
+    CTimer::ConstructL();
+    CActiveScheduler::Add(this);
+}
+
+// ---------------------------------------------------------
+// CTimeOutTimer::RunL()
+// Timer event has been generated and timer request completed.
+// ---------------------------------------------------------
+//
+void CTimeOutTimer::RunL()
+{
+    // Timer request has completed, so notify the timer's owner
+    iNotify.TimerExpired();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/alractiveobject.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2006-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: conntest application
+*
+*/
+
+/**
+@file alractiveobject.cpp
+ALR application active object.
+*/
+
+// INCLUDE FILES
+#include <e32cons.h>
+#include <comms-infras/mobilitymessagesecom.h>
+#include <mobilitymessages.h>
+#include "alractiveobject.h"
+#include "uinotify.h"
+
+using namespace ESock;
+
+const TInt KCommsMobilityMaxMsgLength = 256;  //Max mobility message size is much less than that
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::NewL
+// -----------------------------------------------------------------------------
+//
+CALRActiveObject* CALRActiveObject::NewL(
+            MUINotify& aConsole, 
+            MMobilityProtocolResp* aApplication)
+    {
+    CALRActiveObject* self =
+        new ( ELeave ) CALRActiveObject(aConsole, aApplication);
+    CleanupStack::PushL( self );
+    self->ConstructL(aConsole);
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::ConstructL(MUINotify& /*aConsole*/)
+    {
+    iResponseBuf.CreateL( KCommsMobilityMaxMsgLength );
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::CALRActiveObject
+// -----------------------------------------------------------------------------
+//
+CALRActiveObject::CALRActiveObject(MUINotify& aConsole, MMobilityProtocolResp* aApplication ) 
+    : CActive( CActive::EPriorityStandard ),
+    iConsole(aConsole), iApplication(aApplication)
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::~CALRActiveObject
+// -----------------------------------------------------------------------------
+//
+CALRActiveObject::~CALRActiveObject()
+    {
+    Cancel();
+	iExtApi.Close();
+	iResponseBuf.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::OpenL
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::OpenL( RCommsSubSession& aExtensionProvider )
+    {
+    User::LeaveIfError( iExtApi.Open( aExtensionProvider ) );
+    
+    //iConsole.PrintNotify(_L("\r\nRegister for mobility notification "));
+
+    iExtApi.RegisterForMobilityNotification( iResponseBuf, iStatus );
+    
+    //iConsole.PrintNotify(_L("\r\nRegistration successful "));
+
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::MigrateToPreferredCarrier
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::MigrateToPreferredCarrier()
+	{
+	iExtApi.MigrateToPreferredCarrier();
+	}
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::IgnorePreferredCarrier
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::IgnorePreferredCarrier()
+	{
+    iExtApi.IgnorePreferredCarrier();
+	}
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::NewCarrierAccepted
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::NewCarrierAccepted()
+	{
+    iExtApi.NewCarrierAccepted();
+	}
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::NewCarrierRejected
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::NewCarrierRejected()
+	{
+    iExtApi.NewCarrierRejected();
+	}
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::RunL
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::RunL()
+    {
+    if( iStatus != KErrNone )
+        { 
+      //  iConsole.Printf(_L("\niStatus: %i\n"), iStatus.Int() );
+        iApplication->Error( iStatus.Int() );
+//          virtual void Error(TInt aError) = 0;
+
+        return;
+        }
+
+	//iConsole.PrintNotify(_L("\r\nReceived notification"));
+    CCommsApiExtensionMsg* msg = CCommsApiExtensionMsg::NewL( iResponseBuf );
+
+    //check types
+    STypeId preferredCarrierAvailableTID  = STypeId::CreateSTypeId( ESock::KMobilityMessagesImplementationUid, ESock::EPreferredCarrierAvailable );
+    STypeId newCarrierActiveTID = STypeId::CreateSTypeId( ESock::KMobilityMessagesImplementationUid, ESock::ENewCarrierActive );
+    
+    if (msg->IsTypeOf(preferredCarrierAvailableTID))
+        {
+        CPreferredCarrierAvailable& pca = reinterpret_cast<CPreferredCarrierAvailable&>( *msg );
+        iApplication->PreferredCarrierAvailable( pca.OldAPInfo(),
+                                                pca.NewAPInfo(),
+                                                pca.IsUpgrade(),
+                                                pca.IsSeamless() );         
+//        virtual void PreferredCarrierAvailable(TAccessPointInfo aOldAP, TAccessPointInfo aNewAP, TBool aIsUpgrade, TBool aIsSeamless) = 0;
+
+        //MigrateToPreferredCarrier();
+        }
+    else if (msg->IsTypeOf(newCarrierActiveTID))
+        {
+        CNewCarrierActive& nca = reinterpret_cast<CNewCarrierActive&>( *msg );
+        iApplication->NewCarrierActive( nca.NewAPInfo(), nca.IsSeamless() );
+//        virtual void NewCarrierActive(TAccessPointInfo aNewAP, TBool aIsSeamless) = 0;
+      	//NewCarrierAccepted();
+        }
+  
+    delete msg;
+
+    iExtApi.RegisterForMobilityNotification( iResponseBuf, iStatus );
+
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CALRActiveObject::DoCancel()
+    {
+    iExtApi.CancelMobilityNotification();
+    }
+
+// -----------------------------------------------------------------------------
+// CALRActiveObject::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CALRActiveObject::RunError(TInt aError)
+    {
+    //The notification has not been sent to the client because of KErrNoMemory
+    //We may need to provide an inplace construction for the messages to exclude this possibility.
+    return aError;
+    }
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/Engine/ipdumpengine.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,167 @@
+/*
+* Copyright (c) 2006 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: CIpdumpEngine is used to control the ip logging protocol
+*
+*/
+
+#include <f32file.h>
+#include <nifman.h>
+#include "ipdumpengine.h"
+
+
+//
+// CIpdumpEngine.
+//
+
+CIpdumpEngine* CIpdumpEngine::NewL()
+{
+    CIpdumpEngine* self = new (ELeave) CIpdumpEngine();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+CIpdumpEngine::CIpdumpEngine()
+: iLoggingEnabled(EFalse)
+{
+    // If changed change the filename also
+    // in the ip logging protocol to match
+    _LIT(KLogFilePath, "c:\\logs\\tcpdump\\probe.cap"); 
+    iLogFileName.Append(KLogFilePath);
+}
+
+// This is to get around of the restrictions of the secure file system,
+// when the conntest and the probe are installed from a sis
+// You cannot install the esk to the right place directly, so copy it here
+// Requires all files capability
+_LIT(KIpDumpEskImport, "\\private\\101f7989\\import\\esock\\ip.probe.esk");
+_LIT(KIpDumpEskEsock, "\\private\\101f7989\\esock\\ip.probe.esk");
+
+void AttemptToCopyEskFile()
+	{
+	RFs fs;
+	TInt err = fs.Connect();
+
+	if (err)
+		{
+		return;
+		}
+
+	CFileMan* fileman = NULL;
+	TRAP(err, fileman = CFileMan::NewL(fs));
+
+	if (err)
+		{
+		fs.Close();
+		return;
+		}
+
+	(void)fileman->Copy(KIpDumpEskImport, KIpDumpEskEsock, CFileMan::ERecurse);
+
+	delete fileman;
+	fs.Close();
+	}
+
+void CIpdumpEngine::ConstructL()
+{
+	AttemptToCopyEskFile();
+}
+
+
+CIpdumpEngine::~CIpdumpEngine()
+{
+    DisableLogging();
+}
+
+
+
+TInt CIpdumpEngine::CreateLogDirectory()
+{
+
+    RFs fs;
+    TInt r;
+    
+    r = fs.Connect();
+    
+    if(r==KErrNone)
+    {
+        
+        // Delete the old log file. After disabling the logging the file
+        // is in use for short period of time, therefore doing the deletion
+        // in loop to avoid error message in UI.
+        while((r = fs.Delete(iLogFileName)) == KErrInUse)
+        	User::After(1);
+        
+        if(r == KErrNotFound || r == KErrPathNotFound)
+        {
+            r = fs.MkDirAll(iLogFileName);
+            r = (r==KErrAlreadyExists) ? KErrNone : r;
+        }
+    }
+    
+    fs.Close();
+    return r;
+}
+
+
+
+
+void CIpdumpEngine::EnableLoggingL()
+{
+    
+    if(iLoggingEnabled)
+    {
+        return;
+    }
+    
+    User::LeaveIfError(CreateLogDirectory());
+    
+    User::LeaveIfError(iSocketServ.Connect());    
+    
+    TProtocolDesc protocol;
+    TProtocolName name(_S("probe"));
+        
+    User::LeaveIfError(iSocketServ.FindProtocol(name, protocol));
+    
+    User::LeaveIfError(iSocket.Open(iSocketServ, name));
+        
+    iLoggingEnabled = ETrue;
+    
+    return;
+}
+
+void CIpdumpEngine::DisableLogging()
+{
+    if(iLoggingEnabled)
+    {
+        iSocket.Close();
+        iSocketServ.Close();
+        
+        iLoggingEnabled = EFalse;
+    }
+}
+
+TBool CIpdumpEngine::LoggingEnabled() const
+{
+    
+    return iLoggingEnabled;
+}
+
+const TDesC& CIpdumpEngine::LogFileName() const
+{
+       return iLogFileName;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/aif/ConnTestaif.rss	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2006 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: Resource file to create the ConnTest aif file
+*
+*/
+
+#include <aiftool.rh>
+
+RESOURCE AIF_DATA
+    {
+    app_uid=0x101F6D2B;
+    num_icons=2;
+    embeddability=KAppNotEmbeddable;
+    //newfile=KAppDoesNotSupportNewFile;
+    newfile=KAppSupportsNewFile;
+    }
+
+// End of File
Binary file nettools/conntest/aif/context_pane_icon.bmp has changed
Binary file nettools/conntest/aif/context_pane_icon_mask.bmp has changed
Binary file nettools/conntest/aif/list_icon.bmp has changed
Binary file nettools/conntest/aif/list_icon_mask.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/data/ConnTest.rss	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,1109 @@
+/*
+* Copyright (c) 2006 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: The resource for ConnTest
+*
+*/
+
+//  RESOURCE IDENTIFIER
+NAME    AWIZ // 4 letter ID
+
+//  INCLUDES
+#include <eikon.rh>
+#include "ConnTest.rh"
+#include "conntest.hrh"
+#include "conntest.loc"
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <avkon.mbg>
+#include <appinfo.rh>
+
+#include <data_caging_paths_strings.hrh>
+
+//  CONSTANTS  
+
+// for Text Setting Page
+#define TEXT_SETTING_PAGE_NUMBER 1
+#define TEXT_SETTING_PAGE_WIDTH 9
+#define TEXT_SETTING_PAGE_LINES 5
+#define TEXT_SETTING_PAGE_MAXLENGTH   50
+
+
+//  MACROS  
+//#define ?macro
+
+
+//  RESOURCE DEFINITIONS 
+
+RESOURCE RSS_SIGNATURE { }
+
+RESOURCE TBUF { buf="\\private\\101F6D2B\\ConnTest"; }
+
+RESOURCE EIK_APP_INFO
+    {
+    status_pane = r_conntest_status_pane;
+    }
+
+//----------------------------------------------------
+//   
+//    r_conntest_hotkeys
+//    ?description
+//
+//----------------------------------------------------
+//
+RESOURCE HOTKEYS r_conntest_hotkeys
+    {
+    control=
+        {
+        HOTKEY { command=EAknCmdExit; key='e'; }
+        };
+    }
+
+//----------------------------------------------------
+//   
+//    r_conntest_view1
+//    ?description
+//
+//----------------------------------------------------
+//
+RESOURCE AVKON_VIEW r_conntest_view1
+    {
+    hotkeys=r_conntest_hotkeys;
+    menubar=r_conntest_menubar_view1;  
+    //cba=R_AVKON_SOFTKEYS_SELECTION_LIST;    
+    cba=R_AVKON_SOFTKEYS_OPTIONS_EXIT;    
+    }
+    
+
+//----------------------------------------------------
+//   
+//    r_conntest_menubar_view1
+//    ?description
+//
+//----------------------------------------------------
+//
+RESOURCE MENU_BAR r_conntest_menubar_view1
+    {
+    titles=
+        {
+        MENU_TITLE { menu_pane=r_conntest_app_menu; txt="App"; },
+        MENU_TITLE { menu_pane=r_conntest_view1_menu; txt="View"; }
+        };
+    }
+
+//----------------------------------------------------
+//   
+//    r_conntest_view1_menu
+//    ?description
+//
+//----------------------------------------------------
+//
+RESOURCE MENU_PANE r_conntest_view1_menu
+    {
+    items=
+        {
+        MENU_ITEM { command=EConnTestCmdMigrate; txt = "Migrate"; },
+        
+        MENU_ITEM { command=EConnTestCmdIgnore; txt = "Ignore"; },
+        
+        MENU_ITEM { command=EConnTestCmdAccept; txt = "Accept"; },
+        
+        MENU_ITEM { command=EConnTestCmdReject; txt = "Reject"; },
+
+        MENU_ITEM { command=EConnTestCmdCancel; txt = "Cancel"; },
+
+        MENU_ITEM { command=EConnTestCmdStartInterface; txt = "Start interface";},
+        
+        MENU_ITEM { command=EConnTestCmdStopInterface; txt = "Stop interface"; },
+
+        MENU_ITEM { command=EConnTestCmdStartInternet; txt = "Start Internet";},        
+
+        MENU_ITEM { command=EConnTestCmdConnect; txt = "Connect"; },
+
+		MENU_ITEM { command=EConnTestCmdListen; txt = "Listen"; },
+
+		MENU_ITEM { command=EConnTestCmdDisconnect; txt = "Disconnect"; },
+
+        MENU_ITEM { command = EConnTestCmdClearOutputWindow; txt = "Clear output"; },
+
+		MENU_ITEM { command=EConnTestCmdSendRawData; txt = "Send";
+		            cascade=r_conntest_sub_menu_send; },
+		            
+        MENU_ITEM { command=EConnTestWlanDir; txt = "WLAN"; cascade=r_conntest_sub_menu_wlan;},
+        
+		MENU_ITEM { command=EConnTestCmdConnectionInfo; txt = "Info"; 
+		            cascade=r_conntest_sub_menu_info;},
+
+		MENU_ITEM { command=EConnTestCmdHttpFrameworkGet; txt = "HTTP framework";
+                    cascade=r_conntest_sub_menu_http_fw; },
+
+		MENU_ITEM { command=EConnTestCmdAdvanced; txt = "Advanced"; 
+		            cascade=r_conntest_sub_menu_advanced;},
+
+		MENU_ITEM {	command = EConnTestCmdIpLog; txt = "IP packet logging";
+			        cascade=r_conntest_sub_menu_ipdump;},
+		            
+        MENU_ITEM { command=EConnTestCmdSettings; txt = "Settings"; }
+        };
+    }
+
+RESOURCE MENU_PANE r_conntest_sub_menu_wlan
+    {
+    items=
+        {
+        MENU_ITEM { command=EConnTestWlanAvailableIaps; txt = "Available IAPs"; },
+        
+        MENU_ITEM { command=EConnTestWlanScan; txt = "Scan"; },
+        
+        MENU_ITEM { command=EConnTestWlanGetSsid; txt = "Get SSID"; },
+        
+        MENU_ITEM { command=EConnTestWlanGetBssid; txt = "Get BSSID"; },
+        
+        MENU_ITEM { command=EConnTestWlanGetRssi; txt = "Get RSSI"; },
+        
+        MENU_ITEM { command=EConnTestWlanGetConnMode; txt = "Get Mode"; },
+        
+		MENU_ITEM { command=EConnTestWlanGetSecurityMode; txt = "Get Security"; }
+        };
+    }
+
+
+
+RESOURCE MENU_PANE r_conntest_sub_menu_info
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdConnectionInfo;
+            txt = "Connection info";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdInterfaceInfo;
+            txt = "Interface info";
+            }
+        };
+    }
+
+RESOURCE MENU_PANE r_conntest_sub_menu_advanced
+    {
+    items=
+        {
+        MENU_ITEM
+            {
+            command=EConnTestCmdStartSnap;
+            txt = "Start Snap";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdStartInterfaceNoPrefs;
+            txt = "Start, no prefs";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdSetCustomPrefs;
+            txt = "Set custom prefs";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdStartInterfaceExtConnPrefs;
+            txt = "Start, custom prefs";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdStartForClose;
+            txt = "Start, test Close";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdCloseInterface;
+            txt = "RConnection::Close";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdConnectionPrefsIap;
+            txt = "ConnPrefs IapId";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdClearOutputWindow;
+            txt = "Timeouts";
+			cascade=r_conntest_sub_menu_timeout;
+			flags = EEikMenuItemSeparatorAfter;
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdWLANQoSVoice;
+            txt = "WLAN QoS";
+			cascade=r_conntest_sub_menu_wlanqos;
+			flags = EEikMenuItemSeparatorAfter;
+            },
+		MENU_ITEM
+			{
+			command = EConnTestCmdParallelGet;
+			txt = "Parallel GET";
+			}
+        };
+    }
+
+RESOURCE MENU_PANE r_conntest_sub_menu_ipdump
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdStartIpLog;
+            txt = "Start logging";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdStopIpLog;
+            txt = "Stop logging";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdSendIpLog;
+            txt = "Send log";
+            }
+        };
+    }
+
+
+RESOURCE MENU_PANE r_conntest_sub_menu_send
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdSendHttpGet;
+            txt = "HTTP GET";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdSendPerformanceHttpGet;
+            txt = "Performance GET";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdSendHttpPost;
+            txt = "Performance POST";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdSendRawData;
+            txt = "Raw data";
+            }
+        };
+    }
+
+RESOURCE MENU_PANE r_conntest_sub_menu_http_fw
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdHttpFrameworkGet;
+            txt = "HTTP Get";
+            },
+        //MENU_ITEM 
+        //    {
+        //    command = EConnTestCmdHttpFrameworkPost;
+        //    txt = "Post";
+        //    },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdHttpFrameworkSecureGet;
+            txt = "HTTPS Get";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdHttpFrameworkPerformanceGet;
+            txt = "Performance GET";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdHttpFrameworkPerformancePost;
+            txt = "Performance POST";
+            }
+        };
+    }
+
+RESOURCE MENU_PANE r_conntest_sub_menu_timeout
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdTimeoutLastSocketActivity;
+            txt = "LastSocketActivity";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdTimeoutLastSocketClosed;
+            txt = "LastSocketclosed";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdTimeoutLastSessionClosed;
+            txt = "LastSessionClosed";
+            }
+        };
+    }
+
+RESOURCE MENU_PANE r_conntest_sub_menu_wlanqos
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdWLANQoSVoice;
+            txt = "Voice";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdWLANQoSVideo;
+            txt = "Video";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdWLANQoSBestEffort;
+            txt = "Best Effort";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdWLANQoSBackground;
+            txt = "Background";
+            },
+        MENU_ITEM 
+            {
+            command = EConnTestCmdWLANQoSNone;
+            txt = "None";
+            }
+        };
+    }
+
+
+
+RESOURCE MENU_PANE r_conntest_sub_menu_qos
+    {
+    items=
+        {
+        MENU_ITEM 
+            {
+            command = EConnTestCmdQoS1;
+            txt = "Join";
+            }
+        };
+    }
+
+
+//----------------------------------------------------
+//   
+//    r_conntest_app_menu
+//    ?description
+//
+//----------------------------------------------------
+//
+RESOURCE MENU_PANE r_conntest_app_menu
+    {
+    items=
+        {
+        //MENU_ITEM { command=EAknCmdExit; txt = qtn_appl_option_item; },
+        MENU_ITEM { command=EAknCmdExit; txt="Exit"; }
+        };
+    }
+
+RESOURCE STATUS_PANE_APP_MODEL r_conntest_status_pane
+    {
+	panes=
+		{
+		SPANE_PANE
+			{
+			id = EEikStatusPaneUidNavi;
+			type = EAknCtNaviPane;
+			resource = r_conntest_navi_decorator;
+			}
+		};
+    }
+
+//----------------------------------------------------
+//   
+//    r_conntest_navi_decorator
+//    ?description
+//
+//----------------------------------------------------
+//
+RESOURCE NAVI_DECORATOR r_conntest_navi_decorator
+    {
+    type = ENaviDecoratorControlTabGroup;
+    control = TAB_GROUP
+		{
+		tab_width = EAknTabWidthWithFourTabs;  // four tabs
+		active = 0;
+		tabs = {
+			TAB
+				{
+                id = EConnTestView1Tab; // from application hrh
+                txt = "1";
+                },
+			TAB
+				{
+                id = EConnTestView2Tab; // from application hrh
+                txt = "2";
+                },
+			TAB
+				{
+                id = EConnTestView3Tab;
+                txt = "3";
+				},
+			TAB
+				{
+                id = EConnTestView4Tab;
+                txt = "4";
+				}
+			};
+		};
+	}
+
+//----------------------------------------------------
+//   
+//    r_conntest_custom_prefs_list
+//    Custom Preferences list
+//
+//----------------------------------------------------
+//
+RESOURCE AVKON_SETTING_ITEM_LIST r_conntest_custom_prefs_list
+  {
+  flags= EAknSettingItemNumberedStyle;
+  title = "custom_prefs";
+  initial_number = 1;
+  items =
+    {
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemSnapPurpose;
+      setting_page_resource = r_conntest_enumtext_setting_page;
+      associated_resource = r_conntest_snap_purpose_list;
+      name = "SnapPurpose";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemSnapId;
+      setting_page_resource = r_conntest_integer_setting_page;
+      name = "SnapId";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemIapId;
+      setting_page_resource = r_conntest_integer_setting_page;
+      name = "IapId";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemBearerSet;
+      setting_page_resource = r_conntest_enumtext_setting_page;
+      associated_resource = r_conntest_bearer_set_list;
+      name = "BearerSet";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemNoteBehaviour;
+      setting_page_resource = r_conntest_enumtext_setting_page;
+      associated_resource = r_conntest_note_behaviour_list;
+      name = "NoteBehaviour";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemConnSelectionDialog;
+      setting_page_resource = r_conntest_binary_switch_setting_page;
+      associated_resource = r_conntest_conn_selection_dialog_list;
+      name = "SelectionDialog";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemDisconnectDialog;
+      setting_page_resource = r_conntest_binary_switch_setting_page;
+      associated_resource = r_conntest_disconnect_dialog_list;
+      name = "DisconnectDialog";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestExtConnPrefsItemForcedRoaming;
+      setting_page_resource = r_conntest_binary_switch_setting_page;
+      associated_resource = r_conntest_forced_roaming_list;
+      name = "ForcedRoaming";
+      }
+    };
+  } 
+
+//----------------------------------------------------
+//   
+//    r_conntest_setting_list
+//    Setting list
+//
+//----------------------------------------------------
+//
+RESOURCE AVKON_SETTING_ITEM_LIST r_conntest_setting_list
+  {
+  flags= EAknSettingItemNumberedStyle;
+  title = "not_shown";
+  initial_number = 1;
+  items =
+    {
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestRoaming;
+      setting_page_resource = r_conntest_enumtext_setting_page;
+      associated_resource = r_conntest_roaming_setting_list;
+      name = "Roaming";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestIpAddress;
+      setting_page_resource = r_conntest_text_setting_page;
+      name = "IP address";
+      },
+	AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestPort;
+      setting_page_resource = r_conntest_integer_setting_page;
+      name = "Port";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestHttpPage;
+      setting_page_resource = r_conntest_text_setting_page;
+      name = "HTTP page";
+      },
+    AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestProtocol;
+      setting_page_resource = r_conntest_enumtext_setting_page;
+      associated_resource = r_conntest_protocol_setting_list;
+      name = "Protocol";
+      },
+	AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestPacketSize;
+      setting_page_resource = r_conntest_integer_setting_page;
+      name = "Packet size (<16384)";
+      },
+	AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestPackets;
+      setting_page_resource = r_conntest_integer_setting_page;
+      name = "Number of packets";
+      },
+	AVKON_SETTING_ITEM
+      {
+      identifier = EConnTestDelay;
+      setting_page_resource = r_conntest_integer_setting_page;
+      name = "Delay (ms)";
+      }
+    };
+  } 
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_snap_purpose_list
+    {
+    setting_texts_resource = r_conntest_snap_purpose_page_list;
+    popped_up_texts_resource = r_conntest_snap_purpose_list_item_array;
+    }
+
+RESOURCE ARRAY r_conntest_snap_purpose_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Unknown";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Internet";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 2;
+            text = "Operator";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 3;
+            text = "MMS";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 4;
+            text = "Intranet";
+            }
+        };
+    }
+
+RESOURCE ARRAY r_conntest_snap_purpose_list_item_array
+    {
+    items =
+        {
+        LBUF
+            {
+            txt = "Unknown";
+            },
+        LBUF
+            {
+            txt = "Internet";
+            },
+        LBUF
+            {
+            txt = "Operator";
+            },
+        LBUF
+            {
+            txt = "MMS";
+            },
+        LBUF
+            {
+            txt = "Intranet";
+            }
+        };
+    }
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_bearer_set_list
+    {
+    setting_texts_resource = r_conntest_bearer_set_page_list;
+    popped_up_texts_resource = r_conntest_bearer_set_list_item_array;
+    }
+
+RESOURCE ARRAY r_conntest_bearer_set_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Unknown";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Cellular";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 2;
+            text = "WLAN";
+            }
+        };
+    }
+
+RESOURCE ARRAY r_conntest_bearer_set_list_item_array
+    {
+    items =
+        {
+        LBUF
+            {
+            txt = "Unknown";
+            },
+        LBUF
+            {
+            txt = "Cellular";
+            },
+        LBUF
+            {
+            txt = "WLAN";
+            }
+        };
+    }
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_note_behaviour_list
+    {
+    setting_texts_resource = r_conntest_note_behaviour_page_list;
+    popped_up_texts_resource = r_conntest_note_behaviour_list_item_array;
+    }
+
+RESOURCE ARRAY r_conntest_note_behaviour_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Default";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Disable notes";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 2;
+            text = "Disable Queries";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 3;
+            text = "Silent";
+            }
+        };
+    }
+
+RESOURCE ARRAY r_conntest_note_behaviour_list_item_array
+    {
+    items =
+        {
+        LBUF
+            {
+            txt = "Default";
+            },
+        LBUF
+            {
+            txt = "Disable notes";
+            },
+        LBUF
+            {
+            txt = "Disable queries";
+            },
+        LBUF
+            {
+            txt = "Silent";
+            }
+        };
+    }
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_disconnect_dialog_list
+    {
+    setting_texts_resource = r_conntest_disconnect_dialog_page_list;
+    }
+
+RESOURCE ARRAY r_conntest_disconnect_dialog_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Disabled";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Enabled";
+            }
+        };
+    }
+
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_conn_selection_dialog_list
+    {
+    setting_texts_resource = r_conntest_conn_selection_dialog_page_list;
+    }
+
+RESOURCE ARRAY r_conntest_conn_selection_dialog_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Disabled";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Enabled";
+            }
+        };
+    }
+
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_forced_roaming_list
+    {
+    setting_texts_resource = r_conntest_forced_roaming_page_list;
+    }
+
+RESOURCE ARRAY r_conntest_forced_roaming_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Disabled";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Enabled";
+            }
+        };
+    }
+
+//----------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_roaming_setting_list
+    {
+    setting_texts_resource = r_conntest_roaming_page_list;
+    popped_up_texts_resource = r_conntest_roaming_list_item_array;
+    }
+
+RESOURCE ARRAY r_conntest_roaming_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "Off";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "Automatic";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 2;
+            text = "Manual";
+            }
+        };
+    }
+
+RESOURCE ARRAY r_conntest_roaming_list_item_array
+    {
+    items =
+        {
+        LBUF
+            {
+            txt = "Off";
+            },
+        LBUF
+            {
+            txt = "Automatic";
+            },
+        LBUF
+            {
+            txt = "Manual";
+            }
+        };
+    }
+
+//----------------------------------------------------------------------------
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_conntest_protocol_setting_list
+    {
+    setting_texts_resource = r_conntest_protocol_page_list;
+    popped_up_texts_resource = r_conntest_protocol_list_item_array;
+    }
+
+RESOURCE ARRAY r_conntest_protocol_page_list
+    {
+    items =
+        {
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 0;
+            text = "TCP";
+            },
+        AVKON_ENUMERATED_TEXT
+            {
+            value = 1;
+            text = "UDP";
+            }
+        };
+    }
+
+RESOURCE ARRAY r_conntest_protocol_list_item_array
+    {
+    items =
+        {
+        LBUF
+            {
+            txt = "TCP/IP";
+            },
+        LBUF
+            {
+            txt = "UDP/IP";
+            }
+        };
+    }
+
+
+//----------------------------------------------------------------------------
+//
+//    r_conntest_enumtext_setting_page
+//    Setting page for enumerations
+//
+//----------------------------------------------------------------------------
+//
+RESOURCE AVKON_SETTING_PAGE r_conntest_enumtext_setting_page
+    {   
+    number= 1;
+    label= qtn_conntest_enumtext_title;
+    type = EAknCtPopupSettingList;
+    editor_resource_id = r_conntest_popup_setting_list_new_entry;
+    }
+
+RESOURCE POPUP_SETTING_LIST r_conntest_popup_setting_list_new_entry
+    {
+    //flags = EAknPopupSettingListFlagAllowsUserDefinedEntry;
+    }
+
+//----------------------------------------------------------------------------
+//
+//    r_conntest_integer_setting_page
+//    Setting page for integers
+//
+//----------------------------------------------------------------------------
+//
+RESOURCE AVKON_SETTING_PAGE r_conntest_integer_setting_page
+  {
+  number = 1;
+  //label = "Port";
+  type = EAknCtIntegerEdwin;
+  editor_resource_id = r_conntest_integer;
+  }
+
+RESOURCE AVKON_INTEGER_EDWIN r_conntest_integer
+  {
+   min=0;
+  } 
+  
+
+//----------------------------------------------------------------------------
+//
+//    r_conntest_binary_switch_setting_page
+//    Setting page for binary values
+//
+//----------------------------------------------------------------------------
+//
+RESOURCE AVKON_SETTING_PAGE r_conntest_binary_switch_setting_page
+    {   
+    number= 1;
+    label= "Binary switch";
+    type = EAknCtPopupSettingList;
+    editor_resource_id = r_conntest_popup_setting_list_new_entry;
+    }
+
+//-----------------------------------------------------------------------------
+//
+//    r_conntest_text_setting_page
+//    Setting page for text
+//
+//-----------------------------------------------------------------------------
+//
+RESOURCE AVKON_SETTING_PAGE r_conntest_text_setting_page
+    {
+    number = 1;
+    type = EEikCtEdwin;
+    editor_resource_id = r_conntest_edwin;
+    }
+
+
+RESOURCE EDWIN r_conntest_edwin
+    {
+    width = TEXT_SETTING_PAGE_WIDTH ;
+    lines = TEXT_SETTING_PAGE_LINES;
+    maxlength = TEXT_SETTING_PAGE_MAXLENGTH;
+    }
+
+//-----------------------------------------------------------------------------
+//
+//    r_aknatquery_number_layout
+//    Resource of Number Query.
+//
+//-----------------------------------------------------------------------------
+//
+RESOURCE DIALOG r_conntest_number_layout
+    {
+    flags = EGeneralQueryFlags;
+    buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+    items =
+        {
+        DLG_LINE
+            {
+            type = EAknCtQuery;
+            id = EGeneralQuery;
+            control= AVKON_DATA_QUERY
+                {
+                layout = ENumberLayout;
+                label = qtn_aknatquery_num_label_text;
+                control = AVKON_INTEGER_EDWIN
+                    {
+                    min = -1;
+                    max = 1000000;
+                    };
+                };
+            }
+        };
+    }
+
+//-----------------------------------------------------------------------------
+//
+//    r_aknatquery_number_layout
+//    Resource of Number Query.
+//
+//-----------------------------------------------------------------------------
+//
+RESOURCE DIALOG r_conntest_parallel_number_layout
+    {
+    flags = EGeneralQueryFlags;
+    buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+    items =
+        {
+        DLG_LINE
+            {
+            type = EAknCtQuery;
+            id = EGeneralQuery;
+            control= AVKON_DATA_QUERY
+                {
+                layout = ENumberLayout;
+                label = qtn_aknatquery_num_label_text;
+                control = AVKON_INTEGER_EDWIN
+                    {
+                    min = 0;
+                    max = 4; // Max 4 parallel HTTP gets
+                    };
+                };
+            }
+        };
+    }
+
+// Add a new resource definition
+RESOURCE LOCALISABLE_APP_INFO r_conntest_localisable_app_info
+    {
+    short_caption = "ConnTest";
+    caption_and_icon = 
+    CAPTION_AND_ICON_INFO
+        {
+        caption = "ConnTest";
+        number_of_icons = 2;
+        icon_file = APP_BITMAP_DIR"\\ConnTest_aif.mbm";
+        };
+    }
+    
+        //icon_file = "Z:\\resource\\apps\\localisablefiles\\ConnTest_aif.mbm";
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/data/ConnTest_caption.rss	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2006 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: The caption resource for Conntest
+*
+*/
+
+#include "conntest.loc"
+#include <apcaptionfile.rh>
+
+RESOURCE CAPTION_DATA
+{
+    caption=qtn_app_caption_string;
+    shortcaption=qtn_app_short_caption_string;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/data/ConnTest_reg.rss	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2006 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: The registration resource for ConnTest
+*
+*/
+
+#include <appinfo.rh>
+#include <ConnTest.rsg>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 0x101F6D2B // application UID
+
+RESOURCE APP_REGISTRATION_INFO
+	{
+	app_file="ConnTest"; // filename of application binary (minus extension)
+    localisable_resource_file = "\\resource\\apps\\ConnTest";
+    localisable_resource_id = R_CONNTEST_LOCALISABLE_APP_INFO;
+    group_name = "RnD Tools";
+	}
+
+//    localisable_resource_file = "\\resource\\apps\\localisablefiles\\ConnTest";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/group/ConnTest.mmp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2006-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 the project specification file for ConnTest.
+*
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET  ConnTest.exe
+TARGETTYPE  exe
+EPOCSTACKSIZE 0x10000
+EPOCHEAPSIZE 0x2000 0x200000
+
+
+UID  0x100039CE 0x101F6D2B 
+
+//TARGETPATH /system/apps/ConnTest
+
+VENDORID    VID_DEFAULT
+CAPABILITY  LocalServices  NetworkServices  ReadUserData  UserEnvironment  WriteUserData  PowerMgmt  ProtServ  ReadDeviceData  TrustedUI  WriteDeviceData  NetworkControl  CommDD  AllFiles
+
+LANG              SC
+
+SOURCEPATH        ../src
+SOURCE            ConnTestApp.cpp 
+SOURCE            ConnTestAppUi.cpp
+SOURCE            ConnTestDocument.cpp
+SOURCE            ConnTestContainer.cpp
+SOURCE            ConnTestView.cpp
+SOURCE            SettingItemList.cpp
+SOURCE            SettingData.cpp
+SOURCE            CustomPrefsItemList.cpp
+SOURCE            CustomPrefsData.cpp
+SOURCE            Utils.cpp
+
+SOURCEPATH        ../Engine
+SOURCE            SocketsEngine.cpp
+SOURCE            SocketsWrite.cpp
+SOURCE            SocketsRead.cpp
+SOURCE            ProgressNotifier.cpp
+SOURCE            TimeOutTimer.cpp
+SOURCE            SendTimer.cpp
+SOURCE            HttpHandler.cpp
+SOURCE            ipdumpengine.cpp
+SOURCE            alractiveobject.cpp
+
+START RESOURCE ../data/ConnTest.rss
+HEADER
+TARGETPATH APP_RESOURCE_DIR
+LANG     SC
+END
+
+
+START RESOURCE ../data/ConnTest_reg.rss
+DEPENDS conntest.rsg
+// Do not change the UID below.
+TARGETPATH /private/10003a3f/apps
+END
+
+USERINCLUDE . ../inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY           apparc.lib
+LIBRARY           apgrfx.lib
+LIBRARY           avkon.lib
+LIBRARY           AknSkins.lib
+LIBRARY           aknnotify.lib
+LIBRARY           bafl.lib 
+LIBRARY           commdb.lib
+LIBRARY           cone.lib
+LIBRARY           ecom.lib
+LIBRARY           efsrv.lib
+LIBRARY           eikcoctl.lib
+LIBRARY           eikcore.lib
+LIBRARY           eikctl.lib
+LIBRARY           egul.lib
+LIBRARY           estor.lib
+LIBRARY           etext.lib
+LIBRARY           euser.lib 
+LIBRARY           gdi.lib
+LIBRARY           http.lib
+LIBRARY           inetprotutil.lib
+LIBRARY           insock.lib
+LIBRARY           esock.lib
+LIBRARY           ws32.lib
+LIBRARY           sendui.lib 
+LIBRARY           cmmanager.lib
+LIBRARY           netmeta.lib
+LIBRARY           extendedconnpref.lib
+LIBRARY           esock_api_ext.lib
+
+// For performance marks
+LIBRARY 		hal.lib
+
+
+START WINS      
+// ?wins_specific_information
+END
+
+START MARM
+// ?marm_specific_information
+END
+
+// Other possible keywords:
+/* 
+START BITMAP ?target
+TARGETPATH   ?emulated_path_on_target_machine
+HEADER
+SOURCEPATH   ?source_path
+SOURCE       ?color_depth ?source_bitmap_list
+END
+*/
+// DEFFILE ?filename
+
+//AIF ConnTest.aif ../aif ConnTestaif.rss c8 context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp list_icon_mask.bmp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/group/bld.inf	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2005-2008 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:  Build information file for project ConnTest
+*
+*/
+
+#include <platform_paths.hrh>
+#include "../probe/group/bld.inf"
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../rom/ConnTest.iby CORE_IBY_EXPORT_PATH(tools,ConnTest.iby)
+
+PRJ_MMPFILES
+ConnTest.mmp
+
+PRJ_EXTENSIONS
+START EXTENSION s60/mifconv
+OPTION TARGETFILE conntest_aif.mif
+OPTION SOURCEDIR ../aif
+OPTION SOURCES -c8,1 list_icon -c8,1 context_pane_icon
+END
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/group/ethernet.ini	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,4 @@
+ETHER_NIF=\Device\NPF_{72E8E9AF-E5F0-4098-A5E0-42592B0EABF7}
+ETHER_MAC=020d56797794
+
+ETHER_SPEED=100Mbps
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/group/icons_aif_bitmaps_dc.mk	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2004-2006 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 part of ConnTest.
+#
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=\epoc32\data\z
+endif
+
+# ----------------------------------------------------------------------------
+# Configuration
+# ----------------------------------------------------------------------------
+
+TARGETDIR=$(ZDIR)\RESOURCE\APPS
+ICONTARGETFILENAME=$(TARGETDIR)\conntest_aif.mbm
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+#
+# NOTE 1: DO NOT DEFINE MASK FILE NAMES! They are included automatically by
+# MifConv if the mask detph is defined.
+#
+# NOTE 2: Usually, source paths should not be included in the bitmap
+# definitions. MifConv searches for the icons in all icon directories in a
+# predefined order, which is currently \s60\icons, \s60\bitmaps2.
+# The directory \s60\icons is included in the search only if the feature flag
+# __SCALABLE_ICONS is defined.
+# ----------------------------------------------------------------------------
+
+RESOURCE :
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,1 ..\aif\list_icon.bmp \
+		/c8,1 ..\aif\context_pane_icon.bmp
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTest.pan	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2006 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: Defines the panics of the ConnTest
+*
+*/
+
+#ifndef __CONNTEST_PAN__
+#define __CONNTEST_PAN__
+
+#include <e32std.h>
+
+_LIT(KPanicConnTest, "ConnTest");
+_LIT(KPanicSocketsEngine, "SocketsEngine");
+_LIT(KPanicSocketsWrite, "SocketsWrite");
+
+/** ConnTest application panic codes */
+enum TConnTestPanics 
+    {
+    EConnTestBasicUi = 1,
+    EConnTestBadStatus,
+    EConnTestAppView,
+	EConnTestContainer,
+	EConnTestBadRoamingStatus
+    // add further panics here
+    };
+
+#endif // __CONNTEST_PAN__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTest.rh	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,20 @@
+/*
+* Copyright (c) 2005-2006 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: Resource header file
+*
+*/
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTestApp.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2006 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: The application class for ConnTest
+*
+*/
+
+#ifndef CONNTESTAPP_H
+#define CONNTESTAPP_H
+
+// INCLUDES
+#include <aknapp.h>
+
+// CONSTANTS
+// UID of the application
+const TUid KUidConnTest = { 0x101F6D2B };
+
+// CLASS DECLARATION
+
+/**
+* CConnTestApp application class.
+* Provides factory to create concrete document object.
+* 
+*/
+class CConnTestApp : public CAknApplication
+    {
+    
+    public: // Functions from base classes
+    private:
+
+        /**
+        * From CApaApplication, creates CConnTestDocument document object.
+        * @return A pointer to the created document object.
+        */
+        CApaDocument* CreateDocumentL();
+        
+        /**
+        * From CApaApplication, returns application's UID (KUidConnTest).
+        * @return The value of KUidConnTest.
+        */
+        TUid AppDllUid() const;
+    };
+
+#endif
+
+// End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTestAppUi.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,147 @@
+/*
+* Copyright (c) 2006 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: The application UI class for ConnTest
+*
+*/
+
+#ifndef CONNTESTAPPUI_H
+#define CONNTESTAPPUI_H
+
+// INCLUDES
+#include <eikapp.h>
+#include <eikdoc.h>
+#include <e32std.h>
+#include <coeccntx.h>
+#include <aknViewAppUi.h>
+#include <akntabgrp.h>
+#include <aknnavide.h>
+
+#include "conntest.hrh"
+
+// FORWARD DECLARATIONS
+class CConnTestContainer;
+class CConnTestView;
+class CAknWarningNote;
+class CIpdumpEngine;
+class CSendUi;
+class CSettingData;
+class CCustomPrefsData;
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+/**
+* Application UI class.
+* Provides support for the following features:
+* - EIKON control architecture
+* - view architecture
+* - status pane
+* 
+*/
+class CConnTestAppUi : public CAknViewAppUi
+{
+public: // // Constructors and destructor
+    
+    /**
+    * Symbian default constructor.
+    */      
+    void ConstructL();
+    
+    /**
+    * Constructor.
+    */      
+    CConnTestAppUi(
+        TFixedArray<CSettingData*, KConnTestViews>& aSettings,
+        TFixedArray<CCustomPrefsData*, KConnTestViews>& aCustomPrefs);
+    
+    /**
+    * Destructor.
+    */      
+    ~CConnTestAppUi();
+    
+public: // New functions
+    
+    /**
+    * Is the IP logging on
+    * @return the logging state, ETrue = logging, EFalse = not logging
+    */
+    TBool IsLogging();
+    
+public: // Functions from base classes
+    
+protected: //From CAknViewAppUi
+
+    /**
+    * Handles the status pane size changes
+    */
+    void HandleStatusPaneSizeChange(); 
+    
+private:
+    // From MEikMenuObserver
+    void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane);
+    
+private:
+    
+    /**
+    * From CEikAppUi, takes care of command handling.
+    * @param aCommand command to be handled
+    */
+    void HandleCommandL(TInt aCommand);
+    
+    /**
+    * From CEikAppUi, handles key events.
+    * @param aKeyEvent Event to handled.
+    * @param aType Type of the key event. 
+    * @return Response code (EKeyWasConsumed, EKeyWasNotConsumed). 
+    */
+    virtual TKeyResponse HandleKeyEventL(
+        const TKeyEvent& aKeyEvent,TEventCode aType);
+
+private: // new methods
+	/**
+	* ParallelGet initiates HTTP Get over socket for every view
+	* @param amount of gets if possible
+	*/
+    void ParallelGetL(TInt aCount);
+    
+    /**
+    * Launches a CSendUi for the log file
+    */
+    void SendLogFileL();    
+    
+    /**
+    * Starts the ip packet logging
+    */
+    void StartIpLoggingL();
+    
+    /**
+    * Stops the ip packet logging
+    */
+    void StopIpLoggingL();
+    
+private: //Data
+	RPointerArray<CConnTestView>	iConnTestViews; // just for parallel get
+    CAknNavigationControlContainer* iNaviPane;
+    CAknTabGroup*                   iTabGroup;
+    CAknNavigationDecorator*        iDecoratedTabGroup;
+    TFixedArray<CSettingData*, KConnTestViews>&  iSettingDataArray;
+    TFixedArray<CCustomPrefsData*, KConnTestViews>&  iCustomPrefsDataArray;
+    CAknWarningNote* iWarningDialog; // notice, currently used: ->ExecuteLD, so deleted automatically
+    CIpdumpEngine* iIpdumpEngine; // Only 1 dump engine/app, thus appui owns it
+    CSendUi* iSendUi; // For sending the log
+};
+
+#endif
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTestContainer.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,159 @@
+/*
+* Copyright (c) 2006 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: The container class for ConnTest
+* Shows status line and notification text editor
+*
+*/
+
+#ifndef CONNTESTCONTAINER_H
+#define CONNTESTCONTAINER_H
+
+// INCLUDES
+#include <coecntrl.h>
+#include "uinotify.h"
+
+
+// FORWARD DECLARATIONS
+class CRichText;
+class CParaFormatLayer;
+class CCharFormatLayer;
+class CEikRichTextEditor;
+class CEikLabel;
+
+
+// CLASS DECLARATION
+
+/**
+*  CConnTestContainer  container control class.
+*  
+*/
+class CConnTestContainer : public CCoeControl, public MCoeControlObserver, public MUINotify
+{
+public: // Constructors and destructor
+    
+    /**
+    * EPOC default constructor.
+    * @param aRect Frame rectangle for container.
+    */
+    void ConstructL(const TRect& aRect);
+    
+    /**
+    * Destructor.
+    */
+    ~CConnTestContainer();
+    
+public: // New functions
+    
+    /**
+    * Clear the output window.
+    */
+    void ClearOutputWindow();
+    
+public: // Functions from base classes
+    
+    // From MUINotify
+
+    /**
+    * Display text on output window
+    * @param aDes text to display
+    * @param aFontStyle style (italic/bold/etc) for this text
+    */
+    void PrintNotify(const TDesC& aDes, TUint aFontStyle = 0);
+    void PrintNotify(const TDesC8& aDes, TUint aFontStyle = 0);
+    
+    /**
+    * Display integer as text on output window
+    * @param aInt integer to display
+    */
+    void PrintNotify(TInt aInt);
+    
+    /**
+    * Notify user of an error
+    * @param aErrMessage message associated with error
+    * @param aErrCode error code
+    */
+    void ErrorNotify(const TDesC& aErrMessage, TInt aErrCode);
+
+    /**
+    * Notify user with a message
+    * @param aMessage message associated with error
+    */
+    void CConnTestContainer::PopupNotify(const TDesC& aMessage);
+    
+    /**
+    * Change 'status' display.
+    * @param aStatus new status text to display
+    */
+    void SetStatus(const TDesC& aStatus);
+        
+private: // Functions from base classes
+    
+    /**
+    * From CoeControl. Calls SizeChangedL with TRAP.
+    */
+    void SizeChanged();  
+    
+    /**
+    * From CoeControl.
+    */
+    TInt CountComponentControls() const;
+    
+    /**
+    * From CCoeControl.
+    */
+    CCoeControl* ComponentControl(TInt aIndex) const;
+    
+    /**
+    * Event handling section, e.g Listbox events.
+    */
+    void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType);
+
+    /**
+    * From CCoeControl,Draw.
+    */
+    void Draw(const TRect& aRect) const;
+    
+    /**
+    * Key event handler. Handles up and down arrow keys, so that
+    * output window can be scrolled.
+    */
+    TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
+    
+    /**
+    * Change font style for subsequent text
+    * @param aFontStyle new font style
+    */
+    void SetFontStyle(TUint aFontStyle);
+    
+    /**
+    * Set or clear an individual font attribute if necessary,
+    * so that it matches the required style
+    * @param aFontStyle required font style
+    * @param aAttribute the individual attribute to correct
+    */
+    void UpdateFontAttribute(TUint aFontStyle, TInt aAttribute);
+    
+    
+private: //data
+    CParaFormatLayer*   iParaFormat;   // Used by CEikRichTextEditor 
+    CCharFormatLayer*   iCharFormat;   // Used by CEikRichTextEditor 
+    CRichText*          iRichText;     // Used by CEikRichTextEditor 
+    CEikRichTextEditor* iOutputWindow; // CRichText object for use as our output window
+    CEikLabel*          iStatusWindow; // Single line of text to display connection status
+    TUint               iFontStyle;    // Current style in use by output window
+    };
+    
+#endif
+    
+    // End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTestDocument.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2006 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: The document class for ConnTest, stores the settings
+*
+*/
+
+#ifndef CONNTESTDOCUMENT_H
+#define CONNTESTDOCUMENT_H
+
+// INCLUDES
+#include <AknDoc.h>
+
+#include "conntest.hrh"
+
+// CONSTANTS
+
+// FORWARD DECLARATIONS
+class CEikAppUi;
+class CSettingData;
+class CCustomPrefsData;
+
+// CLASS DECLARATION
+
+/**
+*  CConnTestDocument document class.
+*  Note! Base class is CEikDocument, because CAknDocument does
+*  not provide support for storing persistent data into file.
+*/
+class CConnTestDocument : public CEikDocument
+{
+public: // Constructors and destructor
+    
+    /**
+    * Two-phased constructor.
+    */
+    static CConnTestDocument* NewL(CEikApplication& aApp);
+    
+    /**
+    * Destructor.
+    */
+    virtual ~CConnTestDocument();
+        
+protected:  // Functions from base classes
+    
+    /**
+    * Store current connection settings to file. Uses default file name,
+    * which is \\private\\101F6D2B\\ConnTest.
+    */
+    void StoreL(CStreamStore& aStore, CStreamDictionary& aStreamDic) const;
+    
+    /**
+    * Read previous connection settings from file.
+    */
+    void RestoreL(const CStreamStore& aStore, const CStreamDictionary& aStreamDic);
+    
+private:
+    
+    /**
+    * Symbian default constructor.
+    */
+    CConnTestDocument(CEikApplication& aApp);
+    void ConstructL();
+    
+private:
+    
+    /**
+    * From CEikDocument, create CConnTestAppUi "App UI" object.
+    */
+    CEikAppUi* CreateAppUiL();
+    
+private: // Data
+    TFixedArray<CSettingData*, KConnTestViews> iSettingDataArray;
+    TFixedArray<CCustomPrefsData*, KConnTestViews> iCustomPrefsDataArray;
+
+};
+
+#endif
+
+// End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ConnTestView.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,218 @@
+/*
+* Copyright (c) 2006 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: The view class for ConnTest
+* Implements command handling, menu initializing and view activation
+*
+*/
+
+#ifndef CONNTESTVIEW_H
+#define CONNTESTVIEW_H
+
+// INCLUDES
+#include <aknview.h>
+#include "conntest.hrh"
+#include <wlanmgmtclient.h>
+
+// CONSTANTS
+
+// FORWARD DECLARATIONS
+class CSocketsEngine;
+class CConnTestContainer;
+class CSettingItemList;
+class CSettingData;
+class CCustomPrefsItemList;
+class CCustomPrefsData;
+class CWlanScanInfo;
+class CConnTestView;
+
+// CLASS DECLARATION
+
+enum TConnTestWaitType
+    {
+    EConnTestWaitTypeAvailableIaps,
+    EConnTestWaitTypeScan
+    };
+
+class CWlanMgmtClient;
+
+class CConnTestViewWaiter : public CActive
+    {
+    public:
+        CConnTestViewWaiter( CWlanMgmtClient* aWlanMgmtClient, CConnTestView& aCallback, TConnTestWaitType aType );
+        void ConstructL();
+        virtual ~CConnTestViewWaiter();
+        
+        void IssueRequest();
+        void RunL();
+        TInt RunError( TInt aError );
+        void DoCancel();
+
+    private:
+        TConnTestWaitType iType;
+        CConnTestView& iCallback;
+        CWlanMgmtClient* iMgmtClient;
+        RArray<TUint> iAvailableIaps;
+        CWlanScanInfo* iScanInfo;
+    };
+
+/**
+*  CConnTestView view class.
+* 
+*/
+class CConnTestView : public CAknView, public MWlanMgmtNotifications
+{
+public: // Constructors and destructor
+    
+    /**
+    * Symbian default constructor.
+    */
+    void ConstructL();
+    
+    /**
+    * Constructor
+    * @aViewId Id for this view
+    */
+    CConnTestView(const TUid aViewId);
+
+    /**
+    * Constructor
+    * @aViewId Id for this view
+    * @aSettings Connection settings for the socket engine of this view
+    */
+    CConnTestView(const TUid aViewId, CSettingData* aSettings, CCustomPrefsData* aCustomPrefs);
+
+    /**
+    * Destructor.
+    */
+    ~CConnTestView();
+    
+public: // New functions
+    
+     /**
+    * Returns if the iSocketsEngine has an open connection
+    * to be used in HTTP GET
+    */
+    TBool IsReadyForHTTPGet();
+    
+    /**
+    * Handles the view size changes
+    */
+    void SizeChanged();
+       
+    void RequestCompleted( TInt aStatus, RArray<TUint>& aAvailableIaps );
+    
+    void RequestCompleted( TInt aStatus, CWlanScanInfo& aScanInfo );
+
+public: // Functions from base classes
+    
+    /**
+    * From CAknView
+    */
+    TUid Id() const;
+    
+    /**
+    * From CAknView
+    */
+    void HandleCommandL(TInt aCommand);
+    
+    /**
+    * From ?base_class ?member_description
+    */
+    void HandleClientRectChange();
+
+private: // new
+
+    //
+    // WlanMgmtClient notifications
+    //
+    //
+    void ConnectionStateChanged( TWlanConnectionMode /* aNewState */ );
+    void BssidChanged( TWlanBssid& /* aNewBSSID */ );
+    void BssLost();
+    void BssRegained();
+    void NewNetworksDetected();
+    void OldNetworksLost();
+    void TransmitPowerChanged( TUint /* aPower */ );
+    void RssChanged(
+        TWlanRssClass aRssClass,
+        TUint aRss );
+
+    /**
+    * Method for sending data over connected socket. 
+    */
+    void SendDataL();
+
+private:
+    
+    /**
+    * From CAknView
+    */
+    void DoActivateL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId,
+        const TDesC8& aCustomMessage);
+    
+    /**
+    * From CAknView
+    */
+    void DoDeactivate();
+   
+    /**
+    * Adjusts the visible items in menu pane accordding to
+    * socket engine state.
+    * @aResourceId Resource ID identifying the menu pane to initialise
+    * @aMenuPane The in-memory representation of the menu pane
+    */
+    void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane);
+    
+    /**
+    * Swaps container window between the main window and settings list.
+    * @param aActiveContainer Becomes container
+    */
+    void SwapContainerL(TConnTestContainer aActiveContainer);
+    
+    /**
+    * Creates settings item list
+    * @param aResourceId for ListBox initialization
+    */
+    void CreateSettingsListBoxL(TInt aResourceId);
+    
+    /**
+    * Creates Custom Preferences item list
+    * @param aResourceId for ListBox initialization
+    */
+    void CreateCustomPrefsListBoxL(TInt aResourceId);
+    
+    /**
+    * Create the data packet that is sent over connected socket.
+    * Packet size can be set in settings page.
+    */
+    void CreateDataPacket();    
+
+private: // Data
+    TUid                    iViewId;
+    CConnTestContainer*     iContainer;   
+    CSocketsEngine*         iSocketsEngine;    
+    CSettingItemList*       iSettingsListBox;
+    CSettingData*           iSettingData;
+    CCustomPrefsItemList*   iCustomPrefsListBox;
+    CCustomPrefsData*       iCustomPrefsData;
+    TConnTestContainer      iActiveContainer;
+    HBufC8*                 iSendData;
+    TBool                   iSupportsWlan;
+    CConnTestViewWaiter*    iWaiter;
+    CWlanMgmtClient*        iWlanMgmtClient;
+};
+
+#endif
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/CustomPrefsData.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2006 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: CSettingsData stores the settings for ConnTest
+ *
+ */
+
+#ifndef CUSTOMPREFSDATA_H
+#define CUSTOMPREFSDATA_H
+
+// INCLUDES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+
+/**
+ * Class for encapsulating Custom Preferences data.
+ */
+class CCustomPrefsData : public CBase
+    {
+public:
+    static CCustomPrefsData* NewL();
+    ~CCustomPrefsData();
+
+private:
+    CCustomPrefsData();
+    void ConstructL();
+
+public:
+    /** SNAP purpose. */
+    // CMManager::TSnapPurpose iSnapPurpose;
+    TInt iSnapPurpose;
+    /** SNAP id. */
+    TInt iSnapId;
+    /** IAP id. */
+    TInt iIapId;
+    /** Bearer set. */
+    TInt iBearerSet;
+    /** UI behaviour. */
+    // TUint32 iUiBehaviour;
+    TInt iNoteBehaviour;
+    /** Indicates whether UI disconnect dialog is shown. */
+    TBool iDisconnectDialog;
+    /** Indicates whether UI connection selection dialog is shown. */
+    TBool iConnSelectionDialog;
+    /** Indicates whether forced roaming is enabled. */
+    TBool iForcedRoaming;
+    };
+
+#endif
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/CustomPrefsItemList.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2006 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: CSettingItemList implemets the settings list for Conntest
+ *
+ */
+
+#ifndef CUSTOMPREFSITEMLIST_H
+#define CUSTOMPREFSITEMLIST_H
+
+// INCLUDES
+#include <aknsettingitemlist.h>
+
+// FORWARD DECLARATIONS
+class CCustomPrefsData;
+
+// CLASS DECLARATION
+
+/**
+ * Control for setting the (Extended) Custom Preferences.
+ */
+class CCustomPrefsItemList : public CAknSettingItemList
+    {
+public:
+    CAknSettingItem* CreateSettingItemL( TInt identifier );
+    void SetData( CCustomPrefsData* aData );
+
+    void EditItemL( TInt aIndex, TBool aCalledFromMenu );
+
+private:
+    /**
+     * Size change handler
+     */
+    void SizeChanged();
+
+    /**
+     * Selects a SNAP
+     */
+    void SelectSnapL();
+
+    /**
+     * Selects a IAP
+     */
+    void SelectIapL();
+
+private:
+    CCustomPrefsData* iData;
+
+    /**
+     * Control for selecting the Custom Preferences list's SNAP or IAP ID.
+     */
+    class CCustomPrefsSelectedIntegerItem : public CAknIntegerSettingItem
+        {
+    public:
+        void EditSelectedIntegerItemL( TInt aId );
+        };
+    };
+
+#endif
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/HttpHandler.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,168 @@
+/*
+* Copyright (c) 2006 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: HttpHandler is used for HTTP connection components testing
+*
+*/
+
+#ifndef HTTPHANDLER_H
+#define HTTPHANDLER_H
+
+// INCLUDES
+
+#include <in_sock.h>
+#include <http.h>
+#include <http/mhttpauthenticationcallback.h>
+
+// CONSTANTS
+
+const TInt KMaxContentTypeSize = 64;
+
+// FORWARD DECLARATIONS
+class MUINotify;
+class CHttpEventHandler;
+class CSettingData;
+
+// CLASS DECLARATION
+
+
+/**
+*  CHttpClient
+*  
+*  Class for initiating HTTP transaction.
+*/
+class CHttpClient : public CBase, public MHTTPDataSupplier, 
+public MHTTPAuthenticationCallback
+{
+public:
+    virtual ~CHttpClient();
+    static CHttpClient* NewLC(MUINotify& aConsole);
+    static CHttpClient* NewL(MUINotify& aConsole);
+    
+    
+    /**
+    * Start http request
+    */
+    void InvokeHttpMethodL(const CSettingData* aData, TBool aHasBody, TBool aIsSecure);
+
+    /**
+    * Set connection info for HTTP FW session
+    */
+    void SetHttpConnectionInfoL( TBool aUseOwnConnection, 
+                                 RConnection& aConnection, 
+                                 RSocketServ& aSocketServ );
+        
+    /**
+    * Set throughput calculation on or off.
+    */
+    void SetPerformance(const TBool aValue);
+    
+    /**
+    * Methods inherited from MHTTPDataSupplier
+    */
+    virtual TBool GetNextDataPart(TPtrC8& aDataPart);
+    virtual void ReleaseData();
+    virtual TInt OverallDataSize();
+    virtual TInt Reset();
+    
+    /**
+    * Methods inherited from MHTTPAuthenticationCallback
+    */
+    virtual TBool GetCredentialsL(const TUriC8& aURI, RString aRealm, 
+        RStringF aAuthenticationType,
+        RString& aUsername, 
+        RString& aPassword);
+    
+protected:
+    CHttpClient(MUINotify& aConsole);
+    void ConstructL();
+private:
+    
+    enum TMenuItems
+    {
+        EGet,
+            EPost,
+            EHead,
+            ETrace,
+            EToggleVerbosity,
+            EQuit
+    };
+    
+    /**
+    * Display performance information when sending POST.
+    */
+    void DisplayTimeElapsed();
+    
+    /**
+    * Set HTTP request header for http fw.
+    */
+    void SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue);
+    
+private:
+    RHTTPSession         iHttpSession;
+    TTime                iLastTimeStamp;
+    TInt                 iDataChunkCount;
+    RHTTPTransaction     iTrans;
+    CHttpEventHandler*   iTransObs;
+    HBufC8*              iReqBodySubmitBuffer;
+    TPtr8                iReqBodySubmitBufferPtr;
+    TBool                iNoMoreDate;
+    MUINotify&           iConsole;
+    CSettingData*        iSettingData;
+    TBool                iDoPerformance;
+    TBuf<KMaxContentTypeSize> iReqBodyContentType; // not used now
+};
+
+
+
+
+/**
+*  CHttpEventHandler
+*  
+*  Handles all events for the active HTTP transaction.
+*/
+class CHttpEventHandler : public CBase, public MHTTPTransactionCallback
+{
+public:
+    virtual ~CHttpEventHandler();
+    static CHttpEventHandler* NewLC(MUINotify& aConsole);
+    static CHttpEventHandler* NewL(MUINotify& aConsole);
+    
+    /**
+    * Turn performance measurement on/off
+    */
+    void SetPerformance(const TBool aValue){iDoPerformance = aValue;};
+    
+    /**
+    * Methods from MHTTPTransactionCallback
+    */
+    virtual void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
+    virtual TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
+    
+protected:
+    CHttpEventHandler(MUINotify& aConsole);
+    void ConstructL();
+private:
+    void DumpRespHeadersL(RHTTPTransaction& aTrans);
+    void DumpRespBody(RHTTPTransaction& aTrans);
+
+    MHTTPDataSupplier*   iRespBody;
+    MUINotify&           iConsole; // console for displaying text etc
+    TTime                iStartTime;
+    TInt                 iBodySize;
+    TBool                iDoPerformance;
+};
+
+
+#endif // HTTPHANDLER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ProgressNotifier.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,96 @@
+/*
+* Copyright (c) 2006 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: CProgressNotifier is used to notify about 
+* the current state of the request
+*
+*/
+
+#ifndef __PROGRESSNOTIFIER_H__
+#define __PROGRESSNOTIFIER_H__
+
+// INCLUDES
+#include <in_sock.h>
+
+// FORWARD DECLARATIONS
+class MProgressNotifyHandler;
+
+/**
+* Class for receiving notifications from interfaces.
+* Notifications are handled by the class, that implements
+* MProgressNotifyHandler interface.
+*/
+class CProgressNotifier : public CActive
+{
+public: // new methods
+    
+    /**
+    * Two-phased constructor.
+    */
+    static CProgressNotifier* NewL(RConnection& aConnection, MProgressNotifyHandler& aHandler);
+    
+    /**
+    * Two-phased constructor.
+    */
+    static CProgressNotifier* NewLC(RConnection& aConnection, MProgressNotifyHandler& aHandler);
+    
+    /**
+    * Destroy the object and release all memory objects
+    */
+    ~CProgressNotifier();
+    
+    /**
+    * Start waiting for the progress notifications.
+    */
+    void StartNotify();
+
+    /**
+    * Reads the current stage of the interface when 
+    * the progress notification is received, and issues
+    * a new progress notification request.
+    */
+    void NotifyL();
+    
+protected: // from CActive
+
+    /**
+    * Called when operation complete
+    */
+    void RunL();
+
+    /**
+    * Cancel any outstanding operation
+    */
+    void DoCancel();
+    
+private: // New methods
+    
+    /**
+    * Perform the first phase of two phase construction 
+    */
+    CProgressNotifier(RConnection& aConnection, MProgressNotifyHandler& aHandler);
+    
+    /**
+    * Perform the second phase construction of two phase construction
+    */
+    void ConstructL();
+    
+private:
+    // Member variables
+    RConnection&                iConnection;
+    MProgressNotifyHandler&     iHandler;
+    TNifProgressBuf             iProgressBuf;
+};
+
+#endif // __PROGRESSNOTIFIER_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ProgressNotifyHandler.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2006 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: Interface class for handling connection notifications.
+*
+*/
+
+#ifndef __PROGRESSNOTIFYHANDLER_H__
+#define __PROGRESSNOTIFYHANDLER_H__
+
+
+/**
+* Class that specifies the functions for handling progress
+* notify messages of the active interface.
+*/
+class MProgressNotifyHandler
+{
+public:
+    
+    /**
+    * Actions when interface is up
+    */
+    virtual void ProgressNotifyReceivedL(TInt aStage, TInt aError) = 0;   
+        
+    /**
+    * Handle error
+    */
+    virtual void ProgressNotifyError(TInt aStatus) = 0;
+};
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/QosObserver.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2002-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:  Receiver for QoS events.
+*
+*/
+
+#ifndef __QOSOBSERVER_H__
+#define __QOSOBSERVER_H__
+
+// INCLUDES
+#include <qoslib.h>
+
+// FORWARD DECLARATIONS
+class MUINotify;
+
+/**
+* Class that receives QoS events. 
+*/
+class CQosObserver : public CBase, public MQoSObserver
+{
+public: // new methods
+    
+    /**
+    * Constructor
+    */
+    CQosObserver(MUINotify& aConsole);
+
+    /**
+    * Destructor
+    */
+    ~CQosObserver();
+    
+    /**
+    * This method is called when QoS event has been generated.
+    * Prints the event on the console.
+    */
+    void Event(const CQoSEventBase& aQosEvent);
+        
+private:
+    // Member variables
+    MUINotify&            iConsole; 
+};
+
+#endif // __QOSOBSERVER_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/SendTimer.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2006 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: CSendTimer is used for sending data at specified intervals
+*
+*/
+
+#ifndef __SENDTIMER_H__
+#define __SENDTIMER_H__
+
+#include <e32base.h>
+
+class CSocketsEngine;
+
+/**
+* This class will send data over socket after given
+* time has elapsed.
+*/
+class CSendTimer : public CTimer
+{
+public:
+
+    /**
+    * Create a CSendTimer object
+    * @param aPriority priority to use for this timer
+    * @param aEngine object that knows how to send data
+    * @result a pointer to the created instance of CTimeOutTimer
+    */
+	static CSendTimer* NewL(const TInt aPriority, CSocketsEngine* aEngine);
+
+    /**
+    * Create a CSendTimer object
+    * @param aPriority priority to use for this timer
+    * @param aEngine object that knows how to send data
+    * @result a pointer to the created instance of CTimeOutTimer
+    */
+    static CSendTimer* NewLC(const TInt aPriority, CSocketsEngine* aEngine);
+
+    /**
+    * Destroy the object and release all memory objects
+    */
+	~CSendTimer();
+
+protected: // From CTimer
+
+    /**
+    * Invoked when a timer event occurs
+    */
+    virtual void RunL();
+
+private:
+
+    /**
+    * Perform the first phase of two phase construction 
+    * @param aPriority priority to use for this timer
+    * @param aEngine object that knows how to send data
+    */
+	CSendTimer(const TInt aPriority, CSocketsEngine* aEngine);
+
+    /**
+    * Perform the second phase construction of a CSendTimer 
+    */
+    void ConstructL();
+
+private:
+	// Member variables
+	CSocketsEngine*      iEngine;
+};
+
+#endif // __SENDTIMER_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/SettingData.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2006 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: CSettingsData stores the settings for ConnTest
+*
+*/
+
+#ifndef SETTINGDATA_H
+#define SETTINGDATA_H
+
+// INCLUDES
+#include <e32base.h>
+#include "conntest.hrh"
+
+// FORWARD DECLARATIONS
+
+
+// CLASS DECLARATION
+
+/**
+* Class for encapsulating setting data.
+*/
+class CSettingData : public CBase
+{
+public:
+    static CSettingData* NewL();
+    ~CSettingData();
+    
+private:
+    CSettingData();
+    void ConstructL();
+    
+public:
+    TBuf<KMaxServerNameLength> iServerName;
+    TInt iPort;
+    TInt iProtocol;
+    TInt iPacketSize;
+    TInt iPackets;
+    TInt iDelay;
+    TInt iRoaming;
+    TBuf<KMaxServerNameLength> iHttpPage;
+};
+
+
+#endif
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/SettingItemList.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2006 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: CSettingItemList implemets the settings list for Conntest
+*
+*/
+
+#ifndef SETTINGITEMLIST_H
+#define SETTINGITEMLIST_H
+
+// INCLUDES
+#include <aknsettingitemlist.h>
+
+// FORWARD DECLARATIONS
+class CSettingData;
+
+// CLASS DECLARATION
+
+/**
+* Control for settings.
+*/
+class CSettingItemList : public CAknSettingItemList 
+{
+public:
+    CAknSettingItem* CreateSettingItemL( TInt identifier ); 
+    void SetData(CSettingData* aData);
+    
+private:
+    void SizeChanged();
+    
+private:
+    CSettingData*   iData;
+};
+
+
+#endif
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/SocketsEngine.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,446 @@
+/*
+* Copyright (c) 2006-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: CSocketsEngine implements an engine for connection 
+* component checking: Interface opening/closing, connecting, 
+* sending/receiving data, etc.
+* CSocketsEngine is an active object
+*
+*/
+
+
+#ifndef __SOCKETSENGINE_H__
+#define __SOCKETSENGINE_H__
+
+// INCLUDES
+#include <in_sock.h>
+#include <es_sock.h>
+#include <http.h>
+#include <commdbconnpref.h>
+#include <extendedconnpref.h>
+#include "TimeOutNotify.h"
+#include "ProgressNotifyHandler.h"
+#include "datasendnotifyhandler.h"
+#include "conntest.hrh"
+#include "alractiveobject.h"
+
+// CONSTANTS
+
+// FORWARD DECLARATIONS
+class CSocketsRead;
+class CSocketsWrite;
+class CTimeOutTimer;
+class MUINotify;
+class CHttpClient;
+class CProgressNotifier;
+class CSettingData;
+class CCustomPrefsData;
+class CSendTimer;
+
+// CLASS DECLARATION
+
+/**
+*  CSocketsEngine
+*  
+*  This class is the main engine part of the sockets application.
+*  It establishes a TCP connection using its server name and port 
+*  number (performing a DNS lookup operation first, if appropriate).
+*  It creates instances of separate active objects to perform reading 
+*  from, and writing to, the socket.
+*/
+class CSocketsEngine : public CActive, 
+                       public MTimeOutNotify,
+                       public MProgressNotifyHandler, 
+                       public MDataSendNotifyHandler,
+                       public MMobilityProtocolResp
+                       
+{
+public:
+    enum TRoamingSetting
+        {
+        ERoamingOff,
+        ERoamingAutomatic,
+        ERoamingManual
+        };
+    
+    // Utilized when selecting UI menu items
+    enum TRoamingUIState
+        {
+        EIdle,
+        EPendingPreferredCarrier,
+        EPendingNewCarrierActive
+        };
+    
+    enum TSocketsEngineState 
+    {
+        EInterfaceDown,
+        EStartingInterface,
+        EInterfaceUp,
+        EConnecting,
+        EConnected,
+        EListening,
+        ETimedOut, 
+        ELookingUp,
+        ELookUpFailed,
+        EConnectFailed,
+        EDisconnecting
+    };
+    
+    enum TSocketsEngineStartType
+    {
+        EAskIap,
+        EExtPrefs,
+        EExtPrefsInternet,
+        ENoPrefs,
+        ENetworkId,
+        ESnap,
+        ETypeUnknown
+    };
+    
+    
+    /**
+    * Two-phased constructor.
+    * @param aConsole console to use for ui output
+    * @return a pointer to the created instance of CSocketsEngine
+    */
+    static CSocketsEngine* NewL(MUINotify& aConsole);
+    
+    /**
+    * Two-phased constructor.
+    * @param aConsole console to use for ui output
+    * @return a pointer to the created instance of CSocketsEngine
+    */
+    static CSocketsEngine* NewLC(MUINotify& aConsole);
+
+    /**
+    * Destructor.
+    */
+    ~CSocketsEngine();
+
+    /**
+     * Calls From ConnTestView that are responds to roaming notifications
+     */
+    void Migrate();
+    void Ignore();
+    void AcceptCarrier();
+    void RejectCarrier();
+    
+    /**
+    * Register to mobility API
+    */
+	void RegisterToMobilityAPIL();
+
+    /**
+    * UnRegister from mobility API
+    */
+	void UnRegisterFromMobilityAPI();
+    
+    /**
+    * Start interface
+    * @param aStartType Define start type (with or without preferences, by nework id)
+    * @param aConnect   If True, make connection after startup
+    */
+    void StartInterfaceL(TSocketsEngineStartType aStartType, TBool aConnect = EFalse);
+    
+     /**
+    * Start interface and possible connection with snap
+    * @param aConnect   If True, make connection after startup
+    */
+    void StartConnWithSnapL(TBool aConnect = EFalse);
+
+    /**
+    * Starting method for testing RConnection::Close
+    */
+    void StartCloseInterfaceL();
+
+    /**
+    * Stop interface by calling RConnection::Stop
+    */
+    void StopInterfaceL();
+    
+    /**
+    * Stop interface by calling RConnection::Close
+    */
+    void CloseInterface();
+
+    /**
+    * Make socket connection
+    */
+    void ConnectL();
+
+    /**
+    * Disconnect socket
+    */
+    void Disconnect();
+    
+    /**
+    * Opens a Listening socket
+    */
+    void ListenL();
+    
+    /**
+    * Write data to socket
+    * @param aData data to be written
+    */
+    void WriteL(const TDesC8& aData);
+
+    /**
+    * Write data to socket (flood)
+    * @param aData data to be written
+    * @param aCount The data will be written aCount times
+    */
+    void WriteFloodL(const TDesC8& aData, TInt aCount);
+    
+    /**
+    * Write HTTP request over socket
+    * @param aHasBody defines if request has body
+    */
+	void SendHttpRequestOverSocketL(TBool aHasBody, TBool aDoPerformance);
+    
+    /**
+    * Initiate read of data from socket
+    */
+    void Read();
+    
+    /**
+    * Send HTTP request using http framework.
+    * @param aHasBody       If true, send body data with POST
+    * @param aDoPerformance If true, calculate performance, no outputs
+    * @param aIsSecure      If true, make HTTPS request
+    */
+    void SendHttpFrameworkRequestL(TBool aHasBody, TBool aDoPerformance, TBool aIsSecure);
+
+    /**
+    * Print information about active connections and their
+    * clients and sockets
+    */
+    void ConnectionInfoL();
+    
+    /**
+    * Print information about interfaces.
+    */
+    void InterfaceInfoL();
+
+    /**
+    * Get socket engine state
+    * @return Socket engine state
+    */
+    TSocketsEngineState GetSocketEngineState();
+    
+    /**
+     * Gets Roaming state
+     * @return TRoamingState
+     */
+    TRoamingUIState GetSocketEngineRoamingState();
+    
+    /**
+     * Gets MobilityAPIImplementation
+     * @return CALRActiveObject
+     */
+    CALRActiveObject* CSocketsEngine::GetMobilityAPI();
+    
+    /**
+    * Get socket engine connection type
+    * @return socket engine connection type
+    */
+    TSocketsEngineStartType GetSocketEngineConnType();
+    
+    /**
+    * Set socket engine connection type
+    */
+    void SetSocketEngineConnType(const CSocketsEngine::TSocketsEngineStartType aConnStartType);
+
+    /**
+    * Set connection information
+    * @param aData
+    */
+    void SetConnectionData(const CSettingData* aData);
+    
+    /**
+    * Set Custom preferences data
+    * @param aData
+    */
+    void SetCustomPrefsData(const CCustomPrefsData* aData);
+    
+    /**
+    * QoS methods
+    */
+    void SetWLANQoS(TInt aClass);
+    
+    void QoS1();
+    void QoS2();
+    
+    /**
+    * Start the sending of the data
+    * @param aData the data to send
+    */
+    void SendDataL(const TBuf8<KSendDataSize> aData);
+
+    /**
+    * Actual sending udp packets 
+    * Must be public because of the timer calling it
+    */
+    void DoSendDataL();
+
+public: // MDataSendNotifyHandler
+    /**
+    * The function to be called when data has been sent
+    * @param aAmount the number of packets sent
+    */
+    void NotifySend(TInt aAmount);
+    
+public: // from MTimeOutNotify
+    
+    /**
+    * The function to be called when a timeout occurs
+    */
+    void TimerExpired(); 
+
+public: // from MProgressNotifyHandler
+    
+    /**
+    * Handle progress notification
+    */
+    void ProgressNotifyReceivedL(TInt aStage, TInt aError);
+    
+    /**
+    * Handle progress notification error
+    */
+    void ProgressNotifyError(TInt aStatus);
+
+public: // from MMobilityProtocolResp
+    /**
+     * This method is called by middleware to notify that there are no suitable connections available.
+     */
+    virtual void Error( TInt aError ); 
+    
+    /**
+     * This method is called by the middleware to notify a client about a new preferred connection.
+     */
+    virtual void PreferredCarrierAvailable(
+                TAccessPointInfo aOldAP, 
+                TAccessPointInfo aNewAP, 
+                TBool aIsUpgrade, 
+                TBool aIsSeamless ); 
+    /**
+     * This method is called by the middleware to notify a client that a preferred connection has been activated.
+     */ 
+    virtual void NewCarrierActive( TAccessPointInfo aNewAP, TBool aIsSeamless ); 
+
+protected: // from CActive
+
+    /**
+    * Called when operation completes
+    */
+    void RunL();
+
+    /**
+    * Cancel any outstanding operation
+    */
+    void DoCancel();
+
+private: // New methods
+
+    /**
+    * Perform the first phase of two phase construction 
+    */
+    CSocketsEngine(MUINotify& aConsole);
+    
+    /**
+    * Perform the second phase construction of a CSocketsEngine 
+    * @param aConsole the console to use for ui output
+    */
+    void ConstructL();
+    
+    /**
+    * Initiate a connect operation on a socket
+    * @param aAddr the ip address to connect to
+    */
+    void ConnectL(const TInetAddr& aAddr);
+
+    /**
+    * Handle a change in this object's status
+    * @param aNewStatus new status
+    */
+    void ChangeStatus(TSocketsEngineState aNewStatus);
+    
+    /**
+    * Display text on the console
+    * @param aDes text to display
+    */
+    void PrintTextToConsole(const TDesC& aDes);
+
+public: // for performance testing  
+  	/**
+	* Marks starting time into memory
+	*
+	*/
+    
+	void UDPFlood(TInt aPackets, TInt aPacketSize, TDesC& aData);
+    /**
+   	* Marks starting time into memory
+    */
+	void inline StartTickCount();
+	
+	/**
+	* Calculates time interval using tick count and prints it
+	*/
+	void StopTickCount(const TDesC& aComponentName);
+
+private:
+	// Member variables
+	TUint32						iStartTime; // for performance testing only
+	TTime                       iStartTTime; // for performance testing only
+	TTime						iThroughputStartTime; // for performance testing only
+	TInt                        iTroughputDataSize;
+    TCommDbConnPref             iPrefs;
+    TConnPrefList*              iPrefsList;
+    TExtendedConnPref*          iExtPrefs;
+    CCustomPrefsData*           iCustomPrefsData;    
+    RConnection                 iConnection;
+    RConnection*                iCloseConnection;
+    CProgressNotifier*          iProgressNotifier;
+    CProgressNotifier*          iTempProgressNotifier;
+    CHttpClient*                iHttpClient;
+    TRoamingUIState             iRoamingState;
+    TRoamingSetting             iRoaming;
+	TSocketsEngineState         iEngineStatus; // this object's current status
+	MUINotify&                  iConsole; // console for displaying text etc
+	CSocketsRead*               iSocketsRead; // socket reader active object
+	CSocketsWrite*              iSocketsWrite; // socket writer active object
+	RSocket                     iSocket; // the actual socket
+	RSocket						iListeningSocket;
+	RSocketServ                 iSocketServ; // the socket server
+	RHostResolver               iResolver; // DNS name resolver
+	TNameEntry                  iNameEntry;
+	TNameRecord                 iNameRecord;
+	CTimeOutTimer*              iTimer; // timer active object
+	TInetAddr                   iAddress;
+    TInt                        iPort; // port number to connect to
+    TBuf<KMaxServerNameLength>  iServerName; // server name to connect to
+    TUint                       iProtocol;
+    TUint                       iSocketType;
+    TBool                       iConnectAfterStartup;
+    TBuf<KMaxServerNameLength>  iHttpPage;
+	CSettingData*               iSettingData;
+    CSendTimer*                 iSendTimer; // timer active object
+    HBufC8*                     iData; // The data to be sent
+    TInt                        iSendCount;
+    TBool                       iUseTTime;
+    TBool 						iIsRegisteredToMobAPI; //flag to mark state of registration to Mob API
+    CALRActiveObject*           iMobility; //pointer to mob API instance   
+    TSocketsEngineStartType     iSockEngineStartType; //type of sock engine connection
+    };
+        
+#endif // __SOCKETSENGINE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/SocketsRead.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,141 @@
+/*
+* Copyright (c) 2006 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: CSocketsRead is an active obejct that reads data from 
+* an already open socket and calculates some metrics from the data read
+*
+*/
+
+#ifndef __SOCKETSREAD_H__
+#define __SOCKETSREAD_H__
+
+#include <in_sock.h>
+#include "conntest.hrh"
+
+// CONSTANTS
+
+const TInt KMaximumPacketCount = 4000; // Count to 4000. Fails if ploss is over 20% (1000pckts)
+
+// FORWARD DECLARATIONS
+class MUINotify;
+class CSocketsEngine;
+
+// CLASS DECLARATION
+
+/** 
+*  This class handles reading data from the socket.
+*  In this implementation, any data read is simply
+*  displayed as text on the console.
+*/
+class CSocketsRead : public CActive
+{
+public:
+
+    /**
+    * Create a CSocketsRead object
+    * @param aConsole console to use for ui output
+    * @param aSocket socket to read from
+    * @result a pointer to the created instance of CSocketsRead
+    */
+    static CSocketsRead* NewL(MUINotify& aConsole, RSocket& aSocket, CSocketsEngine& aEngine);
+    
+    /**
+    * Create a CSocketsRead object
+    * @param aConsole console to use for ui output
+    * @param aSocket socket to read from
+    * @result a pointer to the created instance of CSocketsRead
+    */
+    static CSocketsRead* NewLC(MUINotify& aConsole, RSocket& aSocket, CSocketsEngine& aEngine);
+    
+    /**
+    * Destroy the object and release all memory objects
+    */
+    ~CSocketsRead();
+    
+    /**
+    * Initiate the read process.
+    * @param aAddress Address where data is sent (needed by UDP)
+    * @param aProtocol Protocol to be used (TCP or UDP)
+    */
+    void Start(TInetAddr* aAddress, TUint aProtocol);
+
+    /**
+    * Set throughput calculation on or off.
+    * @param aValue If ETrue, measure throughput
+    */
+    void SetPerformance(const TBool aValue);
+
+	/**
+	* Start RAW read
+	*/
+    void StartRAWRead(TInetAddr* aAddress, TUint aProtocol);
+    
+protected: // from CActive
+           
+    /**
+    * Cancel any outstanding operation
+    */
+    void DoCancel();
+    
+    /**
+    * Called when operation complete
+    */
+    void RunL();	
+    
+private:
+
+    /**
+    * Perform the first phase of two phase construction 
+    * @param aConsole console to use for ui output
+    * @param aSocket socket to read from
+    */
+    CSocketsRead(MUINotify& aConsole, RSocket& aSocket, CSocketsEngine& aEngine);
+    
+    /**
+    * Perform the second phase construction of a CSocketsRead 
+    */
+    void ConstructL();
+    
+    /**
+    * Read data from socket
+    */
+    void IssueRead();
+	
+	/**
+	* Calculate packet loss
+	* @return ploss percentage
+	*/
+	TInt32 CalculatePacketLoss();
+    
+private: // Member variables
+//    enum { KReadBufferSize = 4096 }; // 4K
+    //enum { KReadBufferSize = 10240 }; // 10K
+    // Member variables
+    CSocketsEngine&         iEngine;  // connection engine
+    RSocket&                iSocket;  // socket to read data from
+    MUINotify&              iConsole; // console for displaying text etc
+    TBuf8<KReadDataSize>  iBuffer;  // buffer for receiving data
+    TSockXfrLength          iDummyLength; // dummy - length of data read is written here
+    TInt                    iReceivedBytes; 
+    TInt32					iUdpPacketCounter;
+    TBool                   iDoCount; 
+    TBool                   iDoPerformance; 
+    TInetAddr*              iAddress;
+    TUint                   iProtocol;
+    TTime                   iStartTime;
+    TBuf8<2048>             iHeaders;  // buffer for HTTP headers
+    TInt                    iBodySize;
+};
+
+#endif // __SOCKETSREAD_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/SocketsWrite.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,174 @@
+/*
+* Copyright (c) 2006 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: CSocketsWrite is an active object which implements data 
+* sending through an already open socket using UDP or TCP
+*
+*/
+
+#ifndef __SOCKETSWRITE_H__
+#define __SOCKETSWRITE_H__
+
+#include <in_sock.h>
+#include "TimeOutNotify.h"
+#include "conntest.hrh"
+
+// FORWARD DECLARATIONS
+class CTimeOutTimer;
+class MUINotify;
+class MDataSendNotifyHandler;
+
+// CLASS DECLARATION
+
+/**
+*  This class handles writing data to the socket.
+*  Data to be written is accumulated in iTransferBuffer,
+*  and is then transferred to iWriteBuffer for the actual
+*  write to the socket.
+*/
+class CSocketsWrite : public CActive, public MTimeOutNotify
+{
+public:
+
+    /**
+    * Create a CSocketsWrite object
+    * @param aConsole console to use for ui output
+    * @param aSocket socket to write to
+    * @param aSendHandler handler to notify UDP packet sends
+    * @result a pointer to the created instance of CSocketsWrite
+    */
+    static CSocketsWrite* NewL( MUINotify& aConsole, 
+                                RSocket& aSocket, 
+                                MDataSendNotifyHandler& aSendHandler );
+    
+    /**
+    * Create a CSocketsWrite object
+    * @param aConsole console to use for ui output
+    * @param aSocket socket to write to
+    * @param aSendHandler handler to notify UDP packet sends
+    * @result a pointer to the created instance of CSocketsWrite
+    */
+    static CSocketsWrite* NewLC( MUINotify& aConsole, 
+                                 RSocket& aSocket, 
+                                 MDataSendNotifyHandler& aSendHandler );
+    
+    /**
+    * Destroy the object and release all memory objects
+    */
+    ~CSocketsWrite();
+    
+    /**
+    * Write the data to the socket (buffered)
+    * @param aData the data to be written
+    * @param aAddress Address where data is sent (needed by UDP)
+    * @param aProtocol Protocol to be used (TCP or UDP)
+    */
+    void IssueWriteL(const TDesC8& aData, TInetAddr* aAddress, TUint aProtocol);
+    
+    /**
+    * Write the data to the socket flooded
+    * @param aData the data to be written
+    * @param aAddress Address where data is sent (needed by UDP)
+    * @param aProtocol Protocol to be used (TCP or UDP)
+    * @param aCount The packet will be sent aCount times
+    */
+    void IssueWriteL(const TDesC8& aData, TInetAddr* aAddress, TUint aProtocol, TInt aCount);
+    
+    /**
+    * Write the data to the socket (buffered)
+    * @param aData the data to be written
+    * @param aAddress Address where data is sent (needed by UDP)
+    * @param aProtocol Protocol to be used (TCP or UDP)
+    */
+    void IssueWriteL( const TDesC8& aData, 
+                      TInetAddr* aAddress, 
+                      TUint aProtocol, 
+                      TInt aPacketSize, 
+                      TInt aPackets );
+    
+protected: // from CActive
+          
+    /**
+    * Cancel any outstanding operation
+    */
+    void DoCancel();
+    
+    /**
+    * Called when operation complete
+    */
+    void RunL();	
+    
+    // From MTimeOutNotify
+    void TimerExpired(); 
+    
+private:
+
+    /**
+    * Perform the first phase of two phase construction 
+    * @param aConsole console to use for ui output
+    * @param aSocket socket to write to
+    * @param aSendHandler handler to notify UDP packet sends
+    */
+    CSocketsWrite( MUINotify& aConsole, 
+                   RSocket& aSocket, 
+                   MDataSendNotifyHandler& aSendHandler );
+    
+    /**
+    * Perform the second phase construction of a CSocketsWrite 
+    */
+    void ConstructL();
+    
+    /**
+    * Handle a 'write buffer empty' situation.
+    */    
+    void SendNextPacket();
+
+    /**
+    * Calls the actual write when flooding
+    */
+    void DoFloodWrite();
+    
+    
+private: // Member data
+    enum TWriteState 
+    {
+        ESending, EWaiting ,ECommsFailed
+    };
+    
+    
+    // Member variables
+    RSocket&                iSocket;
+    MUINotify&              iConsole; // console for displaying text etc
+    //TBuf8<KMaxSendBuffer>   iTransferBuffer; // Accumulate data to send in here
+    //TBuf8<KMaxSendBuffer>   iWriteBuffer; // Holds data currently being sent to socket
+    HBufC8*                 iTransferBuffer;
+    HBufC8*                 iWriteBuffer;
+    CTimeOutTimer*          iTimer;
+    TInt                    iTimeOut;
+    TWriteState             iWriteStatus;
+    TInetAddr*              iAddress;
+    TUint                   iProtocol;
+	TInt                    iPackets;
+	TInt                    iPacketSize;
+    TInt                    iSentBytes;
+	TTime                   iStartTime;
+	TInt                    iDataChunkCount;
+	HBufC8*                 iReqBodySubmitBuffer;
+	TPtr8                   iReqBodySubmitBufferPtr;
+	MDataSendNotifyHandler& iSendHandler;
+	TBool                   iFlood; // Flood mode sending
+	TInt                    iCount; // Times to flood the packet
+};
+
+#endif // __SOCKETSWRITE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/TimeOutNotify.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2006 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: MTimeOutNotify is an interface class used to 
+* notify about timeouts
+*
+*/
+
+#ifndef _TIMEOUTNOTIFY_H_
+#define _TIMEOUTNOTIFY_H_
+
+/**
+*  This class specifies the function to be called when a timeout occurs.
+*  Used in conjunction with CTimeOutTimer class
+*/
+class MTimeOutNotify
+{
+public:
+    
+    /**
+    * The function to be called when a timeout occurs
+    */
+    virtual void TimerExpired() = 0;
+};
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/TimeOutTimer.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2006 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: CTimeOutTimer is used to generate time out events
+*
+*/
+
+#ifndef __TIMEOUTTIMER_H__
+#define __TIMEOUTTIMER_H__
+
+// INCLUDES
+#include <e32base.h>
+
+// FORWARD DECLARATIONS
+class MTimeOutNotify;
+
+/**
+*  This class will notify an object after a specified timeout.
+*/
+class CTimeOutTimer : public CTimer
+{
+public:
+    
+    /**
+    * Create a CTimeOutTimer object
+    * @param aPriority priority to use for this timer
+    * @param aTimeOutNotify object to notify of timeout event
+    * @result a pointer to the created instance of CTimeOutTimer
+    */
+    static CTimeOutTimer* NewL(const TInt aPriority, MTimeOutNotify& aTimeOutNotify);
+    
+    /**
+    * Create a CTimeOutTimer object
+    * @param aPriority priority to use for this timer
+    * @param aTimeOutNotify object to notify of timeout event
+    * @result a pointer to the created instance of CTimeOutTimer
+    */
+    static CTimeOutTimer* NewLC(const TInt aPriority, MTimeOutNotify& aTimeOutNotify);
+    
+    /**
+    * Destroy the object and release all memory objects
+    */
+    ~CTimeOutTimer();
+    
+protected: // From CTimer
+    
+    /**
+    * Invoked when a timer event occurs
+    */
+    virtual void RunL();
+    
+private:
+    
+    /**
+    * Perform the first phase of two phase construction 
+    * @param aPriority priority to use for this timer
+    */
+    CTimeOutTimer(const TInt aPriority, MTimeOutNotify& aTimeOutNotify);
+    
+    /**
+    * Perform the second phase construction of a CTimeOutTimer 
+    */
+    void ConstructL();
+    
+private:
+    // Member variables
+    MTimeOutNotify& iNotify;
+};
+
+#endif // __TIMEOUTTIMER_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/Utils.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2006 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: Utils implements general tools for bandwidth and 
+* packet loss calculation and IAP selection etc
+*
+*/
+
+#ifndef __UTILS_H__
+#define __UTILS_H__
+
+#include <e32std.h>
+
+#include "uinotify.h"
+
+class Utils  
+{
+public:
+	Utils();
+	virtual ~Utils();
+
+    /**
+    * Adjust given Nifman's idle timeout for every bearer.
+    */
+    static void SetTimeoutsL(const TInt aTimeout);
+
+    /**
+    * Set Nifman's idle times for each record in given table.
+    */
+    static void SetTableTimeoutL(const TInt aTimeout,const TDesC& aTableName);
+
+    /**
+    * Calculate throughput
+    */
+	static void CalculateThroughput(TDes8& aBuffer, TTime aStartTime, TInt aSize);
+
+    /**
+    * Set IapId value into connection preferences table.
+    */
+    static void SetConnectionPrefsIapL();
+
+    /**
+    * Create data chunk for POST performance tests.
+    */
+    static void CreateDataChunk(TDes8& aBuffer, TInt aLength);
+
+    /**
+    * Ask IAP id to be used from the user
+    * @param aId Selected IAP id
+    * @return Status of the selection (selection made or cancelled)
+    */
+    static TInt AskIapIdL(TUint32& aId);    
+
+    /**
+    * Ask Network id from the user.
+    */
+    static TInt AskNetworkIdL(TUint32& aId);    
+
+    /**
+    * Does the real work for selecting IAP or Network ide.
+    */
+    static TInt SelectIdFromTableL(TUint32& aId, const TDesC& aTableName);
+
+};
+
+#endif // __UTILS_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/alractiveobject.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2006 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: conntest application
+*
+*/
+
+#ifndef ALRACTIVEOBJECT_H
+#define ALRACTIVEOBJECT_H
+
+#include <e32base.h>
+#include <comms-infras/cs_mobility_apiext.h>
+
+namespace ESock { class CPreferredCarrierAvailable; }
+namespace ESock { class CNewCarrierActive; }
+
+class MUINotify;
+
+class CALRActiveObject : public CActive
+    {
+public:  // Constructors and destructor
+        /**
+        * NewL is first phase of two-phased constructor.
+        */
+        static CALRActiveObject* NewL(
+                    MUINotify& aConsole, 
+                    MMobilityProtocolResp* aApplication);
+
+        /**
+        * Destructor.
+        */
+        ~CALRActiveObject();
+
+    public: // from CActive
+        
+        void RunL();
+
+        void DoCancel();
+
+        TInt RunError( TInt aError );
+
+    public: // New functions
+
+        void OpenL( RCommsSubSession& aExtensionProvider );
+    	void MigrateToPreferredCarrier();
+    	void IgnorePreferredCarrier();
+    	void NewCarrierAccepted();
+    	void NewCarrierRejected();
+
+    private:
+
+        /** 
+        * C++ default constructor.
+        */
+        CALRActiveObject( MUINotify& aConsole, MMobilityProtocolResp* aApplication );
+
+        /**
+        * By default Symbian OS constructor is private.
+        */
+        void ConstructL(MUINotify& aConsole);
+
+    private:    // Data
+     //   MALRApplication&        iApplication;   // Backpointer
+       // CConsoleBase&           iConsole;       // Pointer to console
+       	MUINotify&              iConsole;
+    	RCommsMobilityApiExt    iExtApi;
+    	RBuf8                   iResponseBuf;
+    	MMobilityProtocolResp*  iApplication;
+    };
+
+#endif // ALRACTIVEOBJECT_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/conntest.hrh	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2006 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: ConnTest resource header
+ *
+ */
+
+#ifndef CONNTEST_HRH
+#define CONNTEST_HRH
+
+// Constants
+
+// KMaxSendBuffer must be atleast 1 byte larger than KSendDataSize
+// since the socketswrite will add a null termination
+#define KSendDataSize 16384
+#define KReadDataSize 16384
+#define KMaxSendBuffer 32772
+#define KConnTestViews 4
+#define KMaxServerNameLength 128
+
+// Enumerations
+
+enum TConnTestContainer
+    {
+    ESettingsContainer,
+    EOutputContainer,
+    ECustomPrefsContainer
+    };
+
+enum TConnTestCommandIds
+    {
+    EConnTestCmdSettings = 1,
+    EConnTestCmdStoreSettings, // not used at the moment
+    EConnTestCmdStartInterface,
+    EConnTestCmdStartSnap,
+    EConnTestCmdStartInterfaceNoPrefs,
+    EConnTestCmdSetCustomPrefs,
+    EConnTestCmdStartInterfaceExtConnPrefs,
+    EConnTestCmdStartByNetworkId,
+    EConnTestCmdStopInterface,
+    EConnTestCmdStartInternet,
+    EConnTestCmdStartForClose, // not used at the moment
+    EConnTestCmdCloseInterface, // not used at the moment
+    EConnTestCmdMigrate,
+    EConnTestCmdIgnore,
+    EConnTestCmdAccept,
+    EConnTestCmdReject,
+    EConnTestCmdConnect,
+    EConnTestCmdDisconnect,
+    EConnTestCmdListen,
+    EConnTestCmdSendHttpGet,
+    EConnTestCmdSendPerformanceHttpGet,
+    EConnTestCmdSendHttpPost,
+    EConnTestCmdSendRawData,
+    EConnTestCmdAdvanced,
+    EConnTestCmdConnectionInfo,
+    EConnTestCmdInterfaceInfo,
+    EConnTestCmdClearOutputWindow,
+    EConnTestCmdHttpFrameworkGet,
+    EConnTestCmdHttpFrameworkPost,
+    EConnTestCmdHttpFrameworkSecureGet,
+    EConnTestCmdHttpFrameworkPerformanceGet,
+    EConnTestCmdHttpFrameworkPerformancePost,
+    EConnTestCmdCancel,
+    EConnTestCmdTimeoutLastSocketActivity,
+    EConnTestCmdTimeoutLastSocketClosed,
+    EConnTestCmdTimeoutLastSessionClosed,
+    EConnTestCmdConnectionPrefsIap,
+    EConnTestCmdWLANQoSVoice,
+    EConnTestCmdWLANQoSVideo,
+    EConnTestCmdWLANQoSBestEffort,
+    EConnTestCmdWLANQoSBackground,
+    EConnTestCmdWLANQoSNone,
+    EConnTestCmdQoS1,
+    EConnTestCmdParallelGet,
+    EConnTestCmdIpLog,
+    EConnTestCmdStartIpLog,
+    EConnTestCmdStopIpLog,
+    EConnTestCmdSendIpLog,
+    EConnTestWlanAvailableIaps,
+    EConnTestWlanScan,
+    EConnTestWlanDir,
+    EConnTestWlanGetSsid,
+    EConnTestWlanGetBssid,
+    EConnTestWlanGetRssi,
+    EConnTestWlanGetConnMode,
+    EConnTestWlanGetSecurityMode
+    };
+
+enum TConnTestTabViewId
+    {
+    EConnTestView1Tab = 1,
+    EConnTestView2Tab,
+    EConnTestView3Tab,
+    EConnTestView4Tab
+    };
+
+enum TConnTestSettingItems
+    {
+    EConnTestIpAddress = 1,
+    EConnTestPort,
+    EConnTestProtocol,
+    EConnTestPacketSize,
+    EConnTestPackets,
+    EConnTestDelay,
+    EConnTestRoaming,
+    EConnTestHttpPage
+    };
+
+// Must be in correct orded, these are checked against the menu index
+enum TConnTestExtConnPrefsItems
+    {
+    EConnTestExtConnPrefsItemSnapPurpose = 0,
+    EConnTestExtConnPrefsItemSnapId,
+    EConnTestExtConnPrefsItemIapId,
+    EConnTestExtConnPrefsItemBearerSet,
+    EConnTestExtConnPrefsItemNoteBehaviour,
+    EConnTestExtConnPrefsItemDisconnectDialog,
+    EConnTestExtConnPrefsItemConnSelectionDialog,
+    EConnTestExtConnPrefsItemForcedRoaming
+    };
+
+#endif      // CONNTEST_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/conntest.loc	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2006 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 localisation file for ConnTest
+*
+*/
+
+// LOCALISATION STRINGS
+
+//d:Command in options menu.
+//d:Example application spesific command.
+//l:list_single_popup_submenu_pane_1
+//
+#define qtn_appl_option_item "<App spesific menu item>"
+
+//d:Command in options menu.
+//d:Example command for view 1.
+//l:list_single_popup_submenu_pane_1
+//
+#define qtn_view1_option_item "<View1 spesific menu item>"
+
+//d:Command in options menu.
+//d:Example command for view 2.
+//l:list_single_popup_submenu_pane_1
+//
+#define qtn_view2_option_item "<View2 spesific menu item>"
+
+//d:Name of the view 1 tab.
+//d:
+//l:
+//
+#define qtn_view1_tab "View1"
+
+//d:Name of the view 2 tab.
+//d:
+//l:
+//
+#define qtn_view2_tab "View2"
+
+// example caption strings for app
+#define qtn_app_caption_string "ConnTest"
+
+#define qtn_app_short_caption_string "ConnTest"
+
+//d:String shown when querying the number of parallel gets.
+//d:
+//l:
+//
+#define qtn_aknatquery_num_label_text "# of parallel GETs"
+
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/datasendnotifyhandler.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2006 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: MDataSendNotifyHandler is an interface to notify about
+* the amount of data sent
+*
+*/
+
+#ifndef __DATASENDNOTIFYHANDLER_H__
+#define __DATASENDNOTIFYHANDLER_H__
+
+
+/**
+* Class that specifies the functions for handling data sending
+* notify messages
+*/
+class MDataSendNotifyHandler
+{
+public:
+    /**
+    * Tells how many packets have been sent
+    */
+    virtual void NotifySend(TInt aAmount) = 0;
+};
+
+#endif //__DATASENDNOTIFYHANDLER_H__
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/ipdumpengine.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2006 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: CIpdumpEngine is used to control the ip logging protocol
+*
+*/
+
+#include <es_sock.h>
+
+class CIpdumpEngine : public CBase
+	{
+public:
+	static CIpdumpEngine* NewL();
+	virtual ~CIpdumpEngine();
+
+	void EnableLoggingL();
+	void DisableLogging();
+
+	TBool LoggingEnabled() const;
+	const TDesC& LogFileName() const;
+
+private:
+	CIpdumpEngine();
+	void ConstructL();
+
+	void CheckProtocolFilesL();
+	TInt CreateLogDirectory();
+
+private:
+	RSocketServ iSocketServ;
+	RSocket iSocket;
+	TBool iLoggingEnabled;
+	TName iLogFileName;
+	};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/inc/uinotify.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2006 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: Interface class for displaying notifications.
+*
+*/
+
+#ifndef __UINOTIFY_H__
+#define __UINOTIFY_H__
+
+
+/**
+* This class specifies the console output functions. It
+* can be used in conjunction with any class that want to
+* display notifications in output window of the container.
+*/
+class MUINotify
+{
+public:
+    
+    /**
+    * Displays the descriptor as text (with attributes) on the console
+    * @param the text to be displayed
+    * @param attributes e.g. CEikGlobalTextEditor::EItalic
+    */
+    virtual void PrintNotify(const TDesC& aMessage, TUint aAttributes = 0) = 0;
+    
+    /**
+    * Displays the descriptor as text (with attributes) on the console
+    * @param the text to be displayed
+    * @param attributes e.g. CEikGlobalTextEditor::EItalic
+    */
+    virtual void PrintNotify(const TDesC8& aMessage, TUint aAttributes = 0) = 0;
+
+    /**
+    * Displays the integer as a decimal number on the console
+    * @param aNumber the number to be displayed
+    */
+    virtual void PrintNotify(TInt aNumber) = 0;
+    
+    /**
+    * Displays an error message
+    * @param aErrMessage error message text
+    * @param aErrCode error code number
+    */
+    virtual void ErrorNotify(const TDesC& aErrMessage, TInt aErrCode) = 0;
+
+    /**
+    * Notify user with a message
+    * @param aMessage message associated
+    */
+    virtual void PopupNotify(const TDesC& aMessage) = 0;
+    
+    /**
+    * Displays the text in the 'status' window
+    * @param aStatus new status description text
+    */
+    virtual void SetStatus(const TDesC& aStatus) = 0;
+};
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/install/ConnTest.pkg	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,46 @@
+;
+; Copyright (c) 2006 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 the package file for ConnTest SIS creation
+;
+
+;
+; Installation file for ConnTest application
+;
+;Languages
+&EN
+; 
+; UID is the app's UID
+;
+#{"ConnTest"},(0x101F6D2B),1,6,0,TYPE=SA
+;
+; Supports Series 60 v 3.0
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+
+; Localised Vendor name
+%{"Nokia Test EN"}
+
+; Unique Vendor name
+:"Nokia"
+
+;Files to install
+"\epoc32\data\Z\private\10003a3f\apps\ConnTest_reg.rsc"-"!:\private\10003a3f\import\apps\ConnTest_reg.rsc"
+"\epoc32\release\armv5\urel\ConnTest.exe"-"!:\sys\bin\ConnTest.exe"
+"\epoc32\data\Z\Resource\apps\ConnTest_AIF.mbm"-"!:\resource\apps\ConnTest_AIF.mbm"
+"\epoc32\data\Z\Resource\apps\ConnTest_AIF.mif"-"!:\resource\apps\ConnTest_AIF.mif"
+"\epoc32\data\Z\Resource\apps\ConnTest.rsc"         -"!:\resource\apps\ConnTest.rsc"
+"\epoc32\winscw\c\private\101f7989\Esock\ip.probe.esk"	-"!:\private\101f7989\import\esock\ip.probe.esk"
+"\epoc32\release\armv5\urel\probe.prt"     		-"!:\sys\bin\probe.prt"
+
+;@"..\probe\install\probe-x.sis",(0x101F6D2C)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/EABI/probeU.DEF	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,9 @@
+EXPORTS
+	Install @ 1 NONAME
+	_ZTI14CProtocolProbe @ 2 NONAME ; #<TI>#
+	_ZTI14CProviderProbe @ 3 NONAME ; #<TI>#
+	_ZTI20CProtocolFamilyProbe @ 4 NONAME ; #<TI>#
+	_ZTV14CProtocolProbe @ 5 NONAME ; #<VT>#
+	_ZTV14CProviderProbe @ 6 NONAME ; #<VT>#
+	_ZTV20CProtocolFamilyProbe @ 7 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/bmarm/probeu.def	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+	Install @ 1 NONAME R3UNUSED ; (null)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/bwins/probeu.def	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+	Install @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/data/probe.esk	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,8 @@
+[sockman]
+protocols= probe
+
+[probe]
+filename= probe.prt
+bindto= ip6
+index= 1
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/group/ABLD.BAT	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,15 @@
+@ECHO OFF
+
+REM Bldmake-generated batch file - ABLD.BAT
+REM ** DO NOT EDIT **
+
+perl -S ABLD.PL "\ConnTest-vesjokin\ConnTest\probe\group\\" %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/group/bld.inf	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* 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: Build information file for project probe
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+//Export of these esk files is commented out, so that the plug-ins
+//do not get activated accidentaly
+//../data/probe.esk       /epoc32/data/z/system/data/ip.probe.esk
+//../data/probe.esk       /epoc32/wins/c/system/data/probe.esk
+../data/probe.esk       /epoc32/winscw/c/private/101f7989/Esock/ip.probe.esk
+../data/probe.esk       /epoc32/data/c/private/101f7989/Esock/ip.probe.esk
+
+PRJ_MMPFILES
+probe.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/group/probe.mmp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2006 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: The project specification file for probe
+*
+*/
+
+#include <platform_paths.hrh>
+MACRO       EPOC_SDK=0x07010000
+
+TARGET	probe.prt
+TARGETTYPE	dll
+
+UID		0x10003D38 0x101F6D2C
+
+VENDORID    VID_DEFAULT
+// CAPABILITY  ALL -TCB
+CAPABILITY      CommDD PowerMgmt ReadDeviceData WriteDeviceData TrustedUI ProtServ NetworkControl NetworkServices LocalServices ReadUserData WriteUserData // as c32 process 
+
+SOURCEPATH	../src
+
+SOURCE		family.cpp prt.cpp sap.cpp
+
+USERINCLUDE		../inc
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY		euser.lib esock.lib inhook6.lib nifman.lib
+LIBRARY		efsrv.lib esocksvr.lib mbufmgr.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/inc/family.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#ifndef __PROBE_FAMILY_H
+#define __PROBE_FAMILY_H
+
+const TUint16 KAfProbe			= 0x08b6;	//Dummy value
+
+enum TProbePanic
+{
+	EProbePanic_BadBind,
+	EProbePanic_NotSupported,
+	EProbePanic_NoData
+};
+
+void Panic(TProbePanic aPanic);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/inc/prt.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#ifndef __PROBE_PRT_H
+#define __PROBE_PRT_H
+
+#include <e32std.h>
+#include <es_sock.h>
+#include <nifman.h>
+#include <in_bind.h>
+#include <posthook.h>
+
+#include "family.h"
+
+class CProviderProbe;
+
+class CProtocolProbe : public CProtocolPosthook
+{
+	friend class CProviderProbe;
+	CProtocolProbe(TUint aId);
+	virtual ~CProtocolProbe();
+public:
+	virtual void InitL(TDesC& aTag);
+	virtual void StartL();
+	virtual void Identify(TServerProtocolDesc *aDesc) const;
+	static void Identify(TServerProtocolDesc& aDesc, TUint aId);
+	static CProtocolProbe *NewL(TUint aId);
+
+	virtual void NetworkAttachedL();
+	virtual TInt Send(RMBufChain &aPacket, CProtocolBase* aSrc);
+	virtual void Process(RMBufChain &aPacket, CProtocolBase* aSrc);
+	
+	virtual CServProviderBase* NewSAPL(TUint aProtocol);
+	void CancelSAP(CServProviderBase *aSAP);
+protected:
+	void Dump(RMBufChain &aPacket);
+	void LibcapDumpFileHeader();
+	void LibcapDump(const TDesC8& aBuffer, TUint32 aTimeStampSecs, TUint32 aTimeStampMicros);
+	void Queue(RMBufChain &aPacket);
+	static TInt DumpCb(TAny* aThisPtr);
+	void DumpQueuedPackets();
+
+protected:
+	TTime iTimeOrigin;
+	const TUint iId;
+	CProviderProbe *iList;
+	CAsyncCallBack iDumpCb;
+	RMBufPktQ iQueue;
+	RFs iFs;
+	RFile iFile;
+	RBuf8 iBuf;
+	TBool iFileServerOpen;
+	TBool iFileOpen;
+	TBool iBufCreated;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/inc/sap.h	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#ifndef __PROBE_SAP_H
+#define __PROBE_SAP_H
+
+#include "prt.h"
+#include "family.h"
+
+
+class CProviderProbe : public CServProviderBase
+{
+	friend class CProtocolProbe;
+public:
+	CProviderProbe(CProtocolProbe* aProtocol);
+	virtual ~CProviderProbe();
+
+	//These might be useful
+	virtual void Start();
+	virtual TInt GetOption(TUint level,TUint name,TDes8& anOption) const;
+	virtual TInt SetOption(TUint level,TUint name,const TDesC8 &anOption);
+	virtual void Ioctl(TUint level,TUint name,TDes8* anOption);
+	virtual void CancelIoctl(TUint aLevel,TUint aName);
+
+	virtual TUint Write(const TDesC8& aDesc,TUint options, TSockAddr* aAddr=NULL);
+	virtual void GetData(TDes8& aDesc,TUint options,TSockAddr* anAddr=NULL);
+
+	void Process(RMBufChain& aPacket, CProtocolBase *aSourceProtocol);
+
+	//These do nothing
+	virtual void LocalName(TSockAddr& /*anAddr*/) const
+		{ Panic(EProbePanic_NotSupported); }
+	inline virtual void RemName(TSockAddr& /*anAddr*/) const
+		{ Panic(EProbePanic_NotSupported); }
+	inline virtual void ActiveOpen()
+		{ Panic(EProbePanic_NotSupported); }
+	inline virtual void ActiveOpen(const TDesC8& /*aConnectionData*/)
+		{ Panic(EProbePanic_NotSupported); }
+	virtual void Shutdown(TCloseType aOption);
+	virtual void Shutdown(TCloseType aOption, const TDesC8& aDisconnectionData);
+	virtual void AutoBind();
+	virtual TInt SetLocalName(TSockAddr& /*anAddr*/);
+
+	inline virtual TInt SetRemName(TSockAddr& /*anAddr*/)
+		{ Panic(EProbePanic_NotSupported); return 0; }
+	inline virtual TInt PassiveOpen(TUint /*aQueSize*/)
+		{ Panic(EProbePanic_NotSupported); return 0; }
+	inline virtual TInt PassiveOpen(TUint /*aQueSize*/,const TDesC8& /*aConnectionData*/)
+		{ Panic(EProbePanic_NotSupported); return 0; }
+
+	void Error(TInt aError, TUint aOperationMask);
+	inline TBool FatalState() { return (iErrorMask & (MSocketNotify::EErrorFatal|MSocketNotify::EErrorConnect)) != 0; }
+protected:
+	CProtocolProbe *const iProtocol;
+	CProviderProbe *iNext;
+	//
+	// IsReceiving is intended for the protocol side. It is can be used by
+	// the protocol side "Deliver" method to ask if this SAP is willing to
+	// receive packets associated with the specified id.
+	virtual TBool IsReceiving(const RMBufPktInfo &info);
+
+	RMBufPktQ iRecvQ;
+	//
+	// iQueueLimit is used to control how much buffered data is allowed
+	// to be in the iRecvQ, before "congestion" control hits. The value counts
+	// bytes in iRecvQ in following way
+	// - if iQueueLimit < 0, then incoming packet is dropped (= "congestion")
+	// - if iQueueLimit >= 0, then incoming packet is added into iRecvQ, and
+	//   the length of the packet is subtracted from the iQueueLimit. When
+	//   GetData removes the packet from the queue, the length is added back
+	//   to iQueueLimit.
+	// Thus, if left as initial value (= 0), only one packet at time can be
+	// queued. If initialized to 8000, then at most 8000 bytes and 1 packet
+	// can be queued at any point.
+	TInt iQueueLimit;
+	TInt iPacketsDropped;	// Count packets dropped due "congestion"
+	TBool iInputStopped:1;
+	TUint iErrorMask;
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/src/family.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#include <e32std.h>
+#include "family.h"
+#include "prt.h"
+//
+// Nothing interesting here...
+//
+GLDEF_C TInt E32Dll()
+	{
+	return KErrNone;
+	}
+
+class CProtocolFamilyProbe : public CProtocolFamilyBase
+	{
+public:
+	CProtocolFamilyProbe();
+	~CProtocolFamilyProbe();
+	TInt Install();
+	TInt Remove();
+	TUint ProtocolList(TServerProtocolDesc *& aProtocolList);
+	CProtocolBase* NewProtocolL(TUint /*aSockType*/, TUint aProtocol);
+	};
+
+extern "C" { IMPORT_C CProtocolFamilyBase* Install(); }
+EXPORT_C CProtocolFamilyBase* Install()
+	{
+	// Due to naming convention this cannot leave
+	// However null return value handled correctly in the caller...
+	return new CProtocolFamilyProbe;
+	}
+
+//----------------------------------------------------------------------
+// Dummy protocol family declaration. Required for DLL's
+//
+
+CProtocolFamilyProbe::CProtocolFamilyProbe()
+	{
+//	__DECLARE_NAME(_S("CProtocolFamilyProbe"));
+	}
+
+CProtocolFamilyProbe::~CProtocolFamilyProbe()
+	{
+	}
+
+TInt CProtocolFamilyProbe::Install()
+	{
+	return KErrNone;
+	}
+
+TInt CProtocolFamilyProbe::Remove()
+	{
+	return KErrNone;
+	}
+
+TUint CProtocolFamilyProbe::ProtocolList(TServerProtocolDesc *& aList)
+	{
+	aList = new TServerProtocolDesc[2];
+	if (aList == NULL)
+		return 0;
+	
+	CProtocolProbe::Identify(aList[0], 1);
+	CProtocolProbe::Identify(aList[1], 2);
+	return 2;
+	}
+
+
+CProtocolBase* CProtocolFamilyProbe::NewProtocolL(TUint /*aSockType*/,
+												 TUint aProtocol)
+	{
+	return CProtocolProbe::NewL(aProtocol);
+	}
+
+void Panic(TProbePanic aPanic)
+	{
+    User::Panic(_L("PROBE"), aPanic);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/src/prt.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,354 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#include <e32std.h>
+#include <e32base.h>
+#include <f32file.h>
+#include <e32svr.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_prot_internal.h>
+#endif
+
+
+#include "family.h"
+#include "prt.h"
+#include "sap.h"
+
+_LIT(KTcpDumpFolder, "tcpdump\\");
+_LIT(KProbeDumpFile, "probe.cap");
+_LIT(KLogFolder,     "c:\\logs\\");
+
+
+CProtocolProbe::CProtocolProbe(TUint aId) : 
+iId(aId), 
+iDumpCb(CActive::EPriorityStandard),
+iFileServerOpen(EFalse),
+iFileOpen(EFalse),
+iBufCreated(EFalse)
+	{
+
+	iTimeOrigin.UniversalTime();
+
+	TCallBack cbFunc(DumpCb, this);
+	iDumpCb.Set(cbFunc);
+	}
+
+void CProtocolProbe::InitL(TDesC& aTag)
+	{
+
+	CProtocolBase::InitL(aTag);
+	}
+
+void CProtocolProbe::StartL()
+	{
+	}
+
+CProtocolProbe::~CProtocolProbe()
+	{
+	if(iFileOpen)
+	    {
+		iFile.Close();
+		iFileOpen = EFalse;
+	    }
+	if(iFileServerOpen)
+		{
+		iFs.Close();
+		iFileServerOpen = EFalse;
+		}	
+    if(iBufCreated)
+        {
+        iBuf.Close();
+        iBufCreated = EFalse;
+        }
+	}
+
+CProtocolProbe *CProtocolProbe::NewL(TUint aId)
+	{
+
+	return new (ELeave) CProtocolProbe(aId);
+	}
+
+void CProtocolProbe::Identify(TServerProtocolDesc& anEntry, TUint aId)
+	{
+
+	anEntry.iName=_S("probe");
+	if (aId > 1)
+		{
+		anEntry.iName.AppendNum(aId-1);
+		}
+
+	anEntry.iAddrFamily = KAfProbe;
+	anEntry.iSockType = KSockDatagram;
+	anEntry.iProtocol = aId;
+	anEntry.iVersion = TVersion(1, 0, 0);
+	anEntry.iByteOrder = EBigEndian;
+	anEntry.iServiceInfo = KSIDatagram | KSIConnectionLess;
+	anEntry.iNamingServices = 0;
+	anEntry.iSecurity = KSocketNoSecurity;
+	anEntry.iMessageSize = 0xffff;
+	anEntry.iServiceTypeInfo = ESocketSupport;
+	anEntry.iNumSockets = KUnlimitedSockets;
+	}
+
+void CProtocolProbe::Identify(TServerProtocolDesc *aDesc) const
+	{
+
+	Identify(*aDesc, iId);
+	}
+
+CServProviderBase* CProtocolProbe::NewSAPL(TUint aProtocol)
+	{
+
+	if (aProtocol != KSockDatagram)
+		{
+		User::Leave(KErrNotSupported);
+		}
+
+	CProviderProbe* sap = new (ELeave) CProviderProbe(this);
+	sap->iNext = iList;
+	iList = sap;
+	return sap;
+	}
+
+//
+// CProtocolProbe::CancelSAP
+// *************************
+// Disconnect SAP from the protocol
+//
+void CProtocolProbe::CancelSAP(CServProviderBase *aSAP)
+	{
+	
+	CProviderProbe **h, *sap;
+	for (h = &iList; (sap = *h) != NULL; h = &sap->iNext)
+		if (sap == aSAP)
+			{
+			*h = sap->iNext;
+			break;
+			}
+	}
+
+// CProtocolProbe::NetworkAttachedL
+// ********************************
+// When network becomes available, do the hooking!
+//
+void CProtocolProbe::NetworkAttachedL()
+	{
+
+	NetworkService()->BindL(this, MIp6Hook::BindPostHook());
+	NetworkService()->BindL(this, MIp6Hook::BindPostHook()+1);
+
+	// initialise dump file
+	if(iFileOpen)
+		{
+		iFile.Close();
+		iFileOpen = EFalse;
+		}
+	if(iFileServerOpen)
+		{
+		iFs.Close();
+		iFileServerOpen = EFalse;
+		}
+
+	User::LeaveIfError(iFs.Connect());
+    iFileServerOpen = ETrue;
+    TBuf<50> filename;
+    filename.Append(KLogFolder);
+    filename.Append(KTcpDumpFolder);
+    filename.Append(KProbeDumpFile);
+	User::LeaveIfError(iFile.Replace(iFs, filename, EFileWrite));
+    iFileOpen = ETrue;
+
+    // allocate buffer
+    if(!iBufCreated)
+        {
+        iBuf.CreateL(65535);
+        iBufCreated = ETrue;
+        }
+    
+	LibcapDumpFileHeader();
+	}
+
+//
+//	CProtocolProbe::Dump
+//	***********************
+//	Log the packet to file
+//
+void CProtocolProbe::Dump(RMBufChain &aPacket)
+	{
+
+	RMBufPacket packet;
+	packet.Assign(aPacket);
+	RMBufPktInfo* info = packet.Unpack();
+
+	TUint32 secs = static_cast<TUint32>(info->iProtocol);
+	TUint32 micros = static_cast<TUint32>(info->iFlags);
+
+    iBuf.SetMax();
+    packet.CopyOut(iBuf, 0);
+    if(iBuf.Length() != info->iLength)
+        {
+        iBuf.SetLength(info->iLength);
+        }
+	LibcapDump(iBuf, secs, micros);
+	packet.Free();
+	}
+
+TInt CProtocolProbe::Send(RMBufChain &aPacket, CProtocolBase* aSrc)
+	{
+
+	Queue(aPacket);
+	return CProtocolPosthook::Send(aPacket, aSrc);
+	}
+
+void CProtocolProbe::Process(RMBufChain &aPacket, CProtocolBase* aSrc)
+	{
+
+	Queue(aPacket);
+	CProtocolPosthook::Process(aPacket, aSrc);
+	}
+
+void CProtocolProbe::LibcapDumpFileHeader()
+//
+//  Dump file header in a format compatible with Libcap
+//
+//  Format is:
+//  
+//  struct FileHeader
+//      {
+//	    TUint32 magic; 
+//	    TUint16 version_major;
+//	    TUint16 version_minor;
+//	    TUint32 thiszone;	/* gmt to local correction */
+//	    TUint32 sigfigs;	/* accuracy of timestamps */
+//	    TUint32 snaplen;	/* max length saved portion of each pkt */
+//	    TUint32 linktype;	/* data link type (LINKTYPE_*) */
+//      };
+//
+//  Note LINKTYPE specified in libpcap/bpf/net/bpf.h (see www.tcpdump.org)
+//
+	{
+
+	TBuf8<sizeof(TUint32)*5+sizeof(TUint16)*2> fileHeader;
+	*((TUint32*) &(fileHeader.Ptr()[0])) = 0xa1b2c3d4;
+	*((TUint16*) &(fileHeader.Ptr()[4])) = 0x02; 
+	*((TUint16*) &(fileHeader.Ptr()[6])) = 0x04; 
+	*((TUint32*) &(fileHeader.Ptr()[8])) = 0x00;
+	*((TUint32*) &(fileHeader.Ptr()[12])) = 0x00;
+	*((TUint32*) &(fileHeader.Ptr()[16])) = 0xffff;
+	*((TUint32*) &(fileHeader.Ptr()[20])) = 12;       // DLT_RAW		12	/* raw IP */
+	fileHeader.SetLength(fileHeader.MaxLength());
+
+	iFile.Write(fileHeader);
+	}
+
+void CProtocolProbe::LibcapDump(const TDesC8& aBuffer, TUint32 aTimeStampSecs, TUint32 aTimeStampMicros)
+//
+//  Dumps a packet in a format compatbible with Libcap
+//
+//  For each record the format is:
+//
+//  struct record 
+//      {
+//      TUint32 sec;	/* time stamp - secs*/
+//      TUint32 usec;	/* time stamp - microsecs*/
+//      TUint32 captureLen;	/* length packet captured */
+//      TUint32 packetLen;	/* total length of packet*/
+//      };
+//
+//  Byte ordering of the header is little endian
+//  Byte ordering of the packet is network byte order (big endian)
+//
+	{
+	
+	TBuf8<sizeof(TUint32)*4> recordHeader;
+	recordHeader.FillZ();
+
+	*((TUint32*) &(recordHeader.Ptr()[0])) = aTimeStampSecs;
+	*((TUint32*) &(recordHeader.Ptr()[4])) = aTimeStampMicros;
+	*((TUint32*) &(recordHeader.Ptr()[8])) = aBuffer.Length();
+	*((TUint32*) &(recordHeader.Ptr()[12])) = aBuffer.Length();
+	recordHeader.SetLength(recordHeader.MaxLength());
+
+	iFile.Write(recordHeader);
+	iFile.Write(aBuffer);
+	}
+
+void CProtocolProbe::Queue(RMBufChain &aPacket)
+//
+//  Takes a copy of aPacket, adds it to the queue and triggers the callback
+//
+	{
+
+	RMBufPacketBase copy;
+	TRAPD(err, copy.CopyPackedL(aPacket));
+	if (err == KErrNone)
+		{
+
+		//
+		// Calculate packet time-stamp
+		//
+		TTime newTime;
+		newTime.UniversalTime();
+		TTimeIntervalMicroSeconds interval = newTime.MicroSecondsFrom(iTimeOrigin);
+
+		const TInt KMicrosInASecond = 1000000;
+
+		//TUint32 micros = interval.Int64().Low();
+		TUint32 micros = I64LOW(interval.Int64());//.Low();  x.Low() -> I64LOW(x)
+		TUint32 secs = micros / KMicrosInASecond;
+		micros -= (secs * KMicrosInASecond);
+
+		//
+		// Reuse the protocol and flags fields of
+		// RMBufPktInfo to store the time-stamp
+		//
+		RMBufPktInfo* info = RMBufPacket::PeekInfoInChain(copy);
+		info->iProtocol = static_cast<TInt>(secs);
+		info->iFlags = static_cast<TUint>(micros);
+
+		iQueue.Append(copy);
+		iDumpCb.CallBack();
+		}
+	else
+		{
+		copy.Free();
+		}
+	}
+
+TInt CProtocolProbe::DumpCb(TAny* aThisPtr)
+//
+//  Callback function - calls DumpQueuedPackets()
+//
+	{
+
+	CProtocolProbe* self = static_cast<CProtocolProbe*>(aThisPtr);
+	self->DumpQueuedPackets();
+	return KErrNone;
+	}
+
+void CProtocolProbe::DumpQueuedPackets()
+//
+//  Dumps all packets on the queue to the log file
+//
+	{
+
+	RMBufPacketBase packet;
+	while(iQueue.Remove(packet))
+		{
+		Dump(packet);
+		}
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/src/sap.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#include "sap.h"
+
+
+CProviderProbe::CProviderProbe(CProtocolProbe* aProtocol) : iProtocol(aProtocol)
+	{
+//	__DECLARE_NAME(_S("CProviderProbe"));
+	iQueueLimit = 8000;
+	}
+
+CProviderProbe::~CProviderProbe()
+	{
+	if (iProtocol)
+		iProtocol->CancelSAP(this);
+	}
+
+void CProviderProbe::Start()
+	{
+	}
+
+TInt CProviderProbe::GetOption(TUint /*aLevel*/, TUint /*aName*/, TDes8& /*aOption*/) const
+	{
+	return KErrNotSupported;
+	}
+
+TInt CProviderProbe::SetOption(TUint /*aLevel*/, TUint /*aName*/, const TDesC8& /*aOption*/)
+	{
+//	return KErrNotSupported;
+	return KErrNone;
+	}
+
+void CProviderProbe::Ioctl(TUint /*level*/,TUint /*name*/,TDes8* /*anOption*/)
+	{
+	Panic(EProbePanic_NotSupported);
+	}
+
+void CProviderProbe::CancelIoctl(TUint /*aLevel*/,TUint /*aName*/)
+	{
+	Panic(EProbePanic_NotSupported);
+	}
+
+
+TUint CProviderProbe::Write(const TDesC8 &/*aDesc*/, TUint /*aOptions*/, TSockAddr* /*aAddr*/)
+	{
+	// For now, Write does nothing on probe socket
+	return 1;
+	}
+
+void CProviderProbe::Shutdown(TCloseType /*option*/,const TDesC8& /*aDisconnectionData*/)
+	{
+	Panic(EProbePanic_NotSupported);
+	}
+
+void CProviderProbe::Shutdown(TCloseType aOption)
+	{
+	switch(aOption)
+		{
+		case EStopInput:
+			iInputStopped = ETrue;
+			iRecvQ.Free();
+			iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone
+			break;
+
+		case EStopOutput:
+			iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone
+			break;
+
+		default:
+	        if (aOption != EImmediate)
+				iSocket->CanClose();
+		}
+	}
+
+TInt CProviderProbe::SetLocalName(TSockAddr &/*aAddr*/)
+	{
+	return 0;	// Ignore silently
+	}
+
+void CProviderProbe::AutoBind()
+	{
+	// Ignore silently
+	}
+
+// CProviderProbe::Error
+// *********************
+// Soft errors are not immediately reported to the socket server.
+// A soft error is indicated by a zero aOperationMask.
+//
+// The socket error can be cleared by calling this routing with
+// aError == KErrNone.
+//
+void CProviderProbe::Error(TInt aError, TUint aOperationMask)
+	{
+	if (aError <= KErrNone && !FatalState())
+		{
+		if (aError == KErrNone)
+			iErrorMask = aOperationMask;
+		else
+			iErrorMask |= aOperationMask;
+	    if (iSocket && aOperationMask)
+			iSocket->Error(aError, aOperationMask);
+		}
+	}
+
+//
+// CProviderProbe::Process()
+// *************************
+// Process incoming data from the protocol object.
+//
+void CProviderProbe::Process(RMBufChain& aPacket, CProtocolBase * /*aSourceProtocol*/)
+	{
+	// iInputStopped is set at ShutDown() and no packets should be coming
+	// from the protocol after that. However, without knowing the exact
+	// details of the process model/threads, it could be possible that
+	// a Process() call has been initiated by the protocol and interrupted
+	// before the shutdown, thus there may be a need for this iInputStopped
+	// flag, although I would prefer to do without... NEED TO VERIFY IF
+	// iInputStopped is really needed!!! -- msa
+	//
+	if(!(iInputStopped ||
+		(iErrorMask & (MSocketNotify::EErrorFatal|MSocketNotify::EErrorConnect|MSocketNotify::EErrorRecv))))
+		{
+		iQueueLimit -= RMBufPacketBase::PeekInfoInChain(aPacket)->iLength;
+		iRecvQ.Append(aPacket);
+		iSocket->NewData(1);
+		}
+	else
+		aPacket.Free();
+	}
+
+// CProviderProbe::IsReceiving
+// ***************************
+//
+TBool CProviderProbe::IsReceiving(const RMBufPktInfo & /*aInfo*/)
+	{
+	if (iQueueLimit < 0)
+		{
+		// Receive Queue limit is full, cannot receive this packet
+		iPacketsDropped++;
+		return FALSE;
+		}
+	return TRUE;
+	}
+
+
+// CProviderProbe::GetData
+// ***********************
+void CProviderProbe::GetData(TDes8 &aDesc, TUint aOptions, TSockAddr *anAddr)
+	{
+	RMBufPacketBase packet;
+	if (!iRecvQ.Remove(packet))
+		Panic(EProbePanic_NoData);
+
+	const RMBufPktInfo *const info = packet.Unpack();
+
+	packet.CopyOut(aDesc, 0);
+
+	if (anAddr!=NULL)
+		*anAddr = info->iSrcAddr;
+
+	if (aOptions & KSockReadPeek)
+		{
+		packet.Pack();
+		iRecvQ.Prepend(packet);
+		iSocket->NewData(1);
+		}
+	else
+		{
+		iQueueLimit += info->iLength; // Allow more packets in..
+		packet.Free();
+		}
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/rom/ConnTest.iby	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* 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: ROM Image Component Include File for conntest.
+*
+*/
+
+#ifndef __ConnTest_IBY__
+#define __ConnTest_IBY__
+
+
+file=ABI_DIR\BUILD_DIR\ConnTest.exe               PROGRAMS_DIR\ConnTest.exe
+AUTO-BITMAP=DATAZ_\APP_BITMAP_DIR\ConnTest_AIF.mbm    APP_BITMAP_DIR\ConnTest_AIF.mbm
+data=DATAZ_\APP_BITMAP_DIR\ConnTest_AIF.mif           APP_BITMAP_DIR\ConnTest_AIF.mif
+
+data=ZSYSTEM\..\PRIVATE\10003A3F\APPS\ConnTEst_REG.RSC Private\10003a3f\apps\ConnTest_reg.rsc
+//data=DATAZ_\PRIVATE\10003A3F\APPS\ConnTEst_REG.RSC Private\10003a3f\apps\ConnTest_reg.rsc
+
+data=DATAZ_\APP_RESOURCE_DIR\ConnTest.RSC          APP_RESOURCE_DIR\ConnTest.rsc
+
+data=EPOCROOT##epoc32\data\c\private\101F7989\esock\ip.probe.esk    private\101F7989\esock\ip.probe.esk
+file=ABI_DIR\urel\probe.prt            system\libs\probe.prt 
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/ConnTestApp.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2006-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: The application class for ConnTest
+*
+*/
+
+// INCLUDE FILES
+#include <eikstart.h>
+#include    "ConnTestApp.h"
+#include    "ConnTestDocument.h"
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+//
+// ---------------------------------------------------------
+// NewApplication() 
+// Constructs CConnTestApp
+// Returns: created application object
+// ---------------------------------------------------------
+//
+LOCAL_C CApaApplication* NewApplication()
+    {
+    return new CConnTestApp;
+    }
+
+GLDEF_C TInt E32Main()
+    {
+    RDebug::Print(_L("ConnTest: E32Main()"));
+    return EikStart::RunApplication(NewApplication);
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+// ---------------------------------------------------------
+// CConnTestApp::AppDllUid()
+// Returns application UID
+// ---------------------------------------------------------
+//
+TUid CConnTestApp::AppDllUid() const
+    {
+    return KUidConnTest;
+    }
+
+   
+// ---------------------------------------------------------
+// CConnTestApp::CreateDocumentL()
+// Creates CConnTestDocument object
+// ---------------------------------------------------------
+//
+CApaDocument* CConnTestApp::CreateDocumentL()
+    {
+    return CConnTestDocument::NewL( *this );
+    }
+
+// ---------------------------------------------------------
+// E32Dll(TDllReason) 
+// Entry point function for EPOC Apps
+// Returns: KErrNone: No error
+// ---------------------------------------------------------
+//
+/*
+GLDEF_C TInt E32Dll( TDllReason )
+{
+    return KErrNone;
+}
+*/
+// End of File  
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/ConnTestAppUi.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2006-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: The application UI class for ConnTest
+*
+*/
+
+// INCLUDE FILES
+#include <avkon.hrh>
+#include <AknsUtils.h>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h> 
+#include <CMessageData.h>
+#include <TSendingCapabilities.h> 
+#include <sendui.h>
+
+#include "ConnTestAppUi.h"
+#include "ConnTestView.h"
+#include <ConnTest.rsg>
+#include "conntest.hrh"
+#include "SettingData.h"
+#include "ipdumpengine.h"
+
+// ================= MEMBER FUNCTIONS =======================
+//
+// ----------------------------------------------------------
+// CConnTestAppUi::ConstructL()
+// Default Symbian two phase constructor
+// ----------------------------------------------------------
+//
+void CConnTestAppUi::ConstructL()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestAppUi::ConstructL()"));
+    BaseConstructL();
+
+    AknsUtils::SetAvkonSkinEnabledL( ETrue );
+
+    // Show tabs for main views from resources
+    CEikStatusPane* sp = StatusPane();
+
+    // Fetch pointer to the default navi pane control
+    iNaviPane = (CAknNavigationControlContainer*)sp->ControlL( 
+            TUid::Uid(EEikStatusPaneUidNavi));
+
+    // Tabgroup has been read from resource and it were pushed to the navi pane. 
+    // Get pointer to the navigation decorator with the ResourceDecorator() function. 
+    // Application owns the decorator and it has responsibility to delete the object.
+    iDecoratedTabGroup = iNaviPane->ResourceDecorator();
+    if (iDecoratedTabGroup)
+        {
+        iTabGroup = (CAknTabGroup*) iDecoratedTabGroup->DecoratedControl();
+        }
+
+    TUid uid;
+    CConnTestView* view1;
+
+    // Create views; each view has same UI, but the data differs.
+    for(TInt i = 1; i <= KConnTestViews; i++)
+        {
+        RDebug::Print(_L("ConnTest: CConnTestAppUi::ConstructL() View=%d"), i);
+        uid.iUid = i;
+        view1 = new (ELeave) CConnTestView(uid, iSettingDataArray[i-1], iCustomPrefsDataArray[i-1]);
+        CleanupStack::PushL( view1 );
+        view1->ConstructL();
+        AddViewL( view1 );      // transfer ownership to CAknViewAppUi
+        CleanupStack::Pop(view1);    // view1
+
+        iConnTestViews.Append(view1);
+        // First view must be set to default, otherwise views and their
+        // data are not in sync.
+        if(i == 1)
+            {
+            SetDefaultViewL(*view1);
+            }
+        }
+    }
+
+
+// ----------------------------------------------------
+// CConnTestAppUi::CConnTestAppUi()
+// Constructor
+// ----------------------------------------------------
+//
+CConnTestAppUi::CConnTestAppUi(
+        TFixedArray<CSettingData*, KConnTestViews>& aSettings,
+        TFixedArray<CCustomPrefsData*, KConnTestViews>& aCustomPrefs)
+    : iSettingDataArray(aSettings), iCustomPrefsDataArray(aCustomPrefs)
+    {
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::~CConnTestAppUi()
+// Destructor
+// Frees reserved resources
+// ----------------------------------------------------
+//
+CConnTestAppUi::~CConnTestAppUi()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestAppUi::~CConnTestAppUi"));
+    if(iIpdumpEngine)
+        {
+        delete iIpdumpEngine;
+        iIpdumpEngine = NULL;
+        }
+    delete iDecoratedTabGroup;
+    iConnTestViews.Reset();
+    delete iSendUi;
+    // currently used with ->ExecuteLD, so deleted automatically elsewhere
+    // delete iWarningDialog;
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::IsLogging() 
+// Is the ip packet logging on
+// ----------------------------------------------------
+//
+TBool CConnTestAppUi::IsLogging()
+    {
+    TBool res = EFalse;
+    if(iIpdumpEngine)
+        res = iIpdumpEngine->LoggingEnabled();
+    return res;
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::HandleStatusPaneSizeChange() 
+// This is called when ever the screen size has changed
+// Takes care that the view components are resized
+// ----------------------------------------------------
+//
+void CConnTestAppUi::HandleStatusPaneSizeChange()
+    {
+    CAknViewAppUi::HandleStatusPaneSizeChange();
+    for (TInt i = 0; i < KConnTestViews; i++)
+        {
+        iConnTestViews[i]->SizeChanged();
+        }
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestAppUi::::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+//  This function is called by the EIKON framework just before it displays
+//  a menu pane. Its default implementation is empty, and by overriding it,
+//  the application can set the state of menu items dynamically according
+//  to the state of application data.
+// ------------------------------------------------------------------------------
+//
+void CConnTestAppUi::DynInitMenuPaneL(TInt /*aResourceId*/,CEikMenuPane* /*aMenuPane*/)
+    {
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::HandleCommandL(TInt aCommand)
+// Handles some of the users commands.
+// ----------------------------------------------------
+//
+void CConnTestAppUi::HandleCommandL(TInt aCommand)
+    {
+    switch ( aCommand )
+        {
+        // Parallel GET
+        case EConnTestCmdParallelGet:
+            {
+
+            TInt viewCount = 2;
+            CAknNumberQueryDialog* dlg =
+            CAknNumberQueryDialog::NewL(viewCount);
+            if( dlg->ExecuteLD(R_CONNTEST_PARALLEL_NUMBER_LAYOUT))
+                {
+                // ask engine to handle combining.
+                if ((viewCount > 0) && (viewCount <= KConnTestViews))
+                    {
+                    ParallelGetL(viewCount);
+                    }
+                }
+            }
+            break;
+            // Start logging
+        case EConnTestCmdStartIpLog:
+            StartIpLoggingL();
+            break;
+            // Stop logging
+        case EConnTestCmdStopIpLog:
+            StopIpLoggingL();
+            break;
+            // Send log
+        case EConnTestCmdSendIpLog:
+            SendLogFileL();
+            break;
+
+        case EEikCmdExit:
+            SaveL();
+            Exit();
+            break;
+
+        default:
+            break;      
+        }
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::HandleKeyEventL(
+//     const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
+// Handles UI key events.
+// ----------------------------------------------------
+//
+TKeyResponse CConnTestAppUi::HandleKeyEventL( const TKeyEvent& aKeyEvent,
+                                              TEventCode /*aType*/ )
+    {
+    if (!iTabGroup)
+        {
+        return EKeyWasNotConsumed;
+        }
+
+    TInt active = iTabGroup->ActiveTabIndex();
+    TInt count = iTabGroup->TabCount();
+
+    switch ( aKeyEvent.iCode )
+        {
+        case EKeyLeftArrow:
+            if ( active > 0 )
+                {
+                active--;
+                RDebug::Print(_L("ConnTest: CConnTestAppUi::HandleKeyEventL Switching to view %d"), active);
+                iTabGroup->SetActiveTabByIndex( active );
+                ActivateLocalViewL(TUid::Uid(iTabGroup->TabIdFromIndex(active)));
+                }
+            break;
+        case EKeyRightArrow:
+            if( (active + 1) < count )
+                {
+                active++;
+                RDebug::Print(_L("ConnTest: CConnTestAppUi::HandleKeyEventL Switching to view %d"), active);
+                iTabGroup->SetActiveTabByIndex( active );
+                ActivateLocalViewL(TUid::Uid(iTabGroup->TabIdFromIndex(active)));
+                }
+            break;
+        default:
+            return EKeyWasNotConsumed;
+            // break; get rid of cmpiler warning
+        }
+
+    return EKeyWasConsumed;
+    }
+
+// ----------------------------------------------------------------------------
+// CConnTestView::ParallelGet
+// Executes multiple HTTP gets over socket
+// ----------------------------------------------------------------------------
+//
+void CConnTestAppUi::ParallelGetL(TInt aCount)
+    {
+    for (TInt i = 0; i < aCount; i++)
+        {
+        if (!iConnTestViews[i]->IsReadyForHTTPGet())
+            {
+            _LIT(KWarning, "Not enough open connections" );
+            iWarningDialog = new (ELeave) CAknWarningNote(&iWarningDialog);
+            // notice, will be deleted automatically
+            iWarningDialog->ExecuteLD(KWarning);
+            return;
+            }
+        iConnTestViews[i]->HandleCommandL(EConnTestCmdSendPerformanceHttpGet);
+        }
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::SendLogFileL() 
+// Launches the send ui for the ip log
+// ----------------------------------------------------
+//
+void CConnTestAppUi::SendLogFileL()
+    {
+    if(!iIpdumpEngine)
+        {
+        iIpdumpEngine = CIpdumpEngine::NewL();                   
+        }
+    if(!iSendUi)
+        {
+        iSendUi = CSendUi::NewL();   
+        }
+    CMessageData* messageData = CMessageData::NewL();
+    CleanupStack::PushL(messageData);
+
+    // 
+    // Since CSendUi doesn't support sending .log or .cap files, 
+    // the file is renamed here.
+    //
+    _LIT(KNewName, "c:\\logs\\tcpdump\\probe.cap.txt"); 
+    RFs fs;
+    if (fs.Connect() == KErrNone)
+        {
+        fs.Replace(iIpdumpEngine->LogFileName(), KNewName);
+        }
+    fs.Close();
+
+    messageData->AppendAttachmentL(KNewName); 
+
+    TSendingCapabilities cap(0, 1024, TSendingCapabilities::ESupportsAttachments);
+    iSendUi->ShowQueryAndSendL(messageData, cap);
+    CleanupStack::PopAndDestroy(messageData); // messageData
+    }
+
+// ----------------------------------------------------
+// CConnTestAppUi::StartIpLoggingL() 
+// Starts the logging of the ip traffic
+// ----------------------------------------------------
+//
+void CConnTestAppUi::StartIpLoggingL()
+{
+    _LIT(KLogEnabled, "IP logging enabled: " );
+    _LIT(KLogError, "Error %d starting logging, Protocol not loaded. Try rebooting." );
+
+    if(!iIpdumpEngine)
+    {
+        iIpdumpEngine = CIpdumpEngine::NewL();                   
+    }
+    if(!iIpdumpEngine->LoggingEnabled())
+    {
+        
+        TRAPD(r, iIpdumpEngine->EnableLoggingL());
+        if(r == KErrNone)
+        {
+        	TBuf<256> tt;
+			tt.Format(KLogEnabled);
+		    tt.Append(iIpdumpEngine->LogFileName());
+
+            CAknInformationNote* note = new (ELeave) CAknInformationNote();
+            note->ExecuteLD(tt); 
+        }
+        else
+        {
+        	TBuf<64> tt;
+			tt.Format(KLogError, r);
+	        iWarningDialog = new (ELeave) CAknWarningNote(&iWarningDialog);
+	        // notice, will be deleted automatically
+            iWarningDialog->ExecuteLD(tt);
+        }
+    }
+}
+
+// ----------------------------------------------------
+// CConnTestAppUi::StopIpLoggingL() 
+// Stops the logging of the ip traffic
+// ----------------------------------------------------
+//
+void CConnTestAppUi::StopIpLoggingL()
+{
+    _LIT(KLogDisabled, "IP logging disabled" );
+    if(iIpdumpEngine && iIpdumpEngine->LoggingEnabled())
+    {
+		iIpdumpEngine->DisableLogging();
+        CAknInformationNote* note = new (ELeave) CAknInformationNote();
+        note->ExecuteLD(KLogDisabled); 
+    }
+}
+
+// End of File  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/ConnTestContainer.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,455 @@
+/*
+ * Copyright (c) 2006-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: The container class for ConnTest
+ * Shows status line and notification text editor
+ *
+ */
+
+// INCLUDE FILES
+#include <eikenv.h>
+#include <eikrted.h>
+#include <txtrich.h>
+#include <eiklabel.h>
+#include "ConnTestContainer.h"
+#include "ConnTest.pan"
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CConnTestContainer::ConstructL(const TRect& aRect)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+void CConnTestContainer::ConstructL(const TRect& aRect)
+    {
+    CreateWindowL();
+    Window().SetShadowDisabled(EFalse);
+
+    SetBlank();
+
+    // Get an alternative font for output window.
+    // Note! Only NormalFont works in output window with current
+    // build version, alternative font doesn't.
+    _LIT(KMyFontName,"Arial");
+    CFont* myFont;
+    TFontSpec myFontSpec(KMyFontName,1); // to get smallest Swiss font
+    CGraphicsDevice* screenDevice=iCoeEnv->ScreenDevice();
+    screenDevice->GetNearestFontInTwips(myFont,myFontSpec);
+    //TFontSpec testFont = myFont->FontSpecInTwips();
+    screenDevice->ReleaseFont(myFont);
+
+    // construct main text display window
+    const CFont* font = CEikonEnv::Static()->NormalFont();
+
+    TFontSpec fontspec = font->FontSpecInTwips();
+
+    TCharFormat defaultCharFormat( fontspec.iTypeface.iName, fontspec.iHeight );
+    //    TCharFormat defaultCharFormat( testFont.iTypeface.iName, testFont.iHeight );
+    TCharFormatMask defaultCharFormatMask;
+
+    defaultCharFormatMask.SetAttrib(EAttFontTypeface);
+    defaultCharFormatMask.SetAttrib(EAttFontHeight);
+
+    iParaFormat = CParaFormatLayer::NewL();
+    iCharFormat = CCharFormatLayer::NewL(defaultCharFormat,defaultCharFormatMask);
+
+    iRichText = CRichText::NewL(iParaFormat, iCharFormat);
+
+    //Create bordered edit windows.
+    iOutputWindow = new (ELeave) CEikRichTextEditor(TGulBorder(TGulBorder::EShallowRaised));
+    iOutputWindow->ConstructL(this,0,0,EEikEdwinOwnsWindow|EEikEdwinInclusiveSizeFixed|
+            EEikEdwinKeepDocument|EEikEdwinUserSuppliedText|
+            EEikEdwinLineCursor|EEikEdwinAlwaysShowSelection|
+            EEikEdwinReadOnly);
+
+    iOutputWindow->SetContainerWindowL(*this);
+
+    // Create the single line 'status' display
+    iStatusWindow = new (ELeave) CEikLabel;
+    iStatusWindow->SetContainerWindowL(*this);
+    iStatusWindow->SetNonFocusing();
+    iStatusWindow->SetTextL(_L("Uninitialised"));
+
+    TRect outputRect(Rect());
+    TRect statusRect(Rect());
+
+    // Set status display to be a single line at bottom of screen
+    statusRect.iTl.iY = statusRect.iBr.iY - iStatusWindow->MinimumSize().iHeight;
+
+    // Set main output window to occupy rest of screen
+    outputRect.iBr.iY = statusRect.iTl.iY - 1;
+
+    // Create scrollbar show tabs
+    iOutputWindow->SetAknEditorFlags(EAknEditorFlagEnableScrollBars|EAknEditorFlagNoEditIndicators);
+    
+    iOutputWindow->CreateScrollBarFrameL();
+    iOutputWindow->ScrollBarFrame()->SetScrollBarVisibilityL(
+            CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto);
+
+    iOutputWindow->SetDocumentContentL(*iRichText,CEikEdwin::EUseText);
+    iOutputWindow->SetRect(outputRect);
+    iOutputWindow->ActivateL();
+    iOutputWindow->SetFocus(ETrue);
+    iStatusWindow->SetRect(statusRect);
+
+    SetRect(aRect);
+    ActivateL();
+    iOutputWindow->UpdateScrollBarsL();
+    iOutputWindow->DrawNow();
+    SizeChanged();
+    }
+
+// ----------------------------------------------------
+// CConnTestContainer::~CConnTestContainer()
+// Destructor
+// Frees reserved resources
+// ----------------------------------------------------
+//
+CConnTestContainer::~CConnTestContainer()
+    {
+    delete iParaFormat;
+    iParaFormat = NULL;
+
+    delete iCharFormat;
+    iCharFormat = NULL;
+
+    delete iOutputWindow;
+    iOutputWindow = NULL;
+
+    delete iRichText;
+    iRichText = NULL;
+
+    delete iStatusWindow;
+    iStatusWindow = NULL;
+    }
+
+// ---------------------------------------------------------
+// CConnTestContainer::SizeChanged()
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CConnTestContainer::SizeChanged()
+    {
+    TRect outputRect(Rect());
+    TRect statusRect(Rect());
+
+    // Set status display to be a single line at bottom of screen
+    statusRect.iTl.iY = statusRect.iBr.iY - iStatusWindow->MinimumSize().iHeight;
+
+    // Find the scrollbar rectangle.
+    TRect ScrollBarRect = iOutputWindow->ScrollBarFrame()->VerticalScrollBar()->Rect();
+
+
+    // Set main output window to occupy rest of screen
+    outputRect.iBr.iY = statusRect.iTl.iY - 1;
+    outputRect.iBr.iX -= ScrollBarRect.Width();
+
+    iOutputWindow->SetRect(outputRect);
+    iOutputWindow->SetFocus(ETrue);
+    iStatusWindow->SetRect(statusRect);
+    }
+
+// ---------------------------------------------------------
+// CConnTestContainer::CountComponentControls() const
+// Note! Output window is ignored.
+// ---------------------------------------------------------
+//
+TInt CConnTestContainer::CountComponentControls() const
+    {
+    // Return nbr of controls inside this container
+    // return 2; // Returning control for rich text editor makes it override navipanel.
+    return 2;
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::ComponentControl(TInt aIndex) const
+// Note! Output window is ignored.
+// ---------------------------------------------------------
+//
+CCoeControl* CConnTestContainer::ComponentControl(TInt aIndex) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iStatusWindow;
+        case 1:
+            return iOutputWindow;
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnTestContainer::Draw(const TRect& aRect) const
+// ---------------------------------------------------------
+//
+void CConnTestContainer::Draw(const TRect& aRect) const
+    {
+    //CWindowGc& gc = SystemGc();
+    //gc.Clear(Rect());
+    CWindowGc& gc = SystemGc();
+    gc.SetPenStyle(CGraphicsContext::ENullPen);
+    gc.SetBrushColor(KRgbWhite);
+    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    gc.DrawRect(aRect);
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::HandleControlEventL(
+//     CCoeControl* aControl,TCoeEvent aEventType)
+// ---------------------------------------------------------
+//
+void CConnTestContainer::HandleControlEventL( CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/ )
+    {
+    // no implementation required.
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::SetFontStyle(TUint aFontStyle)
+// Set font style for output window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::SetFontStyle(TUint aFontStyle)
+    {
+    // Set current main window style to match that requested
+    UpdateFontAttribute(aFontStyle, CEikGlobalTextEditor::EBold);
+    UpdateFontAttribute(aFontStyle, CEikGlobalTextEditor::EItalic);
+    UpdateFontAttribute(aFontStyle, CEikGlobalTextEditor::EUnderline);
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::UpdateFontAttribute(TUint aFontStyle, 
+//                                         TInt aAttribute)
+// Do the real work of setting the font style.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::UpdateFontAttribute(TUint aFontStyle, 
+        TInt aAttribute)
+    {
+    TInt error;
+
+    // Ensure an individual attribute is on or off as requested
+    if ((aFontStyle & aAttribute) != (iFontStyle & aAttribute))
+        {
+        TRAP(error, iOutputWindow->BoldItalicUnderlineEventL(aAttribute));
+        if(error != KErrNone)
+            {
+            User::Panic (KPanicConnTest, EConnTestContainer);
+            }
+        iFontStyle ^= aAttribute;
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::PrintNotify(const TDesC& aDes, TUint aFontStyle)
+// Print text into output window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::PrintNotify(const TDesC& aDes, TUint aFontStyle)
+    {
+    SetFontStyle(aFontStyle);
+    TChar ch;
+    TInt error;
+
+    RDebug::Print(_L("ConnTest: %S"),&aDes);
+
+    for (TInt i = 0; i < aDes.Length(); i++)
+        {
+        // Add linebreak if character is '\n', otherwise 
+        // add character as it is.
+        ch = aDes[i] != 10 ? (TChar)aDes[i] : (TChar)CEditableText::ELineBreak;
+        TRAP(error, iRichText->InsertL(iOutputWindow->TextLength(), ch));
+        if(error != KErrNone)
+            {
+            User::Panic (KPanicConnTest, EConnTestContainer);
+            }
+        }
+
+    TRAP(error, iOutputWindow->NotifyNewDocumentL()); 
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+
+    TRAP(error, iOutputWindow->SetCursorPosL(iOutputWindow->TextLength(), EFalse));
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::PrintNotify(const TDesC8& aDes, TUint aFontStyle)
+// Print text into output window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::PrintNotify(const TDesC8& aDes, TUint aFontStyle)
+    {
+    SetFontStyle(aFontStyle);
+    TChar ch;
+    TInt error;
+    
+    TBuf<128> des;
+    des.Copy( aDes );
+    
+    RDebug::Print(_L("ConnTest: %S"),&des);
+    
+    TRAP(error, iRichText->InsertL(iOutputWindow->TextLength(), des));
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+
+    TRAP(error, iOutputWindow->NotifyNewDocumentL());
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+
+    TRAP(error, iOutputWindow->SetCursorPosL(iOutputWindow->TextLength(), EFalse));
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::PrintNotify(TInt aIn)
+// Print integer into output window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::PrintNotify(TInt aInt)
+    {
+    // Display number in ascii decimal
+    TBuf<50> buf;
+    buf.Num(aInt);
+    PrintNotify(buf);
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::ErrorNotify(const TDesC& aErrMessage, TInt aErrCode)
+// Display error message in an information window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::ErrorNotify(const TDesC& aErrMessage, TInt aErrCode)
+    {
+    TInt error;
+
+    // Error up call: inform user and quit
+    _LIT(KErrorTitle,"Error code ");
+    TBuf<25> errorTitleCode(KErrorTitle);
+    errorTitleCode.AppendNum(aErrCode);
+    RDebug::Print(_L("ConnTest: ErrorNotify: %S %d"), &aErrMessage, aErrCode);
+    TRAP(error, CEikonEnv::Static()->InfoWinL(errorTitleCode,aErrMessage));
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnTestContainer::PopupNotify(const TDesC& msg)
+// Display message in an information window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::PopupNotify(const TDesC& aMessage)
+    {
+    // Error up call: inform user and quit
+    /*    _LIT(KMsgTitle,"NOTE");
+    TBuf<25> titleCode(KMsgTitle);
+    TRAPD(error, CEikonEnv::Static()->InfoWinL(titleCode,aMessage));
+    if(error != KErrNone)
+    {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+    }
+     */
+    RDebug::Print(_L("ConnTest: PopupNotify: %S"), &aMessage);
+    CEikonEnv::Static()->InfoMsgWithDuration(aMessage, 1500000);
+    }
+
+// ---------------------------------------------------------
+// CConnTestContainer::SetStatus(const TDesC& aStatus)
+// Update the status line text.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::SetStatus(const TDesC& aStatus)
+    {
+    TInt error;
+
+    // Update contents of status window
+    TRAP(error, iStatusWindow->SetTextL(aStatus));
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+
+    iStatusWindow->DrawDeferred();
+    }
+
+
+// ---------------------------------------------------------
+// CConnTestContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,
+//                                    TEventCode aType)
+// Handle key event. Only up and down key arrow events are
+// consumed in order to enable scrolling in output window.
+// ---------------------------------------------------------
+//
+TKeyResponse CConnTestContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+    if(aType != EEventKey)
+        return EKeyWasNotConsumed;
+
+    if(aKeyEvent.iCode == EKeyUpArrow)
+        {
+        iOutputWindow->MoveCursorL(TCursorPosition::EFLineUp,EFalse);
+        return EKeyWasConsumed;
+        }
+
+    if(aKeyEvent.iCode == EKeyDownArrow)
+        {
+        iOutputWindow->MoveCursorL(TCursorPosition::EFLineDown,EFalse);
+        return EKeyWasConsumed;
+        }
+
+    return EKeyWasNotConsumed;
+    }
+
+// ---------------------------------------------------------
+// CConnTestContainer::ClearOutputWindow()
+// Clear the output window.
+// ---------------------------------------------------------
+//
+void CConnTestContainer::ClearOutputWindow()
+    {
+    TInt error;
+
+    iRichText->Reset();
+    TRAP(error, iOutputWindow->NotifyNewDocumentL());
+    if(error != KErrNone)
+        {
+        User::Panic (KPanicConnTest, EConnTestContainer);
+        }
+    }
+
+
+// End of File  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/ConnTestDocument.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2006-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: The document class for ConnTest, stores the settings
+*
+*/
+
+// INCLUDE FILES
+#include "ConnTestDocument.h"
+#include "ConnTestAppUi.h"
+#include "ConnTestApp.h"
+#include "SettingData.h"
+#include "CustomPrefsData.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// constructor
+CConnTestDocument::CConnTestDocument(CEikApplication& aApp)
+    : CEikDocument(aApp)    
+    {
+    }
+
+// destructor
+CConnTestDocument::~CConnTestDocument()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestDocument::~CConnTestDocument"));
+    for(TInt i = 0; i < KConnTestViews; i++)
+        {
+        delete iSettingDataArray[i];
+        delete iCustomPrefsDataArray[i];
+        }
+    }
+
+// Symbian default constructor can leave.
+void CConnTestDocument::ConstructL()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestDocument::ConstructL"));
+    for(TInt i = 0; i < KConnTestViews; i++)
+        {
+        iSettingDataArray[i] = CSettingData::NewL();
+        iCustomPrefsDataArray[i] = CCustomPrefsData::NewL();
+        }
+    }
+
+// Two-phased constructor.
+CConnTestDocument* CConnTestDocument::NewL(CEikApplication& aApp)
+    {
+    CConnTestDocument* self = new (ELeave) CConnTestDocument( aApp );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ----------------------------------------------------
+// CConnTestDocument::CreateAppUiL()
+// constructs CConnTestAppUi
+// ----------------------------------------------------
+//
+CEikAppUi* CConnTestDocument::CreateAppUiL()
+    {
+    return new (ELeave) CConnTestAppUi(iSettingDataArray, iCustomPrefsDataArray);
+    }
+
+
+// ----------------------------------------------------
+// CConnTestDocument::StoreL()
+// Store current settings into file \\private\\101F6D2B\\ConnTest
+// ----------------------------------------------------
+//
+void CConnTestDocument::StoreL(CStreamStore& aStore, 
+                               CStreamDictionary& aStreamDic) const
+    {
+    RStoreWriteStream stream;
+    TStreamId id = stream.CreateLC(aStore);
+    for(TInt i = 0; i < KConnTestViews; i++)
+        {
+        stream << iSettingDataArray[i]->iServerName;
+        stream.WriteInt32L(iSettingDataArray[i]->iPort);
+        stream.WriteInt32L(iSettingDataArray[i]->iProtocol);
+        stream.WriteInt32L(iSettingDataArray[i]->iRoaming);
+        stream.WriteInt32L(iSettingDataArray[i]->iPacketSize);
+        stream.WriteInt32L(iSettingDataArray[i]->iPackets);
+        stream.WriteInt32L(iSettingDataArray[i]->iDelay);
+        stream << iSettingDataArray[i]->iHttpPage;
+        }
+    stream.CommitL();
+    CleanupStack::PopAndDestroy(&stream); // stream
+    aStreamDic.AssignL(KUidConnTest, id);
+    }
+
+
+// ----------------------------------------------------
+// CConnTestDocument::RestoreL()
+// Read previous settings from file
+// ----------------------------------------------------
+//
+void CConnTestDocument::RestoreL(const CStreamStore& aStore, 
+                                 const CStreamDictionary& aStreamDic)
+    {
+    TStreamId id = aStreamDic.At(KUidConnTest);
+    RStoreReadStream stream;
+    stream.OpenLC(aStore, id);
+    for(TInt i = 0; i < KConnTestViews; i++)
+        {
+        stream >> iSettingDataArray[i]->iServerName;
+        iSettingDataArray[i]->iPort       = stream.ReadInt32L();
+        iSettingDataArray[i]->iProtocol   = stream.ReadInt32L();
+        iSettingDataArray[i]->iRoaming    = stream.ReadInt32L();
+        iSettingDataArray[i]->iPacketSize = stream.ReadInt32L();
+        iSettingDataArray[i]->iPackets    = stream.ReadInt32L();
+        iSettingDataArray[i]->iDelay      = stream.ReadInt32L();
+        stream >> iSettingDataArray[i]->iHttpPage;
+        }
+    CleanupStack::PopAndDestroy(&stream); // stream    
+    }
+
+
+// End of File  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/ConnTestView.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,1316 @@
+/*
+* Copyright (c) 2006-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: The view class for ConnTest
+* Implements command handling, menu initializing and view activation
+*
+*/
+
+// INCLUDE FILES
+#include <aknViewAppUi.h>
+#include <akntitle.h>
+#include <avkon.hrh>
+#include <AknGlobalNote.h>
+
+#include <ConnTest.rsg>
+#include "ConnTestView.h"
+#include "ConnTestContainer.h"
+#include "CustomPrefsItemList.h"
+#include "CustomPrefsData.h"
+#include "SettingItemList.h"
+#include "SettingData.h"
+#include "SocketsEngine.h"
+#include "Utils.h"
+#include <wlanmgmtclient.h>
+#include "ConnTestAppUi.h"
+
+
+// CONSTANTS
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ---------------------------------------------------------
+// CConnTestView::CConnTestView(const TUid aViewId)
+// Constructor
+// ---------------------------------------------------------
+//
+CConnTestView::CConnTestView(const TUid aViewId)
+    : iViewId(aViewId), iWaiter( NULL )
+    {
+    RDebug::Print(_L("ConnTest: CConnTestView::CConnTestView( aViewId )"));
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::CConnTestView(const TUid aViewId,
+//                              CSettingData* aSettings,
+//                              CCustomPrefsData* aCustomPrefs)
+// Constructor
+// ---------------------------------------------------------
+//
+CConnTestView::CConnTestView(const TUid aViewId, CSettingData* aSettings, CCustomPrefsData* aCustomPrefs)
+    : iViewId(aViewId), iSettingData(aSettings), iCustomPrefsData(aCustomPrefs), iWaiter( NULL )
+    {
+    RDebug::Print(_L("ConnTest: CConnTestView::CConnTestView( aViewId, aSettings, aCustomPrefs )"));
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::ConstructL()
+// EPOC two-phased constructor
+// ---------------------------------------------------------
+//
+void CConnTestView::ConstructL()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestView::ConstructL"));
+    BaseConstructL( R_CONNTEST_VIEW1 );
+    iSendData = HBufC8::NewL(KMaxSendBuffer);
+    RDebug::Print(_L("ConnTest: CConnTestView::ConstructL iWlanMgmtClient"));
+    TRAPD(err,iWlanMgmtClient = CWlanMgmtClient::NewL());
+    if (err == KErrNone)
+        {
+        iSupportsWlan = ETrue;
+        }
+    else
+        {
+        iSupportsWlan = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::~CConnTestView()
+// Destructor
+// ---------------------------------------------------------
+//
+CConnTestView::~CConnTestView()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestView::~CConnTestView"));
+    if ( iContainer )
+        {
+        AppUi()->RemoveFromViewStack( *this, iContainer );
+        }
+    
+    delete iSocketsEngine;
+    delete iContainer;
+    delete iSettingsListBox;
+    delete iCustomPrefsListBox;
+    //    delete iSettingData; owned now by CConnTestDocument
+    if(iSendData)
+        {
+        delete iSendData;
+        iSendData = NULL;   
+        
+        if ( iSupportsWlan && iWlanMgmtClient )
+            {
+            iWlanMgmtClient->CancelNotifications();
+            delete iWlanMgmtClient;
+            }           
+        }
+    }
+
+// ---------------------------------------------------------
+// TUid CConnTestView::Id()
+// Return id of this view instance
+// ---------------------------------------------------------
+//
+TUid CConnTestView::Id() const
+    {
+    //return KViewId;
+    return iViewId;
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::HandleCommandL(TInt aCommand)
+// Command handler
+// ---------------------------------------------------------
+//
+void CConnTestView::HandleCommandL(TInt aCommand)
+    {   
+    switch ( aCommand )
+        {
+        case EAknSoftkeyExit:
+            iSocketsEngine->Cancel();
+            AppUi()->HandleCommandL(EEikCmdExit);
+            break;
+            
+        case EAknSoftkeyOk:       
+        case EAknSoftkeyBack:
+            // Same actions for OK and Back keys. These are called
+            // from settings or Ext Connection Preferences view.
+            if (iActiveContainer == ESettingsContainer)
+                {
+                // Store settings and update the values
+                // in socket engine.
+                iSettingsListBox->StoreSettingsL();
+                iSocketsEngine->SetConnectionData(iSettingData);
+                }
+            else // ECustomPrefsContainer
+                {
+                // Store the custom preferences and update the values
+                // in socket engine.
+                iCustomPrefsListBox->StoreSettingsL();
+                iSocketsEngine->SetCustomPrefsData(iCustomPrefsData);                
+                }
+            SwapContainerL(EOutputContainer);
+            break;
+            
+        case EConnTestCmdStartInterface:
+            // Start the interface
+            iSocketsEngine->StartInterfaceL(CSocketsEngine::EAskIap);
+            break;
+            
+        case EConnTestCmdStartSnap:
+            //start connection with snap
+            iSocketsEngine->StartConnWithSnapL();
+            break;
+            
+        case EConnTestCmdStartInterfaceExtConnPrefs:
+            // Start the interface using Extended Connection Preferences
+            RDebug::Print(_L("ConnTest: Start ExtConnPrefs"));
+            iSocketsEngine->StartInterfaceL(CSocketsEngine::EExtPrefs);
+            break;
+            
+        case EConnTestCmdStartInternet:
+            // Start the interface using Extended Connection Preferences
+            RDebug::Print(_L("ConnTest: Start Internet"));
+            iSocketsEngine->StartInterfaceL(CSocketsEngine::EExtPrefsInternet);
+            break;
+                
+        case EConnTestCmdStartInterfaceNoPrefs:
+            // Start the interface
+            iSocketsEngine->StartInterfaceL(CSocketsEngine::ENoPrefs);
+            break;
+            
+        case EConnTestCmdStartByNetworkId:
+            // Start the interface with network id
+            iSocketsEngine->StartInterfaceL(CSocketsEngine::ENetworkId);
+            break;
+            
+        case EConnTestCmdStopInterface:
+            // Stop the interface with RConnection::Stop
+            iSocketsEngine->StopInterfaceL();
+            break;
+            
+        case EConnTestCmdStartForClose:
+            // Stop the interface with RConnection::Close
+            iSocketsEngine->StartCloseInterfaceL();
+            break;
+            
+        case EConnTestCmdCloseInterface:
+            // Stop the interface with RConnection::Close
+            iSocketsEngine->CloseInterface();
+            break;
+            
+        case EConnTestCmdConnectionInfo:
+            // Print information about the active connections
+            iSocketsEngine->ConnectionInfoL();
+            break;
+            
+        case EConnTestCmdInterfaceInfo:
+            // Print information about interfaces. Show wait note here,
+            // because this usually takes a while.
+            {            
+            TInt permanentNoteId;
+            CAknGlobalNote* globalNote = CAknGlobalNote::NewL();
+            CleanupStack::PushL(globalNote);
+            globalNote->SetSoftkeys(R_AVKON_SOFTKEYS_EMPTY);
+            permanentNoteId = globalNote->ShowNoteL( EAknGlobalWaitNote, _L("Fetching information...") );
+            
+            iSocketsEngine->InterfaceInfoL();
+            
+            globalNote->CancelNoteL(permanentNoteId);
+            CleanupStack::PopAndDestroy(globalNote); // globalNote
+            }
+            break;
+            
+        case EConnTestCmdClearOutputWindow:
+            // Clear the output window
+            iContainer->ClearOutputWindow();
+            break;
+            
+        case EConnTestCmdSettings:
+            // Display settings list
+            SwapContainerL(ESettingsContainer);
+            break;
+            
+        case EConnTestCmdSetCustomPrefs:
+            // Display Custom Preferences list
+            SwapContainerL(ECustomPrefsContainer);
+            break;
+            
+        case EConnTestCmdMigrate:
+            iSocketsEngine->Migrate();
+            break;
+        case EConnTestCmdIgnore:
+            iSocketsEngine->Ignore();
+            break;
+        case EConnTestCmdAccept:
+            iSocketsEngine->AcceptCarrier();
+            break;
+        case EConnTestCmdReject:
+            iSocketsEngine->RejectCarrier();
+            break;
+        case EConnTestCmdConnect:
+            // Connect the socket
+            iSocketsEngine->ConnectL();
+            break;
+            
+        case EConnTestCmdDisconnect:
+            // Disconnect the socket but do not stop the interface
+            iSocketsEngine->Disconnect();
+            break;
+            
+        case EConnTestCmdListen:
+            // Create TCP socket that listens and receives raw TCP data
+            iSocketsEngine->ListenL();
+            break;
+            
+        case EConnTestCmdSendHttpGet:
+            {
+            // Send HTTP Get
+            iSocketsEngine->SendHttpRequestOverSocketL(EFalse, EFalse);
+            }
+            break;
+            
+        case EConnTestCmdSendPerformanceHttpGet:
+            {
+            // Send HTTP Get
+            if (iSocketsEngine->GetSocketEngineState() == CSocketsEngine::EConnected)
+                {
+                iSocketsEngine->SendHttpRequestOverSocketL(EFalse, ETrue);
+                }
+            }
+            break;
+            
+        case EConnTestCmdSendHttpPost:
+            {
+            // Send HTTP Post
+            iSocketsEngine->SendHttpRequestOverSocketL(ETrue, ETrue);
+            }
+            break;
+            
+        case EConnTestCmdSendRawData:
+            // Send datagrams
+            CreateDataPacket();
+            SendDataL();
+            break;
+            
+        case EConnTestCmdHttpFrameworkGet:
+            // Send HTTP request (for testing the HTTP framework)
+            iSocketsEngine->SendHttpFrameworkRequestL(EFalse, EFalse, EFalse);
+            break;
+            
+        case EConnTestCmdHttpFrameworkPost:
+            // Send HTTP request (for testing the HTTP framework)
+            iSocketsEngine->SendHttpFrameworkRequestL(ETrue, EFalse, EFalse);
+            break;
+            
+        case EConnTestCmdHttpFrameworkSecureGet:
+            // Send HTTP request (for testing the HTTP framework)
+            iSocketsEngine->SendHttpFrameworkRequestL(EFalse, EFalse, ETrue);
+            break;
+            
+        case EConnTestCmdHttpFrameworkPerformanceGet:
+            // Send HTTP request (for testing the HTTP framework)
+            iSocketsEngine->SendHttpFrameworkRequestL(EFalse, ETrue, EFalse);
+            break;
+            
+        case EConnTestCmdHttpFrameworkPerformancePost:
+            // Send HTTP request (for testing the HTTP framework)
+            iSocketsEngine->SendHttpFrameworkRequestL(ETrue, ETrue, EFalse);
+            break;
+            
+        case EConnTestCmdCancel:
+            // Cancel ongoing operation
+            iSocketsEngine->Cancel();
+            break;
+            
+        case EConnTestCmdConnectionPrefsIap:
+            // Write IapId value to ConnectionPreferences table
+            TRAPD(err, Utils::SetConnectionPrefsIapL());
+            if(err)
+                {
+                if(err == KErrNotFound)
+                    {
+                    iContainer->ErrorNotify(_L("Non-existing id"), err);
+                    }
+                else
+                    {
+                    iContainer->ErrorNotify(_L("Setting id failed"), err);
+                    }
+                }
+            break;
+            
+        case EConnTestCmdTimeoutLastSocketActivity:
+            // Set LastSocketActivity
+            TRAPD(err2, Utils::SetTimeoutsL(EConnTestCmdTimeoutLastSocketActivity));
+            if(err2)
+                {
+                iContainer->ErrorNotify(_L("Failed to set timer"), err2);
+                }        
+            break;
+            
+        case EConnTestCmdTimeoutLastSocketClosed:
+            // Set LastSocketClosed
+            TRAPD(err3, Utils::SetTimeoutsL(EConnTestCmdTimeoutLastSocketClosed));
+            if(err3)
+                {
+                iContainer->ErrorNotify(_L("Failed to set timer"), err3);
+                }        
+            break;
+            
+        case EConnTestCmdTimeoutLastSessionClosed:
+            // Set LastSessionClosed
+            TRAP(err, Utils::SetTimeoutsL(EConnTestCmdTimeoutLastSessionClosed));
+            if(err)
+                {
+                iContainer->ErrorNotify(_L("Failed to set timer"), err);
+                }        
+            break;
+            
+        case EConnTestCmdWLANQoSVoice:
+            iSocketsEngine->SetWLANQoS(7);
+            break;
+            
+        case EConnTestCmdWLANQoSVideo:
+            iSocketsEngine->SetWLANQoS(5);
+            break;
+            
+        case EConnTestCmdWLANQoSBestEffort:
+            iSocketsEngine->SetWLANQoS(3);
+            break;
+            
+        case EConnTestCmdWLANQoSBackground:
+            iSocketsEngine->SetWLANQoS(1);
+            break;
+            
+        case EConnTestCmdWLANQoSNone:
+            iSocketsEngine->SetWLANQoS(0);
+            break;
+            
+            
+            //
+            // WLAN COMMANDS
+            // 
+        case EConnTestWlanAvailableIaps:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            iWaiter = new (ELeave) CConnTestViewWaiter( iWlanMgmtClient, *this, EConnTestWaitTypeAvailableIaps );
+            iWaiter->ConstructL();
+            iWaiter->IssueRequest();
+            }
+            break;
+            
+        case EConnTestWlanScan:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            iWaiter = new (ELeave) CConnTestViewWaiter( iWlanMgmtClient, *this, EConnTestWaitTypeScan );
+            iWaiter->ConstructL();
+            iWaiter->IssueRequest();
+            }
+            break;
+            
+        case EConnTestWlanGetSsid:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            TWlanSsid ssid;
+            TInt ret = iWlanMgmtClient->GetConnectionSsid( ssid );
+            if( ret )
+                {
+                RDebug::Print( _L( "ConnTest: Error: %d" ), ret );
+                break;
+                }
+            
+            RDebug::Print( _L( "ConnTest: SSID = %S" ), &ssid );
+            
+            TBuf8<64> text;
+            text.Append(_L8("SSID: "));
+            text.Append(ssid);
+            text.Append(_L8("\n"));
+            iContainer->PrintNotify(text);
+            }
+            break;
+            
+        case EConnTestWlanGetBssid:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            TWlanBssid bssid;
+            TInt ret = iWlanMgmtClient->GetConnectionBssid( bssid );
+            if( ret )
+                {
+                RDebug::Print( _L( "ConnTest: Error: %d" ), ret );
+                break;
+                }
+            
+            RDebug::Print( _L( "ConnTest: BSSID = %S" ), &bssid );
+            
+            TBuf8<64> text;
+            text.AppendFormat(_L8("BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n"), bssid[0], bssid[1], bssid[2], bssid[3],bssid[4], bssid[5] );
+            iContainer->PrintNotify(text);
+            }
+            break;
+            
+        case EConnTestWlanGetRssi:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            TInt32 rssi32;
+            TInt ret = iWlanMgmtClient->GetConnectionSignalQuality( rssi32 );
+            if( ret )
+                {
+                RDebug::Print( _L( "ConnTest: Error: %d" ), ret );
+                break;
+                }
+            
+            RDebug::Print( _L( "ConnTest: RSSI = %d" ), rssi32 );
+            
+            TInt8 rssi8 = static_cast<TInt8>(rssi32);
+            TBuf8<64> text;
+            text.AppendFormat(_L8("RSSI: %d\n"), rssi8);
+            iContainer->PrintNotify(text);
+            }
+            break;
+            
+        case EConnTestWlanGetConnMode:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            TWlanConnectionMode connMode;
+            TInt ret = iWlanMgmtClient->GetConnectionMode( connMode );
+            if( ret )
+                {
+                RDebug::Print( _L( "ConnTest: Error: %d" ), ret );
+                break;
+                }
+            
+            RDebug::Print( _L( "ConnTest: ConnectionMode = %d" ), connMode );
+            
+            TBuf8<64> text;
+            text.Append(_L8("Mode: "));
+            switch( connMode )
+                {
+                case EWlanConnectionModeNotConnected:
+                    text.Append(_L8("Not Connected"));
+                    break;
+                case EWlanConnectionModeInfrastructure:
+                    text.Append(_L8("Infrastructure"));
+                    break;
+                case EWlanConnectionModeAdhoc:
+                    text.Append(_L8("Ad hoc"));
+                    break;
+                case EWlanConnectionModeSecureInfra:
+                    text.Append(_L8("SecureInfra"));
+                    break;
+                case EWlanConnectionModeSearching:
+                    text.Append(_L8("Searching"));
+                    break;
+                }
+            text.Append(_L8("\n"));
+            iContainer->PrintNotify(text);
+            }
+            break;
+            
+        case EConnTestWlanGetSecurityMode:
+            {
+            if (!iSupportsWlan) { iContainer->PrintNotify(_L("WLAN not supported\n")); break; }
+            TWlanConnectionSecurityMode securityMode;
+            TInt ret = iWlanMgmtClient->GetConnectionSecurityMode( securityMode );
+            if( ret )
+                {
+                RDebug::Print( _L( "ConnTest: Error: %d" ), ret );
+                break;
+                }
+            
+            RDebug::Print( _L( "ConnTest: SecurityMode = %d" ), securityMode );
+            
+            TBuf8<64> text;
+            text.Append(_L8("Mode: "));
+            switch( securityMode )
+                {
+                case EWlanConnectionSecurityOpen:
+                    text.Append(_L8("Open"));
+                    break;
+                case EWlanConnectionSecurityWep:
+                    text.Append(_L8("WEP"));
+                    break;
+                case EWlanConnectionSecurity802d1x:
+                    text.Append(_L8("802.1X"));
+                    break;
+                case EWlanConnectionSecurityWpa:
+                    text.Append(_L8("WPA"));
+                    break;
+                case EWlanConnectionSecurityWpaPsk:
+                    text.Append(_L8("WPA-PSK"));
+                    break;
+                }
+            text.Append(_L8("\n"));
+            iContainer->PrintNotify(text);
+            }
+            break;
+            
+        default:
+            {
+            AppUi()->HandleCommandL( aCommand );
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::HandleClientRectChange()
+// ---------------------------------------------------------
+//
+void CConnTestView::SizeChanged()
+    {
+    if(iContainer)
+        {
+        iContainer->SetRect(ClientRect());
+        }
+    if(iSettingsListBox)
+        {
+        iSettingsListBox->SetRect(ClientRect());
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::DoActivateL(...)
+// Activation of this view instance.
+// ---------------------------------------------------------
+//
+void CConnTestView::DoActivateL( const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
+                                 const TDesC8& /*aCustomMessage*/)
+    {
+    if(!iContainer)
+        {
+        RDebug::Print(_L("ConnTest: CConnTestView::DoActivateL iContainer"));
+        iContainer = new (ELeave) CConnTestContainer;
+        iContainer->SetMopParent(this);
+        iContainer->ConstructL( ClientRect() );
+        //AppUi()->AddToStackL( *this, iContainer );
+        } 
+    AppUi()->AddToStackL( *this, iContainer );
+    
+    // Connection data for this view
+    if(!iSettingData)
+        {
+        // Note! Document class owns now settings, so that they can
+        // be stored into file.
+        //iSettingData = CSettingData::NewL(); owned now by CConnTestDocument
+        }
+    
+    // Create socket engine with initial data
+    if(!iSocketsEngine) 
+        {
+        RDebug::Print(_L("ConnTest: CConnTestView::DoActivateL iSocketsEngine"));
+        iSocketsEngine = CSocketsEngine::NewL(*iContainer);
+        iSocketsEngine->SetConnectionData(iSettingData);
+        }
+    
+    // Create settings list
+    if(!iSettingsListBox)
+        {
+        RDebug::Print(_L("ConnTest: CConnTestView::DoActivateL iSettingsListBox"));
+        CreateSettingsListBoxL(R_CONNTEST_SETTING_LIST);
+        }    
+
+    // Create Custom Preferences list
+    if(!iCustomPrefsListBox)
+        {
+        RDebug::Print(_L("ConnTest: CConnTestView::DoActivateL iCustomPrefsListBox"));
+        CreateCustomPrefsListBoxL(R_CONNTEST_CUSTOM_PREFS_LIST);
+        }
+    
+    iActiveContainer = EOutputContainer;
+    iContainer->MakeVisible(ETrue);
+    SizeChanged();
+    
+    if ( iSupportsWlan )
+        {
+        RDebug::Print(_L("ConnTest: CConnTestView::DoActivateL iWlanMgmtClient->ActivateNotificationsL"));
+        iWlanMgmtClient->ActivateNotificationsL( *this );
+        }        
+    }
+
+// ---------------------------------------------------------
+// CConnTestView::DoDeactivate()
+// Deactivation of this view instance. Controls are not 
+// deleted, so that old information in status and output
+// windows stays visible.
+// ---------------------------------------------------------
+//
+void CConnTestView::DoDeactivate()
+    {
+    if ( iSupportsWlan )
+        {
+        iWlanMgmtClient->CancelNotifications();
+        }        
+    
+    if ( iContainer )
+        {
+        AppUi()->RemoveFromStack( iContainer );
+        }
+    iContainer->MakeVisible(EFalse);
+    
+    if (iSettingsListBox)
+        {
+        AppUi()->RemoveFromStack(iSettingsListBox);
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CConnTestView::SwapContainerL
+// Switch the display between main view and settings list.
+// ----------------------------------------------------------------------------
+//
+void CConnTestView::SwapContainerL(TConnTestContainer aActiveContainer)
+    {
+    CAknTitlePane* titlePane = STATIC_CAST(
+        CAknTitlePane*,
+        StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+    
+    if (iActiveContainer == aActiveContainer)
+        {
+        return;
+        }
+    
+    // Remove the old container...
+    switch (iActiveContainer)
+        {
+        case EOutputContainer:
+            {
+            iContainer->MakeVisible(EFalse);
+            AppUi()->RemoveFromStack( iContainer );
+            break;
+            }
+        case ESettingsContainer:
+            {
+            AppUi()->RemoveFromStack(iSettingsListBox);
+            iSettingsListBox->MakeVisible(EFalse);
+            break;
+            }
+        default: // ECustomPrefsContainer:
+            {
+            AppUi()->RemoveFromStack(iCustomPrefsListBox);
+            iCustomPrefsListBox->MakeVisible(EFalse);
+            break;
+            }
+        }
+    
+    // And add the new container
+    switch (aActiveContainer)
+        {
+        case EOutputContainer:
+            {
+            Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_EXIT);
+            AppUi()->AddToStackL( *this, iContainer );
+            iContainer->MakeVisible(ETrue);
+            titlePane->SetTextToDefaultL();
+            
+            Cba()->DrawNow();
+            break;
+            }
+        case ESettingsContainer:
+            {
+            Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OK_BACK);
+            AppUi()->AddToStackL( *this, iSettingsListBox );
+            iSettingsListBox->MakeVisible(ETrue);
+            titlePane->SetTextL( _L("Settings") );
+            break;
+            }
+        default: // ECustomPrefsContainer:
+            {
+            Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OK_BACK);
+            AppUi()->AddToStackL( *this, iCustomPrefsListBox );
+            iCustomPrefsListBox->MakeVisible(ETrue);
+            titlePane->SetTextL( _L("Custom Preferences") );
+            break;
+            }
+        }
+    
+    iActiveContainer = aActiveContainer;
+    }
+
+// ----------------------------------------------------------------------------
+// CConnTestView::CreateSettingsListBoxL
+// Create the setting item list, but don't show it.
+// ----------------------------------------------------------------------------
+//
+void CConnTestView::CreateSettingsListBoxL(TInt aResourceId)
+    {
+    iSettingsListBox = new (ELeave) CSettingItemList;
+    iSettingsListBox->SetData(iSettingData);
+    iSettingsListBox->SetMopParent(this);
+    iSettingsListBox->ConstructFromResourceL(aResourceId);
+    iSettingsListBox->MakeVisible(EFalse);
+    iSettingsListBox->SetRect(ClientRect());
+    iSettingsListBox->ActivateL();
+    }
+
+// ----------------------------------------------------------------------------
+// CConnTestView::CreateCustomPrefsListBoxL
+// Create the Custom Prefs item list, but don't show it.
+// ----------------------------------------------------------------------------
+//
+void CConnTestView::CreateCustomPrefsListBoxL(TInt aResourceId)
+    {
+    iCustomPrefsListBox = new (ELeave) CCustomPrefsItemList;
+    iCustomPrefsListBox->SetData(iCustomPrefsData);
+    iCustomPrefsListBox->SetMopParent(this);
+    iCustomPrefsListBox->ConstructFromResourceL(aResourceId);
+    iCustomPrefsListBox->MakeVisible(EFalse);
+    iCustomPrefsListBox->SetRect(ClientRect());
+    iCustomPrefsListBox->ActivateL();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CConnTestView::CreateDataPacket
+// Write data to internal buffer, which is sent to socket. Maximum
+// size of the buffer is KSendDataSize bytes.
+// ----------------------------------------------------------------------------
+//
+void CConnTestView::CreateDataPacket()
+    {
+    RDebug::Print(_L("ConnTest: CConnTestView::CreateDataPacket: packet size = %d, SendDataSize = %d"),iSettingData->iPacketSize,KSendDataSize);
+    RDebug::Print(_L("ConnTest: CConnTestView::CreateDataPacket: buffer maxsize = %d"),iSendData->Des().MaxLength());
+    
+    iSendData->Des().FillZ();
+    iSendData->Des().Zero(); 
+    TInt length = iSettingData->iPacketSize;
+    if(length > iSendData->Des().MaxLength())
+        {
+        TBuf<128> tt;
+        tt.Format(
+            _L("There was not enough space in the buffer for the data, so truncating to %d"),
+            iSendData->Des().MaxLength()
+            );
+        iContainer->PrintNotify(tt);
+        length = iSendData->Des().MaxLength();
+        iSettingData->iPacketSize = length;
+        }
+    iSendData->Des().Fill('a', iSettingData->iPacketSize - 1);
+    iSendData->Des().Append(_L8("\n"));
+    RDebug::Print(_L("ConnTest: CConnTestView::CreateDataPacket: created size = %d"),iSendData->Length());
+    }
+
+
+// ----------------------------------------------------------------------------
+// CConnTestView::SendDataL
+// The engine does the real work
+// ----------------------------------------------------------------------------
+//
+void CConnTestView::SendDataL()
+    {
+    iSocketsEngine->SendDataL(*iSendData);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::IsReadyForHTTPGet()
+// This function is used to check if a HTTP get can be performed
+// on an already existing connection
+// ------------------------------------------------------------------------------
+//
+TBool CConnTestView::IsReadyForHTTPGet()
+    {
+    TBool res = EFalse;
+    if (iSocketsEngine && iSocketsEngine->GetSocketEngineState() == CSocketsEngine::EConnected )
+        {
+        res = ETrue;
+        }
+    return res;
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+// This function is called by the EIKON framework just before it displays
+// a menu pane. Menu is adjusted according to socket engine state.
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+    {   
+    RDebug::Print(_L("ConnTest: DynInitMenuPaneL: resourceId=%x"), aResourceId);
+    
+    switch(aResourceId)
+        {
+        case R_CONNTEST_VIEW1_MENU:
+            {
+            CSocketsEngine::TSocketsEngineState state = iSocketsEngine->GetSocketEngineState();
+            CSocketsEngine::TRoamingUIState roamingState = iSocketsEngine->GetSocketEngineRoamingState();
+            
+            switch(state)
+                {
+                case CSocketsEngine::EInterfaceDown:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, EFalse);
+                    break;
+                case CSocketsEngine::EStartingInterface:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, ETrue);     
+                    break;
+                case CSocketsEngine::EInterfaceUp:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, EFalse);     
+                    break;
+                case CSocketsEngine::EConnected:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, EFalse);                
+                    break;
+                case CSocketsEngine::EConnecting:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);                
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, ETrue);                
+                    break;
+                case CSocketsEngine::EListening:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, ETrue);
+                    break;               
+                case CSocketsEngine::EDisconnecting:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, ETrue);                
+                    break;
+                case CSocketsEngine::ELookingUp:
+                    aMenuPane->SetItemDimmed(EConnTestCmdCancel, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdStartInternet, ETrue);                
+                    aMenuPane->SetItemDimmed(EConnTestCmdStopInterface, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdConnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdDisconnect, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdListen, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdSendRawData, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdHttpFrameworkGet, ETrue);                
+                    break;
+                default:
+                    break;
+                }
+            switch (roamingState)
+                {
+                case CSocketsEngine::EPendingPreferredCarrier:
+                    aMenuPane->SetItemDimmed(EConnTestCmdMigrate, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdIgnore, EFalse);
+                    aMenuPane->SetItemDimmed(EConnTestCmdAccept, ETrue);                
+                    aMenuPane->SetItemDimmed(EConnTestCmdReject, ETrue);
+                    break;
+                case CSocketsEngine::EPendingNewCarrierActive:
+                    aMenuPane->SetItemDimmed(EConnTestCmdMigrate, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdIgnore, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdAccept, EFalse);                
+                    aMenuPane->SetItemDimmed(EConnTestCmdReject, EFalse);
+                    break;
+                default:
+                    aMenuPane->SetItemDimmed(EConnTestCmdMigrate, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdIgnore, ETrue);
+                    aMenuPane->SetItemDimmed(EConnTestCmdAccept, ETrue);                
+                    aMenuPane->SetItemDimmed(EConnTestCmdReject, ETrue);
+                    break;
+                }
+            }
+            break;
+        case R_CONNTEST_SUB_MENU_IPDUMP:
+            {
+            
+            // Additional menupane handling, which doesn't depend on the state of the socket engine
+            CConnTestAppUi* appui = (CConnTestAppUi *)AppUi();
+            if(appui->IsLogging())
+                {
+                aMenuPane->SetItemDimmed(EConnTestCmdStartIpLog, ETrue);     
+                }
+            else
+                {
+                aMenuPane->SetItemDimmed(EConnTestCmdStopIpLog, ETrue);     
+                }
+            }
+            break;   
+            
+            //enable mobility API submenupoints when connection is started with a snap
+        case R_CONNTEST_SUB_MENU_ADVANCED:
+            {
+            
+            CSocketsEngine::TSocketsEngineStartType connType = iSocketsEngine->GetSocketEngineConnType();
+            
+            
+            break;
+            
+            }
+        default:
+            break;         
+        }
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::RequestCompleted()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::RequestCompleted( TInt aStatus, RArray<TUint>& aAvailableIaps )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::RequestCompleted(aAvailableIaps)" ) );
+    
+    if ( aStatus != KErrNone )
+        {
+        RDebug::Print( _L( "ConnTest: client->RequestCompleted failed with %d" ), aStatus );
+        return;                
+        }
+    
+    RDebug::Print( _L( "ConnTest: ivailableIaps.Count() = %u" ), aAvailableIaps.Count() );
+    
+    TBuf<100> msg;
+    msg.AppendNum( aAvailableIaps.Count() );
+    msg.Append( _L( " WLAN IAP(s) found\n\n" ) );
+    for ( TUint idx( 0 ); idx < (TUint)aAvailableIaps.Count(); ++idx )
+        {
+        msg.AppendFormat( _L("%02u "), aAvailableIaps[idx] );
+        }
+    msg.Append( _L( "\n" ) );
+    iContainer->ErrorNotify( msg, KErrNone );
+    
+    delete iWaiter;
+    iWaiter = NULL;
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::RequestCompleted()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::RequestCompleted( TInt aStatus, CWlanScanInfo& aScanInfo )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::RequestCompleted(aScanInfo)" ) );
+    
+    if ( aStatus != KErrNone )
+        {
+        RDebug::Print( _L( "ConnTest: client->RequestCompleted failed with %d" ), aStatus );
+        return;                
+        }
+    
+    TUint count( 0 );
+    
+    aScanInfo.First();
+    while (!aScanInfo.IsDone())
+        {
+        ++count;
+        aScanInfo.Next();
+        }
+    
+    TBuf<100> msg;
+    msg.AppendNum( count );
+    msg.Append( _L( " WLAN AP(s) found\n\n" ) );
+    iContainer->ErrorNotify( msg, KErrNone );                 
+    
+    delete iWaiter;
+    iWaiter = NULL;
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::ConnectionStateChanged()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::ConnectionStateChanged( TWlanConnectionMode aNewState )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::ConnectionStateChanged" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.Append(_L8("Wlan State: "));
+    switch( aNewState )
+        {
+        case EWlanConnectionModeNotConnected:
+            text.Append(_L8("Not Connected"));
+            break;
+        case EWlanConnectionModeInfrastructure:
+            text.Append(_L8("Infrastructure"));
+            break;
+        case EWlanConnectionModeAdhoc:
+            text.Append(_L8("Ad hoc"));
+            break;
+        case EWlanConnectionModeSecureInfra:
+            text.Append(_L8("SecureInfra"));
+            break;
+        case EWlanConnectionModeSearching:
+            text.Append(_L8("Searching"));
+            break;
+        }
+    text.Append(_L8("\n"));
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::BssidChanged()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::BssidChanged( TWlanBssid& aNewBSSID )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::BssidChanged" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n"), aNewBSSID[0], aNewBSSID[1], aNewBSSID[2], aNewBSSID[3], aNewBSSID[4], aNewBSSID[5] );
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::BssLost()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::BssLost()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::BssLost" ) );    
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan: BssLost\n"));
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::BssRegained()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::BssRegained()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::BssRegained" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan: BssRegained\n"));
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::NewNetworksDetected()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::NewNetworksDetected()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::NewNetworksDetected" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan: NewNetworksDetected\n"));
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::OldNetworksLost()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::OldNetworksLost()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::OldNetworksLost" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan: OldNetworksLost\n"));
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::TransmitPowerChanged()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::TransmitPowerChanged( TUint aPower )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::TransmitPowerChanged" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan: TxPower: %d\n"), aPower);
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestView::RssChanged()
+// ------------------------------------------------------------------------------
+//
+void CConnTestView::RssChanged( TWlanRssClass aRssClass,
+                                TUint aRss )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestView::RssChanged" ) );
+    
+    TBuf8<64> text;
+    TTime currentTime(0);
+    currentTime.HomeTime();
+    TDateTime time = currentTime.DateTime();
+    text.AppendFormat(_L8("%02u:%02u:%02u "),
+        time.Hour(), time.Minute(), time.Second() );
+    text.AppendFormat(_L8("Wlan: RssChanged: %d, %d\n"), aRssClass, aRss);
+    iContainer->PrintNotify(text);
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::CConnTestViewWaiter()
+// ------------------------------------------------------------------------------
+//
+CConnTestViewWaiter::CConnTestViewWaiter( CWlanMgmtClient* aWlanMgmtClient, 
+                                          CConnTestView& aCallback, 
+                                          TConnTestWaitType aType )
+    :   CActive( CActive::EPriorityStandard ),
+        iType( aType ),
+        iCallback( aCallback ),
+        iMgmtClient( aWlanMgmtClient ),
+        iScanInfo( NULL )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestViewWaiter::CConnTestViewWaiter()" ) );    
+    CActiveScheduler::Add( this );        
+    }
+    
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::ConstructL()
+// ------------------------------------------------------------------------------
+//
+void CConnTestViewWaiter::ConstructL()
+    {
+    iScanInfo = CWlanScanInfo::NewL();
+    }     
+
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::~CConnTestViewWaiter()
+// ------------------------------------------------------------------------------
+//
+CConnTestViewWaiter::~CConnTestViewWaiter()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestViewWaiter::~CConnTestViewWaiter()" ) );
+    Cancel();
+    iAvailableIaps.Close();
+    delete iScanInfo;
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::RunL()
+// ------------------------------------------------------------------------------
+//
+void CConnTestViewWaiter::RunL()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestViewWaiter::RunL()" ) );
+
+    if ( iType == EConnTestWaitTypeAvailableIaps )
+        {
+        iCallback.RequestCompleted( iStatus.Int(), iAvailableIaps );
+        }
+    else // EConnTestWaitTypeScan
+        {
+        iCallback.RequestCompleted( iStatus.Int(), *iScanInfo );
+        }
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::RunError()
+// ------------------------------------------------------------------------------
+//
+TInt CConnTestViewWaiter::RunError( TInt /* aError */ )
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestViewWaiter::RunError()" ) );
+    return KErrNone;
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::DoCancel()
+// ------------------------------------------------------------------------------
+//
+void CConnTestViewWaiter::DoCancel()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestViewWaiter::DoCancel()" ) );
+    }
+
+// ------------------------------------------------------------------------------
+// CConnTestViewWaiter::IssueRequest()
+// ------------------------------------------------------------------------------
+//
+void CConnTestViewWaiter::IssueRequest()
+    {
+    RDebug::Print( _L( "ConnTest: CConnTestViewWaiter::IssueRequest()" ) );
+    if ( iType == EConnTestWaitTypeAvailableIaps )
+        {
+        iMgmtClient->GetAvailableIaps( iStatus, iAvailableIaps );    
+        }
+    else // EConnTestWaitTypeScan
+        {
+        iMgmtClient->GetScanResults( iStatus, *iScanInfo );
+        }
+    SetActive();
+    }
+
+// End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/CustomPrefsData.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2006-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: CCustomPrefsData stores the Extended Connection Preferences
+*
+*/
+
+// INCLUDE FILES
+#include <eikenv.h>
+#include "CustomPrefsData.h"
+#include "extendedconnpref.h"
+
+
+// ================= MEMBER FUNCTIONS =========================================
+// ----------------------------------------------------------------------------
+// CCustomPrefsData::NewL()
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CCustomPrefsData* CCustomPrefsData::NewL()
+    {
+    CCustomPrefsData* data = new(ELeave) CCustomPrefsData;
+    CleanupStack::PushL(data);
+    data->ConstructL();
+    CleanupStack::Pop(data); // data
+    return data;
+    }
+
+// ----------------------------------------------------------------------------
+// CCustomPrefsData::~CCustomPrefsData()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CCustomPrefsData::~CCustomPrefsData()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CCustomPrefsData::CCustomPrefsData()
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CCustomPrefsData::CCustomPrefsData() :
+    iSnapPurpose( CMManager::ESnapPurposeUnknown ),
+    iSnapId( 0 ),
+    iIapId( 0 ),
+    iBearerSet( TExtendedConnPref::EExtendedConnBearerUnknown ),
+    iNoteBehaviour( TExtendedConnPref::ENoteBehaviourDefault ),
+    iDisconnectDialog( ETrue ),
+    iConnSelectionDialog( EFalse ),
+    iForcedRoaming( ETrue )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CCustomPrefsData::CCustomPrefsData()
+// Symbian default constructor
+// ----------------------------------------------------------------------------
+//
+void CCustomPrefsData::ConstructL()
+    {
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/CustomPrefsItemList.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2006-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: CCustomPrefsItemList implemets the Extended Connection Preferences setting
+ * list for Conntest.
+ *
+ */
+
+// INCLUDE FILES
+#include <cmapplicationsettingsui.h>
+#include <extendedconnpref.h>
+
+#include "CustomPrefsItemList.h"
+#include "CustomPrefsData.h"
+#include "conntest.hrh"
+#include "Utils.h"
+#include "cmapplicationsettingsui.h"
+
+// ================= MEMBER FUNCTIONS =========================================
+
+// ----------------------------------------------------------------------------
+// CCustomPrefsItemList::CreateSettingItemL
+// Inherited from CAknSettingItem. Updates descriptor array for list box.
+// ----------------------------------------------------------------------------
+//
+CAknSettingItem* CCustomPrefsItemList::CreateSettingItemL( TInt aIdentifier )
+    {
+    CAknSettingItem* customPrefsItem = NULL;
+    
+    switch (aIdentifier)
+        {
+        case EConnTestExtConnPrefsItemSnapPurpose:
+            customPrefsItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
+                    aIdentifier, iData->iSnapPurpose );
+            break;
+        case EConnTestExtConnPrefsItemSnapId:
+            customPrefsItem = new (ELeave) CAknIntegerEdwinSettingItem(
+                    aIdentifier, iData->iSnapId );
+            break;
+        case EConnTestExtConnPrefsItemIapId:
+            customPrefsItem = new (ELeave) CAknIntegerEdwinSettingItem(
+                    aIdentifier, iData->iIapId );
+            break;
+        case EConnTestExtConnPrefsItemBearerSet:
+            customPrefsItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
+                    aIdentifier, iData->iBearerSet );
+            break;
+        case EConnTestExtConnPrefsItemNoteBehaviour:
+            customPrefsItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
+                    aIdentifier, iData->iNoteBehaviour );
+            break;
+        case EConnTestExtConnPrefsItemDisconnectDialog:
+            customPrefsItem = new (ELeave) CAknBinaryPopupSettingItem(
+                    aIdentifier, iData->iDisconnectDialog );
+            break;
+        case EConnTestExtConnPrefsItemConnSelectionDialog:
+            customPrefsItem = new (ELeave) CAknBinaryPopupSettingItem(
+                    aIdentifier, iData->iConnSelectionDialog );
+            break;
+        case EConnTestExtConnPrefsItemForcedRoaming:
+            customPrefsItem = new (ELeave) CAknBinaryPopupSettingItem(
+                    aIdentifier, iData->iForcedRoaming );
+            break;
+        default:
+            break;
+        }
+    return customPrefsItem;
+    }
+
+// ----------------------------------------------------------------------------
+// CCustomPrefsItemList::SetData
+// 
+// ----------------------------------------------------------------------------
+//
+void CCustomPrefsItemList::SetData( CCustomPrefsData* aData )
+    {
+    iData = aData;
+    }
+
+// ----------------------------------------------------------------------------
+// CCustomPrefsItemList::SizeChanged
+// Size changed handler
+// ----------------------------------------------------------------------------
+//
+void CCustomPrefsItemList::SizeChanged()
+    {
+    if (ListBox())
+        {
+        ListBox()->SetRect( Rect() );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCustomPrefsItemList::SelectSnapL()
+// Selects a SNAP
+// ---------------------------------------------------------
+//
+void CCustomPrefsItemList::SelectSnapL()
+    {
+    // Start the SNAP selection dialog
+    CCmApplicationSettingsUi* settings = CCmApplicationSettingsUi::NewL();
+    CleanupStack::PushL( settings );
+    TCmSettingSelection selection;
+    TUint listItems = CMManager::EShowDestinations;
+    TBearerFilterArray filterArray;
+    
+    settings->RunApplicationSettingsL( selection, listItems, filterArray );
+
+    CleanupStack::PopAndDestroy( settings );
+    
+    switch (selection.iResult)
+        {
+        case CMManager::EDestination:
+            {
+            iData->iSnapId = selection.iId;
+            break;
+            }
+        default:
+            {
+            iData->iSnapId = 0;
+            RDebug::Print( _L("ConnTest: Invalid selection") );
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CCustomPrefsItemList::SelectIapL()
+// Selects an IAP
+// ---------------------------------------------------------
+//
+void CCustomPrefsItemList::SelectIapL()
+    {
+    // IAP selection menu
+    TUint32 iapId;
+    TInt popupOk = Utils::AskIapIdL( iapId );
+    
+    if (popupOk)
+        {
+        RDebug::Print( _L("ConnTest: Selected IAP id=%d"), iapId );
+        iData->iIapId = iapId;
+        }
+    else
+        {
+        RDebug::Print( _L("ConnTest: Invalid selection") );
+        iData->iIapId = 0;
+        }
+    }
+
+// ---------------------------------------------------------
+// CCustomPrefsItemList::EditItemL()
+// Edits a menu item
+// ---------------------------------------------------------
+//
+void CCustomPrefsItemList::EditItemL( TInt aIndex, TBool aCalledFromMenu )
+    {
+    if (aIndex == EConnTestExtConnPrefsItemSnapId)
+        {
+        // SNAP selection menu
+        SelectSnapL();
+        // Update the selected value into the CustomPrefsItemList
+        CCustomPrefsSelectedIntegerItem* snapItem =
+                (CCustomPrefsSelectedIntegerItem*)(*SettingItemArray())[aIndex];
+        snapItem->EditSelectedIntegerItemL( iData->iSnapId );
+        }
+    else if (aIndex == EConnTestExtConnPrefsItemIapId)
+        {
+        // IAP selection menu
+        SelectIapL();
+        // Update the selected value into the CustomPrefsItemList
+        CCustomPrefsSelectedIntegerItem* iapItem =
+                (CCustomPrefsSelectedIntegerItem*)(*SettingItemArray())[aIndex];
+        iapItem->EditSelectedIntegerItemL( iData->iIapId );
+        }
+    else
+        {
+        // The rest are handled "traditionally", via the base class
+        CAknSettingItemList::EditItemL( aIndex, aCalledFromMenu );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCustomPrefsSelectedIntegerItem::EditSelectedIntegerItemL()
+// Edits a SNAP or IAP item
+// ---------------------------------------------------------
+//
+void CCustomPrefsItemList::CCustomPrefsSelectedIntegerItem::EditSelectedIntegerItemL( TInt aId )
+    {
+    this->SetExternalValue( aId );
+    this->LoadL();
+    this->UpdateListBoxTextL();
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/SettingData.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2006-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: CSettingsData stores the settings for ConnTest
+*
+*/
+
+// INCLUDE FILES
+#include <eikenv.h>
+#include "SettingData.h"
+
+
+// ================= MEMBER FUNCTIONS =========================================
+// ----------------------------------------------------------------------------
+// CSettingData::NewL()
+// Two-phase constructor
+// ----------------------------------------------------------------------------
+//
+CSettingData* CSettingData::NewL()
+    {
+    CSettingData* data = new(ELeave) CSettingData;
+    CleanupStack::PushL(data);
+    data->ConstructL();
+    CleanupStack::Pop(data); // data
+    return data;
+    }
+
+// ----------------------------------------------------------------------------
+// CSettingData::~CSettingData()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CSettingData::~CSettingData()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CSettingData::CSettingData()
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CSettingData::CSettingData()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CSettingData::CSettingData()
+// Epoc default constructor
+// ----------------------------------------------------------------------------
+//
+void CSettingData::ConstructL()
+    {
+    //CEikonEnv* env = CEikonEnv::Static();
+
+    // Default data
+    iServerName.Copy(_L("www.google.com"));
+    iPort = 80;
+    iPacketSize = 5;
+    iPackets = 1;
+    iDelay = 500;
+    iProtocol = 0;
+    iRoaming = 1;
+    iHttpPage.Copy(_L("index.html"));
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/SettingItemList.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2006-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: CSettingItemList implemets the settings list for Conntest
+*
+*/
+
+// INCLUDE FILES
+#include "SettingItemList.h"
+#include "SettingData.h"
+#include "conntest.hrh"
+
+
+// ================= MEMBER FUNCTIONS =========================================
+
+// ----------------------------------------------------------------------------
+// CSettingItemList::CreateSettingItemL
+// Updates descripter array for list box
+// ----------------------------------------------------------------------------
+//
+CAknSettingItem* CSettingItemList::CreateSettingItemL( TInt aIdentifier )
+    {
+    CAknSettingItem* settingItem = NULL;
+
+    switch (aIdentifier)
+        {
+        case EConnTestIpAddress:
+            settingItem = new (ELeave) 
+            CAknTextSettingItem(aIdentifier, iData->iServerName );
+            break;
+        case EConnTestPort:
+            settingItem = new (ELeave) 
+            CAknIntegerEdwinSettingItem(aIdentifier, iData->iPort );
+            break;
+        case EConnTestHttpPage:
+            settingItem = new (ELeave) 
+            CAknTextSettingItem(aIdentifier, iData->iHttpPage);
+            break;
+        case EConnTestProtocol:
+            settingItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
+                    aIdentifier, iData->iProtocol );
+            break;
+        case EConnTestPacketSize:
+            settingItem = new (ELeave) 
+            CAknIntegerEdwinSettingItem(aIdentifier, iData->iPacketSize );
+            break;
+        case EConnTestPackets:
+            settingItem = new (ELeave) 
+            CAknIntegerEdwinSettingItem(aIdentifier, iData->iPackets );
+            break;
+        case EConnTestDelay:
+            settingItem = new (ELeave) 
+            CAknIntegerEdwinSettingItem(aIdentifier, iData->iDelay );
+            break;
+        case EConnTestRoaming:
+            settingItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
+                    aIdentifier, iData->iRoaming );
+            break;
+        default:
+            break;
+        }
+    return settingItem;
+    }
+
+// ----------------------------------------------------------------------------
+// CSettingItemList::SetData
+// 
+// ----------------------------------------------------------------------------
+//
+void CSettingItemList::SetData(CSettingData* aData)
+    {
+    iData = aData;
+    }
+
+// ----------------------------------------------------------------------------
+// CSettingItemList::SizeChanged
+// Size changed handler
+// ----------------------------------------------------------------------------
+//
+void CSettingItemList::SizeChanged()
+    {
+    if (ListBox()) 
+        {
+        ListBox()->SetRect(Rect());
+        }
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/Utils.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 2006-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: Utils implements general tools for bandwidth and 
+ * packet loss calculation and IAP selection etc
+ *
+ */
+
+// INCLUDE FILES
+#include <commdb.h>
+#include <aknlistquerydialog.h>
+#include <ConnTest.rsg>
+
+#include <aknselectionlist.h>
+#include <aknPopup.h>
+#include <aknlists.h>
+#include <txtetext.h>
+
+#include "Utils.h"
+#include "conntest.hrh"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+
+// ----------------------------------------------------------------------------
+// Utils::Utils()
+// Constructor
+// ----------------------------------------------------------------------------
+//
+Utils::Utils()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::~Utils()
+// Destructor
+// ----------------------------------------------------------------------------
+//
+Utils::~Utils()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::CalculateThroughput
+// Calculate throughput
+// ----------------------------------------------------------------------------
+//
+void Utils::CalculateThroughput( TDes8& aBuffer, TTime aStartTime, TInt aSize )
+    {
+    TTime now;
+    now.UniversalTime();
+    TTimeIntervalMicroSeconds interval;
+    interval = now.MicroSecondsFrom( aStartTime );
+    TInt num = I64INT(interval.Int64());
+    
+    if (num != 0)
+        {
+        aBuffer.AppendFormat( _L8("Size: %d\n"), aSize );
+        aBuffer.AppendFormat( _L8("Time: %4.1f s\n"), (TReal)num / 1000000 );
+        aBuffer.AppendFormat( _L8(" -  %4.1f kB/s\n"), (TReal)((TReal)aSize / (1024.0
+                * (TReal)num)) * 1000000 );
+        aBuffer.AppendFormat( _L8(" -  %4.1f kbit/s\n"), (TReal)8 * ((TReal)aSize / (1024.0
+                * (TReal)num)) * 1000000 );
+        }
+    else
+        {
+        aBuffer.AppendFormat( _L8("Size: %d\n"), aSize );
+        aBuffer.AppendFormat( _L8("Time zero\n") );
+        }
+    
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::SetTimeoutsL(const TInt aTimeout)
+// Adjust given Nifman's idle timeout for every bearer.
+// ----------------------------------------------------------------------------
+//
+void Utils::SetTimeoutsL( const TInt aTimeout )
+    {
+    // GPRS and CSD bearer
+    Utils::SetTableTimeoutL( aTimeout, TPtrC( MODEM_BEARER ) );
+    
+    // LAN bearer
+    Utils::SetTableTimeoutL( aTimeout, TPtrC( LAN_BEARER ) );
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::SetTableTimeoutL()
+// Set Nifman's idle times for each record in given table.
+// ----------------------------------------------------------------------------
+//
+void Utils::SetTableTimeoutL( const TInt aTimeout, const TDesC& aTableName )
+    {
+    TInt result;
+    TUint32 value;
+    TBuf<64> title;
+    
+    CCommsDatabase* TheDb;
+    
+    TheDb = CCommsDatabase::NewL();
+    CleanupStack::PushL( TheDb );
+
+    CCommsDbTableView* view2 = TheDb->OpenTableLC( aTableName );
+    
+    result = view2->GotoFirstRecord();
+    User::LeaveIfError( result );
+
+    while (result == KErrNone)
+        {
+        view2->ReadTextL( TPtrC( COMMDB_NAME ), title );
+
+        switch (aTimeout)
+            {
+            case EConnTestCmdTimeoutLastSocketActivity:
+                title.Append( _L("\nLastSocketActivity") );
+                view2->ReadUintL( TPtrC( LAST_SOCKET_ACTIVITY_TIMEOUT ), value );
+                break;
+                
+            case EConnTestCmdTimeoutLastSocketClosed:
+                title.Append( _L("\nLastSocketClosed") );
+                view2->ReadUintL( TPtrC( LAST_SOCKET_CLOSED_TIMEOUT ), value );
+                break;
+                
+            case EConnTestCmdTimeoutLastSessionClosed:
+                title.Append( _L("\nLastSessionClosed") );
+                view2->ReadUintL( TPtrC( LAST_SESSION_CLOSED_TIMEOUT ), value );
+                break;
+                
+            default:
+                value = 0; // To get rid of compiler warning
+                break;
+            }
+
+        TInt val2( value );
+        CAknNumberQueryDialog* dlg;
+        
+        dlg = CAknNumberQueryDialog::NewL( val2, CAknQueryDialog::ENoTone );
+        CleanupStack::PushL( dlg );
+        dlg->SetPromptL( title );
+        TInt changed = dlg->ExecuteLD( R_CONNTEST_NUMBER_LAYOUT );
+        CleanupStack::Pop( dlg );
+
+        if (changed)
+            {
+            result = view2->UpdateRecord();
+            User::LeaveIfError( result );
+
+            if (val2 == -1)
+                {
+                val2 = KMaxTInt;
+                }
+
+            switch (aTimeout)
+                {
+                case EConnTestCmdTimeoutLastSocketActivity:
+                    view2->WriteUintL( TPtrC( LAST_SOCKET_ACTIVITY_TIMEOUT ),
+                            val2 );
+                    break;
+                    
+                case EConnTestCmdTimeoutLastSocketClosed:
+                    view2->WriteUintL( TPtrC( LAST_SOCKET_CLOSED_TIMEOUT ),
+                            val2 );
+                    break;
+                    
+                case EConnTestCmdTimeoutLastSessionClosed:
+                    view2->WriteUintL( TPtrC( LAST_SESSION_CLOSED_TIMEOUT ),
+                            val2 );
+                    break;
+                    
+                default:
+                    break;
+                }
+
+            result = view2->PutRecordChanges();
+            User::LeaveIfError( result );
+            }
+        result = view2->GotoNextRecord();
+        }
+
+    CleanupStack::PopAndDestroy( view2 ); // view2
+    CleanupStack::PopAndDestroy( TheDb ); // TheDb
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::SetConnectionPrefsIap()
+// Set IapId value into connection preferences table
+// ----------------------------------------------------------------------------
+//
+void Utils::SetConnectionPrefsIapL()
+    {
+    
+    CCommsDatabase* TheDb;
+    
+    TheDb = CCommsDatabase::NewL();
+    CleanupStack::PushL( TheDb );
+
+    CCommsDbConnectionPrefTableView* view = TheDb->OpenConnectionPrefTableLC();
+    
+    TInt ret = view->GotoFirstRecord();
+    
+    CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref tablePref;
+    
+    if (ret == KErrNone)
+        {
+        view->ReadConnectionPreferenceL( tablePref );
+        }
+
+    User::LeaveIfError( ret );
+
+    TInt value( tablePref.iBearer.iIapId );
+    CAknNumberQueryDialog* dlg;
+    
+    dlg = CAknNumberQueryDialog::NewL( value, CAknQueryDialog::ENoTone );
+    CleanupStack::PushL( dlg );
+    dlg->SetPromptL( _L("Iap Id:") );
+    TInt changed = dlg->ExecuteLD( R_CONNTEST_NUMBER_LAYOUT );
+    CleanupStack::Pop( dlg );
+
+    if (changed)
+        {
+        tablePref.iBearer.iIapId = value;
+        view->UpdateBearerL( tablePref.iBearer );
+        }
+
+    CleanupStack::PopAndDestroy( view ); // view
+    CleanupStack::PopAndDestroy( TheDb ); // TheDb
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::AskIapIdL(TUint32& aId)
+// Ask IAP id from the user
+// ----------------------------------------------------------------------------
+//
+TInt Utils::AskIapIdL( TUint32& aId )
+    {
+    return Utils::SelectIdFromTableL( aId, TPtrC( IAP ) );
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::AskNetworkIdL(TUint32& aId)
+// Ask Network id from the user
+// ----------------------------------------------------------------------------
+//
+TInt Utils::AskNetworkIdL( TUint32& aId )
+    {
+    return Utils::SelectIdFromTableL( aId, TPtrC( NETWORK ) );
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::SelectIdFromTableL()
+// Does the real work for selecting IAP or Network id
+// ----------------------------------------------------------------------------
+//
+TInt Utils::SelectIdFromTableL( TUint32& aId, const TDesC& aTableName )
+    {
+    CCommsDatabase* TheDb;
+    TInt res;
+    TBuf<40> name;
+    TBuf<20> title;
+    TUint32 id;
+    RArray<TUint32> idArray;
+    CDesCArrayFlat* items = new (ELeave) CDesCArrayFlat( 16 );
+    
+    // Get IAP names and ids from the database
+    TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+    CleanupStack::PushL( TheDb );
+
+    TheDb->ShowHiddenRecords();
+
+    CCommsDbTableView* view;
+    
+    view = TheDb->OpenTableLC( aTableName );
+    title.Format( _L("Select %S:"), &aTableName );
+
+    res = view->GotoFirstRecord();
+
+    while (res == KErrNone)
+        {
+        view->ReadTextL( TPtrC( COMMDB_NAME ), name );
+        view->ReadUintL( TPtrC( COMMDB_ID ), id );
+
+        idArray.Insert( id, 0 );
+        items->InsertL( 0, name );
+
+        res = view->GotoNextRecord();
+        RDebug::Print( _L("ConnTest: IAP name, id: %S, %d"), &name, id );
+        }
+
+    CleanupStack::PopAndDestroy( view ); // view
+    CleanupStack::PopAndDestroy( TheDb ); // TheDb
+
+    // Create listbox and PUSH it.
+    CEikTextListBox* list = new (ELeave) CAknSinglePopupMenuStyleListBox;
+    CleanupStack::PushL( list );
+
+    // Create popup list and PUSH it.
+    CAknPopupList* popupList = CAknPopupList::NewL( list,
+            R_AVKON_SOFTKEYS_OK_CANCEL, AknPopupLayouts::EMenuWindow );
+    CleanupStack::PushL( popupList );
+
+    // initialize listbox.
+    list->ConstructL( popupList, CEikListBox::ELeftDownInViewRect );
+    list->CreateScrollBarFrameL( ETrue );
+    list->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+            CEikScrollBarFrame::EAuto );
+
+    // Set listitems.
+    CTextListBoxModel* model = list->Model();
+    model->SetItemTextArray( items );
+    model->SetOwnershipType( ELbmOwnsItemArray );
+
+    // Set title
+    popupList->SetTitleL( title );
+
+    // Show popup list.
+    TInt popupOk = popupList->ExecuteLD();
+    CleanupStack::Pop( popupList ); // popuplist
+    if (popupOk)
+        {
+        TInt index = list->CurrentItemIndex();
+        aId = idArray[index];
+        }
+
+    CleanupStack::PopAndDestroy( list ); // list
+
+    idArray.Close();
+    //    delete items; (list deletes)
+    items = NULL;
+    return popupOk;
+    }
+
+// ----------------------------------------------------------------------------
+// Utils::CreateDataChunk()
+// Create data chunk for POST performance tests
+// ----------------------------------------------------------------------------
+//
+void Utils::CreateDataChunk( TDes8& aBuffer, TInt aLength )
+    {
+    for (TInt i = 0; i < aLength && i < aBuffer.MaxLength(); i++)
+        {
+        if (i == 0)
+            {
+            aBuffer.Copy( _L8("a") );
+            }
+        else
+            {
+            aBuffer.Append( _L8("a") );
+            }
+        }
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/group/bld.inf	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2001-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:  Build information file for nettools. 
+*
+*/
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+#include "../conntest/group/bld.inf"
+
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/package_definition.xml	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0">
+  <package id="conntools" name="Connectivity Tools" levels="config app">
+    <collection id="nettools" name="Net Tools" level="app">
+      <component id="conntest" filter="s60" name="Connection Test" purpose="development">
+        <unit bldFile="nettools/conntest/group"/>
+      </component>
+    </collection>
+    <collection id="emulatorlan" name="Emulator LAN" level="config">
+      <component id="emulatorlan_build" filter="s60" name="Emulator LAN Build" class="config" purpose="development">
+        <unit bldFile="emulatorlan/group"/>
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysdef_1_4_0.dtd	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>