aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2011-04-11 22:46:56 +0200
committerLukáš Lalinský <lalinsky@gmail.com>2011-04-11 22:46:56 +0200
commit0b0cbc2e34b37a727f2c79c239b144222762b400 (patch)
treea942c1cffff8ea06d6b1cecc2566985dab9f7d22
parent4cda0eeb7b4b58ac076b9b174f9a8dff7e717fc0 (diff)
Add an abstract IOStream class
-rw-r--r--taglib/mpeg/mpegfile.cpp10
-rw-r--r--taglib/mpeg/mpegfile.h15
-rw-r--r--taglib/toolkit/tfile.cpp7
-rw-r--r--taglib/toolkit/tfile.h25
-rw-r--r--taglib/toolkit/tiostream.cpp37
-rw-r--r--taglib/toolkit/tiostream.h158
6 files changed, 235 insertions, 17 deletions
diff --git a/taglib/mpeg/mpegfile.cpp b/taglib/mpeg/mpegfile.cpp
index 3b3513ae..9786c99a 100644
--- a/taglib/mpeg/mpegfile.cpp
+++ b/taglib/mpeg/mpegfile.cpp
@@ -113,6 +113,16 @@ MPEG::File::File(FileName file, ID3v2::FrameFactory *frameFactory,
read(readProperties, propertiesStyle);
}
+MPEG::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory,
+ bool readProperties, Properties::ReadStyle propertiesStyle) :
+ TagLib::File(stream)
+{
+ d = new FilePrivate(frameFactory);
+
+ if(isOpen())
+ read(readProperties, propertiesStyle);
+}
+
MPEG::File::~File()
{
delete d;
diff --git a/taglib/mpeg/mpegfile.h b/taglib/mpeg/mpegfile.h
index 7b41328a..cff5469d 100644
--- a/taglib/mpeg/mpegfile.h
+++ b/taglib/mpeg/mpegfile.h
@@ -85,13 +85,26 @@ namespace TagLib {
* file's audio properties will also be read using \a propertiesStyle. If
* false, \a propertiesStyle is ignored. The frames will be created using
* \a frameFactory.
+ *
+ * \deprecated This constructor will be dropped in favor of the one below
+ * in a future version.
*/
- // BIC: merge with the above constructor
File(FileName file, ID3v2::FrameFactory *frameFactory,
bool readProperties = true,
Properties::ReadStyle propertiesStyle = Properties::Average);
/*!
+ * Contructs an MPEG file from \a stream. If \a readProperties is true the
+ * file's audio properties will also be read using \a propertiesStyle. If
+ * false, \a propertiesStyle is ignored. The frames will be created using
+ * \a frameFactory.
+ */
+ // BIC: merge with the above constructor
+ File(IOStream *stream, ID3v2::FrameFactory *frameFactory,
+ bool readProperties = true,
+ Properties::ReadStyle propertiesStyle = Properties::Average);
+
+ /*!
* Destroys this instance of the File.
*/
virtual ~File();
diff --git a/taglib/toolkit/tfile.cpp b/taglib/toolkit/tfile.cpp
index 946d7ea2..63c28e5a 100644
--- a/taglib/toolkit/tfile.cpp
+++ b/taglib/toolkit/tfile.cpp
@@ -71,6 +71,7 @@ public:
FilePrivate(FileName fileName);
FILE *file;
+ IOStream *stream;
FileNameHandle name;
@@ -129,6 +130,12 @@ File::File(FileName file)
d = new FilePrivate(file);
}
+File::File(IOStream *stream)
+{
+ d = new FilePrivate(""); // TODO
+ d->stream = stream;
+}
+
File::~File()
{
if(d->file)
diff --git a/taglib/toolkit/tfile.h b/taglib/toolkit/tfile.h
index da322809..ee6f0488 100644
--- a/taglib/toolkit/tfile.h
+++ b/taglib/toolkit/tfile.h
@@ -29,6 +29,7 @@
#include "taglib_export.h"
#include "taglib.h"
#include "tbytevector.h"
+#include "tiostream.h"
namespace TagLib {
@@ -36,22 +37,6 @@ namespace TagLib {
class Tag;
class AudioProperties;
-#ifdef _WIN32
- class TAGLIB_EXPORT FileName
- {
- public:
- FileName(const wchar_t *name) : m_wname(name) {}
- FileName(const char *name) : m_name(name) {}
- operator const wchar_t *() const { return m_wname.c_str(); }
- operator const char *() const { return m_name.c_str(); }
- private:
- std::string m_name;
- std::wstring m_wname;
- };
-#else
- typedef const char *FileName;
-#endif
-
//! A file class with some useful methods for tag manipulation
/*!
@@ -241,6 +226,14 @@ namespace TagLib {
File(FileName file);
/*!
+ * Construct a File object and use the \a stream instance.
+ *
+ * \note Constructor is protected since this class should only be
+ * instantiated through subclasses.
+ */
+ File(IOStream *stream);
+
+ /*!
* Marks the file as valid or invalid.
*
* \see isValid()
diff --git a/taglib/toolkit/tiostream.cpp b/taglib/toolkit/tiostream.cpp
new file mode 100644
index 00000000..12c4b6fe
--- /dev/null
+++ b/taglib/toolkit/tiostream.cpp
@@ -0,0 +1,37 @@
+/***************************************************************************
+ copyright : (C) 2011 by Lukas Lalinsky
+ email : lalinsky@gmail.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA *
+ * 02110-1301 USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include "tiostream.h"
+
+using namespace TagLib;
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+IOStream::~IOStream()
+{
+ delete d;
+}
diff --git a/taglib/toolkit/tiostream.h b/taglib/toolkit/tiostream.h
new file mode 100644
index 00000000..fee02e8f
--- /dev/null
+++ b/taglib/toolkit/tiostream.h
@@ -0,0 +1,158 @@
+/***************************************************************************
+ copyright : (C) 2011 by Lukas Lalinsky
+ email : lalinsky@gmail.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA *
+ * 02110-1301 USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_IOSTREAM_H
+#define TAGLIB_IOSTREAM_H
+
+#include "taglib_export.h"
+#include "taglib.h"
+#include "tbytevector.h"
+
+namespace TagLib {
+
+#ifdef _WIN32
+ class TAGLIB_EXPORT FileName
+ {
+ public:
+ FileName(const wchar_t *name) : m_wname(name) {}
+ FileName(const char *name) : m_name(name) {}
+ operator const wchar_t *() const { return m_wname.c_str(); }
+ operator const char *() const { return m_name.c_str(); }
+ private:
+ std::string m_name;
+ std::wstring m_wname;
+ };
+#else
+ typedef const char *FileName;
+#endif
+
+ //! An abstract class that provides operations on a sequence of bytes
+
+ class TAGLIB_EXPORT IOStream
+ {
+ public:
+ /*!
+ * Position in the file used for seeking.
+ */
+ enum Position {
+ //! Seek from the beginning of the file.
+ Beginning,
+ //! Seek from the current position in the file.
+ Current,
+ //! Seek from the end of the file.
+ End
+ };
+
+ /*!
+ * Destroys this IOStream instance.
+ */
+ virtual ~IOStream();
+
+ /*!
+ * Returns the stream name in the local file system encoding.
+ */
+ virtual FileName name() const = 0;
+
+ /*!
+ * Reads a block of size \a length at the current get pointer.
+ */
+ virtual ByteVector readBlock(ulong length) = 0;
+
+ /*!
+ * Attempts to write the block \a data at the current get pointer. If the
+ * file is currently only opened read only -- i.e. readOnly() returns true --
+ * this attempts to reopen the file in read/write mode.
+ *
+ * \note This should be used instead of using the streaming output operator
+ * for a ByteVector. And even this function is significantly slower than
+ * doing output with a char[].
+ */
+ virtual void writeBlock(const ByteVector &data) = 0;
+
+ /*!
+ * Insert \a data at position \a start in the file overwriting \a replace
+ * bytes of the original content.
+ *
+ * \note This method is slow since it requires rewriting all of the file
+ * after the insertion point.
+ */
+ virtual void insert(const ByteVector &data, ulong start = 0, ulong replace = 0) = 0;
+
+ /*!
+ * Removes a block of the file starting a \a start and continuing for
+ * \a length bytes.
+ *
+ * \note This method is slow since it involves rewriting all of the file
+ * after the removed portion.
+ */
+ virtual void removeBlock(ulong start = 0, ulong length = 0) = 0;
+
+ /*!
+ * Returns true if the file is read only (or if the file can not be opened).
+ */
+ virtual bool readOnly() const = 0;
+
+ /*!
+ * Since the file can currently only be opened as an argument to the
+ * constructor (sort-of by design), this returns if that open succeeded.
+ */
+ virtual bool isOpen() const = 0;
+
+ /*!
+ * Returns true if the file is open and readble.
+ */
+ virtual bool isValid() const = 0;
+
+ /*!
+ * Move the I/O pointer to \a offset in the stream from position \a p. This
+ * defaults to seeking from the beginning of the stream.
+ *
+ * \see Position
+ */
+ virtual void seek(long offset, Position p = Beginning) = 0;
+
+ /*!
+ * Reset the end-of-stream and error flags on the stream.
+ */
+ virtual void clear() = 0;
+
+ /*!
+ * Returns the current offset within the stream.
+ */
+ virtual long tell() const = 0;
+
+ /*!
+ * Returns the length of the stream.
+ */
+ virtual long length() = 0;
+
+ private:
+ IOStream(const IOStream &);
+ IOStream &operator=(const IOStream &);
+ };
+
+}
+
+#endif