Adding support for user file ownership in MkvReader

Adding a constructor to MkvReader that will enable user application
ownership of the file.

Change-Id: I10f8f71715392df3d4b78c7c11076e19c30e1af6
This commit is contained in:
Vignesh Venkatasubramanian 2014-04-02 23:25:55 -07:00
parent 630a0e3c33
commit abe9c2d0d1
2 changed files with 30 additions and 7 deletions

View File

@ -14,13 +14,20 @@ namespace mkvparser
{
MkvReader::MkvReader() :
m_file(NULL)
{
m_file(NULL),
reader_owns_file_(true) {
}
MkvReader::~MkvReader()
{
MkvReader::MkvReader(FILE* fp) :
m_file(fp),
reader_owns_file_(false) {
GetFileSize();
}
MkvReader::~MkvReader() {
if (reader_owns_file_)
Close();
m_file = NULL;
}
int MkvReader::Open(const char* fileName)
@ -42,12 +49,17 @@ int MkvReader::Open(const char* fileName)
if (m_file == NULL)
return -1;
#endif
return !GetFileSize();
}
bool MkvReader::GetFileSize() {
if (m_file == NULL)
return false;
#ifdef _MSC_VER
int status = _fseeki64(m_file, 0L, SEEK_END);
if (status)
return -1; //error
return false; //error
m_length = _ftelli64(m_file);
#else
@ -56,16 +68,19 @@ int MkvReader::Open(const char* fileName)
#endif
assert(m_length >= 0);
if (m_length < 0)
return false;
#ifdef _MSC_VER
status = _fseeki64(m_file, 0L, SEEK_SET);
if (status)
return -1; //error
return false; //error
#else
fseek(m_file, 0L, SEEK_SET);
#endif
return 0;
return true;
}
void MkvReader::Close()

View File

@ -21,6 +21,7 @@ class MkvReader : public IMkvReader
MkvReader& operator=(const MkvReader&);
public:
MkvReader();
MkvReader(FILE* fp);
virtual ~MkvReader();
int Open(const char*);
@ -29,8 +30,15 @@ public:
virtual int Read(long long position, long length, unsigned char* buffer);
virtual int Length(long long* total, long long* available);
private:
// Determines the size of the file. This is called either by the constructor
// or by the Open function depending on file ownership. Returns true on
// success.
bool GetFileSize();
long long m_length;
FILE* m_file;
bool reader_owns_file_;
};
} //end namespace mkvparser