📄 tcpcocketengine.cpp
字号:
/*
* ============================================================================
* Name : CTcpCocketEngine from TcpCocketEngine.cpp
* Part of : TcpCocket
* Created : 06.03.2006 by ToBeReplacedByAuthor
* Implementation notes:
*
* Version :
* Copyright: ToBeReplacedByCopyright
* ============================================================================
*/
// INCLUDE FILES
#include <TcpCocket.h> // for Panic();
#include "TcpCocketEngine.h"
const TInt KTimeout = 30; // second
// ================= MEMBER FUNCTIONS =======================
// Two-phased constructor.
CTcpCocketEngine* CTcpCocketEngine::NewL(MTcpObserver& aObserver)
{
CTcpCocketEngine* self = new (ELeave) CTcpCocketEngine( aObserver );
CleanupStack::PushL( self );
self->ConstructL();
CleanupStack::Pop();
return self;
}
// destructor
CTcpCocketEngine::~CTcpCocketEngine()
{
delete iTimer;
delete iSender;
delete iReceiver;
Cancel();
iSocket.Close();
iListenSocket.Close();
iSocketServ.Close();
}
// New functions
CTcpCocketEngine::TState CTcpCocketEngine::State()
{
return iState;
}
void CTcpCocketEngine::ConnectL(const TDesC& aAddr, TUint aPort)
{
__ASSERT_DEBUG(iState==EStateIdle, Panic(ETcpCocketPanicFailToConnect));
User::LeaveIfError(iAddr.Input(aAddr));
iAddr.SetPort(aPort);
// Open a TCP socket
User::LeaveIfError(iSocket.Open(iSocketServ, KAfInet, KSockStream, KProtocolInetTcp));
// Initiate socket connection
iSocket.Connect(iAddr, iStatus);
SetActive();
// Start a timeout timer
iTimer->Start(KTimeout);
iState = EStateConnecting;
}
void CTcpCocketEngine::Disconnect()
{
__ASSERT_DEBUG(iState==EStateConnected, Panic(ETcpCocketPanicFailToDisconnect));
// cancel all outstanding operations
// since we are connected, the only possibilities are read and write
iReceiver->Cancel();
iSender->Cancel();
iSocket.Close();
iState = EStateIdle;
}
void CTcpCocketEngine::ListenL()
{
__ASSERT_DEBUG(iState==EStateIdle, Panic(ETcpCocketPanicFailToListen));
TInetAddr addr(INET_ADDR(127,0,0,1), 8002);
User::LeaveIfError(iListenSocket.Open(iSocketServ, KAfInet, KSockStream, KProtocolInetTcp));
User::LeaveIfError(iSocket.Open( iSocketServ ) );
// Bind the socket to the required port.
iListenSocket.Bind(addr);
// Listen for incoming connections
iListenSocket.Listen(1);
// Accept incoming connections
iListenSocket.Accept(iSocket, iStatus);
SetActive();
iState = EStateListening;
}
void CTcpCocketEngine::SendL(const TDesC& aMsg)
{
__ASSERT_DEBUG(iState==EStateConnected, Panic(ETcpCocketPanicFailToSend));
iSender->Send(aMsg);
}
void CTcpCocketEngine::ReceiveL()
{
__ASSERT_DEBUG(iState==EStateConnected, Panic(ETcpCocketPanicFailToReceive));
iReceiver->Receive();
}
// Functions from CActive
void CTcpCocketEngine::DoCancel()
{
switch(iState)
{
case EStateConnecting:
{
iTimer->Cancel();
iSocket.CancelConnect();
break;
}
case EStateListening:
{
iListenSocket.CancelAccept();
break;
}
default:
{
// unreachable
break;
}
}
iState = EStateIdle;
}
void CTcpCocketEngine::RunL()
{
TInt err = iStatus.Int();
switch(iState)
{
case EStateConnecting:
{
iTimer->Cancel();
if (err == KErrNone)
{
// Connection completed successfully
iState = EStateConnected;
ReceiveL();
}
else
{
iSocket.Close();
iState = EStateIdle;
}
iObserver.OnConnectL(err);
break;
}
case EStateListening:
{
if(err == KErrNone)
{
iState = EStateConnected;
ReceiveL();
}
iListenSocket.Close();
iObserver.OnConnectL(err);
break;
}
default:
{
// unreachable
break;
}
}
}
// Functions from CTcpCocketTimer::MTimerObserver
void CTcpCocketEngine::OnTimerL(TInt aError)
{
Cancel();
TInt err = (aError==KErrNone)?KErrTimedOut:aError;
iObserver.OnConnectL(err);
}
// Functions from CTcpCocketSender::MObserver
void CTcpCocketEngine::OnSendL(const TDesC& aMsg, TInt aError)
{
iObserver.OnSendL(aMsg, aError);
}
// Functions from CTcpCocketReceiver::MObserver
void CTcpCocketEngine::OnReceiveL(const TDesC& aData, TInt aError)
{
iObserver.OnReceiveL(aData, aError);
if(aError==KErrNone)
{
ReceiveL();
}
else
{
Disconnect();
}
}
// constructor
CTcpCocketEngine::CTcpCocketEngine(MTcpObserver& aObserver)
: CActive(CActive::EPriorityStandard), iObserver(aObserver)
{
CActiveScheduler::Add(this);
}
// EPOC default constructor can leave.
void CTcpCocketEngine::ConstructL()
{
// Open a session to Socket Server
User::LeaveIfError(iSocketServ.Connect());
iTimer = CTcpCocketTimer::NewL(*this);
iSender = CTcpCocketSender::NewL(*this, iSocket);
iReceiver = new(ELeave) CTcpCocketReceiver(*this, iSocket);
}
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -