/* * Copyright (C) 2015 by Multi-Tech Systems * * This file is part of libmts-io. * * libmts-io 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 of the License, or * (at your option) any later version. * * libmts-io 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 libmts-io. If not, see . * */ /*! \file MTS_IO_Connection.cpp \brief A brief description \date Jan 15, 2013 \author sgodinez A more elaborate description than necessary. */ #include #include #include using namespace MTS; using namespace MTS::IO; int32_t Connection::BLOCKING = -1; Connection::Connection(const std::string& name) : m_sName(name) , m_bClosed(true) , m_bCloseable(true) { m_apLock.reset(new Lock()); m_apReadLock.reset(new Lock()); m_apWriteLock.reset(new Lock()); } Connection::~Connection() { m_apWriteLock.reset(); m_apReadLock.reset(); m_apLock.reset(); } const std::string& Connection::getName() const { return m_sName; } bool Connection::open(const int32_t& timeoutMillis) { bool bOpened = true; m_apLock->lock(); if (m_bClosed) { bOpened = doOpen(timeoutMillis); if (bOpened) { m_bClosed = false; } } m_apLock->unlock(); return bOpened; } void Connection::close() { m_apLock->lock(); if (m_bCloseable) { doClose(); m_bClosed = true; } m_apLock->unlock(); } bool Connection::isClosed() const { m_apLock->lock(); bool bResult = m_bClosed; m_apLock->unlock(); return bResult; } void Connection::setCloseable(bool bCloseable) { m_apLock->lock(); m_bCloseable = bCloseable; m_apLock->unlock(); } bool Connection::isCloseable() const { m_apLock->lock(); bool bResult = m_bCloseable; m_apLock->unlock(); return bResult; } int Connection::read(std::string& sBuffer, const uint32_t& iSize, int32_t& timeoutMillis) { int result = -1; if (isClosed()) { return result; } else { char buffer[iSize]; m_apReadLock->lock(); result = doRead(buffer, iSize, timeoutMillis); m_apReadLock->unlock(); if(result > 0) { sBuffer = std::string(buffer, result); } } return result; } int Connection::read(Buffer& oBuffer, const uint32_t& iSize, int32_t& timeoutMillis) { int result = -1; if (isClosed()) { return result; } else { oBuffer.setCapacity(iSize); m_apReadLock->lock(); result = doRead((char*)oBuffer.getBuffer(), iSize, timeoutMillis); m_apReadLock->unlock(); } return result; } int Connection::read(char* pBuffer, const uint32_t& iSize, int32_t& timeoutMillis) { int result = -1; if (isClosed()) { return result; } else { m_apReadLock->lock(); result = doRead(pBuffer, iSize, timeoutMillis); m_apReadLock->unlock(); } return result; } int Connection::write(const char* pBuffer, const uint32_t& iSize, int32_t& timeoutMillis) { int result = -1; if (isClosed()) { return result; } else { m_apWriteLock->lock(); result = doWrite(pBuffer, iSize, timeoutMillis); m_apWriteLock->unlock(); } return result; }