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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,12 +11,12 @@
** modify it under the terms of the GNU Lesser General Public ** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either ** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version. ** 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, ** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of ** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details. ** Lesser General Public License for more details.
** **
** You should have received a copy of the GNU Lesser General Public ** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software ** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -29,9 +29,9 @@
**********************************************************************/ **********************************************************************/
/*! /*!
\file \file
\version \$Id$ \version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net> \author Steve Lhomme <robux4 @ users.sf.net>
*/ */
#ifndef LIBEBML_STREAM_H #ifndef LIBEBML_STREAM_H
#define LIBEBML_STREAM_H #define LIBEBML_STREAM_H
@ -47,20 +47,20 @@ START_LIBEBML_NAMESPACE
\brief Handle an input/output stream of EBML elements \brief Handle an input/output stream of EBML elements
*/ */
class EBML_DLL_API EbmlStream { class EBML_DLL_API EbmlStream {
public: public:
EbmlStream(IOCallback & output); EbmlStream(IOCallback & output);
~EbmlStream(); ~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);
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;} operator IOCallback &() {return Stream;}
#if defined(EBML_STRICT_API) #if defined(EBML_STRICT_API)
@ -68,7 +68,7 @@ class EBML_DLL_API EbmlStream {
#else #else
protected: protected:
#endif #endif
IOCallback & Stream; IOCallback & Stream;
}; };
END_LIBEBML_NAMESPACE END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -29,9 +29,9 @@
**********************************************************************/ **********************************************************************/
/*! /*!
\file \file
\version \$Id$ \version \$Id$
\author Steve Lhomme <robux4 @ users.sf.net> \author Steve Lhomme <robux4 @ users.sf.net>
*/ */
#ifndef LIBEBML_VERSION_H #ifndef LIBEBML_VERSION_H
#define LIBEBML_VERSION_H #define LIBEBML_VERSION_H
@ -48,7 +48,7 @@ extern const std::string EbmlCodeVersion;
extern const std::string EbmlCodeDate; 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 END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

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

View File

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

View File

@ -50,7 +50,7 @@ extern "C" {
// Changed char is unsigned now (signedness was causing trouble in endil) // Changed char is unsigned now (signedness was causing trouble in endil)
#if defined(_WIN32) #if defined(_WIN32)
# if !defined(__GNUC__) // Microsoft Visual C++ # if !defined(__GNUC__) // Microsoft Visual C++
typedef signed __int64 int64; typedef signed __int64 int64;
typedef signed __int32 int32; typedef signed __int32 int32;
typedef signed __int16 int16; typedef signed __int16 int16;
@ -74,7 +74,7 @@ extern "C" {
# endif // __GNUC__ # endif // __GNUC__
#elif defined(__BEOS__) #elif defined(__BEOS__)
#include <SupportDefs.h> #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 long int64;
typedef signed long int32; typedef signed long int32;
typedef signed short int16; typedef signed short int16;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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