kwave  18.07.70
Kwave::MimeData::Buffer Class Reference
Inheritance diagram for Kwave::MimeData::Buffer:
Inheritance graph
Collaboration diagram for Kwave::MimeData::Buffer:
Collaboration graph

Public Member Functions

 Buffer ()
 
virtual ~Buffer () Q_DECL_OVERRIDE
 
virtual qint64 size () const Q_DECL_OVERRIDE
 
bool mapToByteArray ()
 
const QByteArray & byteArray () const
 
virtual void close () Q_DECL_OVERRIDE
 

Protected Member Functions

virtual qint64 readData (char *data, qint64 maxlen) Q_DECL_OVERRIDE
 
virtual qint64 writeData (const char *data, qint64 len) Q_DECL_OVERRIDE
 

Private Attributes

Kwave::Handle m_block
 
qint64 m_size
 
QByteArray m_data
 

Detailed Description

interal class for buffering huge amounts of mime data with support for swap files (using Kwave::MemoryManager). Used as a "write only" stream, after writing the data can be memory mapped and accessed through a QByteArray.

Definition at line 89 of file MimeData.h.

Constructor & Destructor Documentation

◆ Buffer()

Kwave::MimeData::Buffer::Buffer ( )

Constructor

Definition at line 56 of file MimeData.cpp.

57  :QIODevice(), m_block(0), m_size(0), m_data()
58 {
59 }
Kwave::Handle m_block
Definition: MimeData.h:141

◆ ~Buffer()

Kwave::MimeData::Buffer::~Buffer ( )
virtual

Destructor, closes the buffer

Definition at line 62 of file MimeData.cpp.

References close().

63 {
64  close();
65 }
virtual void close() Q_DECL_OVERRIDE
Definition: MimeData.cpp:153
Here is the call graph for this function:

Member Function Documentation

◆ byteArray()

const QByteArray& Kwave::MimeData::Buffer::byteArray ( ) const
inline

Returns the mapped data as a QByteArray

Definition at line 109 of file MimeData.h.

Referenced by Kwave::MimeData::encode().

109 { return m_data; }
Here is the caller graph for this function:

◆ close()

void Kwave::MimeData::Buffer::close ( )
virtual

Closes the buffer and frees the memory (calling multiple times is allowed)

Definition at line 153 of file MimeData.cpp.

References Kwave::MemoryManager::free(), Kwave::MemoryManager::instance(), m_block, m_data, m_size, and Kwave::MemoryManager::unmap().

Referenced by Kwave::MimeData::clear(), Kwave::MimeData::encode(), and ~Buffer().

154 {
155  QIODevice::close();
156 
157  // reset the byte array and it's connection to the block of memory
158  m_data.setRawData(Q_NULLPTR, 0);
159  m_data.clear();
160 
161  // unmap and discard the mapped memory
162  if (m_block) {
164  mem.unmap(m_block);
165  mem.free(m_block);
166  m_block = 0;
167  }
168  m_size = 0;
169 }
Kwave::Handle m_block
Definition: MimeData.h:141
static MemoryManager & instance() Q_DECL_EXPORT
void free(Kwave::Handle &handle) Q_DECL_EXPORT
void unmap(Kwave::Handle handle) Q_DECL_EXPORT
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mapToByteArray()

bool Kwave::MimeData::Buffer::mapToByteArray ( )

Try to map the memory to a QByteArray

Definition at line 127 of file MimeData.cpp.

References Kwave::MemoryManager::free(), Kwave::MemoryManager::instance(), m_block, m_data, m_size, Kwave::MemoryManager::map(), and Kwave::toUint().

Referenced by Kwave::MimeData::encode().

128 {
129  // reset our QByteArray
130  m_data.setRawData(Q_NULLPTR, 0);
131  m_data.clear();
132 
134  const char *raw = (m_block) ?
135  static_cast<const char *>(mem.map(m_block)) : Q_NULLPTR;
136  if (!raw) {
137  // mapping failed: free the block here to avoid trouble
138  // in close()
139  mem.free(m_block);
140  m_block = 0;
141  qWarning("Kwave::MimeData::Buffer::mapToByteArray() failed");
142  return false; // mmap failed
143  }
144 
145  // attach the mapped memory to our QByteArray
146  const unsigned int len = Kwave::toUint(m_size);
147 // qDebug("Kwave::MimeData::Buffer::mapToByteArray() - %p [%u]", raw, len);
148  m_data.setRawData(raw, len);
149  return true;
150 }
Kwave::Handle m_block
Definition: MimeData.h:141
static MemoryManager & instance() Q_DECL_EXPORT
void free(Kwave::Handle &handle) Q_DECL_EXPORT
void * map(Kwave::Handle handle) Q_DECL_EXPORT
unsigned int toUint(T x)
Definition: Utils.h:109
Here is the call graph for this function:
Here is the caller graph for this function:

◆ readData()

qint64 Kwave::MimeData::Buffer::readData ( char *  data,
qint64  maxlen 
)
protectedvirtual

read a block of data from the buffer

Parameters
databuffer that receives the data
maxlenmaximum number of bytes to read
Returns
number of bytes read or -1 if failed

Definition at line 68 of file MimeData.cpp.

References Kwave::MemoryManager::instance(), m_block, Kwave::MemoryManager::readFrom(), size(), and Kwave::toUint().

69 {
70  if (atEnd() || (pos() >= size())) return -1;
71  if (pos() + maxlen > size())
72  maxlen = size() - pos();
73 
75  return mem.readFrom(
76  m_block,
77  Kwave::toUint(pos()),
78  data,
79  Kwave::toUint(maxlen)
80  );
81 }
int readFrom(Kwave::Handle handle, unsigned int offset, void *buffer, unsigned int length) Q_DECL_EXPORT
Kwave::Handle m_block
Definition: MimeData.h:141
static MemoryManager & instance() Q_DECL_EXPORT
virtual qint64 size() const Q_DECL_OVERRIDE
Definition: MimeData.h:99
unsigned int toUint(T x)
Definition: Utils.h:109
Here is the call graph for this function:

◆ size()

virtual qint64 Kwave::MimeData::Buffer::size ( ) const
inlinevirtual

returns the number of bytes written

Definition at line 99 of file MimeData.h.

Referenced by readData().

99 { return m_size; }
Here is the caller graph for this function:

◆ writeData()

qint64 Kwave::MimeData::Buffer::writeData ( const char *  data,
qint64  len 
)
protectedvirtual

write a block of data, internally increments the buffer size if necessary

Parameters
datapointer to a buffer with data to write
lennumber of bytes to write
Returns
number of bytes written or -1 if failed

Definition at line 84 of file MimeData.cpp.

References Kwave::MemoryManager::allocate(), BUFFER_BLOCK_SIZE, Kwave::MemoryManager::instance(), m_block, m_size, Kwave::MemoryManager::resize(), Kwave::MemoryManager::sizeOf(), and Kwave::MemoryManager::writeTo().

85 {
87  quint64 new_size = pos() + len;
88 
89  // clip the mime data buffer at the "unsigned int" border
90  if (new_size > std::numeric_limits<unsigned int>::max())
91  return -1;
92 
93  // round up the block size if it can no longer be considered to be a
94  // small block (~ half of block size), avoid wasting too much memory
95  // if the needed size is very small.
96  if (new_size > (BUFFER_BLOCK_SIZE / 2))
97  new_size = Kwave::round_up<qint64>(new_size, BUFFER_BLOCK_SIZE);
98 
99  if (!m_block) {
100  // first call: allocate a new memory object
101  m_block = mem.allocate(static_cast<size_t>(new_size));
102  if (!m_block) return -1; // allocation failed
103  }
104 
105  if ((pos() + len) > static_cast<qint64>(mem.sizeOf(m_block))) {
106  if (!mem.resize(m_block, static_cast<size_t>(new_size)))
107  return -1; // resize failed
108  }
109 
110  // write to the memory block (may be physical or swap file)
111  qint64 written = mem.writeTo(
112  m_block,
113  static_cast<unsigned int>(pos()),
114  data,
115  static_cast<unsigned int>(len)
116  );
117  if (written < 0)
118  return -1; // write failed: disk full?
119 
120  if (pos() + written > m_size)
121  m_size = pos() + written ; // push the "m_size"
122 
123  return written; // write operation was successful
124 }
#define BUFFER_BLOCK_SIZE
Definition: MimeData.cpp:53
bool resize(Kwave::Handle handle, size_t size) Q_DECL_EXPORT
size_t sizeOf(Kwave::Handle handle) Q_DECL_EXPORT
Kwave::Handle m_block
Definition: MimeData.h:141
static MemoryManager & instance() Q_DECL_EXPORT
int writeTo(Kwave::Handle handle, unsigned int offset, const void *buffer, unsigned int length) Q_DECL_EXPORT
Kwave::Handle allocate(size_t size) Q_DECL_EXPORT
Here is the call graph for this function:

Member Data Documentation

◆ m_block

Kwave::Handle Kwave::MimeData::Buffer::m_block
private

handle of the block of memory (see MemoryManager)

Definition at line 141 of file MimeData.h.

Referenced by close(), mapToByteArray(), readData(), and writeData().

◆ m_data

QByteArray Kwave::MimeData::Buffer::m_data
private

simple array for storage of the wave data

Definition at line 147 of file MimeData.h.

Referenced by close(), and mapToByteArray().

◆ m_size

qint64 Kwave::MimeData::Buffer::m_size
private

number of total bytes written

Definition at line 144 of file MimeData.h.

Referenced by close(), mapToByteArray(), and writeData().


The documentation for this class was generated from the following files: