AssetEnumerator.cpp
Go to the documentation of this file.00001 //*** AssetEnumerator.cpp *** 00002 00003 #include "AssetEnumerator.h" 00004 #include "Debug.h" 00005 #include "Platform_FileSystem.h" 00006 #include "Platform_FileSystem_Directory.h" 00007 #include "Archive.h" 00008 #include "ArchiveDirectory.h" 00009 #include "Asset.h" 00010 #include "StandardLibrary.h" 00011 #include "ArchiveManager.h" 00012 #include "Filename.h" 00013 00014 //*** Constructor *** 00015 00016 AssetEnumerator::AssetEnumerator(const Filename& filename): 00017 directory_(0), 00018 archiveDirectory_(0), 00019 nameBuffer_(0), 00020 nameBufferSize_(0) 00021 { 00022 CreateFromFilename(filename); 00023 } 00024 00025 00026 //*** Constructor *** 00027 00028 AssetEnumerator::AssetEnumerator(const StringId& filenameId): 00029 directory_(0), 00030 archiveDirectory_(0), 00031 nameBuffer_(0), 00032 nameBufferSize_(0) 00033 { 00034 Filename filename(filenameId); 00035 CreateFromFilename(filename); 00036 } 00037 00038 00039 //*** Constructor *** 00040 00041 AssetEnumerator::AssetEnumerator(const char* filenameStr): 00042 directory_(0), 00043 archiveDirectory_(0), 00044 nameBuffer_(0), 00045 nameBufferSize_(0) 00046 { 00047 Filename filename(filenameStr); 00048 CreateFromFilename(filename); 00049 } 00050 00051 00052 //*** CreateFromFilename *** 00053 00054 void AssetEnumerator::CreateFromFilename(const Filename& filename) 00055 { 00056 // First, try and get the directory from the archive manager, if it is present 00057 if (ArchiveManager::IsInstanceCreated()) 00058 { 00059 archiveDirectory_=siArchiveManager->GetDirectory(filename.GetStringId()); 00060 } 00061 00062 // If we couldn't get the directory from the archive manager, try to get it from the file system, if it is present 00063 if (!archiveDirectory_ && Platform::GetPlatform_FileSystem()) 00064 { 00065 directory_=Platform::GetPlatform_FileSystem()->CreateDirectoryObject(filename.GetString()); 00066 } 00067 00068 // If we couldn't get the directory from neither the archive manager nor the filesystem, we trigger an assert for 00069 // debug builds, and just reports the directory as being empty for release builds. 00070 Assert(archiveDirectory_ || directory_, 00071 "Error creating AssetEnumerator - No filesystem or archive manager present, or directory not found."); 00072 } 00073 00074 00075 //*** Destructor *** 00076 00077 AssetEnumerator::~AssetEnumerator() 00078 { 00079 if (directory_) 00080 { 00081 delete directory_; 00082 } 00083 if (nameBuffer_) 00084 { 00085 delete nameBuffer_; 00086 } 00087 } 00088 00089 00090 //*** Copy Constructor *** 00091 00092 AssetEnumerator::AssetEnumerator(const AssetEnumerator& assetEnumerator): 00093 directory_(0), 00094 archiveDirectory_(assetEnumerator.archiveDirectory_), 00095 nameBuffer_(0), 00096 nameBufferSize_(0) 00097 { 00098 if (assetEnumerator.directory_ && Platform::GetPlatform_FileSystem()) 00099 { 00100 directory_=Platform::GetPlatform_FileSystem()->CreateDirectoryObject(assetEnumerator.directory_->GetPath()); 00101 } 00102 } 00103 00104 00105 //*** Copy Operator *** 00106 00107 const AssetEnumerator& AssetEnumerator::operator=(const AssetEnumerator& assetEnumerator) 00108 { 00109 if (directory_) 00110 { 00111 delete directory_; 00112 directory_=0; 00113 } 00114 00115 if (assetEnumerator.directory_ && Platform::GetPlatform_FileSystem()) 00116 { 00117 directory_=Platform::GetPlatform_FileSystem()->CreateDirectoryObject(assetEnumerator.directory_->GetPath()); 00118 } 00119 00120 archiveDirectory_=assetEnumerator.archiveDirectory_; 00121 00122 return *this; 00123 } 00124 00125 00126 //*** GetAssetCount *** 00127 00128 int AssetEnumerator::GetAssetCount() 00129 { 00130 if (directory_) 00131 { 00132 return directory_->GetFileCount(); 00133 } 00134 00135 if (archiveDirectory_) 00136 { 00137 return archiveDirectory_->GetFileCount(); 00138 } 00139 00140 return 0; 00141 } 00142 00143 00144 //*** GetAssetFilename *** 00145 00146 const char* AssetEnumerator::GetAssetFilename(int index) 00147 { 00148 if (directory_) 00149 { 00150 const char* filename=directory_->GetFile(index); 00151 int size=StrLen(directory_->GetPath())+StrLen(filename)+2; 00152 if (!nameBuffer_ || nameBufferSize_<size) 00153 { 00154 if (nameBuffer_) 00155 { 00156 delete nameBuffer_; 00157 } 00158 nameBufferSize_=size; 00159 nameBuffer_=new char[nameBufferSize_]; 00160 } 00161 SNPrintF(nameBuffer_,nameBufferSize_,"%s/%s",directory_->GetPath(), filename); 00162 return nameBuffer_; 00163 } 00164 00165 if (archiveDirectory_) 00166 { 00167 return archiveDirectory_->GetFile(index).GetString(); 00168 } 00169 00170 return 0; 00171 } 00172 00173 00174 //*** GetSubdirectoryCount *** 00175 00176 int AssetEnumerator::GetSubdirectoryCount() 00177 { 00178 if (directory_) 00179 { 00180 return directory_->GetSubdirectoryCount(); 00181 } 00182 00183 if (archiveDirectory_) 00184 { 00185 return archiveDirectory_->GetSubdirectoryCount(); 00186 } 00187 00188 return 0; 00189 } 00190 00191 00192 //*** GetSubdirectoryName *** 00193 00194 const char* AssetEnumerator::GetSubdirectoryName(int index) 00195 { 00196 if (directory_) 00197 { 00198 const char* dirname=directory_->GetSubdirectory(index); 00199 int size=StrLen(directory_->GetPath())+StrLen(dirname)+2; 00200 if (!nameBuffer_ || nameBufferSize_<size) 00201 { 00202 if (nameBuffer_) 00203 { 00204 delete nameBuffer_; 00205 } 00206 nameBufferSize_=size; 00207 nameBuffer_=new char[nameBufferSize_]; 00208 } 00209 SNPrintF(nameBuffer_,nameBufferSize_,"%s/%s",directory_->GetPath(), dirname); 00210 return nameBuffer_; 00211 } 00212 00213 00214 if (archiveDirectory_) 00215 { 00216 return archiveDirectory_->GetSubdirectory(index).GetString(); 00217 } 00218 00219 return 0; 00220 }
Reproduction/republishing of any material on this site without permission is strictly prohibited.
