Panda3D
rocketFileInterface.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file rocketFileInterface.cxx
10  * @author rdb
11  * @date 2011-11-03
12  */
13 
14 #include "rocketFileInterface.h"
15 #include "virtualFileSystem.h"
16 
17 /**
18  * Constructs a RocketFileInterface for the given VFS, or the default if NULL
19  * is given.
20  */
23  if (_vfs == nullptr) {
25  }
26 }
27 
28 /**
29  *
30  */
31 Rocket::Core::FileHandle RocketFileInterface::
32 Open(const Rocket::Core::String& path) {
33  rocket_cat.debug() << "Opening " << path.CString() << "\n";
34 
35  Filename fn = Filename::from_os_specific(path.CString());
36 
37  PT(VirtualFile) file = _vfs->get_file(fn);
38  if (file == nullptr) {
39  // failed? Try model-path as a Panda-friendly fallback.
40  if (!_vfs->resolve_filename(fn, get_model_path())) {
41  rocket_cat.error() << "Could not resolve " << fn
42  << " along the model-path (currently: " << get_model_path() << ")\n";
43  return (Rocket::Core::FileHandle) nullptr;
44  }
45 
46  file = _vfs->get_file(fn);
47  if (file == nullptr) {
48  rocket_cat.error() << "Failed to get " << fn << ", found on model-path\n";
49  return (Rocket::Core::FileHandle) nullptr;
50  }
51  }
52 
53  std::istream *str = file->open_read_file(true);
54  if (str == nullptr) {
55  rocket_cat.error() << "Failed to open " << fn << " for reading\n";
56  return (Rocket::Core::FileHandle) nullptr;
57  }
58 
59  VirtualFileHandle *handle = new VirtualFileHandle;
60  handle->_file = file;
61  handle->_stream = str;
62 
63  // A FileHandle is actually just a void pointer.
64  return (Rocket::Core::FileHandle) handle;
65 }
66 
67 /**
68  *
69  */
70 void RocketFileInterface::
71 Close(Rocket::Core::FileHandle file) {
72  VirtualFileHandle *handle = (VirtualFileHandle*) file;
73  if (handle == nullptr) {
74  return;
75  }
76 
77  _vfs->close_read_file(handle->_stream);
78  delete handle;
79 }
80 
81 /**
82  *
83  */
84 size_t RocketFileInterface::
85 Read(void* buffer, size_t size, Rocket::Core::FileHandle file) {
86  VirtualFileHandle *handle = (VirtualFileHandle*) file;
87  if (handle == nullptr) {
88  return 0;
89  }
90 
91  handle->_stream->read((char*) buffer, size);
92  return handle->_stream->gcount();
93 }
94 
95 /**
96  *
97  */
98 bool RocketFileInterface::
99 Seek(Rocket::Core::FileHandle file, long offset, int origin) {
100  VirtualFileHandle *handle = (VirtualFileHandle*) file;
101  if (handle == nullptr) {
102  return false;
103  }
104 
105  switch(origin) {
106  case SEEK_SET:
107  handle->_stream->seekg(offset, std::ios::beg);
108  break;
109  case SEEK_CUR:
110  handle->_stream->seekg(offset, std::ios::cur);
111  break;
112  case SEEK_END:
113  handle->_stream->seekg(offset, std::ios::end);
114  };
115 
116  return !handle->_stream->fail();
117 }
118 
119 /**
120  *
121  */
122 size_t RocketFileInterface::
123 Tell(Rocket::Core::FileHandle file) {
124  VirtualFileHandle *handle = (VirtualFileHandle*) file;
125  if (handle == nullptr) {
126  return 0;
127  }
128 
129  return handle->_stream->tellg();
130 }
131 
132 /**
133  *
134  */
135 size_t RocketFileInterface::
136 Length(Rocket::Core::FileHandle file) {
137  VirtualFileHandle *handle = (VirtualFileHandle*) file;
138  if (handle == nullptr) {
139  return 0;
140  }
141 
142  return handle->_file->get_file_size(handle->_stream);
143 }
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A hierarchy of directories and files that appears to be one continuous file system, even though the files may originate from several different sources that may not be related to the actual OS&#39;s file system.
bool resolve_filename(Filename &filename, const DSearchPath &searchpath, const std::string &default_extension=std::string()) const
Searches the given search path for the filename.
The abstract base class for a file or directory within the VirtualFileSystem.
Definition: virtualFile.h:35
static void close_read_file(std::istream *stream)
Closes a file opened by a previous call to open_read_file().
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
PointerTo< VirtualFile > get_file(const Filename &filename, bool status_only=false) const
Looks up the file by the indicated name in the file system.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
RocketFileInterface(VirtualFileSystem *vfs=nullptr)
Constructs a RocketFileInterface for the given VFS, or the default if NULL is given.
static Filename from_os_specific(const std::string &os_specific, Type type=T_general)
This named constructor returns a Panda-style filename (that is, using forward slashes, and no drive letter) based on the supplied filename string that describes a filename in the local system conventions (for instance, on Windows, it may use backslashes or begin with a drive letter and a colon).
Definition: filename.cxx:328