|
1
|
1 #include "StdAfx.h"
|
|
|
2
|
|
|
3 #include "stream_buffer_helper.h"
|
|
|
4
|
|
|
5 stream_reader_buffered::stream_reader_buffered(stream_reader * p_base,t_size p_buffer) : m_base(p_base)
|
|
|
6 {
|
|
|
7 m_buffer.set_size_in_range(pfc::min_t<size_t>(1024, p_buffer), p_buffer);
|
|
|
8 m_bufferRemaining = 0;
|
|
|
9 }
|
|
|
10
|
|
|
11 t_size stream_reader_buffered::read(void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
|
|
|
12 if (p_bytes <= m_bufferRemaining) {
|
|
|
13 memcpy( p_buffer, m_bufferPtr, p_bytes );
|
|
|
14 m_bufferRemaining -= p_bytes;
|
|
|
15 m_bufferPtr += p_bytes;
|
|
|
16 return p_bytes;
|
|
|
17 }
|
|
|
18
|
|
|
19 p_abort.check();
|
|
|
20 char * output = (char*) p_buffer;
|
|
|
21 t_size output_ptr = 0;
|
|
|
22
|
|
|
23 while(output_ptr < p_bytes) {
|
|
|
24 {
|
|
|
25 t_size delta = pfc::min_t(p_bytes - output_ptr, m_bufferRemaining);
|
|
|
26 if (delta > 0)
|
|
|
27 {
|
|
|
28 memcpy(output + output_ptr, m_bufferPtr, delta);
|
|
|
29 output_ptr += delta;
|
|
|
30 m_bufferPtr += delta;
|
|
|
31 m_bufferRemaining -= delta;
|
|
|
32 }
|
|
|
33 }
|
|
|
34
|
|
|
35 if (m_bufferRemaining == 0)
|
|
|
36 {
|
|
|
37 t_size bytes_read;
|
|
|
38 bytes_read = m_base->read(m_buffer.get_ptr(), m_buffer.get_size(), p_abort);
|
|
|
39 m_bufferPtr = m_buffer.get_ptr();
|
|
|
40 m_bufferRemaining = bytes_read;
|
|
|
41
|
|
|
42 if (m_bufferRemaining == 0) break;
|
|
|
43 }
|
|
|
44
|
|
|
45 }
|
|
|
46
|
|
|
47 return output_ptr;
|
|
|
48 }
|
|
|
49
|
|
|
50 stream_writer_buffered::stream_writer_buffered(stream_writer * p_base,t_size p_buffer)
|
|
|
51 : m_base(p_base)
|
|
|
52 {
|
|
|
53 m_buffer.set_size_in_range(pfc::min_t<size_t>(1024, p_buffer), p_buffer);
|
|
|
54 m_buffer_ptr = 0;
|
|
|
55 }
|
|
|
56
|
|
|
57 void stream_writer_buffered::write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
|
|
|
58 p_abort.check_e();
|
|
|
59 const char * source = (const char*)p_buffer;
|
|
|
60 t_size source_remaining = p_bytes;
|
|
|
61 const t_size buffer_size = m_buffer.get_size();
|
|
|
62 if (source_remaining >= buffer_size)
|
|
|
63 {
|
|
|
64 flush(p_abort);
|
|
|
65 m_base->write_object(source,source_remaining,p_abort);
|
|
|
66 return;
|
|
|
67 }
|
|
|
68
|
|
|
69 if (m_buffer_ptr + source_remaining >= buffer_size)
|
|
|
70 {
|
|
|
71 t_size delta = buffer_size - m_buffer_ptr;
|
|
|
72 memcpy(m_buffer.get_ptr() + m_buffer_ptr, source,delta);
|
|
|
73 source += delta;
|
|
|
74 source_remaining -= delta;
|
|
|
75 m_buffer_ptr += delta;
|
|
|
76 flush(p_abort);
|
|
|
77 }
|
|
|
78
|
|
|
79 memcpy(m_buffer.get_ptr() + m_buffer_ptr, source,source_remaining);
|
|
|
80 m_buffer_ptr += source_remaining;
|
|
|
81 }
|
|
|
82
|
|
|
83
|
|
|
84 void stream_writer_buffered::flush(abort_callback & p_abort) {
|
|
|
85 if (m_buffer_ptr > 0) {
|
|
|
86 m_base->write_object(m_buffer.get_ptr(),m_buffer_ptr,p_abort);
|
|
|
87 m_buffer_ptr = 0;
|
|
|
88 }
|
|
|
89 }
|