37 Commits

Author SHA1 Message Date
Steve Lhomme
a83cbaef57 libebml: use the visibility attribute with GCC to export lib APIs 2015-06-11 17:16:07 +02:00
Moritz Bunkus
49750c62ca Merge pull request #6 from MediaArea/master
start README.md
2015-05-01 08:48:09 +02:00
Dave Rice
d0c8e6eb05 start README.md 2015-04-29 19:52:46 -04:00
Steve Lhomme
108f7fd5fe do not allow too big String sizes
the max value is the same as in EbmlBinary and is still generous
2015-02-23 11:27:17 +01:00
Moritz Bunkus
b1a4c9ac00 EbmlElement: don't catch exceptions when writing elements 2015-01-04 15:05:42 +01:00
Moritz Bunkus
38eee9f0d6 ChangeLog: add release message 2015-01-04 14:28:53 +01:00
Moritz Bunkus
b000c55fdc build system: autogen.sh not needed; »autoreconf -fi« suffices 2014-12-21 11:38:45 +01:00
Moritz Bunkus
7bb5523d4e ChangeLog: recode to UTF-8 2014-12-21 11:38:31 +01:00
Moritz Bunkus
3be9e9b1d9 ChangeLog: mention the pkg-config file 2014-12-21 10:51:12 +01:00
Moritz Bunkus
befb00d980 cosmetics: alignment 2014-12-21 10:18:12 +01:00
Moritz Bunkus
7b8b0a6271 ChangeLog: update with build system changes 2014-12-21 10:12:09 +01:00
Moritz Bunkus
e57411cfd2 build system: remove old build files 2014-12-21 10:11:03 +01:00
Moritz Bunkus
873839b802 build system: add new source/header files to Makefile.am 2014-12-21 10:08:16 +01:00
Moritz Bunkus
e88d787c32 build system: autogen.sh script for generating configure etc. 2014-12-21 10:06:04 +01:00
Moritz Bunkus
677da149f1 build system: bump version number 2014-12-21 09:58:52 +01:00
Moritz Bunkus
c170b5ba58 Merge remote-tracking branch 'jan-engelhardt/master' 2014-12-21 09:57:58 +01:00
Moritz Bunkus
8055be972c EbmlMaster::Read(): drop elements with unset values in SCOPE_FULL_DATA mode
This prevents elements that couldn't be read properly (e.g. due to
defective data) from being handed over to the calling code in at best
half initialized state. See https://trac.bunkus.org/ticket/1096
2014-12-20 17:30:06 +01:00
Moritz Bunkus
6ba868a49b MemReadIOCallback, SafeReadIOCallback: add new classes for safe (memory) reading
squash! EbmlMemoryStream: add new class for safe memory reading
2014-12-20 17:29:48 +01:00
Moritz Bunkus
ce72b9266a cosmetics: unify indentation 2014-12-19 14:40:44 +01:00
Moritz Bunkus
34554928aa cosmetics: use spaces instead of tab characters; remove trailing whitespace 2014-12-19 00:23:13 +01:00
Moritz Bunkus
dc9a431375 version: bump version to 1.3.1 2014-12-19 00:20:32 +01:00
Moritz Bunkus
7a347adc37 ChangeLog update 2014-12-19 00:20:32 +01:00
Moritz Bunkus
95ff31de88 EbmlMaster: don't try to skip data on elements with unknown sizes 2014-12-19 00:20:32 +01:00
Moritz Bunkus
ea8ea4ca99 EbmlMaster: don't try to get end position of an element with an unknown size
See https://trac.bunkus.org/ticket/1089
2014-12-19 00:20:32 +01:00
Jan Engelhardt
87532e8cab build: use automake as a build system
Also provide a convenient pkg-config file at the same time.
2014-08-10 11:23:09 +09:00
Moritz Bunkus
ef3f1430dd Merge pull request #3 from maksqwe/master
Some of the fixes and optimization
2014-05-12 20:02:47 +02:00
Moritz Bunkus
a366eaa89e Don't cause over-/underflow on certain platforms
On mingw 32bit this comparison gives a warning about always being
true, which can only be the case if one of the constant actually
over/underflows.
2013-12-07 13:32:22 +01:00
Moritz Bunkus
b0c4cb4701 Avoid compiler warning about possible use of uninitialized values 2013-10-19 12:25:30 +02:00
maksqwe
f0cf0dcbec fix indentation 2013-08-23 21:58:04 +03:00
maksqwe
af339a7a7a 1. "wcslen" function was called multiple times with "const wchar_t* Path"
2. fix mistake which led to undefined behavior "uint64(High<<32)" -> "uint64(High)<<32"
3. optimize std::vector<>::iterator's usage "iter++" -> "++iter". See preincrement and postincrement operator++()
2013-08-23 00:30:37 +03:00
Denis Charmet
0f99c2d712 Use (std::nothrow) with new when the code check for null pointer results. 2013-05-01 12:40:54 +02:00
Moritz Bunkus
b71292464e Merge pull request #1 from RedDwarf69/master
Linux packaging
2013-04-06 01:20:52 -07:00
Cristian Morales Vega
71fbd5a521 Use Linux-style EOL for non Windows specific files 2013-04-06 08:53:50 +01:00
Cristian Morales Vega
302c8fb89d Fix typo 2013-04-06 08:49:35 +01:00
Cristian Morales Vega
6efcb74d1e Add DESTDIR option to Linux Makefile 2013-04-06 08:48:34 +01:00
Cristian Morales Vega
ae0d773e15 Add "link" option to Linux Makefile 2013-04-06 08:45:14 +01:00
Cristian Morales Vega
9b440f958e Stop using -ansi -fno-gnu-keywords in Linux
There is no need for -fno-gnu-keywords (which was implied by -ansi) in the
current code.
-ansi disables GCC built-in functions, which add optimizations and extra
security checks in some cases. It may be good to use it (and -pedantic) while
developing to try to keep the code ANSI standard, but users should have binaries
compiled without the option.
2013-03-28 08:26:23 +00:00
73 changed files with 4770 additions and 6128 deletions

19
.gitignore vendored
View File

@@ -1 +1,18 @@
*.[ao]
.deps/
.libs/
*.a
*.la
*.lo
*.o
*.pc
Makefile
Makefile.in
.dirstamp
/aclocal.m4
/autom4te.cache/
/build-aux/
/config.*
/configure
/libtool
/stamp-h1

View File

@@ -1,3 +1,35 @@
2015-01-04 Moritz Bunkus <moritz@bunkus.org>
* Released v1.3.1.
* EbmlElement::Render(): doesn't catch exceptions anymore. Instead
exceptions generated from the IOCallback class (e.g. if a write
failed) are propagated to the caller.
2014-12-21 Moritz Bunkus <moritz@bunkus.org>
* build system: switched the build system from hand-crafted
Makefiles to an autoconf/automake-based system. A pkg-config file
will be installed as well; its name is »libebml«. Patch by Jan
Engelhardt <jengelh@inai.de>.
2014-12-20 Moritz Bunkus <moritz@bunkus.org>
* EbmlMaster::Read(): when reading with SCOPE_ALL_DATA only those
elements that could successfully be read will be kept
(e.g. defective block groups will be dropped).
2014-12-19 Moritz Bunkus <moritz@bunkus.org>
* EbmlMemoryStream: add a new class for safe memory access that
throws exception on failures.
2014-12-18 Moritz Bunkus <moritz@bunkus.org>
* EbmlMaster: Fixed read() trying to calculate the end position of
elements with an unknown size. This avoids endless loops and
assertions in certain cases. See https://trac.bunkus.org/ticket/1089
2013-03-19 mosu
New 1.3.0 version:
* Note that this version is not binary compatible to its predecessors.
@@ -606,7 +638,7 @@ New 0.8.0 version:
2004-10-14 07:48 mosu
* trunk/libebml/src/EbmlUnicodeString.cpp: wchar.h doesn't exist on
OpenBSD. Patch by Diego Petten<EFBFBD> <dgp85 (a) users ! sourceforge !
OpenBSD. Patch by Diego Pettenò <dgp85 (a) users ! sourceforge !
net>.
2004-09-26 10:03 mosu

File diff suppressed because it is too large Load Diff

72
Makefile.am Normal file
View File

