/* ----------------------------------------------------------------------------- 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); } //------------------------------------------------------------------------------