1: /***********************************************************************
2: filename: CEGUIDefaultResourceProvider.cpp
3: created: 8/7/2004
4: author: James '_mental_' O'Sullivan
5:
6: purpose: Implements the Resource Manager common functionality
7: *************************************************************************/
8: /***************************************************************************
9: * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
10: *
11: * Permission is hereby granted, free of charge, to any person obtaining
12: * a copy of this software and associated documentation files (the
13: * "Software"), to deal in the Software without restriction, including
14: * without limitation the rights to use, copy, modify, merge, publish,
15: * distribute, sublicense, and/or sell copies of the Software, and to
16: * permit persons to whom the Software is furnished to do so, subject to
17: * the following conditions:
18: *
19: * The above copyright notice and this permission notice shall be
20: * included in all copies or substantial portions of the Software.
21: *
22: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25: * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
26: * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27: * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28: * OTHER DEALINGS IN THE SOFTWARE.
29: ***************************************************************************/
30: #include "CEGUIDefaultResourceProvider.h"
31: #include "CEGUIExceptions.h"
32:
33: #include
34: #include
35:
36: // Start of CEGUI namespace section
37: namespace CEGUI
38: {
39:
40: void DefaultResourceProvider::loadRawDataContainer(const String& filename, RawDataContainer& output, const String& resourceGroup)
41: {
42: if (filename.empty())
43: {
44: throw InvalidRequestException(
45: "DefaultResourceProvider::load - Filename supplied for data loading must be valid");
46: }
47:
48: String final_filename(getFinalFilename(filename, resourceGroup));
49:
50: std::ifstream dataFile(final_filename.c_str(), std::ios::binary|std::ios::ate);
51: if( dataFile.fail())
52: {
53: throw InvalidRequestException(
54: "DefaultResourceProvider::load - " + filename + " does not exist");
55: }
56: std::streampos size = dataFile.tellg();
57: dataFile.seekg (0, std::ios::beg);
58:
59: unsigned char* buffer = new unsigned char [size];
60:
61: try {
62: dataFile.read(reinterpret_cast<char*>(buffer), size);
63: }
64: catch(std::ifstream::failure e) {
65: delete [] buffer;
66: throw GenericException(
67: "DefaultResourceProvider::loadRawDataContainer - Problem reading " + filename);
68: }
69:
70: dataFile.close();
71:
72: output.setData(buffer);
73: output.setSize(size);
74: }
75:
76: void DefaultResourceProvider::unloadRawDataContainer(RawDataContainer& data)
77: {
78: uint8* ptr = data.getDataPtr();
79: delete [] ptr;
80: data.setData(0);
81: data.setSize(0);
82: }
83:
84: void DefaultResourceProvider::setResourceGroupDirectory(const String& resourceGroup, const String& directory)
85: {
86: d_resourceGroups[resourceGroup] = directory;
87: }
88:
89: const String& DefaultResourceProvider::getResourceGroupDirectory(const String& resourceGroup)
90: {
91: return d_resourceGroups[resourceGroup];
92: }
93:
94: void DefaultResourceProvider::clearResourceGroupDirectory(const String& resourceGroup)
95: {
96: ResourceGroupMap::iterator iter = d_resourceGroups.find(resourceGroup);
97:
98: if (iter != d_resourceGroups.end())
99: d_resourceGroups.erase(iter);
100: }
101:
102: String DefaultResourceProvider::getFinalFilename(const String& filename, const String& resourceGroup) const
103: {
104: String final_filename;
105:
106: // look up resource group directory
107: ResourceGroupMap::const_iterator iter =
108: d_resourceGroups.find(resourceGroup.empty() ? d_defaultResourceGroup : resourceGroup);
109:
110: // if there was an entry for this group, use it's directory as the
111: // first part of the filename
112: if (iter != d_resourceGroups.end())
113: final_filename = (*iter).second;
114:
115: // append the filename part that we were passed
116: final_filename += filename;
117:
118: // return result
119: return final_filename;
120: }
121:
122: } // End of CEGUI namespace section