cosmetics: use spaces instead of tab characters; remove trailing whitespace

This commit is contained in:
Moritz Bunkus 2014-12-19 00:03:49 +01:00
parent dc9a431375
commit 34554928aa
51 changed files with 3140 additions and 3140 deletions

View File

@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id: Debug.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id: Debug.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#ifndef LIBEBML_DEBUG_H
#define LIBEBML_DEBUG_H
@ -55,50 +55,50 @@ static const int MAX_PREFIX_LENGTH = 128;
#if defined(LIBEBML_DEBUG)
// define the working debugging class
class EBML_DLL_API ADbg
class EBML_DLL_API ADbg
{
public:
ADbg(int level = 0);
virtual ~ADbg();
ADbg(int level = 0);
virtual ~ADbg();
/// \todo make an inline function to test the level first and the process
int OutPut(int level, const char * format,...) const;
/// \todo make an inline function to test the level first and the process
int OutPut(int level, const char * format,...) const;
int OutPut(const char * format,...) const;
int OutPut(const char * format,...) const;
inline int setLevel(const int level) {
return my_level = level;
}
inline int setLevel(const int level) {
return my_level = level;
}
inline bool setIncludeTime(const bool included = true) {
return my_time_included = included;
}
inline bool setIncludeTime(const bool included = true) {
return my_time_included = included;
}
bool setDebugFile(const char * NewFilename);
bool unsetDebugFile();
bool setDebugFile(const char * NewFilename);
bool unsetDebugFile();
inline bool setUseFile(const bool usefile = true) {
return my_use_file = usefile;
}
inline bool setUseFile(const bool usefile = true) {
return my_use_file = usefile;
}
inline const char * setPrefix(const char * string) {
return strncpy(prefix, string, MAX_PREFIX_LENGTH);
}
inline const char * setPrefix(const char * string) {
return strncpy(prefix, string, MAX_PREFIX_LENGTH);
}
private:
int my_level;
bool my_time_included;
bool my_use_file;
bool my_debug_output;
int my_level;
bool my_time_included;
bool my_use_file;
bool my_debug_output;
int _OutPut(const char * format,va_list params) const;
int _OutPut(const char * format,va_list params) const;
char prefix[MAX_PREFIX_LENGTH];
char prefix[MAX_PREFIX_LENGTH];
#ifdef WIN32
HANDLE hFile;
HANDLE hFile;
#else
FILE *hFile;
FILE *hFile;
#endif // WIN32
};
@ -109,40 +109,40 @@ private:
class EBML_DLL_API ADbg
{
public:
ADbg(int /* level */ = 0){}
virtual ~ADbg() {}
ADbg(int /* level */ = 0){}
virtual ~ADbg() {}
inline int OutPut(int /* level */, const char * /* format */,...) const {
return 0;
}
inline int OutPut(int /* level */, const char * /* format */,...) const {
return 0;
}
inline int OutPut(const char * /* format */,...) const {
return 0;
}
inline int OutPut(const char * /* format */,...) const {
return 0;
}
inline int setLevel(const int level) {
return level;
}
inline int setLevel(const int level) {
return level;
}
inline bool setIncludeTime(const bool /* included */ = true) {
return true;
}
inline bool setIncludeTime(const bool /* included */ = true) {
return true;
}
inline bool setDebugFile(const char * /* NewFilename */) {
return true;
}
inline bool setDebugFile(const char * /* NewFilename */) {
return true;
}
inline bool unsetDebugFile() {
return true;
}
inline bool unsetDebugFile() {
return true;
}
inline bool setUseFile(const bool /* usefile */ = true) {
return true;
}
inline bool setUseFile(const bool /* usefile */ = true) {
return true;
}
inline const char * setPrefix(const char * string) {
return string;
}
inline const char * setPrefix(const char * string) {
return string;
}
};
#endif // defined(LIBEBML_DEBUG)

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
*/
#ifndef LIBEBML_BINARY_H
#define LIBEBML_BINARY_H
@ -54,51 +54,51 @@ START_LIBEBML_NAMESPACE
\class EbmlBinary
\brief Handle all operations on an EBML element that contains "unknown" binary data
\todo handle fix sized elements (like UID of CodecID)
\todo handle fix sized elements (like UID of CodecID)
*/
class EBML_DLL_API EbmlBinary : public EbmlElement {
public:
EbmlBinary();
EbmlBinary(const EbmlBinary & ElementToClone);
virtual ~EbmlBinary(void);
virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() < 0x7FFFFFFF;} // we don't mind about what's inside
public:
EbmlBinary();
EbmlBinary(const EbmlBinary & ElementToClone);
virtual ~EbmlBinary(void);
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
void SetBuffer(const binary *Buffer, const uint32 BufferSize) {
Data = (binary *) Buffer;
SetSize_(BufferSize);
SetValueIsSet();
}
virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() < 0x7FFFFFFF;} // we don't mind about what's inside
binary *GetBuffer() const {return Data;}
void CopyBuffer(const binary *Buffer, const uint32 BufferSize) {
if (Data != NULL)
free(Data);
Data = (binary *)malloc(BufferSize * sizeof(binary));
memcpy(Data, Buffer, BufferSize);
SetSize_(BufferSize);
SetValueIsSet();
}
operator const binary &() const;
bool IsDefaultValue() const {
return false;
}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
bool operator==(const EbmlBinary & ElementToCompare) const;
void SetBuffer(const binary *Buffer, const uint32 BufferSize) {
Data = (binary *) Buffer;
SetSize_(BufferSize);
SetValueIsSet();
}
binary *GetBuffer() const {return Data;}
void CopyBuffer(const binary *Buffer, const uint32 BufferSize) {
if (Data != NULL)
free(Data);
Data = (binary *)malloc(BufferSize * sizeof(binary));
memcpy(Data, Buffer, BufferSize);
SetSize_(BufferSize);
SetValueIsSet();
}
operator const binary &() const;
bool IsDefaultValue() const {
return false;
}
bool operator==(const EbmlBinary & ElementToCompare) const;
#if defined(EBML_STRICT_API)
private:
private:
#else
protected:
protected:
#endif
binary *Data; // the binary data inside the element
binary *Data; // the binary data inside the element
};
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,10 +27,10 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlConfig.h 1241 2006-01-25 00:59:45Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id: EbmlConfig.h 1241 2006-01-25 00:59:45Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#ifndef LIBEBML_CONFIG_H

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlContexts.h 736 2004-08-28 14:05:09Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlContexts.h 736 2004-08-28 14:05:09Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_CONTEXTS_H
#define LIBEBML_CONTEXTS_H
@ -51,10 +51,10 @@ extern const EbmlSemanticContext EBML_DLL_API EDocTypeVersion_Context;
extern const EbmlSemanticContext EBML_DLL_API EDocTypeReadVersion_Context;
#define Context_EbmlHead EbmlHead_Context
// global elements
extern const EbmlSemanticContext EBML_DLL_API & GetEbmlGlobal_Context();
END_LIBEBML_NAMESPACE
#endif // LIBEBML_CONTEXTS_H

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
*/
#ifndef LIBEBML_CRC32_H
#define LIBEBML_CRC32_H
@ -45,58 +45,58 @@
START_LIBEBML_NAMESPACE
DECLARE_EBML_BINARY(EbmlCrc32)
public:
EbmlCrc32(const EbmlCrc32 & ElementToClone);
virtual bool ValidateSize() const {return IsFiniteSize() && (GetSize() == 4);}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
// filepos_t UpdateSize(bool bWithDefault = false);
bool IsDefaultValue() const {
return false;
}
public:
EbmlCrc32(const EbmlCrc32 & ElementToClone);
virtual bool ValidateSize() const {return IsFiniteSize() && (GetSize() == 4);}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
// filepos_t UpdateSize(bool bWithDefault = false);
void AddElementCRC32(EbmlElement &ElementToCRC);
bool CheckElementCRC32(EbmlElement &ElementToCRC);
/*!
Use this to quickly check a CRC32 with some data
\return True if inputCRC matches CRC32 generated from input data
*/
static bool CheckCRC(uint32 inputCRC, const binary *input, uint32 length);
/*!
Calls Update() and Finalize(), use to create a CRC32 in one go
*/
void FillCRC32(const binary *input, uint32 length);
/*!
Add data to the CRC table, in other words process some data bit by bit
*/
void Update(const binary *input, uint32 length);
/*!
Use this with Update() to Finalize() or Complete the CRC32
*/
void Finalize();
/*!
Returns a uint32 that has the value of the CRC32
*/
uint32 GetCrc32() const {
return m_crc_final;
};
void ForceCrc32(uint32 NewValue) { m_crc_final = NewValue; SetValueIsSet();}
bool IsDefaultValue() const {
return false;
}
void AddElementCRC32(EbmlElement &ElementToCRC);
bool CheckElementCRC32(EbmlElement &ElementToCRC);
/*!
Use this to quickly check a CRC32 with some data
\return True if inputCRC matches CRC32 generated from input data
*/
static bool CheckCRC(uint32 inputCRC, const binary *input, uint32 length);
/*!
Calls Update() and Finalize(), use to create a CRC32 in one go
*/
void FillCRC32(const binary *input, uint32 length);
/*!
Add data to the CRC table, in other words process some data bit by bit
*/
void Update(const binary *input, uint32 length);
/*!
Use this with Update() to Finalize() or Complete the CRC32
*/
void Finalize();
/*!
Returns a uint32 that has the value of the CRC32
*/
uint32 GetCrc32() const {
return m_crc_final;
};
void ForceCrc32(uint32 NewValue) { m_crc_final = NewValue; SetValueIsSet();}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
void ResetCRC();
void UpdateByte(binary b);
void ResetCRC();
void UpdateByte(binary b);
static const uint32 m_tab[256];
uint32 m_crc;
uint32 m_crc_final;
static const uint32 m_tab[256];
uint32 m_crc;
uint32 m_crc_final;
EBML_CONCRETE_CLASS(EbmlCrc32)
};
@ -104,36 +104,36 @@ template <class T>
inline unsigned int GetAlignment(T */* dummy */=NULL) // VC60 workaround
{
#if defined(_MSC_VER) && (_MSC_VER >= 1300)
return __alignof(T);
return __alignof(T);
#elif defined(__GNUC__)
return __alignof__(T);
return __alignof__(T);
#else
return sizeof(T);
return sizeof(T);
#endif
}
template <class T>
inline bool IsPowerOf2(T n)
{
return n > 0 && (n & (n-1)) == 0;
return n > 0 && (n & (n-1)) == 0;
}
template <class T1, class T2>
inline T2 ModPowerOf2(T1 a, T2 b)
{
assert(IsPowerOf2(b));
return T2(a) & (b-1);
assert(IsPowerOf2(b));
return T2(a) & (b-1);
}
inline bool IsAlignedOn(const void *p, unsigned int alignment)
{
return IsPowerOf2(alignment) ? ModPowerOf2((uintptr_t)p, alignment) == 0 : (uintptr_t)p % alignment == 0;
return IsPowerOf2(alignment) ? ModPowerOf2((uintptr_t)p, alignment) == 0 : (uintptr_t)p % alignment == 0;
}
template <class T>
inline bool IsAligned(const void *p, T */* dummy */=NULL) // VC60 workaround
inline bool IsAligned(const void *p, T */* dummy */=NULL) // VC60 workaround
{
return IsAlignedOn(p, GetAlignment<T>());
return IsAlignedOn(p, GetAlignment<T>());
}
END_LIBEBML_NAMESPACE

View File

