Esempio n. 1
0
    std::string getOpenSslErrors()
    {
        boost::shared_ptr<BIO> bio( BIO_new( BIO_s_mem() ), BIO_free );
        ERR_print_errors(bio.get());
        std::vector<char> buffer(256);
        unsigned int startPos = 0;
        unsigned int bytesRead = 0;
        while (true)
        {
            RCF_ASSERT_GT(buffer.size() , startPos);
           
            int ret = BIO_read(
                bio.get(),
                &buffer[startPos],
                static_cast<int>(buffer.size()-startPos));

            if (ret > 0)
            {
                bytesRead += ret;
            }
            if (bytesRead < buffer.size())
            {
                break;
            }
            startPos = static_cast<unsigned int>(buffer.size());
            buffer.resize( 2*buffer.size() );
        }

        return std::string(&buffer[0], bytesRead);
    }
Esempio n. 2
0
 void DataPtr::terminatebufferwithzero() const
 {
     if (ptr_ && ptr_[length_] != 0)
     {
         RCF_ASSERT_GT(allocatedLength_ , length_);
         ptr_[length_] = 0;
     }
 }
Esempio n. 3
0
    bool FileIoThreadPool::ioTask()
    {
        FileIoRequestPtr opPtr;

        {
            RCF::Lock lock(mOpsMutex);
            while (mOpsQueued.empty() && !mStopFlag)
            {
                mOpsCondition.timed_wait(lock, 1000);
            }
            if (mOpsQueued.empty() || mStopFlag)
            {
                return false;
            }
            RCF_ASSERT_GT(mOpsQueued.size() , 0);
            mOpsInProgress.push_back( mOpsQueued.front() );
            mOpsQueued.pop_front();
            opPtr = mOpsInProgress.back();
        }

        RCF::ThreadInfoPtr threadInfoPtr = RCF::getThreadInfoPtr();
        if (threadInfoPtr)
        {
            threadInfoPtr->notifyBusy();
        }

        // This is the part that blocks.
        opPtr->doTransfer();

        // Unregister op.
        unregisterOp(opPtr);

        // Notify completion.
        {
            RCF::Lock lock(mCompletionMutex);
            opPtr->mCompleted = true;
            mCompletionCondition.notify_all();
        }

        return false;
    }
    void ZlibCompressionWriteFilter::compress()
    {
        mPostBuffers.resize(0);

        // TODO: buffer size
        std::size_t bufferSize = 2*(lengthByteBuffers(mPreBuffers)+7+7);
        std::size_t leftMargin = mPreBuffers.front().getLeftMargin();

        if (mVecPtr.get() == NULL || !mVecPtr.unique())
        {
            mVecPtr.reset( new ReallocBuffer());
        }
        mVecPtr->resize(leftMargin + bufferSize);

        if (leftMargin > 0)
        {
            mPostBuffers.push_back(
                ByteBuffer(
                    &(*mVecPtr)[0] + leftMargin,
                    mVecPtr->size() - leftMargin,
                    leftMargin,
                    mVecPtr));
        }
        else
        {
            mPostBuffers.push_back(
                ByteBuffer(
                    &(*mVecPtr)[0],
                    mVecPtr->size(),
                    mVecPtr));
        }

        ByteBuffer &outBuffer = mPostBuffers.back();
        std::size_t outPos = 0;
        std::size_t outRemaining = outBuffer.getLength() - outPos;
        mTotalBytesIn = 0;
        mTotalBytesOut = 0;

        for (std::size_t i=0; i<mPreBuffers.size(); ++i)
        {
            RCF_ASSERT_LT(outPos , outBuffer.getLength());

            ByteBuffer &inBuffer = mPreBuffers[i];
            mCstream.next_in = (Bytef*) inBuffer.getPtr();
            mCstream.avail_in = static_cast<uInt>(inBuffer.getLength());
            mCstream.next_out = (Bytef*) &outBuffer.getPtr()[outPos];
            mCstream.avail_out = static_cast<uInt>(outRemaining);

            mZerr = (i<mPreBuffers.size()-1) ?
                deflate(&mCstream, Z_NO_FLUSH) :
                deflate(&mCstream, Z_SYNC_FLUSH);

            RCF_VERIFY(
                mZerr == Z_OK || mZerr == Z_BUF_ERROR,
                FilterException(
                    _RcfError_Zlib(), mZerr, RcfSubsystem_Zlib,
                    "deflate() failed"))
                (mZerr)(inBuffer.getLength())(outBuffer.getLength());

            RCF_ASSERT_GTEQ(mCstream.avail_out , 0);

            std::size_t bytesIn = inBuffer.getLength() - mCstream.avail_in;
            std::size_t bytesOut = outRemaining - mCstream.avail_out;
            mTotalBytesIn += bytesIn;
            mTotalBytesOut += bytesOut;
            outPos += bytesOut;
            outRemaining -= bytesOut;
        }

        if (!mStateful)
        {
            mCstream.next_in = NULL;
            mCstream.avail_in = 0;
            mCstream.next_out = (Bytef*) &outBuffer.getPtr()[outPos];
            mCstream.avail_out = static_cast<uInt>(outRemaining);

            mZerr = deflate(&mCstream, Z_FINISH);
            RCF_VERIFY(
                mZerr == Z_BUF_ERROR || mZerr == Z_STREAM_END,
                FilterException(
                    _RcfError_Zlib(), mZerr, RcfSubsystem_Zlib,
                    "deflate() failed"))
                    (mZerr)(outPos)(outRemaining);

            RCF_ASSERT_GT(mCstream.avail_out , 0);

            std::size_t bytesOut = outRemaining - mCstream.avail_out;
            mTotalBytesOut += bytesOut;
            outPos += bytesOut;
            outRemaining -= bytesOut;
        }

        mPreBuffers.resize(0);
        outBuffer = ByteBuffer(outBuffer, 0, mTotalBytesOut);
    }