aboutsummaryrefslogtreecommitdiffstats
path: root/src/pipe_rw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pipe_rw.cpp')
-rw-r--r--src/pipe_rw.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/pipe_rw.cpp b/src/pipe_rw.cpp
new file mode 100644
index 000000000..8906a0c4d
--- /dev/null
+++ b/src/pipe_rw.cpp
@@ -0,0 +1,164 @@
+/*************************************************
+* Pipe Reading/Writing Source File *
+* (C) 1999-2006 The Botan Project *
+*************************************************/
+
+#include <botan/pipe.h>
+#include <botan/out_buf.h>
+#include <botan/secqueue.h>
+
+namespace Botan {
+
+/*************************************************
+* Look up the canonical ID for a queue *
+*************************************************/
+u32bit Pipe::get_message_no(const std::string& func_name, u32bit msg) const
+ {
+ if(msg == DEFAULT_MESSAGE)
+ msg = default_msg();
+ else if(msg == LAST_MESSAGE)
+ msg = message_count() - 1;
+
+ if(msg >= message_count())
+ throw Invalid_Message_Number(func_name, msg);
+
+ return msg;
+ }
+
+/*************************************************
+* Write into a Pipe *
+*************************************************/
+void Pipe::write(const byte input[], u32bit length)
+ {
+ if(!inside_msg)
+ throw Exception("Cannot write to a Pipe while it is not processing");
+ pipe->write(input, length);
+ }
+
+/*************************************************
+* Write into a Pipe *
+*************************************************/
+void Pipe::write(const MemoryRegion<byte>& input)
+ {
+ write(input.begin(), input.size());
+ }
+
+/*************************************************
+* Write a string into a Pipe *
+*************************************************/
+void Pipe::write(const std::string& str)
+ {
+ write((const byte*)str.c_str(), str.size());
+ }
+
+/*************************************************
+* Write a single byte into a Pipe *
+*************************************************/
+void Pipe::write(byte input)
+ {
+ write(&input, 1);
+ }
+
+/*************************************************
+* Write the contents of a DataSource into a Pipe *
+*************************************************/
+void Pipe::write(DataSource& source)
+ {
+ SecureVector<byte> buffer(DEFAULT_BUFFERSIZE);
+ while(!source.end_of_data())
+ {
+ u32bit got = source.read(buffer, buffer.size());
+ write(buffer, got);
+ }
+ }
+
+/*************************************************
+* Read some data from the pipe *
+*************************************************/
+u32bit Pipe::read(byte output[], u32bit length, u32bit msg)
+ {
+ return outputs->read(output, length, get_message_no("read", msg));
+ }
+
+/*************************************************
+* Read some data from the pipe *
+*************************************************/
+u32bit Pipe::read(byte output[], u32bit length)
+ {
+ return read(output, length, DEFAULT_MESSAGE);
+ }
+
+/*************************************************
+* Read a single byte from the pipe *
+*************************************************/
+u32bit Pipe::read(byte& out, u32bit msg)
+ {
+ return read(&out, 1, msg);
+ }
+
+/*************************************************
+* Return all data in the pipe *
+*************************************************/
+SecureVector<byte> Pipe::read_all(u32bit msg)
+ {
+ msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg());
+ SecureVector<byte> buffer(remaining(msg));
+ read(buffer, buffer.size(), msg);
+ return buffer;
+ }
+
+/*************************************************
+* Return all data in the pipe as a string *
+*************************************************/
+std::string Pipe::read_all_as_string(u32bit msg)
+ {
+ msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg());
+ SecureVector<byte> buffer(DEFAULT_BUFFERSIZE);
+ std::string str;
+ str.reserve(remaining(msg));
+
+ while(true)
+ {
+ u32bit got = read(buffer, buffer.size(), msg);
+ if(got == 0)
+ break;
+ str.append((const char*)buffer.begin(), got);
+ }
+
+ return str;
+ }
+
+/*************************************************
+* Find out how many bytes are ready to read *
+*************************************************/
+u32bit Pipe::remaining(u32bit msg) const
+ {
+ return outputs->remaining(get_message_no("remaining", msg));
+ }
+
+/*************************************************
+* Peek at some data in the pipe *
+*************************************************/
+u32bit Pipe::peek(byte output[], u32bit length,
+ u32bit offset, u32bit msg) const
+ {
+ return outputs->peek(output, length, offset, get_message_no("peek", msg));
+ }
+
+/*************************************************
+* Peek at some data in the pipe *
+*************************************************/
+u32bit Pipe::peek(byte output[], u32bit length, u32bit offset) const
+ {
+ return peek(output, length, offset, DEFAULT_MESSAGE);
+ }
+
+/*************************************************
+* Peek at a byte in the pipe *
+*************************************************/
+u32bit Pipe::peek(byte& out, u32bit offset, u32bit msg) const
+ {
+ return peek(&out, 1, offset, msg);
+ }
+
+}