Răsfoiți Sursa

Add two ways to access resources

Daniele Bartolini 13 ani în urmă
părinte
comite
446e3c719e

+ 96 - 0
src/ArchiveResourceArchive.cpp

@@ -0,0 +1,96 @@
+/*
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "ArchiveResourceArchive.h"
+#include "Filesystem.h"
+#include "Resource.h"
+#include "FileStream.h"
+#include "Log.h"
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+ArchiveResourceArchive::ArchiveResourceArchive(Filesystem& fs) :
+	m_filesystem(fs),
+	m_archive_file(NULL),
+	m_entries_count(0),
+	m_entries(NULL)
+{
+	// FIXME Default archive name
+	m_archive_file = (FileStream*)m_filesystem.open("archive.bin", SOM_READ);
+	
+	ArchiveHeader header;
+	
+	// Read the header of the archive
+	m_archive_file->read(&header, sizeof(ArchiveHeader));
+	
+	Log::D("Version: %d", header.version);
+	Log::D("Entries: %d", header.entries_count);
+	Log::D("Checksum: %d", header.checksum);
+	
+	m_entries = new ArchiveEntry[header.entries_count];
+	m_entries_count = header.entries_count;
+	
+	// Read the entries
+	m_archive_file->read(m_entries, m_entries_count * sizeof(ArchiveEntry));
+}
+
+//-----------------------------------------------------------------------------
+ArchiveResourceArchive::~ArchiveResourceArchive()
+{
+	if (m_archive_file != NULL)
+	{
+			m_filesystem.close(m_archive_file);
+	}
+	
+	if (m_entries != NULL)
+	{
+		delete[] m_entries;
+	}
+	
+	m_entries = NULL;
+	m_entries_count = 0;
+}
+
+//-----------------------------------------------------------------------------
+FileStream* ArchiveResourceArchive::find(ResourceId name)
+{
+	// Search the resource in the archive
+	for (uint32_t i = 0; i < m_entries_count; i++)
+	{		
+		if (m_entries[i].name == name.name && m_entries[i].type == name.type)
+		{
+			// If found, seek to the first byte of the resource data
+			m_archive_file->seek(m_entries[i].offset);
+
+			return (FileStream*)m_archive_file;
+		}
+	}
+
+	return NULL;
+}
+
+} // namespace crown

+ 76 - 0
src/ArchiveResourceArchive.h

@@ -0,0 +1,76 @@
+/*
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include "Types.h"
+#include "ResourceArchive.h"
+
+namespace crown
+{
+
+class Filesystem;
+class FileStream;
+
+/// Structure of the archive
+///
+/// [ArchiveHeader]
+/// [ArchiveEntry]
+/// [ArchiveEntry]
+/// ...
+/// [ArchiveEntry]
+/// [ResourceData]
+/// [ResourceData]
+/// ...
+/// [ResourceData]
+///
+/// A valid archive must always have at least the archive header,
+/// starting at byte 0 of the archive file.
+///
+/// Newer archive versions must be totally backward compatible
+/// across minor engine releases, in order to be able to use
+/// recent version of the engine with older game archives.
+
+/// Source of resources
+class ArchiveResourceArchive : public ResourceArchive
+{
+public:
+
+					ArchiveResourceArchive(Filesystem& fs);
+					~ArchiveResourceArchive();
+
+	FileStream*		find(ResourceId name);
+
+private:
+
+	Filesystem&		m_filesystem;
+
+	FileStream*		m_archive_file;
+
+	uint32_t		m_entries_count;
+	ArchiveEntry*	m_entries;
+};
+
+} // namespace crown

+ 75 - 0
src/FileResourceArchive.cpp

@@ -0,0 +1,75 @@
+/*
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <cstdio>
+#include "FileResourceArchive.h"
+#include "Filesystem.h"
+#include "Resource.h"
+#include "FileStream.h"
+#include "Log.h"
+#include "String.h"
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+FileResourceArchive::FileResourceArchive(Filesystem& fs) :
+	m_filesystem(fs)
+{
+}
+
+//-----------------------------------------------------------------------------
+FileResourceArchive::~FileResourceArchive()
+{
+}
+
+//-----------------------------------------------------------------------------
+FileStream* FileResourceArchive::find(ResourceId name)
+{
+	// Convert name/type into strings
+	char name_string[512];
+	char type_string[512];
+
+	// FIXME
+	snprintf(name_string, 512, "%X", name.name);
+	snprintf(type_string, 512, "%X", name.type);
+
+	string::strncat(name_string, type_string, 512);
+
+	// Search the resource in the filesystem
+	if (m_filesystem.exists(name_string) == false)
+	{
+		return NULL;
+	}
+
+	FileStream* file = (FileStream*)m_filesystem.open(name_string, SOM_READ);
+	file->skip(sizeof(ArchiveEntry));
+
+	return file;
+
+	// FIXME NEED TO RELEASE MEMORY FOR file
+}
+
+} // namespace crown

+ 52 - 0
src/FileResourceArchive.h

@@ -0,0 +1,52 @@
+/*
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include "Types.h"
+#include "ResourceArchive.h"
+
+namespace crown
+{
+
+class Filesystem;
+class FileStream;
+
+/// Source of resources
+class FileResourceArchive : public ResourceArchive
+{
+public:
+
+					FileResourceArchive(Filesystem& fs);
+					~FileResourceArchive();
+
+	FileStream*		find(ResourceId name);
+
+private:
+
+	Filesystem&		m_filesystem;
+};
+
+} // namespace crown