1 /***************************************************************************
2     copyright            : (C) 2011 by Lukas Lalinsky
3     email                : lalinsky@gmail.com
4  ***************************************************************************/
5 
6 /***************************************************************************
7  *   This library is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU Lesser General Public License version   *
9  *   2.1 as published by the Free Software Foundation.                     *
10  *                                                                         *
11  *   This library is distributed in the hope that it will be useful, but   *
12  *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
14  *   Lesser General Public License for more details.                       *
15  *                                                                         *
16  *   You should have received a copy of the GNU Lesser General Public      *
17  *   License along with this library; if not, write to the Free Software   *
18  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA         *
19  *   02110-1301  USA                                                       *
20  *                                                                         *
21  *   Alternatively, this file is available under the Mozilla Public        *
22  *   License Version 1.1.  You may obtain a copy of the License at         *
23  *   http://www.mozilla.org/MPL/                                           *
24  ***************************************************************************/
25 
26 #ifndef TAGLIB_BYTEVECTORSTREAM_H
27 #define TAGLIB_BYTEVECTORSTREAM_H
28 
29 #include "taglib_export.h"
30 #include "taglib.h"
31 #include "tbytevector.h"
32 #include "tiostream.h"
33 
34 namespace TagLib {
35 
36   class String;
37   class Tag;
38   class AudioProperties;
39 
40   //! In-memory Stream class using ByteVector for its storage.
41 
42   class TAGLIB_EXPORT ByteVectorStream : public IOStream
43   {
44   public:
45     /*!
46      * Construct a File object and opens the \a file.  \a file should be a
47      * be a C-string in the local file system encoding.
48      */
49     ByteVectorStream(const ByteVector &data);
50 
51     /*!
52      * Destroys this ByteVectorStream instance.
53      */
54     virtual ~ByteVectorStream();
55 
56     /*!
57      * Returns the file name in the local file system encoding.
58      */
59     FileName name() const;
60 
61     /*!
62      * Reads a block of size \a length at the current get pointer.
63      */
64     ByteVector readBlock(unsigned long length);
65 
66     /*!
67      * Attempts to write the block \a data at the current get pointer.  If the
68      * file is currently only opened read only -- i.e. readOnly() returns true --
69      * this attempts to reopen the file in read/write mode.
70      *
71      * \note This should be used instead of using the streaming output operator
72      * for a ByteVector.  And even this function is significantly slower than
73      * doing output with a char[].
74      */
75     void writeBlock(const ByteVector &data);
76 
77     /*!
78      * Insert \a data at position \a start in the file overwriting \a replace
79      * bytes of the original content.
80      *
81      * \note This method is slow since it requires rewriting all of the file
82      * after the insertion point.
83      */
84     void insert(const ByteVector &data, unsigned long start = 0, unsigned long replace = 0);
85 
86     /*!
87      * Removes a block of the file starting a \a start and continuing for
88      * \a length bytes.
89      *
90      * \note This method is slow since it involves rewriting all of the file
91      * after the removed portion.
92      */
93     void removeBlock(unsigned long start = 0, unsigned long length = 0);
94 
95     /*!
96      * Returns true if the file is read only (or if the file can not be opened).
97      */
98     bool readOnly() const;
99 
100     /*!
101      * Since the file can currently only be opened as an argument to the
102      * constructor (sort-of by design), this returns if that open succeeded.
103      */
104     bool isOpen() const;
105 
106     /*!
107      * Move the I/O pointer to \a offset in the file from position \a p.  This
108      * defaults to seeking from the beginning of the file.
109      *
110      * \see Position
111      */
112     void seek(long offset, Position p = Beginning);
113 
114     /*!
115      * Reset the end-of-file and error flags on the file.
116      */
117     void clear();
118 
119     /*!
120      * Returns the current offset within the file.
121      */
122     long tell() const;
123 
124     /*!
125      * Returns the length of the file.
126      */
127     long length();
128 
129     /*!
130      * Truncates the file to a \a length.
131      */
132     void truncate(long length);
133 
134     ByteVector *data();
135 
136   protected:
137 
138   private:
139     class ByteVectorStreamPrivate;
140     ByteVectorStreamPrivate *d;
141   };
142 
143 }
144 
145 #endif
146