mirror of
https://github.com/pocoproject/poco.git
synced 2025-01-19 00:46:03 +01:00
Merge branch 'poco-1.10.0' into devel
This commit is contained in:
commit
bccea84322
@ -19,6 +19,7 @@
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/CryptoTransform.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include <istream>
|
||||
@ -30,9 +31,6 @@ namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class CryptoTransform;
|
||||
|
||||
|
||||
class Crypto_API Cipher: public Poco::RefCountedObject
|
||||
/// Represents the abstract base class from which all implementations of
|
||||
/// symmetric/asymmetric encryption algorithms must inherit. Use the CipherFactory
|
||||
@ -75,10 +73,10 @@ class Crypto_API Cipher: public Poco::RefCountedObject
|
||||
/// // and write pass it to the underlying file stream.
|
||||
/// Poco::FileOutputStream sink("encrypted.dat");
|
||||
/// CryptoOutputStream encryptor(sink, pCipher->createEncryptor());
|
||||
///
|
||||
///
|
||||
/// Poco::FileInputStream source("source.txt");
|
||||
/// Poco::StreamCopier::copyStream(source, encryptor);
|
||||
///
|
||||
///
|
||||
/// // Always close output streams to flush all internal buffers
|
||||
/// encryptor.close();
|
||||
/// sink.close();
|
||||
@ -95,7 +93,7 @@ public:
|
||||
ENC_BINHEX = 0x02, /// BinHex-encoded output
|
||||
ENC_BASE64_NO_LF = 0x81, /// Base64-encoded output, no linefeeds
|
||||
ENC_BINHEX_NO_LF = 0x82 /// BinHex-encoded output, no linefeeds
|
||||
|
||||
|
||||
};
|
||||
|
||||
virtual ~Cipher();
|
||||
@ -104,10 +102,10 @@ public:
|
||||
virtual const std::string& name() const = 0;
|
||||
/// Returns the name of the Cipher.
|
||||
|
||||
virtual CryptoTransform* createEncryptor() = 0;
|
||||
virtual CryptoTransform::Ptr createEncryptor() = 0;
|
||||
/// Creates an encryptor object to be used with a CryptoStream.
|
||||
|
||||
virtual CryptoTransform* createDecryptor() = 0;
|
||||
virtual CryptoTransform::Ptr createDecryptor() = 0;
|
||||
/// Creates a decryptor object to be used with a CryptoStream.
|
||||
|
||||
virtual std::string encryptString(const std::string& str, Encoding encoding = ENC_NONE);
|
||||
|
@ -42,10 +42,10 @@ public:
|
||||
const std::string& name() const;
|
||||
/// Returns the name of the cipher.
|
||||
|
||||
CryptoTransform* createEncryptor();
|
||||
CryptoTransform::Ptr createEncryptor();
|
||||
/// Creates an encryptor object.
|
||||
|
||||
CryptoTransform* createDecryptor();
|
||||
CryptoTransform::Ptr createDecryptor();
|
||||
/// Creates a decryptor object.
|
||||
|
||||
private:
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/CryptoTransform.h"
|
||||
#include "Poco/BufferedStreamBuf.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include <iostream>
|
||||
@ -38,8 +39,8 @@ class Crypto_API CryptoStreamBuf: public Poco::BufferedStreamBuf
|
||||
/// going through it.
|
||||
{
|
||||
public:
|
||||
CryptoStreamBuf(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoStreamBuf(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoStreamBuf(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoStreamBuf(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
|
||||
virtual ~CryptoStreamBuf();
|
||||
|
||||
@ -51,7 +52,7 @@ protected:
|
||||
int writeToDevice(const char* buffer, std::streamsize length);
|
||||
|
||||
private:
|
||||
CryptoTransform* _pTransform;
|
||||
CryptoTransform::Ptr _pTransform;
|
||||
std::istream* _pIstr;
|
||||
std::ostream* _pOstr;
|
||||
bool _eof;
|
||||
@ -70,8 +71,8 @@ class Crypto_API CryptoIOS: public virtual std::ios
|
||||
/// stream buffer and base classes.
|
||||
{
|
||||
public:
|
||||
CryptoIOS(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoIOS(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoIOS(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoIOS(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
~CryptoIOS();
|
||||
CryptoStreamBuf* rdbuf();
|
||||
|
||||
@ -89,7 +90,7 @@ class Crypto_API CryptoInputStream: public CryptoIOS, public std::istream
|
||||
/// respectively.
|
||||
{
|
||||
public:
|
||||
CryptoInputStream(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoInputStream(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
/// Create a new CryptoInputStream object. The CryptoInputStream takes the
|
||||
/// ownership of the given CryptoTransform object.
|
||||
|
||||
@ -113,7 +114,7 @@ class Crypto_API CryptoOutputStream: public CryptoIOS, public std::ostream
|
||||
/// to ensure completion of cryptographic transformation.
|
||||
{
|
||||
public:
|
||||
CryptoOutputStream(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoOutputStream(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
/// Create a new CryptoOutputStream object. The CryptoOutputStream takes the
|
||||
/// ownership of the given CryptoTransform object.
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/SharedPtr.h"
|
||||
#include <ios>
|
||||
|
||||
|
||||
@ -35,6 +36,8 @@ class Crypto_API CryptoTransform
|
||||
/// perform encryption or decryption of data.
|
||||
{
|
||||
public:
|
||||
using Ptr = Poco::SharedPtr<CryptoTransform>;
|
||||
|
||||
CryptoTransform();
|
||||
/// Creates a new CryptoTransform object.
|
||||
|
||||
|
@ -30,9 +30,9 @@ namespace Crypto {
|
||||
|
||||
|
||||
class RSACipherImpl: public Cipher
|
||||
/// An implementation of the Cipher class for
|
||||
/// An implementation of the Cipher class for
|
||||
/// asymmetric (public-private key) encryption
|
||||
/// based on the the RSA algorithm in OpenSSL's
|
||||
/// based on the the RSA algorithm in OpenSSL's
|
||||
/// crypto library.
|
||||
///
|
||||
/// Encryption is using the public key, decryption
|
||||
@ -48,11 +48,11 @@ public:
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns the name of the Cipher.
|
||||
|
||||
CryptoTransform* createEncryptor();
|
||||
|
||||
CryptoTransform::Ptr createEncryptor();
|
||||
/// Creates an encryptor object.
|
||||
|
||||
CryptoTransform* createDecryptor();
|
||||
CryptoTransform::Ptr createDecryptor();
|
||||
/// Creates a decryptor object.
|
||||
|
||||
private:
|
||||
|
@ -255,14 +255,14 @@ CipherImpl::~CipherImpl()
|
||||
}
|
||||
|
||||
|
||||
CryptoTransform* CipherImpl::createEncryptor()
|
||||
CryptoTransform::Ptr CipherImpl::createEncryptor()
|
||||
{
|
||||
CipherKeyImpl::Ptr p = _key.impl();
|
||||
return new CryptoTransformImpl(p->cipher(), p->getKey(), p->getIV(), CryptoTransformImpl::DIR_ENCRYPT);
|
||||
}
|
||||
|
||||
|
||||
CryptoTransform* CipherImpl::createDecryptor()
|
||||
CryptoTransform::Ptr CipherImpl::createDecryptor()
|
||||
{
|
||||
CipherKeyImpl::Ptr p = _key.impl();
|
||||
return new CryptoTransformImpl(p->cipher(), p->getKey(), p->getIV(), CryptoTransformImpl::DIR_DECRYPT);
|
||||
|
@ -32,7 +32,7 @@ namespace Crypto {
|
||||
//
|
||||
|
||||
|
||||
CryptoStreamBuf::CryptoStreamBuf(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize):
|
||||
CryptoStreamBuf::CryptoStreamBuf(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize):
|
||||
Poco::BufferedStreamBuf(bufferSize, std::ios::in),
|
||||
_pTransform(pTransform),
|
||||
_pIstr(&istr),
|
||||
@ -45,7 +45,7 @@ CryptoStreamBuf::CryptoStreamBuf(std::istream& istr, CryptoTransform* pTransform
|
||||
}
|
||||
|
||||
|
||||
CryptoStreamBuf::CryptoStreamBuf(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize):
|
||||
CryptoStreamBuf::CryptoStreamBuf(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize):
|
||||
Poco::BufferedStreamBuf(bufferSize, std::ios::out),
|
||||
_pTransform(pTransform),
|
||||
_pIstr(0),
|
||||
@ -67,7 +67,6 @@ CryptoStreamBuf::~CryptoStreamBuf()
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
delete _pTransform;
|
||||
}
|
||||
|
||||
|
||||
@ -86,10 +85,10 @@ void CryptoStreamBuf::close()
|
||||
// thrown.
|
||||
std::ostream* pOstr = _pOstr;
|
||||
_pOstr = 0;
|
||||
|
||||
|
||||
// Finalize transformation.
|
||||
std::streamsize n = _pTransform->finalize(_buffer.begin(), static_cast<std::streamsize>(_buffer.size()));
|
||||
|
||||
|
||||
if (n > 0)
|
||||
{
|
||||
pOstr->write(reinterpret_cast<char*>(_buffer.begin()), n);
|
||||
@ -193,14 +192,14 @@ int CryptoStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
|
||||
//
|
||||
|
||||
|
||||
CryptoIOS::CryptoIOS(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize):
|
||||
CryptoIOS::CryptoIOS(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize):
|
||||
_buf(istr, pTransform, bufferSize)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
CryptoIOS::CryptoIOS(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize):
|
||||
CryptoIOS::CryptoIOS(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize):
|
||||
_buf(ostr, pTransform, bufferSize)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
@ -223,7 +222,7 @@ CryptoStreamBuf* CryptoIOS::rdbuf()
|
||||
//
|
||||
|
||||
|
||||
CryptoInputStream::CryptoInputStream(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize):
|
||||
CryptoInputStream::CryptoInputStream(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize):
|
||||
CryptoIOS(istr, pTransform, bufferSize),
|
||||
std::istream(&_buf)
|
||||
{
|
||||
@ -247,7 +246,7 @@ CryptoInputStream::~CryptoInputStream()
|
||||
//
|
||||
|
||||
|
||||
CryptoOutputStream::CryptoOutputStream(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize):
|
||||
CryptoOutputStream::CryptoOutputStream(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize):
|
||||
CryptoIOS(ostr, pTransform, bufferSize),
|
||||
std::ostream(&_buf)
|
||||
{
|
||||
|
@ -329,13 +329,13 @@ RSACipherImpl::~RSACipherImpl()
|
||||
}
|
||||
|
||||
|
||||
CryptoTransform* RSACipherImpl::createEncryptor()
|
||||
CryptoTransform::Ptr RSACipherImpl::createEncryptor()
|
||||
{
|
||||
return new RSAEncryptImpl(_key.impl()->getRSA(), _paddingMode);
|
||||
}
|
||||
|
||||
|
||||
CryptoTransform* RSACipherImpl::createDecryptor()
|
||||
CryptoTransform::Ptr RSACipherImpl::createDecryptor()
|
||||
{
|
||||
return new RSADecryptImpl(_key.impl()->getRSA(), _paddingMode);
|
||||
}
|
||||
|
@ -222,7 +222,7 @@ void CryptoTest::testEncryptDecryptGCM()
|
||||
for (std::size_t n = 1; n < MAX_DATA_SIZE; n++)
|
||||
{
|
||||
std::stringstream str;
|
||||
CryptoTransform* pEncryptor = pCipher->createEncryptor();
|
||||
CryptoTransform::Ptr pEncryptor = pCipher->createEncryptor();
|
||||
CryptoOutputStream encryptorStream(str, pEncryptor);
|
||||
std::string in(n, 'x');
|
||||
encryptorStream << in;
|
||||
@ -231,7 +231,7 @@ void CryptoTest::testEncryptDecryptGCM()
|
||||
|
||||
std::string tag = pEncryptor->getTag();
|
||||
|
||||
CryptoTransform* pDecryptor = pCipher->createDecryptor();
|
||||
CryptoTransform::Ptr pDecryptor = pCipher->createDecryptor();
|
||||
pDecryptor->setTag(tag);
|
||||
CryptoInputStream decryptorStream(str, pDecryptor);
|
||||
std::string out;
|
||||
@ -318,7 +318,7 @@ void CryptoTest::testStreams()
|
||||
DecryptingInputStream decryptor(sstr, *pCipher);
|
||||
std::string result;
|
||||
Poco::StreamCopier::copyToString(decryptor, result);
|
||||
|
||||
|
||||
assertTrue (result == SECRET_MESSAGE);
|
||||
assertTrue (decryptor.eof());
|
||||
assertTrue (!decryptor.bad());
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "Poco/StreamCopier.h"
|
||||
#include "CppUnit/TestCaller.h"
|
||||
#include "CppUnit/TestSuite.h"
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
@ -41,12 +42,12 @@ void EVPTest::testRSAEVPPKey()
|
||||
{
|
||||
try
|
||||
{
|
||||
RSAKey* key = new RSAKey(RSAKey::KL_1024, RSAKey::EXP_SMALL);
|
||||
std::unique_ptr<RSAKey> key(new RSAKey(RSAKey::KL_1024, RSAKey::EXP_SMALL));
|
||||
assertTrue(key->type() == Poco::Crypto::KeyPair::KT_RSA);
|
||||
// construct EVPPKey from RSAKey*
|
||||
EVPPKey* pKey = new EVPPKey(key);
|
||||
EVPPKey* pKey = new EVPPKey(key.get());
|
||||
// EVPPKey increments reference count, so freeing the original must be ok
|
||||
delete key;
|
||||
key.reset();
|
||||
|
||||
assertTrue (!pKey->isSupported(0));
|
||||
assertTrue (!pKey->isSupported(-1));
|
||||
@ -54,11 +55,11 @@ void EVPTest::testRSAEVPPKey()
|
||||
assertTrue (pKey->type() == EVP_PKEY_RSA);
|
||||
|
||||
// construct RSAKey from const EVPPKey&
|
||||
key = new RSAKey(*pKey);
|
||||
key.reset(new RSAKey(*pKey));
|
||||
delete pKey;
|
||||
assertTrue(key->type() == Poco::Crypto::KeyPair::KT_RSA);
|
||||
// construct EVPPKey from RSAKey*
|
||||
pKey = new EVPPKey(key);
|
||||
pKey = new EVPPKey(key.get());
|
||||
assertTrue (pKey->type() == EVP_PKEY_RSA);
|
||||
|
||||
BIO* bioPriv1 = BIO_new(BIO_s_mem());
|
||||
|
@ -54,8 +54,8 @@ SessionImpl::SessionImpl(const std::string& fileName, std::size_t loginTimeout):
|
||||
open();
|
||||
setConnectionTimeout(loginTimeout);
|
||||
setProperty("handle", _pDB);
|
||||
addFeature("autoCommit",
|
||||
&SessionImpl::autoCommit,
|
||||
addFeature("autoCommit",
|
||||
&SessionImpl::autoCommit,
|
||||
&SessionImpl::isAutoCommit);
|
||||
addProperty("connectionTimeout", &SessionImpl::setConnectionTimeout, &SessionImpl::getConnectionTimeout);
|
||||
}
|
||||
@ -163,14 +163,15 @@ void SessionImpl::open(const std::string& connect)
|
||||
if (rc == SQLITE_OK) break;
|
||||
if (sw.elapsedSeconds() >= tout)
|
||||
{
|
||||
close();
|
||||
Utility::throwException(_pDB, rc);
|
||||
}
|
||||
else Thread::sleep(10);
|
||||
Thread::sleep(10);
|
||||
close();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SQLiteException& ex)
|
||||
{
|
||||
close();
|
||||
throw ConnectionFailedException(ex.displayText());
|
||||
}
|
||||
|
||||
|
@ -3410,7 +3410,7 @@ void SQLiteTest::testIllegalFilePath()
|
||||
{
|
||||
try
|
||||
{
|
||||
Session tmp (Poco::Data::SQLite::Connector::KEY, "\\/some\\/illegal\\/path\\/dummy.db", 1);
|
||||
Session tmp(Poco::Data::SQLite::Connector::KEY, "\\/some\\/illegal\\/path\\/dummy.db", 1);
|
||||
fail("must fail");
|
||||
}
|
||||
catch (ConnectionFailedException&)
|
||||
|
@ -29,7 +29,7 @@ namespace Poco {
|
||||
|
||||
template <class T>
|
||||
class Buffer
|
||||
/// A buffer class that allocates a buffer of a given type and size
|
||||
/// A buffer class that allocates a buffer of a given type and size
|
||||
/// in the constructor and deallocates the buffer in the destructor.
|
||||
///
|
||||
/// This class is useful everywhere where a temporary buffer
|
||||
@ -57,8 +57,8 @@ public:
|
||||
/// Creates the Buffer. Length argument specifies the length
|
||||
/// of the supplied memory pointed to by pMem in the number
|
||||
/// of elements of type T. Supplied pointer is considered
|
||||
/// blank and not owned by Buffer, so in this case Buffer
|
||||
/// only acts as a wrapper around externally supplied
|
||||
/// blank and not owned by Buffer, so in this case Buffer
|
||||
/// only acts as a wrapper around externally supplied
|
||||
/// (and lifetime-managed) memory.
|
||||
{
|
||||
}
|
||||
@ -94,8 +94,8 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
Buffer(Buffer&& other) :
|
||||
/// Copy constructor.
|
||||
Buffer(Buffer&& other) noexcept:
|
||||
/// Move constructor.
|
||||
_capacity(other._capacity),
|
||||
_used(other._used),
|
||||
_ptr(other._ptr),
|
||||
@ -119,21 +119,20 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
Buffer& operator = (Buffer&& other)
|
||||
/// Assignment operator.
|
||||
Buffer& operator = (Buffer&& other) noexcept
|
||||
/// Move assignment operator.
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
_capacity = other._capacity;
|
||||
_used = other._used;
|
||||
_ptr = other._ptr;
|
||||
_ownMem = other._ownMem;
|
||||
if (_ownMem) delete [] _ptr;
|
||||
|
||||
other._capacity = 0;
|
||||
other._used = 0;
|
||||
other._ownMem = false;
|
||||
other._ptr = nullptr;
|
||||
}
|
||||
_capacity = other._capacity;
|
||||
_used = other._used;
|
||||
_ptr = other._ptr;
|
||||
_ownMem = other._ownMem;
|
||||
|
||||
other._capacity = 0;
|
||||
other._used = 0;
|
||||
other._ownMem = false;
|
||||
other._ptr = nullptr;
|
||||
|
||||
return *this;
|
||||
}
|
||||
@ -143,15 +142,15 @@ public:
|
||||
{
|
||||
if (_ownMem) delete [] _ptr;
|
||||
}
|
||||
|
||||
|
||||
void resize(std::size_t newCapacity, bool preserveContent = true)
|
||||
/// Resizes the buffer capacity and size. If preserveContent is true,
|
||||
/// the content of the old buffer is copied over to the
|
||||
/// new buffer. The new capacity can be larger or smaller than
|
||||
/// the current one; if it is smaller, capacity will remain intact.
|
||||
/// Size will always be set to the new capacity.
|
||||
///
|
||||
/// Buffers only wrapping externally owned storage can not be
|
||||
///
|
||||
/// Buffers only wrapping externally owned storage can not be
|
||||
/// resized. If resize is attempted on those, IllegalAccessException
|
||||
/// is thrown.
|
||||
{
|
||||
@ -168,19 +167,19 @@ public:
|
||||
_ptr = ptr;
|
||||
_capacity = newCapacity;
|
||||
}
|
||||
|
||||
|
||||
_used = newCapacity;
|
||||
}
|
||||
|
||||
|
||||
void setCapacity(std::size_t newCapacity, bool preserveContent = true)
|
||||
/// Sets the buffer capacity. If preserveContent is true,
|
||||
/// the content of the old buffer is copied over to the
|
||||
/// new buffer. The new capacity can be larger or smaller than
|
||||
/// the current one; size will be set to the new capacity only if
|
||||
/// the current one; size will be set to the new capacity only if
|
||||
/// new capacity is smaller than the current size, otherwise it will
|
||||
/// remain intact.
|
||||
///
|
||||
/// Buffers only wrapping externally owned storage can not be
|
||||
///
|
||||
/// Buffers only wrapping externally owned storage can not be
|
||||
/// resized. If resize is attempted on those, IllegalAccessException
|
||||
/// is thrown.
|
||||
{
|
||||
@ -301,13 +300,13 @@ public:
|
||||
{
|
||||
return _used * sizeof(T);
|
||||
}
|
||||
|
||||
|
||||
T* begin()
|
||||
/// Returns a pointer to the beginning of the buffer.
|
||||
{
|
||||
return _ptr;
|
||||
}
|
||||
|
||||
|
||||
const T* begin() const
|
||||
/// Returns a pointer to the beginning of the buffer.
|
||||
{
|
||||
@ -319,13 +318,13 @@ public:
|
||||
{
|
||||
return _ptr + _used;
|
||||
}
|
||||
|
||||
|
||||
const T* end() const
|
||||
/// Returns a pointer to the end of the buffer.
|
||||
{
|
||||
return _ptr + _used;
|
||||
}
|
||||
|
||||
|
||||
bool empty() const
|
||||
/// Return true if buffer is empty.
|
||||
{
|
||||
@ -335,14 +334,14 @@ public:
|
||||
T& operator [] (std::size_t index)
|
||||
{
|
||||
poco_assert (index < _used);
|
||||
|
||||
|
||||
return _ptr[index];
|
||||
}
|
||||
|
||||
const T& operator [] (std::size_t index) const
|
||||
{
|
||||
poco_assert (index < _used);
|
||||
|
||||
|
||||
return _ptr[index];
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,8 @@ namespace
|
||||
_reactor(reactor),
|
||||
_or(*this, &ClientServiceHandler::onReadable),
|
||||
_ow(*this, &ClientServiceHandler::onWritable),
|
||||
_ot(*this, &ClientServiceHandler::onTimeout)
|
||||
_ot(*this, &ClientServiceHandler::onTimeout),
|
||||
_os(*this, &ClientServiceHandler::onShutdown)
|
||||
{
|
||||
_timeout = false;
|
||||
_readableError = false;
|
||||
@ -102,10 +103,15 @@ namespace
|
||||
checkTimeoutObserverCount(0);
|
||||
_reactor.addEventHandler(_socket, _ot);
|
||||
checkTimeoutObserverCount(1);
|
||||
_reactor.addEventHandler(_socket, _os);
|
||||
}
|
||||
|
||||
~ClientServiceHandler()
|
||||
{
|
||||
_reactor.removeEventHandler(_socket, _or);
|
||||
_reactor.removeEventHandler(_socket, _ow);
|
||||
_reactor.removeEventHandler(_socket, _ot);
|
||||
_reactor.removeEventHandler(_socket, _os);
|
||||
}
|
||||
|
||||
void onReadable(ReadableNotification* pNf)
|
||||
@ -147,23 +153,29 @@ namespace
|
||||
{
|
||||
pNf->release();
|
||||
_timeout = true;
|
||||
if (_closeOnTimeout)
|
||||
if (_closeOnTimeout)
|
||||
{
|
||||
_reactor.stop();
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
void onShutdown(ShutdownNotification* pNf)
|
||||
{
|
||||
pNf->release();
|
||||
delete this;
|
||||
}
|
||||
|
||||
static std::string data()
|
||||
{
|
||||
return _data;
|
||||
}
|
||||
|
||||
|
||||
static void resetData()
|
||||
{
|
||||
_data.clear();
|
||||
}
|
||||
|
||||
|
||||
static bool timeout()
|
||||
{
|
||||
return _timeout;
|
||||
@ -232,6 +244,7 @@ namespace
|
||||
Observer<ClientServiceHandler, ReadableNotification> _or;
|
||||
Observer<ClientServiceHandler, WritableNotification> _ow;
|
||||
Observer<ClientServiceHandler, TimeoutNotification> _ot;
|
||||
Observer<ClientServiceHandler, ShutdownNotification> _os;
|
||||
std::stringstream _str;
|
||||
static std::string _data;
|
||||
static bool _readableError;
|
||||
|
Loading…
x
Reference in New Issue
Block a user