www.pudn.com > sockets.rar > socketsreader.cpp


/* Copyright (c) 2004, Nokia. All rights reserved */ 
 
 
// INCLUDE FILES 
#include "Sockets.pan" 
#include "SocketsReader.h" 
#include "EngineNotifier.h" 
 
 
// ========================= MEMBER FUNCTIONS ================================== 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::NewL() 
// Two-phased constructor. 
// ----------------------------------------------------------------------------- 
// 
CSocketsReader* CSocketsReader::NewL( MEngineNotifier& aEngineNotifier, 
                                      RSocket& aSocket ) 
    { 
    CSocketsReader* self = CSocketsReader::NewLC( aEngineNotifier, 
                                                  aSocket ); 
    CleanupStack::Pop( self ); 
    return self; 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::NewLC() 
// Two-phased constructor. 
// ----------------------------------------------------------------------------- 
// 
CSocketsReader* CSocketsReader::NewLC( MEngineNotifier& aEngineNotifier, 
                                       RSocket& aSocket ) 
    { 
    CSocketsReader* self = new ( ELeave ) CSocketsReader( aEngineNotifier, 
                                                          aSocket ); 
    CleanupStack::PushL( self ); 
    self->ConstructL(); 
    return self; 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::CSocketsReader() 
// C++ default constructor can NOT contain any code, that might leave. 
// ----------------------------------------------------------------------------- 
// 
CSocketsReader::CSocketsReader( MEngineNotifier& aEngineNotifier, 
                                RSocket& aSocket ) 
: CActive( EPriorityStandard ), 
  iSocket( aSocket ), 
  iEngineNotifier( aEngineNotifier ) 
    { 
    // No implementation required 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::ConstructL() 
// Symbian 2nd phase constructor can leave. 
// ----------------------------------------------------------------------------- 
// 
void CSocketsReader::ConstructL() 
    { 
    CActiveScheduler::Add( this ); 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::~CSocketsReader() 
// Destructor. 
// ----------------------------------------------------------------------------- 
// 
CSocketsReader::~CSocketsReader() 
    { 
    Cancel(); 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::DoCancel() 
// Cancels any outstanding operation. 
// ----------------------------------------------------------------------------- 
// 
void CSocketsReader::DoCancel() 
    { 
    // Cancel asychronous read request 
    iSocket.CancelRead(); 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::RunL() 
// Called when operation completes. 
// ----------------------------------------------------------------------------- 
// 
void CSocketsReader::RunL() 
    { 
    // Active object request complete handler 
    switch ( iStatus.Int() ) 
        { 
        case KErrNone: 
            // Character has been read from socket 
            iEngineNotifier.ResponseReceived( iBuffer ); 
            IssueRead(); // Immediately start another read 
            break; 
        case KErrDisconnected: 
            iEngineNotifier.ReportError( MEngineNotifier::EDisconnected, 
                                         iStatus.Int() ); 
            break; 
        default: 
            iEngineNotifier.ReportError( MEngineNotifier::EGeneralReadError, 
                                         iStatus.Int() ); 
            break; 
        } 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::IssueRead() 
// Initiates a read from socket. 
// ----------------------------------------------------------------------------- 
// 
void CSocketsReader::IssueRead() 
    { 
    // Initiate a new read from socket into iBuffer 
    __ASSERT_ALWAYS( !IsActive(), User::Panic( KPanicSocketsEngineRead, 
                                               ESocketsBadState ) ); 
    iSocket.RecvOneOrMore( iBuffer, 0, iStatus, iDummyLength ); 
    SetActive(); 
    } 
 
// ----------------------------------------------------------------------------- 
// CSocketsReader::Start() 
// Initiates a read from socket. 
// ----------------------------------------------------------------------------- 
// 
void CSocketsReader::Start() 
    { 
    // Initiate a new read from socket into iBuffer 
    if ( !IsActive() ) 
        { 
        IssueRead(); 
        } 
    } 
 
// End of File