sdkcreationmw/sdkruntimes/wsock/src/WinsockServProvider.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-2007 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: ServProvider: "
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    20
#include <es_mbuf.h>
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    21
#include "wsock.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    22
#include "WinsockProtocol.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    23
#include "WinsockProtocolFamily.h"
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    24
#include "WinsockServProvider.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
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    27
#define KMaxInetAddrBufSize 64
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    28
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    29
// CWinsockServProvider::CWriteData
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    30
class CWinsockServProvider::CWriteData : public CBase
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    31
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    32
public:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    33
    TDblQueLink iLink;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    34
    TSockAddr* iAddr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    35
    HBufC8* iData;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    36
public:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    37
    static CWriteData* New(const TDesC8& aData, TSockAddr* aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    38
    ~CWriteData();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    39
};
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    40
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    41
// CWinsockServProvider::CWriteRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    42
class CWinsockServProvider::CWriteRequest : public CActive
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    43
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    44
private:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    45
    CWinsockServProvider* iProvider;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    46
    RTimer iTimer;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    47
    TBool iTimerCreated;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    48
    TBool iTimerActive;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    49
public:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    50
    CWriteRequest(CWinsockServProvider* aProvider);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    51
    ~CWriteRequest();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    52
    void Submit(TInt aDelay = 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    53
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    54
    // CActive
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    55
    virtual void DoCancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    56
    virtual void RunL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    57
};
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    58
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    59
// CWinsockServProvider::CSelectRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    60
class CWinsockServProvider::CSelectRequest : public CActive,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    61
                                             public MSelectRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    62
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    63
private:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    64
    CWinsockServProvider* iProvider;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    65
    RThread iServerThread;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    66
    TInt iSelectMask;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    67
public:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    68
    static CSelectRequest* NewLC(CWinsockServProvider* aProvider);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    69
    virtual ~CSelectRequest();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    70
    void SubmitL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    71
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    72
    // CActive
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    73
    virtual void DoCancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    74
    virtual void RunL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    75
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    76
    // MSelectRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    77
    virtual TUint Socket();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    78
    virtual TInt SelectMask();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    79
    virtual void SelectComplete(TInt aSelectMask);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    80
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    81
private:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    82
    CSelectRequest(CWinsockServProvider* aProvider);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    83
    void ConstructL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    84
};
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    85
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    86
// CWinsockServProvider::CNewDataNotifier
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    87
class CWinsockServProvider::CNewDataNotifier : public CActive
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    88
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    89
private:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    90
    CWinsockServProvider* iProvider;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    91
public:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    92
    CNewDataNotifier(CWinsockServProvider* aProvider);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    93
    void Submit();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    94
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    95
    // CActive
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    96
    virtual void DoCancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    97
    virtual void RunL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    98
};
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    99
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   100
// CWinsockServProvider
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   101
#define SUPER CServProviderBase
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   102
CWinsockServProvider* CWinsockServProvider::NewL(CWinsockProtocol* aProtocol)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   103
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   104
    return new(ELeave)CWinsockServProvider(aProtocol);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   105
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   106
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   107
CWinsockServProvider* CWinsockServProvider::FromSocket(CWinsockProtocol* aPro,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   108
                                                       TInt aSocket,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   109
                                                       TInt aFamily)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   110
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   111
    ASSERT(aFamily != 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   112
    ASSERT(aSocket != INVALID_SOCKET);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   113
    CWinsockServProvider* self = new CWinsockServProvider(aPro);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   114
    if (self) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   115
        self->iWinSocket = aSocket;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   116
        self->iFamily = aFamily;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   117
        self->iFlags |= (EFlagConnect | EFlagNeedSelect);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   118
        // Select will be called from SetNotify. Otherwise, under some rare
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   119
        // circumstances select may complete and NewDataCheck is invoked
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   120
        // before SetNotify has been invoked and therefore iSocket is still
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   121
        // NULL.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   122
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   123
    return self;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   124
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   125
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   126
CWinsockServProvider::CWinsockServProvider(CWinsockProtocol* aProtocol) :
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   127
iProtocol(aProtocol),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   128
iWinSocket(INVALID_SOCKET),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   129
iWriteQ(_FOFF(CWriteData,iLink)),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   130
iTcpSendWinSize(8192),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   131
iTcpRecvWinSize(8192),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   132
iTcpMaxSegSize(1460),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   133
iUdpRecvBuf(8192)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   134
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   135
    WTRACE("created");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   136
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   137
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   138
CWinsockServProvider::~CWinsockServProvider()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   139
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   140
    iProtocol->SetReadPending(this, EFalse);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   141
    if (iWrite)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   142
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   143
        iWrite->Cancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   144
        delete iWrite;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   145
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   146
    if (iNewData)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   147
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   148
        iNewData->Cancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   149
        delete iNewData;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   150
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   151
    if (iSelect)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   152
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   153
        CWinsockSelectThread::Static()->Cancel(iSelect);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   154
        iSelect->Cancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   155
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   156
    if (iAdapterInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   157
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   158
        User::Free(iAdapterInfo);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   159
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   160
    if (iWinSocket != INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   161
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   162
        closesocket(iWinSocket);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   163
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   164
#ifdef V1_5_PRT_INTERFACE
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   165
    if (iDataBuf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   166
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   167
        delete iDataBuf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   168
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   169
#endif
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   170
    WTRACE("destroyed");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   171
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   172
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   173
// Returns the socket, or creates one using default address family.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   174
TInt CWinsockServProvider::Socket() const
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   175
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   176
    CWinsockServProvider* This = (CWinsockServProvider*)this;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   177
    return This->Socket(Family());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   178
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   179
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   180
// Returns the socket, creating one if necessary. Note that the requested
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   181
// address family may not match the protocol family given to us in the
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   182
// constructor. That's because some Symbian code (such as HTTP protocol
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   183
// framework) may, for example, create an IPv4 socket and then connect
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   184
// it to an IPv6 address. Also note that once we have created the Windows
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   185
// socket we can't change its address family.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   186
TInt CWinsockServProvider::Socket(TUint aFamily)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   187
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   188
    if (iWinSocket == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   189
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   190
        if (!aFamily) aFamily = Family();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   191
        TInt af = (aFamily == KAfInet6) ? AF_INET6 : AF_INET;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   192
        TInt type = iProtocol->ProtocolDesc()->iWinSockType;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   193
        TInt protocol = iProtocol->ProtocolDesc()->iWinProtocol;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   194
        iWinSocket = socket(af, type, protocol);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   195
        if (iWinSocket == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   196
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   197
            WTRACE4("socket(%d,%d,%d) failed, err %d",af, type, protocol,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   198
            WSAGetLastError());
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
            // Remember the actual address family
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   203
            iFamily = aFamily;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   204
            WTRACE2("created %s %S socket", (af == AF_INET6) ?
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   205
                _S("IPv6") : _S("IPv4"), &iProtocol->ProtocolDesc()->iName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   206
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   207
            // Connection-less sockets immediately start accepting
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   208
            // incoming datagrams
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   209
            if (iProtocol->IsDatagramProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   210
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   211
                Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   212
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   213
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   214
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   215
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   216
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   217
        // This ASSERT means that we have already created the Windows socket
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   218
        // and then we were asked to connect or bind it to the address with
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   219
        // a different address family. That's bad.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   220
        ASSERT(!aFamily || aFamily == iFamily);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   221
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   222
    return iWinSocket;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   223
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   224
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   225
// Returns address family of this socket in Symbian format,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   226
// i.e. KAfInet or KAfInet6
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   227
TUint CWinsockServProvider::Family() const
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   228
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   229
    if (iFamily)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   230
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   231
        // The socket has already been created
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   232
        return iFamily;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   233
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   234
    else if (iRemAddr.Family())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   235
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   236
        // Assume the same address family as in remote address. That makes
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   237
        // URLs like http://[fe80::a00:20ff:fef9:bf8]/ work in the browser.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   238
        // In that case we get the following sequence of calls:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   239
        //    SetRemName -> AutoBind -> ActiveOpen
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   240
        // This allows us to create the socket of the right type in AutoBind.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   241
        return iRemAddr.Family();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   242
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   243
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   244
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   245
        // With no additional information, assume the address family from
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   246
        // the protocol object.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   247
        return iProtocol->ProtocolDesc()->iAddrFamily;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   248
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   249
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   250
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   251
// CServProviderBase
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   252
void CWinsockServProvider::Start()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   253
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   254
    WTRACE("Start()");
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
void CWinsockServProvider::SetNotify(MSocketNotify* aSocket)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   258
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   259
    WTRACE1("SetNotify(%08X)",aSocket);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   260
    SUPER::SetNotify(aSocket);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   261
    if (iFlags & EFlagNeedSelect)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   262
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   263
        iFlags &= ~EFlagNeedSelect;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   264
        Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   265
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   266
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   267
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   268
typedef int (WSAAPI *GetSockNameProc)(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   269
    SOCKET s,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   270
    struct sockaddr* name,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   271
    int* namelen
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   272
);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   273
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   274
static void GetSockName(SOCKET sock, TSockAddr& aAddr,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   275
                        GetSockNameProc aFunction,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   276
                        const TText* DEBUG_ONLY(aFunctionName))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   277
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   278
    WSockAddr sa;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   279
    int namelen = SOCKADDR_SIZE;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   280
    int err = aFunction(sock, &sa.Address, &namelen);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   281
    if (!err)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   282
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   283
        WinsockUtils::ToInetAddr(&aAddr,&sa);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   284
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   285
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   286
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   287
        TRACE2("%s failed, error %d\n",aFunctionName,err);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   288
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   289
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   290
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   291
void CWinsockServProvider::LocalName(TSockAddr& aAddr) const
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   292
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   293
    if (Socket() == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   294
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   295
        WTRACE("LocalName() - no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   296
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   297
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   298
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   299
        GetSockName(iWinSocket,aAddr,getsockname,_S("getsockname"));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   300
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   301
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   302
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   303
// Wrapper around WinsockUtils::ToSockAddr which attempts to convert
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   304
// the address into the form compatible with the address family of
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   305
// this socket.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   306
int CWinsockServProvider::ToSockAddr(union _WSockAddr* aToAddr,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   307
                                     const TSockAddr* aFromAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   308
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   309
    if (Family() == KAfInet6 && aFromAddr->Family() == KAfInet)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   310
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   311
        // Convert IPv4 address to IPv4-mapped IPv6 address.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   312
        TInetAddr ipv6(*aFromAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   313
        ipv6.ConvertToV4Mapped();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   314
        ASSERT(ipv6.Family() == KAfInet6);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   315
        return WinsockUtils::ToSockAddr(aToAddr, &ipv6);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   316
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   317
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   318
    if (Family() == KAfInet && aFromAddr->Family() == KAfInet6)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   319
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   320
        TInetAddr& ipv6 = TInetAddr::Cast(aFromAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   321
        if (ipv6.IsV4Mapped() || ipv6.IsV4Compat())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   322
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   323
            // Convert IPv4 compatible IPv6 address to IPv4
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   324
            TInetAddr ipv4(ipv6);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   325
            ipv4.ConvertToV4();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   326
            return WinsockUtils::ToSockAddr(aToAddr, &ipv4);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   327
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   328
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   329
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   330
    // Do the default conversion
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   331
    return WinsockUtils::ToSockAddr(aToAddr, aFromAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   332
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   333
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   334
TInt CWinsockServProvider::SetLocalName(TSockAddr& aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   335
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   336
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   337
    TBuf<KMaxInetAddrBufSize> buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   338
    TInetAddr::Cast(aAddr).OutputWithScope(buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   339
    if (buf.Length() == 0) buf.Append('*');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   340
    WTRACE2("SetLocalName(%S,%d)",&buf,aAddr.Port());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   341
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   342
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   343
    if (Socket(aAddr.Family()) == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   344
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   345
        WTRACE("SetLocalName - no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   346
        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   347
        return KErrNotSupported;
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
    // Bind new socket to the specified address
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   351
    WSockAddr sa;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   352
    int len = ToSockAddr(&sa, &aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   353
    int err = bind(iWinSocket, &sa.Address, len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   354
    if (err)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   355
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   356
        WTRACE1("bind failed, err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   357
        return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   358
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   359
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   360
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   361
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   362
        TInetAddr localAddr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   363
        GetSockName(iWinSocket,localAddr,getsockname,_S("getsockname"));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   364
        localAddr.OutputWithScope(buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   365
        WTRACE2("bound to %S port %d",&buf,localAddr.Port());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   366
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   367
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   368
        return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   369
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   370
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   371
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   372
void CWinsockServProvider::RemName(TSockAddr& aAddr) const
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   373
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   374
    if (iFlags & EFlagConnect)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   375
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   376
        GetSockName(iWinSocket,aAddr,getpeername,_S("getpeername"));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   377
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   378
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   379
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   380
        aAddr = iRemAddr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   381
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   382
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   383
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   384
TInt CWinsockServProvider::SetRemName(TSockAddr& aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   385
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   386
    iRemAddr = TInetAddr::Cast(aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   387
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   388
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   389
    TBuf<KMaxInetAddrBufSize> buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   390
    iRemAddr.OutputWithScope(buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   391
    WTRACE2("SetRemName(%S,%d)",&buf,iRemAddr.Port());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   392
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   393
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   394
    if (iProtocol->IsDatagramProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   395
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   396
        // application called connect() on datagram-socket. Propagate call to
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   397
        // Winsock. (In case of stream-socket, connect() appears to happen
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   398
        // ActiveOpen()-call, but that is not called in case of udp-socket.)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   399
        Connect();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   400
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   401
    return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   402
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   403
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   404
void CWinsockServProvider::Ioctl(TUint DEBUG_ONLY(aLevel),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   405
                                 TUint DEBUG_ONLY(aName),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   406
                                 TDes8* /*anOption*/)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   407
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   408
    WTRACE2("Ioctl(%d,%08X)",aLevel,aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   409
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   410
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   411
void CWinsockServProvider::CancelIoctl(TUint DEBUG_ONLY(aLevel),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   412
                                       TUint DEBUG_ONLY(aName))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   413
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   414
    WTRACE2("CancelIoctl(%d,%08X)",aLevel,aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   415
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   416
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   417
TInt CWinsockServProvider::SetOption(TUint aLevel, TUint aName,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   418
                                     const TDesC8& aOption)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   419
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   420
    switch (aLevel)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   421
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   422
    case KSOLSocket:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   423
        WTRACE1("SetOption(KSOLSocket,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   424
        return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   425
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   426
    case KSolInetIfCtrl:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   427
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   428
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   429
        case KSoInetEnumInterfaces:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   430
            WTRACE("SetOption(KSoInetEnumInterfaces)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   431
            if (iAdapterInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   432
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   433
                User::Free(iAdapterInfo);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   434
                iAdapterInfo = NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   435
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   436
            iAdapterInfo = iProtocol->GetAdapterInfo();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   437
            iNextAdapter = iAdapterInfo;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   438
            iLastAdapter = NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   439
            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   440
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   441
            WTRACE1("SetOption(KSolInetIfCtrl,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   442
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   443
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   444
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   445
    case KSOLProvider:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   446
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   447
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   448
        case KSoConnectionInfo:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   449
            iConnectionInfo = *((TSoIfConnectionInfo*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   450
            WTRACE2("SetOption(KSoConnectionInfo) IAP %d, network %d",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   451
                   iConnectionInfo.iIAPId, iConnectionInfo.iNetworkId);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   452
            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   453
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   454
            WTRACE1("SetOption(KSOLProvider,%08X) - UNSUPPORTED",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   455
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   456
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   457
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   458
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   459
    case KSolInetIp:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   460
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   461
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   462
        case KSoIpTTL:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   463
            WTRACE1("SetOption(KSoIpTTL) %d",*((int*)aOption.Ptr()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   464
            if (!setsockopt(Socket(), IPPROTO_IP, IP_TTL,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   465
                (char*)aOption.Ptr(), aOption.Length()))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   466
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   467
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   468
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   469
            WTRACE1("setsockopt(IP_TTL) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   470
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   471
        case KSoReuseAddr:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   472
            WTRACE1("SetOption(KSoReuseAddr) %d",*((int*)aOption.Ptr()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   473
            if (!setsockopt(Socket(), SOL_SOCKET, SO_REUSEADDR,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   474
                (char*)aOption.Ptr(), aOption.Length()))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   475
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   476
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   477
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   478
            WTRACE1("setsockopt(SO_REUSEADDR) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   479
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   480
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   481
            WTRACE1("SetOption(KSolInetIp,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   482
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   483
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   484
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   485
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   486
    case KSolInetTcp:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   487
        if (iProtocol->ProtocolDesc()->iProtocol == KProtocolInetTcp) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   488
            switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   489
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   490
            case KSoTcpSendWinSize:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   491
                WTRACE("SetOption(KSoTcpSendWinSize)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   492
                if (iFlags & EFlagConnect) return KErrLocked;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   493
                if (aOption.Length() != sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   494
                iTcpSendWinSize = *((TInt*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   495
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   496
            case KSoTcpRecvWinSize:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   497
                WTRACE("SetOption(KSoTcpSendWinSize)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   498
                if (iFlags & EFlagConnect) return KErrLocked;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   499
                if (aOption.Length() != sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   500
                iTcpRecvWinSize = *((TInt*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   501
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   502
            case KSoTcpMaxSegSize:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   503
                WTRACE("SetOption(KSoTcpMaxSegSize)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   504
                if (iFlags & EFlagConnect) return KErrLocked;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   505
                if (aOption.Length() != sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   506
                iTcpMaxSegSize = *((TInt*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   507
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   508
            case KSoTcpNoDelay:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   509
                WTRACE1("SetOption(KSoTcpNoDelay) %d",*((TInt*)aOption.Ptr()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   510
                if (!setsockopt(Socket(), IPPROTO_TCP, TCP_NODELAY,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   511
                    (char*)aOption.Ptr(),aOption.Length())) return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   512
                WTRACE1("setsockopt(TCP_NODELAY) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   513
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   514
            case KSoTcpKeepAlive:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   515
                WTRACE1("SetOption(KSoTcpKeepAlive) %d",*((TInt*)aOption.Ptr()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   516
                if (!setsockopt(Socket(), SOL_SOCKET, SO_KEEPALIVE,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   517
                    (char*)aOption.Ptr(),aOption.Length())) return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   518
                WTRACE1("setsockopt(SO_KEEPALIVE) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   519
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   520
            default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   521
                WTRACE1("SetOption(KSolInetTcp,%08X) - UNSUPPORTED",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   522
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   523
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   524
        } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   525
            WTRACE1("SetOption(KSolInetTcp,%08X) - not a TCP socket!",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   526
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   527
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   528
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   529
    case KSolInetUdp:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   530
        if (iProtocol->ProtocolDesc()->iProtocol == KProtocolInetUdp) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   531
            switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   532
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   533
            case KSoUdpReceiveICMPError:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   534
                WTRACE("SetOption(KSoUdpReceiveICMPError)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   535
                if (aOption.Length() != sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   536
                iUdpReceiveICMPError = *((TInt*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   537
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   538
            case KSoUdpRecvBuf:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   539
                WTRACE("SetOption(KSoUdpRecvBuf)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   540
                if (aOption.Length() != sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   541
                iUdpRecvBuf = *((TInt*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   542
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   543
            case KSoUdpSynchronousSend:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   544
                WTRACE("SetOption(KSoUdpSynchronousSend)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   545
                if (aOption.Length() != sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   546
                iUdpSynchronousSend = *((TInt*)aOption.Ptr());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   547
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   548
            default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   549
                WTRACE1("SetOption(KSolInetUdp,%08X) - UNSUPPORTED",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   550
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   551
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   552
        } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   553
            WTRACE1("SetOption(KSolInetUdp,%08X) - not a UDP socket!",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   554
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   555
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   556
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   557
    default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   558
        WTRACE2("SetOption(%d,%08X) - UNSUPPORTED",aLevel,aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   559
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   560
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   561
    return KErrNotSupported;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   562
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   563
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   564
TInt CWinsockServProvider::GetOption(TUint aLevel, TUint aName,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   565
                                     TDes8& aOption) const
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   566
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   567
    TInt len;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   568
    switch (aLevel)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   569
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   570
    case KSOLSocket:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   571
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   572
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   573
        // This one used by SIP code:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   574
        case KSOReadBytesPending:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   575
            if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   576
            aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   577
            if (!ioctlsocket(Socket(), FIONREAD, (u_long*)aOption.Ptr()))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   578
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   579
                WTRACE1("GetOption(KSOReadBytesPending) %d",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   580
                    *((TInt*)aOption.Ptr()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   581
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   582
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   583
            WTRACE1("GetOption(KSOReadBytesPending) - ioctl(FIONREAD) err %d",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   584
                WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   585
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   586
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   587
        case KSORecvBuf:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   588
        case KSOSendBuf:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   589
            WTRACE1("GetOption(KSOLSocket,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   590
            if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   591
            aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   592
            *((TInt*)aOption.Ptr()) = KSocketDefaultBufferSize;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   593
            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   594
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   595
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   596
            WTRACE1("GetOption(KSOLSocket,%08X) - UNSUPPORTED",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   597
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   598
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   599
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   600
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   601
    case KSolInetIfCtrl:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   602
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   603
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   604
        case KSoInetNextInterface:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   605
            WTRACE("GetOption(KSoInetNextInterface)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   606
            iLastAdapter = iNextAdapter;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   607
            if (iLastAdapter)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   608
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   609
                iNextAdapter = iLastAdapter->Next;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   610
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   611
                // Copy interface information into the output buffer
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   612
                TSoInetInterfaceInfo *opt;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   613
                aOption.SetLength(sizeof(*opt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   614
                opt = (TSoInetInterfaceInfo*)aOption.Ptr();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   615
                opt->iName.Copy(TPtrC8(iLastAdapter->AdapterName));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   616
                const WinsockIpAddrString*adr = iLastAdapter->CurrentIpAddress;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   617
                if (!adr) adr = &iLastAdapter->IpAddressList;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   618
                TUint ip = inet_addr((char*)adr->IpAddress.String);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   619
                TUint mask = inet_addr((char*)adr->IpMask.String);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   620
                opt->iAddress.SetAddress(ntohl(ip));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   621
                opt->iNetMask.SetAddress(ntohl(mask));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   622
                opt->iState = EIfUp;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   623
                opt->iMtu = 1500;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   624
                opt->iSpeedMetric = 10000;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   625
                opt->iFeatures = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   626
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   627
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   628
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   629
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   630
                return KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   631
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   632
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   633
            WTRACE1("GetOption(KSolInetIfCtrl,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   634
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   635
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   636
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   637
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   638
    case KSolInetIfQuery:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   639
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   640
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   641
        case KSoInetIfQueryByName:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   642
            WTRACE("GetOption(KSoInetIfQueryByName)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   643
            if (!iAdapterInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   644
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   645
                iAdapterInfo = iProtocol->GetAdapterInfo();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   646
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   647
            if (iAdapterInfo)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   648
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   649
                TSoInetIfQuery* query = (TSoInetIfQuery*)aOption.Ptr();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   650
                WinsockIpAdapterInfo* adapter = iAdapterInfo;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   651
                while (adapter)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   652
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   653
                    TUint len = User::StringLength(adapter->AdapterName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   654
                    HBufC* buf = HBufC::New(len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   655
                    if (buf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   656
                    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   657
                        TPtr16 ptr(buf->Des());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   658
                        ptr.Copy(TPtrC8(adapter->AdapterName));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   659
                        if (ptr.Compare(query->iName) == 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   660
                        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   661
                            query->iIndex = adapter->Index;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   662
                            query->iZone[0] = adapter->Index;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   663
                            query->iZone[1] = iConnectionInfo.iIAPId;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   664
                            query->iZone[15] = iConnectionInfo.iNetworkId;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   665
                            for (TInt i=2; i<15; i++) query->iZone[i] = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   666
                            query->iIsUp = ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   667
                            delete buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   668
                            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   669
                        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   670
                        delete buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   671
                    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   672
                    adapter = adapter->Next;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   673
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   674
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   675
            return KErrNotFound;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   676
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   677
            WTRACE1("GetOption(KSolInetIfQuery,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   678
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   679
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   680
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   681
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   682
    case KSolInetIp:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   683
        switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   684
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   685
        case KSoIpTTL:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   686
            WTRACE("GetOption(KSoIpTTL)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   687
            if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   688
            aOption.SetLength(len = sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   689
            if (!getsockopt(Socket(), IPPROTO_IP, IP_TTL,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   690
                (char*)aOption.Ptr(), &len))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   691
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   692
                aOption.SetLength(len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   693
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   694
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   695
            WTRACE1("getsockopt(IP_TTL) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   696
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   697
        case KSoReuseAddr:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   698
            WTRACE("GetOption(KSoReuseAddr)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   699
            if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   700
            aOption.SetLength(len = sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   701
            if (!getsockopt(Socket(), SOL_SOCKET, SO_REUSEADDR,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   702
                (char*)aOption.Ptr(), &len))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   703
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   704
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   705
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   706
            WTRACE1("getsockopt(SO_REUSEADDR) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   707
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   708
        default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   709
            WTRACE1("SetOption(KSolInetIp,%08X)",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   710
            break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   711
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   712
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   713
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   714
    case KSolInetTcp:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   715
        if (iProtocol->ProtocolDesc()->iProtocol == KProtocolInetTcp) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   716
            switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   717
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   718
            case KSoTcpSendWinSize:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   719
                WTRACE("GetOption(KSoTcpSendWinSize)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   720
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   721
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   722
                *((TInt*)aOption.Ptr()) = iTcpSendWinSize;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   723
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   724
            case KSoTcpRecvWinSize:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   725
                WTRACE("GetOption(KSoTcpSendWinSize)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   726
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   727
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   728
                *((TInt*)aOption.Ptr()) = iTcpRecvWinSize;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   729
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   730
            case KSoTcpMaxSegSize:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   731
                WTRACE("GetOption(KSoTcpMaxSegSize)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   732
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   733
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   734
                *((TInt*)aOption.Ptr()) = iTcpMaxSegSize;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   735
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   736
            case KSoTcpNoDelay:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   737
                WTRACE("GetOption(KSoTcpNoDelay)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   738
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   739
                aOption.SetLength(len = sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   740
                if (!getsockopt(Socket(), IPPROTO_TCP, TCP_NODELAY,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   741
                    (char*)aOption.Ptr(),&len))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   742
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   743
                    aOption.SetLength(len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   744
                    return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   745
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   746
                WTRACE1("getsockopt(TCP_NODELAY) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   747
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   748
            case KSoTcpKeepAlive:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   749
                WTRACE("GetOption(KSoTcpKeepAlive)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   750
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   751
                aOption.SetLength(len = sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   752
                if (!getsockopt(Socket(), SOL_SOCKET, SO_KEEPALIVE,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   753
                    (char*)aOption.Ptr(),&len))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   754
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   755
                    aOption.SetLength(len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   756
                    return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   757
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   758
                WTRACE1("getsockopt(SO_KEEPALIVE) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   759
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   760
            case KSoTcpSendBytesPending:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   761
                WTRACE("GetOption(KSoTcpSendBytesPending)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   762
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   763
                aOption.FillZ(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   764
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   765
            // This is a useful one:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   766
            case KSoTcpReadBytesPending:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   767
                WTRACE("GetOption(KSoTcpReadBytesPending)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   768
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   769
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   770
                if (!ioctlsocket(Socket(), FIONREAD, (u_long*)aOption.Ptr()))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   771
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   772
                    WTRACE1("%d bytes in socket",*((TInt*)aOption.Ptr()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   773
                    return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   774
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   775
                WTRACE1("ioctl(FIONREAD) error %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   776
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   777
            case KSoTcpListening:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   778
                WTRACE("GetOption(KSoTcpListening)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   779
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   780
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   781
                *((TInt*)aOption.Ptr()) = (iFlags & EFlagListen) ? 1 : 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   782
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   783
            case KSoTcpNumSockets:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   784
                WTRACE("GetOption(KSoTcpNumSockets)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   785
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   786
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   787
                *((TInt*)aOption.Ptr()) = 1; 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   788
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   789
            default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   790
                WTRACE1("SetOption(KSolInetTcp,%08X) - UNSUPPORTED",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   791
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   792
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   793
        } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   794
            WTRACE1("SetOption(KSolInetTcp,%08X) - not a TCP socket!",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   795
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   796
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   797
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   798
    case KSolInetUdp:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   799
        if (iProtocol->ProtocolDesc()->iProtocol == KProtocolInetUdp) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   800
            switch (aName)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   801
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   802
            case KSoUdpReceiveICMPError:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   803
                WTRACE("SetOption(KSoUdpReceiveICMPError)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   804
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   805
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   806
                *((TInt*)aOption.Ptr()) = iUdpReceiveICMPError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   807
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   808
            case KSoUdpRecvBuf:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   809
                WTRACE("SetOption(KSoUdpRecvBuf)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   810
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   811
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   812
                *((TInt*)aOption.Ptr()) = iUdpRecvBuf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   813
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   814
            case KSoUdpSynchronousSend:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   815
                WTRACE("SetOption(KSoUdpSynchronousSend)");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   816
                if (aOption.MaxLength() < sizeof(TInt)) return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   817
                aOption.SetLength(sizeof(TInt));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   818
                *((TInt*)aOption.Ptr()) = iUdpSynchronousSend;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   819
                return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   820
            default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   821
                WTRACE1("SetOption(KSolInetUdp,%08X) - UNSUPPORTED",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   822
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   823
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   824
        } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   825
            WTRACE1("SetOption(KSolInetUdp,%08X) - not a UDP socket!",aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   826
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   827
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   828
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   829
    default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   830
        WTRACE2("GetOption(%d,%08X) - UNSUPPORTED",aLevel,aName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   831
        break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   832
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   833
    aOption.SetLength(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   834
    return KErrNotSupported;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   835
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   836
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   837
TBool CWinsockServProvider::Connect()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   838
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   839
    if (Socket(iRemAddr.Family()) == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   840
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   841
        WTRACE("can't connect, no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   842
        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   843
        iSocket->Error(KErrCouldNotConnect);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   844
        return EFalse;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   845
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   846
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   847
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   848
        WSockAddr sa;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   849
        int len = ToSockAddr(&sa, &iRemAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   850
        int err = connect(iWinSocket, &sa.Address, len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   851
        if (err)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   852
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   853
            WTRACE1("connect failed, err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   854
            switch (WSAGetLastError())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   855
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   856
            case WSAENETUNREACH:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   857
                iSocket->Error(KErrNetUnreach);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   858
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   859
            case WSAEHOSTUNREACH:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   860
                iSocket->Error(KErrHostUnreach);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   861
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   862
            default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   863
                iSocket->Error(KErrCouldNotConnect);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   864
                break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   865
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   866
            iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   867
            return EFalse;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   868
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   869
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   870
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   871
            iFlags |= EFlagConnect;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   872
            return ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   873
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   874
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   875
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   876
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   877
TInt CWinsockServProvider::Listen(TInt aBacklog)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   878
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   879
    ASSERT(iProtocol->IsStreamProtocol());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   880
    if (Socket() == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   881
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   882
        WTRACE("can't listen, no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   883
        return KErrGeneral;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   884
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   885
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   886
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   887
        int err = listen(iWinSocket, aBacklog);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   888
        if (err)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   889
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   890
            WTRACE1("listen failed, err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   891
            return KErrArgument;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   892
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   893
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   894
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   895
            return KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   896
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   897
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   898
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   899
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   900
// Creates and submits a new request
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   901
CWinsockServProvider::CSelectRequest*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   902
CWinsockServProvider::CreateAndSubmitNewRequestL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   903
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   904
    CSelectRequest* request = CSelectRequest::NewLC(this);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   905
    request->SubmitL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   906
    CleanupStack::Pop(request);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   907
    return request;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   908
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   909
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   910
// Schedules CWriteRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   911
TBool CWinsockServProvider::ScheduleWriteRequest(TInt aDelay)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   912
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   913
    if (!iWrite)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   914
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   915
        iWrite = new CWriteRequest(this);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   916
        if (!iWrite)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   917
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   918
            return EFalse;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   919
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   920
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   921
    iWrite->Submit(aDelay);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   922
    return ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   923
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   924
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   925
// Schedules CNewDataNotifier
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   926
TBool CWinsockServProvider::ScheduleNewDataCheck()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   927
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   928
    if (!iNewData)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   929
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   930
        iNewData = new CNewDataNotifier(this);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   931
        if (!iNewData)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   932
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   933
            return EFalse;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   934
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   935
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   936
    iNewData->Submit();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   937
    return ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   938
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   939
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   940
TInt CWinsockServProvider::Select()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   941
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   942
    TInt err = KErrNone;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   943
    if (!iSelect)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   944
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   945
        TRAP(err,iSelect = CreateAndSubmitNewRequestL());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   946
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   947
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   948
    ASSERT(iSelect || err != KErrNone);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   949
    if (iSelect && !iSelect->IsActive())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   950
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   951
        TRAP(err, iSelect->SubmitL());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   952
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   953
    return err;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   954
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   955
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   956
void CWinsockServProvider::ActiveOpen()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   957
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   958
#ifdef _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   959
    TBuf<KMaxInetAddrBufSize> buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   960
    iRemAddr.OutputWithScope(buf);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   961
    WTRACE2("ActiveOpen(%S,%d)",&buf,iRemAddr.Port());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   962
#endif // _REALLY_DEBUG
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   963
    ASSERT(iProtocol->IsStreamProtocol());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   964
    if (Connect())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   965
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   966
        iSocket->ConnectComplete();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   967
        TInt err = Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   968
        if (err != KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   969
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   970
            iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   971
            iSocket->Error(err);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   972
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   973
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   974
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   975
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   976
void CWinsockServProvider::ActiveOpen(const TDesC8& /*aConnectionData*/)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   977
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   978
    ASSERT(FALSE);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   979
    iSocket->Error(KErrNotSupported);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   980
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   981
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   982
TInt CWinsockServProvider::PassiveOpen(TUint aQueSize)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   983
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   984
    WTRACE1("PassiveOpen(%d)",aQueSize);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   985
    ASSERT(iProtocol->IsStreamProtocol());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   986
    TInt err = Listen(aQueSize);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   987
    if (err == KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   988
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   989
        iFlags |= EFlagListen;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   990
        err = Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   991
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   992
    return err;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   993
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   994
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   995
TInt CWinsockServProvider::PassiveOpen(TUint aQueSize,const TDesC8& /*aData*/)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   996
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   997
    ASSERT(FALSE);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   998
    return PassiveOpen(aQueSize);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   999
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1000
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1001
void CWinsockServProvider::Shutdown(TCloseType anOption)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1002
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1003
    WTRACE1("Shutdown(%08X)",anOption);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1004
    int how;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1005
    switch (anOption)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1006
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1007
    default:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1008
    case EImmediate:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1009
    case ENormal: how = SD_BOTH; break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1010
    case EStopInput: how = SD_RECEIVE; break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1011
    case EStopOutput: how = SD_SEND; break;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1012
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1013
    if (iWinSocket != INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1014
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1015
        shutdown(iWinSocket, how);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1016
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1017
    iFlags |= EFlagShutdown;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1018
    if (!(iFlags & EFlagError) && anOption != EImmediate)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1019
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1020
        // CSocket panics if we call CanClose() after reporting an error.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1021
        // It also gets pretty upset if we call CanClose() from Shutdown
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1022
        // call with EImmediate parameter.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1023
        iSocket->CanClose();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1024
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1025
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1026
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1027
void CWinsockServProvider::Shutdown(TCloseType anOption,const TDesC8& /*aData*/)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1028
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1029
    Shutdown(anOption);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1030
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1031
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1032
void CWinsockServProvider::AutoBind()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1033
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1034
    if (Socket() == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1035
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1036
        WTRACE("AutoBind - no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1037
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1038
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1039
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1040
        WTRACE("AutoBind");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1041
        TInetAddr bindAddr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1042
        bindAddr.Init(Family());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1043
        WSockAddr sa;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1044
        int len = WinsockUtils::ToSockAddr(&sa, &bindAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1045
        int err = bind(iWinSocket, &sa.Address, len);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1046
        if (err)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1047
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1048
            WTRACE1("bind failed, err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1049
            iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1050
            iSocket->Error(err);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1051
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1052
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1053
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1054
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1055
// The reason for not writing the data immediately is that socket server
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1056
// is processing both read and write requests on the same thread. If we
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1057
// are writing data faster than we are reading them, eventually send
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1058
// will block forever. We try to give the reader a chance.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1059
void CWinsockServProvider::DoWrite()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1060
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1061
    if (!iWriteQ.IsEmpty())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1062
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1063
        ASSERT(iWinSocket != INVALID_SOCKET);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1064
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1065
        // Check if the socket is writable
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1066
        TBool canWrite = ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1067
        fd_set writefs;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1068
        FD_ZERO(&writefs);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1069
        FD_SET(iWinSocket,&writefs);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1070
        struct timeval tv;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1071
        tv.tv_sec = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1072
        tv.tv_usec = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1073
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1074
        BEGIN_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1075
        int nfd = select(iWinSocket+1, NULL, &writefs, NULL, &tv);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1076
        END_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1077
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1078
        if (nfd == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1079
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1080
            WTRACE1("select err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1081
            iSocket->Error(KErrWrite);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1082
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1083
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1084
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1085
            if (FD_ISSET(iWinSocket,&writefs))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1086
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1087
                // Send exactly one block of data
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1088
                CWriteData* data = iWriteQ.First();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1089
                data->iLink.Deque();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1090
                TUint nBytes = SendNow(*data->iData, data->iAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1091
                if (nBytes)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1092
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1093
                    WTRACE1("sent %d bytes",nBytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1094
                    iProtocol->DataSent(nBytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1095
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1096
                delete data;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1097
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1098
                // Have more data to send?
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1099
                if (!iWriteQ.IsEmpty())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1100
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1101
                    ScheduleWriteRequest(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1102
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1103
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1104
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1105
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1106
                // Delay the retry to ease the CPU load and give the
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1107
                // reader a chance to catch up
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1108
                WTRACE("socket is not writable, waiting...");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1109
                ScheduleWriteRequest(500000);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1110
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1111
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1112
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1113
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1114
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1115
TUint CWinsockServProvider::SendLater(const TDesC8& aData, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1116
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1117
    CWriteData* data = CWriteData::New(aData, aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1118
    if (data)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1119
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1120
        iWriteQ.AddLast(*data);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1121
        ScheduleWriteRequest(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1122
        return aData.Length();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1123
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1124
    return 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1125
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1126
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1127
TUint CWinsockServProvider::SendNow(const TDesC8& aData, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1128
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1129
    int nbytes;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1130
    const char * buf = (char*)aData.Ptr();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1131
    int len = aData.Length();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1132
    if (iFlags & EFlagConnect)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1133
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1134
        BEGIN_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1135
        nbytes = send(iWinSocket, buf, len, 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1136
        END_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1137
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1138
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1139
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1140
        ASSERT(aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1141
        WSockAddr to;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1142
        int tolen = WinsockUtils::ToSockAddr(&to, aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1143
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1144
        BEGIN_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1145
        nbytes = sendto(Socket(aAddr->Family()),buf,len,0,&to.Address,tolen);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1146
        END_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1147
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1148
        if (nbytes < len) nbytes = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1149
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1150
    if (nbytes == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1151
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1152
        WTRACE1("send failed, err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1153
        iSocket->Error(KErrWrite);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1154
        return 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1155
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1156
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1157
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1158
        if (nbytes < len)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1159
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1160
            iSocket->Error(KErrWrite);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1161
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1162
        return nbytes;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1163
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1164
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1165
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1166
TUint CWinsockServProvider::Write(const TDesC8& aData, TUint, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1167
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1168
    if (Socket() == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1169
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1170
        WTRACE("Write - no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1171
        iSocket->Error(KErrWrite);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1172
        return 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1173
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1174
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1175
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1176
        WTRACE1("sending %d bytes",aData.Length());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1177
        if (!iWriteQ.IsEmpty() || iProtocol->ReadPending())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1178
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1179
            // If have asynchronous writes pending, we have to send this
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1180
            // chunk of data asynchronously too, otherwise the order of
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1181
            // chunks will change. If there's any unread data in one of
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1182
            // the sockets, we also want to be asynchronous to avoid
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1183
            // starving the reading thread, which can result in filling
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1184
            // up TCP buffer, blocking socket server thread and finally
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1185
            // deadlock.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1186
            return SendLater(aData, aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1187
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1188
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1189
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1190
            // No read or writes pending, send it now.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1191
            return SendNow(aData, aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1192
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1193
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1194
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1195
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1196
#ifdef V1_5_PRT_INTERFACE
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1197
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1198
TInt CWinsockServProvider::Receive(TDes8& aData, TUint aOpt, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1199
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1200
    ASSERT(aData.Length() > 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1201
    ASSERT(!(iFlags & (EFlagEndOfData | EFlagShutdown)));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1202
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1203
    WSockAddr from;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1204
    int maxbytes = Min(aData.Length(), iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1205
    char* buf = (char*)&aData[0];
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1206
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1207
    int retval;     // Return value from recv or recvfrom
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1208
    int nbytes;     // How much is actually in the buffer
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1209
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1210
    ASSERT(!(aOpt & KIpHeaderIncluded));        // Option is not implemented
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1211
    // ASSERT(!(aOpt & KSockReadContinuation)); // ignore, does not affect operation
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1212
    int opt = ((aOpt & KSockReadPeek) ? MSG_PEEK : 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1213
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1214
    if (aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1215
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1216
        int fromlen = SOCKADDR_SIZE;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1217
        retval = recvfrom(Socket(), buf, maxbytes, opt, (struct sockaddr*)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1218
            &from, &fromlen);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1219
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1220
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1221
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1222
        // No address information is required, probably a TCP socket
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1223
        retval = recv(Socket(), buf, maxbytes, opt);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1224
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1225
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1226
    if (retval == SOCKET_ERROR && WSAGetLastError() == WSAEMSGSIZE)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1227
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1228
        ASSERT( EFalse ); // should not happen anymore; whole datagram is read
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1229
        WTRACE1("datagram truncated to %d bytes",maxbytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1230
        nbytes = maxbytes;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1231
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1232
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1233
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1234
        nbytes = retval;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1235
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1236
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1237
    if (nbytes == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1238
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1239
        WTRACE1("recv err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1240
        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1241
        aData.SetLength(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1242
        retval = (iProtocol->IsStreamProtocol()) ? KErrDisconnected : KErrGeneral;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1243
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1244
    else if (retval == 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1245
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1246
        // the connection has been gracefully closed
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1247
        iFlags |= EFlagEndOfData;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1248
        aData.SetLength(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1249
        WTRACE("end of data");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1250
        ScheduleNewDataCheck();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1251
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1252
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1253
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1254
        if (aAddr) WinsockUtils::ToInetAddr(aAddr, &from);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1255
        aData.SetLength(nbytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1256
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1257
        if (iProtocol->IsStreamProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1258
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1259
            ASSERT(iDataAvailable >= nbytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1260
            iDataAvailable -= nbytes;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1261
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1262
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1263
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1264
            // In case of UDP we always indicate no more than one datagram.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1265
            // After socket server has called our GetData function, it thinks
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1266
            // that it has received the only available datagram and that we
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1267
            // no longer have any data in the receive queue. We need
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1268
            // to reset iDataAvailable to zero and start from scratch.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1269
            iDataAvailable = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1270
            
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1271
            retval = 1; // indicate, that one datagram was read
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1272
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1273
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1274
        if (iDataAvailable <= 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1275
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1276
            // Find out how much data still left
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1277
            TUint32 size = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1278
            int err = ioctlsocket(iWinSocket, FIONREAD, &size);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1279
            iProtocol->SetReadPending(this, !err && (size > 0));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1280
            if (err == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1281
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1282
                WTRACE1("ioctl(FIONREAD) err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1283
                iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1284
                retval = KErrGeneral;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1285
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1286
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1287
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1288
                TInt bytesInSocket = size;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1289
                WTRACE2("%d bytes in socket, %d bytes unread",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1290
                    bytesInSocket, iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1291
                if (bytesInSocket > iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1292
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1293
                    // iSocket->NewData is not reentrant. If we call it from
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1294
                    // here, it will get into an infinite loop
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1295
                    WTRACE("scheduling new data check");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1296
                    ScheduleNewDataCheck();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1297
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1298
                else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1299
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1300
                    // Re-submit the select request
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1301
                    TInt err = Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1302
                    if (err != KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1303
                    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1304
                        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1305
                        retval = KErrGeneral;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1306
                    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1307
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1308
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1309
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1310
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1311
    return retval; // error-code, nbytes (if stream) or 1 (if dgram)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1312
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1313
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1314
TInt CWinsockServProvider::GetData(RMBufChain& aData, TUint aLength,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1315
                                   TUint aOptions, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1316
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1317
    if (!iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1318
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1319
        // This should only happen for datagram protocols
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1320
        WTRACE1("%d bytes requested, nothing is available",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1321
               aLength & ~KGetDataWholeDatagram);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1322
        ASSERT(iProtocol->IsDatagramProtocol());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1323
        return KErrNotReady;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1324
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1325
    else if (Socket() == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1326
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1327
        WTRACE("GetData - no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1328
        return KErrGeneral;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1329
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1330
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1331
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1332
        WTRACE2("%d bytes requested, %d bytes unread", 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1333
               (aLength & ~KGetDataWholeDatagram), iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1334
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1335
        if (aLength & KGetDataWholeDatagram)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1336
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1337
            // we're asked to read the whole dgram, even if client wants less
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1338
            aLength &= ~KGetDataWholeDatagram;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1339
            aLength = Max(aLength, iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1340
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1341
        
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1342
        // alloc buffer
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1343
        TInt extraNeeded = aLength - aData.Length();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1344
        if (extraNeeded > 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1345
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1346
            TRAPD(err, aData.AppendL(extraNeeded));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1347
            if (err != KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1348
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1349
                return KErrNoMBufs;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1350
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1351
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1352
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1353
        // the new GetData-inteface with RMBufChain-param (i.e. v1.5 PRT inter-
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1354
        // face) is somewhat problematic from Winsock's point of view.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1355
        // RMBufChain is essentially a linked list of buffers. But especially
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1356
        // when UDP-datagram bigger than the a single buffer is being read,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1357
        // the windows-socket recvfrom-operation has to be done in a single
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1358
        // operation - otherwise datagram gets truncated.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1359
        // Therefore we have to have a local buffer where to read the data - 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1360
        // and then copy it into RMBufChain.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1361
        //
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1362
        // reference: \src\common\generic\comms-infras\documentation\
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1363
        // Comms Framework Migration Guide for NIFs and v1.5 PRTs.doc
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1364
        //
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1365
        // The code below is more or less copied from 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1366
        // \src\common\generic\comms-infras\esock\ssock\SS_PROT.CPP
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1367
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1368
        if(!iDataBuf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1369
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1370
            iDataBuf = HBufC8::New(aLength);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1371
            if(!iDataBuf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1372
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1373
                return KErrNoMemory;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1374
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1375
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1376
        else if(iDataBuf->Size() < TInt(aLength))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1377
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1378
            // We need extra room for data. As ReAlloc returns NULL if fails, 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1379
            // we need to temporary save the previous storage in order to 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1380
            // clear it in the case of ReAlloc failure.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1381
            HBufC8* aTempPtr = iDataBuf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1382
            iDataBuf = iDataBuf->ReAlloc(aLength);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1383
            if(!iDataBuf)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1384
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1385
                delete aTempPtr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1386
                return KErrNoMemory;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1387
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1388
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1389
        TPtr8 des = iDataBuf->Des();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1390
        des.SetLength(aLength);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1391
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1392
        TInt retval = Receive( des, aOptions, aAddr );
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1393
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1394
        TInt bytesReceived = des.Length();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1395
        aData.CopyIn(des);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1396
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1397
        if(des.Length() < TInt(aLength))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1398
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1399
            aData.TrimEnd(des.Length());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1400
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1401
        WTRACE2("received %d bytes, %d bytes left", bytesReceived, iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1402
        if (bytesReceived > 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1403
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1404
            iProtocol->DataReceived(bytesReceived);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1405
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1406
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1407
        return retval;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1408
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1409
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1410
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1411
#else // PRT v1.0 interface
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1412
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1413
void CWinsockServProvider::Receive(TDes8& aDesc, TUint aOpt, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1414
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1415
    ASSERT(aDesc.Length() > 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1416
    ASSERT(!(iFlags & (EFlagEndOfData | EFlagShutdown)));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1417
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1418
    WSockAddr from;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1419
    int maxbytes = Min(aDesc.Length(), iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1420
    char* buf = (char*)&aDesc[0];
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1421
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1422
    int retval;     // Return value from recv or recvfrom
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1423
    int nbytes;     // How much is actually in the buffer
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1424
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1425
    ASSERT(!(aOpt & KIpHeaderIncluded));            // Option is not implemented
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1426
    ASSERT(!(aOpt & KSockReadContinuation));        // Option is not implemented
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1427
    int opt = ((aOpt & KSockReadPeek) ? MSG_PEEK : 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1428
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1429
    if (aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1430
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1431
        int fromlen = SOCKADDR_SIZE;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1432
        retval = recvfrom(Socket(), buf, maxbytes, opt, (struct sockaddr*)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1433
            &from, &fromlen);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1434
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1435
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1436
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1437
        // No address information is required, probably a TCP socket
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1438
        retval = recv(Socket(), buf, maxbytes, opt);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1439
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1440
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1441
    // How to handle truncated datagrams?
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1442
    if (retval == SOCKET_ERROR && WSAGetLastError() == WSAEMSGSIZE)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1443
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1444
        WTRACE1("datagram truncated to %d bytes",maxbytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1445
        nbytes = maxbytes;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1446
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1447
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1448
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1449
        nbytes = retval;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1450
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1451
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1452
    if (nbytes == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1453
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1454
        WTRACE1("recv err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1455
        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1456
        aDesc.SetLength(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1457
        if (iProtocol->IsStreamProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1458
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1459
            iSocket->Error(KErrDisconnected);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1460
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1461
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1462
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1463
            iSocket->Error(KErrGeneral);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1464
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1465
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1466
    else if (retval == 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1467
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1468
        // the connection has been gracefully closed
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1469
        iFlags |= EFlagEndOfData;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1470
        aDesc.SetLength(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1471
        WTRACE("end of data");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1472
        ScheduleNewDataCheck();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1473
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1474
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1475
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1476
        if (aAddr) WinsockUtils::ToInetAddr(aAddr, &from);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1477
        aDesc.SetLength(nbytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1478
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1479
        if (iProtocol->IsStreamProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1480
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1481
            ASSERT(iDataAvailable >= nbytes);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1482
            iDataAvailable -= nbytes;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1483
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1484
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1485
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1486
            // In case of UDP we always indicate no more than one datagram.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1487
            // After socket server has called our GetData function, it thinks
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1488
            // that it has received the only available datagram and that we
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1489
            // no longer have any data in the receive queue. Also, datagram
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1490
            // may have been truncated and in that case we don't really know
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1491
            // how much data are still sitting in the receive queue. We need
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1492
            // to reset iDataAvailable to zero and start from scratch.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1493
            iDataAvailable = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1494
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1495
        if (iDataAvailable <= 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1496
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1497
            // Find out how much data still left
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1498
            TUint32 size = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1499
            int err = ioctlsocket(iWinSocket, FIONREAD, &size);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1500
            iProtocol->SetReadPending(this, !err && (size > 0));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1501
            if (err == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1502
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1503
                WTRACE1("ioctl(FIONREAD) err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1504
                iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1505
                iSocket->Error(KErrGeneral);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1506
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1507
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1508
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1509
                TInt bytesInSocket = size;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1510
                WTRACE2("%d bytes in socket, %d bytes unread",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1511
                    bytesInSocket, iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1512
                if (bytesInSocket > iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1513
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1514
                    // iSocket->NewData is not reentrant. If we call it from
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1515
                    // here, it will get into an infinite loop
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1516
                    WTRACE("scheduling new data check");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1517
                    ScheduleNewDataCheck();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1518
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1519
                else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1520
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1521
                    // Re-submit the select request
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1522
                    TInt err = Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1523
                    if (err != KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1524
                    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1525
                        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1526
                        iSocket->Error(KErrGeneral);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1527
                    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1528
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1529
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1530
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1531
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1532
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1533
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1534
void CWinsockServProvider::GetData(TDes8& aDesc, TUint aOptions, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1535
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1536
    if (Socket() == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1537
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1538
        WTRACE("GetData - no socket");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1539
        iSocket->Error(KErrGeneral);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1540
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1541
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1542
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1543
        WTRACE2("%d bytes requested, %d bytes unread",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1544
               aDesc.Length(),iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1545
        if (!iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1546
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1547
            aDesc.SetLength(0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1548
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1549
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1550
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1551
            Receive(aDesc, aOptions, aAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1552
            TInt bytesReceived = aDesc.Length();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1553
            WTRACE2("received %d bytes, %d bytes left",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1554
                   bytesReceived, iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1555
            if (bytesReceived > 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1556
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1557
                iProtocol->DataReceived(bytesReceived);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1558
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1559
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1560
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1561
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1562
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1563
TInt CWinsockServProvider::GetData(RMBufChain& aData, TUint aLength,
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1564
                                   TUint aOptions, TSockAddr* anAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1565
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1566
    if (!iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1567
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1568
        // This should only happen for datagram protocols
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1569
        WTRACE1("%d bytes requested, nothing is available",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1570
               aLength & ~KGetDataWholeDatagram);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1571
        ASSERT(iProtocol->IsDatagramProtocol());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1572
        return KErrNotReady;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1573
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1574
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1575
    // The base class never returns an error
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1576
    TInt ret = SUPER::GetData(aData, aLength, aOptions, anAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1577
    if (iFlags & EFlagError)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1578
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1579
        if (iProtocol->IsDatagramProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1580
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1581
            return KErrGeneral;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1582
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1583
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1584
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1585
            return KErrDisconnected;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1586
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1587
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1588
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1589
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1590
        return ret;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1591
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1592
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1593
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1594
#endif // V1_5_PRT_INTERFACE
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1595
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1596
// upcall from CSelectRequest invoked in the context of the thread
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1597
// submitted the request
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1598
void CWinsockServProvider::SelectComplete(TInt aMask)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1599
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1600
    if (aMask & ESelectError)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1601
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1602
        if (!(iFlags & EFlagError))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1603
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1604
            iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1605
            iSocket->Error(KErrDisconnected);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1606
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1607
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1608
    else if (!(iFlags & EFlagError) && (aMask & ESelectRead))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1609
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1610
        if (iFlags & EFlagListen)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1611
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1612
            // Accept new connection
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1613
            WSockAddr addr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1614
            int addrlen = SOCKADDR_SIZE;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1615
            SOCKET sock = accept(iWinSocket,&addr.Address,&addrlen);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1616
            if (sock == INVALID_SOCKET)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1617
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1618
                // ignore this error
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1619
                WTRACE1("accept failed, err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1620
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1621
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1622
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1623
                WTRACE("accepted incoming connection");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1624
                CWinsockServProvider* newSock = CWinsockServProvider::
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1625
                    FromSocket(iProtocol, sock, iFamily);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1626
                if (newSock)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1627
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1628
                    iSocket->ConnectComplete(*newSock);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1629
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1630
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1631
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1632
            // Re-submit the request
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1633
            TInt err = Select();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1634
            if (err != KErrNone)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1635
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1636
                iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1637
                iSocket->Error(KErrCouldNotConnect);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1638
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1639
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1640
        else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1641
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1642
            NewDataCheck();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1643
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1644
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1645
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1646
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1647
// Upcall from CNewDataNotifier. Also invoked from SelectComplete
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1648
void CWinsockServProvider::NewDataCheck()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1649
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1650
    if (iFlags & EFlagShutdown)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1651
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1652
        return;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1653
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1654
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1655
    if (iFlags & EFlagEndOfData)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1656
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1657
        if (!(iFlags & EFlagDisconnected))
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1658
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1659
            WTRACE("indicating end of data");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1660
            iSocket->NewData(KNewDataEndofData);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1661
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1662
        return;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1663
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1664
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1665
    TUint32 size = 0;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1666
    ASSERT(iWinSocket != INVALID_SOCKET);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1667
    int err = ioctlsocket(iWinSocket, FIONREAD, &size);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1668
    iProtocol->SetReadPending(this, !err && (size > 0));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1669
    if (err == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1670
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1671
        WTRACE1("ioctl(FIONREAD) err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1672
        iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1673
        iSocket->Error(KErrGeneral);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1674
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1675
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1676
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1677
        TInt bytesInSocket = size;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1678
        WTRACE2("%d bytes in socket, %d bytes unread",
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1679
            bytesInSocket, iDataAvailable);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1680
        if (bytesInSocket > iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1681
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1682
            // Report more data
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1683
            TInt newData = bytesInSocket - iDataAvailable;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1684
            iDataAvailable = bytesInSocket;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1685
            if (iProtocol->IsStreamProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1686
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1687
                WTRACE1("indicating %d bytes",newData);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1688
                iSocket->NewData(newData);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1689
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1690
            else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1691
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1692
                WTRACE("indicating (at least) 1 datagram");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1693
                iSocket->NewData(1);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1694
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1695
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1696
        else if (iProtocol->IsStreamProtocol())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1697
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1698
            // For connection-oriented sockets, readability may indicate that
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1699
            // a request to close the socket has been received from the peer.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1700
            // If the connection was closed gracefully, and all data was
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1701
            // received, then a recv will return immediately with zero bytes
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1702
            // read. If the connection was reset, then a recv will complete
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1703
            // immediately with an error code
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1704
            if (!bytesInSocket && !iDataAvailable)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1705
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1706
                BEGIN_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1707
                char buf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1708
                int ret = recv(iWinSocket, &buf, 1, 0);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1709
                END_WIN32();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1710
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1711
                if (ret == 0)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1712
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1713
                    iFlags |= EFlagEndOfData;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1714
                    WTRACE("end of data, I guess");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1715
                    iSocket->NewData(KNewDataEndofData);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1716
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1717
                else if (ret == SOCKET_ERROR)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1718
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1719
                    WTRACE1("recv err %d",WSAGetLastError());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1720
                    iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1721
                    iSocket->Error(KErrDisconnected);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1722
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1723
                else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1724
                {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1725
                    // This means that we were wrong about the connection
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1726
                    // being either reset or close. Too bad...
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1727
                    WTRACE("oops... didn't expect any data");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1728
                    ASSERT(FALSE);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1729
                    iFlags |= EFlagError;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1730
                    iSocket->Error(KErrGeneral);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1731
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1732
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1733
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1734
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1735
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1736
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1737
// CWinsockServProvider::CSelectRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1738
CWinsockServProvider::CSelectRequest*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1739
CWinsockServProvider::CSelectRequest::NewLC(CWinsockServProvider* aProvider)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1740
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1741
    CSelectRequest* self = new(ELeave)CSelectRequest(aProvider);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1742
    CleanupStack::PushL(self);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1743
    self->ConstructL();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1744
    return self;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1745
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1746
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1747
CWinsockServProvider::CSelectRequest::CSelectRequest(CWinsockServProvider* aP) :
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1748
CActive(EPriorityStandard), iProvider(aP)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1749
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1750
    CActiveScheduler::Add(this);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1751
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1752
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1753
CWinsockServProvider::CSelectRequest::~CSelectRequest()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1754
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1755
    iServerThread.Close();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1756
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1757
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1758
void CWinsockServProvider::CSelectRequest::ConstructL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1759
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1760
    LEAVE_IF_ERROR(iServerThread.Open(RThread().Id()));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1761
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1762
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1763
void CWinsockServProvider::CSelectRequest::SubmitL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1764
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1765
    if (!IsActive())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1766
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1767
        iStatus = KRequestPending;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1768
        SetActive();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1769
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1770
    LEAVE_IF_ERROR(CWinsockSelectThread::StaticL().Submit(this));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1771
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1772
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1773
TUint CWinsockServProvider::CSelectRequest::Socket()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1774
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1775
    ASSERT(iProvider->iWinSocket != INVALID_SOCKET);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1776
    return iProvider->iWinSocket;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1777
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1778
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1779
TInt CWinsockServProvider::CSelectRequest::SelectMask()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1780
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1781
    return (ESelectRead|ESelectError);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1782
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1783
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1784
void CWinsockServProvider::CSelectRequest::SelectComplete(TInt aSelectMask)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1785
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1786
    iSelectMask = aSelectMask;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1787
    TRequestStatus *status = (&iStatus);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1788
    iServerThread.RequestComplete(status, KErrNone);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1789
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1790
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1791
void CWinsockServProvider::CSelectRequest::DoCancel()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1792
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1793
    TRequestStatus *status = (&iStatus);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1794
    User::RequestComplete(status, KErrCancel);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1795
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1796
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1797
void CWinsockServProvider::CSelectRequest::RunL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1798
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1799
    iProvider->SelectComplete(iSelectMask);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1800
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1801
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1802
// CWinsockServProvider::CWriteData
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1803
CWinsockServProvider::CWriteData*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1804
CWinsockServProvider::CWriteData::New(const TDesC8& aData, TSockAddr* aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1805
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1806
    CWriteData* data = new(CWriteData);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1807
    if (data)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1808
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1809
        data->iData = aData.Alloc();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1810
        if (data->iData)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1811
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1812
            if (aAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1813
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1814
                data->iAddr = new(TSockAddr);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1815
                if (data->iAddr) (*data->iAddr) = *aAddr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1816
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1817
            if (!aAddr || data->iAddr)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1818
            {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1819
                return data;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1820
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1821
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1822
        delete data;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1823
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1824
    return NULL;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1825
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1826
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1827
CWinsockServProvider::CWriteData::~CWriteData()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1828
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1829
    delete iAddr;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1830
    delete iData;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1831
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1832
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1833
// CWinsockServProvider::CWriteRequest
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1834
CWinsockServProvider::CWriteRequest::CWriteRequest(CWinsockServProvider* aP) :
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1835
CActive(EPriorityStandard), iProvider(aP)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1836
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1837
    CActiveScheduler::Add(this);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1838
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1839
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1840
CWinsockServProvider::CWriteRequest::~CWriteRequest()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1841
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1842
    Cancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1843
    if (iTimerCreated)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1844
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1845
        iTimer.Close();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1846
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1847
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1848
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1849
void CWinsockServProvider::CWriteRequest::Submit(TInt aDelay)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1850
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1851
    if (aDelay)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1852
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1853
        if (!iTimerCreated)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1854
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1855
            // Create timer first time we need a delay
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1856
            TInt err = iTimer.CreateLocal();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1857
            if (err == KErrNone) iTimerCreated = ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1858
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1859
        if (iTimerCreated)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1860
        {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1861
            Cancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1862
            SetActive();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1863
            iTimer.After(iStatus, aDelay);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1864
            iTimerActive = ETrue;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1865
            return;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1866
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1867
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1868
    if (!IsActive())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1869
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1870
        // Complete request immediately
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1871
        SetActive();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1872
        TRequestStatus *status = (&iStatus);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1873
        User::RequestComplete(status, KErrCancel);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1874
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1875
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1876
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1877
void CWinsockServProvider::CWriteRequest::DoCancel()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1878
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1879
    TRequestStatus *status = (&iStatus);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1880
    if (iTimerActive)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1881
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1882
        iTimerActive = EFalse;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1883
        iTimer.Cancel();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1884
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1885
    else
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1886
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1887
        User::RequestComplete(status, KErrCancel);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1888
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1889
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1890
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1891
void CWinsockServProvider::CWriteRequest::RunL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1892
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1893
    iTimerActive = EFalse;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1894
    iProvider->DoWrite();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1895
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1896
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1897
// CWinsockServProvider::CNewDataNotifier
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1898
CWinsockServProvider::CNewDataNotifier::CNewDataNotifier(CWinsockServProvider* aP) :
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1899
CActive(EPriorityStandard), iProvider(aP)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1900
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1901
    CActiveScheduler::Add(this);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1902
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1903
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1904
void CWinsockServProvider::CNewDataNotifier::Submit()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1905
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1906
    if (!IsActive())
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1907
    {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1908
        SetActive();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1909
        TRequestStatus *status = (&iStatus);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1910
        User::RequestComplete(status, KErrCancel);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1911
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1912
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1913
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1914
void CWinsockServProvider::CNewDataNotifier::DoCancel()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1915
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1916
    TRequestStatus *status = (&iStatus);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1917
    User::RequestComplete(status, KErrCancel);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1918
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1919
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1920
void CWinsockServProvider::CNewDataNotifier::RunL()
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1921
{
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1922
    iProvider->NewDataCheck();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1923
}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1924
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1925
/**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1926
 * Local Variables:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1927
 * c-basic-offset: 4
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1928
 * indent-tabs-mode: nil
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1929
 * End:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
  1930
 */