added methods to buffer elements

This commit is contained in:
Martchus 2015-11-26 14:26:16 +01:00
parent 38d3fd991e
commit 238ca0cef9
1 changed files with 33 additions and 2 deletions

View File

@ -7,6 +7,7 @@
#include <c++utilities/conversion/types.h>
#include <c++utilities/io/copy.h>
#include <c++utilities/misc/memory.h>
#include <list>
#include <initializer_list>
@ -27,7 +28,6 @@ namespace Media {
template <class ImplementationType>
class GenericFileElement;
/*!
* \class Media::FileElementIterator
* \brief The FileElementIterator class helps iterating through the childs of a FileElement.
@ -191,6 +191,10 @@ public:
void copyHeader(std::ostream &targetStream);
void copyWithoutChilds(std::ostream &targetStream);
void copyEntirely(std::ostream &targetStream);
void makeBuffer();
void releaseBuffer();
void copyBuffer(std::ostream &targetStream);
const std::unique_ptr<char[]> &buffer();
implementationType *denoteFirstChild(uint32 offset);
protected:
@ -202,6 +206,7 @@ protected:
implementationType* m_parent;
std::unique_ptr<implementationType> m_nextSibling;
std::unique_ptr<implementationType> m_firstChild;
std::unique_ptr<char[]> m_buffer;
private:
void copyInternal(std::ostream &targetStream, uint64 startOffset, uint64 bytesToCopy);
@ -767,7 +772,7 @@ void GenericFileElement<ImplementationType>::validateSubsequentElementStructure(
parse();
gatheredNotifications.insert(gatheredNotifications.end(), notifications().begin(), notifications().end());
if(firstChild()) { // element is parent
firstChild()->validateSubsequentElementStructure(gatheredNotifications);
firstChild()->validateSubsequentElementStructure(gatheredNotifications, paddingSize);
} else if(paddingSize && isPadding()) { // element is padding
*paddingSize += totalSize();
}
@ -811,6 +816,32 @@ void GenericFileElement<ImplementationType>::copyEntirely(std::ostream &targetSt
copyInternal(targetStream, startOffset(), totalSize());
}
template <class ImplementationType>
void GenericFileElement<ImplementationType>::makeBuffer()
{
m_buffer = std::make_unique<char[]>(totalSize());
container().stream().seekg(startOffset());
container().stream().read(m_buffer.get(), totalSize());
}
template <class ImplementationType>
inline void GenericFileElement<ImplementationType>::releaseBuffer()
{
m_buffer.release();
}
template <class ImplementationType>
inline void GenericFileElement<ImplementationType>::copyBuffer(std::ostream &targetStream)
{
targetStream.write(m_buffer.get(), totalSize());
}
template <class ImplementationType>
inline const std::unique_ptr<char[]> &GenericFileElement<ImplementationType>::buffer()
{
return m_buffer;
}
/*!
* \brief Internally used to perform copies of the atom.
*