📄 gsdpgdpadapter.cpp
字号:
// gsdpgdpadapter.cpp
//
// Adapts the GDP protocol implementations to the server interfaces
//
// Copyright (c) 2000-2002 Symbian Ltd. All rights reserved.
#include "gsdpserver.h"
#include <s32mem.h>
/*
class CGsdpGdpAdapter
*/
// construct/destruct
CGsdpGdpAdapter* CGsdpGdpAdapter::NewL(CGsdpServer& aServer)
{
CGsdpGdpAdapter* self = new (ELeave) CGsdpGdpAdapter(aServer);
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(self);
return self;
}
CGsdpGdpAdapter::CGsdpGdpAdapter(CGsdpServer& aServer)
: iServer(aServer)
{
}
void CGsdpGdpAdapter::ConstructL()
/** Construct the adapter.
*/
{
// Create Q
iTransmitQueue = CGsdpTransmitQueue::NewL(*this);
}
void CGsdpGdpAdapter::SetProtocolL(CGdpSession* aGdpSession)
{
iGdpSession = aGdpSession;
iGdpSession->OpenL(this);
}
CGsdpGdpAdapter::~CGsdpGdpAdapter()
{
delete iGdpSession;
delete iTransmitQueue;
}
// interrogate
TBool CGsdpGdpAdapter::IsNetworked()
{
return iGdpSession->IsNetworked();
}
TUid CGsdpGdpAdapter::ProtocolUid() const
{
return iGdpSession->Uid();
}
// protocol adapters
void CGsdpGdpAdapter::SendL(TUint32 aGameProtocol,
TUint32 aFromPort,
const TDesC8& aToAddress, TUint32 aToPort,
const TDesC8& aData)
{
if(iLastError)
{
iLastError = KErrNone;
User::Leave(iLastError);
}
iTransmitQueue->Transmit(aGameProtocol, aToPort, aToAddress,
aFromPort, aData);
}
void CGsdpGdpAdapter::SendPacket(TGsdpPacket& aPacket)
{
if(!iSendActive) // otherwise drop
{
RDesWriteStream writer(iSendBuffer);
writer.WriteUint32L(aPacket.iGameProtocol);
writer.WriteUint32L(aPacket.iFromPort);
writer.WriteUint32L(aPacket.iToPort);
writer.WriteUint32L(aPacket.iData.Size());
writer.WriteL(aPacket.iData);
writer.CommitL(); // Can't leave
iSendActive = ETrue; // do this first in case SendComplete is sync
TRAPD(err, iGdpSession->SendL(aPacket.iAddress, iSendBuffer));
iLastError = err;
}
}
TBool CGsdpGdpAdapter::CanSendPacket(TGsdpPacket& /*aPacket*/)
{
return !iSendActive;
}
void CGsdpGdpAdapter::SendComplete(TInt /*aErr*/)
{
iSendActive = EFalse;
iTransmitQueue->TryToSend();
}
void CGsdpGdpAdapter::ReceiveAll()
{
iGdpSession->ReceiveAll();
}
// from MGdpPacketHandler
void CGsdpGdpAdapter::GdpHandleL(const TDesC8& aFromAddress, const TDesC8& aData)
{
TGsdpPacket incoming_packet;
RDesReadStream reader(aData);
TUint32 data_length;
incoming_packet.iGameProtocol = reader.ReadUint32L();
incoming_packet.iFromPort = reader.ReadUint32L();
incoming_packet.iToPort = reader.ReadUint32L();
data_length = reader.ReadInt32L();
TPtr8 incoming(const_cast<TUint8*>(incoming_packet.iData.Ptr()), data_length);
reader.ReadL(incoming);
iServer.iReceiveQueue->Receive(incoming_packet.iGameProtocol, incoming_packet.iToPort, aFromAddress, incoming_packet.iFromPort, incoming);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -