sdkcreationmw/sdkruntimes/wsock/src/WinsockHostResolver.cpp
author rajpuroh
Wed, 21 Apr 2010 09:56:53 +0530
changeset 1 ac50fd48361b
parent 0 b26acd06ea60
permissions -rw-r--r--
Second Contribution
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     1
/*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     2
* Copyright (c) 2004-2005 Nokia Corporation and/or its subsidiary(-ies).
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     3
* All rights reserved.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     4
* This component and the accompanying materials are made available
1
ac50fd48361b Second Contribution
rajpuroh
parents: 0
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
0
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     6
* which accompanies this distribution, and is available
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     8
*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     9
* Initial Contributors:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    11
*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    12
* Contributors:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    13
*
1
ac50fd48361b Second Contribution
rajpuroh
parents: 0
diff changeset
    14
* Description:
0
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    15
*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    16
*/
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    17
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    18
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    19
#define TRACE_PREFIX "WSOCK: HostResolver: "
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    20
#include "wsock.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    21
#include <in_sock.h>
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    22
#include <utf.h>
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    23
#include "WinsockProtocol.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    24
#include "WinsockProtocolFamily.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    25
#include "WinsockUtils.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    26
#include "WinsockHostResolver.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    27
#include "WinsockUtils.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    28
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    29
//
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    30
// Structure used in getaddrinfo() call.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    31
//
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    32
typedef struct _WinsockAddrInfo WinsockAddrInfo;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    33
struct _WinsockAddrInfo {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    34
    int ai_flags;              // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    35
    int ai_family;             // PF_xxx.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    36
    int ai_socktype;           // SOCK_xxx.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    37
    int ai_protocol;           // 0 or IPPROTO_xxx for IPv4 and IPv6.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    38
    size_t ai_addrlen;         // Length of ai_addr.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    39
    char *ai_canonname;        // Canonical name for nodename.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    40
    WSockAddr *ai_addr;        // Binary address.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    41
    WinsockAddrInfo *ai_next;  // Next structure in linked list.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    42
};
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    43
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    44
// getaddrinfo
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    45
typedef int (WINAPI *GetAddrInfoProc)(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    46
    const char *aNodename,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    47
    const char *aServname,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    48
    const WinsockAddrInfo *aHints,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    49
    WinsockAddrInfo **aResult
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    50
);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    51
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    52
// freeaddrinfo
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    53
typedef void (WINAPI *FreeAddrInfoProc)(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    54
    WinsockAddrInfo *aInfo
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    55
);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    56
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    57
// getnameinfo
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    58
typedef int (WINAPI *GetNameInfoProc)(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    59
    const WSockAddr  *sa,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    60
    int salen,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    61
    char *host,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    62
    int hostlen,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    63
    char *serv,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    64
    int servlen,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    65
    int flags
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    66
);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    67
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    68
static const char WinsockModule[] = "ws2_32";
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    69
const TInt KMaxHostNameLen = 256;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    70
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    71
CWinsockHostResolver* CWinsockHostResolver::NewL(const TWinProtocolDesc* aPd)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    72
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    73
    CWinsockHostResolver* self = new(ELeave)CWinsockHostResolver(aPd);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    74
    CleanupStack::PushL(self);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    75
    self->ConstructL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    76
    CleanupStack::Pop(self);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    77
    return self;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    78
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    79
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    80
CWinsockHostResolver::CWinsockHostResolver(const TWinProtocolDesc* aProtocol):
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    81
iProtocolDesc(aProtocol)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    82
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    83
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    84
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    85
CWinsockHostResolver::~CWinsockHostResolver()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    86
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    87
    delete iHostName;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    88
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    89
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    90
void CWinsockHostResolver::ConstructL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    91
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    92
    char hostname[KMaxHostNameLen];
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    93
    hostname[0] = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    94
    gethostname(hostname,N(hostname));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    95
    TPtrC8 hostnamePtr((unsigned char*)hostname);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    96
    iHostName = HBufC::NewL(hostnamePtr.Length()+1);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    97
    TPtr hostNamePtr(iHostName->Des());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    98
    hostNamePtr.Copy(hostnamePtr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    99
    hostNamePtr.ZeroTerminate();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   100
    TRACE1("host name: %S",iHostName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   101
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   102
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   103
CWinsockHostResolver::TResolveErr 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   104
CWinsockHostResolver::Resolve6(const char* aHostName,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   105
                               TInt aIndex, TInetAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   106
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   107
#define NO_GET_ADDR_INFO ((GetAddrInfoProc)(-1))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   108
#define NO_FREE_ADDR_INFO ((FreeAddrInfoProc)(-1))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   109
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   110
    static GetAddrInfoProc getAddrInfo = NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   111
    static FreeAddrInfoProc freeAddrInfo = NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   112
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   113
    // Initialize XP specific functions
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   114
    if (!getAddrInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   115
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   116
        // We are linking with ws2_32.dll so if we are loaded, then it 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   117
        // must be loaded too
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   118
        HMODULE hWs2 = GetModuleHandleA(WinsockModule);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   119
        freeAddrInfo = (FreeAddrInfoProc)GetProcAddress(hWs2,"freeaddrinfo");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   120
        if (freeAddrInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   121
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   122
            TRACE1("found freeaddrinfo at 0x%08x",freeAddrInfo);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   123
            getAddrInfo = (GetAddrInfoProc)GetProcAddress(hWs2,"getaddrinfo");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   124
            if (getAddrInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   125
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   126
                TRACE1("found getaddrinfo at 0x%08x",getAddrInfo);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   127
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   128
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   129
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   130
                TRACE("getaddrinfo is not supported");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   131
                getAddrInfo = NO_GET_ADDR_INFO;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   132
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   133
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   134
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   135
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   136
            TRACE("freeaddrinfo is not supported (getaddrinfo probably too)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   137
            freeAddrInfo = NO_FREE_ADDR_INFO;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   138
            getAddrInfo = NO_GET_ADDR_INFO;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   139
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   140
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   141
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   142
    if (getAddrInfo != NO_GET_ADDR_INFO)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   143
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   144
        WinsockAddrInfo hints;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   145
        WinsockAddrInfo *addr = NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   146
        Mem::FillZ(&hints,sizeof(hints));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   147
        hints.ai_family = AF_INET6;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   148
        hints.ai_socktype = SOCK_STREAM;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   149
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   150
        int err = getAddrInfo(aHostName, NULL, &hints, &addr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   151
        if (!err && addr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   152
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   153
            int index = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   154
            TResolveErr status = EResolveNoMore;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   155
            WinsockAddrInfo *ai = addr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   156
            while (index < aIndex && ai) ai = ai->ai_next, index++;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   157
            if (ai) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   158
                WinsockUtils::ToInetAddr(aAddr, ai->ai_addr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   159
                status = EResolveOK;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   160
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   161
            freeAddrInfo(addr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   162
            return status;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   163
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   164
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   165
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   166
            TRACE1("getAddrInfo error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   167
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   168
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   169
    return EResolveFailed;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   170
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   171
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   172
TInt CWinsockHostResolver::Resolve(const char* aHostName, 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   173
                                   TInt aIndex, 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   174
                                   TInetAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   175
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   176
    if (iProtocolDesc->iAddrFamily == KAfInet6)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   177
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   178
        TResolveErr err = Resolve6(aHostName, aIndex, aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   179
        switch (err) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   180
        case EResolveOK:        return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   181
        case EResolveNoMore:    return KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   182
        case EResolveFailed:    break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   183
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   184
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   185
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   186
    /* If addrFamily is KAfInet or CallGetAddrInfo failed */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   187
    struct hostent * host = gethostbyname(aHostName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   188
    if (host && host->h_length == 4)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   189
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   190
        TInt n = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   191
        while (host->h_addr_list[n]) n++;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   192
        if (aIndex < n)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   193
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   194
            struct in_addr in;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   195
            Mem::Copy(&in, host->h_addr_list[aIndex], host->h_length);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   196
            if (iProtocolDesc->iAddrFamily == KAfInet6)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   197
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   198
                aAddr->SetV4MappedAddress(ntohl(in.s_addr));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   199
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   200
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   201
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   202
                aAddr->SetAddress(ntohl(in.s_addr));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   203
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   204
            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   205
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   206
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   207
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   208
    return KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   209
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   210
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   211
TInt CWinsockHostResolver::GetHostNameFromAddr6(const TIp6Addr& aAddr,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   212
                                                THostName& aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   213
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   214
#define NO_GET_NAME_INFO ((GetNameInfoProc)(-1))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   215
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   216
    static GetNameInfoProc getNameInfo = NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   217
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   218
    // Initialize XP specific functions
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   219
    if (!getNameInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   220
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   221
        // We are linking with ws2_32.dll so if we are loaded, then it 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   222
        // must be loaded too
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   223
        HMODULE hWs2 = GetModuleHandleA(WinsockModule);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   224
        getNameInfo = (GetNameInfoProc)GetProcAddress(hWs2,"getnameinfo");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   225
        if (getNameInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   226
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   227
            TRACE1("found getNameInfo at 0x%08x",getNameInfo);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   228
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   229
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   230
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   231
            TRACE("getNameInfo is not supported");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   232
            getNameInfo = NO_GET_NAME_INFO;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   233
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   234
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   235
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   236
    if (getNameInfo != NO_GET_NAME_INFO)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   237
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   238
    	char name[KMaxHostNameLen] = "";
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   239
        WSockAddr sa;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   240
        TInetAddr inetAddr(aAddr,0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   241
        int len = WinsockUtils::ToSockAddr(&sa, &inetAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   242
        int err = getNameInfo(&sa, len, name, sizeof(name), NULL, 0, 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   243
        if (!err && name[0])
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   244
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   245
            TPtrC8 hostnamePtr((unsigned char*)name);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   246
            aName.Copy(hostnamePtr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   247
            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   248
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   249
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   250
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   251
            TRACE1("getNameInfo error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   252
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   253
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   254
    return KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   255
	
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   256
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   257
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   258
// Takes IPv4 address in network byte order
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   259
TInt CWinsockHostResolver::GetHostNameFromAddr(TUint32 aAddr,THostName& aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   260
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   261
    struct hostent* host = gethostbyaddr((char*)&aAddr,sizeof(aAddr),AF_INET);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   262
    if (host)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   263
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   264
        TPtrC8 hostnamePtr((unsigned char*)host->h_name);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   265
        aName.Copy(hostnamePtr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   266
        return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   267
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   268
    return KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   269
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   270
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   271
// CHostResolvProvdBase
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   272
void CWinsockHostResolver::GetByName(TNameRecord& aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   273
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   274
    TInt result = KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   275
    TInetAddr &addr = TInetAddr::Cast(aName.iAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   276
    TRACE2("GetByName(%S,%d)",&aName.iName,aName.iFlags);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   277
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   278
    // Note that aName.iFlags is actually the index of the address 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   279
    // to retreive. First one is zero, and so on. Sometimes we are being
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   280
    // called in a loop with aName.iFlags being incremented each time.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   281
    // Loop terminates when we return something other than KErrNone.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   282
    // That happens when client calls RHostResolver::Next function
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   283
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   284
    // First assume that it's an IP address string
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   285
    if (addr.Input(aName.iName) == KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   286
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   287
        if (iProtocolDesc->iAddrFamily == KAfInet6 && 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   288
            addr.Family() == KAfInet)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   289
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   290
            // Caller asked for IPv6 address
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   291
            addr.ConvertToV4Mapped();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   292
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   293
        result = ((aName.iFlags == 0) ? KErrNone : KErrNotFound);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   294
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   295
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   296
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   297
        // Do the name resolution
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   298
        char hostname[KMaxHostNameLen];
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   299
        TPtr8 hostnamePtr((unsigned char*)hostname, N(hostname));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   300
        CnvUtfConverter::ConvertFromUnicodeToUtf8(hostnamePtr,aName.iName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   301
        hostnamePtr.ZeroTerminate();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   302
        result = Resolve(hostname, aName.iFlags, &addr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   303
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   304
        if (result == KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   305
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   306
            TBuf<256> buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   307
            addr.OutputWithScope(buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   308
            TRACE1("%S",&buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   309
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   310
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   311
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   312
    iNotify->QueryComplete(result);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   313
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   314
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   315
void CWinsockHostResolver::GetByAddress(TNameRecord& aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   316
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   317
    TInt result = KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   318
    TInetAddr &addr = TInetAddr::Cast(aName.iAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   319
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   320
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   321
    TBuf<256> buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   322
    addr.OutputWithScope(buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   323
    TRACE2("GetByAddress(%S, %d)",&buf, aName.iFlags);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   324
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   325
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   326
    // Again, aName.iFlags is the index of the name to retreive. It can be
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   327
    // greater than zero if the client calls RHostResolver::Next. We only
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   328
    // return one, with index zero.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   329
    if (aName.iFlags == 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   330
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   331
        // Everything that converts into an IPv4 address without loss of
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   332
        // information goes through gethostbyname. Note that IPv4 address
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   333
        // returned by TInetAddr::Address() is in host byte order.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   334
        TUint32 ipv4 = htonl(addr.Address());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   335
        result = (ipv4 ?
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   336
            GetHostNameFromAddr(ipv4, aName.iName) :
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   337
            GetHostNameFromAddr6(addr.Ip6Address(), aName.iName));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   338
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   339
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   340
        if (result == KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   341
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   342
            TRACE1("%S",&aName.iName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   343
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   344
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   345
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   346
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   347
    iNotify->QueryComplete(result);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   348
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   349
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   350
void CWinsockHostResolver::SetHostName(TDes& aNameBuf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   351
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   352
    TRACE1("SetHostName(%S)",&aNameBuf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   353
    HBufC* newHostName = aNameBuf.Alloc();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   354
    if (newHostName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   355
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   356
        delete iHostName;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   357
        iHostName = newHostName;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   358
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   359
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   360
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   361
void CWinsockHostResolver::GetHostName(TDes& aNameBuf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   362
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   363
    TRACE("GetHostName");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   364
    if (iHostName) aNameBuf.Copy(*iHostName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   365
    iNotify->QueryComplete(KErrNone);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   366
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   367
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   368
// CResolverProvdBase
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   369
void CWinsockHostResolver::CancelCurrentOperation()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   370
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   371
    // Nothing to cancel, everything is synchronous
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   372
}