usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmdatareceiver.cpp
author hgs
Wed, 07 Jul 2010 14:16:40 +0800
changeset 28 f1fd07aa74c9
permissions -rw-r--r--
201025_08
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     1
/*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     3
* All rights reserved.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     8
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     9
* Initial Contributors:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    11
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    12
* Contributors:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    13
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    14
* Description:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    15
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    16
*/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    17
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    18
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    19
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    20
#ifndef __OVER_DUMMYUSBSCLDD__
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    21
#include <e32base.h>
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    22
#include <d32usbc.h>//EEndPoint2
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    23
#else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    24
#include <dummyusbsclddapi.h>
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    25
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    26
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    27
#include "ncmdatareceiver.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    28
#include "ncmdatainterface.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    29
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    30
#include "OstTraceDefinitions.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    31
#ifdef OST_TRACE_COMPILER_IN_USE
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    32
#include "ncmdatareceiverTraces.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    33
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    34
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    35
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    36
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    37
#ifdef _DEBUG
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    38
_LIT(KDataReceiverPanic, "DataRcvrPanic");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    39
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    40
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    41
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    42
@file
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    43
@internalComponent
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    44
*/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    45
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    46
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    47
 * Constructor
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    48
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    49
CNcmDataReceiver::CNcmDataReceiver(RDevUsbcScClient& aPort, CNcmDataInterface& aParent) :
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    50
                                            CActive(CActive::EPriorityStandard),
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    51
                                            iPort(aPort),
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    52
                                            iParent(aParent)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    53
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    54
    CActiveScheduler::Add(this);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    55
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    56
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    57
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    58
 * NewL to create object.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    59
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    60
CNcmDataReceiver* CNcmDataReceiver::NewL(RDevUsbcScClient& aPort, CNcmDataInterface& aParent)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    61
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    62
    OstTraceFunctionEntry0(CNCMDATARECEIVER_NEWL);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    63
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    64
    CNcmDataReceiver* self = new(ELeave) CNcmDataReceiver(aPort, aParent);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    65
    CleanupStack::PushL(self);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    66
    self->ConstructL();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    67
    CleanupStack::Pop(self);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    68
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    69
    OstTraceFunctionExit1(CNCMDATARECEIVER_NEWL_DUP01, self);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    70
    return self;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    71
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    72
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    73
void CNcmDataReceiver::ConstructL()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    74
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    75
    iNtbParser = CNcmNtb16Parser::NewL(*this);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    76
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    77
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    78
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    79
 * Destructor
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    80
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    81
CNcmDataReceiver::~CNcmDataReceiver()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    82
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    83
    OstTraceFunctionEntry0(CNCMDATARECEIVER_CNCMDATARECEIVER_DUP01);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    84
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    85
    Cancel();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    86
    delete iNtbParser;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    87
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    88
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    89
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    90
 * Start to receive and parse the USB data.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    91
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    92
void CNcmDataReceiver::Start()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    93
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    94
    OstTraceFunctionEntry0(CNCMDATARECEIVER_START);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    95
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    96
    TInt ret = iPort.OpenEndpoint(iEpIn, EEndpoint2);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    97
    if (KErrNone != ret)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    98
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    99
        OstTrace1(TRACE_ERROR, CNCMDATARECEIVER_START_DUP01, "OpenEndpoint error=%d", ret);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   100
        iParent.DataError(ret);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   101
        OstTraceFunctionExit0(CNCMDATARECEIVER_START_DUP02);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   102
        return;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   103
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   104
    ReadData();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   105
    OstTraceFunctionExit0(CNCMDATARECEIVER_START_DUP03);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   106
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   107
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   108
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   109
 * Read the data packet from NCM host
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   110
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   111
void CNcmDataReceiver::ReadData()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   112
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   113
    OstTraceFunctionEntry0(CNCMDATARECEIVER_READDATA);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   114
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   115
    const TInt KRetryCount = 3;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   116
    TInt ret = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   117
    TInt errCnt = KRetryCount;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   118
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   119
    while(errCnt)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   120
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   121
        ret = iEpIn.TakeBuffer(reinterpret_cast<TAny*&>(iBuf), iBufLen, iZlp, iStatus);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   122
        if (KErrCompletion == ret)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   123
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   124
            errCnt = KRetryCount;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   125
            if (iBufLen > 0)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   126
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   127
                OstTraceExt3(TRACE_NORMAL, CNCMDATARECEIVER_READDATA_DUP02, "iBuf=%x, iBufLen=%d, iZlp=%d", (TInt)iBuf, iBufLen, iZlp);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   128
                ret = iNtbParser->Parse(iBuf, iBufLen, iZlp);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   129
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   130
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   131
        else if (KErrNone == ret || KErrEof == ret)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   132
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   133
            break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   134
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   135
        else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   136
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   137
            OstTrace1(TRACE_ERROR, CNCMDATARECEIVER_READDATA_DUP03, "TakeBuffer error=%d", ret);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   138
            errCnt --;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   139
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   140
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   141
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   142
    if (KErrNone == ret)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   143
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   144
        SetActive();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   145
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   146
    else if (KErrEof != ret)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   147
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   148
        iParent.DataError(ret);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   149
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   150
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   151
    OstTraceFunctionExit0(CNCMDATARECEIVER_READDATA_DUP01);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   152
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   153
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   154
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   155
 * Expire the Share Chunk LDD's buffer (see above TakeBuffer)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   156
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   157
void CNcmDataReceiver::ExpireBuffer(TAny* aBuf)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   158
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   159
    TInt ret = iEpIn.Expire(aBuf);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   160
    __ASSERT_DEBUG(KErrNone==ret, User::Panic(KDataReceiverPanic, __LINE__));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   161
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   162
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   163
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   164
 * Deliver the received packet data to upper link
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   165
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   166
void CNcmDataReceiver::ProcessEtherFrame(RMBufPacket& aPacket)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   167
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   168
    iParent.ProcessDatagram(aPacket);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   169
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   170
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   171
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   172
 * RunL, a state machine to read the NCM packet data from NCM host
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   173
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   174
void CNcmDataReceiver::RunL()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   175
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   176
    if(KErrNone == iStatus.Int())
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   177
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   178
        ReadData();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   179
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   180
    else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   181
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   182
        OstTrace1(TRACE_ERROR, CNCMDATARECEIVER_RUNL, "iStatus.Int()=%d", iStatus.Int());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   183
        iParent.DataError(iStatus.Int());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   184
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   185
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   186
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   187
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   188
 * Cancel the outgoing read request
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   189
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   190
void CNcmDataReceiver::DoCancel()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   191
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   192
    OstTraceFunctionEntry0(CNCMDATARECEIVER_DOCANCEL);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   193
    iPort.ReadCancel(iEpIn.BufferNumber());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   194
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   195
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   196
void CNcmDataReceiver::Stop()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   197
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   198
    OstTraceFunctionEntry0(CNCMDATARECEIVER_STOP);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   199
    Cancel();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   200
    iNtbParser->Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   201
    TInt ret = iEpIn.Close();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   202
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   203
    OstTraceFunctionExit0(CNCMDATARECEIVER_STOP_DUP01);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   204
    }