⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsdpgdpadapter.cpp

📁 Symbian mobile os C++ GSDP编程
💻 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 + -