@@ -0,0 +1,72 @@
# -*- Makefile -*-
ACLOCAL_AMFLAGS = -I m4
AM_CPPFLAGS = -I${top_srcdir}
AM_CXXFLAGS = -Wall -Wextra -Wno-unknown-pragmas -Wshadow
if ENABLE_DEBUG
AM_CPPFLAGS += -DDEBUG
AM_CXXFLAGS += -g
endif
lib_LTLIBRARIES = libebml.la
libebml_la_SOURCES = \
src/Debug.cpp \
src/EbmlBinary.cpp \
src/EbmlContexts.cpp \
src/EbmlCrc32.cpp \
src/EbmlDate.cpp \
src/EbmlDummy.cpp \
src/EbmlElement.cpp \
src/EbmlFloat.cpp \
src/EbmlHead.cpp \
src/EbmlMaster.cpp \
src/EbmlSInteger.cpp \
src/EbmlStream.cpp \
src/EbmlString.cpp \
src/EbmlSubHead.cpp \
src/EbmlUInteger.cpp \
src/EbmlUnicodeString.cpp \
src/EbmlVersion.cpp \
src/EbmlVoid.cpp \
src/IOCallback.cpp \
src/MemIOCallback.cpp \
src/MemReadIOCallback.cpp \
src/SafeReadIOCallback.cpp \
src/StdIOCallback.cpp
libebml_la_LDFLAGS = -version-info 4:0:0 -no-undefined
nobase_include_HEADERS = \
ebml/c/libebml_t.h \
ebml/Debug.h \
ebml/EbmlBinary.h \
ebml/EbmlConfig.h \
ebml/EbmlContexts.h \
ebml/EbmlCrc32.h \
ebml/EbmlDate.h \
ebml/EbmlDummy.h \
ebml/EbmlElement.h \
ebml/EbmlEndian.h \
ebml/EbmlFloat.h \
ebml/EbmlHead.h \
ebml/EbmlId.h \
ebml/EbmlMaster.h \
ebml/EbmlSInteger.h \
ebml/EbmlStream.h \
ebml/EbmlString.h \
ebml/EbmlSubHead.h \
ebml/EbmlTypes.h \
ebml/EbmlUInteger.h \
ebml/EbmlUnicodeString.h \
ebml/EbmlVersion.h \
ebml/EbmlVoid.h \
ebml/IOCallback.h \
ebml/MemIOCallback.h \
ebml/MemReadIOCallback.h \
ebml/SafeReadIOCallback.h \
ebml/StdIOCallback.h
pkgconfigdir = ${libdir}/pkgconfig
pkgconfig_DATA = libebml.pc
${pkgconfig_DATA}: config.status

4
README.md Normal file
View File

@@ -0,0 +1,4 @@
# libebml
a C++ libary to parse EBML files
Specifications may be rendered at http://matroska-org.github.io/libebml/

13
configure.ac Normal file
View File

@@ -0,0 +1,13 @@
AC_INIT([libebml], [1.3.1])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign subdir-objects tar-pax])
AC_PROG_CXX
LT_INIT
AC_ARG_ENABLE([debug],
AS_HELP_STRING([--enable-debug], [Add -g -DDEBUG to compile flags]),
[enable_debug="$withval"], [enable_debug=no])
AM_CONDITIONAL([ENABLE_DEBUG], [test "$enable_debug" = yes])
AC_CONFIG_FILES([Makefile libebml.pc])
AC_OUTPUT

View File

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

View File

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

View File

