Botan  1.11.15
src/lib/filters/out_buf.cpp
Go to the documentation of this file.
00001 /*
00002 * Pipe Output Buffer
00003 * (C) 1999-2007,2011 Jack Lloyd
00004 *     2012 Markus Wanner
00005 *
00006 * Botan is released under the Simplified BSD License (see license.txt)
00007 */
00008 
00009 #include <botan/internal/out_buf.h>
00010 #include <botan/secqueue.h>
00011 
00012 namespace Botan {
00013 
00014 /*
00015 * Read data from a message
00016 */
00017 size_t Output_Buffers::read(byte output[], size_t length,
00018                             Pipe::message_id msg)
00019    {
00020    SecureQueue* q = get(msg);
00021    if(q)
00022       return q->read(output, length);
00023    return 0;
00024    }
00025 
00026 /*
00027 * Peek at data in a message
00028 */
00029 size_t Output_Buffers::peek(byte output[], size_t length,
00030                             size_t stream_offset,
00031                             Pipe::message_id msg) const
00032    {
00033    SecureQueue* q = get(msg);
00034    if(q)
00035       return q->peek(output, length, stream_offset);
00036    return 0;
00037    }
00038 
00039 /*
00040 * Check available bytes in a message
00041 */
00042 size_t Output_Buffers::remaining(Pipe::message_id msg) const
00043    {
00044    SecureQueue* q = get(msg);
00045    if(q)
00046       return q->size();
00047    return 0;
00048    }
00049 
00050 /*
00051 * Return the total bytes of a message that have already been read.
00052 */
00053 size_t Output_Buffers::get_bytes_read(Pipe::message_id msg) const
00054    {
00055    SecureQueue* q = get(msg);
00056    if (q)
00057       return q->get_bytes_read();
00058    return 0;
00059    }
00060 
00061 /*
00062 * Add a new output queue
00063 */
00064 void Output_Buffers::add(SecureQueue* queue)
00065    {
00066    BOTAN_ASSERT(queue, "queue was provided");
00067 
00068    BOTAN_ASSERT(buffers.size() < buffers.max_size(),
00069                 "Room was available in container");
00070 
00071    buffers.push_back(queue);
00072    }
00073 
00074 /*
00075 * Retire old output queues
00076 */
00077 void Output_Buffers::retire()
00078    {
00079    for(size_t i = 0; i != buffers.size(); ++i)
00080       if(buffers[i] && buffers[i]->size() == 0)
00081          {
00082          delete buffers[i];
00083          buffers[i] = nullptr;
00084          }
00085 
00086    while(buffers.size() && !buffers[0])
00087       {
00088       buffers.pop_front();
00089       offset = offset + Pipe::message_id(1);
00090       }
00091    }
00092 
00093 /*
00094 * Get a particular output queue
00095 */
00096 SecureQueue* Output_Buffers::get(Pipe::message_id msg) const
00097    {
00098    if(msg < offset)
00099       return nullptr;
00100 
00101    BOTAN_ASSERT(msg < message_count(), "Message number is in range");
00102 
00103    return buffers[msg-offset];
00104    }
00105 
00106 /*
00107 * Return the total number of messages
00108 */
00109 Pipe::message_id Output_Buffers::message_count() const
00110    {
00111    return (offset + buffers.size());
00112    }
00113 
00114 /*
00115 * Output_Buffers Constructor
00116 */
00117 Output_Buffers::Output_Buffers()
00118    {
00119    offset = 0;
00120    }
00121 
00122 /*
00123 * Output_Buffers Destructor
00124 */
00125 Output_Buffers::~Output_Buffers()
00126    {
00127    for(size_t j = 0; j != buffers.size(); ++j)
00128       delete buffers[j];
00129    }
00130 
00131 }