| Index: import/cross/raw_data.cc
|
| ===================================================================
|
| --- import/cross/raw_data.cc (revision 20922)
|
| +++ import/cross/raw_data.cc (working copy)
|
| @@ -35,6 +35,9 @@
|
|
|
| #include "import/cross/raw_data.h"
|
| #include "base/file_util.h"
|
| +#include "utils/cross/file_path_utils.h"
|
| +#include "base/file_path.h"
|
| +#include "base/file_util.h"
|
|
|
| #ifdef OS_MACOSX
|
| #include <CoreFoundation/CoreFoundation.h>
|
| @@ -44,6 +47,10 @@
|
| #include <rpc.h>
|
| #endif
|
|
|
| +using file_util::OpenFile;
|
| +using file_util::CloseFile;
|
| +using file_util::GetFileSize;
|
| +
|
| namespace o3d {
|
|
|
| // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| @@ -74,13 +81,58 @@
|
| return RawData::Ref(new RawData(service_locator, uri, data, length));
|
| }
|
|
|
| +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| +RawData::Ref RawData::CreateFromFile(ServiceLocator* service_locator,
|
| + const String &uri,
|
| + const String& filename) {
|
| + RawData::Ref data(Create(service_locator, uri, NULL, 0));
|
| + if (!data->SetFromFile(filename)) {
|
| + data.Reset();
|
| + }
|
|
|
| + return data;
|
| +}
|
| +
|
| // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| RawData::~RawData() {
|
| Discard();
|
| }
|
|
|
| // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| +bool RawData::SetFromFile(const String& filename) {
|
| + FilePath filepath = UTF8ToFilePath(filename);
|
| + FILE *file = OpenFile(filepath, "rb");
|
| + bool result = false;
|
| + if (!file) {
|
| + DLOG(ERROR) << "file not found \"" << filename << "\"";
|
| + } else {
|
| + // Determine the file's length
|
| + int64 file_size64;
|
| + if (!GetFileSize(filepath, &file_size64)) {
|
| + DLOG(ERROR) << "error getting file size \"" << filename << "\"";
|
| + } else {
|
| + if (file_size64 > 0xffffffffLL) {
|
| + DLOG(ERROR) << "file is too large \"" << filename << "\"";
|
| + } else {
|
| + size_t file_length = static_cast<size_t>(file_size64);
|
| +
|
| + // Load the file data into memory
|
| + data_.reset(new uint8[file_length]);
|
| + length_ = file_length;
|
| + if (fread(data_.get(), file_length, 1, file) != 1) {
|
| + DLOG(ERROR) << "error reading file \"" << filename << "\"";
|
| + } else {
|
| + result = true;
|
| + }
|
| + }
|
| + }
|
| + CloseFile(file);
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| const uint8 *RawData::GetData() const {
|
| // Return data immediately if we have it
|
| if (data_.get()) {
|
|
|