@ -27,9 +27,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_DATE_H
#define LIBEBML_DATE_H
@ -44,55 +44,55 @@ START_LIBEBML_NAMESPACE
\brief Handle all operations related to an EBML date
*/
class EBML_DLL_API EbmlDate : public EbmlElement {
public:
EbmlDate() :EbmlElement(8, false), myDate(0) {}
EbmlDate(const EbmlDate & ElementToClone);
public:
EbmlDate() :EbmlElement(8, false), myDate(0) {}
EbmlDate(const EbmlDate & ElementToClone);
/*!
\brief set the date with a UNIX/C/EPOCH form
\param NewDate UNIX/C date in UTC (no timezone)
*/
void SetEpochDate(int64 NewDate) {myDate = (NewDate - UnixEpochDelay) * 1000000000; SetValueIsSet();}
/*!
\brief set the date with a UNIX/C/EPOCH form
\param NewDate UNIX/C date in UTC (no timezone)
*/
void SetEpochDate(int64 NewDate) {myDate = (NewDate - UnixEpochDelay) * 1000000000; SetValueIsSet();}
EbmlDate &SetValue(int64 NewValue) {SetEpochDate(NewValue); return *this;}
/*!
\brief get the date with a UNIX/C/EPOCH form
\note the date is in UTC (no timezone)
*/
int64 GetEpochDate() const {return int64(myDate/1000000000 + UnixEpochDelay);}
/*!
\brief get the date with a UNIX/C/EPOCH form
\note the date is in UTC (no timezone)
*/
int64 GetEpochDate() const {return int64(myDate/1000000000 + UnixEpochDelay);}
int64 GetValue() const {return GetEpochDate();}
virtual bool ValidateSize() const {return IsFiniteSize() && ((GetSize() == 8) || (GetSize() == 0));}
virtual bool ValidateSize() const {return IsFiniteSize() && ((GetSize() == 8) || (GetSize() == 0));}
/*!
\note no Default date handled
*/
filepos_t UpdateSize(bool /* bWithDefault = false */, bool /* bForceRender = false */) {
if(!ValueIsSet())
SetSize_(0);
else
SetSize_(8);
return GetSize();
}
/*!
\note no Default date handled
*/
filepos_t UpdateSize(bool /* bWithDefault = false */, bool /* bForceRender = false */) {
if(!ValueIsSet())
SetSize_(0);
else
SetSize_(8);
return GetSize();
}
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
bool IsDefaultValue() const {
return false;
}
bool IsDefaultValue() const {
return false;
}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
int64 myDate; ///< internal format of the date
int64 myDate; ///< internal format of the date
static const uint64 UnixEpochDelay;
static const uint64 UnixEpochDelay;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_DUMMY_H
#define LIBEBML_DUMMY_H
@ -41,13 +41,13 @@
START_LIBEBML_NAMESPACE
class EBML_DLL_API EbmlDummy : public EbmlBinary {
public:
EbmlDummy() :DummyId(DummyRawId) {}
EbmlDummy(const EbmlId & aId) :EbmlBinary(), DummyId(aId) {}
EbmlDummy(const EbmlDummy & ElementToClone):EbmlBinary(ElementToClone), DummyId(ElementToClone.DummyId) {}
public:
EbmlDummy() :DummyId(DummyRawId) {}
EbmlDummy(const EbmlId & aId) :EbmlBinary(), DummyId(aId) {}
EbmlDummy(const EbmlDummy & ElementToClone):EbmlBinary(ElementToClone), DummyId(ElementToClone.DummyId) {}
bool IsDummy() const {return true;}
bool IsDefaultValue() const {return true;}
bool IsDummy() const {return true;}
bool IsDefaultValue() const {return true;}
virtual operator const EbmlId &() const {
return DummyId;
@ -58,8 +58,8 @@ class EBML_DLL_API EbmlDummy : public EbmlBinary {
#else
protected:
#endif
const EbmlId DummyId;
static const EbmlId DummyRawId;
const EbmlId DummyId;
static const EbmlId DummyRawId;
EBML_CONCRETE_DUMMY_CLASS(EbmlDummy)
};

View File

@ -27,9 +27,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_ELEMENT_H
#define LIBEBML_ELEMENT_H
@ -41,36 +41,36 @@
START_LIBEBML_NAMESPACE
/*!
\brief The size of the EBML-coded length
\brief The size of the EBML-coded length
*/
int EBML_DLL_API CodedSizeLength(uint64 Length, unsigned int SizeLength, bool bSizeIsFinite = true);
/*!
\brief The coded value of the EBML-coded length
\note The size of OutBuffer must be 8 octets at least
\brief The coded value of the EBML-coded length
\note The size of OutBuffer must be 8 octets at least
*/
int EBML_DLL_API CodedValueLength(uint64 Length, int CodedSize, binary * OutBuffer);
/*!
\brief Read an EBML-coded value from a buffer
\return the value read
\brief Read an EBML-coded value from a buffer
\return the value read
*/
uint64 EBML_DLL_API ReadCodedSizeValue(const binary * InBuffer, uint32 & BufferSize, uint64 & SizeUnknown);
/*!
\brief The size of the EBML-coded signed length
\brief The size of the EBML-coded signed length
*/
int EBML_DLL_API CodedSizeLengthSigned(int64 Length, unsigned int SizeLength);
/*!
\brief The coded value of the EBML-coded signed length
\note the size of OutBuffer must be 8 octets at least
\brief The coded value of the EBML-coded signed length
\note the size of OutBuffer must be 8 octets at least
*/
int EBML_DLL_API CodedValueLengthSigned(int64 Length, int CodedSize, binary * OutBuffer);
/*!
\brief Read a signed EBML-coded value from a buffer
\return the value read
\brief Read a signed EBML-coded value from a buffer
\return the value read
*/
int64 EBML_DLL_API ReadCodedSizeSignedValue(const binary * InBuffer, uint32 & BufferSize, uint64 & SizeUnknown);
@ -176,25 +176,25 @@ extern const EbmlSemanticContext Context_EbmlGlobal;
public: \
virtual const EbmlSemanticContext &Context() const {return ClassInfos.GetContext();} \
virtual const char *DebugName() const {return ClassInfos.GetName();} \
virtual operator const EbmlId &() const {return ClassInfos.ClassId();} \
virtual operator const EbmlId &() const {return ClassInfos.ClassId();} \
virtual EbmlElement & CreateElement() const {return Create();} \
virtual EbmlElement * Clone() const { return new Type(*this); } \
static EbmlElement & Create() {return *(new Type);} \
static EbmlElement & Create() {return *(new Type);} \
static const EbmlCallbacks & ClassInfo() {return ClassInfos;} \
static const EbmlId & ClassId() {return ClassInfos.ClassId();} \
private: \
static const EbmlCallbacks ClassInfos; \
static const EbmlCallbacks ClassInfos; \
#define EBML_CONCRETE_DUMMY_CLASS(Type) \
public: \
virtual const EbmlSemanticContext &Context() const {return *static_cast<EbmlSemanticContext*>(NULL);} \
virtual const char *DebugName() const {return "DummyElement";} \
virtual operator const EbmlId &(); \
virtual operator const EbmlId &(); \
virtual EbmlElement & CreateElement() const {return Create();} \
virtual EbmlElement * Clone() const { return new Type(*this); } \
static EbmlElement & Create() {return *(new Type);} \
static EbmlElement & Create() {return *(new Type);} \
static const EbmlId & ClassId(); \
static const EbmlCallbacks ClassInfos; \
static const EbmlCallbacks ClassInfos; \
#define EBML_INFO(ref) ref::ClassInfo()
@ -223,21 +223,21 @@ extern const EbmlSemanticContext Context_EbmlGlobal;
#else
#define EBML_CONCRETE_CLASS(Type) \
public: \
virtual const EbmlCallbacks & Generic() const {return ClassInfos;} \
virtual operator const EbmlId &() const {return ClassInfos.GlobalId;} \
virtual const EbmlCallbacks & Generic() const {return ClassInfos;} \
virtual operator const EbmlId &() const {return ClassInfos.GlobalId;} \
virtual EbmlElement & CreateElement() const {return Create();} \
virtual EbmlElement * Clone() const { return new Type(*this); } \
static EbmlElement & Create() {return *(new Type);} \
static const EbmlCallbacks ClassInfos; \
static EbmlElement & Create() {return *(new Type);} \
static const EbmlCallbacks ClassInfos; \
#define EBML_CONCRETE_DUMMY_CLASS(Type) \
public: \
virtual const EbmlCallbacks & Generic() const {return ClassInfos;} \
virtual operator const EbmlId &(); \
virtual const EbmlCallbacks & Generic() const {return ClassInfos;} \
virtual operator const EbmlId &(); \
virtual EbmlElement & CreateElement() const {return Create();} \
virtual EbmlElement * Clone() const { return new Type(*this); } \
static EbmlElement & Create() {return *(new Type);} \
static const EbmlCallbacks ClassInfos; \
static EbmlElement & Create() {return *(new Type);} \
static const EbmlCallbacks ClassInfos; \
#define EBML_INFO(ref) ref::ClassInfos
@ -282,11 +282,11 @@ extern const EbmlSemanticContext Context_EbmlGlobal;
// functions for generic handling of data (should be static to all classes)
/*!
\todo Handle default value
\todo Handle default value
*/
class EBML_DLL_API EbmlCallbacks {
public:
EbmlCallbacks(EbmlElement & (*Creator)(), const EbmlId & aGlobalId, const char * aDebugName, const EbmlSemanticContext & aContext);
public:
EbmlCallbacks(EbmlElement & (*Creator)(), const EbmlId & aGlobalId, const char * aDebugName, const EbmlSemanticContext & aContext);
inline const EbmlId & ClassId() const { return GlobalId; }
inline const EbmlSemanticContext & GetContext() const { return Context; }
@ -296,20 +296,20 @@ class EBML_DLL_API EbmlCallbacks {
#if defined(EBML_STRICT_API)
private:
#endif
EbmlElement & (*Create)();
const EbmlId & GlobalId;
const char * DebugName;
const EbmlSemanticContext & Context;
EbmlElement & (*Create)();
const EbmlId & GlobalId;
const char * DebugName;
const EbmlSemanticContext & Context;
};
/*!
\brief contains the semantic informations for a given level and all sublevels
\todo move the ID in the element class
\brief contains the semantic informations for a given level and all sublevels
\todo move the ID in the element class
*/
class EBML_DLL_API EbmlSemantic {
public:
EbmlSemantic(bool aMandatory, bool aUnique, const EbmlCallbacks & aGetCallbacks)
:Mandatory(aMandatory), Unique(aUnique), GetCallbacks(aGetCallbacks) {}
public:
EbmlSemantic(bool aMandatory, bool aUnique, const EbmlCallbacks & aGetCallbacks)
:Mandatory(aMandatory), Unique(aUnique), GetCallbacks(aGetCallbacks) {}
inline bool IsMandatory() const { return Mandatory; }
inline bool IsUnique() const { return Unique; }
@ -319,172 +319,172 @@ class EBML_DLL_API EbmlSemantic {
#if defined(EBML_STRICT_API)
private:
#endif
bool Mandatory; ///< wether the element is mandatory in the context or not
bool Unique;
const EbmlCallbacks & GetCallbacks;
bool Mandatory; ///< wether the element is mandatory in the context or not
bool Unique;
const EbmlCallbacks & GetCallbacks;
};
typedef const class EbmlSemanticContext & (*_GetSemanticContext)();
/*!
Context of the element
\todo allow more than one parent ?
Context of the element
\todo allow more than one parent ?
*/
class EBML_DLL_API EbmlSemanticContext {
public:
EbmlSemanticContext(size_t aSize,
const EbmlSemantic *aMyTable,
const EbmlSemanticContext *aUpTable,
const _GetSemanticContext aGetGlobalContext,
const EbmlCallbacks *aMasterElt)
: GetGlobalContext(aGetGlobalContext), MyTable(aMyTable), Size(aSize),
UpTable(aUpTable), MasterElt(aMasterElt) {}
public:
EbmlSemanticContext(size_t aSize,
const EbmlSemantic *aMyTable,
const EbmlSemanticContext *aUpTable,
const _GetSemanticContext aGetGlobalContext,
const EbmlCallbacks *aMasterElt)
: GetGlobalContext(aGetGlobalContext), MyTable(aMyTable), Size(aSize),
UpTable(aUpTable), MasterElt(aMasterElt) {}
bool operator!=(const EbmlSemanticContext & aElt) const {
return ((Size != aElt.Size) || (MyTable != aElt.MyTable) ||
(UpTable != aElt.UpTable) || (GetGlobalContext != aElt.GetGlobalContext) |
(MasterElt != aElt.MasterElt));
}
bool operator!=(const EbmlSemanticContext & aElt) const {
return ((Size != aElt.Size) || (MyTable != aElt.MyTable) ||
(UpTable != aElt.UpTable) || (GetGlobalContext != aElt.GetGlobalContext) |
(MasterElt != aElt.MasterElt));
}
inline size_t GetSize() const { return Size; }
inline const EbmlCallbacks* GetMaster() const { return MasterElt; }
inline const EbmlSemanticContext* Parent() const { return UpTable; }
const EbmlSemantic & GetSemantic(size_t i) const;
const _GetSemanticContext GetGlobalContext; ///< global elements supported at this level
const _GetSemanticContext GetGlobalContext; ///< global elements supported at this level
#if defined(EBML_STRICT_API)
private:
#endif
const EbmlSemantic *MyTable; ///< First element in the table
size_t Size; ///< number of elements in the table
const EbmlSemanticContext *UpTable; ///< Parent element
/// \todo replace with the global context directly
const EbmlCallbacks *MasterElt;
size_t Size; ///< number of elements in the table
const EbmlSemanticContext *UpTable; ///< Parent element
/// \todo replace with the global context directly
const EbmlCallbacks *MasterElt;
};
/*!
\class EbmlElement
\brief Hold basic informations about an EBML element (ID + length)
\class EbmlElement
\brief Hold basic informations about an EBML element (ID + length)
*/
class EBML_DLL_API EbmlElement {
public:
EbmlElement(uint64 aDefaultSize, bool bValueSet = false);
virtual ~EbmlElement();
public:
EbmlElement(uint64 aDefaultSize, bool bValueSet = false);
virtual ~EbmlElement();
/// Set the minimum length that will be used to write the element size (-1 = optimal)
void SetSizeLength(int NewSizeLength) {SizeLength = NewSizeLength;}
int GetSizeLength() const {return SizeLength;}
/// Set the minimum length that will be used to write the element size (-1 = optimal)
void SetSizeLength(int NewSizeLength) {SizeLength = NewSizeLength;}
int GetSizeLength() const {return SizeLength;}
static EbmlElement * FindNextElement(IOCallback & DataStream, const EbmlSemanticContext & Context, int & UpperLevel, uint64 MaxDataSize, bool AllowDummyElt, unsigned int MaxLowerLevel = 1);
static EbmlElement * FindNextID(IOCallback & DataStream, const EbmlCallbacks & ClassInfos, uint64 MaxDataSize);
static EbmlElement * FindNextElement(IOCallback & DataStream, const EbmlSemanticContext & Context, int & UpperLevel, uint64 MaxDataSize, bool AllowDummyElt, unsigned int MaxLowerLevel = 1);
static EbmlElement * FindNextID(IOCallback & DataStream, const EbmlCallbacks & ClassInfos, uint64 MaxDataSize);
/*!
\brief find the next element with the same ID
*/
EbmlElement * FindNext(IOCallback & DataStream, uint64 MaxDataSize);
/*!
\brief find the next element with the same ID
*/
EbmlElement * FindNext(IOCallback & DataStream, uint64 MaxDataSize);
EbmlElement * SkipData(EbmlStream & DataStream, const EbmlSemanticContext & Context, EbmlElement * TestReadElt = NULL, bool AllowDummyElt = false);
EbmlElement * SkipData(EbmlStream & DataStream, const EbmlSemanticContext & Context, EbmlElement * TestReadElt = NULL, bool AllowDummyElt = false);
/*!
\brief Give a copy of the element, all data inside the element is copied
\return NULL if there is not enough memory
*/
virtual EbmlElement * Clone() const = 0;
/*!
\brief Give a copy of the element, all data inside the element is copied
\return NULL if there is not enough memory
*/
virtual EbmlElement * Clone() const = 0;
virtual operator const EbmlId &() const = 0;
virtual operator const EbmlId &() const = 0;
#if defined(EBML_STRICT_API)
virtual const char *DebugName() const = 0;
virtual const EbmlSemanticContext &Context() const = 0;
#else
/// return the generic callback to monitor a derived class
virtual const EbmlCallbacks & Generic() const = 0;
/// return the generic callback to monitor a derived class
virtual const EbmlCallbacks & Generic() const = 0;
#endif
virtual EbmlElement & CreateElement() const = 0;
// by default only allow to set element as finite (override when needed)
virtual bool SetSizeInfinite(bool bIsInfinite = true) {return !bIsInfinite;}
// by default only allow to set element as finite (override when needed)
virtual bool SetSizeInfinite(bool bIsInfinite = true) {return !bIsInfinite;}
virtual bool ValidateSize() const = 0;
virtual bool ValidateSize() const = 0;
uint64 GetElementPosition() const {
return ElementPosition;
}
uint64 GetElementPosition() const {
return ElementPosition;
}
uint64 ElementSize(bool bWithDefault = false) const; /// return the size of the header+data, before writing
uint64 ElementSize(bool bWithDefault = false) const; /// return the size of the header+data, before writing
filepos_t Render(IOCallback & output, bool bWithDefault = false, bool bKeepPosition = false, bool bForceRender = false);
filepos_t Render(IOCallback & output, bool bWithDefault = false, bool bKeepPosition = false, bool bForceRender = false);
virtual filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false) = 0; /// update the Size of the Data stored
virtual filepos_t GetSize() const {return Size;} /// return the size of the data stored in the element, on reading
virtual filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false) = 0; /// update the Size of the Data stored
virtual filepos_t GetSize() const {return Size;} /// return the size of the data stored in the element, on reading
virtual filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA) = 0;
virtual void Read(EbmlStream & inDataStream, const EbmlSemanticContext & Context, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt = false, ScopeMode ReadFully = SCOPE_ALL_DATA);
virtual filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA) = 0;
virtual void Read(EbmlStream & inDataStream, const EbmlSemanticContext & Context, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt = false, ScopeMode ReadFully = SCOPE_ALL_DATA);
bool IsLocked() const {return bLocked;}
void Lock(bool bLock = true) { bLocked = bLock;}
bool IsLocked() const {return bLocked;}
void Lock(bool bLock = true) { bLocked = bLock;}
/*!
\brief default comparison for elements that can't be compared
*/
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
static bool CompareElements(const EbmlElement *A, const EbmlElement *B);
/*!
\brief default comparison for elements that can't be compared
*/
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
static bool CompareElements(const EbmlElement *A, const EbmlElement *B);
virtual bool IsDummy() const {return false;}
virtual bool IsMaster() const {return false;}
virtual bool IsDummy() const {return false;}
virtual bool IsMaster() const {return false;}
uint8 HeadSize() const {
return EBML_ID_LENGTH((const EbmlId&)*this) + CodedSizeLength(Size, SizeLength, bSizeIsFinite);
} /// return the size of the head, on reading/writing
uint8 HeadSize() const {
return EBML_ID_LENGTH((const EbmlId&)*this) + CodedSizeLength(Size, SizeLength, bSizeIsFinite);
} /// return the size of the head, on reading/writing
/*!
\brief Force the size of an element
\warning only possible if the size is "undefined"
*/
bool ForceSize(uint64 NewSize);
/*!
\brief Force the size of an element
\warning only possible if the size is "undefined"
*/
bool ForceSize(uint64 NewSize);
filepos_t OverwriteHead(IOCallback & output, bool bKeepPosition = false);
filepos_t OverwriteHead(IOCallback & output, bool bKeepPosition = false);
/*!
\brief void the content of the element (replace by EbmlVoid)
*/
uint64 VoidMe(IOCallback & output, bool bWithDefault = false);
/*!
\brief void the content of the element (replace by EbmlVoid)
*/
uint64 VoidMe(IOCallback & output, bool bWithDefault = false);
bool DefaultISset() const {return DefaultIsSet;}
virtual bool IsDefaultValue() const = 0;
bool IsFiniteSize() const {return bSizeIsFinite;}
bool DefaultISset() const {return DefaultIsSet;}
virtual bool IsDefaultValue() const = 0;
bool IsFiniteSize() const {return bSizeIsFinite;}
/*!
\brief set the default size of an element
*/
virtual void SetDefaultSize(uint64 aDefaultSize) {DefaultSize = aDefaultSize;}
/*!
\brief set the default size of an element
*/
virtual void SetDefaultSize(uint64 aDefaultSize) {DefaultSize = aDefaultSize;}
bool ValueIsSet() const {return bValueIsSet;}
bool ValueIsSet() const {return bValueIsSet;}
inline uint64 GetEndPosition() const {
assert(bSizeIsFinite); // we don't know where the end is
return SizePosition + CodedSizeLength(Size, SizeLength, bSizeIsFinite) + Size;
}
inline uint64 GetEndPosition() const {
assert(bSizeIsFinite); // we don't know where the end is
return SizePosition + CodedSizeLength(Size, SizeLength, bSizeIsFinite) + Size;
}
protected:
/*!
\brief find any element in the stream
\return a DummyRawElement if the element is unknown or NULL if the element dummy is not allowed
*/
static EbmlElement *CreateElementUsingContext(const EbmlId & aID, const EbmlSemanticContext & Context, int & LowLevel, bool IsGlobalContext, bool bAllowDummy = false, unsigned int MaxLowerLevel = 1);
protected:
/*!
\brief find any element in the stream
\return a DummyRawElement if the element is unknown or NULL if the element dummy is not allowed
*/
static EbmlElement *CreateElementUsingContext(const EbmlId & aID, const EbmlSemanticContext & Context, int & LowLevel, bool IsGlobalContext, bool bAllowDummy = false, unsigned int MaxLowerLevel = 1);
filepos_t RenderHead(IOCallback & output, bool bForceRender, bool bWithDefault = false, bool bKeepPosition = false);
filepos_t MakeRenderHead(IOCallback & output, bool bKeepPosition);
filepos_t RenderHead(IOCallback & output, bool bForceRender, bool bWithDefault = false, bool bKeepPosition = false);
filepos_t MakeRenderHead(IOCallback & output, bool bKeepPosition);
/*!
\brief prepare the data before writing them (in case it's not already done by default)
*/
virtual filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false) = 0;
/*!
\brief prepare the data before writing them (in case it's not already done by default)
*/
virtual filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false) = 0;
/*!
\brief special constructor for cloning
*/
EbmlElement(const EbmlElement & ElementToClone);
/*!
\brief special constructor for cloning
*/
EbmlElement(const EbmlElement & ElementToClone);
inline uint64 GetDefaultSize() const {return DefaultSize;}
inline void SetSize_(uint64 aSize) {Size = aSize;}
@ -494,17 +494,17 @@ class EBML_DLL_API EbmlElement {
inline uint64 GetSizePosition() const {return SizePosition;}
#if defined(EBML_STRICT_API)
private:
private:
#endif
uint64 Size; ///< the size of the data to write
uint64 DefaultSize; ///< Minimum data size to fill on rendering (0 = optimal)
int SizeLength; /// the minimum size on which the size will be written (0 = optimal)
bool bSizeIsFinite;
uint64 ElementPosition;
uint64 SizePosition;
bool bValueIsSet;
bool DefaultIsSet;
bool bLocked;
uint64 Size; ///< the size of the data to write
uint64 DefaultSize; ///< Minimum data size to fill on rendering (0 = optimal)
int SizeLength; /// the minimum size on which the size will be written (0 = optimal)
bool bSizeIsFinite;
uint64 ElementPosition;
uint64 SizePosition;
bool bValueIsSet;
bool DefaultIsSet;
bool bLocked;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -58,63 +58,63 @@ enum endianess {
template<class TYPE, endianess ENDIAN> class Endian
{
public:
Endian() {}
Endian() {}
Endian(const TYPE value)
{
memcpy(&platform_value, &value, sizeof(TYPE));
process_endian();
}
Endian(const TYPE value)
{
memcpy(&platform_value, &value, sizeof(TYPE));
process_endian();
}
inline Endian & Eval(const binary *endian_buffer)
{
//endian_value = *(TYPE *)(endian_buffer);
memcpy(&endian_value, endian_buffer, sizeof(TYPE)); // Some (all?) RISC processors do not allow reading objects bigger than 1 byte from non-aligned addresses, and endian_buffer may point to a non-aligned address.
process_platform();
return *this;
}
inline Endian & Eval(const binary *endian_buffer)
{
//endian_value = *(TYPE *)(endian_buffer);
memcpy(&endian_value, endian_buffer, sizeof(TYPE)); // Some (all?) RISC processors do not allow reading objects bigger than 1 byte from non-aligned addresses, and endian_buffer may point to a non-aligned address.
process_platform();
return *this;
}
inline void Fill(binary *endian_buffer) const
{
//*(TYPE*)endian_buffer = endian_value;
memcpy(endian_buffer, &endian_value, sizeof(TYPE)); // See above.
}
inline void Fill(binary *endian_buffer) const
{
//*(TYPE*)endian_buffer = endian_value;
memcpy(endian_buffer, &endian_value, sizeof(TYPE)); // See above.
}
inline operator const TYPE&() const { return platform_value; }
// inline TYPE endian() const { return endian_value; }
inline const TYPE &endian() const { return endian_value; }
inline size_t size() const { return sizeof(TYPE); }
inline bool operator!=(const binary *buffer) const {return *((TYPE*)buffer) == platform_value;}
inline operator const TYPE&() const { return platform_value; }
// inline TYPE endian() const { return endian_value; }
inline const TYPE &endian() const { return endian_value; }
inline size_t size() const { return sizeof(TYPE); }
inline bool operator!=(const binary *buffer) const {return *((TYPE*)buffer) == platform_value;}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
TYPE platform_value;
TYPE endian_value;
TYPE platform_value;
TYPE endian_value;
inline void process_endian()
{
endian_value = platform_value;
inline void process_endian()
{
endian_value = platform_value;
#ifdef WORDS_BIGENDIAN
if (ENDIAN == little_endian)
if (ENDIAN == little_endian)
#else // _ENDIANESS_
if (ENDIAN == big_endian)
if (ENDIAN == big_endian)
#endif // _ENDIANESS_
std::reverse(reinterpret_cast<uint8*>(&endian_value),reinterpret_cast<uint8*>(&endian_value+1));
}
std::reverse(reinterpret_cast<uint8*>(&endian_value),reinterpret_cast<uint8*>(&endian_value+1));
}
inline void process_platform()
{
platform_value = endian_value;
inline void process_platform()
{
platform_value = endian_value;
#ifdef WORDS_BIGENDIAN
if (ENDIAN == little_endian)
if (ENDIAN == little_endian)
#else // _ENDIANESS_
if (ENDIAN == big_endian)
if (ENDIAN == big_endian)
#endif // _ENDIANESS_
std::reverse(reinterpret_cast<uint8*>(&platform_value),reinterpret_cast<uint8*>(&platform_value+1));
}
std::reverse(reinterpret_cast<uint8*>(&platform_value),reinterpret_cast<uint8*>(&platform_value+1));
}
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_FLOAT_H
#define LIBEBML_FLOAT_H
@ -46,60 +46,60 @@ START_LIBEBML_NAMESPACE
\brief Handle all operations on a float EBML element
*/
class EBML_DLL_API EbmlFloat : public EbmlElement {
public:
enum Precision {
FLOAT_32
,FLOAT_64
};
public:
enum Precision {
FLOAT_32
,FLOAT_64
};
EbmlFloat(const Precision prec = FLOAT_32);
EbmlFloat(const double DefaultValue, const Precision prec = FLOAT_32);
EbmlFloat(const EbmlFloat & ElementToClone);
EbmlFloat(const Precision prec = FLOAT_32);
EbmlFloat(const double DefaultValue, const Precision prec = FLOAT_32);
EbmlFloat(const EbmlFloat & ElementToClone);
virtual bool ValidateSize() const
{
return (GetSize() == 4 || GetSize() == 8);
}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
virtual bool ValidateSize() const
{
return (GetSize() == 4 || GetSize() == 8);
}
void SetPrecision(const EbmlFloat::Precision prec = FLOAT_32)
{
if (prec == FLOAT_64)
SetSize_(8);
else
SetSize_(4); // default size
}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
// EbmlFloat & operator=(const float NewValue) { Value = NewValue; return *this;}
EbmlFloat & operator=(const double NewValue) { Value = NewValue; SetValueIsSet(); return *this;}
void SetPrecision(const EbmlFloat::Precision prec = FLOAT_32)
{
if (prec == FLOAT_64)
SetSize_(8);
else
SetSize_(4); // default size
}
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
operator float() const;
operator double() const;
EbmlFloat &SetValue(double NewValue);
double GetValue() const;
// EbmlFloat & operator=(const float NewValue) { Value = NewValue; return *this;}
EbmlFloat & operator=(const double NewValue) { Value = NewValue; SetValueIsSet(); return *this;}
void SetDefaultValue(double);
double DefaultVal() const;
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
operator float() const;
operator double() const;
EbmlFloat &SetValue(double NewValue);
double GetValue() const;
void SetDefaultValue(double);
double DefaultVal() const;
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
double Value; /// The actual value of the element
double DefaultValue;
double Value; /// The actual value of the element
double DefaultValue;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlHead.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlHead.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_HEAD_H
#define LIBEBML_HEAD_H
@ -42,8 +42,8 @@
START_LIBEBML_NAMESPACE
DECLARE_EBML_MASTER(EbmlHead)
public:
EbmlHead(const EbmlHead & ElementToClone) : EbmlMaster(ElementToClone) {}
public:
EbmlHead(const EbmlHead & ElementToClone) : EbmlMaster(ElementToClone) {}
EBML_CONCRETE_CLASS(EbmlHead)
};

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlId.h 936 2004-11-10 20:46:28Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlId.h 936 2004-11-10 20:46:28Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_ID_H
#define LIBEBML_ID_H
@ -50,39 +50,39 @@ START_LIBEBML_NAMESPACE
#endif
/*!
\class EbmlId
\class EbmlId
*/
class EBML_DLL_API EbmlId {
public:
EbmlId(const binary aValue[4], const unsigned int aLength)
:Length(aLength)
{
Value = 0;
unsigned int i;
for (i=0; i<aLength; i++) {
Value <<= 8;
Value += aValue[i];
}
}
public:
EbmlId(const binary aValue[4], const unsigned int aLength)
:Length(aLength)
{
Value = 0;
unsigned int i;
for (i=0; i<aLength; i++) {
Value <<= 8;
Value += aValue[i];
}
}
EbmlId(const uint32 aValue, const unsigned int aLength)
:Value(aValue), Length(aLength) {}
EbmlId(const uint32 aValue, const unsigned int aLength)
:Value(aValue), Length(aLength) {}
inline bool operator==(const EbmlId & TestId) const
{
return ((TestId.Length == Length) && (TestId.Value == Value));
}
inline bool operator!=(const EbmlId & TestId) const
{
return !(*this == TestId);
}
inline bool operator==(const EbmlId & TestId) const
{
return ((TestId.Length == Length) && (TestId.Value == Value));
}
inline bool operator!=(const EbmlId & TestId) const
{
return !(*this == TestId);
}
inline void Fill(binary * Buffer) const {
unsigned int i;
for (i = 0; i<Length; i++) {
Buffer[i] = (Value >> (8*(Length-i-1))) & 0xFF;
}
}
inline void Fill(binary * Buffer) const {
unsigned int i;
for (i = 0; i<Length; i++) {
Buffer[i] = (Value >> (8*(Length-i-1))) & 0xFF;
}
}
inline size_t GetLength() const { return Length; }
inline uint32 GetValue() const { return Value; }
@ -90,8 +90,8 @@ class EBML_DLL_API EbmlId {
#if defined(EBML_STRICT_API)
private:
#endif
uint32 Value;
size_t Length;
uint32 Value;
size_t Length;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlMaster.h 1232 2005-10-15 15:56:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlMaster.h 1232 2005-10-15 15:56:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_MASTER_H
#define LIBEBML_MASTER_H
@ -57,70 +57,70 @@ const bool bChecksumUsedByDefault = false;
\brief Handle all operations on an EBML element that contains other EBML elements
*/
class EBML_DLL_API EbmlMaster : public EbmlElement {
public:
EbmlMaster(const EbmlSemanticContext & aContext, bool bSizeIsKnown = true);
EbmlMaster(const EbmlMaster & ElementToClone);
virtual bool ValidateSize() const {return true;}
/*!
\warning be carefull to clear the memory allocated in the ElementList elsewhere
*/
virtual ~EbmlMaster();
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
/*!
\brief Set wether the size is finite (size is known in advance when writing, or infinite size is not known on writing)
*/
bool SetSizeInfinite(bool aIsInfinite = true) {SetSizeIsFinite(!aIsInfinite); return true;}
bool PushElement(EbmlElement & element);
uint64 GetSize() const {
if (IsFiniteSize())
public:
EbmlMaster(const EbmlSemanticContext & aContext, bool bSizeIsKnown = true);
EbmlMaster(const EbmlMaster & ElementToClone);
virtual bool ValidateSize() const {return true;}
/*!
\warning be carefull to clear the memory allocated in the ElementList elsewhere
*/
virtual ~EbmlMaster();
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
/*!
\brief Set wether the size is finite (size is known in advance when writing, or infinite size is not known on writing)
*/
bool SetSizeInfinite(bool aIsInfinite = true) {SetSizeIsFinite(!aIsInfinite); return true;}
bool PushElement(EbmlElement & element);
uint64 GetSize() const {
if (IsFiniteSize())
return EbmlElement::GetSize();
else
return (0-1);
}
uint64 GetDataStart() const {
return GetElementPosition() + EBML_ID_LENGTH((const EbmlId&)*this) + CodedSizeLength(GetSize(), GetSizeLength(), IsFiniteSize());
}
else
return (0-1);
}
/*!
\brief find the element corresponding to the ID of the element, NULL if not found
*/
EbmlElement *FindElt(const EbmlCallbacks & Callbacks) const;
/*!
\brief find the first element corresponding to the ID of the element
*/
EbmlElement *FindFirstElt(const EbmlCallbacks & Callbacks, bool bCreateIfNull);
EbmlElement *FindFirstElt(const EbmlCallbacks & Callbacks) const;
uint64 GetDataStart() const {
return GetElementPosition() + EBML_ID_LENGTH((const EbmlId&)*this) + CodedSizeLength(GetSize(), GetSizeLength(), IsFiniteSize());
}
/*!
\brief find the element of the same type of PasElt following in the list of elements
*/
EbmlElement *FindNextElt(const EbmlElement & PastElt, bool bCreateIfNull);
EbmlElement *FindNextElt(const EbmlElement & PastElt) const;
EbmlElement *AddNewElt(const EbmlCallbacks & Callbacks);
/*!
\brief find the element corresponding to the ID of the element, NULL if not found
*/
EbmlElement *FindElt(const EbmlCallbacks & Callbacks) const;
/*!
\brief find the first element corresponding to the ID of the element
*/
EbmlElement *FindFirstElt(const EbmlCallbacks & Callbacks, bool bCreateIfNull);
EbmlElement *FindFirstElt(const EbmlCallbacks & Callbacks) const;
/*!
\brief add an element at a specified location
*/
bool InsertElement(EbmlElement & element, size_t position = 0);
bool InsertElement(EbmlElement & element, const EbmlElement & before);
/*!
\brief find the element of the same type of PasElt following in the list of elements
*/
EbmlElement *FindNextElt(const EbmlElement & PastElt, bool bCreateIfNull);
EbmlElement *FindNextElt(const EbmlElement & PastElt) const;
EbmlElement *AddNewElt(const EbmlCallbacks & Callbacks);
/*!
\brief Read the data and keep the known children
*/
void Read(EbmlStream & inDataStream, const EbmlSemanticContext & Context, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt, ScopeMode ReadFully = SCOPE_ALL_DATA);
/*!
\brief sort Data when they can
*/
void Sort();
/*!
\brief add an element at a specified location
*/
bool InsertElement(EbmlElement & element, size_t position = 0);
bool InsertElement(EbmlElement & element, const EbmlElement & before);
size_t ListSize() const {return ElementList.size();}
/*!
\brief Read the data and keep the known children
*/
void Read(EbmlStream & inDataStream, const EbmlSemanticContext & Context, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt, ScopeMode ReadFully = SCOPE_ALL_DATA);
/*!
\brief sort Data when they can
*/
void Sort();
size_t ListSize() const {return ElementList.size();}
std::vector<EbmlElement *> const &GetElementList() const {return ElementList;}
std::vector<EbmlElement *> &GetElementList() {return ElementList;}
@ -133,76 +133,76 @@ class EBML_DLL_API EbmlMaster : public EbmlElement {
inline EBML_MASTER_CONST_RITERATOR rbegin() const {return ElementList.rbegin();}
inline EBML_MASTER_CONST_RITERATOR rend() const {return ElementList.rend();}
EbmlElement * operator[](unsigned int position) {return ElementList[position];}
const EbmlElement * operator[](unsigned int position) const {return ElementList[position];}
EbmlElement * operator[](unsigned int position) {return ElementList[position];}
const EbmlElement * operator[](unsigned int position) const {return ElementList[position];}
bool IsDefaultValue() const {
return (ElementList.size() == 0);
}
virtual bool IsMaster() const {return true;}
bool IsDefaultValue() const {
return (ElementList.size() == 0);
}
virtual bool IsMaster() const {return true;}
/*!
\brief verify that all mandatory elements are present
\note usefull after reading or before writing
*/
bool CheckMandatory() const;
/*!
\brief verify that all mandatory elements are present
\note usefull after reading or before writing
*/
bool CheckMandatory() const;
/*!
\brief Remove an element from the list of the master
*/
void Remove(size_t Index);
void Remove(EBML_MASTER_ITERATOR & Itr);
void Remove(EBML_MASTER_RITERATOR & Itr);
/*!
\brief Remove an element from the list of the master
*/
void Remove(size_t Index);
void Remove(EBML_MASTER_ITERATOR & Itr);
void Remove(EBML_MASTER_RITERATOR & Itr);
/*!
\brief remove all elements, even the mandatory ones
*/
void RemoveAll() {ElementList.clear();}
/*!
\brief remove all elements, even the mandatory ones
*/
void RemoveAll() {ElementList.clear();}
/*!
\brief facility for Master elements to write only the head and force the size later
\warning
*/
filepos_t WriteHead(IOCallback & output, int SizeLength, bool bWithDefault = false);
/*!
\brief facility for Master elements to write only the head and force the size later
\warning
*/
filepos_t WriteHead(IOCallback & output, int SizeLength, bool bWithDefault = false);
void EnableChecksum(bool bIsEnabled = true) { bChecksumUsed = bIsEnabled; }
bool HasChecksum() const {return bChecksumUsed;}
bool VerifyChecksum() const;
uint32 GetCrc32() const {return Checksum.GetCrc32();}
void ForceChecksum(uint32 NewChecksum) {
Checksum.ForceCrc32(NewChecksum);
bChecksumUsed = true;
}
void EnableChecksum(bool bIsEnabled = true) { bChecksumUsed = bIsEnabled; }
bool HasChecksum() const {return bChecksumUsed;}
bool VerifyChecksum() const;
uint32 GetCrc32() const {return Checksum.GetCrc32();}
void ForceChecksum(uint32 NewChecksum) {
Checksum.ForceCrc32(NewChecksum);
bChecksumUsed = true;
}
/*!
\brief drill down all sub-elements, finding any missing elements
*/
std::vector<std::string> FindAllMissingElements();
/*!
\brief drill down all sub-elements, finding any missing elements
*/
std::vector<std::string> FindAllMissingElements();
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
std::vector<EbmlElement *> ElementList;
const EbmlSemanticContext & Context;
std::vector<EbmlElement *> ElementList;
bool bChecksumUsed;
EbmlCrc32 Checksum;
private:
/*!
\brief Add all the mandatory elements to the list
*/
bool ProcessMandatory();
const EbmlSemanticContext & Context;
bool bChecksumUsed;
EbmlCrc32 Checksum;
private:
/*!
\brief Add all the mandatory elements to the list
*/
bool ProcessMandatory();
};
///< \todo add a restriction to only elements legal in the context
template <typename Type>
Type & GetChild(EbmlMaster & Master)
{
return *(static_cast<Type *>(Master.FindFirstElt(EBML_INFO(Type), true)));
return *(static_cast<Type *>(Master.FindFirstElt(EBML_INFO(Type), true)));
}
// call with
// MyDocType = GetChild<EDocType>(TestHead);
@ -210,19 +210,19 @@ Type & GetChild(EbmlMaster & Master)
template <typename Type>
Type * FindChild(EbmlMaster & Master)
{
return static_cast<Type *>(Master.FindFirstElt(EBML_INFO(Type), false));
return static_cast<Type *>(Master.FindFirstElt(EBML_INFO(Type), false));
}
template <typename Type>
Type & GetNextChild(EbmlMaster & Master, const Type & PastElt)
{
return *(static_cast<Type *>(Master.FindNextElt(PastElt, true)));
return *(static_cast<Type *>(Master.FindNextElt(PastElt, true)));
}
template <typename Type>
Type & AddNewChild(EbmlMaster & Master)
{
return *(static_cast<Type *>(Master.AddNewElt(EBML_INFO(Type))));
return *(static_cast<Type *>(Master.AddNewElt(EBML_INFO(Type))));
}
END_LIBEBML_NAMESPACE

View File

@ -29,11 +29,11 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#ifndef LIBEBML_SINTEGER_H
#define LIBEBML_SINTEGER_H
@ -52,48 +52,48 @@ const int DEFAULT_INT_SIZE = 1; ///< optimal size stored
\brief Handle all operations on a signed integer EBML element
*/
class EBML_DLL_API EbmlSInteger : public EbmlElement {
public:
EbmlSInteger();
EbmlSInteger(int64 DefaultValue);
EbmlSInteger(const EbmlSInteger & ElementToClone);
public:
EbmlSInteger();
EbmlSInteger(int64 DefaultValue);
EbmlSInteger(const EbmlSInteger & ElementToClone);
EbmlSInteger & operator = (int64 NewValue) {Value = NewValue; SetValueIsSet(); return *this;}
EbmlSInteger & operator = (int64 NewValue) {Value = NewValue; SetValueIsSet(); return *this;}
/*!
Set the default size of the integer (usually 1,2,4 or 8)
*/
/*!
Set the default size of the integer (usually 1,2,4 or 8)
*/
virtual void SetDefaultSize(uint64 nDefaultSize = DEFAULT_INT_SIZE) {EbmlElement::SetDefaultSize(nDefaultSize); SetSize_(nDefaultSize);}
virtual bool ValidateSize() const {return IsFiniteSize() && (GetSize() <= 8);}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
virtual bool ValidateSize() const {return IsFiniteSize() && (GetSize() <= 8);}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
operator int8() const;
operator int16() const;
operator int32() const;
operator int64() const;
operator int8() const;
operator int16() const;
operator int32() const;
operator int64() const;
EbmlSInteger &SetValue(int64 NewValue);
int64 GetValue() const;
EbmlSInteger &SetValue(int64 NewValue);
int64 GetValue() const;
void SetDefaultValue(int64 aValue) {assert(!DefaultISset()); DefaultValue = aValue; SetDefaultIsSet();}
void SetDefaultValue(int64 aValue) {assert(!DefaultISset()); DefaultValue = aValue; SetDefaultIsSet();}
int64 DefaultVal() const {assert(DefaultISset()); return DefaultValue;}
int64 DefaultVal() const {assert(DefaultISset()); return DefaultValue;}
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
int64 Value; /// The actual value of the element
int64 DefaultValue;
int64 Value; /// The actual value of the element
int64 DefaultValue;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_STREAM_H
#define LIBEBML_STREAM_H
@ -47,20 +47,20 @@ START_LIBEBML_NAMESPACE
\brief Handle an input/output stream of EBML elements
*/
class EBML_DLL_API EbmlStream {
public:
EbmlStream(IOCallback & output);
~EbmlStream();
/*!
\brief Find a possible next ID in the data stream
\param MaxDataSize The maximum possible of the data in the element (for sanity checks)
\note the user will have to delete that element later
*/
EbmlElement * FindNextID(const EbmlCallbacks & ClassInfos, uint64 MaxDataSize);
public:
EbmlStream(IOCallback & output);
~EbmlStream();
EbmlElement * FindNextElement(const EbmlSemanticContext & Context, int & UpperLevel, uint64 MaxDataSize, bool AllowDummyElt, unsigned int MaxLowerLevel = 1);
/*!
\brief Find a possible next ID in the data stream
\param MaxDataSize The maximum possible of the data in the element (for sanity checks)
\note the user will have to delete that element later
*/
EbmlElement * FindNextID(const EbmlCallbacks & ClassInfos, uint64 MaxDataSize);
inline IOCallback & I_O() {return Stream;}
EbmlElement * FindNextElement(const EbmlSemanticContext & Context, int & UpperLevel, uint64 MaxDataSize, bool AllowDummyElt, unsigned int MaxLowerLevel = 1);
inline IOCallback & I_O() {return Stream;}
operator IOCallback &() {return Stream;}
#if defined(EBML_STRICT_API)
@ -68,7 +68,7 @@ class EBML_DLL_API EbmlStream {
#else
protected:
#endif
IOCallback & Stream;
IOCallback & Stream;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_STRING_H
#define LIBEBML_STRING_H
@ -48,39 +48,39 @@ START_LIBEBML_NAMESPACE
\brief Handle all operations on a printable string EBML element
*/
class EBML_DLL_API EbmlString : public EbmlElement {
public:
EbmlString();
EbmlString(const std::string & aDefaultValue);
EbmlString(const EbmlString & ElementToClone);
virtual ~EbmlString() {}
virtual bool ValidateSize() const {return IsFiniteSize();} // any size is possible
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
EbmlString & operator=(const std::string &);
operator const std::string &() const;
public:
EbmlString();
EbmlString(const std::string & aDefaultValue);
EbmlString(const EbmlString & ElementToClone);
virtual ~EbmlString() {}
virtual bool ValidateSize() const {return IsFiniteSize();} // any size is possible
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
EbmlString & operator=(const std::string &);
operator const std::string &() const;
EbmlString &SetValue(std::string const &NewValue);
std::string GetValue() const;
void SetDefaultValue(std::string &);
const std::string & DefaultVal() const;
void SetDefaultValue(std::string &);
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
const std::string & DefaultVal() const;
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
std::string Value; /// The actual value of the element
std::string DefaultValue;
std::string Value; /// The actual value of the element
std::string DefaultValue;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlSubHead.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlSubHead.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_SUBHEAD_H
#define LIBEBML_SUBHEAD_H
@ -44,50 +44,50 @@
START_LIBEBML_NAMESPACE
DECLARE_EBML_UINTEGER(EVersion)
public:
EVersion(const EVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
public:
EVersion(const EVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EVersion)
};
DECLARE_EBML_UINTEGER(EReadVersion)
public:
EReadVersion(const EReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
public:
EReadVersion(const EReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EReadVersion)
};
DECLARE_EBML_UINTEGER(EMaxIdLength)
public:
EMaxIdLength(const EMaxIdLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
public:
EMaxIdLength(const EMaxIdLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EMaxIdLength)
};
DECLARE_EBML_UINTEGER(EMaxSizeLength)
public:
EMaxSizeLength(const EMaxSizeLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
public:
EMaxSizeLength(const EMaxSizeLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EMaxSizeLength)
};
DECLARE_EBML_STRING(EDocType)
public:
EDocType(const EDocType & ElementToClone) : EbmlString(ElementToClone) {}
public:
EDocType(const EDocType & ElementToClone) : EbmlString(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocType)
};
DECLARE_EBML_UINTEGER(EDocTypeVersion)
public:
EDocTypeVersion(const EDocTypeVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
public:
EDocTypeVersion(const EDocTypeVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocTypeVersion)
};
DECLARE_EBML_UINTEGER(EDocTypeReadVersion)
public:
EDocTypeReadVersion(const EDocTypeReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
public:
EDocTypeReadVersion(const EDocTypeReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocTypeReadVersion)
};

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,8 +27,8 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlTypes.h 639 2004-07-09 20:59:14Z mosu $
\file
\version \$Id: EbmlTypes.h 639 2004-07-09 20:59:14Z mosu $
*/
#ifndef LIBEBML_TYPES_H
#define LIBEBML_TYPES_H
@ -62,9 +62,9 @@ typedef Endian<bits80,big_endian> big_80bits;
enum ScopeMode {
SCOPE_PARTIAL_DATA = 0,
SCOPE_ALL_DATA,
SCOPE_NO_DATA
SCOPE_PARTIAL_DATA = 0,
SCOPE_ALL_DATA,
SCOPE_NO_DATA
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,11 +29,11 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#ifndef LIBEBML_UINTEGER_H
#define LIBEBML_UINTEGER_H
@ -50,48 +50,48 @@ const int DEFAULT_UINT_SIZE = 0; ///< optimal size stored
\brief Handle all operations on an unsigned integer EBML element
*/
class EBML_DLL_API EbmlUInteger : public EbmlElement {
public:
EbmlUInteger();
EbmlUInteger(uint64 DefaultValue);
EbmlUInteger(const EbmlUInteger & ElementToClone);
EbmlUInteger & operator=(uint64 NewValue) {Value = NewValue; SetValueIsSet(); return *this;}
public:
EbmlUInteger();
EbmlUInteger(uint64 DefaultValue);
EbmlUInteger(const EbmlUInteger & ElementToClone);
/*!
Set the default size of the integer (usually 1,2,4 or 8)
*/
virtual void SetDefaultSize(uint64 nDefaultSize = DEFAULT_UINT_SIZE) {EbmlElement::SetDefaultSize(nDefaultSize); SetSize_(nDefaultSize);}
EbmlUInteger & operator=(uint64 NewValue) {Value = NewValue; SetValueIsSet(); return *this;}
virtual bool ValidateSize() const {return IsFiniteSize() && (GetSize() <= 8);}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
operator uint8() const;
operator uint16() const;
operator uint32() const;
operator uint64() const;
/*!
Set the default size of the integer (usually 1,2,4 or 8)
*/
virtual void SetDefaultSize(uint64 nDefaultSize = DEFAULT_UINT_SIZE) {EbmlElement::SetDefaultSize(nDefaultSize); SetSize_(nDefaultSize);}
EbmlUInteger &SetValue(uint64 NewValue);
uint64 GetValue() const;
virtual bool ValidateSize() const {return IsFiniteSize() && (GetSize() <= 8);}
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
void SetDefaultValue(uint64);
uint64 DefaultVal() const;
virtual bool IsSmallerThan(const EbmlElement *Cmp) const;
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
operator uint8() const;
operator uint16() const;
operator uint32() const;
operator uint64() const;
EbmlUInteger &SetValue(uint64 NewValue);
uint64 GetValue() const;
void SetDefaultValue(uint64);
uint64 DefaultVal() const;
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
uint64 Value; /// The actual value of the element
uint64 DefaultValue;
uint64 Value; /// The actual value of the element
uint64 DefaultValue;
};
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,11 +29,11 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\author Jory Stone <jcsston @ toughguy.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\author Jory Stone <jcsston @ toughguy.net>
*/
#ifndef LIBEBML_UNICODE_STRING_H
#define LIBEBML_UNICODE_STRING_H
@ -52,87 +52,87 @@ START_LIBEBML_NAMESPACE
*/
class EBML_DLL_API UTFstring {
public:
typedef wchar_t value_type;
typedef wchar_t value_type;
UTFstring();
UTFstring(const wchar_t *); // should be NULL terminated
UTFstring(const UTFstring &);
UTFstring(std::wstring const &);
virtual ~UTFstring();
bool operator==(const UTFstring&) const;
inline bool operator!=(const UTFstring &cmp) const
{
return !(*this == cmp);
}
UTFstring & operator=(const UTFstring &);
UTFstring & operator=(const wchar_t *);
UTFstring & operator=(wchar_t);
UTFstring();
UTFstring(const wchar_t *); // should be NULL terminated
UTFstring(const UTFstring &);
UTFstring(std::wstring const &);
/// Return length of string
size_t length() const {return _Length;}
virtual ~UTFstring();
bool operator==(const UTFstring&) const;
inline bool operator!=(const UTFstring &cmp) const
{
return !(*this == cmp);
}
UTFstring & operator=(const UTFstring &);
UTFstring & operator=(const wchar_t *);
UTFstring & operator=(wchar_t);
operator const wchar_t*() const;
const wchar_t* c_str() const {return _Data;}
/// Return length of string
size_t length() const {return _Length;}
const std::string & GetUTF8() const {return UTF8string;}
void SetUTF8(const std::string &);
operator const wchar_t*() const;
const wchar_t* c_str() const {return _Data;}
const std::string & GetUTF8() const {return UTF8string;}
void SetUTF8(const std::string &);
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
size_t _Length; ///< length of the UCS string excluding the \0
wchar_t* _Data; ///< internal UCS representation
std::string UTF8string;
static bool wcscmp_internal(const wchar_t *str1, const wchar_t *str2);
void UpdateFromUTF8();
void UpdateFromUCS2();
size_t _Length; ///< length of the UCS string excluding the \0
wchar_t* _Data; ///< internal UCS representation
std::string UTF8string;
static bool wcscmp_internal(const wchar_t *str1, const wchar_t *str2);
void UpdateFromUTF8();
void UpdateFromUCS2();
};
/*!
\class EbmlUnicodeString
\brief Handle all operations on a Unicode string EBML element
\note internally treated as a string made of wide characters (ie UCS-2 or UCS-4 depending on the machine)
\note internally treated as a string made of wide characters (ie UCS-2 or UCS-4 depending on the machine)
*/
class EBML_DLL_API EbmlUnicodeString : public EbmlElement {
public:
EbmlUnicodeString();
EbmlUnicodeString(const UTFstring & DefaultValue);
EbmlUnicodeString(const EbmlUnicodeString & ElementToClone);
virtual ~EbmlUnicodeString() {}
virtual bool ValidateSize() const {return IsFiniteSize();} // any size is possible
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
EbmlUnicodeString & operator=(const UTFstring &); ///< platform dependant code
operator const UTFstring &() const;
public:
EbmlUnicodeString();
EbmlUnicodeString(const UTFstring & DefaultValue);
EbmlUnicodeString(const EbmlUnicodeString & ElementToClone);
virtual ~EbmlUnicodeString() {}
virtual bool ValidateSize() const {return IsFiniteSize();} // any size is possible
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA);
filepos_t UpdateSize(bool bWithDefault = false, bool bForceRender = false);
EbmlUnicodeString & operator=(const UTFstring &); ///< platform dependant code
operator const UTFstring &() const;
EbmlUnicodeString &SetValue(UTFstring const &NewValue);
EbmlUnicodeString &SetValueUTF8(std::string const &NewValue);
UTFstring GetValue() const;
std::string GetValueUTF8() const;
void SetDefaultValue(UTFstring &);
const UTFstring & DefaultVal() const;
void SetDefaultValue(UTFstring &);
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
const UTFstring & DefaultVal() const;
bool IsDefaultValue() const {
return (DefaultISset() && Value == DefaultValue);
}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
UTFstring Value; /// The actual value of the element
UTFstring DefaultValue;
UTFstring Value; /// The actual value of the element
UTFstring DefaultValue;
};
END_LIBEBML_NAMESPACE

View File

@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_VERSION_H
#define LIBEBML_VERSION_H
@ -48,7 +48,7 @@ extern const std::string EbmlCodeVersion;
extern const std::string EbmlCodeDate;
/*!
\todo Closer relation between an element and the context it comes from (context is an element attribute ?)
\todo Closer relation between an element and the context it comes from (context is an element attribute ?)
*/
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlVoid.h 1079 2005-03-03 13:18:14Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlVoid.h 1079 2005-03-03 13:18:14Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_VOID_H
#define LIBEBML_VOID_H
@ -42,28 +42,28 @@
START_LIBEBML_NAMESPACE
DECLARE_EBML_BINARY(EbmlVoid)
public:
EbmlVoid(const EbmlVoid & ElementToClone) :EbmlBinary(ElementToClone){}
public:
EbmlVoid(const EbmlVoid & ElementToClone) :EbmlBinary(ElementToClone){}
/*!
\brief Set the size of the data (not the complete size of the element)
*/
void SetSize(uint64 aSize) {SetSize_(aSize);}
/*!
\brief Set the size of the data (not the complete size of the element)
*/
void SetSize(uint64 aSize) {SetSize_(aSize);}
/*!
\note overwrite to write fake data
*/
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
/*!
\note overwrite to write fake data
*/
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
/*!
\brief Replace the void element content (written) with this one
*/
uint64 ReplaceWith(EbmlElement & EltToReplaceWith, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
/*!
\brief Replace the void element content (written) with this one
*/
uint64 ReplaceWith(EbmlElement & EltToReplaceWith, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
/*!
\brief Void the content of an element
*/
uint64 Overwrite(const EbmlElement & EltToVoid, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
/*!
\brief Void the content of an element
*/
uint64 Overwrite(const EbmlElement & EltToVoid, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
EBML_CONCRETE_CLASS(EbmlVoid)
};

View File

@ -27,8 +27,8 @@
**********************************************************************/
/*!
\file
\version \$Id: IOCallback.h 639 2004-07-09 20:59:14Z mosu $
\file
\version \$Id: IOCallback.h 639 2004-07-09 20:59:14Z mosu $
*/
#ifndef MATROSKA_IOCALLBACK_H
#define MATROSKA_IOCALLBACK_H
@ -45,70 +45,70 @@ START_LIBEBML_NAMESPACE
enum seek_mode
{
seek_beginning=SEEK_SET
,seek_end=SEEK_END
,seek_current=SEEK_CUR
seek_beginning=SEEK_SET
,seek_end=SEEK_END
,seek_current=SEEK_CUR
};
class EBML_DLL_API IOCallback
{
public:
virtual ~IOCallback(){}
virtual ~IOCallback(){}
// The read callback works like most other read functions. You specify the
// file, the buffer and the size and the function returns the bytes read.
// If an error occurs or the file pointer points to the end of the file 0 is returned.
// Users are encouraged to throw a descriptive exception, when an error occurs.
virtual uint32 read(void*Buffer,size_t Size)=0;
// The read callback works like most other read functions. You specify the
// file, the buffer and the size and the function returns the bytes read.
// If an error occurs or the file pointer points to the end of the file 0 is returned.
// Users are encouraged to throw a descriptive exception, when an error occurs.
virtual uint32 read(void*Buffer,size_t Size)=0;
// Seek to the specified position. The mode can have either SEEK_SET, SEEK_CUR
// or SEEK_END. The callback should return true(1) if the seek operation succeeded
// or false (0), when the seek fails.
virtual void setFilePointer(int64 Offset,seek_mode Mode=seek_beginning)=0;
// Seek to the specified position. The mode can have either SEEK_SET, SEEK_CUR
// or SEEK_END. The callback should return true(1) if the seek operation succeeded
// or false (0), when the seek fails.
virtual void setFilePointer(int64 Offset,seek_mode Mode=seek_beginning)=0;
// This callback just works like its read pendant. It returns the number of bytes written.
virtual size_t write(const void*Buffer,size_t Size)=0;
// This callback just works like its read pendant. It returns the number of bytes written.
virtual size_t write(const void*Buffer,size_t Size)=0;
// Although the position is always positive, the return value of this callback is signed to
// easily allow negative values for returning errors. When an error occurs, the implementor
// should return -1 and the file pointer otherwise.
//
// If an error occurs, an exception should be thrown.
virtual uint64 getFilePointer()=0;
// Although the position is always positive, the return value of this callback is signed to
// easily allow negative values for returning errors. When an error occurs, the implementor
// should return -1 and the file pointer otherwise.
//
// If an error occurs, an exception should be thrown.
virtual uint64 getFilePointer()=0;
// The close callback flushes the file buffers to disk and closes the file. When using the stdio
// library, this is equivalent to calling fclose. When the close is not successful, an exception
// should be thrown.
virtual void close()=0;
// The close callback flushes the file buffers to disk and closes the file. When using the stdio
// library, this is equivalent to calling fclose. When the close is not successful, an exception
// should be thrown.
virtual void close()=0;
// The readFully is made virtual to allow derived classes to use another
// implementation for this method, which e.g. does not read any data
// unlike this does
void readFully(void*Buffer,size_t Size);
// The readFully is made virtual to allow derived classes to use another
// implementation for this method, which e.g. does not read any data
// unlike this does
void readFully(void*Buffer,size_t Size);
template<class STRUCT> void readStruct(STRUCT&Struct){readFully(&Struct,sizeof(Struct));}
template<class STRUCT> void readStruct(STRUCT&Struct){readFully(&Struct,sizeof(Struct));}
void writeFully(const void*Buffer,size_t Size);
void writeFully(const void*Buffer,size_t Size);
template<class STRUCT> void writeStruct(const STRUCT&Struct){writeFully(&Struct,sizeof(Struct));}
template<class STRUCT> void writeStruct(const STRUCT&Struct){writeFully(&Struct,sizeof(Struct));}
};
/* cygwin incompatible
template<class TRAITS> std::basic_ostream<char,TRAITS>&operator<<(std::basic_ostream<char,TRAITS>&Stream,seek_mode Mode)
{
switch(Mode)
{
switch(Mode)
{
#define x(y) case seek_##y: Stream<<"seek_" #y; break
x(beginning);
x(current);
x(end);
x(beginning);
x(current);
x(end);
#undef x
default:
assert(false);
}
default:
assert(false);
}
return Stream;
return Stream;
}
*/

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,9 +27,9 @@
**********************************************************************/
/*!
\file
\version \$Id: MemIOCallback.h 1298 2008-02-21 22:14:18Z mosu $
\author Jory Stone <jcsston @ toughguy.net>
\file
\version \$Id: MemIOCallback.h 1298 2008-02-21 22:14:18Z mosu $
\author Jory Stone <jcsston @ toughguy.net>
*/
#ifndef LIBEBML_MEMIOCALLBACK_H
#define LIBEBML_MEMIOCALLBACK_H
@ -48,69 +48,69 @@ START_LIBEBML_NAMESPACE
class EBML_DLL_API MemIOCallback : public IOCallback
{
public:
MemIOCallback(uint64 DefaultSize = 128);
~MemIOCallback();
MemIOCallback(uint64 DefaultSize = 128);
~MemIOCallback();
/*!
Use this to copy some data to the Buffer from this classes data
*/
uint32 read(void *Buffer, size_t Size);
/*!
Use this to copy some data to the Buffer from this classes data
*/
uint32 read(void *Buffer, size_t Size);
/*!
Seek to the specified position. The mode can have either SEEK_SET, SEEK_CUR
or SEEK_END. The callback should return true(1) if the seek operation succeeded
or false (0), when the seek fails.
*/
void setFilePointer(int64 Offset, seek_mode Mode=seek_beginning);
/*!
Seek to the specified position. The mode can have either SEEK_SET, SEEK_CUR
or SEEK_END. The callback should return true(1) if the seek operation succeeded
or false (0), when the seek fails.
*/
void setFilePointer(int64 Offset, seek_mode Mode=seek_beginning);
/*!
This callback just works like its read pendant. It returns the number of bytes written.
*/
size_t write(const void *Buffer, size_t Size);
/*!
This callback just works like its read pendant. It returns the number of bytes written.
*/
size_t write(const void *Buffer, size_t Size);
/*!
Although the position is always positive, the return value of this callback is signed to
easily allow negative values for returning errors. When an error occurs, the implementor
should return -1 and the file pointer otherwise.
/*!
Although the position is always positive, the return value of this callback is signed to
easily allow negative values for returning errors. When an error occurs, the implementor
should return -1 and the file pointer otherwise.
If an error occurs, an exception should be thrown.
*/
virtual uint64 getFilePointer() {return dataBufferPos;};
If an error occurs, an exception should be thrown.
*/
virtual uint64 getFilePointer() {return dataBufferPos;};
/*!
The close callback flushes the file buffers to disk and closes the file. When using the stdio
library, this is equivalent to calling fclose. When the close is not successful, an exception
should be thrown.
*/
void close() {};
/*!
The close callback flushes the file buffers to disk and closes the file. When using the stdio
library, this is equivalent to calling fclose. When the close is not successful, an exception
should be thrown.
*/
void close() {};
binary *GetDataBuffer() const {return dataBuffer;};
uint64 GetDataBufferSize() {return dataBufferTotalSize;};
void SetDataBufferSize(uint64 newDataBufferSize) {dataBufferTotalSize = newDataBufferSize;};
/*!
Use this to write some data from another IOCallback
*/
uint32 write(IOCallback & IOToRead, size_t Size);
binary *GetDataBuffer() const {return dataBuffer;};
uint64 GetDataBufferSize() {return dataBufferTotalSize;};
void SetDataBufferSize(uint64 newDataBufferSize) {dataBufferTotalSize = newDataBufferSize;};
/*!
Use this to write some data from another IOCallback
*/
uint32 write(IOCallback & IOToRead, size_t Size);
bool IsOk() { return mOk; };
const std::string &GetLastErrorStr() { return mLastErrorStr; };
bool IsOk() { return mOk; };
const std::string &GetLastErrorStr() { return mLastErrorStr; };
protected:
bool mOk;
std::string mLastErrorStr;
bool mOk;
std::string mLastErrorStr;
binary *dataBuffer;
/*!
Postion where we start 'writing' to the dataBuffer
*/
uint64 dataBufferPos;
/*!
Size of the data in the dataBuffer
*/
uint64 dataBufferTotalSize;
/*!
Size of the memory malloc()/realloc()
*/
uint64 dataBufferMemorySize;
binary *dataBuffer;
/*!
Postion where we start 'writing' to the dataBuffer
*/
uint64 dataBufferPos;
/*!
Size of the data in the dataBuffer
*/
uint64 dataBufferTotalSize;
/*!
Size of the memory malloc()/realloc()
*/
uint64 dataBufferMemorySize;
};
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,8 +27,8 @@
**********************************************************************/
/*!
\file
\version \$Id: StdIOCallback.h 1090 2005-03-16 12:47:59Z robux4 $
\file
\version \$Id: StdIOCallback.h 1090 2005-03-16 12:47:59Z robux4 $
*/
#ifndef LIBEBML_STDIOCALLBACK_H
#define LIBEBML_STDIOCALLBACK_H
@ -51,49 +51,49 @@ class EBML_DLL_API CRTError:public std::runtime_error
{
// Variablen...
private:
int Error;
int Error;
// Methoden...
public:
CRTError(int Error,const std::string&Description);
CRTError(const std::string&Description,int Error=errno);
CRTError(int Error,const std::string&Description);
CRTError(const std::string&Description,int Error=errno);
int getError()const throw(){return Error;}
int getError()const throw(){return Error;}
};
// This class is currently private to the library, so there's no MATROSKA_EXPORT.
class EBML_DLL_API StdIOCallback:public IOCallback
{
private:
FILE*File;
uint64 mCurrentPosition;
FILE*File;
uint64 mCurrentPosition;
public:
// StdIOCallback(const char*Path,const char*Mode);
StdIOCallback(const char*Path, const open_mode Mode);
virtual ~StdIOCallback()throw();
// StdIOCallback(const char*Path,const char*Mode);
StdIOCallback(const char*Path, const open_mode Mode);
virtual ~StdIOCallback()throw();
virtual uint32 read(void*Buffer,size_t Size);
virtual uint32 read(void*Buffer,size_t Size);
// Seek to the specified position. The mode can have either SEEK_SET, SEEK_CUR
// or SEEK_END. The callback should return true(1) if the seek operation succeeded
// or false (0), when the seek fails.
virtual void setFilePointer(int64 Offset,seek_mode Mode=seek_beginning);
// Seek to the specified position. The mode can have either SEEK_SET, SEEK_CUR
// or SEEK_END. The callback should return true(1) if the seek operation succeeded
// or false (0), when the seek fails.
virtual void setFilePointer(int64 Offset,seek_mode Mode=seek_beginning);
// This callback just works like its read pendant. It returns the number of bytes written.
virtual size_t write(const void*Buffer,size_t Size);
// This callback just works like its read pendant. It returns the number of bytes written.
virtual size_t write(const void*Buffer,size_t Size);
// Although the position is always positive, the return value of this callback is signed to
// easily allow negative values for returning errors. When an error occurs, the implementor
// should return -1 and the file pointer otherwise.
//
// If an error occurs, an exception should be thrown.
virtual uint64 getFilePointer();
// Although the position is always positive, the return value of this callback is signed to
// easily allow negative values for returning errors. When an error occurs, the implementor
// should return -1 and the file pointer otherwise.
//
// If an error occurs, an exception should be thrown.
virtual uint64 getFilePointer();
// The close callback flushes the file buffers to disk and closes the file. When using the stdio
// library, this is equivalent to calling fclose. When the close is not successful, an exception
// should be thrown.
virtual void close();
// The close callback flushes the file buffers to disk and closes the file. When using the stdio
// library, this is equivalent to calling fclose. When the close is not successful, an exception
// should be thrown.
virtual void close();
};
END_LIBEBML_NAMESPACE

View File

@ -50,7 +50,7 @@ extern "C" {
// Changed char is unsigned now (signedness was causing trouble in endil)
#if defined(_WIN32)
# if !defined(__GNUC__) // Microsoft Visual C++
# if !defined(__GNUC__) // Microsoft Visual C++
typedef signed __int64 int64;
typedef signed __int32 int32;
typedef signed __int16 int16;
@ -74,7 +74,7 @@ extern "C" {
# endif // __GNUC__
#elif defined(__BEOS__)
#include <SupportDefs.h>
#elif defined(DJGPP) /* SL : DJGPP doesn't support POSIX types ???? */
#elif defined(DJGPP) /* SL : DJGPP doesn't support POSIX types ???? */
typedef signed long long int64;
typedef signed long int32;
typedef signed short int16;

View File

@ -13,7 +13,7 @@ LIB ebml
FAVOR_MAX_SPEED .
REDUCE_SIZE .
FASTER_FLOAT .
SOURCE src/Debug.cpp
SOURCE src/EbmlBinary.cpp
SOURCE src/EbmlContexts.cpp

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id: Debug.cpp 1268 2007-01-19 10:15:08Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id: Debug.cpp 1268 2007-01-19 10:15:08Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#include <stdio.h>
@ -62,174 +62,174 @@ ADbg::ADbg(int level)
,my_debug_output(true)
,hFile(NULL)
{
prefix[0] = '\0';
OutPut(-1,"ADbg Creation at debug level = %d (0x%08X)",my_level,this);
prefix[0] = '\0';
OutPut(-1,"ADbg Creation at debug level = %d (0x%08X)",my_level,this);
}
ADbg::~ADbg()
{
unsetDebugFile();
OutPut(-1,"ADbg Deletion (0x%08X)",this);
unsetDebugFile();
OutPut(-1,"ADbg Deletion (0x%08X)",this);
}
inline int ADbg::_OutPut(const char * format,va_list params) const
{
int result;
int result;
char tst[1000];
char myformat[256];
char tst[1000];
char myformat[256];
#ifdef WIN32
if (my_time_included) {
SYSTEMTIME time;
GetSystemTime(&time);
if (prefix[0] == '\0')
wsprintfA(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s\r\n",
time.wYear,
time.wMonth,
time.wDay,
time.wHour,
time.wMinute,
time.wSecond,
time.wMilliseconds,
format);
else
wsprintfA(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s - %s\r\n",
time.wYear,
time.wMonth,
time.wDay,
time.wHour,
time.wMinute,
time.wSecond,
time.wMilliseconds,
prefix,
format);
} else {
if (prefix[0] == '\0')
wsprintfA( myformat, "%s\r\n", format);
else
wsprintfA( myformat, "%s - %s\r\n", prefix, format);
}
result = vsprintf(tst,myformat,params);
if (my_debug_output)
OutputDebugStringA(tst);
if (my_time_included) {
SYSTEMTIME time;
GetSystemTime(&time);
if (prefix[0] == '\0')
wsprintfA(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s\r\n",
time.wYear,
time.wMonth,
time.wDay,
time.wHour,
time.wMinute,
time.wSecond,
time.wMilliseconds,
format);
else
wsprintfA(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s - %s\r\n",
time.wYear,
time.wMonth,
time.wDay,
time.wHour,
time.wMinute,
time.wSecond,
time.wMilliseconds,
prefix,
format);
} else {
if (prefix[0] == '\0')
wsprintfA( myformat, "%s\r\n", format);
else
wsprintfA( myformat, "%s - %s\r\n", prefix, format);
}
result = vsprintf(tst,myformat,params);
if (my_use_file && (hFile != NULL)) {
SetFilePointer( hFile, 0, 0, FILE_END );
DWORD written;
WriteFile( hFile, tst, lstrlenA(tst), &written, NULL );
}
if (my_debug_output)
OutputDebugStringA(tst);
if (my_use_file && (hFile != NULL)) {
SetFilePointer( hFile, 0, 0, FILE_END );
DWORD written;
WriteFile( hFile, tst, lstrlenA(tst), &written, NULL );
}
#else
if (my_time_included) {
time_t nowSecs;
struct tm *now;
struct timeval tv;
nowSecs = time(NULL);
gettimeofday(&tv, NULL);
now = gmtime(&nowSecs);
if (prefix[0] == '\0')
sprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02ld.%03ld UTC : %s\r\n",
now->tm_year, now->tm_mon, now->tm_mday,
now->tm_hour, now->tm_min, tv.tv_sec,
(long)tv.tv_usec / 1000, format);
else
sprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02ld.%03ld UTC : %s - %s\r\n",
now->tm_year, now->tm_mon, now->tm_mday,
now->tm_hour, now->tm_min, tv.tv_sec,
(long)tv.tv_usec / 1000, prefix, format);
} else {
if (prefix[0] == '\0')
sprintf( myformat, "%s\r\n", format);
else
sprintf( myformat, "%s - %s\r\n", prefix, format);
}
if (my_time_included) {
time_t nowSecs;
struct tm *now;
struct timeval tv;
result = vsprintf(tst,myformat,params);
if (my_debug_output)
fputs(tst, stderr);
nowSecs = time(NULL);
gettimeofday(&tv, NULL);
now = gmtime(&nowSecs);
if (prefix[0] == '\0')
sprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02ld.%03ld UTC : %s\r\n",
now->tm_year, now->tm_mon, now->tm_mday,
now->tm_hour, now->tm_min, tv.tv_sec,
(long)tv.tv_usec / 1000, format);
else
sprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02ld.%03ld UTC : %s - %s\r\n",
now->tm_year, now->tm_mon, now->tm_mday,
now->tm_hour, now->tm_min, tv.tv_sec,
(long)tv.tv_usec / 1000, prefix, format);
if (my_use_file && (hFile != NULL))
fputs(tst, hFile);
} else {
if (prefix[0] == '\0')
sprintf( myformat, "%s\r\n", format);
else
sprintf( myformat, "%s - %s\r\n", prefix, format);
}
result = vsprintf(tst,myformat,params);
if (my_debug_output)
fputs(tst, stderr);
if (my_use_file && (hFile != NULL))
fputs(tst, hFile);
#endif
return result;
return result;
}
int ADbg::OutPut(int forLevel, const char * format,...) const
{
int result=0;
if (forLevel >= my_level) {
va_list tstlist;
int result=0;
va_start(tstlist, format);
if (forLevel >= my_level) {
va_list tstlist;
result = _OutPut(format,tstlist);
va_start(tstlist, format);
}
result = _OutPut(format,tstlist);
return result;
}
return result;
}
int ADbg::OutPut(const char * format,...) const
{
va_list tstlist;
va_list tstlist;
va_start(tstlist, format);
va_start(tstlist, format);
return _OutPut(format,tstlist);
return _OutPut(format,tstlist);
}
bool ADbg::setDebugFile(const char * NewFilename) {
bool result;
result = unsetDebugFile();
bool result;
result = unsetDebugFile();
if (result) {
result = false;
if (result) {
result = false;
#ifdef WIN32
hFile = CreateFileA(NewFilename, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile != INVALID_HANDLE_VALUE) {
SetFilePointer( hFile, 0, 0, FILE_END );
hFile = CreateFileA(NewFilename, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
result = true;
if (hFile != INVALID_HANDLE_VALUE) {
SetFilePointer( hFile, 0, 0, FILE_END );
result = true;
#else
hFile = fopen(NewFilename, "w+");
if (hFile != NULL) {
fseek(hFile, 0, SEEK_END);
hFile = fopen(NewFilename, "w+");
if (hFile != NULL) {
fseek(hFile, 0, SEEK_END);
#endif
OutPut(-1,"Debug hFile Opening succeeded");
OutPut(-1,"Debug hFile Opening succeeded");
}
else
OutPut(-1,"Debug hFile %s Opening failed",NewFilename);
}
}
else
OutPut(-1,"Debug hFile %s Opening failed",NewFilename);
}
return result;
return result;
}
bool ADbg::unsetDebugFile() {
bool result = (hFile == NULL);
bool result = (hFile == NULL);
#ifdef WIN32
if (hFile != NULL) {
result = (CloseHandle(hFile) != 0);
if (hFile != NULL) {
result = (CloseHandle(hFile) != 0);
#else
if (hFile != NULL) {
result = (fclose(hFile) == 0);
if (hFile != NULL) {
result = (fclose(hFile) == 0);
#endif
if (result) {
OutPut(-1,"Debug hFile Closing succeeded");
hFile = NULL;
}
}
return result;
if (result) {
OutPut(-1,"Debug hFile Closing succeeded");
hFile = NULL;
}
}
return result;
}
#endif // defined(LIBEBML_DEBUG)

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Julien Coloos <suiryc @ users.sf.net>
*/
#include <cassert>
#include <string>
@ -49,18 +49,18 @@ EbmlBinary::EbmlBinary()
EbmlBinary::EbmlBinary(const EbmlBinary & ElementToClone)
:EbmlElement(ElementToClone)
{
if (ElementToClone.Data == NULL)
Data = NULL;
else {
Data = (binary *)malloc(GetSize() * sizeof(binary));
assert(Data != NULL);
memcpy(Data, ElementToClone.Data, GetSize());
}
if (ElementToClone.Data == NULL)
Data = NULL;
else {
Data = (binary *)malloc(GetSize() * sizeof(binary));
assert(Data != NULL);
memcpy(Data, ElementToClone.Data, GetSize());
}
}
EbmlBinary::~EbmlBinary(void) {
if(Data)
free(Data);
if(Data)
free(Data);
}
EbmlBinary::operator const binary &() const {return *Data;}
@ -68,40 +68,40 @@ EbmlBinary::operator const binary &() const {return *Data;}
filepos_t EbmlBinary::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
output.writeFully(Data,GetSize());
output.writeFully(Data,GetSize());
return GetSize();
return GetSize();
}
/*!
\note no Default binary value handled
\note no Default binary value handled
*/
uint64 EbmlBinary::UpdateSize(bool /* bWithDefault */, bool /* bForceRender */)
{
return GetSize();
return GetSize();
}
filepos_t EbmlBinary::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (Data != NULL)
free(Data);
if (ReadFully == SCOPE_NO_DATA || !GetSize())
{
Data = NULL;
return GetSize();
}
if (Data != NULL)
free(Data);
Data = (binary *)malloc(GetSize());
if (ReadFully == SCOPE_NO_DATA || !GetSize())
{
Data = NULL;
return GetSize();
}
Data = (binary *)malloc(GetSize());
if (Data == NULL)
throw CRTError(std::string("Error allocating data"));
SetValueIsSet();
return input.read(Data, GetSize());
throw CRTError(std::string("Error allocating data"));
SetValueIsSet();
return input.read(Data, GetSize());
}
bool EbmlBinary::operator==(const EbmlBinary & ElementToCompare) const
{
return ((GetSize() == ElementToCompare.GetSize()) && !memcmp(Data, ElementToCompare.Data, GetSize()));
return ((GetSize() == ElementToCompare.GetSize()) && !memcmp(Data, ElementToCompare.Data, GetSize()));
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlContexts.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlContexts.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlContexts.h"
#include "ebml/EbmlCrc32.h"
@ -41,8 +41,8 @@ START_LIBEBML_NAMESPACE
static const EbmlSemantic EbmlGlobal_ContextList[2] =
{
EbmlSemantic(false, false, EBML_INFO(EbmlCrc32)), ///< EbmlCrc32
EbmlSemantic(false, false, EBML_INFO(EbmlVoid)), ///< EbmlVoid
EbmlSemantic(false, false, EBML_INFO(EbmlCrc32)), ///< EbmlCrc32
EbmlSemantic(false, false, EBML_INFO(EbmlVoid)), ///< EbmlVoid
};
const EbmlSemanticContext Context_EbmlGlobal = EbmlSemanticContext(0, NULL, NULL, *GetEbmlGlobal_Context, NULL);
@ -51,7 +51,7 @@ static const EbmlSemanticContext EbmlGlobal_Context = EbmlSemanticContext(counto
const EbmlSemanticContext & GetEbmlGlobal_Context()
{
return EbmlGlobal_Context;
return EbmlGlobal_Context;
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlCrc32.cpp 1155 2005-05-06 11:43:38Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\file
\version \$Id: EbmlCrc32.cpp 1155 2005-05-06 11:43:38Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
*/
#include "ebml/EbmlCrc32.h"
#include "ebml/EbmlContexts.h"
@ -54,129 +54,129 @@ DEFINE_EBML_CLASS_GLOBAL(EbmlCrc32, 0xBF, 1, "EBMLCrc32\0ratamadabapa");
const uint32 EbmlCrc32::m_tab[] = {
#ifdef WORDS_BIGENDIAN
0x00000000L, 0x96300777L, 0x2c610eeeL, 0xba510999L, 0x19c46d07L,
0x8ff46a70L, 0x35a563e9L, 0xa395649eL, 0x3288db0eL, 0xa4b8dc79L,
0x1ee9d5e0L, 0x88d9d297L, 0x2b4cb609L, 0xbd7cb17eL, 0x072db8e7L,
0x911dbf90L, 0x6410b71dL, 0xf220b06aL, 0x4871b9f3L, 0xde41be84L,
0x7dd4da1aL, 0xebe4dd6dL, 0x51b5d4f4L, 0xc785d383L, 0x56986c13L,
0xc0a86b64L, 0x7af962fdL, 0xecc9658aL, 0x4f5c0114L, 0xd96c0663L,
0x633d0ffaL, 0xf50d088dL, 0xc8206e3bL, 0x5e10694cL, 0xe44160d5L,
0x727167a2L, 0xd1e4033cL, 0x47d4044bL, 0xfd850dd2L, 0x6bb50aa5L,
0xfaa8b535L, 0x6c98b242L, 0xd6c9bbdbL, 0x40f9bcacL, 0xe36cd832L,
0x755cdf45L, 0xcf0dd6dcL, 0x593dd1abL, 0xac30d926L, 0x3a00de51L,
0x8051d7c8L, 0x1661d0bfL, 0xb5f4b421L, 0x23c4b356L, 0x9995bacfL,
0x0fa5bdb8L, 0x9eb80228L, 0x0888055fL, 0xb2d90cc6L, 0x24e90bb1L,
0x877c6f2fL, 0x114c6858L, 0xab1d61c1L, 0x3d2d66b6L, 0x9041dc76L,
0x0671db01L, 0xbc20d298L, 0x2a10d5efL, 0x8985b171L, 0x1fb5b606L,
0xa5e4bf9fL, 0x33d4b8e8L, 0xa2c90778L, 0x34f9000fL, 0x8ea80996L,
0x18980ee1L, 0xbb0d6a7fL, 0x2d3d6d08L, 0x976c6491L, 0x015c63e6L,
0xf4516b6bL, 0x62616c1cL, 0xd8306585L, 0x4e0062f2L, 0xed95066cL,
0x7ba5011bL, 0xc1f40882L, 0x57c40ff5L, 0xc6d9b065L, 0x50e9b712L,
0xeab8be8bL, 0x7c88b9fcL, 0xdf1ddd62L, 0x492dda15L, 0xf37cd38cL,
0x654cd4fbL, 0x5861b24dL, 0xce51b53aL, 0x7400bca3L, 0xe230bbd4L,
0x41a5df4aL, 0xd795d83dL, 0x6dc4d1a4L, 0xfbf4d6d3L, 0x6ae96943L,
0xfcd96e34L, 0x468867adL, 0xd0b860daL, 0x732d0444L, 0xe51d0333L,
0x5f4c0aaaL, 0xc97c0dddL, 0x3c710550L, 0xaa410227L, 0x10100bbeL,
0x86200cc9L, 0x25b56857L, 0xb3856f20L, 0x09d466b9L, 0x9fe461ceL,
0x0ef9de5eL, 0x98c9d929L, 0x2298d0b0L, 0xb4a8d7c7L, 0x173db359L,
0x810db42eL, 0x3b5cbdb7L, 0xad6cbac0L, 0x2083b8edL, 0xb6b3bf9aL,
0x0ce2b603L, 0x9ad2b174L, 0x3947d5eaL, 0xaf77d29dL, 0x1526db04L,
0x8316dc73L, 0x120b63e3L, 0x843b6494L, 0x3e6a6d0dL, 0xa85a6a7aL,
0x0bcf0ee4L, 0x9dff0993L, 0x27ae000aL, 0xb19e077dL, 0x44930ff0L,
0xd2a30887L, 0x68f2011eL, 0xfec20669L, 0x5d5762f7L, 0xcb676580L,
0x71366c19L, 0xe7066b6eL, 0x761bd4feL, 0xe02bd389L, 0x5a7ada10L,
0xcc4add67L, 0x6fdfb9f9L, 0xf9efbe8eL, 0x43beb717L, 0xd58eb060L,
0xe8a3d6d6L, 0x7e93d1a1L, 0xc4c2d838L, 0x52f2df4fL, 0xf167bbd1L,
0x6757bca6L, 0xdd06b53fL, 0x4b36b248L, 0xda2b0dd8L, 0x4c1b0aafL,
0xf64a0336L, 0x607a0441L, 0xc3ef60dfL, 0x55df67a8L, 0xef8e6e31L,
0x79be6946L, 0x8cb361cbL, 0x1a8366bcL, 0xa0d26f25L, 0x36e26852L,
0x95770cccL, 0x03470bbbL, 0xb9160222L, 0x2f260555L, 0xbe3bbac5L,
0x280bbdb2L, 0x925ab42bL, 0x046ab35cL, 0xa7ffd7c2L, 0x31cfd0b5L,
0x8b9ed92cL, 0x1daede5bL, 0xb0c2649bL, 0x26f263ecL, 0x9ca36a75L,
0x0a936d02L, 0xa906099cL, 0x3f360eebL, 0x85670772L, 0x13570005L,
0x824abf95L, 0x147ab8e2L, 0xae2bb17bL, 0x381bb60cL, 0x9b8ed292L,
0x0dbed5e5L, 0xb7efdc7cL, 0x21dfdb0bL, 0xd4d2d386L, 0x42e2d4f1L,
0xf8b3dd68L, 0x6e83da1fL, 0xcd16be81L, 0x5b26b9f6L, 0xe177b06fL,
0x7747b718L, 0xe65a0888L, 0x706a0fffL, 0xca3b0666L, 0x5c0b0111L,
0xff9e658fL, 0x69ae62f8L, 0xd3ff6b61L, 0x45cf6c16L, 0x78e20aa0L,
0xeed20dd7L, 0x5483044eL, 0xc2b30339L, 0x612667a7L, 0xf71660d0L,
0x4d476949L, 0xdb776e3eL, 0x4a6ad1aeL, 0xdc5ad6d9L, 0x660bdf40L,
0xf03bd837L, 0x53aebca9L, 0xc59ebbdeL, 0x7fcfb247L, 0xe9ffb530L,
0x1cf2bdbdL, 0x8ac2bacaL, 0x3093b353L, 0xa6a3b424L, 0x0536d0baL,
0x9306d7cdL, 0x2957de54L, 0xbf67d923L, 0x2e7a66b3L, 0xb84a61c4L,
0x021b685dL, 0x942b6f2aL, 0x37be0bb4L, 0xa18e0cc3L, 0x1bdf055aL,
0x8def022dL
0x00000000L, 0x96300777L, 0x2c610eeeL, 0xba510999L, 0x19c46d07L,
0x8ff46a70L, 0x35a563e9L, 0xa395649eL, 0x3288db0eL, 0xa4b8dc79L,
0x1ee9d5e0L, 0x88d9d297L, 0x2b4cb609L, 0xbd7cb17eL, 0x072db8e7L,
0x911dbf90L, 0x6410b71dL, 0xf220b06aL, 0x4871b9f3L, 0xde41be84L,
0x7dd4da1aL, 0xebe4dd6dL, 0x51b5d4f4L, 0xc785d383L, 0x56986c13L,
0xc0a86b64L, 0x7af962fdL, 0xecc9658aL, 0x4f5c0114L, 0xd96c0663L,
0x633d0ffaL, 0xf50d088dL, 0xc8206e3bL, 0x5e10694cL, 0xe44160d5L,
0x727167a2L, 0xd1e4033cL, 0x47d4044bL, 0xfd850dd2L, 0x6bb50aa5L,
0xfaa8b535L, 0x6c98b242L, 0xd6c9bbdbL, 0x40f9bcacL, 0xe36cd832L,
0x755cdf45L, 0xcf0dd6dcL, 0x593dd1abL, 0xac30d926L, 0x3a00de51L,
0x8051d7c8L, 0x1661d0bfL, 0xb5f4b421L, 0x23c4b356L, 0x9995bacfL,
0x0fa5bdb8L, 0x9eb80228L, 0x0888055fL, 0xb2d90cc6L, 0x24e90bb1L,
0x877c6f2fL, 0x114c6858L, 0xab1d61c1L, 0x3d2d66b6L, 0x9041dc76L,
0x0671db01L, 0xbc20d298L, 0x2a10d5efL, 0x8985b171L, 0x1fb5b606L,
0xa5e4bf9fL, 0x33d4b8e8L, 0xa2c90778L, 0x34f9000fL, 0x8ea80996L,
0x18980ee1L, 0xbb0d6a7fL, 0x2d3d6d08L, 0x976c6491L, 0x015c63e6L,
0xf4516b6bL, 0x62616c1cL, 0xd8306585L, 0x4e0062f2L, 0xed95066cL,
0x7ba5011bL, 0xc1f40882L, 0x57c40ff5L, 0xc6d9b065L, 0x50e9b712L,
0xeab8be8bL, 0x7c88b9fcL, 0xdf1ddd62L, 0x492dda15L, 0xf37cd38cL,
0x654cd4fbL, 0x5861b24dL, 0xce51b53aL, 0x7400bca3L, 0xe230bbd4L,
0x41a5df4aL, 0xd795d83dL, 0x6dc4d1a4L, 0xfbf4d6d3L, 0x6ae96943L,
0xfcd96e34L, 0x468867adL, 0xd0b860daL, 0x732d0444L, 0xe51d0333L,
0x5f4c0aaaL, 0xc97c0dddL, 0x3c710550L, 0xaa410227L, 0x10100bbeL,
0x86200cc9L, 0x25b56857L, 0xb3856f20L, 0x09d466b9L, 0x9fe461ceL,
0x0ef9de5eL, 0x98c9d929L, 0x2298d0b0L, 0xb4a8d7c7L, 0x173db359L,
0x810db42eL, 0x3b5cbdb7L, 0xad6cbac0L, 0x2083b8edL, 0xb6b3bf9aL,
0x0ce2b603L, 0x9ad2b174L, 0x3947d5eaL, 0xaf77d29dL, 0x1526db04L,
0x8316dc73L, 0x120b63e3L, 0x843b6494L, 0x3e6a6d0dL, 0xa85a6a7aL,
0x0bcf0ee4L, 0x9dff0993L, 0x27ae000aL, 0xb19e077dL, 0x44930ff0L,
0xd2a30887L, 0x68f2011eL, 0xfec20669L, 0x5d5762f7L, 0xcb676580L,
0x71366c19L, 0xe7066b6eL, 0x761bd4feL, 0xe02bd389L, 0x5a7ada10L,
0xcc4add67L, 0x6fdfb9f9L, 0xf9efbe8eL, 0x43beb717L, 0xd58eb060L,
0xe8a3d6d6L, 0x7e93d1a1L, 0xc4c2d838L, 0x52f2df4fL, 0xf167bbd1L,
0x6757bca6L, 0xdd06b53fL, 0x4b36b248L, 0xda2b0dd8L, 0x4c1b0aafL,
0xf64a0336L, 0x607a0441L, 0xc3ef60dfL, 0x55df67a8L, 0xef8e6e31L,
0x79be6946L, 0x8cb361cbL, 0x1a8366bcL, 0xa0d26f25L, 0x36e26852L,
0x95770cccL, 0x03470bbbL, 0xb9160222L, 0x2f260555L, 0xbe3bbac5L,
0x280bbdb2L, 0x925ab42bL, 0x046ab35cL, 0xa7ffd7c2L, 0x31cfd0b5L,
0x8b9ed92cL, 0x1daede5bL, 0xb0c2649bL, 0x26f263ecL, 0x9ca36a75L,
0x0a936d02L, 0xa906099cL, 0x3f360eebL, 0x85670772L, 0x13570005L,
0x824abf95L, 0x147ab8e2L, 0xae2bb17bL, 0x381bb60cL, 0x9b8ed292L,
0x0dbed5e5L, 0xb7efdc7cL, 0x21dfdb0bL, 0xd4d2d386L, 0x42e2d4f1L,
0xf8b3dd68L, 0x6e83da1fL, 0xcd16be81L, 0x5b26b9f6L, 0xe177b06fL,
0x7747b718L, 0xe65a0888L, 0x706a0fffL, 0xca3b0666L, 0x5c0b0111L,
0xff9e658fL, 0x69ae62f8L, 0xd3ff6b61L, 0x45cf6c16L, 0x78e20aa0L,
0xeed20dd7L, 0x5483044eL, 0xc2b30339L, 0x612667a7L, 0xf71660d0L,
0x4d476949L, 0xdb776e3eL, 0x4a6ad1aeL, 0xdc5ad6d9L, 0x660bdf40L,
0xf03bd837L, 0x53aebca9L, 0xc59ebbdeL, 0x7fcfb247L, 0xe9ffb530L,
0x1cf2bdbdL, 0x8ac2bacaL, 0x3093b353L, 0xa6a3b424L, 0x0536d0baL,
0x9306d7cdL, 0x2957de54L, 0xbf67d923L, 0x2e7a66b3L, 0xb84a61c4L,
0x021b685dL, 0x942b6f2aL, 0x37be0bb4L, 0xa18e0cc3L, 0x1bdf055aL,
0x8def022dL
#else
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
0x2d02ef8dL
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
0x2d02ef8dL
#endif
};
EbmlCrc32::EbmlCrc32()
{
ResetCRC();
SetDefaultSize(4);
m_crc_final = 0;
SetSize_(4);
//This EbmlElement has been set
// SetValueIsSet();
ResetCRC();
SetDefaultSize(4);
m_crc_final = 0;
SetSize_(4);
//This EbmlElement has been set
// SetValueIsSet();
}
EbmlCrc32::EbmlCrc32(const EbmlCrc32 & ElementToClone)
:EbmlBinary(ElementToClone)
{
m_crc = ElementToClone.m_crc;
m_crc_final = ElementToClone.m_crc_final;
m_crc = ElementToClone.m_crc;
m_crc_final = ElementToClone.m_crc_final;
}
void EbmlCrc32::ResetCRC()
@ -191,163 +191,163 @@ void EbmlCrc32::UpdateByte(binary b)
void EbmlCrc32::AddElementCRC32(EbmlElement &ElementToCRC)
{
// Use a special IOCallback class that Render's to memory instead of to disk
MemIOCallback memoryBuffer;
ElementToCRC.Render(memoryBuffer, true, true);
// Use a special IOCallback class that Render's to memory instead of to disk
MemIOCallback memoryBuffer;
ElementToCRC.Render(memoryBuffer, true, true);
Update(memoryBuffer.GetDataBuffer(), memoryBuffer.GetDataBufferSize());
// Finalize();
Update(memoryBuffer.GetDataBuffer(), memoryBuffer.GetDataBufferSize());
// Finalize();
};
bool EbmlCrc32::CheckElementCRC32(EbmlElement &ElementToCRC)
{
MemIOCallback memoryBuffer;
ElementToCRC.Render(memoryBuffer);
MemIOCallback memoryBuffer;
ElementToCRC.Render(memoryBuffer);
return CheckCRC(m_crc_final, memoryBuffer.GetDataBuffer(), memoryBuffer.GetDataBufferSize());
return CheckCRC(m_crc_final, memoryBuffer.GetDataBuffer(), memoryBuffer.GetDataBufferSize());
};
filepos_t EbmlCrc32::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
filepos_t Result = 4;
filepos_t Result = 4;
if (Result != 0) {
output.writeFully(&m_crc_final, Result);
}
if (Result != 0) {
output.writeFully(&m_crc_final, Result);
}
if (Result < GetDefaultSize()) {
// pad the rest with 0
binary *Pad = new (std::nothrow) binary[GetDefaultSize() - Result];
if (Pad != NULL) {
memset(Pad, 0x00, GetDefaultSize() - Result);
output.writeFully(Pad, GetDefaultSize() - Result);
if (Result < GetDefaultSize()) {
// pad the rest with 0
binary *Pad = new (std::nothrow) binary[GetDefaultSize() - Result];
if (Pad != NULL) {
memset(Pad, 0x00, GetDefaultSize() - Result);
output.writeFully(Pad, GetDefaultSize() - Result);
Result = GetDefaultSize();
delete [] Pad;
}
}
Result = GetDefaultSize();
delete [] Pad;
}
}
return Result;
return Result;
}
filepos_t EbmlCrc32::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
binary *Buffer = new (std::nothrow) binary[GetSize()];
if (Buffer == NULL) {
// impossible to read, skip it
input.setFilePointer(GetSize(), seek_current);
} else {
input.readFully(Buffer, GetSize());
if (ReadFully != SCOPE_NO_DATA)
{
binary *Buffer = new (std::nothrow) binary[GetSize()];
if (Buffer == NULL) {
// impossible to read, skip it
input.setFilePointer(GetSize(), seek_current);
} else {
input.readFully(Buffer, GetSize());
memcpy((void *)&m_crc_final, Buffer, 4);
delete [] Buffer;
SetValueIsSet();
}
}
memcpy((void *)&m_crc_final, Buffer, 4);
delete [] Buffer;
SetValueIsSet();
}
}
return GetSize();
return GetSize();
}
bool EbmlCrc32::CheckCRC(uint32 inputCRC, const binary *input, uint32 length)
{
uint32 crc = CRC32_NEGL;
uint32 crc = CRC32_NEGL;
for(; !IsAligned<uint32>(input) && length > 0; length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
for(; !IsAligned<uint32>(input) && length > 0; length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
while (length >= 4)
{
crc ^= *(const uint32 *)input;
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
length -= 4;
input += 4;
}
while (length >= 4)
{
crc ^= *(const uint32 *)input;
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
length -= 4;
input += 4;
}
while (length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
while (length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
//Now we finalize the CRC32
crc ^= CRC32_NEGL;
if (crc == inputCRC)
return true;
return false;
//Now we finalize the CRC32
crc ^= CRC32_NEGL;
if (crc == inputCRC)
return true;
return false;
};
void EbmlCrc32::FillCRC32(const binary *s, uint32 n)
{
ResetCRC();
Update(s, n);
Finalize();
/*uint32 crc = CRC32_NEGL;
ResetCRC();
Update(s, n);
Finalize();
for(; !IsAligned<uint32>(s) && n > 0; n--)
crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc);
/*uint32 crc = CRC32_NEGL;
while (n >= 4)
{
crc ^= *(const uint32 *)s;
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
n -= 4;
s += 4;
}
for(; !IsAligned<uint32>(s) && n > 0; n--)
crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc);
while (n--)
crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc);
while (n >= 4)
{
crc ^= *(const uint32 *)s;
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
n -= 4;
s += 4;
}
m_crc = crc;
while (n--)
crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc);
//Now we finalize the CRC32
m_crc ^= CRC32_NEGL;
//for (unsigned int i = 0; i < 4; i++)
// (&last_crc32)[i] = GetCrcByte(i);*/
m_crc = crc;
//Now we finalize the CRC32
m_crc ^= CRC32_NEGL;
//for (unsigned int i = 0; i < 4; i++)
// (&last_crc32)[i] = GetCrcByte(i);*/
}
void EbmlCrc32::Update(const binary *input, uint32 length)
{
uint32 crc = m_crc;
uint32 crc = m_crc;
for(; !IsAligned<uint32>(input) && length > 0; length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
for(; !IsAligned<uint32>(input) && length > 0; length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
while (length >= 4)
{
crc ^= *(const uint32 *)input;
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
length -= 4;
input += 4;
}
while (length >= 4)
{
crc ^= *(const uint32 *)input;
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc);
length -= 4;
input += 4;
}
while (length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
while (length--)
crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc);
m_crc = crc;
m_crc = crc;
}
void EbmlCrc32::Finalize()
{
//Finalize the CRC32
m_crc ^= CRC32_NEGL;
//Copy it over to completed CRC32 memeber
m_crc_final = m_crc;
//Reset the holding CRC member (m_crc)
ResetCRC();
//This EbmlElement has been set
SetValueIsSet();
//Finalize the CRC32
m_crc ^= CRC32_NEGL;
//Copy it over to completed CRC32 memeber
m_crc_final = m_crc;
//Reset the holding CRC member (m_crc)
ResetCRC();
//This EbmlElement has been set
SetValueIsSet();
}
END_LIBEBML_NAMESPACE

View File

@ -27,9 +27,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlDate.cpp 1079 2005-03-03 13:18:14Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlDate.cpp 1079 2005-03-03 13:18:14Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include <cassert>
@ -42,47 +42,47 @@ const uint64 EbmlDate::UnixEpochDelay = 978307200; // 2001/01/01 00:00:00 UTC
EbmlDate::EbmlDate(const EbmlDate & ElementToClone)
:EbmlElement(ElementToClone)
{
myDate = ElementToClone.myDate;
myDate = ElementToClone.myDate;
}
filepos_t EbmlDate::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
if (GetSize() != 0) {
assert(GetSize() == 8);
binary Buffer[8];
input.readFully(Buffer, GetSize());
if (ReadFully != SCOPE_NO_DATA)
{
if (GetSize() != 0) {
assert(GetSize() == 8);
binary Buffer[8];
input.readFully(Buffer, GetSize());
big_int64 b64;
b64.Eval(Buffer);
big_int64 b64;
b64.Eval(Buffer);
myDate = b64;
SetValueIsSet();
}
}
myDate = b64;
SetValueIsSet();
}
}
return GetSize();
return GetSize();
}
filepos_t EbmlDate::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
if (GetSize() != 0) {
assert(GetSize() == 8);
big_int64 b64(myDate);
if (GetSize() != 0) {
assert(GetSize() == 8);
big_int64 b64(myDate);
output.writeFully(&b64.endian(),GetSize());
}
output.writeFully(&b64.endian(),GetSize());
}
return GetSize();
return GetSize();
}
bool EbmlDate::IsSmallerThan(const EbmlElement *Cmp) const
{
if (EbmlId(*this) == EbmlId(*Cmp))
return this->myDate < static_cast<const EbmlDate *>(Cmp)->myDate;
else
return false;
if (EbmlId(*this) == EbmlId(*Cmp))
return this->myDate < static_cast<const EbmlDate *>(Cmp)->myDate;
else
return false;
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlDummy.h"
#include "ebml/EbmlContexts.h"

File diff suppressed because it is too large Load Diff

View File

@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include <cassert>
@ -43,14 +43,14 @@ START_LIBEBML_NAMESPACE
EbmlFloat::EbmlFloat(const EbmlFloat::Precision prec)
:EbmlElement(0, false)
{
SetPrecision(prec);
SetPrecision(prec);
}
EbmlFloat::EbmlFloat(const double aDefaultValue, const EbmlFloat::Precision prec)
:EbmlElement(0, true), Value(aDefaultValue), DefaultValue(aDefaultValue)
{
SetDefaultIsSet();
SetPrecision(prec);
SetDefaultIsSet();
SetPrecision(prec);
}
EbmlFloat::EbmlFloat(const EbmlFloat & ElementToClone)
@ -83,76 +83,76 @@ EbmlFloat & EbmlFloat::SetValue(double NewValue) {
}
/*!
\todo handle exception on errors
\todo handle 10 bits precision
\todo handle exception on errors
\todo handle 10 bits precision
*/
filepos_t EbmlFloat::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
assert(GetSize() == 4 || GetSize() == 8);
assert(GetSize() == 4 || GetSize() == 8);
if (GetSize() == 4) {
float val = Value;
int Tmp;
memcpy(&Tmp, &val, 4);
big_int32 TmpToWrite(Tmp);
output.writeFully(&TmpToWrite.endian(), GetSize());
} else if (GetSize() == 8) {
double val = Value;
int64 Tmp;
memcpy(&Tmp, &val, 8);
big_int64 TmpToWrite(Tmp);
output.writeFully(&TmpToWrite.endian(), GetSize());
}
if (GetSize() == 4) {
float val = Value;
int Tmp;
memcpy(&Tmp, &val, 4);
big_int32 TmpToWrite(Tmp);
output.writeFully(&TmpToWrite.endian(), GetSize());
} else if (GetSize() == 8) {
double val = Value;
int64 Tmp;
memcpy(&Tmp, &val, 8);
big_int64 TmpToWrite(Tmp);
output.writeFully(&TmpToWrite.endian(), GetSize());
}
return GetSize();
return GetSize();
}
uint64 EbmlFloat::UpdateSize(bool bWithDefault, bool /* bForceRender */)
{
if (!bWithDefault && IsDefaultValue())
return 0;
return GetSize();
if (!bWithDefault && IsDefaultValue())
return 0;
return GetSize();
}
/*!
\todo remove the hack for possible endianess pb (test on little & big endian)
\todo remove the hack for possible endianess pb (test on little & big endian)
*/
filepos_t EbmlFloat::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
binary Buffer[20];
assert(GetSize() <= 20);
input.readFully(Buffer, GetSize());
if (ReadFully != SCOPE_NO_DATA)
{
binary Buffer[20];
assert(GetSize() <= 20);
input.readFully(Buffer, GetSize());
if (GetSize() == 4) {
big_int32 TmpRead;
TmpRead.Eval(Buffer);
int32 tmpp = int32(TmpRead);
float val;
memcpy(&val, &tmpp, 4);
Value = val;
SetValueIsSet();
} else if (GetSize() == 8) {
big_int64 TmpRead;
TmpRead.Eval(Buffer);
int64 tmpp = int64(TmpRead);
double val;
memcpy(&val, &tmpp, 8);
Value = val;
SetValueIsSet();
}
}
if (GetSize() == 4) {
big_int32 TmpRead;
TmpRead.Eval(Buffer);
int32 tmpp = int32(TmpRead);
float val;
memcpy(&val, &tmpp, 4);
Value = val;
SetValueIsSet();
} else if (GetSize() == 8) {
big_int64 TmpRead;
TmpRead.Eval(Buffer);
int64 tmpp = int64(TmpRead);
double val;
memcpy(&val, &tmpp, 8);
Value = val;
SetValueIsSet();
}
}
return GetSize();
return GetSize();
}
bool EbmlFloat::IsSmallerThan(const EbmlElement *Cmp) const
{
if (EbmlId(*this) == EbmlId(*Cmp))
return this->Value < static_cast<const EbmlFloat *>(Cmp)->Value;
else
return false;
if (EbmlId(*this) == EbmlId(*Cmp))
return this->Value < static_cast<const EbmlFloat *>(Cmp)->Value;
else
return false;
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlHead.cpp 1096 2005-03-17 09:14:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlHead.cpp 1096 2005-03-17 09:14:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlHead.h"
#include "ebml/EbmlSubHead.h"

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include <cassert>
@ -47,9 +47,9 @@ START_LIBEBML_NAMESPACE
EbmlMaster::EbmlMaster(const EbmlSemanticContext & aContext, bool bSizeIsknown)
:EbmlElement(0), Context(aContext), bChecksumUsed(bChecksumUsedByDefault)
{
SetSizeIsFinite(bSizeIsknown);
SetValueIsSet();
ProcessMandatory();
SetSizeIsFinite(bSizeIsknown);
SetValueIsSet();
ProcessMandatory();
}
EbmlMaster::EbmlMaster(const EbmlMaster & ElementToClone)
@ -59,500 +59,500 @@ EbmlMaster::EbmlMaster(const EbmlMaster & ElementToClone)
,bChecksumUsed(ElementToClone.bChecksumUsed)
,Checksum(ElementToClone.Checksum)
{
// add a clone of the list
std::vector<EbmlElement *>::const_iterator Itr = ElementToClone.ElementList.begin();
std::vector<EbmlElement *>::iterator myItr = ElementList.begin();
while (Itr != ElementToClone.ElementList.end())
{
*myItr = (*Itr)->Clone();
++Itr; ++myItr;
}
// add a clone of the list
std::vector<EbmlElement *>::const_iterator Itr = ElementToClone.ElementList.begin();
std::vector<EbmlElement *>::iterator myItr = ElementList.begin();
while (Itr != ElementToClone.ElementList.end())
{
*myItr = (*Itr)->Clone();
++Itr; ++myItr;
}
}
EbmlMaster::~EbmlMaster()
{
assert(!IsLocked()); // you're trying to delete a locked element !!!
assert(!IsLocked()); // you're trying to delete a locked element !!!
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (!(*ElementList[Index]).IsLocked()) {
delete ElementList[Index];
}
}
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (!(*ElementList[Index]).IsLocked()) {
delete ElementList[Index];
}
}
}
/*!
\todo handle exception on errors
\todo write all the Mandatory elements in the Context, otherwise assert
\todo handle exception on errors
\todo write all the Mandatory elements in the Context, otherwise assert
*/
filepos_t EbmlMaster::RenderData(IOCallback & output, bool bForceRender, bool bWithDefault)
{
filepos_t Result = 0;
size_t Index;
filepos_t Result = 0;
size_t Index;
if (!bForceRender) {
assert(CheckMandatory());
}
if (!bForceRender) {
assert(CheckMandatory());
}
if (!bChecksumUsed) { // old school
for (Index = 0; Index < ElementList.size(); Index++) {
if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
continue;
Result += (ElementList[Index])->Render(output, bWithDefault, false ,bForceRender);
}
} else { // new school
MemIOCallback TmpBuf(GetSize() - 6);
for (Index = 0; Index < ElementList.size(); Index++) {
if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
continue;
(ElementList[Index])->Render(TmpBuf, bWithDefault, false ,bForceRender);
}
Checksum.FillCRC32(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
Result += Checksum.Render(output, true, false ,bForceRender);
output.writeFully(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
Result += TmpBuf.GetDataBufferSize();
}
if (!bChecksumUsed) { // old school
for (Index = 0; Index < ElementList.size(); Index++) {
if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
continue;
Result += (ElementList[Index])->Render(output, bWithDefault, false ,bForceRender);
}
} else { // new school
MemIOCallback TmpBuf(GetSize() - 6);
for (Index = 0; Index < ElementList.size(); Index++) {
if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
continue;
(ElementList[Index])->Render(TmpBuf, bWithDefault, false ,bForceRender);
}
Checksum.FillCRC32(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
Result += Checksum.Render(output, true, false ,bForceRender);
output.writeFully(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
Result += TmpBuf.GetDataBufferSize();
}
return Result;
return Result;
}
/*!
\todo We might be able to forbid elements that don't exist in the context
\todo We might be able to forbid elements that don't exist in the context
*/
bool EbmlMaster::PushElement(EbmlElement & element)
{
ElementList.push_back(&element);
return true;
ElementList.push_back(&element);
return true;
}
uint64 EbmlMaster::UpdateSize(bool bWithDefault, bool bForceRender)
{
SetSize_(0);
SetSize_(0);
if (!IsFiniteSize())
return (0-1);
if (!IsFiniteSize())
return (0-1);
if (!bForceRender) {
assert(CheckMandatory());
if (!bForceRender) {
assert(CheckMandatory());
}
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
continue;
(ElementList[Index])->UpdateSize(bWithDefault, bForceRender);
uint64 SizeToAdd = (ElementList[Index])->ElementSize(bWithDefault);
#if defined(LIBEBML_DEBUG)
if (static_cast<int64>(SizeToAdd) == (0-1))
return (0-1);
#endif // LIBEBML_DEBUG
SetSize_(GetSize() + SizeToAdd);
}
if (bChecksumUsed) {
SetSize_(GetSize() + Checksum.ElementSize());
}
return GetSize();
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
continue;
(ElementList[Index])->UpdateSize(bWithDefault, bForceRender);
uint64 SizeToAdd = (ElementList[Index])->ElementSize(bWithDefault);
#if defined(LIBEBML_DEBUG)
if (static_cast<int64>(SizeToAdd) == (0-1))
return (0-1);
#endif // LIBEBML_DEBUG
SetSize_(GetSize() + SizeToAdd);
}
if (bChecksumUsed) {
SetSize_(GetSize() + Checksum.ElementSize());
}
return GetSize();
}
filepos_t EbmlMaster::WriteHead(IOCallback & output, int nSizeLength, bool bWithDefault)
{
SetSizeLength(nSizeLength);
return RenderHead(output, false, bWithDefault);
SetSizeLength(nSizeLength);
return RenderHead(output, false, bWithDefault);
}
/*!
\todo this code is very suspicious !
\todo this code is very suspicious !
*/
filepos_t EbmlMaster::ReadData(IOCallback & input, ScopeMode /* ReadFully */)
{
input.setFilePointer(GetSize(), seek_current);
return GetSize();
input.setFilePointer(GetSize(), seek_current);
return GetSize();
}
/*!
\note Hopefully no global element is mandatory
\todo should be called for ALL EbmlMaster element on construction
\note Hopefully no global element is mandatory
\todo should be called for ALL EbmlMaster element on construction
*/
bool EbmlMaster::ProcessMandatory()
{
if (EBML_CTX_SIZE(Context) == 0)
{
return true;
}
if (EBML_CTX_SIZE(Context) == 0)
{
return true;
}
assert(Context.GetSize() != 0);
assert(Context.GetSize() != 0);
unsigned int EltIdx;
for (EltIdx = 0; EltIdx < EBML_CTX_SIZE(Context); EltIdx++) {
if (EBML_CTX_IDX(Context,EltIdx).IsMandatory() && EBML_CTX_IDX(Context,EltIdx).IsUnique()) {
// assert(EBML_CTX_IDX(Context,EltIdx).Create != NULL);
unsigned int EltIdx;
for (EltIdx = 0; EltIdx < EBML_CTX_SIZE(Context); EltIdx++) {
if (EBML_CTX_IDX(Context,EltIdx).IsMandatory() && EBML_CTX_IDX(Context,EltIdx).IsUnique()) {
// assert(EBML_CTX_IDX(Context,EltIdx).Create != NULL);
PushElement(EBML_SEM_CREATE(EBML_CTX_IDX(Context,EltIdx)));
}
}
return true;
}
}
return true;
}
bool EbmlMaster::CheckMandatory() const
{
assert(Context.GetSize() != 0);
assert(Context.GetSize() != 0);
unsigned int EltIdx;
for (EltIdx = 0; EltIdx < EBML_CTX_SIZE(Context); EltIdx++) {
if (EBML_CTX_IDX(Context,EltIdx).IsMandatory()) {
if (FindElt(EBML_CTX_IDX_INFO(Context,EltIdx)) == NULL) {
unsigned int EltIdx;
for (EltIdx = 0; EltIdx < EBML_CTX_SIZE(Context); EltIdx++) {
if (EBML_CTX_IDX(Context,EltIdx).IsMandatory()) {
if (FindElt(EBML_CTX_IDX_INFO(Context,EltIdx)) == NULL) {
#if defined(LIBEBML_DEBUG)
// you are missing this Mandatory element
// const char * MissingName = EBML_INFO_NAME(EBML_CTX_IDX_INFO(Context,EltIdx));
// you are missing this Mandatory element
// const char * MissingName = EBML_INFO_NAME(EBML_CTX_IDX_INFO(Context,EltIdx));
#endif // LIBEBML_DEBUG
return false;
}
}
}
return false;
}
}
}
return true;
return true;
}
std::vector<std::string> EbmlMaster::FindAllMissingElements()
{
assert(Context.GetSize() != 0);
{
assert(Context.GetSize() != 0);
std::vector<std::string> missingElements;
std::vector<std::string> missingElements;
for (size_t ChildElementNo = 0; ChildElementNo < ElementList.size(); ChildElementNo++) {
EbmlElement *childElement = ElementList[ChildElementNo];
if (!childElement->ValueIsSet()) {
std::string missingValue;
missingValue = "The Child Element \"";
missingValue.append(EBML_NAME(childElement));
missingValue.append("\" of EbmlMaster \"");
missingValue.append(EBML_NAME(this));
missingValue.append("\", does not have a value set.");
missingElements.push_back(missingValue);
}
for (size_t ChildElementNo = 0; ChildElementNo < ElementList.size(); ChildElementNo++) {
EbmlElement *childElement = ElementList[ChildElementNo];
if (!childElement->ValueIsSet()) {
std::string missingValue;
missingValue = "The Child Element \"";
missingValue.append(EBML_NAME(childElement));
missingValue.append("\" of EbmlMaster \"");
missingValue.append(EBML_NAME(this));
missingValue.append("\", does not have a value set.");
missingElements.push_back(missingValue);
}
if (childElement->IsMaster()) {
EbmlMaster *childMaster = (EbmlMaster *)childElement;
if (childElement->IsMaster()) {
EbmlMaster *childMaster = (EbmlMaster *)childElement;
std::vector<std::string> childMissingElements = childMaster->FindAllMissingElements();
for (size_t s = 0; s < childMissingElements.size(); s++)
missingElements.push_back(childMissingElements[s]);
}
}
unsigned int EltIdx;
for (EltIdx = 0; EltIdx < EBML_CTX_SIZE(Context); EltIdx++) {
if (EBML_CTX_IDX(Context,EltIdx).IsMandatory()) {
if (FindElt(EBML_CTX_IDX_INFO(Context,EltIdx)) == NULL) {
std::string missingElement;
missingElement = "Missing element \"";
std::vector<std::string> childMissingElements = childMaster->FindAllMissingElements();
for (size_t s = 0; s < childMissingElements.size(); s++)
missingElements.push_back(childMissingElements[s]);
}
}
unsigned int EltIdx;
for (EltIdx = 0; EltIdx < EBML_CTX_SIZE(Context); EltIdx++) {
if (EBML_CTX_IDX(Context,EltIdx).IsMandatory()) {
if (FindElt(EBML_CTX_IDX_INFO(Context,EltIdx)) == NULL) {
std::string missingElement;
missingElement = "Missing element \"";
missingElement.append(EBML_INFO_NAME(EBML_CTX_IDX_INFO(Context,EltIdx)));
missingElement.append("\" in EbmlMaster \"");
missingElement.append("\" in EbmlMaster \"");
missingElement.append(EBML_INFO_NAME(*EBML_CTX_MASTER(Context)));
missingElement.append("\"");
missingElements.push_back(missingElement);
}
}
}
missingElement.append("\"");
missingElements.push_back(missingElement);
}
}
}
return missingElements;
return missingElements;
}
EbmlElement *EbmlMaster::FindElt(const EbmlCallbacks & Callbacks) const
{
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
EbmlElement * tmp = ElementList[Index];
if (EbmlId(*tmp) == EBML_INFO_ID(Callbacks))
return tmp;
}
size_t Index;
return NULL;
for (Index = 0; Index < ElementList.size(); Index++) {
EbmlElement * tmp = ElementList[Index];
if (EbmlId(*tmp) == EBML_INFO_ID(Callbacks))
return tmp;
}
return NULL;
}
EbmlElement *EbmlMaster::FindFirstElt(const EbmlCallbacks & Callbacks, bool bCreateIfNull)
{
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (ElementList[Index] && EbmlId(*(ElementList[Index])) == EBML_INFO_ID(Callbacks))
return ElementList[Index];
}
if (bCreateIfNull) {
// add the element
EbmlElement *NewElt = &EBML_INFO_CREATE(Callbacks);
if (NewElt == NULL)
return NULL;
size_t Index;
if (!PushElement(*NewElt)) {
delete NewElt;
NewElt = NULL;
}
return NewElt;
}
return NULL;
for (Index = 0; Index < ElementList.size(); Index++) {
if (ElementList[Index] && EbmlId(*(ElementList[Index])) == EBML_INFO_ID(Callbacks))
return ElementList[Index];
}
if (bCreateIfNull) {
// add the element
EbmlElement *NewElt = &EBML_INFO_CREATE(Callbacks);
if (NewElt == NULL)
return NULL;
if (!PushElement(*NewElt)) {
delete NewElt;
NewElt = NULL;
}
return NewElt;
}
return NULL;
}
EbmlElement *EbmlMaster::FindFirstElt(const EbmlCallbacks & Callbacks) const
{
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (EbmlId(*(ElementList[Index])) == EBML_INFO_ID(Callbacks))
return ElementList[Index];
}
return NULL;
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if (EbmlId(*(ElementList[Index])) == EBML_INFO_ID(Callbacks))
return ElementList[Index];
}
return NULL;
}
/*!
\todo only return elements that are from the same type !
\todo the element might be the unique in the context !
\todo only return elements that are from the same type !
\todo the element might be the unique in the context !
*/
EbmlElement *EbmlMaster::FindNextElt(const EbmlElement & PastElt, bool bCreateIfNull)
{
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if ((ElementList[Index]) == &PastElt) {
// found past element, new one is :
Index++;
break;
}
}
size_t Index;
while (Index < ElementList.size()) {
if ((EbmlId)PastElt == (EbmlId)(*ElementList[Index]))
break;
Index++;
}
for (Index = 0; Index < ElementList.size(); Index++) {
if ((ElementList[Index]) == &PastElt) {
// found past element, new one is :
Index++;
break;
}
}
if (Index != ElementList.size())
return ElementList[Index];
while (Index < ElementList.size()) {
if ((EbmlId)PastElt == (EbmlId)(*ElementList[Index]))
break;
Index++;
}
if (bCreateIfNull) {
// add the element
EbmlElement *NewElt = &(PastElt.CreateElement());
if (NewElt == NULL)
return NULL;
if (Index != ElementList.size())
return ElementList[Index];
if (!PushElement(*NewElt)) {
delete NewElt;
NewElt = NULL;
}
return NewElt;
}
if (bCreateIfNull) {
// add the element
EbmlElement *NewElt = &(PastElt.CreateElement());
if (NewElt == NULL)
return NULL;
return NULL;
if (!PushElement(*NewElt)) {
delete NewElt;
NewElt = NULL;
}
return NewElt;
}
return NULL;
}
EbmlElement *EbmlMaster::FindNextElt(const EbmlElement & PastElt) const
{
size_t Index;
for (Index = 0; Index < ElementList.size(); Index++) {
if ((ElementList[Index]) == &PastElt) {
// found past element, new one is :
Index++;
break;
}
}
size_t Index;
while (Index < ElementList.size()) {
if ((EbmlId)PastElt == (EbmlId)(*ElementList[Index]))
return ElementList[Index];
Index++;
}
for (Index = 0; Index < ElementList.size(); Index++) {
if ((ElementList[Index]) == &PastElt) {
// found past element, new one is :
Index++;
break;
}
}
return NULL;
while (Index < ElementList.size()) {
if ((EbmlId)PastElt == (EbmlId)(*ElementList[Index]))
return ElementList[Index];
Index++;
}
return NULL;
}
EbmlElement *EbmlMaster::AddNewElt(const EbmlCallbacks & Callbacks)
{
// add the element
EbmlElement *NewElt = &EBML_INFO_CREATE(Callbacks);
if (NewElt == NULL)
return NULL;
// add the element
EbmlElement *NewElt = &EBML_INFO_CREATE(Callbacks);
if (NewElt == NULL)
return NULL;
if (!PushElement(*NewElt)) {
delete NewElt;
NewElt = NULL;
}
return NewElt;
if (!PushElement(*NewElt)) {
delete NewElt;
NewElt = NULL;
}
return NewElt;
}
void EbmlMaster::Sort()
{
std::sort(ElementList.begin(), ElementList.end(), EbmlElement::CompareElements);
std::sort(ElementList.begin(), ElementList.end(), EbmlElement::CompareElements);
}
/*!
\brief Method to help reading a Master element and all subsequent children quickly
\todo add an option to discard even unknown elements
\todo handle when a mandatory element is not found
\brief Method to help reading a Master element and all subsequent children quickly
\todo add an option to discard even unknown elements
\todo handle when a mandatory element is not found
*/
void EbmlMaster::Read(EbmlStream & inDataStream, const EbmlSemanticContext & sContext, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
EbmlElement * ElementLevelA;
// remove all existing elements, including the mandatory ones...
size_t Index;
for (Index=0; Index<ElementList.size(); Index++) {
if (!(*ElementList[Index]).IsLocked()) {
delete ElementList[Index];
}
}
ElementList.clear();
uint64 MaxSizeToRead;
if (ReadFully != SCOPE_NO_DATA)
{
EbmlElement * ElementLevelA;
// remove all existing elements, including the mandatory ones...
size_t Index;
for (Index=0; Index<ElementList.size(); Index++) {
if (!(*ElementList[Index]).IsLocked()) {
delete ElementList[Index];
}
}
ElementList.clear();
uint64 MaxSizeToRead;
if (IsFiniteSize())
MaxSizeToRead = GetSize();
else
MaxSizeToRead = 0x7FFFFFFF;
if (IsFiniteSize())
MaxSizeToRead = GetSize();
else
MaxSizeToRead = 0x7FFFFFFF;
// read blocks and discard the ones we don't care about
if (MaxSizeToRead > 0)
{
inDataStream.I_O().setFilePointer(GetSizePosition() + GetSizeLength(), seek_beginning);
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
while (ElementLevelA != NULL && UpperEltFound <= 0 && MaxSizeToRead > 0) {
if (IsFiniteSize() && ElementLevelA->IsFiniteSize())
MaxSizeToRead = GetEndPosition() - ElementLevelA->GetEndPosition(); // even if it's the default value
if (!AllowDummyElt && ElementLevelA->IsDummy()) {
if (ElementLevelA->IsFiniteSize()) {
ElementLevelA->SkipData(inDataStream, sContext);
delete ElementLevelA; // forget this unknown element
} else {
delete ElementLevelA; // forget this unknown element
break;
}
} else {
// more logical to do it afterward
ElementList.push_back(ElementLevelA);
// read blocks and discard the ones we don't care about
if (MaxSizeToRead > 0)
{
inDataStream.I_O().setFilePointer(GetSizePosition() + GetSizeLength(), seek_beginning);
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
while (ElementLevelA != NULL && UpperEltFound <= 0 && MaxSizeToRead > 0) {
if (IsFiniteSize() && ElementLevelA->IsFiniteSize())
MaxSizeToRead = GetEndPosition() - ElementLevelA->GetEndPosition(); // even if it's the default value
if (!AllowDummyElt && ElementLevelA->IsDummy()) {
if (ElementLevelA->IsFiniteSize()) {
ElementLevelA->SkipData(inDataStream, sContext);
delete ElementLevelA; // forget this unknown element
} else {
delete ElementLevelA; // forget this unknown element
break;
}
} else {
// more logical to do it afterward
ElementList.push_back(ElementLevelA);
ElementLevelA->Read(inDataStream, EBML_CONTEXT(ElementLevelA), UpperEltFound, FoundElt, AllowDummyElt, ReadFully);
ElementLevelA->Read(inDataStream, EBML_CONTEXT(ElementLevelA), UpperEltFound, FoundElt, AllowDummyElt, ReadFully);
// just in case
if (ElementLevelA->IsFiniteSize())
ElementLevelA->SkipData(inDataStream, EBML_CONTEXT(ElementLevelA));
else
break;
}
// just in case
if (ElementLevelA->IsFiniteSize())
ElementLevelA->SkipData(inDataStream, EBML_CONTEXT(ElementLevelA));
else
break;
}
if (UpperEltFound > 0) {
UpperEltFound--;
if (UpperEltFound > 0 || MaxSizeToRead <= 0)
goto processCrc;
ElementLevelA = FoundElt;
continue;
}
if (UpperEltFound < 0) {
UpperEltFound++;
if (UpperEltFound < 0)
goto processCrc;
}
if (UpperEltFound > 0) {
UpperEltFound--;
if (UpperEltFound > 0 || MaxSizeToRead <= 0)
goto processCrc;
ElementLevelA = FoundElt;
continue;
}
if (MaxSizeToRead <= 0)
goto processCrc;// this level is finished
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
}
if (UpperEltFound > 0) {
FoundElt = ElementLevelA;
}
}
processCrc:
if (UpperEltFound < 0) {
UpperEltFound++;
if (UpperEltFound < 0)
goto processCrc;
}
if (MaxSizeToRead <= 0)
goto processCrc;// this level is finished
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
}
if (UpperEltFound > 0) {
FoundElt = ElementLevelA;
}
}
processCrc:
EBML_MASTER_ITERATOR Itr, CrcItr;
for (Itr = ElementList.begin(); Itr != ElementList.end();) {
if ((EbmlId)(*(*Itr)) == EBML_ID(EbmlCrc32)) {
bChecksumUsed = true;
// remove the element
Checksum = *(static_cast<EbmlCrc32*>(*Itr));
if ((EbmlId)(*(*Itr)) == EBML_ID(EbmlCrc32)) {
bChecksumUsed = true;
// remove the element
Checksum = *(static_cast<EbmlCrc32*>(*Itr));
CrcItr = Itr;
break;
}
}
++Itr;
}
}
if (bChecksumUsed)
{
delete *CrcItr;
Remove(CrcItr);
delete *CrcItr;
Remove(CrcItr);
}
SetValueIsSet();
}
SetValueIsSet();
}
}
void EbmlMaster::Remove(size_t Index)
{
if (Index < ElementList.size()) {
std::vector<EbmlElement *>::iterator Itr = ElementList.begin();
while (Index-- > 0) {
++Itr;
}
if (Index < ElementList.size()) {
std::vector<EbmlElement *>::iterator Itr = ElementList.begin();
while (Index-- > 0) {
++Itr;
}
ElementList.erase(Itr);
}
ElementList.erase(Itr);
}
}
void EbmlMaster::Remove(EBML_MASTER_ITERATOR & Itr)
{
ElementList.erase(Itr);
ElementList.erase(Itr);
}
void EbmlMaster::Remove(EBML_MASTER_RITERATOR & Itr)
{
ElementList.erase(Itr.base());
ElementList.erase(Itr.base());
}
bool EbmlMaster::VerifyChecksum() const
{
if (!bChecksumUsed)
return true;
if (!bChecksumUsed)
return true;
EbmlCrc32 aChecksum;
/// \todo remove the Checksum if it's in the list
/// \todo find another way when not all default values are saved or (unknown from the reader !!!)
MemIOCallback TmpBuf(GetSize() - 6);
for (size_t Index = 0; Index < ElementList.size(); Index++) {
(ElementList[Index])->Render(TmpBuf, true, false, true);
}
aChecksum.FillCRC32(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
return (aChecksum.GetCrc32() == Checksum.GetCrc32());
EbmlCrc32 aChecksum;
/// \todo remove the Checksum if it's in the list
/// \todo find another way when not all default values are saved or (unknown from the reader !!!)
MemIOCallback TmpBuf(GetSize() - 6);
for (size_t Index = 0; Index < ElementList.size(); Index++) {
(ElementList[Index])->Render(TmpBuf, true, false, true);
}
aChecksum.FillCRC32(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
return (aChecksum.GetCrc32() == Checksum.GetCrc32());
}
bool EbmlMaster::InsertElement(EbmlElement & element, size_t position)
{
std::vector<EbmlElement *>::iterator Itr = ElementList.begin();
while (Itr != ElementList.end() && position--)
{
++Itr;
}
if ((Itr == ElementList.end()) && position)
return false;
std::vector<EbmlElement *>::iterator Itr = ElementList.begin();
while (Itr != ElementList.end() && position--)
{
++Itr;
}
if ((Itr == ElementList.end()) && position)
return false;
ElementList.insert(Itr, &element);
return true;
ElementList.insert(Itr, &element);
return true;
}
bool EbmlMaster::InsertElement(EbmlElement & element, const EbmlElement & before)
{
std::vector<EbmlElement *>::iterator Itr = ElementList.begin();
while (Itr != ElementList.end() && *Itr != &before)
{
++Itr;
}
if (Itr == ElementList.end())
return false;
std::vector<EbmlElement *>::iterator Itr = ElementList.begin();
while (Itr != ElementList.end() && *Itr != &before)
{
++Itr;
}
if (Itr == ElementList.end())
return false;
ElementList.insert(Itr, &element);
return true;
ElementList.insert(Itr, &element);
return true;
}

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,10 +27,10 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#include <cassert>
@ -45,7 +45,7 @@ EbmlSInteger::EbmlSInteger()
EbmlSInteger::EbmlSInteger(int64 aDefaultValue)
:EbmlElement(DEFAULT_INT_SIZE, true), Value(aDefaultValue)
{
SetDefaultIsSet();
SetDefaultIsSet();
}
EbmlSInteger::EbmlSInteger(const EbmlSInteger & ElementToClone)
@ -67,89 +67,89 @@ EbmlSInteger & EbmlSInteger::SetValue(int64 NewValue) {
}
/*!
\todo handle exception on errors
\todo handle exception on errors
*/
filepos_t EbmlSInteger::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
binary FinalData[8]; // we don't handle more than 64 bits integers
unsigned int i;
if (GetSizeLength() > 8)
return 0; // integer bigger coded on more than 64 bits are not supported
int64 TempValue = Value;
for (i=0; i<GetSize();i++) {
FinalData[GetSize()-i-1] = binary(TempValue & 0xFF);
TempValue >>= 8;
}
output.writeFully(FinalData,GetSize());
binary FinalData[8]; // we don't handle more than 64 bits integers
unsigned int i;
return GetSize();
if (GetSizeLength() > 8)
return 0; // integer bigger coded on more than 64 bits are not supported
int64 TempValue = Value;
for (i=0; i<GetSize();i++) {
FinalData[GetSize()-i-1] = binary(TempValue & 0xFF);
TempValue >>= 8;
}
output.writeFully(FinalData,GetSize());
return GetSize();
}
uint64 EbmlSInteger::UpdateSize(bool bWithDefault, bool /* bForceRender */)
{
if (!bWithDefault && IsDefaultValue())
return 0;
if (!bWithDefault && IsDefaultValue())
return 0;
if (Value <= 0x7F && Value >= (-0x80)) {
SetSize_(1);
} else if (Value <= 0x7FFF && Value >= (-0x8000)) {
SetSize_(2);
} else if (Value <= 0x7FFFFF && Value >= (-0x800000)) {
SetSize_(3);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFF) && Value >= (EBML_PRETTYLONGINT(-0x80000000))) {
SetSize_(4);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFFFF) &&
Value >= EBML_PRETTYLONGINT(-0x8000000000)) {
SetSize_(5);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFFFFFF) &&
Value >= EBML_PRETTYLONGINT(-0x800000000000)) {
SetSize_(6);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFFFFFFFF) &&
Value >= EBML_PRETTYLONGINT(-0x80000000000000)) {
SetSize_(7);
} else {
SetSize_(8);
}
if (Value <= 0x7F && Value >= (-0x80)) {
SetSize_(1);
} else if (Value <= 0x7FFF && Value >= (-0x8000)) {
SetSize_(2);
} else if (Value <= 0x7FFFFF && Value >= (-0x800000)) {
SetSize_(3);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFF) && Value >= (EBML_PRETTYLONGINT(-0x80000000))) {
SetSize_(4);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFFFF) &&
Value >= EBML_PRETTYLONGINT(-0x8000000000)) {
SetSize_(5);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFFFFFF) &&
Value >= EBML_PRETTYLONGINT(-0x800000000000)) {
SetSize_(6);
} else if (Value <= EBML_PRETTYLONGINT(0x7FFFFFFFFFFFFF) &&
Value >= EBML_PRETTYLONGINT(-0x80000000000000)) {
SetSize_(7);
} else {
SetSize_(8);
}
if (GetDefaultSize() > GetSize()) {
SetSize_(GetDefaultSize());
}
if (GetDefaultSize() > GetSize()) {
SetSize_(GetDefaultSize());
}
return GetSize();
return GetSize();
}
filepos_t EbmlSInteger::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
binary Buffer[8];
input.readFully(Buffer, GetSize());
if (Buffer[0] & 0x80)
Value = -1; // this is a negative value
else
Value = 0; // this is a positive value
for (unsigned int i=0; i<GetSize(); i++)
{
Value <<= 8;
Value |= Buffer[i];
}
SetValueIsSet();
}
if (ReadFully != SCOPE_NO_DATA)
{
binary Buffer[8];
input.readFully(Buffer, GetSize());
return GetSize();
if (Buffer[0] & 0x80)
Value = -1; // this is a negative value
else
Value = 0; // this is a positive value
for (unsigned int i=0; i<GetSize(); i++)
{
Value <<= 8;
Value |= Buffer[i];
}
SetValueIsSet();
}
return GetSize();
}
bool EbmlSInteger::IsSmallerThan(const EbmlElement *Cmp) const
{
if (EbmlId(*this) == EbmlId(*Cmp))
return this->Value < static_cast<const EbmlSInteger *>(Cmp)->Value;
else
return false;
if (EbmlId(*this) == EbmlId(*Cmp))
return this->Value < static_cast<const EbmlSInteger *>(Cmp)->Value;
else
return false;
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlStream.h"
@ -46,12 +46,12 @@ EbmlStream::~EbmlStream()
EbmlElement * EbmlStream::FindNextID(const EbmlCallbacks & ClassInfos, uint64 MaxDataSize)
{
return EbmlElement::FindNextID(Stream, ClassInfos, MaxDataSize);
return EbmlElement::FindNextID(Stream, ClassInfos, MaxDataSize);
}
EbmlElement * EbmlStream::FindNextElement(const EbmlSemanticContext & Context, int & UpperLevel, uint64 MaxDataSize, bool AllowDummyElt, unsigned int MaxLowerLevel)
{
return EbmlElement::FindNextElement(Stream, Context, UpperLevel, MaxDataSize, AllowDummyElt, MaxLowerLevel);
return EbmlElement::FindNextElement(Stream, Context, UpperLevel, MaxDataSize, AllowDummyElt, MaxLowerLevel);
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include <cassert>
@ -42,26 +42,26 @@ START_LIBEBML_NAMESPACE
EbmlString::EbmlString()
:EbmlElement(0, false)
{
SetDefaultSize(0);
/* done automatically
SetSize_(Value.length());
if (GetDefaultSize() > GetSize())
SetSize_(GetDefaultSize());*/
SetDefaultSize(0);
/* done automatically
SetSize_(Value.length());
if (GetDefaultSize() > GetSize())
SetSize_(GetDefaultSize());*/
}
EbmlString::EbmlString(const std::string & aDefaultValue)
:EbmlElement(0, true), Value(aDefaultValue), DefaultValue(aDefaultValue)
{
SetDefaultSize(0);
SetDefaultIsSet();
/* done automatically
SetSize_(Value.length());
if (GetDefaultSize() > GetSize())
SetSize_(GetDefaultSize());*/
SetDefaultSize(0);
SetDefaultIsSet();
/* done automatically
SetSize_(Value.length());
if (GetDefaultSize() > GetSize())
SetSize_(GetDefaultSize());*/
}
/*!
\todo Cloning should be on the same exact type !
\todo Cloning should be on the same exact type !
*/
EbmlString::EbmlString(const EbmlString & ElementToClone)
:EbmlElement(ElementToClone)
@ -85,41 +85,41 @@ const std::string & EbmlString::DefaultVal() const
/*!
\todo handle exception on errors
\todo handle exception on errors
*/
filepos_t EbmlString::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
filepos_t Result;
output.writeFully(Value.c_str(), Value.length());
Result = Value.length();
if (Result < GetDefaultSize()) {
// pad the rest with 0
binary *Pad = new (std::nothrow) binary[GetDefaultSize() - Result];
if (Pad == NULL)
{
return Result;
}
memset(Pad, 0x00, GetDefaultSize() - Result);
output.writeFully(Pad, GetDefaultSize() - Result);
Result = GetDefaultSize();
delete [] Pad;
}
return Result;
filepos_t Result;
output.writeFully(Value.c_str(), Value.length());
Result = Value.length();
if (Result < GetDefaultSize()) {
// pad the rest with 0
binary *Pad = new (std::nothrow) binary[GetDefaultSize() - Result];
if (Pad == NULL)
{
return Result;
}
memset(Pad, 0x00, GetDefaultSize() - Result);
output.writeFully(Pad, GetDefaultSize() - Result);
Result = GetDefaultSize();
delete [] Pad;
}
return Result;
}
EbmlString::operator const std::string &() const {return Value;}
EbmlString & EbmlString::operator=(const std::string & NewString)
{
Value = NewString;
SetValueIsSet();
/* done automatically
SetSize_(Value.length());
if (GetDefaultSize() > GetSize())
SetSize_(GetDefaultSize());*/
return *this;
Value = NewString;
SetValueIsSet();
/* done automatically
SetSize_(Value.length());
if (GetDefaultSize() > GetSize())
SetSize_(GetDefaultSize());*/
return *this;
}
EbmlString &EbmlString::SetValue(std::string const &NewValue) {
@ -132,42 +132,42 @@ std::string EbmlString::GetValue() const {
uint64 EbmlString::UpdateSize(bool bWithDefault, bool /* bForceRender */)
{
if (!bWithDefault && IsDefaultValue())
return 0;
if (!bWithDefault && IsDefaultValue())
return 0;
if (Value.length() < GetDefaultSize()) {
SetSize_(GetDefaultSize());
} else {
SetSize_(Value.length());
}
return GetSize();
if (Value.length() < GetDefaultSize()) {
SetSize_(GetDefaultSize());
} else {
SetSize_(Value.length());
}
return GetSize();
}
filepos_t EbmlString::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
if (GetSize() == 0) {
Value = "";
SetValueIsSet();
} else {
char *Buffer = new (std::nothrow) char[GetSize() + 1];
if (Buffer == NULL) {
// unable to store the data, skip it
input.setFilePointer(GetSize(), seek_current);
} else {
input.readFully(Buffer, GetSize());
if (Buffer[GetSize()-1] != '\0') {
Buffer[GetSize()] = '\0';
}
Value = Buffer;
delete [] Buffer;
SetValueIsSet();
}
}
}
if (ReadFully != SCOPE_NO_DATA)
{
if (GetSize() == 0) {
Value = "";
SetValueIsSet();
} else {
char *Buffer = new (std::nothrow) char[GetSize() + 1];
if (Buffer == NULL) {
// unable to store the data, skip it
input.setFilePointer(GetSize(), seek_current);
} else {
input.readFully(Buffer, GetSize());
if (Buffer[GetSize()-1] != '\0') {
Buffer[GetSize()] = '\0';
}
Value = Buffer;
delete [] Buffer;
SetValueIsSet();
}
}
}
return GetSize();
return GetSize();
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlSubHead.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlSubHead.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlSubHead.h"
#include "ebml/EbmlContexts.h"

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#include <cassert>
@ -47,7 +47,7 @@ EbmlUInteger::EbmlUInteger()
EbmlUInteger::EbmlUInteger(uint64 aDefaultValue)
:EbmlElement(DEFAULT_UINT_SIZE, true), Value(aDefaultValue), DefaultValue(aDefaultValue)
{
SetDefaultIsSet();
SetDefaultIsSet();
}
EbmlUInteger::EbmlUInteger(const EbmlUInteger & ElementToClone)
@ -82,81 +82,81 @@ EbmlUInteger & EbmlUInteger::SetValue(uint64 NewValue) {
}
/*!
\todo handle exception on errors
\todo handle exception on errors
*/
filepos_t EbmlUInteger::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
binary FinalData[8]; // we don't handle more than 64 bits integers
if (GetSizeLength() > 8)
return 0; // integer bigger coded on more than 64 bits are not supported
uint64 TempValue = Value;
for (unsigned int i=0; i<GetSize();i++) {
FinalData[GetSize()-i-1] = TempValue & 0xFF;
TempValue >>= 8;
}
output.writeFully(FinalData,GetSize());
binary FinalData[8]; // we don't handle more than 64 bits integers
return GetSize();
if (GetSizeLength() > 8)
return 0; // integer bigger coded on more than 64 bits are not supported
uint64 TempValue = Value;
for (unsigned int i=0; i<GetSize();i++) {
FinalData[GetSize()-i-1] = TempValue & 0xFF;
TempValue >>= 8;
}
output.writeFully(FinalData,GetSize());
return GetSize();
}
uint64 EbmlUInteger::UpdateSize(bool bWithDefault, bool /* bForceRender */)
{
if (!bWithDefault && IsDefaultValue())
return 0;
if (!bWithDefault && IsDefaultValue())
return 0;
if (Value <= 0xFF) {
SetSize_(1);
} else if (Value <= 0xFFFF) {
SetSize_(2);
} else if (Value <= 0xFFFFFF) {
SetSize_(3);
} else if (Value <= 0xFFFFFFFF) {
SetSize_(4);
} else if (Value <= EBML_PRETTYLONGINT(0xFFFFFFFFFF)) {
SetSize_(5);
} else if (Value <= EBML_PRETTYLONGINT(0xFFFFFFFFFFFF)) {
SetSize_(6);
} else if (Value <= EBML_PRETTYLONGINT(0xFFFFFFFFFFFFFF)) {
SetSize_(7);
} else {
SetSize_(8);
}
if (Value <= 0xFF) {
SetSize_(1);
} else if (Value <= 0xFFFF) {
SetSize_(2);
} else if (Value <= 0xFFFFFF) {
SetSize_(3);
} else if (Value <= 0xFFFFFFFF) {
SetSize_(4);
} else if (Value <= EBML_PRETTYLONGINT(0xFFFFFFFFFF)) {
SetSize_(5);
} else if (Value <= EBML_PRETTYLONGINT(0xFFFFFFFFFFFF)) {
SetSize_(6);
} else if (Value <= EBML_PRETTYLONGINT(0xFFFFFFFFFFFFFF)) {
SetSize_(7);
} else {
SetSize_(8);
}
if (GetDefaultSize() > GetSize()) {
SetSize_(GetDefaultSize());
}
if (GetDefaultSize() > GetSize()) {
SetSize_(GetDefaultSize());
}
return GetSize();
return GetSize();
}
filepos_t EbmlUInteger::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
binary Buffer[8];
input.readFully(Buffer, GetSize());
Value = 0;
for (unsigned int i=0; i<GetSize(); i++)
{
Value <<= 8;
Value |= Buffer[i];
}
SetValueIsSet();
}
if (ReadFully != SCOPE_NO_DATA)
{
binary Buffer[8];
input.readFully(Buffer, GetSize());
Value = 0;
return GetSize();
for (unsigned int i=0; i<GetSize(); i++)
{
Value <<= 8;
Value |= Buffer[i];
}
SetValueIsSet();
}
return GetSize();
}
bool EbmlUInteger::IsSmallerThan(const EbmlElement *Cmp) const
{
if (EbmlId(*this) == EbmlId(*Cmp))
return this->Value < static_cast<const EbmlUInteger *>(Cmp)->Value;
else
return false;
if (EbmlId(*this) == EbmlId(*Cmp))
return this->Value < static_cast<const EbmlUInteger *>(Cmp)->Value;
else
return false;
}
END_LIBEBML_NAMESPACE

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,10 +29,10 @@
**********************************************************************/
/*!
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\file
\version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
*/
#include <cassert>
@ -48,40 +48,40 @@ START_LIBEBML_NAMESPACE
// ===================== UTFstring class ===================
UTFstring::UTFstring()
:_Length(0)
,_Data(NULL)
:_Length(0)
,_Data(NULL)
{}
UTFstring::UTFstring(const wchar_t * _aBuf)
:_Length(0)
,_Data(NULL)
:_Length(0)
,_Data(NULL)
{
*this = _aBuf;
*this = _aBuf;
}
UTFstring::UTFstring(std::wstring const &_aBuf)
:_Length(0)
,_Data(NULL)
:_Length(0)
,_Data(NULL)
{
*this = _aBuf.c_str();
*this = _aBuf.c_str();
}
UTFstring::~UTFstring()
{
delete [] _Data;
delete [] _Data;
}
UTFstring::UTFstring(const UTFstring & _aBuf)
:_Length(0)
,_Data(NULL)
:_Length(0)
,_Data(NULL)
{
*this = _aBuf.c_str();
*this = _aBuf.c_str();
}
UTFstring & UTFstring::operator=(const UTFstring & _aBuf)
{
*this = _aBuf.c_str();
return *this;
*this = _aBuf.c_str();
return *this;
}
UTFstring::operator const wchar_t*() const {return _Data;}
@ -89,138 +89,138 @@ UTFstring::operator const wchar_t*() const {return _Data;}
UTFstring & UTFstring::operator=(const wchar_t * _aBuf)
{
delete [] _Data;
if (_aBuf == NULL) {
_Data = new wchar_t[1];
_Data[0] = 0;
UpdateFromUCS2();
return *this;
}
delete [] _Data;
if (_aBuf == NULL) {
_Data = new wchar_t[1];
_Data[0] = 0;
UpdateFromUCS2();
return *this;
}
size_t aLen;
for (aLen=0; _aBuf[aLen] != 0; aLen++);
_Length = aLen;
_Data = new wchar_t[_Length+1];
for (aLen=0; _aBuf[aLen] != 0; aLen++) {
_Data[aLen] = _aBuf[aLen];
}
_Data[aLen] = 0;
UpdateFromUCS2();
return *this;
size_t aLen;
for (aLen=0; _aBuf[aLen] != 0; aLen++);
_Length = aLen;
_Data = new wchar_t[_Length+1];
for (aLen=0; _aBuf[aLen] != 0; aLen++) {
_Data[aLen] = _aBuf[aLen];
}
_Data[aLen] = 0;
UpdateFromUCS2();
return *this;
}
UTFstring & UTFstring::operator=(wchar_t _aChar)
{
delete [] _Data;
_Data = new wchar_t[2];
_Length = 1;
_Data[0] = _aChar;
_Data[1] = 0;
UpdateFromUCS2();
return *this;
delete [] _Data;
_Data = new wchar_t[2];
_Length = 1;
_Data[0] = _aChar;
_Data[1] = 0;
UpdateFromUCS2();
return *this;
}
bool UTFstring::operator==(const UTFstring& _aStr) const
{
if ((_Data == NULL) && (_aStr._Data == NULL))
return true;
if ((_Data == NULL) || (_aStr._Data == NULL))
return false;
return wcscmp_internal(_Data, _aStr._Data);
if ((_Data == NULL) && (_aStr._Data == NULL))
return true;
if ((_Data == NULL) || (_aStr._Data == NULL))
return false;
return wcscmp_internal(_Data, _aStr._Data);
}
void UTFstring::SetUTF8(const std::string & _aStr)
{
UTF8string = _aStr;
UpdateFromUTF8();
UTF8string = _aStr;
UpdateFromUTF8();
}
/*!
\see RFC 2279
\see RFC 2279
*/
void UTFstring::UpdateFromUTF8()
{
delete [] _Data;
// find the size of the final UCS-2 string
size_t i;
for (_Length=0, i=0; i<UTF8string.length(); _Length++) {
uint8 lead = static_cast<uint8>(UTF8string[i]);
if (lead < 0x80)
i++;
else if ((lead >> 5) == 0x6)
i += 2;
else if ((lead >> 4) == 0xe)
i += 3;
else if ((lead >> 3) == 0x1e)
i += 4;
else
// Invalid size?
break;
}
_Data = new wchar_t[_Length+1];
size_t j;
for (j=0, i=0; i<UTF8string.length(); j++) {
uint8 lead = static_cast<uint8>(UTF8string[i]);
if (lead < 0x80) {
_Data[j] = lead;
i++;
} else if ((lead >> 5) == 0x6) {
_Data[j] = ((lead & 0x1F) << 6) + (UTF8string[i+1] & 0x3F);
i += 2;
} else if ((lead >> 4) == 0xe) {
_Data[j] = ((lead & 0x0F) << 12) + ((UTF8string[i+1] & 0x3F) << 6) + (UTF8string[i+2] & 0x3F);
i += 3;
} else if ((lead >> 3) == 0x1e) {
_Data[j] = ((lead & 0x07) << 18) + ((UTF8string[i+1] & 0x3F) << 12) + ((UTF8string[i+2] & 0x3F) << 6) + (UTF8string[i+3] & 0x3F);
i += 4;
} else
// Invalid char?
break;
}
_Data[j] = 0;
delete [] _Data;
// find the size of the final UCS-2 string
size_t i;
for (_Length=0, i=0; i<UTF8string.length(); _Length++) {
uint8 lead = static_cast<uint8>(UTF8string[i]);
if (lead < 0x80)
i++;
else if ((lead >> 5) == 0x6)
i += 2;
else if ((lead >> 4) == 0xe)
i += 3;
else if ((lead >> 3) == 0x1e)
i += 4;
else
// Invalid size?
break;
}
_Data = new wchar_t[_Length+1];
size_t j;
for (j=0, i=0; i<UTF8string.length(); j++) {
uint8 lead = static_cast<uint8>(UTF8string[i]);
if (lead < 0x80) {
_Data[j] = lead;
i++;
} else if ((lead >> 5) == 0x6) {
_Data[j] = ((lead & 0x1F) << 6) + (UTF8string[i+1] & 0x3F);
i += 2;
} else if ((lead >> 4) == 0xe) {
_Data[j] = ((lead & 0x0F) << 12) + ((UTF8string[i+1] & 0x3F) << 6) + (UTF8string[i+2] & 0x3F);
i += 3;
} else if ((lead >> 3) == 0x1e) {
_Data[j] = ((lead & 0x07) << 18) + ((UTF8string[i+1] & 0x3F) << 12) + ((UTF8string[i+2] & 0x3F) << 6) + (UTF8string[i+3] & 0x3F);
i += 4;
} else
// Invalid char?
break;
}
_Data[j] = 0;
}
void UTFstring::UpdateFromUCS2()
{
// find the size of the final UTF-8 string
size_t i,Size=0;
for (i=0; i<_Length; i++)
{
if (_Data[i] < 0x80) {
Size++;
} else if (_Data[i] < 0x800) {
Size += 2;
} else {
Size += 3;
}
}
std::string::value_type *tmpStr = new std::string::value_type[Size+1];
for (i=0, Size=0; i<_Length; i++)
{
if (_Data[i] < 0x80) {
tmpStr[Size++] = _Data[i];
} else if (_Data[i] < 0x800) {
tmpStr[Size++] = 0xC0 | (_Data[i] >> 6);
tmpStr[Size++] = 0x80 | (_Data[i] & 0x3F);
} else {
tmpStr[Size++] = 0xE0 | (_Data[i] >> 12);
tmpStr[Size++] = 0x80 | ((_Data[i] >> 6) & 0x3F);
tmpStr[Size++] = 0x80 | (_Data[i] & 0x3F);
}
}
tmpStr[Size] = 0;
UTF8string = tmpStr; // implicit conversion
delete [] tmpStr;
// find the size of the final UTF-8 string
size_t i,Size=0;
for (i=0; i<_Length; i++)
{
if (_Data[i] < 0x80) {
Size++;
} else if (_Data[i] < 0x800) {
Size += 2;
} else {
Size += 3;
}
}
std::string::value_type *tmpStr = new std::string::value_type[Size+1];
for (i=0, Size=0; i<_Length; i++)
{
if (_Data[i] < 0x80) {
tmpStr[Size++] = _Data[i];
} else if (_Data[i] < 0x800) {
tmpStr[Size++] = 0xC0 | (_Data[i] >> 6);
tmpStr[Size++] = 0x80 | (_Data[i] & 0x3F);
} else {
tmpStr[Size++] = 0xE0 | (_Data[i] >> 12);
tmpStr[Size++] = 0x80 | ((_Data[i] >> 6) & 0x3F);
tmpStr[Size++] = 0x80 | (_Data[i] & 0x3F);
}
}
tmpStr[Size] = 0;
UTF8string = tmpStr; // implicit conversion
delete [] tmpStr;
}
bool UTFstring::wcscmp_internal(const wchar_t *str1, const wchar_t *str2)
{
size_t Index=0;
while (str1[Index] == str2[Index] && str1[Index] != 0) {
Index++;
}
return (str1[Index] == str2[Index]);
size_t Index=0;
while (str1[Index] == str2[Index] && str1[Index] != 0) {
Index++;
}
return (str1[Index] == str2[Index]);
}
// ===================== EbmlUnicodeString class ===================
@ -228,14 +228,14 @@ bool UTFstring::wcscmp_internal(const wchar_t *str1, const wchar_t *str2)
EbmlUnicodeString::EbmlUnicodeString()
:EbmlElement(0, false)
{
SetDefaultSize(0);
SetDefaultSize(0);
}
EbmlUnicodeString::EbmlUnicodeString(const UTFstring & aDefaultValue)
:EbmlElement(0, true), Value(aDefaultValue), DefaultValue(aDefaultValue)
{
SetDefaultSize(0);
SetDefaultIsSet();
SetDefaultSize(0);
SetDefaultIsSet();
}
EbmlUnicodeString::EbmlUnicodeString(const EbmlUnicodeString & ElementToClone)
@ -265,34 +265,34 @@ const UTFstring & EbmlUnicodeString::DefaultVal() const
*/
filepos_t EbmlUnicodeString::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
uint32 Result = Value.GetUTF8().length();
uint32 Result = Value.GetUTF8().length();
if (Result != 0) {
output.writeFully(Value.GetUTF8().c_str(), Result);
}
if (Result != 0) {
output.writeFully(Value.GetUTF8().c_str(), Result);
}
if (Result < GetDefaultSize()) {
// pad the rest with 0
binary *Pad = new (std::nothrow) binary[GetDefaultSize() - Result];
if (Pad != NULL) {
memset(Pad, 0x00, GetDefaultSize() - Result);
output.writeFully(Pad, GetDefaultSize() - Result);
if (Result < GetDefaultSize()) {
// pad the rest with 0
binary *Pad = new (std::nothrow) binary[GetDefaultSize() - Result];
if (Pad != NULL) {
memset(Pad, 0x00, GetDefaultSize() - Result);
output.writeFully(Pad, GetDefaultSize() - Result);
Result = GetDefaultSize();
delete [] Pad;
}
}
Result = GetDefaultSize();
delete [] Pad;
}
}
return Result;
return Result;
}
EbmlUnicodeString::operator const UTFstring &() const {return Value;}
EbmlUnicodeString & EbmlUnicodeString::operator=(const UTFstring & NewString)
{
Value = NewString;
SetValueIsSet();
return *this;
Value = NewString;
SetValueIsSet();
return *this;
}
EbmlUnicodeString &EbmlUnicodeString::SetValue(UTFstring const &NewValue) {
@ -318,45 +318,45 @@ std::string EbmlUnicodeString::GetValueUTF8() const {
*/
uint64 EbmlUnicodeString::UpdateSize(bool bWithDefault, bool /* bForceRender */)
{
if (!bWithDefault && IsDefaultValue())
return 0;
if (!bWithDefault && IsDefaultValue())
return 0;
SetSize_(Value.GetUTF8().length());
if (GetSize() < GetDefaultSize())
SetSize_(GetDefaultSize());
SetSize_(Value.GetUTF8().length());
if (GetSize() < GetDefaultSize())
SetSize_(GetDefaultSize());
return GetSize();
return GetSize();
}
/*!
\note limited to UCS-2
\note limited to UCS-2
*/
filepos_t EbmlUnicodeString::ReadData(IOCallback & input, ScopeMode ReadFully)
{
if (ReadFully != SCOPE_NO_DATA)
{
if (GetSize() == 0) {
Value = UTFstring::value_type(0);
SetValueIsSet();
} else {
char *Buffer = new (std::nothrow) char[GetSize()+1];
if (Buffer == NULL) {
// impossible to read, skip it
input.setFilePointer(GetSize(), seek_current);
} else {
input.readFully(Buffer, GetSize());
if (Buffer[GetSize()-1] != 0) {
Buffer[GetSize()] = 0;
}
{
if (ReadFully != SCOPE_NO_DATA)
{
if (GetSize() == 0) {
Value = UTFstring::value_type(0);
SetValueIsSet();
} else {
char *Buffer = new (std::nothrow) char[GetSize()+1];
if (Buffer == NULL) {
// impossible to read, skip it
input.setFilePointer(GetSize(), seek_current);
} else {
input.readFully(Buffer, GetSize());
if (Buffer[GetSize()-1] != 0) {
Buffer[GetSize()] = 0;
}
Value.SetUTF8(Buffer); // implicit conversion to std::string
delete [] Buffer;
SetValueIsSet();
}
}
}
Value.SetUTF8(Buffer); // implicit conversion to std::string
delete [] Buffer;
SetValueIsSet();
}
}
}
return GetSize();
return GetSize();
}
END_LIBEBML_NAMESPACE

View File

@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlVersion.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlVersion.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlVersion.h"

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlVoid.cpp 1232 2005-10-15 15:56:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlVoid.cpp 1232 2005-10-15 15:56:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlVoid.h"
#include "ebml/EbmlContexts.h"
@ -42,97 +42,97 @@ DEFINE_EBML_CLASS_GLOBAL(EbmlVoid, 0xEC, 1, "EBMLVoid");
EbmlVoid::EbmlVoid()
{
SetValueIsSet();
SetValueIsSet();
}
filepos_t EbmlVoid::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bWithDefault */)
{
// write dummy data by 4KB chunks
static binary DummyBuf[4*1024];
// write dummy data by 4KB chunks
static binary DummyBuf[4*1024];
uint64 SizeToWrite = GetSize();
while (SizeToWrite > 4*1024)
{
output.writeFully(DummyBuf, 4*1024);
SizeToWrite -= 4*1024;
}
output.writeFully(DummyBuf, SizeToWrite);
return GetSize();
uint64 SizeToWrite = GetSize();
while (SizeToWrite > 4*1024)
{
output.writeFully(DummyBuf, 4*1024);
SizeToWrite -= 4*1024;
}
output.writeFully(DummyBuf, SizeToWrite);
return GetSize();
}
uint64 EbmlVoid::ReplaceWith(EbmlElement & EltToReplaceWith, IOCallback & output, bool ComeBackAfterward, bool bWithDefault)
{
EltToReplaceWith.UpdateSize(bWithDefault);
if (HeadSize() + GetSize() < EltToReplaceWith.GetSize() + EltToReplaceWith.HeadSize()) {
// the element can't be written here !
return INVALID_FILEPOS_T;
}
if (HeadSize() + GetSize() - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() == 1) {
// there is not enough space to put a filling element
return INVALID_FILEPOS_T;
}
EltToReplaceWith.UpdateSize(bWithDefault);
if (HeadSize() + GetSize() < EltToReplaceWith.GetSize() + EltToReplaceWith.HeadSize()) {
// the element can't be written here !
return INVALID_FILEPOS_T;
}
if (HeadSize() + GetSize() - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() == 1) {
// there is not enough space to put a filling element
return INVALID_FILEPOS_T;
}
uint64 CurrentPosition = output.getFilePointer();
uint64 CurrentPosition = output.getFilePointer();
output.setFilePointer(GetElementPosition());
EltToReplaceWith.Render(output, bWithDefault);
output.setFilePointer(GetElementPosition());
EltToReplaceWith.Render(output, bWithDefault);
if (HeadSize() + GetSize() - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() > 1) {
// fill the rest with another void element
EbmlVoid aTmp;
aTmp.SetSize_(HeadSize() + GetSize() - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() - 1); // 1 is the length of the Void ID
int HeadBefore = aTmp.HeadSize();
aTmp.SetSize_(aTmp.GetSize() - CodedSizeLength(aTmp.GetSize(), aTmp.GetSizeLength(), aTmp.IsFiniteSize()));
int HeadAfter = aTmp.HeadSize();
if (HeadBefore != HeadAfter) {
aTmp.SetSizeLength(CodedSizeLength(aTmp.GetSize(), aTmp.GetSizeLength(), aTmp.IsFiniteSize()) - (HeadAfter - HeadBefore));
}
aTmp.RenderHead(output, false, bWithDefault); // the rest of the data is not rewritten
}
if (HeadSize() + GetSize() - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() > 1) {
// fill the rest with another void element
EbmlVoid aTmp;
aTmp.SetSize_(HeadSize() + GetSize() - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() - 1); // 1 is the length of the Void ID
int HeadBefore = aTmp.HeadSize();
aTmp.SetSize_(aTmp.GetSize() - CodedSizeLength(aTmp.GetSize(), aTmp.GetSizeLength(), aTmp.IsFiniteSize()));
int HeadAfter = aTmp.HeadSize();
if (HeadBefore != HeadAfter) {
aTmp.SetSizeLength(CodedSizeLength(aTmp.GetSize(), aTmp.GetSizeLength(), aTmp.IsFiniteSize()) - (HeadAfter - HeadBefore));
}
aTmp.RenderHead(output, false, bWithDefault); // the rest of the data is not rewritten
}
if (ComeBackAfterward) {
output.setFilePointer(CurrentPosition);
}
if (ComeBackAfterward) {
output.setFilePointer(CurrentPosition);
}
return GetSize() + HeadSize();
return GetSize() + HeadSize();
}
uint64 EbmlVoid::Overwrite(const EbmlElement & EltToVoid, IOCallback & output, bool ComeBackAfterward, bool bWithDefault)
{
// EltToVoid.UpdateSize(bWithDefault);
if (EltToVoid.GetElementPosition() == 0) {
// this element has never been written
return 0;
}
if (EltToVoid.GetSize() + EltToVoid.HeadSize() <2) {
// the element can't be written here !
return 0;
}
// EltToVoid.UpdateSize(bWithDefault);
if (EltToVoid.GetElementPosition() == 0) {
// this element has never been written
return 0;
}
if (EltToVoid.GetSize() + EltToVoid.HeadSize() <2) {
// the element can't be written here !
return 0;
}
uint64 CurrentPosition = output.getFilePointer();
uint64 CurrentPosition = output.getFilePointer();
output.setFilePointer(EltToVoid.GetElementPosition());
output.setFilePointer(EltToVoid.GetElementPosition());
// compute the size of the voided data based on the original one
SetSize(EltToVoid.GetSize() + EltToVoid.HeadSize() - 1); // 1 for the ID
SetSize(GetSize() - CodedSizeLength(GetSize(), GetSizeLength(), IsFiniteSize()));
// make sure we handle even the strange cases
//uint32 A1 = GetSize() + HeadSize();
//uint32 A2 = EltToVoid.GetSize() + EltToVoid.HeadSize();
if (GetSize() + HeadSize() != EltToVoid.GetSize() + EltToVoid.HeadSize()) {
SetSize(GetSize()-1);
SetSizeLength(CodedSizeLength(GetSize(), GetSizeLength(), IsFiniteSize()) + 1);
}
// compute the size of the voided data based on the original one
SetSize(EltToVoid.GetSize() + EltToVoid.HeadSize() - 1); // 1 for the ID
SetSize(GetSize() - CodedSizeLength(GetSize(), GetSizeLength(), IsFiniteSize()));
// make sure we handle even the strange cases
//uint32 A1 = GetSize() + HeadSize();
//uint32 A2 = EltToVoid.GetSize() + EltToVoid.HeadSize();
if (GetSize() + HeadSize() != EltToVoid.GetSize() + EltToVoid.HeadSize()) {
SetSize(GetSize()-1);
SetSizeLength(CodedSizeLength(GetSize(), GetSizeLength(), IsFiniteSize()) + 1);
}
if (GetSize() != 0) {
RenderHead(output, false, bWithDefault); // the rest of the data is not rewritten
}
if (GetSize() != 0) {
RenderHead(output, false, bWithDefault); // the rest of the data is not rewritten
}
if (ComeBackAfterward) {
output.setFilePointer(CurrentPosition);
}
if (ComeBackAfterward) {
output.setFilePointer(CurrentPosition);
}
return EltToVoid.GetSize() + EltToVoid.HeadSize();
return EltToVoid.GetSize() + EltToVoid.HeadSize();
}
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,10 +27,10 @@
**********************************************************************/
/*!
\file
\version \$Id: IOCallback.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id: IOCallback.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#if !defined(__GNUC__) || (__GNUC__ > 2)
@ -47,37 +47,37 @@ START_LIBEBML_NAMESPACE
void IOCallback::writeFully(const void*Buffer,size_t Size)
{
if (Size == 0)
return;
if (Size == 0)
return;
if (Buffer == NULL)
throw;
if (Buffer == NULL)
throw;
if(write(Buffer,Size) != Size)
{
if(write(Buffer,Size) != Size)
{
#if !defined(__GNUC__) || (__GNUC__ > 2)
stringstream Msg;
Msg<<"EOF in writeFully("<<Buffer<<","<<Size<<")";
throw runtime_error(Msg.str());
stringstream Msg;
Msg<<"EOF in writeFully("<<Buffer<<","<<Size<<")";
throw runtime_error(Msg.str());
#endif // GCC2
}
}
}
void IOCallback::readFully(void*Buffer,size_t Size)
{
if(Buffer == NULL)
throw;
if(Buffer == NULL)
throw;
if(read(Buffer,Size) != Size)
{
if(read(Buffer,Size) != Size)
{
#if !defined(__GNUC__) || (__GNUC__ > 2)
stringstream Msg;
Msg<<"EOF in readFully("<<Buffer<<","<<Size<<")";
throw runtime_error(Msg.str());
stringstream Msg;
Msg<<"EOF in readFully("<<Buffer<<","<<Size<<")";
throw runtime_error(Msg.str());
#endif // GCC2
}
}
}
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,9 +27,9 @@
**********************************************************************/
/*!
\file
\version \$Id: MemIOCallback.cpp 693 2004-07-31 08:56:28Z robux4 $
\author Jory Stone <jcsston @ toughguy.net>
\file
\version \$Id: MemIOCallback.cpp 693 2004-07-31 08:56:28Z robux4 $
\author Jory Stone <jcsston @ toughguy.net>
*/
#include "ebml/MemIOCallback.h"
@ -40,85 +40,85 @@ START_LIBEBML_NAMESPACE
MemIOCallback::MemIOCallback(uint64 DefaultSize)
{
//The default size of the buffer is 128 bytes
dataBuffer = (binary *)malloc(DefaultSize);
if (dataBuffer == NULL) {
mOk = false;
std::stringstream Msg;
Msg << "Failed to alloc memory block of size ";
// not working with VC6 Msg << DefaultSize;
mLastErrorStr = Msg.str();
return;
}
dataBufferMemorySize = DefaultSize;
dataBufferPos = 0;
dataBufferTotalSize = 0;
mOk = true;
//The default size of the buffer is 128 bytes
dataBuffer = (binary *)malloc(DefaultSize);
if (dataBuffer == NULL) {
mOk = false;
std::stringstream Msg;
Msg << "Failed to alloc memory block of size ";
// not working with VC6 Msg << DefaultSize;
mLastErrorStr = Msg.str();
return;
}
dataBufferMemorySize = DefaultSize;
dataBufferPos = 0;
dataBufferTotalSize = 0;
mOk = true;
}
MemIOCallback::~MemIOCallback()
{
if (dataBuffer != NULL)
free(dataBuffer);
if (dataBuffer != NULL)
free(dataBuffer);
}
uint32 MemIOCallback::read(void *Buffer, size_t Size)
{
if (Buffer == NULL || Size < 1)
return 0;
//If the size is larger than than the amount left in the buffer
if (Size + dataBufferPos > dataBufferTotalSize)
{
//We will only return the remaining data
memcpy(Buffer, dataBuffer + dataBufferPos, dataBufferTotalSize - dataBufferPos);
if (Buffer == NULL || Size < 1)
return 0;
//If the size is larger than than the amount left in the buffer
if (Size + dataBufferPos > dataBufferTotalSize)
{
//We will only return the remaining data
memcpy(Buffer, dataBuffer + dataBufferPos, dataBufferTotalSize - dataBufferPos);
uint64 oldDataPos = dataBufferPos;
dataBufferPos = dataBufferTotalSize;
return dataBufferTotalSize - oldDataPos;
}
//Well... We made it here, so do a quick and simple copy
memcpy(Buffer, dataBuffer+dataBufferPos, Size);
dataBufferPos += Size;
dataBufferPos = dataBufferTotalSize;
return dataBufferTotalSize - oldDataPos;
}
return Size;
//Well... We made it here, so do a quick and simple copy
memcpy(Buffer, dataBuffer+dataBufferPos, Size);
dataBufferPos += Size;
return Size;
}
void MemIOCallback::setFilePointer(int64 Offset, seek_mode Mode)
{
if (Mode == seek_beginning)
dataBufferPos = Offset;
else if (Mode == seek_current)
dataBufferPos = dataBufferPos + Offset;
else if (Mode == seek_end)
dataBufferPos = dataBufferTotalSize + Offset;
if (Mode == seek_beginning)
dataBufferPos = Offset;
else if (Mode == seek_current)
dataBufferPos = dataBufferPos + Offset;
else if (Mode == seek_end)
dataBufferPos = dataBufferTotalSize + Offset;
}
size_t MemIOCallback::write(const void *Buffer, size_t Size)
{
if (dataBufferMemorySize < dataBufferPos + Size)
{
//We need more memory!
dataBuffer = (binary *)realloc((void *)dataBuffer, dataBufferPos + Size);
}
memcpy(dataBuffer+dataBufferPos, Buffer, Size);
dataBufferPos += Size;
if (dataBufferPos > dataBufferTotalSize)
dataBufferTotalSize = dataBufferPos;
if (dataBufferMemorySize < dataBufferPos + Size)
{
//We need more memory!
dataBuffer = (binary *)realloc((void *)dataBuffer, dataBufferPos + Size);
}
memcpy(dataBuffer+dataBufferPos, Buffer, Size);
dataBufferPos += Size;
if (dataBufferPos > dataBufferTotalSize)
dataBufferTotalSize = dataBufferPos;
return Size;
return Size;
}
uint32 MemIOCallback::write(IOCallback & IOToRead, size_t Size)
{
if (dataBufferMemorySize < dataBufferPos + Size)
{
//We need more memory!
dataBuffer = (binary *)realloc((void *)dataBuffer, dataBufferPos + Size);
}
IOToRead.readFully(&dataBuffer[dataBufferPos], Size);
dataBufferTotalSize = Size;
return Size;
if (dataBufferMemorySize < dataBufferPos + Size)
{
//We need more memory!
dataBuffer = (binary *)realloc((void *)dataBuffer, dataBufferPos + Size);
}
IOToRead.readFully(&dataBuffer[dataBufferPos], Size);
dataBufferTotalSize = Size;
return Size;
}
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,10 +27,10 @@
**********************************************************************/
/*!
\file
\version \$Id: StdIOCallback.cpp 1298 2008-02-21 22:14:18Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id: StdIOCallback.cpp 1298 2008-02-21 22:14:18Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#include <cassert>
@ -48,154 +48,154 @@ using namespace std;
START_LIBEBML_NAMESPACE
CRTError::CRTError(int nError, const std::string & Description)
:std::runtime_error(Description+": "+strerror(nError))
,Error(nError)
:std::runtime_error(Description+": "+strerror(nError))
,Error(nError)
{
}
CRTError::CRTError(const std::string & Description,int nError)
:std::runtime_error(Description+": "+strerror(nError))
,Error(nError)
:std::runtime_error(Description+": "+strerror(nError))
,Error(nError)
{
}
StdIOCallback::StdIOCallback(const char*Path, const open_mode aMode)
{
assert(Path!=0);
assert(Path!=0);
const char *Mode;
switch (aMode)
{
case MODE_READ:
Mode = "rb";
break;
case MODE_SAFE:
Mode = "rb+";
break;
case MODE_WRITE:
Mode = "wb";
break;
case MODE_CREATE:
Mode = "wb+";
break;
default:
throw 0;
}
const char *Mode;
switch (aMode)
{
case MODE_READ:
Mode = "rb";
break;
case MODE_SAFE:
Mode = "rb+";
break;
case MODE_WRITE:
Mode = "wb";
break;
case MODE_CREATE:
Mode = "wb+";
break;
default:
throw 0;
}
File=fopen(Path,Mode);
if(File==0)
{
File=fopen(Path,Mode);
if(File==0)
{
#if !defined(__GNUC__) || (__GNUC__ > 2)
stringstream Msg;
Msg<<"Can't open stdio file \""<<Path<<"\" in mode \""<<Mode<<"\"";
throw CRTError(Msg.str());
stringstream Msg;
Msg<<"Can't open stdio file \""<<Path<<"\" in mode \""<<Mode<<"\"";
throw CRTError(Msg.str());
#endif // GCC2
}
mCurrentPosition = 0;
}
mCurrentPosition = 0;
}
StdIOCallback::~StdIOCallback()throw()
{
close();
close();
}
uint32 StdIOCallback::read(void*Buffer,size_t Size)
{
assert(File!=0);
size_t result = fread(Buffer, 1, Size, File);
mCurrentPosition += result;
return result;
assert(File!=0);
size_t result = fread(Buffer, 1, Size, File);
mCurrentPosition += result;
return result;
}
void StdIOCallback::setFilePointer(int64 Offset,seek_mode Mode)
{
assert(File!=0);
assert(File!=0);
// There is a numeric cast in the boost library, which would be quite nice for this checking
/*
SL : replaced because unknown class in cygwin
assert(Offset <= numeric_limits<long>::max());
assert(Offset >= numeric_limits<long>::min());
// There is a numeric cast in the boost library, which would be quite nice for this checking
/*
SL : replaced because unknown class in cygwin
assert(Offset <= numeric_limits<long>::max());
assert(Offset >= numeric_limits<long>::min());
*/
assert(Offset <= LONG_MAX);
assert(Offset >= LONG_MIN);
assert(Offset <= LONG_MAX);
assert(Offset >= LONG_MIN);
assert(Mode==SEEK_CUR||Mode==SEEK_END||Mode==SEEK_SET);
assert(Mode==SEEK_CUR||Mode==SEEK_END||Mode==SEEK_SET);
if(fseek(File,Offset,Mode)!=0)
{
if(fseek(File,Offset,Mode)!=0)
{
#if !defined(__GNUC__) || (__GNUC__ > 2)
ostringstream Msg;
Msg<<"Failed to seek file "<<File<<" to offset "<<(unsigned long)Offset<<" in mode "<<Mode;
throw CRTError(Msg.str());
ostringstream Msg;
Msg<<"Failed to seek file "<<File<<" to offset "<<(unsigned long)Offset<<" in mode "<<Mode;
throw CRTError(Msg.str());
#endif // GCC2
mCurrentPosition = ftell(File);
}
else
{
switch ( Mode )
{
case SEEK_CUR:
mCurrentPosition += Offset;
break;
case SEEK_END:
mCurrentPosition = ftell(File);
break;
case SEEK_SET:
mCurrentPosition = Offset;
break;
}
}
mCurrentPosition = ftell(File);
}
else
{
switch ( Mode )
{
case SEEK_CUR:
mCurrentPosition += Offset;
break;
case SEEK_END:
mCurrentPosition = ftell(File);
break;
case SEEK_SET:
mCurrentPosition = Offset;
break;
}
}
}
size_t StdIOCallback::write(const void*Buffer,size_t Size)
{
assert(File!=0);
uint32 Result = fwrite(Buffer,1,Size,File);
mCurrentPosition += Result;
return Result;
assert(File!=0);
uint32 Result = fwrite(Buffer,1,Size,File);
mCurrentPosition += Result;
return Result;
}
uint64 StdIOCallback::getFilePointer()
{
assert(File!=0);
assert(File!=0);
#if 0
long Result=ftell(File);
if(Result<0)
{
long Result=ftell(File);
if(Result<0)
{
#if !defined(__GNUC__) || (__GNUC__ > 2)
stringstream Msg;
Msg<<"Can't tell the current file pointer position for "<<File;
throw CRTError(Msg.str());
stringstream Msg;
Msg<<"Can't tell the current file pointer position for "<<File;
throw CRTError(Msg.str());
#endif // GCC2
}
}
#endif
return mCurrentPosition;
return mCurrentPosition;
}
void StdIOCallback::close()
{
if(File==0)
return;
if(File==0)
return;
if(fclose(File)!=0)
{
if(fclose(File)!=0)
{
#if !defined(__GNUC__) || (__GNUC__ > 2)
stringstream Msg;
Msg<<"Can't close file "<<File;
throw CRTError(Msg.str());
stringstream Msg;
Msg<<"Can't close file "<<File;
throw CRTError(Msg.str());
#endif // GCC2
}
}
File=0;
File=0;
}
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -27,11 +27,11 @@
**********************************************************************/
/*!
\file
\version \$Id: WinIOCallback.cpp 1092 2005-03-16 13:01:15Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\author Cyrius <suiryc @ users.sf.net>
\file
\version \$Id: WinIOCallback.cpp 1092 2005-03-16 13:01:15Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\author Cyrius <suiryc @ users.sf.net>
*/
#include <cassert>
@ -47,238 +47,238 @@
START_LIBEBML_NAMESPACE
WinIOCallback::WinIOCallback(const char* Path, const open_mode aMode, DWORD dwFlags)
:mFile(NULL), mOk(false)
:mFile(NULL), mOk(false)
{
mOk = open(Path, aMode, dwFlags);
mOk = open(Path, aMode, dwFlags);
}
WinIOCallback::WinIOCallback(const wchar_t* Path, const open_mode aMode, DWORD dwFlags)
:mFile(NULL), mOk(false)
:mFile(NULL), mOk(false)
{
mOk = open(Path, aMode, dwFlags);
mOk = open(Path, aMode, dwFlags);
}
WinIOCallback::~WinIOCallback()
{
close();
close();
}
bool WinIOCallback::open(const char* Path, const open_mode aMode, DWORD dwFlags)
bool WinIOCallback::open(const char* Path, const open_mode aMode, DWORD dwFlags)
{
assert(Path!=0);
assert(Path!=0);
DWORD AccessMode, ShareMode, Disposition;
DWORD AccessMode, ShareMode, Disposition;
switch (aMode)
{
case MODE_READ:
AccessMode = GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_EXISTING;
break;
case MODE_WRITE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = OPEN_ALWAYS;
break;
case MODE_SAFE:
AccessMode = GENERIC_WRITE|GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_ALWAYS;
break;
case MODE_CREATE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = CREATE_ALWAYS;
break;
default:
assert(false);
}
switch (aMode)
{
case MODE_READ:
AccessMode = GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_EXISTING;
break;
case MODE_WRITE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = OPEN_ALWAYS;
break;
case MODE_SAFE:
AccessMode = GENERIC_WRITE|GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_ALWAYS;
break;
case MODE_CREATE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = CREATE_ALWAYS;
break;
default:
assert(false);
}
mFile = CreateFileA(Path, AccessMode, ShareMode, NULL, Disposition, dwFlags, NULL);
if ((mFile == INVALID_HANDLE_VALUE) || ((long)mFile == 0xffffffff))
{
//File was not opened
char err_msg[256];
DWORD error_code = GetLastError();
// An error message about the file already existing is not really an error message :P
if (error_code != ERROR_ALREADY_EXISTS) {
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, error_code, 0, err_msg, 255, NULL);
EBML_TRACE("Failed to open file \"%hs\" in mode %d.", Path, aMode);
mFile = CreateFileA(Path, AccessMode, ShareMode, NULL, Disposition, dwFlags, NULL);
if ((mFile == INVALID_HANDLE_VALUE) || ((long)mFile == 0xffffffff))
{
//File was not opened
char err_msg[256];
DWORD error_code = GetLastError();
// An error message about the file already existing is not really an error message :P
if (error_code != ERROR_ALREADY_EXISTS) {
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, error_code, 0, err_msg, 255, NULL);
EBML_TRACE("Failed to open file \"%hs\" in mode %d.", Path, aMode);
mLastErrorStr = err_msg;
return mOk = false;
}
}
mCurrentPosition = 0;
mLastErrorStr = err_msg;
return mOk = false;
}
}
mCurrentPosition = 0;
EBML_TRACE("Successfully opened file \"%hs\" in mode %d. The handle is %p\n", Path, aMode, mFile);
EBML_TRACE("Successfully opened file \"%hs\" in mode %d. The handle is %p\n", Path, aMode, mFile);
return mOk = true;
return mOk = true;
};
bool WinIOCallback::open(const wchar_t* Path, const open_mode aMode, DWORD dwFlags)
bool WinIOCallback::open(const wchar_t* Path, const open_mode aMode, DWORD dwFlags)
{
assert(Path!=0);
assert(Path!=0);
DWORD AccessMode, ShareMode, Disposition;
DWORD AccessMode, ShareMode, Disposition;
switch (aMode)
{
case MODE_READ:
AccessMode = GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_EXISTING;
break;
case MODE_WRITE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = OPEN_ALWAYS;
break;
case MODE_SAFE:
AccessMode = GENERIC_WRITE|GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_ALWAYS;
break;
case MODE_CREATE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = CREATE_ALWAYS;
break;
default:
assert(false);
}
switch (aMode)
{
case MODE_READ:
AccessMode = GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_EXISTING;
break;
case MODE_WRITE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = OPEN_ALWAYS;
break;
case MODE_SAFE:
AccessMode = GENERIC_WRITE|GENERIC_READ;
ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
Disposition = OPEN_ALWAYS;
break;
case MODE_CREATE:
AccessMode = GENERIC_WRITE;
ShareMode = 0;
Disposition = CREATE_ALWAYS;
break;
default:
assert(false);
}
if ((LONG)GetVersion() >= 0) {
mFile = CreateFileW(Path, AccessMode, ShareMode, NULL, Disposition, dwFlags, NULL);
} else {
int errCode;
int pathSize = wcslen(Path);
unsigned int bufferSize = pathSize + sizeof(wchar_t) * 2;
std::string PathA;
PathA.resize(bufferSize);
errCode = WideCharToMultiByte(CP_ACP, 0, Path, pathSize, (char *)PathA.c_str(), bufferSize, NULL, NULL);
if (errCode == 0)
errCode = GetLastError();
#ifdef _DEBUG
if (errCode == ERROR_INSUFFICIENT_BUFFER) OutputDebugString(TEXT("WinIOCallback::WideCharToMultiByte::ERROR_INSUFFICIENT_BUFFER"));
if (errCode == ERROR_INVALID_FLAGS) OutputDebugString(TEXT("WinIOCallback::WideCharToMultiByte::ERROR_INVALID_FLAGS"));
if (errCode == ERROR_INVALID_PARAMETER) OutputDebugString(TEXT("WinIOCallback::WideCharToMultiByte::ERROR_INVALID_PARAMETER"));
if ((LONG)GetVersion() >= 0) {
mFile = CreateFileW(Path, AccessMode, ShareMode, NULL, Disposition, dwFlags, NULL);
} else {
int errCode;
int pathSize = wcslen(Path);
unsigned int bufferSize = pathSize + sizeof(wchar_t) * 2;
std::string PathA;
PathA.resize(bufferSize);
errCode = WideCharToMultiByte(CP_ACP, 0, Path, pathSize, (char *)PathA.c_str(), bufferSize, NULL, NULL);
if (errCode == 0)
errCode = GetLastError();
#ifdef _DEBUG
if (errCode == ERROR_INSUFFICIENT_BUFFER) OutputDebugString(TEXT("WinIOCallback::WideCharToMultiByte::ERROR_INSUFFICIENT_BUFFER"));
if (errCode == ERROR_INVALID_FLAGS) OutputDebugString(TEXT("WinIOCallback::WideCharToMultiByte::ERROR_INVALID_FLAGS"));
if (errCode == ERROR_INVALID_PARAMETER) OutputDebugString(TEXT("WinIOCallback::WideCharToMultiByte::ERROR_INVALID_PARAMETER"));
#endif
while (errCode == ERROR_INSUFFICIENT_BUFFER) {
// Increase the buffer size
bufferSize += MAX_PATH;
PathA.resize(bufferSize);
errCode = WideCharToMultiByte(CP_ACP, WC_SEPCHARS, Path, pathSize, (char *)PathA.c_str(), bufferSize, NULL, NULL);
if (errCode == 0)
errCode = GetLastError();
}
if (errCode != 0) {
mFile = CreateFileA(PathA.c_str(), AccessMode, ShareMode, NULL, Disposition, dwFlags, NULL);
} else {
mLastErrorStr = "Couldn't convert Unicode filename to ANSI.";
return mOk = false;
}
}
if ((mFile == INVALID_HANDLE_VALUE) || ((long)mFile == 0xffffffff))
{
//File was not opened
char err_msg[256];
DWORD error_code = GetLastError();
// An error message about the file already existing is not really an error message :P
if (error_code != ERROR_ALREADY_EXISTS) {
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, error_code, 0, err_msg, 255, NULL);
EBML_TRACE("Failed to open file \"%S\" in mode %d.", Path, aMode);
mLastErrorStr = err_msg;
return mOk = false;
}
}
mCurrentPosition = 0;
while (errCode == ERROR_INSUFFICIENT_BUFFER) {
// Increase the buffer size
bufferSize += MAX_PATH;
PathA.resize(bufferSize);
errCode = WideCharToMultiByte(CP_ACP, WC_SEPCHARS, Path, pathSize, (char *)PathA.c_str(), bufferSize, NULL, NULL);
if (errCode == 0)
errCode = GetLastError();
}
if (errCode != 0) {
mFile = CreateFileA(PathA.c_str(), AccessMode, ShareMode, NULL, Disposition, dwFlags, NULL);
} else {
mLastErrorStr = "Couldn't convert Unicode filename to ANSI.";
return mOk = false;
}
}
if ((mFile == INVALID_HANDLE_VALUE) || ((long)mFile == 0xffffffff))
{
//File was not opened
char err_msg[256];
DWORD error_code = GetLastError();
// An error message about the file already existing is not really an error message :P
if (error_code != ERROR_ALREADY_EXISTS) {
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, error_code, 0, err_msg, 255, NULL);
EBML_TRACE("Failed to open file \"%S\" in mode %d.", Path, aMode);
mLastErrorStr = err_msg;
return mOk = false;
}
}
mCurrentPosition = 0;
EBML_TRACE("Successfully opened file \"%S\" in mode %d. The handle is %p\n", Path, aMode, mFile);
return mOk = true;
EBML_TRACE("Successfully opened file \"%S\" in mode %d. The handle is %p\n", Path, aMode, mFile);
return mOk = true;
}
void WinIOCallback::close()
{
if (mFile) {
CloseHandle(mFile);
mFile = NULL;
}
if (mFile) {
CloseHandle(mFile);
mFile = NULL;
}
}
uint64 WinIOCallback::getFilePointer()
{
if (!mFile) {
return 0;
}
return mCurrentPosition;
if (!mFile) {
return 0;
}
return mCurrentPosition;
#if 0
LONG High = 0;
DWORD Low = SetFilePointer(mFile, 0, &High, FILE_CURRENT);
if ( (Low==INVALID_SET_FILE_POINTER) && (GetLastError()!=NO_ERROR) )
return static_cast<uint64>(-1);
return ((uint64(High)<<32) | Low);
LONG High = 0;
DWORD Low = SetFilePointer(mFile, 0, &High, FILE_CURRENT);
if ( (Low==INVALID_SET_FILE_POINTER) && (GetLastError()!=NO_ERROR) )
return static_cast<uint64>(-1);
return ((uint64(High)<<32) | Low);
#endif
}
void WinIOCallback::setFilePointer(int64 Offset, seek_mode Mode)
{
DWORD Method;
switch(Mode)
{
case seek_beginning:
Method=FILE_BEGIN;
break;
case seek_current:
Method=FILE_CURRENT;
break;
case seek_end:
Method=FILE_END;
break;
default:
assert(false);
break;
}
DWORD Method;
switch(Mode)
{
case seek_beginning:
Method=FILE_BEGIN;
break;
case seek_current:
Method=FILE_CURRENT;
break;
case seek_end:
Method=FILE_END;
break;
default:
assert(false);
break;
}
LONG High = LONG(Offset>>32);
mCurrentPosition = SetFilePointer(mFile, LONG(Offset & 0xffffffff), &High, Method);
if ( mCurrentPosition == INVALID_SET_FILE_POINTER )
{
High = 0;
DWORD Low = SetFilePointer(mFile, 0, &High, FILE_CURRENT);
mCurrentPosition = ((uint64(High)<<32) | Low);
}
else
{
mCurrentPosition |= uint64(High)<<32;
}
LONG High = LONG(Offset>>32);
mCurrentPosition = SetFilePointer(mFile, LONG(Offset & 0xffffffff), &High, Method);
if ( mCurrentPosition == INVALID_SET_FILE_POINTER )
{
High = 0;
DWORD Low = SetFilePointer(mFile, 0, &High, FILE_CURRENT);
mCurrentPosition = ((uint64(High)<<32) | Low);
}
else
{
mCurrentPosition |= uint64(High)<<32;
}
}
uint32 WinIOCallback::read(void*Buffer,size_t Size)
{
DWORD BytesRead;
if (!ReadFile(mFile, Buffer, Size, &BytesRead, NULL)) {
return 0;
}
mCurrentPosition += BytesRead;
return BytesRead;
DWORD BytesRead;
if (!ReadFile(mFile, Buffer, Size, &BytesRead, NULL)) {
return 0;
}
mCurrentPosition += BytesRead;
return BytesRead;
}
size_t WinIOCallback::write(const void*Buffer,size_t Size)
{
DWORD BytesWriten;
if (!WriteFile(mFile, Buffer, Size, &BytesWriten, NULL)) {
return 0;
}
mCurrentPosition += BytesWriten;
return BytesWriten;
DWORD BytesWriten;
if (!WriteFile(mFile, Buffer, Size, &BytesWriten, NULL)) {
return 0;
}
mCurrentPosition += BytesWriten;
return BytesWriten;
}
bool WinIOCallback::SetEOF()
{
return SetEndOfFile(mFile) != 0;
return SetEndOfFile(mFile) != 0;
}
END_LIBEBML_NAMESPACE

