summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandar Sasha Babic <aleksandar.babic@nokia.com>2009-07-27 08:47:40 (GMT)
committerAleksandar Sasha Babic <aleksandar.babic@nokia.com>2009-07-27 08:47:40 (GMT)
commitd937a141a411e632d668bf67c5af8b72335b26b1 (patch)
tree6f856ed2b902cfd37fc138245e92819b15e778d0
parent45edfc7465db4ca377db308d0a8fa80c068b2c11 (diff)
downloadQt-d937a141a411e632d668bf67c5af8b72335b26b1.zip
Qt-d937a141a411e632d668bf67c5af8b72335b26b1.tar.gz
Qt-d937a141a411e632d668bf67c5af8b72335b26b1.tar.bz2
Adding some interesting functions that help finding
info about network interfaces and network routes. Can be of broader interest. "By seeking and blundering we learn." Johann Wolfgang Von Goethe (1749 - 1832)
-rw-r--r--examples/network/ftp/ftp.pro2
-rw-r--r--examples/network/ftp/sym_iap_util.h200
2 files changed, 197 insertions, 5 deletions
diff --git a/examples/network/ftp/ftp.pro b/examples/network/ftp/ftp.pro
index ac3d3e6..0ddcb6c 100644
--- a/examples/network/ftp/ftp.pro
+++ b/examples/network/ftp/ftp.pro
@@ -17,5 +17,5 @@ symbian {
INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
TARGET.CAPABILITY="NetworkServices ReadUserData WriteUserData"
TARGET.UID3 = 0xA000A648
- LIBS+=-lesock -lcommdb # For IAP selection
+ LIBS+=-lesock -lcommdb -linsock # For IAP selection
} \ No newline at end of file
diff --git a/examples/network/ftp/sym_iap_util.h b/examples/network/ftp/sym_iap_util.h
index 6d52b1d..74fe93a 100644
--- a/examples/network/ftp/sym_iap_util.h
+++ b/examples/network/ftp/sym_iap_util.h
@@ -42,9 +42,13 @@
#define QSYM_IAP_UTIL_H
// Symbian
+#include <utf.h>
#include <es_sock.h>
+#include <in_sock.h>
#include <es_enum.h>
+#include <in_iface.h>
#include <commdbconnpref.h>
+#include <e32cmn.h>
// OpenC
#include <sys/socket.h>
@@ -53,6 +57,7 @@
//Qt
#include <QSettings>
#include <QStringList>
+//#include <QTextCodec>
_LIT(KIapNameSetting, "IAP\\Name"); // text - mandatory
_LIT(KIapDialogPref, "IAP\\DialogPref"); // TUnit32 - optional
@@ -68,6 +73,8 @@ const QLatin1String iapGroupTag("IAP");
const QLatin1String iapNamesArrayTag("Names");
const QLatin1String iapNameItemTag("Name");
+static QTextCodec *utf16LETextCodec = 0;
+
void clearIapNamesSettings(QSettings &settings) {
settings.beginGroup(qtNetworkModuleTag);
settings.beginGroup(iapGroupTag);
@@ -103,6 +110,189 @@ void readIapNamesSettings(QSettings &settings, QStringList& iapNames) {
settings.endGroup();
}
+static QString qt_TNameToQString(TName data) {
+ if(utf16LETextCodec == 0)
+ utf16LETextCodec = QTextCodec::codecForName("UTF-16LE");
+
+ QByteArray tmpByteArray = QByteArray::fromRawData((char*)(data.PtrZ()), data.Length() * 2);
+ return utf16LETextCodec->toUnicode(tmpByteArray);
+}
+
+static QString qt_InterfaceInfoL()
+{
+ QString output;
+
+ TBuf8<512> buffer;
+ 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));
+ printf("EPOC32 IP Configuration TCPIP Version %d.%d.%d\n", in.iVersion.iMajor, in.iVersion.iMinor, in.iVersion.iBuild);
+
+ 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")) {
+ printf("Interface %d\n", count++);
+
+ printf("Name \"%s\"\n", qt_TNameToQString(info().iName).toLatin1().data());
+ printf("NIF tag \"%s\"\n", qt_TNameToQString(info().iTag).toLatin1().data());
+
+ printf("State ");
+ switch (info().iState)
+ {
+ case EIfPending:
+ printf("pending\n");
+ break;
+ case EIfUp:
+ printf("up\n");
+ break;
+ case EIfBusy:
+ printf("busy\n");
+ break;
+ default:
+ printf("down\n");
+ break;
+ }
+
+ printf("Mtu %d\n", info().iMtu);
+ printf("Speed Metric %d\n", info().iSpeedMetric);
+
+ printf("Features:");
+ info().iFeatures & KIfIsLoopback ? printf(" loopback") : printf("");
+ info().iFeatures & KIfIsDialup ? printf(" dialup") : printf("");
+ info().iFeatures & KIfIsPointToPoint ? printf(" pointtopoint") : printf("");
+ info().iFeatures & KIfCanBroadcast ? printf(" canbroadcast") : printf("");
+ info().iFeatures & KIfCanMulticast ? printf(" canmulticast") : printf("");
+ info().iFeatures & KIfCanSetMTU ? printf(" cansetmtu") : printf("");
+ info().iFeatures & KIfHasHardwareAddr ? printf(" hardwareaddr") : printf("");
+ info().iFeatures & KIfCanSetHardwareAddr ? printf(" cansethardwareaddr") : printf("");
+ printf("\n");
+
+ TName address;
+ info().iAddress.Output(address);
+ printf("Addr: %s\n", qt_TNameToQString(address).toLatin1().data());
+
+ if(info().iAddress.IsLinkLocal()) {
+ printf(" -link local\n");
+ } else if(info().iAddress.IsSiteLocal()) {
+ printf(" -site local\n");
+ } else {
+ printf(" -global\n");
+ }
+
+ info().iNetMask.Output(address);
+ printf("Netmask %s\n", qt_TNameToQString(address).toLatin1().data());
+
+ info().iBrdAddr.Output(address);
+ printf("Broadcast address %s\n", qt_TNameToQString(address).toLatin1().data());
+
+ info().iDefGate.Output(address);
+ printf("Gatew: %s\n", qt_TNameToQString(address).toLatin1().data());
+
+ info().iNameSer1.Output(address);
+ printf("DNS 1: %s\n", qt_TNameToQString(address).toLatin1().data());
+
+ info().iNameSer2.Output(address);
+ printf("DNS 2: %s\n", qt_TNameToQString(address).toLatin1().data());
+
+ if (info().iHwAddr.Family() != KAFUnspec) {
+ printf("Hardware address ");
+ TUint j;
+ for(j = sizeof(SSockAddr) ; j < sizeof(SSockAddr) + 6 ; ++j) {
+ if(j < (TUint)info().iHwAddr.Length()) {
+ printf("%02X", info().iHwAddr[j]);
+ } else {
+ printf("??");
+ }
+ if(j < sizeof(SSockAddr) + 5)
+ printf("-");
+ else
+ printf("\n");
+ }
+ }
+ }
+ if(res == KErrNone) {
+ info = next;
+ printf("\n");
+ } else {
+ printf("\n");
+ }
+ }
+
+ sock.Pop();
+ ss.Pop();
+
+ return output;
+}
+
+static QString qt_RouteInfoL() {
+ QString output;
+ TAutoClose<RSocketServ> ss;
+ User::LeaveIfError(ss.iObj.Connect());
+ ss.PushL();
+
+ TAutoClose<RSocket> sock;
+ User::LeaveIfError(sock.iObj.Open(ss.iObj, _L("udp")));
+ sock.PushL();
+
+ TSoInetRouteInfo routeInfo;
+ TPckg<TSoInetRouteInfo> routeInfoPkg(routeInfo);
+
+ TName destAddr;
+ TName netMask;
+ TName gateway;
+ TName ifAddr;
+
+ // Begins enumeration of routes by setting this option
+ User::LeaveIfError(sock.iObj.SetOpt(KSoInetEnumRoutes, KSolInetRtCtrl));
+
+ // The TSoInetRouteInfo contains information for a new route each time GetOpt returns KErrNone
+ for(TInt i = 0; sock.iObj.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, routeInfoPkg) == KErrNone ; i++)
+ {
+ // Extract the destination and netmask
+ routeInfo.iDstAddr.Output(destAddr);
+ routeInfo.iNetMask.Output(netMask);
+ routeInfo.iGateway.Output(gateway);
+ routeInfo.iIfAddr.Output(ifAddr);
+/*
+ if(destAddr.Length() <= 2)
+ continue;
+
+ if(netMask.Find(_L("255.255.255.255")) != KErrNotFound
+ || netMask.Find(_L("0.0.0.0")) != KErrNotFound
+ || netMask.Find(_L("ffff:ffff:ffff:ffff")) != KErrNotFound)
+ continue;
+*/
+ printf("Route Info #[%i]\n", i);
+ printf("DstAddr %s\n", qt_TNameToQString(destAddr).toLatin1().data());
+ printf("NetMask %s\n", qt_TNameToQString(netMask).toLatin1().data());
+ printf("Gateway %s\n", qt_TNameToQString(gateway).toLatin1().data());
+ printf("IfAddr %s\n", qt_TNameToQString(ifAddr).toLatin1().data());
+ printf("\n");
+ }
+
+ sock.Pop();
+ ss.Pop();
+
+ return output;
+}
+
QString qt_TDesC2QStringL(const TDesC& aDescriptor)
{
#ifdef QT_NO_UNICODE
@@ -230,13 +420,13 @@ static QString qt_CheckForActiveConnection() {
tempConn.GetDesSetting(TPtrC(KIapServiceType), iapServiceType);
//tempConn.Stop();
iapName.ZeroTerminate();
- iapServiceType.ZeroTerminate();
+ iapServiceType.ZeroTerminate();
// if(iapServiceType.Find(_L8("LANService")) != KErrNotFound) {
// activeLanConnectionFound = ETrue;
// break;
// }
- strIapName = QString((char*)iapName.Ptr());
+ strIapName = QString((char*)iapName.Ptr());
int error = 0;
if(!qt_SetDefaultIapName(strIapName, error)) {
//printf("failed setdefaultif @ %i with %s and errno = %d \n", __LINE__, strIapName.toUtf8().data(), error);
@@ -311,8 +501,10 @@ static void qt_SetDefaultIapL()
static int qt_SetDefaultIap()
{
- TRAPD(err, qt_SetDefaultIapL());
- return err;
+ TRAPD(err1, qt_SetDefaultIapL());
+// TRAPD(err2, qt_InterfaceInfoL());
+// TRAPD(err3, qt_RouteInfoL());
+ return err1;
}
#endif // QSYM_IAP_UTIL_H