@@ -9,12 +9,12 @@
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -27,10 +27,10 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlConfig.h 1241 2006-01-25 00:59:45Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
\file
\version \$Id: EbmlConfig.h 1241 2006-01-25 00:59:45Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
\author Moritz Bunkus <moritz @ bunkus.org>
*/
#ifndef LIBEBML_CONFIG_H
@@ -78,14 +78,22 @@
# define EBML_DLL_API __declspec(dllimport)
# endif // EBML_DLL_EXPORT
# else // EBML_DLL
# define EBML_DLL_API
# if defined(__GNUC__) && __GNUC__ >= 4
# define EBML_DLL_API __attribute__((visibility("default")))
# else
# define EBML_DLL_API
# endif /* __GNUC__ */
# endif // EBML_DLL
# ifdef _MSC_VER
# pragma warning(disable:4786) // length of internal identifiers
# endif // _MSC_VER
#else
# define EBML_DLL_API
# if defined(__GNUC__) && __GNUC__ >= 4
# define EBML_DLL_API __attribute__((visibility("default")))
# else
# define EBML_DLL_API
# endif /* __GNUC__ */
#endif // WIN32 || _WIN32

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,122 +1,122 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlEndian.h 1298 2008-02-21 22:14:18Z mosu $
\author Ingo Ralf Blum <ingoralfblum @ users.sf.net>
\author Lasse K<>rkk<6B>inen <tronic @ users.sf.net>
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_ENDIAN_H
#define LIBEBML_ENDIAN_H
#include <algorithm>
#include <cstring>
#include "EbmlConfig.h" // contains _ENDIANESS_
START_LIBEBML_NAMESPACE
enum endianess {
big_endian, ///< PowerPC, Alpha, 68000
little_endian ///< Intel x86 platforms
};
/*!
\class Endian
\brief general class to handle endian-specific buffers
\note don't forget to define/undefine _ENDIANESS_ to BIG_ENDIAN depending on your machine
*/
template<class TYPE, endianess ENDIAN> class Endian
{
public:
Endian() {}
Endian(const TYPE value)
{
memcpy(&platform_value, &value, sizeof(TYPE));
process_endian();
}
inline Endian & Eval(const binary *endian_buffer)
{
//endian_value = *(TYPE *)(endian_buffer);
memcpy(&endian_value, endian_buffer, sizeof(TYPE)); // Some (all?) RISC processors do not allow reading objects bigger than 1 byte from non-aligned addresses, and endian_buffer may point to a non-aligned address.
process_platform();
return *this;
}
inline void Fill(binary *endian_buffer) const
{
//*(TYPE*)endian_buffer = endian_value;
memcpy(endian_buffer, &endian_value, sizeof(TYPE)); // See above.
}
inline operator const TYPE&() const { return platform_value; }
// inline TYPE endian() const { return endian_value; }
inline const TYPE &endian() const { return endian_value; }
inline size_t size() const { return sizeof(TYPE); }
inline bool operator!=(const binary *buffer) const {return *((TYPE*)buffer) == platform_value;}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
TYPE platform_value;
TYPE endian_value;
inline void process_endian()
{
endian_value = platform_value;
#ifdef WORDS_BIGENDIAN
if (ENDIAN == little_endian)
#else // _ENDIANESS_
if (ENDIAN == big_endian)
#endif // _ENDIANESS_
std::reverse(reinterpret_cast<uint8*>(&endian_value),reinterpret_cast<uint8*>(&endian_value+1));
}
inline void process_platform()
{
platform_value = endian_value;
#ifdef WORDS_BIGENDIAN
if (ENDIAN == little_endian)
#else // _ENDIANESS_
if (ENDIAN == big_endian)
#endif // _ENDIANESS_
std::reverse(reinterpret_cast<uint8*>(&platform_value),reinterpret_cast<uint8*>(&platform_value+1));
}
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_ENDIAN_H
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlEndian.h 1298 2008-02-21 22:14:18Z mosu $
\author Ingo Ralf Blum <ingoralfblum @ users.sf.net>
\author Lasse K<>rkk<6B>inen <tronic @ users.sf.net>
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_ENDIAN_H
#define LIBEBML_ENDIAN_H
#include <algorithm>
#include <cstring>
#include "EbmlConfig.h" // contains _ENDIANESS_
START_LIBEBML_NAMESPACE
enum endianess {
big_endian, ///< PowerPC, Alpha, 68000
little_endian ///< Intel x86 platforms
};
/*!
\class Endian
\brief general class to handle endian-specific buffers
\note don't forget to define/undefine _ENDIANESS_ to BIG_ENDIAN depending on your machine
*/
template<class TYPE, endianess ENDIAN> class Endian
{
public:
Endian() {}
Endian(const TYPE value)
{
memcpy(&platform_value, &value, sizeof(TYPE));
process_endian();
}
inline Endian & Eval(const binary *endian_buffer)
{
//endian_value = *(TYPE *)(endian_buffer);
memcpy(&endian_value, endian_buffer, sizeof(TYPE)); // Some (all?) RISC processors do not allow reading objects bigger than 1 byte from non-aligned addresses, and endian_buffer may point to a non-aligned address.
process_platform();
return *this;
}
inline void Fill(binary *endian_buffer) const
{
//*(TYPE*)endian_buffer = endian_value;
memcpy(endian_buffer, &endian_value, sizeof(TYPE)); // See above.
}
inline operator const TYPE&() const { return platform_value; }
// inline TYPE endian() const { return endian_value; }
inline const TYPE &endian() const { return endian_value; }
inline size_t size() const { return sizeof(TYPE); }
inline bool operator!=(const binary *buffer) const {return *((TYPE*)buffer) == platform_value;}
#if defined(EBML_STRICT_API)
private:
#else
protected:
#endif
TYPE platform_value;
TYPE endian_value;
inline void process_endian()
{
endian_value = platform_value;
#ifdef WORDS_BIGENDIAN
if (ENDIAN == little_endian)
#else // _ENDIANESS_
if (ENDIAN == big_endian)
#endif // _ENDIANESS_
std::reverse(reinterpret_cast<uint8*>(&endian_value),reinterpret_cast<uint8*>(&endian_value+1));
}
inline void process_platform()
{
platform_value = endian_value;
#ifdef WORDS_BIGENDIAN
if (ENDIAN == little_endian)
#else // _ENDIANESS_
if (ENDIAN == big_endian)
#endif // _ENDIANESS_
std::reverse(reinterpret_cast<uint8*>(&platform_value),reinterpret_cast<uint8*>(&platform_value+1));
}
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_ENDIAN_H

View File

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

View File

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

View File

@@ -1,99 +1,99 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlId.h 936 2004-11-10 20:46:28Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_ID_H
#define LIBEBML_ID_H
#include "EbmlTypes.h"
START_LIBEBML_NAMESPACE
#if defined(EBML_STRICT_API)
#define EBML_ID_VALUE(id) (id).GetValue()
#define EBML_ID_LENGTH(id) (id).GetLength()
#else
#define EBML_ID_VALUE(id) (id).Value
#define EBML_ID_LENGTH(id) (id).Length
#endif
/*!
\class EbmlId
*/
class EBML_DLL_API EbmlId {
public:
EbmlId(const binary aValue[4], const unsigned int aLength)
:Length(aLength)
{
Value = 0;
unsigned int i;
for (i=0; i<aLength; i++) {
Value <<= 8;
Value += aValue[i];
}
}
EbmlId(const uint32 aValue, const unsigned int aLength)
:Value(aValue), Length(aLength) {}
inline bool operator==(const EbmlId & TestId) const
{
return ((TestId.Length == Length) && (TestId.Value == Value));
}
inline bool operator!=(const EbmlId & TestId) const
{
return !(*this == TestId);
}
inline void Fill(binary * Buffer) const {
unsigned int i;
for (i = 0; i<Length; i++) {
Buffer[i] = (Value >> (8*(Length-i-1))) & 0xFF;
}
}
inline size_t GetLength() const { return Length; }
inline uint32 GetValue() const { return Value; }
#if defined(EBML_STRICT_API)
private:
#endif
uint32 Value;
size_t Length;
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_ID_H
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlId.h 936 2004-11-10 20:46:28Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_ID_H
#define LIBEBML_ID_H
#include "EbmlTypes.h"
START_LIBEBML_NAMESPACE
#if defined(EBML_STRICT_API)
#define EBML_ID_VALUE(id) (id).GetValue()
#define EBML_ID_LENGTH(id) (id).GetLength()
#else
#define EBML_ID_VALUE(id) (id).Value
#define EBML_ID_LENGTH(id) (id).Length
#endif
/*!
\class EbmlId
*/
class EBML_DLL_API EbmlId {
public:
EbmlId(const binary aValue[4], const unsigned int aLength)
:Length(aLength)
{
Value = 0;
unsigned int i;
for (i=0; i<aLength; i++) {
Value <<= 8;
Value += aValue[i];
}
}
EbmlId(const uint32 aValue, const unsigned int aLength)
:Value(aValue), Length(aLength) {}
inline bool operator==(const EbmlId & TestId) const
{
return ((TestId.Length == Length) && (TestId.Value == Value));
}
inline bool operator!=(const EbmlId & TestId) const
{
return !(*this == TestId);
}
inline void Fill(binary * Buffer) const {
unsigned int i;
for (i = 0; i<Length; i++) {
Buffer[i] = (Value >> (8*(Length-i-1))) & 0xFF;
}
}
inline size_t GetLength() const { return Length; }
inline uint32 GetValue() const { return Value; }
#if defined(EBML_STRICT_API)
private:
#endif
uint32 Value;
size_t Length;
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_ID_H

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,97 +1,97 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlSubHead.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_SUBHEAD_H
#define LIBEBML_SUBHEAD_H
#include <string>
#include "EbmlUInteger.h"
#include "EbmlString.h"
START_LIBEBML_NAMESPACE
DECLARE_EBML_UINTEGER(EVersion)
public:
EVersion(const EVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EVersion)
};
DECLARE_EBML_UINTEGER(EReadVersion)
public:
EReadVersion(const EReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EReadVersion)
};
DECLARE_EBML_UINTEGER(EMaxIdLength)
public:
EMaxIdLength(const EMaxIdLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EMaxIdLength)
};
DECLARE_EBML_UINTEGER(EMaxSizeLength)
public:
EMaxSizeLength(const EMaxSizeLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EMaxSizeLength)
};
DECLARE_EBML_STRING(EDocType)
public:
EDocType(const EDocType & ElementToClone) : EbmlString(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocType)
};
DECLARE_EBML_UINTEGER(EDocTypeVersion)
public:
EDocTypeVersion(const EDocTypeVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocTypeVersion)
};
DECLARE_EBML_UINTEGER(EDocTypeReadVersion)
public:
EDocTypeReadVersion(const EDocTypeReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocTypeReadVersion)
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_SUBHEAD_H
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlSubHead.h 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_SUBHEAD_H
#define LIBEBML_SUBHEAD_H
#include <string>
#include "EbmlUInteger.h"
#include "EbmlString.h"
START_LIBEBML_NAMESPACE
DECLARE_EBML_UINTEGER(EVersion)
public:
EVersion(const EVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EVersion)
};
DECLARE_EBML_UINTEGER(EReadVersion)
public:
EReadVersion(const EReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EReadVersion)
};
DECLARE_EBML_UINTEGER(EMaxIdLength)
public:
EMaxIdLength(const EMaxIdLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EMaxIdLength)
};
DECLARE_EBML_UINTEGER(EMaxSizeLength)
public:
EMaxSizeLength(const EMaxSizeLength & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EMaxSizeLength)
};
DECLARE_EBML_STRING(EDocType)
public:
EDocType(const EDocType & ElementToClone) : EbmlString(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocType)
};
DECLARE_EBML_UINTEGER(EDocTypeVersion)
public:
EDocTypeVersion(const EDocTypeVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocTypeVersion)
};
DECLARE_EBML_UINTEGER(EDocTypeReadVersion)
public:
EDocTypeReadVersion(const EDocTypeReadVersion & ElementToClone) : EbmlUInteger(ElementToClone) {}
EBML_CONCRETE_CLASS(EDocTypeReadVersion)
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_SUBHEAD_H

View File

@@ -1,72 +1,72 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2004 Steve Lhomme. All rights reserved.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlTypes.h 639 2004-07-09 20:59:14Z mosu $
*/
#ifndef LIBEBML_TYPES_H
#define LIBEBML_TYPES_H
#include "ebml/c/libebml_t.h"
#include "ebml/EbmlConfig.h"
#include "EbmlEndian.h" // binary needs to be defined
START_LIBEBML_NAMESPACE
typedef wchar_t utf16;
typedef uint32 utf32;
typedef char utf8;
typedef binary bits80[10];
typedef Endian<int16,little_endian> lil_int16;
typedef Endian<int32,little_endian> lil_int32;
typedef Endian<int64,little_endian> lil_int64;
typedef Endian<uint16,little_endian> lil_uint16;
typedef Endian<uint32,little_endian> lil_uint32;
typedef Endian<uint64,little_endian> lil_uint64;
typedef Endian<int16,big_endian> big_int16;
typedef Endian<int32,big_endian> big_int32;
typedef Endian<int64,big_endian> big_int64;
typedef Endian<uint16,big_endian> big_uint16;
typedef Endian<uint32,big_endian> big_uint32;
typedef Endian<uint64,big_endian> big_uint64;
typedef Endian<uint32,big_endian> checksum;
typedef Endian<bits80,big_endian> big_80bits;
enum ScopeMode {
SCOPE_PARTIAL_DATA = 0,
SCOPE_ALL_DATA,
SCOPE_NO_DATA
};
END_LIBEBML_NAMESPACE
#endif
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2004 Steve Lhomme. All rights reserved.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlTypes.h 639 2004-07-09 20:59:14Z mosu $
*/
#ifndef LIBEBML_TYPES_H
#define LIBEBML_TYPES_H
#include "ebml/c/libebml_t.h"
#include "ebml/EbmlConfig.h"
#include "EbmlEndian.h" // binary needs to be defined
START_LIBEBML_NAMESPACE
typedef wchar_t utf16;
typedef uint32 utf32;
typedef char utf8;
typedef binary bits80[10];
typedef Endian<int16,little_endian> lil_int16;
typedef Endian<int32,little_endian> lil_int32;
typedef Endian<int64,little_endian> lil_int64;
typedef Endian<uint16,little_endian> lil_uint16;
typedef Endian<uint32,little_endian> lil_uint32;
typedef Endian<uint64,little_endian> lil_uint64;
typedef Endian<int16,big_endian> big_int16;
typedef Endian<int32,big_endian> big_int32;
typedef Endian<int64,big_endian> big_int64;
typedef Endian<uint16,big_endian> big_uint16;
typedef Endian<uint32,big_endian> big_uint32;
typedef Endian<uint64,big_endian> big_uint64;
typedef Endian<uint32,big_endian> checksum;
typedef Endian<bits80,big_endian> big_80bits;
enum ScopeMode {
SCOPE_PARTIAL_DATA = 0,
SCOPE_ALL_DATA,
SCOPE_NO_DATA
};
END_LIBEBML_NAMESPACE
#endif

View File

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

View File

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

View File

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

View File

@@ -1,73 +1,73 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlVoid.h 1079 2005-03-03 13:18:14Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_VOID_H
#define LIBEBML_VOID_H
#include "EbmlTypes.h"
#include "EbmlBinary.h"
START_LIBEBML_NAMESPACE
DECLARE_EBML_BINARY(EbmlVoid)
public:
EbmlVoid(const EbmlVoid & ElementToClone) :EbmlBinary(ElementToClone){}
/*!
\brief Set the size of the data (not the complete size of the element)
*/
void SetSize(uint64 aSize) {SetSize_(aSize);}
/*!
\note overwrite to write fake data
*/
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
/*!
\brief Replace the void element content (written) with this one
*/
uint64 ReplaceWith(EbmlElement & EltToReplaceWith, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
/*!
\brief Void the content of an element
*/
uint64 Overwrite(const EbmlElement & EltToVoid, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
EBML_CONCRETE_CLASS(EbmlVoid)
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_VOID_H
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlVoid.h 1079 2005-03-03 13:18:14Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#ifndef LIBEBML_VOID_H
#define LIBEBML_VOID_H
#include "EbmlTypes.h"
#include "EbmlBinary.h"
START_LIBEBML_NAMESPACE
DECLARE_EBML_BINARY(EbmlVoid)
public:
EbmlVoid(const EbmlVoid & ElementToClone) :EbmlBinary(ElementToClone){}
/*!
\brief Set the size of the data (not the complete size of the element)
*/
void SetSize(uint64 aSize) {SetSize_(aSize);}
/*!
\note overwrite to write fake data
*/
filepos_t RenderData(IOCallback & output, bool bForceRender, bool bWithDefault = false);
/*!
\brief Replace the void element content (written) with this one
*/
uint64 ReplaceWith(EbmlElement & EltToReplaceWith, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
/*!
\brief Void the content of an element
*/
uint64 Overwrite(const EbmlElement & EltToVoid, IOCallback & output, bool ComeBackAfterward = true, bool bWithDefault = false);
EBML_CONCRETE_CLASS(EbmlVoid)
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_VOID_H

View File

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

View File

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

66
ebml/MemReadIOCallback.h Normal file
View File

@@ -0,0 +1,66 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2014 Moritz Bunkus. All rights reserved.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\author Moritz Bunkus <moritz@bunkus.org>
*/
#ifndef LIBEBML_MEMREADIOCALLBACK_H
#define LIBEBML_MEMREADIOCALLBACK_H
#include "IOCallback.h"
START_LIBEBML_NAMESPACE
class EBML_DLL_API EbmlBinary;
class EBML_DLL_API MemReadIOCallback : public IOCallback {
protected:
uint8 const *mStart, *mEnd, *mPtr;
public:
MemReadIOCallback(void const *Ptr, size_t Size);
MemReadIOCallback(EbmlBinary const &Binary);
MemReadIOCallback(MemReadIOCallback const &Mem);
virtual ~MemReadIOCallback();
uint32 read(void *Buffer, size_t Size);
void setFilePointer(int64 Offset, seek_mode Mode = seek_beginning);
size_t write(void const *, size_t) { return 0; }
virtual uint64 getFilePointer() { return mPtr - mStart; }
void close() {}
binary const *GetDataBuffer() const { return mPtr; }
uint64 GetDataBufferSize() const { return mEnd - mStart; }
protected:
void Init(void const *Ptr, size_t Size);
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_MEMREADIOCALLBACK_H

91
ebml/SafeReadIOCallback.h Normal file
View File

@@ -0,0 +1,91 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2014 Moritz Bunkus. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id$
\author Moritz Bunkus <moritz@bunkus.org>
*/
#ifndef LIBEBML_SAFEREADIOCALLBACK_H
#define LIBEBML_SAFEREADIOCALLBACK_H
#include "EbmlTypes.h"
START_LIBEBML_NAMESPACE
class EBML_DLL_API IOCallback;
class EBML_DLL_API EbmlBinary;
class EBML_DLL_API SafeReadIOCallback {
public:
class EndOfStreamX {
public:
size_t mMissingBytes;
EndOfStreamX(std::size_t MissingBytes);
};
private:
IOCallback *mIO;
bool mDeleteIO;
size_t mSize;
public:
SafeReadIOCallback(IOCallback *IO, bool DeleteIO);
SafeReadIOCallback(void const *Mem, size_t Size);
SafeReadIOCallback(EbmlBinary const &Binary);
~SafeReadIOCallback();
size_t GetPosition() const;
size_t GetSize() const;
size_t GetRemainingBytes() const;
bool IsEmpty() const;
uint8 GetUInt8();
uint64 GetUIntBE(size_t NumBytes);
uint16 GetUInt16BE();
uint32 GetUInt24BE();
uint32 GetUInt32BE();
uint64 GetUInt64BE();
void Read(void *Dst, size_t Count);
void Skip(size_t Count);
void Seek(size_t Position);
private:
SafeReadIOCallback(SafeReadIOCallback const &) { }
protected:
void Init(IOCallback *IO, bool DeleteIO);
};
END_LIBEBML_NAMESPACE
#endif // LIBEBML_SAFEREADIOCALLBACK_H

View File

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

View File

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

10
libebml.pc.in Normal file
View File

@@ -0,0 +1,10 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: libebml
Description: Library for parsing EBML data structures
Version: @PACKAGE_VERSION@
Libs: -L${libdir} -lebml
Cflags: -I${includedir}

View File

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

2
m4/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/libtool.m4
/lt*.m4

View File

@@ -1,149 +0,0 @@
# libebml Makefile
# $Id: Makefile,v 1.8 2004/05/11 20:27:38 mosu Exp $
# Author: Steve Lhomme <robux4 @ users.sf.net>
# Author: Moritz Bunkus <moritz @ bunkus.org>
#
# The library is built without debug information. If you want
# debug information to be included then compile with
# 'make DEBUG=yes'.
#
# Paths
# BeOS wants the libs and headers in /boot/home/config
ifeq (BeOS,$(shell uname -s))
prefix=/boot/home/config
else
prefix=/usr/local
endif
libdir=$(prefix)/lib
includedir=$(prefix)/include/ebml
# Programs
CROSS =
CXX = $(CROSS)g++
LD = $(CXX)
AR = $(CROSS)ar
RANLIB = $(CROSS)ranlib
INSTALL = install
INSTALL_OPTS = -m 644
INSTALL_OPTS_LIB = -m 644
INSTALL_DIR_OPTS = -m 755
# Options
EXTENSION=.cpp
ifeq (yes,$(DEBUG))
DEBUGFLAGS=-g -DDEBUG
endif
CWD=$(shell pwd)
SRC_DIR=$(CWD)/../../src/
INCLUDE_DIR=$(CWD)/../../ebml
# Librarires
INCLUDE=-I$(CWD)/../..
LIBS=
# Names
LIBRARY=libebml.a
LIBRARY_SO=libebml.so
LIBRARY_SO_VER=libebml.so.4
# source-files
sources:=$(wildcard ${SRC_DIR}*$(EXTENSION))
# header files; replace .cxx extension with .h
headers:=$(patsubst %$(EXTENSION),%.h,$(sources))
# object files; replace .cxx extension with .o
objects:=$(patsubst %$(EXTENSION),%.o,$(sources))
objects_so:=$(patsubst %$(EXTENSION),%.lo,$(sources))
WARNINGFLAGS=-Wall -Wextra -Wno-unknown-pragmas -ansi -fno-gnu-keywords -Wshadow
COMPILEFLAGS=$(WARNINGFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(DEBUGFLAGS) $(INCLUDE)
DEPENDFLAGS = $(CXXFLAGS) $(INCLUDE)
ifeq (Darwin,$(shell uname -s))
all: staticlib
else
all: staticlib sharedlib
endif
staticlib: $(LIBRARY)
sharedlib: $(LIBRARY_SO)
lib:
@echo "Use the 'staticlib', 'sharedlib' or 'all' targets."
@false
# Build rules
%.o: %$(EXTENSION)
$(CXX) -c $(COMPILEFLAGS) -o $@ $<
%.lo: %$(EXTENSION)
$(CXX) -c $(COMPILEFLAGS) -fPIC -o $@ $<
$(LIBRARY): $(objects)
$(AR) rcvu $@ $(objects)
$(RANLIB) $@
$(LIBRARY_SO): $(objects_so)
$(CXX) -shared -Wl,-soname,$(LIBRARY_SO_VER) -o $(LIBRARY_SO_VER) $(objects_so)
rm -f $(LIBRARY_SO)
ln -s $(LIBRARY_SO_VER) $(LIBRARY_SO)
clean:
rm -f $(objects) $(objects_so)
rm -f $(LIBRARY)
rm -f $(LIBRARY_SO)
rm -f $(LIBRARY_SO_VER)
rm -f CORE
distclean dist-clean: clean
rm -f .depend
depend:
@echo Calculating dependecies:
@rm -f .depend
@touch .depend
@for i in $(sources); do \
o="`echo $$i | sed -e 's/\.c$$/.o/' -e 's/\.cpp$$/.o/'`" ; \
echo ' ' $$i: $$o ; \
$(CXX) $(DEPENDFLAGS) -MM -MT $$o $$i >> .depend ; \
done
ifeq (Darwin,$(shell uname -s))
install: install_staticlib install_headers
else
install: install_staticlib install_sharedlib install_headers
endif
install_headers:
$(INSTALL) $(INSTALL_DIR_OPTS) -d $(includedir)
for i in $(INCLUDE_DIR)/*.h; do \
$(INSTALL) $(INSTALL_OPTS) $$i $(includedir) ; \
done
$(INSTALL) $(INSTALL_DIR_OPTS) -d $(includedir)/c
for i in $(INCLUDE_DIR)/c/*.h; do \
$(INSTALL) $(INSTALL_OPTS) $$i $(includedir)/c ; \
done
install_staticlib: $(LIBRARY)
$(INSTALL) $(INSTALL_DIR_OPTS) -d $(libdir)
$(INSTALL) $(INSTALL_OPTS_LIB) $(LIBRARY) $(libdir)
install_sharedlib: $(LIBRARY_SO)
$(INSTALL) $(INSTALL_DIR_OPTS) -d $(libdir)
$(INSTALL) $(INSTALL_OPTS_LIB) $(LIBRARY_SO_VER) $(libdir)
ln -fs $(LIBRARY_SO_VER) $(libdir)/$(LIBRARY_SO)
ifneq ($(wildcard .depend),)
include .depend
endif
# DO NOT DELETE

View File

@@ -1,67 +0,0 @@
# SPEC file for libebml on (at least) Fedora Core 1, 2, 3
Name: libebml
Version: 1.3.0
Release: 1
License: LGPL
Summary: Extensible Binary Meta Language
Group: System Environment/Libraries
URL: http://ebml.sourceforge.net/
Vendor: Moritz Bunkus <moritz@bunkus.org>
Source: http://dl.matroska.org/downloads/%{name}/%{name}-%{version}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-root
%description
EBML was designed to be a simplified binary extension of XML for
the purpose of storing and manipulating data in a hierarchical
form with variable field lengths.
It uses the same paradigms as XML files, ie syntax and semantic
are separated. So a generic EBML library could read any format
based on it. The interpretation of data is up to a specific
application that knows how each elements (equivalent of XML tag)
has to be handled.
%package devel
Summary: Extensible Binary Meta Language headers/development files
Group: Development/Libraries
%description devel
EBML was designed to be a simplified binary extension of XML for
the purpose of storing and manipulating data in a hierarchical
form with variable field lengths.
It uses the same paradigms as XML files, ie syntax and semantic
are separated. So a generic EBML library could read any format
based on it. The interpretation of data is up to a specific
application that knows how each elements (equivalent of XML tag)
has to be handled.
%prep
%setup -q
%build
cd make/linux
CFLAGS="$RPM_OPT_FLAGS" \
make \
prefix="%{_prefix}" staticlib
cd ../..
%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
cd make/linux
make prefix=$RPM_BUILD_ROOT/%{_prefix} libdir=$RPM_BUILD_ROOT/%{_libdir} install_staticlib install_headers
cd ../..
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
%files devel
%defattr(-, root, root)
%{_includedir}/ebml/*.h
%{_includedir}/ebml/c/*.h
%{_libdir}/libebml.a
%changelog
* Sat Apr 16 2005 Moritz Bunkus <moritz@bunkus.org>
- updated for the new libebml build targets
* Fri May 15 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
- create spec file

View File

@@ -1,69 +0,0 @@
#
# spec file for package libebml for (at least) SuSE Linux 9.0, 9.1
#
# Copyright (c) 2004 SUSE LINUX AG, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
# Please submit bugfixes or comments via http://www.suse.de/feedback/
#
# neededforbuild gcc-c++ libstdc++-devel
BuildRequires: bzip2 cpp make tar zlib zlib-devel binutils gcc gcc-c++ libstdc++-devel perl rpm
Name: libebml
URL: http://sourceforge.net/projects/ebml
Version: 1.3.0
Release: 1
Summary: libary to parse EBML files.
License: LGPL
Group: Development/Libraries/Other
Source: %{name}-%{version}.tar.bz2
Summary: libary to parse EBML files.
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Prefix: /usr
%description
libebml is a C++ libary to parse EBML files. See the EBML RFV at
http://www.matroska.org/technical/specs/rfc/
Authors:
--------
Steve Lhomme <steve.lhomme@free.fr>
Moritz Bunkus <moritz@bunkus.org>
%prep
rm -rf $RPM_BUILD_ROOT
%setup
%build
export CFLAGS="$RPM_OPT_FLAGS"
cd make/linux
make prefix=$RPM_BUILD_ROOT/usr libdir=$RPM_BUILD_ROOT/%{_libdir} staticlib
%install
cd make/linux
make prefix=$RPM_BUILD_ROOT/usr libdir=$RPM_BUILD_ROOT/%{_libdir} install_staticlib install_headers
%clean
rm -rf $RPM_BUILD_ROOT
%post
%run_ldconfig
%postun
%run_ldconfig
%files
%defattr (-,root,root)
%{_libdir}/libebml.a
/usr/include/ebml
%changelog -n libebml
* Sat Apr 16 2005 - moritz@bunkus.org
- modified for the new libebml build targets
* Wed Sep 01 2004 - seife@suse.de
- initial submission

View File

@@ -1,74 +0,0 @@
# Project: libebml
# Makefile created by Dev-C++ 4.9.7.0
# Normally libebml is built as a static library.
# Uncomment this if you want a shared library instead.
# ATTENTION: If your app uses this DLL you have to define EBML_DLL !
SHARED = yes
# Compile with debug information?
#DEBUG = yes
#
# Don't change anything below this line.
#
ifeq (yes,$(DEBUG))
DEBUGFLAGS=-g -DDEBUG
endif
CROSS =
CXX = $(CROSS)g++
CC = $(CROSS)gcc
WINDRES = $(CROSS)windres
RANLIB = $(CROSS)ranlib
AR = $(CROSS)ar
RES =
SRC = $(wildcard ../../src/*.cpp)
OBJ = $(patsubst %.cpp,%.o,$(SRC))
ifeq (yes,$(SHARED))
LIBS = libebml.dll
DLLFLAGS = -DEBML_DLL -DEBML_DLL_EXPORT
else
LIBS = libebml.a
endif
INCS = -I"$(shell pwd)/../.."
COMPILEFLAGS = $(DEBUGFLAGS) $(INCS) $(DLLFLAGS) $(CXXFLAGS)
.PHONY: all all-before all-after clean clean-custom
.cpp.o:
$(CXX) $(COMPILEFLAGS) -c -o $@ $<
all: lib
lib: $(LIBS)
clean:
rm -f $(OBJ) libebml.a libebml.dll libebml.dll.a
distclean dist-clean: clean
rm -f .depend
libebml.a: $(OBJ)
$(AR) rcvu $@ $(OBJ)
$(RANLIB) $@
libebml.dll: $(OBJ)
$(CXX) -shared -Wl,--export-all -Wl,--out-implib=$@.a -o $@ $(OBJ)
depend:
@echo Calculating dependecies:
@rm -f .depend
@touch .depend
@for i in $(SRC); do \
o="`echo $$i | sed -e 's/\.c$$/.o/' -e 's/\.cpp$$/.o/'`" ; \
echo ' ' $$i: $$o ; \
$(CXX) $(CXXFLAGS) -MM -MT $$o $$i >> .depend ; \
done
#
# include dependency files if they exist
#
ifneq ($(wildcard .depend),)
include .depend
endif

View File

@@ -1,390 +0,0 @@
[Project]
FileName=libebml.dev
Name=libebml
UnitCount=43
Type=2
Ver=1
ObjFiles=
Includes=
Libs=
PrivateResource=
ResourceIncludes=
MakeIncludes=
Resources=
Compiler=
Linker=
IsCpp=1
Icon=
ExeOutput=
ObjectOutput=
OverrideOutput=0
OverrideOutputName=
HostApplication=
Folders=
CommandLine=
IncludeVersionInfo=0
SupportXPThemes=0
CompilerSet=0
CompilerSettings=
[Unit1]
FileName=..\..\src\StdIOCallback.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit2]
FileName=..\..\src\Debug.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit3]
FileName=..\..\src\EbmlBinary.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit4]
FileName=..\..\src\EbmlBinary.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit5]
FileName=..\..\src\EbmlConfig.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit6]
FileName=..\..\src\EbmlContexts.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit7]
FileName=..\..\src\EbmlContexts.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit8]
FileName=..\..\src\EbmlCrc32.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit9]
FileName=..\..\src\EbmlCrc32.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit10]
FileName=..\..\src\EbmlDate.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit11]
FileName=..\..\src\EbmlDate.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit12]
FileName=..\..\src\EbmlElement.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit13]
FileName=..\..\src\EbmlElement.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit14]
FileName=..\..\src\EbmlEndian.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit15]
FileName=..\..\src\EbmlFloat.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit16]
FileName=..\..\src\EbmlFloat.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit17]
FileName=..\..\src\EbmlHead.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit18]
FileName=..\..\src\EbmlHead.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit19]
FileName=..\..\src\EbmlId.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit20]
FileName=..\..\src\EbmlMaster.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit21]
FileName=..\..\src\EbmlMaster.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit22]
FileName=..\..\src\EbmlSInteger.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit23]
FileName=..\..\src\EbmlSInteger.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit24]
FileName=..\..\src\EbmlStream.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit25]
FileName=..\..\src\EbmlStream.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit26]
FileName=..\..\src\EbmlString.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit27]
FileName=..\..\src\EbmlString.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit28]
FileName=..\..\src\EbmlSubHead.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit29]
FileName=..\..\src\EbmlSubHead.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit30]
FileName=..\..\src\EbmlTypes.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit31]
FileName=..\..\src\EbmlUInteger.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit32]
FileName=..\..\src\EbmlUInteger.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit33]
FileName=..\..\src\EbmlUnicodeString.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit34]
FileName=..\..\src\EbmlUnicodeString.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit35]
FileName=..\..\src\EbmlVersion.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit36]
FileName=..\..\src\EbmlVersion.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit37]
FileName=..\..\src\EbmlVoid.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit38]
FileName=..\..\src\EbmlVoid.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit39]
FileName=..\..\src\IOCallback.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit40]
FileName=..\..\src\IOCallback.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit41]
FileName=..\..\src\StdInclude.h
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit42]
FileName=..\..\src\StdIOCallback.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[Unit43]
FileName=..\..\src\Debug.cpp
Folder=libebml
Compile=1
CompileCpp=1
OverrideBuildCmd=0
BuildCmd=
[VersionInfo]
Major=0
Minor=1
Release=1
Build=1
LanguageID=1033
CharsetID=1252
CompanyName=
FileVersion=
FileDescription=Developed using the Dev-C++ IDE
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=

View File

@@ -1,276 +0,0 @@
# Microsoft Developer Studio Project File - Name="libebml" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=libebml - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "libebml.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "libebml.mak" CFG="libebml - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "libebml - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "libebml - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "libebml - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../../.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "WRITE_EVEN_UNSET_DATA" /YX /FD /c
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x809 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "libebml - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GR /GX /ZI /Od /I "../../../.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "WRITE_EVEN_UNSET_DATA" /YX /FD /GZ /c
# ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x809 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "libebml - Win32 Release"
# Name "libebml - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\..\..\..\src\Debug.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlBinary.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlContexts.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlCrc32.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlDate.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlDummy.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlElement.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlFloat.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlHead.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlMaster.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlSInteger.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlStream.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlString.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlSubHead.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlUInteger.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlUnicodeString.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlVersion.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\EbmlVoid.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\IOCallback.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\MemIOCallback.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\StdIOCallback.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\..\..\..\ebml\Debug.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlBinary.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlConfig.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlContexts.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlCrc32.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlDate.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlDummy.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlElement.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlEndian.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlFloat.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlHead.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlId.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlMaster.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlSInteger.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlStream.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlString.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlSubHead.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlTypes.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlUInteger.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlUnicodeString.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlVersion.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\EbmlVoid.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\IOCallback.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\MemIOCallback.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\ebml\StdIOCallback.h
# End Source File
# End Group
# End Target
# End Project

View File

@@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "libebml"=".\lib\static\libebml.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@@ -1,57 +0,0 @@
# Project: libebml
# Makefile to use the Free Visual C++ 2003 compiler from Microsoft with GNU Make
# Compile with debug information?
#DEBUG = yes
#
# Don't change anything below this line.
#
CXX = cl /Tp
CC = cl /Tc
SRC = $(wildcard ../../src/*.cpp)
OBJ = $(patsubst %.cpp,%.obj,$(SRC))
INCS = /I../..
LDFLAGS = /NOLOGO /DLL /MAP:libebml.map /VERSION:0.7
OPTMIZ = /G6 /O2 /Oi /Wp64 /GL
CXXFLAGS = $(INCS) /DWIN32 /nologo /DEBML_DLL /DEBML_DLL_EXPORT
ifeq (yes,$(DEBUG))
CXXFLAGS += /Zi /DDEBUG /D_DEBUG /MTd /RTC1
LDFLAGS += /DEBUG
else
CXXFLAGS += /MT
LDFLAGS += /OPT:REF
endif
LIBS = libebml.dll
.PHONY: all all-before all-after clean clean-custom
%.obj : %.cpp
$(CXX) $< /c $(CXXFLAGS) /Fo$@
all: lib
lib: $(LIBS)
clean:
$(RM) $(OBJ) libebml.lib libebml.dll
libebml.lib: $(OBJ)
lib /OUT:$@ /NODEFAULTLIB $(OBJ)
libebml.dll: $(OBJ)
link $(LDFLAGS) /OUT:$@ $(OBJ) user32.lib
depend:
$(CXX) $(CXXFLAGS) -MM $(SRC) > .depend
#
# include dependency files if they exist
#
ifneq ($(wildcard .depend),)
include .depend
endif

View File

@@ -1,271 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="libebmldll"
ProjectGUID="{83136D19-2749-4640-AC38-33E0B1F0DCC2}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EBML_DLL;EBML_DLL_EXPORT"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/libebml.dll"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/libebml.pdb"
SubSystem="2"
ImportLibrary="$(OutDir)/libebml.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\..\"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EBML_DLL;EBML_DLL_EXPORT"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/libebml.dll"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/libebml.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath="..\..\..\src\Debug.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlBinary.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlContexts.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlCrc32.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlDate.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlDummy.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlElement.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlFloat.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlHead.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlMaster.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlSInteger.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlStream.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlString.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlSubHead.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlUInteger.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlUnicodeString.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlVersion.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlVoid.cpp">
</File>
<File
RelativePath="..\..\..\src\IOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\MemIOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\StdIOCallback.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath="..\..\..\ebml\Debug.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlBinary.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlConfig.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlContexts.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlCrc32.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlDate.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlDummy.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlElement.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlEndian.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlFloat.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlHead.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlId.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlMaster.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlSInteger.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlStream.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlString.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlSubHead.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlTypes.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlUInteger.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlUnicodeString.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlVersion.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlVoid.h">
</File>
<File
RelativePath="..\..\..\ebml\IOCallback.h">
</File>
<File
RelativePath="..\..\..\ebml\MemIOCallback.h">
</File>
<File
RelativePath="..\..\..\ebml\StdIOCallback.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -1,276 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="libebml"
ProjectGUID="{168C0F0D-9975-4D24-885C-87A9B018617E}"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\..\"
PreprocessorDefinitions="WIN32,NDEBUG,_LIB,WRITE_EVEN_UNSET_DATA"
StringPooling="TRUE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Release/libebml.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Release\libebml.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="2057"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\"
PreprocessorDefinitions="WIN32,_DEBUG,_LIB,WRITE_EVEN_UNSET_DATA"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Debug/libebml.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
ProgramDataBaseFileName=".\Debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Debug\libebml.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="2057"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\..\..\src\Debug.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlBinary.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlContexts.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlCrc32.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlDate.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlDummy.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlElement.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlFloat.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlHead.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlMaster.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlSInteger.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlStream.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlString.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlSubHead.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlUInteger.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlUnicodeString.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlVersion.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlVoid.cpp">
</File>
<File
RelativePath="..\..\..\src\IOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\MemIOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\StdIOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\platform\win32\WinIOCallback.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
<File
RelativePath="..\..\..\ebml\Debug.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlBinary.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlConfig.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlContexts.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlCrc32.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlDate.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlDummy.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlElement.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlEndian.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlFloat.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlHead.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlId.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlMaster.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlSInteger.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlStream.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlString.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlSubHead.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlTypes.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlUInteger.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlUnicodeString.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlVersion.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlVoid.h">
</File>
<File
RelativePath="..\..\..\ebml\IOCallback.h">
</File>
<File
RelativePath="..\..\..\ebml\MemIOCallback.h">
</File>
<File
RelativePath="..\..\..\ebml\StdInclude.h">
</File>
<File
RelativePath="..\..\..\ebml\StdIOCallback.h">
</File>
<File
RelativePath="..\..\..\src\platform\win32\WinIOCallback.h">
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -1,262 +0,0 @@
<?xml version="1.0" encoding = "Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.00"
Name="libebml"
ProjectGUID="{168C0F0D-9975-4D24-885C-87A9B018617E}"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\..\"
PreprocessorDefinitions="WIN32,NDEBUG,_LIB,WRITE_EVEN_UNSET_DATA"
StringPooling="TRUE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Release/libebml.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Release\libebml.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="2057"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
</Configuration>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\"
PreprocessorDefinitions="WIN32,_DEBUG,_LIB,WRITE_EVEN_UNSET_DATA"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Debug/libebml.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
ProgramDataBaseFileName=".\Debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Debug\libebml.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="2057"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
</Configuration>
</Configurations>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\..\..\src\Debug.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlBinary.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlContexts.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlCrc32.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlDate.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlDummy.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlElement.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlFloat.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlHead.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlMaster.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlSInteger.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlStream.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlString.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlSubHead.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlUInteger.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlUnicodeString.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlVersion.cpp">
</File>
<File
RelativePath="..\..\..\src\EbmlVoid.cpp">
</File>
<File
RelativePath="..\..\..\src\IOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\MemIOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\StdIOCallback.cpp">
</File>
<File
RelativePath="..\..\..\src\platform\win32\WinIOCallback.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
<File
RelativePath="..\..\..\ebml\Debug.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlBinary.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlConfig.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlContexts.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlCrc32.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlDate.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlDummy.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlElement.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlEndian.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlFloat.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlHead.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlId.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlMaster.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlSInteger.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlStream.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlString.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlSubHead.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlTypes.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlUInteger.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlUnicodeString.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlVersion.h">
</File>
<File
RelativePath="..\..\..\ebml\EbmlVoid.h">
</File>
<File
RelativePath="..\..\..\ebml\IOCallback.h">
</File>
<File
RelativePath="..\..\..\ebml\MemIOCallback.h">
</File>
<File
RelativePath="..\..\..\ebml\StdInclude.h">
</File>
<File
RelativePath="..\..\..\ebml\StdIOCallback.h">
</File>
<File
RelativePath="..\..\..\src\platform\win32\WinIOCallback.h">
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

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

View File

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

View File

@@ -1,57 +1,57 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlContexts.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlContexts.h"
#include "ebml/EbmlCrc32.h"
#include "ebml/EbmlVoid.h"
START_LIBEBML_NAMESPACE
static const EbmlSemantic EbmlGlobal_ContextList[2] =
{
EbmlSemantic(false, false, EBML_INFO(EbmlCrc32)), ///< EbmlCrc32
EbmlSemantic(false, false, EBML_INFO(EbmlVoid)), ///< EbmlVoid
};
const EbmlSemanticContext Context_EbmlGlobal = EbmlSemanticContext(0, NULL, NULL, *GetEbmlGlobal_Context, NULL);
static const EbmlSemanticContext EbmlGlobal_Context = EbmlSemanticContext(countof(EbmlGlobal_ContextList), EbmlGlobal_ContextList, NULL, *GetEbmlGlobal_Context, NULL);
const EbmlSemanticContext & GetEbmlGlobal_Context()
{
return EbmlGlobal_Context;
}
END_LIBEBML_NAMESPACE
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlContexts.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlContexts.h"
#include "ebml/EbmlCrc32.h"
#include "ebml/EbmlVoid.h"
START_LIBEBML_NAMESPACE
static const EbmlSemantic EbmlGlobal_ContextList[2] =
{
EbmlSemantic(false, false, EBML_INFO(EbmlCrc32)), ///< EbmlCrc32
EbmlSemantic(false, false, EBML_INFO(EbmlVoid)), ///< EbmlVoid
};
const EbmlSemanticContext Context_EbmlGlobal = EbmlSemanticContext(0, NULL, NULL, *GetEbmlGlobal_Context, NULL);
static const EbmlSemanticContext EbmlGlobal_Context = EbmlSemanticContext(countof(EbmlGlobal_ContextList), EbmlGlobal_ContextList, NULL, *GetEbmlGlobal_Context, NULL);
const EbmlSemanticContext & GetEbmlGlobal_Context()
{
return EbmlGlobal_Context;
}
END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1,58 +1,58 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlHead.cpp 1096 2005-03-17 09:14:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlHead.h"
#include "ebml/EbmlSubHead.h"
#include "ebml/EbmlContexts.h"
START_LIBEBML_NAMESPACE
DEFINE_START_SEMANTIC(EbmlHead)
DEFINE_SEMANTIC_ITEM(true, true, EVersion) ///< EBMLVersion
DEFINE_SEMANTIC_ITEM(true, true, EReadVersion) ///< EBMLReadVersion
DEFINE_SEMANTIC_ITEM(true, true, EMaxIdLength) ///< EBMLMaxIdLength
DEFINE_SEMANTIC_ITEM(true, true, EMaxSizeLength) ///< EBMLMaxSizeLength
DEFINE_SEMANTIC_ITEM(true, true, EDocType) ///< DocType
DEFINE_SEMANTIC_ITEM(true, true, EDocTypeVersion) ///< DocTypeVersion
DEFINE_SEMANTIC_ITEM(true, true, EDocTypeReadVersion) ///< DocTypeReadVersion
DEFINE_END_SEMANTIC(EbmlHead)
DEFINE_EBML_MASTER_ORPHAN(EbmlHead, 0x1A45DFA3, 4, "EBMLHead\0ratamapaga");
EbmlHead::EbmlHead()
:EbmlMaster(EbmlHead_Context)
{}
END_LIBEBML_NAMESPACE
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlHead.cpp 1096 2005-03-17 09:14:52Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlHead.h"
#include "ebml/EbmlSubHead.h"
#include "ebml/EbmlContexts.h"
START_LIBEBML_NAMESPACE
DEFINE_START_SEMANTIC(EbmlHead)
DEFINE_SEMANTIC_ITEM(true, true, EVersion) ///< EBMLVersion
DEFINE_SEMANTIC_ITEM(true, true, EReadVersion) ///< EBMLReadVersion
DEFINE_SEMANTIC_ITEM(true, true, EMaxIdLength) ///< EBMLMaxIdLength
DEFINE_SEMANTIC_ITEM(true, true, EMaxSizeLength) ///< EBMLMaxSizeLength
DEFINE_SEMANTIC_ITEM(true, true, EDocType) ///< DocType
DEFINE_SEMANTIC_ITEM(true, true, EDocTypeVersion) ///< DocTypeVersion
DEFINE_SEMANTIC_ITEM(true, true, EDocTypeReadVersion) ///< DocTypeReadVersion
DEFINE_END_SEMANTIC(EbmlHead)
DEFINE_EBML_MASTER_ORPHAN(EbmlHead, 0x1A45DFA3, 4, "EBMLHead\0ratamapaga");
EbmlHead::EbmlHead()
:EbmlMaster(EbmlHead_Context)
{}
END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,49 +1,49 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlSubHead.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlSubHead.h"
#include "ebml/EbmlContexts.h"
START_LIBEBML_NAMESPACE
DEFINE_EBML_UINTEGER_DEF(EVersion, 0x4286, 2, EbmlHead, "EBMLVersion", 1);
DEFINE_EBML_UINTEGER_DEF(EReadVersion, 0x42F7, 2, EbmlHead, "EBMLReadVersion", 1);
DEFINE_EBML_UINTEGER_DEF(EMaxIdLength, 0x42F2, 2, EbmlHead, "EBMLMaxIdLength", 4);
DEFINE_EBML_UINTEGER_DEF(EMaxSizeLength, 0x42F3, 2, EbmlHead, "EBMLMaxSizeLength", 8);
DEFINE_EBML_STRING_DEF (EDocType, 0x4282, 2, EbmlHead, "EBMLDocType", "matroska");
DEFINE_EBML_UINTEGER_DEF(EDocTypeVersion, 0x4287, 2, EbmlHead, "EBMLDocTypeVersion", 1);
DEFINE_EBML_UINTEGER_DEF(EDocTypeReadVersion, 0x4285, 2, EbmlHead, "EBMLDocTypeReadVersion", 1);
END_LIBEBML_NAMESPACE
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id: EbmlSubHead.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlSubHead.h"
#include "ebml/EbmlContexts.h"
START_LIBEBML_NAMESPACE
DEFINE_EBML_UINTEGER_DEF(EVersion, 0x4286, 2, EbmlHead, "EBMLVersion", 1);
DEFINE_EBML_UINTEGER_DEF(EReadVersion, 0x42F7, 2, EbmlHead, "EBMLReadVersion", 1);
DEFINE_EBML_UINTEGER_DEF(EMaxIdLength, 0x42F2, 2, EbmlHead, "EBMLMaxIdLength", 4);
DEFINE_EBML_UINTEGER_DEF(EMaxSizeLength, 0x42F3, 2, EbmlHead, "EBMLMaxSizeLength", 8);
DEFINE_EBML_STRING_DEF (EDocType, 0x4282, 2, EbmlHead, "EBMLDocType", "matroska");
DEFINE_EBML_UINTEGER_DEF(EDocTypeVersion, 0x4287, 2, EbmlHead, "EBMLDocTypeVersion", 1);
DEFINE_EBML_UINTEGER_DEF(EDocTypeReadVersion, 0x4285, 2, EbmlHead, "EBMLDocTypeReadVersion", 1);
END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

@@ -29,16 +29,16 @@
**********************************************************************/
/*!
\file
\version \$Id: EbmlVersion.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
\file
\version \$Id: EbmlVersion.cpp 639 2004-07-09 20:59:14Z mosu $
\author Steve Lhomme <robux4 @ users.sf.net>
*/
#include "ebml/EbmlVersion.h"
START_LIBEBML_NAMESPACE
const std::string EbmlCodeVersion = "1.3.0";
const std::string EbmlCodeVersion = "1.3.1";
const std::string EbmlCodeDate = __TIMESTAMP__;
END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

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

92
src/MemReadIOCallback.cpp Normal file
View File

@@ -0,0 +1,92 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2014 Moritz Bunkus. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id$
\author Moritz Bunkus <moritz@bunkus.org>
*/
#include <cstring>
#include "ebml/EbmlBinary.h"
#include "ebml/MemReadIOCallback.h"
START_LIBEBML_NAMESPACE
MemReadIOCallback::MemReadIOCallback(void const *Ptr,
size_t Size) {
Init(Ptr, Size);
}
MemReadIOCallback::MemReadIOCallback(EbmlBinary const &Binary) {
Init(Binary.GetBuffer(), Binary.GetSize());
}
MemReadIOCallback::MemReadIOCallback(MemReadIOCallback const &Mem) {
Init(Mem.mPtr, Mem.mEnd - Mem.mPtr);
}
MemReadIOCallback::~MemReadIOCallback() {
}
void
MemReadIOCallback::Init(void const *Ptr,
size_t Size) {
mStart = reinterpret_cast<uint8 const *>(Ptr);
mEnd = mStart + Size;
mPtr = mStart;
}
uint32
MemReadIOCallback::read(void *Buffer,
size_t Size) {
size_t RemainingBytes = mEnd - mPtr;
if (RemainingBytes < Size)
Size = RemainingBytes;
std::memcpy(Buffer, mPtr, Size);
mPtr += Size;
return Size;
}
void
MemReadIOCallback::setFilePointer(int64 Offset,
seek_mode Mode) {
int64 NewPosition = Mode == seek_beginning ? Offset
: Mode == seek_end ? static_cast<int64>(mEnd - mStart) + Offset
: static_cast<int64>(mPtr - mStart) + Offset;
NewPosition = std::min<int64>(std::max<int64>(NewPosition, 0), mEnd - mStart);
mPtr = mStart + NewPosition;
}
END_LIBEBML_NAMESPACE

174
src/SafeReadIOCallback.cpp Normal file
View File

@@ -0,0 +1,174 @@
/****************************************************************************
** libebml : parse EBML files, see http://embl.sourceforge.net/
**
** <file/class description>
**
** Copyright (C) 2002-2014 Moritz Bunkus. All rights reserved.
**
** This file is part of libebml.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
**
** Contact license@matroska.org if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
/*!
\file
\version \$Id$
\author Moritz Bunkus <moritz@bunkus.org>
*/
#include <cstring>
#include "ebml/EbmlBinary.h"
#include "ebml/MemReadIOCallback.h"
#include "ebml/SafeReadIOCallback.h"
START_LIBEBML_NAMESPACE
SafeReadIOCallback::EndOfStreamX::EndOfStreamX(size_t MissingBytes)
: mMissingBytes(MissingBytes)
{
}
// ----------------------------------------------------------------------
SafeReadIOCallback::SafeReadIOCallback(IOCallback *IO,
bool DeleteIO) {
Init(IO, DeleteIO);
}
SafeReadIOCallback::SafeReadIOCallback(void const *Mem,
size_t Size) {
Init(new MemReadIOCallback(Mem, Size), true);
}
SafeReadIOCallback::SafeReadIOCallback(EbmlBinary const &Binary) {
Init(new MemReadIOCallback(Binary), true);
}
SafeReadIOCallback::~SafeReadIOCallback() {
if (mDeleteIO)
delete mIO;
}
void
SafeReadIOCallback::Init(IOCallback *IO,
bool DeleteIO) {
mIO = IO;
mDeleteIO = DeleteIO;
int64 PrevPosition = IO->getFilePointer();
IO->setFilePointer(0, seek_end);
mSize = IO->getFilePointer();
IO->setFilePointer(PrevPosition);
}
size_t
SafeReadIOCallback::GetPosition()
const {
return mIO->getFilePointer();
}
size_t
SafeReadIOCallback::GetSize()
const {
return mSize;
}
size_t
SafeReadIOCallback::GetRemainingBytes()
const {
return GetSize() - GetPosition();
}
bool
SafeReadIOCallback::IsEmpty()
const {
return !GetRemainingBytes();
}
uint64
SafeReadIOCallback::GetUIntBE(size_t NumBytes) {
uint8 Buffer[8];
NumBytes = std::min<size_t>(std::max<size_t>(1, NumBytes), 8);
uint64 Value = 0;
uint8* Ptr = &Buffer[0];
Read(Buffer, NumBytes);
for (size_t i = 0; NumBytes > i; ++i, ++Ptr)
Value = (Value << 8) + *Ptr;
return Value;
}
uint8
SafeReadIOCallback::GetUInt8() {
return GetUIntBE(1);
}
uint16
SafeReadIOCallback::GetUInt16BE() {
return GetUIntBE(2);
}
uint32
SafeReadIOCallback::GetUInt24BE() {
return GetUIntBE(3);
}
uint32
SafeReadIOCallback::GetUInt32BE() {
return GetUIntBE(4);
}
uint64
SafeReadIOCallback::GetUInt64BE() {
return GetUIntBE(8);
}
void
SafeReadIOCallback::Skip(size_t Count) {
int64 PrevPosition = mIO->getFilePointer();
int64 ExpectedPosition = PrevPosition + Count;
mIO->setFilePointer(Count, seek_current);
int64 ActualPosition = mIO->getFilePointer();
if (ActualPosition != ExpectedPosition)
throw SafeReadIOCallback::EndOfStreamX(ExpectedPosition - ActualPosition);
}
void
SafeReadIOCallback::Seek(size_t Offset) {
mIO->setFilePointer(Offset);
uint64 ActualPosition = mIO->getFilePointer();
if (ActualPosition != Offset)
throw EndOfStreamX(ActualPosition - Offset);
}
void
SafeReadIOCallback::Read(void *Dst,
size_t Count) {
uint64 NumRead = mIO->read(Dst, Count);
if (NumRead != Count)
throw SafeReadIOCallback::EndOfStreamX(Count - NumRead);
}
END_LIBEBML_NAMESPACE

View File

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

View File

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

View File

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