View File

@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -26,11 +26,11 @@
**
**********************************************************************/
/*!
\file
\version \$Id: WinIOCallback.h 1090 2005-03-16 12:47:59Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\author Cyrius <suiryc @ users.sf.net>
\file
\version \$Id: WinIOCallback.h 1090 2005-03-16 12:47:59Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Jory Stone <jcsston @ toughguy.net>
\author Cyrius <suiryc @ users.sf.net>
*/
#ifndef LIBEBML_WINIOCALLBACK_H
@ -44,30 +44,30 @@
START_LIBEBML_NAMESPACE
class WinIOCallback: public IOCallback
{
{
public:
WinIOCallback(const wchar_t* Path, const open_mode aMode, DWORD dwFlags=0);
WinIOCallback(const char* Path, const open_mode aMode, DWORD dwFlags=0);
virtual ~WinIOCallback();
WinIOCallback(const wchar_t* Path, const open_mode aMode, DWORD dwFlags=0);
WinIOCallback(const char* Path, const open_mode aMode, DWORD dwFlags=0);
virtual ~WinIOCallback();
bool open(const wchar_t* Path, const open_mode Mode, DWORD dwFlags=0);
bool open(const char* Path, const open_mode Mode, DWORD dwFlags=0);
bool open(const wchar_t* Path, const open_mode Mode, DWORD dwFlags=0);
bool open(const char* Path, const open_mode Mode, DWORD dwFlags=0);
virtual uint32 read(void*Buffer,size_t Size);
virtual size_t write(const void*Buffer,size_t Size);
virtual void setFilePointer(int64 Offset,seek_mode Mode=seek_beginning);
virtual uint64 getFilePointer();
virtual void close();
bool IsOk() { return mOk; };
const std::string &GetLastErrorStr() { return mLastErrorStr; };
bool SetEOF();
virtual uint32 read(void*Buffer,size_t Size);
virtual size_t write(const void*Buffer,size_t Size);
virtual void setFilePointer(int64 Offset,seek_mode Mode=seek_beginning);
virtual uint64 getFilePointer();
virtual void close();
bool IsOk() { return mOk; };
const std::string &GetLastErrorStr() { return mLastErrorStr; };
bool SetEOF();
protected:
bool mOk;
std::string mLastErrorStr;
uint64 mCurrentPosition;
bool mOk;
std::string mLastErrorStr;
uint64 mCurrentPosition;
HANDLE mFile;
HANDLE mFile;
};
END_LIBEBML_NAMESPACE