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

View File

@ -21,6 +21,7 @@ class MkvReader : public IMkvReader
MkvReader& operator=(const MkvReader&); MkvReader& operator=(const MkvReader&);
public: public:
MkvReader(); MkvReader();
MkvReader(FILE* fp);
virtual ~MkvReader(); virtual ~MkvReader();
int Open(const char*); int Open(const char*);
@ -29,8 +30,15 @@ public:
virtual int Read(long long position, long length, unsigned char* buffer); virtual int Read(long long position, long length, unsigned char* buffer);
virtual int Length(long long* total, long long* available); virtual int Length(long long* total, long long* available);
private: 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; long long m_length;
FILE* m_file; FILE* m_file;
bool reader_owns_file_;
}; };
} //end namespace mkvparser } //end namespace mkvparser