80 lines
2.6 KiB
C++
80 lines
2.6 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "io_net/io_net_client.h"
|
|
#include "io_net/io_net_client_worker_thread.h"
|
|
#include "ascii/parser.h"
|
|
#include "container/nlist.h"
|
|
#include "nstring/nstring.h"
|
|
#include "platform.h"
|
|
#include "log/log.h"
|
|
|
|
using namespace GS::IO;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
uint Net::GetCaps() const
|
|
{ return IsCaseSensitive | CanRead | CanSeek; }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Net::QueueTask(NetWorkerBaseTask &task)
|
|
{
|
|
if (!worker.QueueTask(task))
|
|
__ERR__("Net::QueueTask failed.\n", false);
|
|
|
|
while (task.processed.Get() == 0) {}
|
|
return asbool(task.success.Get());
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
Handle *Net::Open(const char *path, Mode mode)
|
|
{
|
|
NetWorkerOpenTask task(path, mode);
|
|
return QueueTask(task) ? new NetHandle(this, task.handle) : NULL;
|
|
}
|
|
void Net::Close(Handle *h)
|
|
{
|
|
NetWorkerCloseTask task(((NetHandle *)h)->remote_id);
|
|
QueueTask(task);
|
|
}
|
|
size_t Net::Tell(Handle *h)
|
|
{
|
|
NetWorkerTellTask task(((NetHandle *)h)->remote_id);
|
|
return QueueTask(task) ? task.pos : 0;
|
|
}
|
|
size_t Net::Seek(Handle *h, ptrdiff_t offset, SeekRef ref)
|
|
{
|
|
NetWorkerSeekTask task(((NetHandle *)h)->remote_id, offset, ref);
|
|
return QueueTask(task) ? task.pos : 0;
|
|
}
|
|
size_t Net::Read(Handle *h, void *data, size_t size)
|
|
{
|
|
NetWorkerReadTask task(((NetHandle *)h)->remote_id, data, size);
|
|
return QueueTask(task) ? task.read_size : 0;
|
|
}
|
|
GS::String Net::Hash(const char *uri)
|
|
{
|
|
NetWorkerHashTask task(uri);
|
|
return QueueTask(task) ? task.hash : 0;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Net::IsConnected() const
|
|
{ return worker.IsConnected(); }
|
|
bool Net::Connect(const char *ip, int port)
|
|
{ return worker.Start(ip, port); }
|
|
void Net::Disconnect()
|
|
{ worker.Stop(); }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
NetHandle::~NetHandle()
|
|
{ GetIOSystem()->Close(this); }
|
|
//------------------------------------------------------------------------------
|