CBufferedFile: convert into a non-refcounted RAII wrapper

- it now takes over the passed file descriptor and closes it in the
  destructor
- this fixes a leak in LoadExternalBlockFile(), where an exception could
  cause the file to not getting closed

- disallow copies (like recently added for CAutoFile)
- make nType and nVersion private
This commit is contained in:
Philip Kaufmann
2014-09-25 08:53:43 +02:00
parent 00eef5d6e9
commit c9fb27da0a
2 changed files with 22 additions and 10 deletions

View File

@@ -1256,13 +1256,19 @@ public:
}
};
/** Wrapper around a FILE* that implements a ring buffer to
* deserialize from. It guarantees the ability to rewind
* a given number of bytes. */
/** Non-refcounted RAII wrapper around a FILE* that implements a ring buffer to
* deserialize from. It guarantees the ability to rewind a given number of bytes. */
class CBufferedFile
{
private:
FILE *src; // source file
// Disallow copies
CBufferedFile(const CBufferedFile&);
CBufferedFile& operator=(const CBufferedFile&);
int nType;
int nVersion;
FILE *src; // source file
uint64_t nSrcPos; // how many bytes have been read from source
uint64_t nReadPos; // how many bytes have been read from this
uint64_t nReadLimit; // up to which position we're allowed to read
@@ -1289,12 +1295,18 @@ protected:
}
public:
int nType;
int nVersion;
CBufferedFile(FILE *fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nTypeIn, int nVersionIn) :
src(fileIn), nSrcPos(0), nReadPos(0), nReadLimit((uint64_t)(-1)), nRewind(nRewindIn), vchBuf(nBufSize, 0),
nType(nTypeIn), nVersion(nVersionIn) {
nSrcPos(0), nReadPos(0), nReadLimit((uint64_t)(-1)), nRewind(nRewindIn), vchBuf(nBufSize, 0)
{
src = fileIn;
nType = nTypeIn;
nVersion = nVersionIn;
}
~CBufferedFile()
{
if (src)
fclose(src);
}
// check whether we're at the end of the source file