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:
parent
630a0e3c33
commit
abe9c2d0d1
@ -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()
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user