Botan
1.11.15
|
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 }