From 03c7d96eab83834ca4b2b9d54fd447b19c5f694a Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 3 Oct 2011 10:59:29 +0200 Subject: [PATCH] Created MemoryReadByteStream --- include/transport/memoryreadbytestream.h | 48 ++++++++++++++++ include/transport/networkpluginserver.h | 41 -------------- src/memoryreadbytestream.cpp | 71 ++++++++++++++++++++++++ src/networkpluginserver.cpp | 7 ++- 4 files changed, 123 insertions(+), 44 deletions(-) create mode 100644 include/transport/memoryreadbytestream.h create mode 100644 src/memoryreadbytestream.cpp diff --git a/include/transport/memoryreadbytestream.h b/include/transport/memoryreadbytestream.h new file mode 100644 index 00000000..0454b512 --- /dev/null +++ b/include/transport/memoryreadbytestream.h @@ -0,0 +1,48 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#pragma once + +#include +#include +#include "Swiften/Swiften.h" + +namespace Transport { + +class MemoryReadBytestream : public Swift::ReadBytestream { + public: + MemoryReadBytestream(); + virtual ~MemoryReadBytestream(); + + unsigned long appendData(const std::string &data); + + virtual boost::shared_ptr > read(size_t size); + + bool isFinished() const; + + boost::signal onDataNeeded; + + private: + bool m_finished; + std::string m_data; + bool neededData; +}; + +} diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 468dc89b..4b170625 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -137,45 +137,4 @@ class NetworkPluginServer { FileTransferManager *m_ftManager; }; -class DummyReadBytestream : public Swift::ReadBytestream { - public: - DummyReadBytestream(NetworkPluginServer::Backend *b, unsigned long ftid) {neededData = false; m_finished = false; this->b = b; this->ftid = ftid;} - virtual ~DummyReadBytestream() {} - unsigned long appendData(const std::string &data) { - m_data += data; - onDataAvailable(); - neededData = false; - return m_data.size(); - } - - virtual boost::shared_ptr > read(size_t size) { - if (m_data.empty()) { - return boost::shared_ptr >(new std::vector()); - } - - if (m_data.size() < size) { - boost::shared_ptr > ptr(new std::vector(m_data.begin(), m_data.end())); - m_data.clear(); - onDataNeeded(b, ftid); - return ptr; - } - boost::shared_ptr > ptr(new std::vector(m_data.begin(), m_data.begin() + size)); - m_data.erase(m_data.begin(), m_data.begin() + size); - if (m_data.size() < 500000 && !neededData) { - neededData = true; - onDataNeeded(b, ftid); - } - return ptr; - } - boost::signal onDataNeeded; - virtual bool isFinished() const { return m_finished; } - - private: - bool m_finished; - NetworkPluginServer::Backend *b; - unsigned long ftid; - std::string m_data; - bool neededData; -}; - } diff --git a/src/memoryreadbytestream.cpp b/src/memoryreadbytestream.cpp new file mode 100644 index 00000000..6c3f0588 --- /dev/null +++ b/src/memoryreadbytestream.cpp @@ -0,0 +1,71 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include "transport/memoryreadbytestream.h" +#include "log4cxx/logger.h" +#include "memoryusage.h" +#include + +using namespace log4cxx; + +namespace Transport { + +MemoryReadBytestream::MemoryReadBytestream() { + neededData = false; + m_finished = false; +} + +MemoryReadBytestream::~MemoryReadBytestream() { + +} + +unsigned long MemoryReadBytestream::appendData(const std::string &data) { + m_data += data; + onDataAvailable(); + neededData = false; + return m_data.size(); +} + +boost::shared_ptr > MemoryReadBytestream::read(size_t size) { + if (m_data.empty()) { + onDataNeeded(); + return boost::shared_ptr >(new std::vector()); + } + + if (m_data.size() < size) { + boost::shared_ptr > ptr(new std::vector(m_data.begin(), m_data.end())); + m_data.clear(); + onDataNeeded(); + return ptr; + } + boost::shared_ptr > ptr(new std::vector(m_data.begin(), m_data.begin() + size)); + m_data.erase(m_data.begin(), m_data.begin() + size); + if (m_data.size() < 500000 && !neededData) { + neededData = true; + onDataNeeded(); + } + return ptr; +} + +bool MemoryReadBytestream::isFinished() const { + return m_finished; +} + +} diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 48953775..1e1a8cce 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -30,6 +30,7 @@ #include "transport/conversation.h" #include "transport/vcardresponder.h" #include "transport/rosterresponder.h" +#include "transport/memoryreadbytestream.h" #include "blockresponder.h" #include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" @@ -600,8 +601,8 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) { fileInfo.setName(payload.filename()); Backend *c = (Backend *) user->getData(); - boost::shared_ptr bytestream(new DummyReadBytestream(c, bytestream_id + 1)); - bytestream->onDataNeeded.connect(boost::bind(&NetworkPluginServer::handleFTDataNeeded, this, _1, _2)); + boost::shared_ptr bytestream(new MemoryReadBytestream()); + bytestream->onDataNeeded.connect(boost::bind(&NetworkPluginServer::handleFTDataNeeded, this, c, bytestream_id + 1)); LOG4CXX_INFO(logger, "jid=" << buddy->getJID()); @@ -628,7 +629,7 @@ void NetworkPluginServer::handleFTDataPayload(Backend *b, const std::string &dat // return; FileTransferManager::Transfer &transfer = m_filetransfers[payload.ftid()]; - DummyReadBytestream *bytestream = (DummyReadBytestream *) transfer.readByteStream.get(); + MemoryReadBytestream *bytestream = (MemoryReadBytestream *) transfer.readByteStream.get(); if (bytestream->appendData(payload.data()) > 5000000) { pbnetwork::FileTransferData f;