LoadEditFromBuffer and friends (analogs of NotesLoaderSM calls)

This commit is contained in:
Glenn Maynard
2005-08-11 23:29:47 +00:00
parent 4ca6bf6282
commit 453de64456
2 changed files with 83 additions and 49 deletions
+79 -49
View File
@@ -16,52 +16,15 @@
const int MAX_EDIT_COURSE_SIZE_BYTES = 30*1024; // 30KB const int MAX_EDIT_COURSE_SIZE_BYTES = 30*1024; // 30KB
bool CourseLoaderCRS::LoadFromCRSFile( const CString &_sPath, Course &out ) bool CourseLoaderCRS::LoadFromBuffer( const CString &sPath, const CString &sBuffer, Course &out )
{ {
CString sPath = _sPath;
out.Init();
out.m_sPath = sPath; // save path
// save group name
{
CStringArray parts;
split( sPath, "/", parts, false );
if( parts.size() >= 4 ) // e.g. "/Courses/blah/fun.cvs"
out.m_sGroupName = parts[parts.size()-2];
}
bool bUseCache = true;
{
/* First look in the cache for this course. Don't bother
* honoring FastLoad for checking the course hash, since
* courses are normally grouped into a few directories, not
* one directory per course. XXX: if !FastLoad, regen
* cache if the used songs have changed */
unsigned uHash = SONGINDEX->GetCacheHash( out.m_sPath );
if( !DoesFileExist(out.GetCacheFilePath()) )
bUseCache = false;
if( !PREFSMAN->m_bFastLoad && GetHashForDirectory(out.m_sPath) != uHash )
bUseCache = false; // this cache is out of date
}
if( bUseCache )
{
CString sCacheFile = out.GetCacheFilePath();
LOG->Trace( "CourseLoaderCRS::LoadFromCRSFile(\"%s\") (\"%s\")", sPath.c_str(), sCacheFile.c_str() );
sPath = sCacheFile.c_str();
}
else
{
LOG->Trace( "CourseLoaderCRS::LoadFromCRSFile(\"%s\")", sPath.c_str() );
}
MsdFile msd; MsdFile msd;
if( !msd.ReadFile(sPath) ) msd.ReadFromString( sBuffer );
RageException::Throw( "Error opening CRS file '%s'.", sPath.c_str() ); return LoadFromMsd( sPath, msd, out, true );
}
bool CourseLoaderCRS::LoadFromMsd( const CString &sPath, const MsdFile &msd, Course &out, bool bFromCache )
{
const CString sFName = SetExtension( out.m_sPath, "" ); const CString sFName = SetExtension( out.m_sPath, "" );
CStringArray arrayPossibleBanners; CStringArray arrayPossibleBanners;
@@ -269,7 +232,7 @@ bool CourseLoaderCRS::LoadFromCRSFile( const CString &_sPath, Course &out )
out.m_vEntries.push_back( new_entry ); out.m_vEntries.push_back( new_entry );
} }
else if( bUseCache && !stricmp(sValueName, "RADAR") ) else if( bFromCache && !stricmp(sValueName, "RADAR") )
{ {
StepsType st = (StepsType) atoi(sParams[1]); StepsType st = (StepsType) atoi(sParams[1]);
CourseDifficulty cd = (CourseDifficulty) atoi(sParams[2]); CourseDifficulty cd = (CourseDifficulty) atoi(sParams[2]);
@@ -299,10 +262,63 @@ bool CourseLoaderCRS::LoadFromCRSFile( const CString &_sPath, Course &out )
/* Cache each trail RadarValues that's slow to load, so we /* Cache each trail RadarValues that's slow to load, so we
* don't have to do it at runtime. */ * don't have to do it at runtime. */
if( !bUseCache ) if( !bFromCache )
{
out.CalculateRadarValues(); out.CalculateRadarValues();
return true;
}
bool CourseLoaderCRS::LoadFromCRSFile( const CString &_sPath, Course &out )
{
CString sPath = _sPath;
out.Init();
out.m_sPath = sPath; // save path
// save group name
{
CStringArray parts;
split( sPath, "/", parts, false );
if( parts.size() >= 4 ) // e.g. "/Courses/blah/fun.cvs"
out.m_sGroupName = parts[parts.size()-2];
}
bool bUseCache = true;
{
/* First look in the cache for this course. Don't bother
* honoring FastLoad for checking the course hash, since
* courses are normally grouped into a few directories, not
* one directory per course. XXX: if !FastLoad, regen
* cache if the used songs have changed */
unsigned uHash = SONGINDEX->GetCacheHash( out.m_sPath );
if( !DoesFileExist(out.GetCacheFilePath()) )
bUseCache = false;
if( !PREFSMAN->m_bFastLoad && GetHashForDirectory(out.m_sPath) != uHash )
bUseCache = false; // this cache is out of date
}
if( bUseCache )
{
CString sCacheFile = out.GetCacheFilePath();
LOG->Trace( "CourseLoaderCRS::LoadFromCRSFile(\"%s\") (\"%s\")", sPath.c_str(), sCacheFile.c_str() );
sPath = sCacheFile.c_str();
}
else
{
LOG->Trace( "CourseLoaderCRS::LoadFromCRSFile(\"%s\")", sPath.c_str() );
}
MsdFile msd;
if( !msd.ReadFile(sPath) )
RageException::Throw( "Error opening CRS file '%s'.", sPath.c_str() );
if( !LoadFromMsd(sPath, msd, out, bUseCache) )
return false;
if( !bUseCache )
{
/* If we have any cache data, write the cache file. */ /* If we have any cache data, write the cache file. */
if( out.m_RadarCache.size() ) if( out.m_RadarCache.size() )
{ {
@@ -327,13 +343,27 @@ bool CourseLoaderCRS::LoadEdit( const CString &sEditFilePath, ProfileSlot slot )
return false; return false;
} }
Course *pCourse = new Course;
LoadFromCRSFile( sEditFilePath, *pCourse );
MsdFile msd; MsdFile msd;
if( !msd.ReadFile( sEditFilePath ) ) if( !msd.ReadFile( sEditFilePath ) )
{ {
LOG->Warn( "Error opening edit file \"%s\": %s", sEditFilePath.c_str(), msd.GetError().c_str() ); LOG->Warn( "Error opening edit file \"%s\": %s", sEditFilePath.c_str(), msd.GetError().c_str() );
SAFE_DELETE( pCourse ); return false;
}
Course *pCourse = new Course;
LoadFromMsd( sEditFilePath, msd, *pCourse, true );
pCourse->m_LoadedFromProfile = slot;
SONGMAN->AddCourse( pCourse );
return true;
}
bool CourseLoaderCRS::LoadEditFromBuffer( const CString &sBuffer, const CString &sPath, ProfileSlot slot )
{
Course *pCourse = new Course;
if( !LoadFromBuffer(sPath, sBuffer, *pCourse) )
{
delete pCourse;
return false; return false;
} }
+4
View File
@@ -5,12 +5,16 @@
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
class Course; class Course;
class MsdFile;
class CourseLoaderCRS class CourseLoaderCRS
{ {
public: public:
static bool LoadFromCRSFile( const CString &sPath, Course &out ); static bool LoadFromCRSFile( const CString &sPath, Course &out );
static bool LoadFromMsd( const CString &sPath, const MsdFile &msd, Course &out, bool bFromCache );
static bool LoadFromBuffer( const CString &sPath, const CString &sBuffer, Course &out );
static bool LoadEdit( const CString &sEditFilePath, ProfileSlot slot ); static bool LoadEdit( const CString &sEditFilePath, ProfileSlot slot );
static bool LoadEditFromBuffer( const CString &sBuffer, const CString &sPath, ProfileSlot slot );
}; };
#endif #endif