📄 netstream.cpp
字号:
/* $Id: netstream.cpp,v 1.11 2003/09/08 14:56:55 grumbel Exp $
**
** ClanLib Game SDK
** Copyright (C) 2003 The ClanLib Team
** For a total list of contributers see the file CREDITS.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "API/Network/NetSession/netstream.h"
#include "API/Network/NetSession/netsession.h"
#include "netstream_generic.h"
#include "netsession_generic.h"
#include "netcomputer_generic.h"
/////////////////////////////////////////////////////////////////////////////
// CL_NetStream construction:
CL_NetStream::CL_NetStream(
const std::string &netstream,
CL_NetComputer &dest)
: impl(new CL_NetStream_Generic(netstream, dest, dest.impl->netsession))
{
input.netstream = impl;
output.netstream = impl;
if (impl) impl->add_ref();
}
CL_NetStream::CL_NetStream(const CL_NetStream ©)
: impl(copy.impl)
{
input.netstream = impl;
output.netstream = impl;
if (impl) impl->add_ref();
}
CL_NetStream::~CL_NetStream()
{
if (impl) impl->release_ref();
}
/////////////////////////////////////////////////////////////////////////////
// CL_NetStream attributes:
CL_EventTrigger *CL_NetStream::get_read_trigger()
{
return &impl->read_trigger;
}
CL_EventTrigger *CL_NetStream::get_write_trigger()
{
return &impl->write_trigger;
}
/////////////////////////////////////////////////////////////////////////////
// CL_NetStream operations:
CL_NetStream &CL_NetStream::operator =(const CL_NetStream ©)
{
if (impl) impl->release_ref();
impl = copy.impl;
if (impl) impl->add_ref();
input.netstream = impl;
output.netstream = impl;
return *this;
}
int CL_NetStream::send(const void *data, int size)
{
if (impl->closed) return 0;
impl->computer->send_stream_message(impl->channel_id, std::string((const char *) data, size));
return size;
}
#define cl_min(a, b) ((a < b) ? a : b)
int CL_NetStream::recv(void *data, int size)
{
char *_data = (char *) data;
int received = 0;
while (true)
{
impl->read_trigger.wait();
CL_MutexSection mutex_section(&impl->mutex);
while (!impl->receive_queue.empty())
{
std::string &chunk = impl->receive_queue.front();
std::string::size_type copy_size = cl_min(static_cast<unsigned int>(size-received), chunk.length());
memcpy(_data + received, chunk.data(), copy_size);
received += copy_size;
if (copy_size == chunk.length()) impl->receive_queue.pop();
else chunk = chunk.substr(copy_size);
if (received == size) return received;
}
if (impl->closed) return received;
impl->read_trigger.reset();
}
return received;
}
/////////////////////////////////////////////////////////////////////////////
// CL_NetStream implementation:
CL_NetStream::CL_NetStream(CL_NetStream_Generic *impl)
: impl(impl)
{
input.netstream = impl;
output.netstream = impl;
if (impl) impl->add_ref();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -