From 072a3d7208f4da7aa501d9720a9d0c146b105ea7 Mon Sep 17 00:00:00 2001 From: Marco De Marco Date: Mon, 13 Jan 2014 12:11:24 +0100 Subject: [PATCH] Server compiled, ready for test --- src/{FileManager.cpp => FileWrapper.cpp} | 46 +++++++++++++----------- src/{FileManager.h => FileWrapper.h} | 20 ++++++----- src/PlainSession.cpp | 28 +++++---------- src/PlainSession.h | 2 +- src/ProtocolManager.cpp | 43 ++++++++++++++++++---- src/ProtocolManager.h | 17 +++++++++ src/SSLSession.cpp | 23 ++++-------- src/SSLSession.h | 2 +- src/Session.cpp | 21 +++++------ src/Session.h | 13 +++---- 10 files changed, 121 insertions(+), 94 deletions(-) rename src/{FileManager.cpp => FileWrapper.cpp} (65%) rename src/{FileManager.h => FileWrapper.h} (79%) diff --git a/src/FileManager.cpp b/src/FileWrapper.cpp similarity index 65% rename from src/FileManager.cpp rename to src/FileWrapper.cpp index e10e0ff..e2b49f8 100644 --- a/src/FileManager.cpp +++ b/src/FileWrapper.cpp @@ -1,16 +1,15 @@ -#include -#include +#include namespace DataExporter_ns { //============================================================================== -// FileManager::FileManager() +// FileWrapper::FileWrapper() //============================================================================== -FileManager::FileManager(Tango::DeviceImpl* deviceImpl_p, +FileWrapper::FileWrapper(Tango::DeviceImpl* deviceImpl_p, boost::filesystem::path& path) : Tango::LogAdapter(deviceImpl_p) { - DEBUG_STREAM << "FileManager::FileManager()" << endl; + DEBUG_STREAM << "FileWrapper::FileWrapper()" << endl; m_inputFileStream.open(path.string(), std::ios::binary | std::ios::ate); @@ -20,51 +19,56 @@ FileManager::FileManager(Tango::DeviceImpl* deviceImpl_p, } //============================================================================== -// FileManager::~FileManager() +// FileWrapper::~FileWrapper() //============================================================================== -FileManager::~FileManager() +FileWrapper::~FileWrapper() { - DEBUG_STREAM << "FileManager::~FileManager()" << endl; + DEBUG_STREAM << "FileWrapper::~FileWrapper()" << endl; m_inputFileStream.close(); } //============================================================================== -// FileManager::create() +// FileWrapper::create() //============================================================================== -FileManager::SP FileManager::create(Tango::DeviceImpl* deviceImpl_p, +FileWrapper::SP FileWrapper::create(Tango::DeviceImpl* deviceImpl_p, boost::filesystem::path& path) { - FileManager::SP d_sp(new FileManager(deviceImpl_p, path), - FileManager::Deleter()); + FileWrapper::SP d_sp(new FileWrapper(deviceImpl_p, path), + FileWrapper::Deleter()); return d_sp; } //============================================================================== -// FileManager::isOpen() +// FileWrapper::isOpen() //============================================================================== -bool FileManager::isOpen() +bool FileWrapper::isOpen() { return m_inputFileStream.is_open(); } //============================================================================== -// FileManager::isCompleted() +// FileWrapper::isBad() //============================================================================== -bool FileManager::isCompleted() +bool FileWrapper::isBad() { - return m_inputFileStream.tellg() >= m_inputFileSize; + return m_inputFileStream.bad(); } //============================================================================== -// FileManager::read() +// FileWrapper::isCompleted() //============================================================================== -void FileManager::read(std::vector& writeBuff) throw(std::runtime_error) +bool FileWrapper::isCompleted() { - if(m_inputFileStream.tellg() >= m_inputFileSize) - throw std::runtime_error("Already completed"); + return m_inputFileStream.tellg() >= m_inputFileSize; +} +//============================================================================== +// FileWrapper::read() +//============================================================================== +void FileWrapper::read(std::vector& writeBuff) throw(std::runtime_error) +{ int leftToRead = m_inputFileSize - m_inputFileStream.tellg(); int bufferSize = 0; diff --git a/src/FileManager.h b/src/FileWrapper.h similarity index 79% rename from src/FileManager.h rename to src/FileWrapper.h index 58aff7d..46c711d 100644 --- a/src/FileManager.h +++ b/src/FileWrapper.h @@ -1,5 +1,5 @@ -#ifndef FILEMANAGER_H -#define FILEMANAGER_H +#ifndef FILEWRAPPER_H +#define FILEWRAPPER_H #include @@ -10,41 +10,43 @@ namespace DataExporter_ns { -class FileManager : public Tango::LogAdapter +class FileWrapper : public Tango::LogAdapter { public: //------------------------------------------------------------------------------ // [Public] Shared pointer typedef //------------------------------------------------------------------------------ - typedef boost::shared_ptr SP; + typedef boost::shared_ptr SP; protected: //------------------------------------------------------------------------------ // [Protected] Constructor destructor deleter //------------------------------------------------------------------------------ - FileManager(Tango::DeviceImpl*, boost::filesystem::path&); + FileWrapper(Tango::DeviceImpl*, boost::filesystem::path&); - virtual ~FileManager(); + virtual ~FileWrapper(); class Deleter; friend Deleter; class Deleter { public: - void operator()(FileManager* d) { delete d; } + void operator()(FileWrapper* d) { delete d; } }; public: //------------------------------------------------------------------------------ // [Public] Class creation method //------------------------------------------------------------------------------ - static FileManager::SP create(Tango::DeviceImpl*, boost::filesystem::path&); + static FileWrapper::SP create(Tango::DeviceImpl*, boost::filesystem::path&); //------------------------------------------------------------------------------ // [Public] Input stream methods //------------------------------------------------------------------------------ virtual bool isOpen(); + virtual bool isBad(); + virtual bool isCompleted(); virtual void read(std::vector&) throw(std::runtime_error); @@ -65,4 +67,4 @@ protected: } //End of namespace -#endif /* FILEMANAGER_H */ +#endif /* FILEWRAPPER_H */ diff --git a/src/PlainSession.cpp b/src/PlainSession.cpp index a8c6a63..459de6b 100644 --- a/src/PlainSession.cpp +++ b/src/PlainSession.cpp @@ -154,52 +154,40 @@ void PlainSession::startWriteResponse() { ERROR_STREAM << "SSLSession::startWriteResponse() unknown error from " << m_remoteEndpoint << endl; - } } //============================================================================== // PlainSession::startWriteData() //============================================================================== -void PlainSession::startWriteData() +void PlainSession::startWriteData(FileWrapper::SP fileWrapper_sp) { try { - if(!m_inputStream.bad()) + if(!fileWrapper_sp->isBad()) { - if(m_inputStream.tellg()isCompleted()) { - int leftToRead = m_inputStreamSize - m_inputStream.tellg(); - - int bufferSize = 0; - - if(leftToRead < BUFFER_SIZE) - bufferSize = leftToRead; - else - bufferSize = BUFFER_SIZE; - std::vector writeBuff; - writeBuff.resize(bufferSize); - m_inputStream.read(&writeBuff[0], bufferSize); + fileWrapper_sp->read(writeBuff); boost::asio::async_write(m_plainSocket, boost::asio::buffer(writeBuff), m_strand.wrap(boost::bind(&PlainSession::handleWriteData, - shared_from_this(), boost::asio::placeholders::error))); + shared_from_this(), fileWrapper_sp, + boost::asio::placeholders::error))); } else { - INFO_STREAM << "SSLSession::startWriteData() " + INFO_STREAM << "PlainSession::startWriteData() " << " transfer completed " << endl; - m_inputStream.close(); - startReadRequestHeader(); } } else { - ERROR_STREAM << "SSLSession::startWriteData() error on file I/O " + ERROR_STREAM << "PlainSession::startWriteData() error on file I/O " << "from " << m_remoteEndpoint << endl; } } diff --git a/src/PlainSession.h b/src/PlainSession.h index 73ef35e..a0fa74a 100644 --- a/src/PlainSession.h +++ b/src/PlainSession.h @@ -54,7 +54,7 @@ protected: virtual void startWriteResponse(); - virtual void startWriteData(); + virtual void startWriteData(FileWrapper::SP); //------------------------------------------------------------------------------ // [Protected] Class variables diff --git a/src/ProtocolManager.cpp b/src/ProtocolManager.cpp index d7da7eb..1254e2e 100644 --- a/src/ProtocolManager.cpp +++ b/src/ProtocolManager.cpp @@ -11,8 +11,8 @@ namespace DataExporter_ns //============================================================================== ProtocolManager::ProtocolManager(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp, DBManager::SP dBManager_sp) : - Tango::LogAdapter(deviceImpl_p), m_configuration_sp(configuration_sp), - m_dBManager_sp(dBManager_sp) + Tango::LogAdapter(deviceImpl_p), m_deviceImpl_p(deviceImpl_p), + m_configuration_sp(configuration_sp), m_dBManager_sp(dBManager_sp) { DEBUG_STREAM << "ProtocolManager::ProtocolManager()" << endl; } @@ -55,14 +55,17 @@ ResponseSP ProtocolManager::prepareResponse(RequestSP request_sp) { DEBUG_STREAM << "ProtocolManager::prepareResponse()" << endl; + m_fileFound = false; + m_fileWrapper_sp.reset(); + if(!request_sp->IsInitialized()) throw std::runtime_error("Not initialized request!"); + ResponseSP response_sp(new Response()); + std::string username = request_sp->username(); std::string password = request_sp->password(); - ResponseSP response_sp(new Response()); - if(m_configuration_sp->isUserAuthorized(username, password)) { std::string schema = request_sp->schema(); @@ -91,8 +94,13 @@ ResponseSP ProtocolManager::prepareResponse(RequestSP request_sp) boost::uint64_t fileSize = boost::filesystem::file_size(absolutePath); - DEBUG_STREAM << "ProtocolManager::prepareResponse() " - << "file size " << fileSize << endl; + INFO_STREAM << "ProtocolManager::prepareResponse() " + << " transfer file " << fileName << " version " + << fileVersion << " size " << fileSize << endl; + + m_fileFound = true; + m_fileWrapper_sp = + FileWrapper::create(m_deviceImpl_p, absolutePath); response_sp->set_state(Response::REQUEST_ACCEPTED); response_sp->set_status("Request accepted"); @@ -153,6 +161,29 @@ ResponseSP ProtocolManager::prepareResponse(RequestSP request_sp) return response_sp; } +//============================================================================== +// ProtocolManager::isFileFound() +//============================================================================== +bool ProtocolManager::isFileFound() +{ + DEBUG_STREAM << "ProtocolManager::isFileFound()" << endl; + + return m_fileFound; +} + +//============================================================================== +// ProtocolManager::getFileWrapper() +//============================================================================== +FileWrapper::SP ProtocolManager::getFileWrapper() throw(std::runtime_error) +{ + DEBUG_STREAM << "ProtocolManager::getFileWrapper()" << endl; + + if(!m_fileWrapper_sp) + throw std::runtime_error("File wrapper not created"); + + return m_fileWrapper_sp; +} + //============================================================================== // ProtocolManager::composePath() //============================================================================== diff --git a/src/ProtocolManager.h b/src/ProtocolManager.h index b2468b7..6f8d00d 100644 --- a/src/ProtocolManager.h +++ b/src/ProtocolManager.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -61,6 +62,13 @@ public: virtual ResponseSP prepareResponse(RequestSP) throw(std::runtime_error); +//------------------------------------------------------------------------------ +// [Public] File transfer methods +//------------------------------------------------------------------------------ + bool isFileFound(); + + FileWrapper::SP getFileWrapper() throw(std::runtime_error); + protected: //------------------------------------------------------------------------------ // [Protected] @@ -71,6 +79,9 @@ protected: //------------------------------------------------------------------------------ // [Protected] Class variables //------------------------------------------------------------------------------ + //Device implementation pointer + Tango::DeviceImpl* m_deviceImpl_p; + //Configuration parameters shared pointer Configuration::SP m_configuration_sp; @@ -79,6 +90,12 @@ protected: //Address and port of remote endpoint std::string m_remoteEndpoint; + + //File to transfer found + bool m_fileFound; + + //File to transfer wrapper + FileWrapper::SP m_fileWrapper_sp; }; } //End of namespace diff --git a/src/SSLSession.cpp b/src/SSLSession.cpp index 02a29b8..379688a 100644 --- a/src/SSLSession.cpp +++ b/src/SSLSession.cpp @@ -196,39 +196,28 @@ void SSLSession::startWriteResponse() //============================================================================== // SSLSession::startWriteData() //============================================================================== -void SSLSession::startWriteData() +void SSLSession::startWriteData(FileWrapper::SP fileWrapper_sp) { try { - if(!m_inputStream.bad()) + if(!fileWrapper_sp->isBad()) { - if(m_inputStream.tellg() < m_inputStreamSize) + if(!fileWrapper_sp->isCompleted()) { - int leftToRead = m_inputStreamSize - m_inputStream.tellg(); - - int bufferSize = 0; - - if(leftToRead < BUFFER_SIZE) - bufferSize = leftToRead; - else - bufferSize = BUFFER_SIZE; - std::vector writeBuff; - writeBuff.resize(bufferSize); - m_inputStream.read(&writeBuff[0], bufferSize); + fileWrapper_sp->read(writeBuff); boost::asio::async_write(m_sslSocket, boost::asio::buffer(writeBuff), m_strand.wrap(boost::bind(&SSLSession::handleWriteData, - shared_from_this(), boost::asio::placeholders::error))); + shared_from_this(), fileWrapper_sp, + boost::asio::placeholders::error))); } else { INFO_STREAM << "SSLSession::startWriteData() " << " transfer completed " << endl; - m_inputStream.close(); - startReadRequestHeader(); } } diff --git a/src/SSLSession.h b/src/SSLSession.h index 3fe39d4..a4ef019 100644 --- a/src/SSLSession.h +++ b/src/SSLSession.h @@ -64,7 +64,7 @@ protected: virtual void startWriteResponse(); - virtual void startWriteData(); + virtual void startWriteData(FileWrapper::SP); //------------------------------------------------------------------------------ // [Protected] Class variables diff --git a/src/Session.cpp b/src/Session.cpp index 56af6c2..e0e2a38 100644 --- a/src/Session.cpp +++ b/src/Session.cpp @@ -82,14 +82,14 @@ void Session::handleWriteResponse(const boost::system::error_code& errorCode) if(!errorCode) { -// if() -// { -// //TODO: open file and start read -// } -// else -// { -// startReadRequestHeader(); -// } + if(m_protocolManager_sp->isFileFound()) + { + startWriteData(m_protocolManager_sp->getFileWrapper()); + } + else + { + startReadRequestHeader(); + } } else if(errorCode == boost::asio::error::eof) { @@ -106,11 +106,12 @@ void Session::handleWriteResponse(const boost::system::error_code& errorCode) //============================================================================== // Session::handleWriteData() //============================================================================== -void Session::handleWriteData(const boost::system::error_code& errorCode) +void Session::handleWriteData(FileWrapper::SP fileWrapper_sp, + const boost::system::error_code& errorCode) { if(!errorCode) { - startWriteData(); + startWriteData(fileWrapper_sp); } else if(errorCode == boost::asio::error::eof) { diff --git a/src/Session.h b/src/Session.h index 8ff8cc8..1ccae61 100644 --- a/src/Session.h +++ b/src/Session.h @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -64,9 +65,10 @@ protected: //------------------------------------------------------------------------------ // [Protected] Write data methods //------------------------------------------------------------------------------ - virtual void startWriteData() = 0; + virtual void startWriteData(FileWrapper::SP) = 0; - virtual void handleWriteData(const boost::system::error_code&); + virtual void handleWriteData(FileWrapper::SP, + const boost::system::error_code&); //------------------------------------------------------------------------------ // [Protected] Encode decode header methods @@ -97,13 +99,6 @@ protected: //Address and port of remote endpoint std::string m_remoteEndpoint; - - //TODO: to delete - const int BUFFER_SIZE = 1024; - - std::ifstream m_inputStream; - - int m_inputStreamSize; }; } //End of namespace -- GitLab