28 #include "vfs/fife_boost_filesystem.h"
38 FIFE::ZipNode* FindNameInContainer(
const FIFE::ZipNodeContainer& container,
39 const std::string& name) {
40 for (FIFE::ZipNodeContainer::const_iterator iter = container.begin(); iter != container.end(); ++iter) {
41 if ((*iter)->getName() == name) {
49 FIFE::ZipNodeContainer::iterator FindNameInContainer(FIFE::ZipNodeContainer& container,
50 const std::string& name)
52 for (FIFE::ZipNodeContainer::iterator iter = container.begin(); iter != container.end(); ++iter) {
53 if ((*iter)->getName() == name) {
58 return container.end();
63 ZipEntryData::ZipEntryData()
64 : comp(0), crc32(0), size_comp(0), size_real(0), offset(0) {
67 ZipNode::ZipNode(
const std::string& name, ZipNode* parent)
68 : m_name(name), m_parent(parent) {
74 m_contentType = ZipContentType::File;
78 m_contentType = ZipContentType::Directory;
83 ZipNodeContainer::iterator iter;
84 for (iter = m_fileChildren.begin(); iter != m_fileChildren.end(); ++iter) {
87 m_fileChildren.clear();
89 for (iter = m_directoryChildren.begin(); iter != m_directoryChildren.end(); ++iter) {
92 m_directoryChildren.clear();
95 std::string ZipNode::getName()
const {
99 std::string ZipNode::getFullName()
const {
104 bfs::path path(m_parent->getFullName());
106 return (path.string());
114 ZipContentType::Enum ZipNode::getContentType()
const {
115 return m_contentType;
118 ZipNode* ZipNode::getParent()
const {
122 std::vector<ZipNode*> ZipNode::getChildren(ZipContentType::Enum contentType)
const {
123 switch (contentType) {
125 case ZipContentType::All: {
130 ZipNodeContainer allNodes;
131 allNodes.reserve(m_directoryChildren.size() + m_fileChildren.size());
132 allNodes.insert(allNodes.end(), m_directoryChildren.begin(), m_directoryChildren.end());
133 allNodes.insert(allNodes.end(), m_fileChildren.begin(), m_fileChildren.end());
137 case ZipContentType::File: {
138 return m_fileChildren;
140 case ZipContentType::Directory: {
141 return m_directoryChildren;
146 ZipNode* ZipNode::getChild(
const std::string& name,
147 ZipContentType::Enum contentType)
const {
150 switch (contentType) {
152 case ZipContentType::All: {
155 node = FindNameInContainer(m_fileChildren, name);
158 node = FindNameInContainer(m_directoryChildren, name);
163 case ZipContentType::File: {
168 return FindNameInContainer(m_fileChildren, name);
170 case ZipContentType::Directory: {
175 return FindNameInContainer(m_directoryChildren, name);
180 ZipNode* ZipNode::addChild(
const std::string& name) {
181 ZipNode* child =
new ZipNode(name,
this);
183 if (child->getContentType() == ZipContentType::File) {
184 m_fileChildren.push_back(child);
186 else if (child->getContentType() == ZipContentType::Directory) {
187 m_directoryChildren.push_back(child);
197 void ZipNode::removeChild(ZipNode* child) {
199 if (child->getContentType() == ZipContentType::File) {
200 ZipNodeContainer::iterator iter;
201 iter = std::find(m_fileChildren.begin(), m_fileChildren.end(), child);
203 if (iter != m_fileChildren.end()) {
205 m_fileChildren.erase(iter);
211 void ZipNode::removeChild(
const std::string& name) {
213 ZipNodeContainer::iterator iter = FindNameInContainer(m_fileChildren, name);
215 if (iter != m_fileChildren.end()) {
217 m_fileChildren.erase(iter);
221 ZipNodeContainer::iterator iter = FindNameInContainer(m_directoryChildren, name);
223 if (iter != m_directoryChildren.end()) {
225 m_directoryChildren.erase(iter);
230 bool ZipNode::isLeaf()
const
232 return (m_fileChildren.empty() && m_directoryChildren.empty());
235 bool ZipNode::isBranch()
const
240 void ZipNode::setZipEntryData(
const ZipEntryData& entryData)
242 m_entryData = entryData;
245 const ZipEntryData& ZipNode::getZipEntryData()
const
251 std::ostream&
operator<<(std::ostream& os,
const FIFE::ZipNode& node) {
253 os << node.getName() << std::endl;
256 FIFE::ZipNodeContainer fileChildren = node.getChildren(FIFE::ZipContentType::File);
257 FIFE::ZipNodeContainer::iterator iter;
258 for (iter = fileChildren.begin(); iter != fileChildren.end(); ++iter) {
259 os << *(*iter) << std::endl;
263 FIFE::ZipNodeContainer directoryChildren = node.getChildren(FIFE::ZipContentType::Directory);
264 for (iter = directoryChildren.begin(); iter != directoryChildren.end(); ++iter) {
265 os << *(*iter) << std::endl;
std::ostream & operator<<(std::ostream &os, const Location &l)
bool HasExtension(const std::string &path)
credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the qua...