📄 iapconnectdemosocketswriter.cpp
字号:
/*
* ============================================================================
* Name : CIAPConnectDemoSocketsWriter from IAPConnectDemoSocketsWriter.cpp
* Part of : Internet Access Points Example v2.0
* Created : 01.09.2006 by Forum Nokia
* Version : 2.0
* Copyright: Forum Nokia
* ============================================================================
*/
// INCLUDE FILES
#include "IAPConnectDemoSocketsWriter.h"
#include "IAPConnectDemoSocketsObserver.h"
const TInt KWriteBufferSize = 20;
// ========================= MEMBER FUNCTIONS ================================
// Constructor
CIAPConnectDemoSocketsWriter::CIAPConnectDemoSocketsWriter(
MIAPConnectDemoSocketsObserver& aSocketsObserver,
RSocket& aSocket )
: CActive( EPriorityStandard ),
iSocket( aSocket ),
iSocketsObserver( aSocketsObserver )
{
// No implementation required
}
// Destructor.
CIAPConnectDemoSocketsWriter::~CIAPConnectDemoSocketsWriter()
{
Cancel();
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::NewL()
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CIAPConnectDemoSocketsWriter* CIAPConnectDemoSocketsWriter::NewL(
MIAPConnectDemoSocketsObserver& aSocketsObserver,
RSocket& aSocket )
{
CIAPConnectDemoSocketsWriter* self =
CIAPConnectDemoSocketsWriter::NewLC( aSocketsObserver, aSocket );
CleanupStack::Pop( self );
return self;
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::NewLC()
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CIAPConnectDemoSocketsWriter* CIAPConnectDemoSocketsWriter::NewLC(
MIAPConnectDemoSocketsObserver& aSocketsObserver,
RSocket& aSocket )
{
CIAPConnectDemoSocketsWriter* self =
new ( ELeave ) CIAPConnectDemoSocketsWriter(aSocketsObserver, aSocket);
CleanupStack::PushL( self );
self->ConstructL();
return self;
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::ConstructL()
// Symbian 2nd phase constructor can leave.
// ---------------------------------------------------------------------------
//
void CIAPConnectDemoSocketsWriter::ConstructL()
{
CActiveScheduler::Add( this );
iWriteStatus = EWaiting;
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::DoCancel()
// Cancels any outstanding operation.
// ---------------------------------------------------------------------------
//
void CIAPConnectDemoSocketsWriter::DoCancel()
{
// Cancel asychronous write request
iSocket.CancelWrite();
iWriteStatus = EWaiting;
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::RunL()
// Called when operation completes.
// ---------------------------------------------------------------------------
//
void CIAPConnectDemoSocketsWriter::RunL()
{
// Active object request complete handler
if ( iStatus == KErrNone )
{
switch( iWriteStatus )
{
// Character has been written to socket
case ESending:
SendNextPacket();
break;
default:
break;
};
}
else
{
// Error: pass it up to user interface
iSocketsObserver.ReportErrorL(
MIAPConnectDemoSocketsObserver::EGeneralWriteError,
iStatus.Int() );
iWriteStatus = EWaiting;
}
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::IssueWriteL()
// Writes the data to the socket ( buffered ).
// ---------------------------------------------------------------------------
//
void CIAPConnectDemoSocketsWriter::IssueWriteL( const TDesC8& aData )
{
if ( ( iWriteStatus != EWaiting ) && ( iWriteStatus != ESending ) )
{
User::Leave( KErrNotReady );
}
if ( ( aData.Length() + iTransferBuffer.Length() ) >
iTransferBuffer.MaxLength() )
{
// Not enough space in buffer
User::Leave( KErrOverflow );
}
// Add new data to buffer
iTransferBuffer.Append( aData );
if ( !IsActive() )
{
SendNextPacket();
}
}
// ---------------------------------------------------------------------------
// CIAPConnectDemoSocketsWriter::SendNextPacket()
// Handles a 'write buffer empty' situation.
// ---------------------------------------------------------------------------
//
void CIAPConnectDemoSocketsWriter::SendNextPacket()
{
if ( iTransferBuffer.Length() > 0 )
{
// Move data from transfer buffer to actual write buffer
iWriteBuffer = iTransferBuffer;
iTransferBuffer.Zero();
iSocket.Write( iWriteBuffer, iStatus ); // Initiate actual write
iWriteStatus = ESending;
SetActive();
}
else
{
iWriteStatus = EWaiting;
}
}
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -