Added File Seek and Tell functionality.
Added ability to open files in direct-access mode (no buffering). Change-Id: Icca71a60f6697967e7535a030c71414de95d8044
This commit is contained in:
parent
57e3e79a3d
commit
ada218c089
|
@ -74,17 +74,8 @@ static const SupportedTypeInfo kSupportedTypeInfo[] = {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
File* File::Create(const char* file_name, const char* mode) {
|
File* File::Create(const char* file_name, const char* mode) {
|
||||||
scoped_ptr<File, FileCloser> internal_file;
|
scoped_ptr<File, FileCloser> internal_file(
|
||||||
for (size_t i = 0; i < arraysize(kSupportedTypeInfo); ++i) {
|
CreateInternalFile(file_name, mode));
|
||||||
const SupportedTypeInfo& type_info = kSupportedTypeInfo[i];
|
|
||||||
if (strncmp(type_info.type, file_name, type_info.type_length) == 0) {
|
|
||||||
internal_file.reset(type_info.factory_function(
|
|
||||||
file_name + type_info.type_length, mode));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Otherwise we assume it is a local file
|
|
||||||
if (!internal_file)
|
|
||||||
internal_file.reset(CreateLocalFile(file_name, mode));
|
|
||||||
|
|
||||||
if (FLAGS_io_cache_size) {
|
if (FLAGS_io_cache_size) {
|
||||||
// Enable threaded I/O for "r", "w", and "a" modes only.
|
// Enable threaded I/O for "r", "w", and "a" modes only.
|
||||||
|
@ -106,6 +97,22 @@ File* File::Create(const char* file_name, const char* mode) {
|
||||||
return internal_file.release();
|
return internal_file.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File* File::CreateInternalFile(const char* file_name, const char* mode) {
|
||||||
|
scoped_ptr<File, FileCloser> internal_file;
|
||||||
|
for (size_t i = 0; i < arraysize(kSupportedTypeInfo); ++i) {
|
||||||
|
const SupportedTypeInfo& type_info = kSupportedTypeInfo[i];
|
||||||
|
if (strncmp(type_info.type, file_name, type_info.type_length) == 0) {
|
||||||
|
internal_file.reset(type_info.factory_function(
|
||||||
|
file_name + type_info.type_length, mode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Otherwise we assume it is a local file
|
||||||
|
if (!internal_file)
|
||||||
|
internal_file.reset(CreateLocalFile(file_name, mode));
|
||||||
|
|
||||||
|
return internal_file.release();
|
||||||
|
}
|
||||||
|
|
||||||
File* File::Open(const char* file_name, const char* mode) {
|
File* File::Open(const char* file_name, const char* mode) {
|
||||||
File* file = File::Create(file_name, mode);
|
File* file = File::Create(file_name, mode);
|
||||||
if (!file)
|
if (!file)
|
||||||
|
@ -117,6 +124,17 @@ File* File::Open(const char* file_name, const char* mode) {
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File* File::OpenWithNoBuffering(const char* file_name, const char* mode) {
|
||||||
|
File* file = File::CreateInternalFile(file_name, mode);
|
||||||
|
if (!file)
|
||||||
|
return NULL;
|
||||||
|
if (!file->Open()) {
|
||||||
|
delete file;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
bool File::Delete(const char* file_name) {
|
bool File::Delete(const char* file_name) {
|
||||||
for (size_t i = 0; i < arraysize(kSupportedTypeInfo); ++i) {
|
for (size_t i = 0; i < arraysize(kSupportedTypeInfo); ++i) {
|
||||||
const SupportedTypeInfo& type_info = kSupportedTypeInfo[i];
|
const SupportedTypeInfo& type_info = kSupportedTypeInfo[i];
|
||||||
|
|
|
@ -29,6 +29,14 @@ class File {
|
||||||
/// @return A File pointer on success, false otherwise.
|
/// @return A File pointer on success, false otherwise.
|
||||||
static File* Open(const char* file_name, const char* mode);
|
static File* Open(const char* file_name, const char* mode);
|
||||||
|
|
||||||
|
/// Open the specified file in direct-access mode (no buffering).
|
||||||
|
/// This is a file factory method, it opens a proper file automatically
|
||||||
|
/// based on prefix, e.g. "file://" for LocalFile.
|
||||||
|
/// @param file_name contains the name of the file to be accessed.
|
||||||
|
/// @param mode contains file access mode. Implementation dependent.
|
||||||
|
/// @return A File pointer on success, false otherwise.
|
||||||
|
static File* OpenWithNoBuffering(const char* file_name, const char* mode);
|
||||||
|
|
||||||
/// Delete the specified file.
|
/// Delete the specified file.
|
||||||
/// @param file_name contains the path of the file to be deleted.
|
/// @param file_name contains the path of the file to be deleted.
|
||||||
/// @return true if successful, false otherwise.
|
/// @return true if successful, false otherwise.
|
||||||
|
@ -66,6 +74,17 @@ class File {
|
||||||
/// @return true on success, false otherwise.
|
/// @return true on success, false otherwise.
|
||||||
virtual bool Flush() = 0;
|
virtual bool Flush() = 0;
|
||||||
|
|
||||||
|
/// Seek to the specifield position in the file.
|
||||||
|
/// @param position is the position to seek to.
|
||||||
|
/// @return true on success, false otherwise.
|
||||||
|
virtual bool Seek(uint64_t position) = 0;
|
||||||
|
|
||||||
|
/// Get the current file position.
|
||||||
|
/// @param position is a pointer to contain the current file position upon
|
||||||
|
/// successful return.
|
||||||
|
/// @return true on succcess, false otherwise.
|
||||||
|
virtual bool Tell(uint64_t* position) = 0;
|
||||||
|
|
||||||
/// @return The file name.
|
/// @return The file name.
|
||||||
const std::string& file_name() const { return file_name_; }
|
const std::string& file_name() const { return file_name_; }
|
||||||
|
|
||||||
|
@ -99,6 +118,8 @@ class File {
|
||||||
// LocalFile, MemFile based on prefix.
|
// LocalFile, MemFile based on prefix.
|
||||||
static File* Create(const char* file_name, const char* mode);
|
static File* Create(const char* file_name, const char* mode);
|
||||||
|
|
||||||
|
static File* CreateInternalFile(const char* file_name, const char* mode);
|
||||||
|
|
||||||
std::string file_name_;
|
std::string file_name_;
|
||||||
DISALLOW_COPY_AND_ASSIGN(File);
|
DISALLOW_COPY_AND_ASSIGN(File);
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#include "packager/media/file/local_file.h"
|
#include "packager/media/file/local_file.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "packager/base/file_util.h"
|
#include "packager/base/file_util.h"
|
||||||
#include "packager/base/logging.h"
|
#include "packager/base/logging.h"
|
||||||
|
|
||||||
|
@ -59,6 +61,18 @@ bool LocalFile::Flush() {
|
||||||
return ((fflush(internal_file_) == 0) && !ferror(internal_file_));
|
return ((fflush(internal_file_) == 0) && !ferror(internal_file_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LocalFile::Seek(uint64_t position) {
|
||||||
|
return fseeko(internal_file_, position, SEEK_SET) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LocalFile::Tell(uint64_t* position) {
|
||||||
|
off_t offset = ftello(internal_file_);
|
||||||
|
if (offset < 0)
|
||||||
|
return false;
|
||||||
|
*position = offset;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
LocalFile::~LocalFile() {}
|
LocalFile::~LocalFile() {}
|
||||||
|
|
||||||
bool LocalFile::Open() {
|
bool LocalFile::Open() {
|
||||||
|
|
|
@ -32,6 +32,8 @@ class LocalFile : public File {
|
||||||
virtual int64_t Write(const void* buffer, uint64_t length) OVERRIDE;
|
virtual int64_t Write(const void* buffer, uint64_t length) OVERRIDE;
|
||||||
virtual int64_t Size() OVERRIDE;
|
virtual int64_t Size() OVERRIDE;
|
||||||
virtual bool Flush() OVERRIDE;
|
virtual bool Flush() OVERRIDE;
|
||||||
|
virtual bool Seek(uint64_t position) OVERRIDE;
|
||||||
|
virtual bool Tell(uint64_t* position) OVERRIDE;
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
/// Delete a local file.
|
/// Delete a local file.
|
||||||
|
|
|
@ -123,6 +123,16 @@ void ThreadedIoFile::RunInInputMode() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ThreadedIoFile::Seek(uint64_t position) {
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ThreadedIoFile::Tell(uint64_t* position) {
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void ThreadedIoFile::RunInOutputMode() {
|
void ThreadedIoFile::RunInOutputMode() {
|
||||||
DCHECK(internal_file_);
|
DCHECK(internal_file_);
|
||||||
DCHECK(thread_);
|
DCHECK(thread_);
|
||||||
|
|
|
@ -38,6 +38,8 @@ class ThreadedIoFile : public File {
|
||||||
virtual int64_t Write(const void* buffer, uint64_t length) OVERRIDE;
|
virtual int64_t Write(const void* buffer, uint64_t length) OVERRIDE;
|
||||||
virtual int64_t Size() OVERRIDE;
|
virtual int64_t Size() OVERRIDE;
|
||||||
virtual bool Flush() OVERRIDE;
|
virtual bool Flush() OVERRIDE;
|
||||||
|
virtual bool Seek(uint64_t position) OVERRIDE;
|
||||||
|
virtual bool Tell(uint64_t* position) OVERRIDE;
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -31,6 +31,8 @@ class UdpFile : public File {
|
||||||
virtual int64_t Write(const void* buffer, uint64_t length) OVERRIDE;
|
virtual int64_t Write(const void* buffer, uint64_t length) OVERRIDE;
|
||||||
virtual int64_t Size() OVERRIDE;
|
virtual int64_t Size() OVERRIDE;
|
||||||
virtual bool Flush() OVERRIDE;
|
virtual bool Flush() OVERRIDE;
|
||||||
|
virtual bool Seek(uint64_t position) OVERRIDE;
|
||||||
|
virtual bool Tell(uint64_t* position) OVERRIDE;
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -129,6 +129,16 @@ bool UdpFile::Flush() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UdpFile::Seek(uint64_t position) {
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UdpFile::Tell(uint64_t* position) {
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
class ScopedSocket {
|
class ScopedSocket {
|
||||||
public:
|
public:
|
||||||
explicit ScopedSocket(int sock_fd)
|
explicit ScopedSocket(int sock_fd)
|
||||||
|
|
|
@ -42,6 +42,16 @@ bool UdpFile::Flush() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UdpFile::Seek(uint64_t position) {
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UdpFile::Tell(uint64_t* position) {
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool UdpFile::Open() {
|
bool UdpFile::Open() {
|
||||||
NOTIMPLEMENTED();
|
NOTIMPLEMENTED();
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue