34 :
category(trackCategory ? trackCategory :
""),
35 name(trackName ? trackName :
"")
56 if (!category || !category[0] || !trackName || !trackName[0] || !trackFile || trackFileSize <= 0) {
60 const int written = snprintf(trackFile, trackFileSize,
"tracks/%s/%s/%s.%s", category, trackName, trackName, TRKEXT);
61 return written >= 0 && written < trackFileSize;
66ReTrackFileExists(
const char *category,
const char *trackName,
char *trackFile,
int trackFileSize)
68 const int BUFSIZE = 1024;
69 char localTrackFile[BUFSIZE];
70 char *fileName = trackFile ? trackFile : localTrackFile;
71 const int fileNameSize = trackFile ? trackFileSize : BUFSIZE;
87std::vector<tReTrackCandidate>
90 std::vector<tReTrackCandidate> tracks;
97 tFList *category = categoryList;
99 const int BUFSIZE = 1024;
101 snprintf(path, BUFSIZE,
"tracks/%s", category->
name);
111 }
while (
track != trackList);
116 category = category->
next;
117 }
while (category != categoryList);
132 selection->
name.clear();
135 if (availableTracks.empty()) {
139 const int BUFSIZE = 1024;
149 for (std::vector<tReTrackCandidate>::const_iterator it = availableTracks.begin(); it != availableTracks.end(); ++it) {
150 if (it->category.empty() || it->name.empty()) {
158 if (currentCategory[0] && it->category == currentCategory && !firstSameCategoryTrack) {
159 firstSameCategoryTrack = &(*it);
162 if (currentCategory[0] && currentTrack[0] && it->category == currentCategory && it->name == currentTrack) {
163 selectedTrack = &(*it);
168 if (!selectedTrack) {
169 selectedTrack = firstSameCategoryTrack ? firstSameCategoryTrack : firstTrack;
172 if (!selectedTrack) {
177 selection->
name = selectedTrack->
name;
178 selection->
fallback = currentCategory[0] == 0 || currentTrack[0] == 0 || selection->
category != currentCategory || selection->
name != currentTrack;
180 if (selection->
fallback && updateParams && params) {
void GfDirFreeList(tFList *list, tfDirfreeUserData freeUserData, bool freename, bool freedispname)
Free a directory list.
tFList * GfDirGetList(const char *dir)
Get the list of files of a given directory.
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
int GfParmSetStr(void *handle, const char *path, const char *key, const char *val)
Set a string parameter in the parameter set handle.
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
bool ReResolveTrackSelection(void *params, int curTrackIndex, const std::vector< tReTrackCandidate > &availableTracks, tReTrackSelection *selection, bool updateParams)
Resolve the current race-manager track entry to an available track.
std::vector< tReTrackCandidate > ReFindAvailableTracks(void)
Find all available tracks under the current TORCS track search path.
bool ReTrackFileExists(const char *category, const char *trackName, char *trackFile, int trackFileSize)
Check whether a track XML file exists and can be parsed.
static bool reBuildTrackFileName(const char *category, const char *trackName, char *trackFile, int trackFileSize)
Build the track XML path for a category/name pair.
Helpers for selecting a valid race-manager track.
struct FList * next
Next entry.
Track directory pair that can be selected by a race manager.
tReTrackCandidate(const char *trackCategory, const char *trackName)
Build a track candidate from category and track directory names.
std::string name
Track directory and XML base name.
std::string category
Track category directory name.
Result of resolving a race-manager track selection.
tReTrackSelection()
Create an empty selection result.
std::string name
Selected track directory and XML base name.
std::string category
Selected track category directory name.
bool fallback
true if the configured track was replaced by a fallback
#define GFPARM_RMODE_STD
Return a new handle sharing cached data for this filename, if available.
struct FList tFList
List of (DLL) files for a Directory.
#define GFPARM_RMODE_PRIVATE
Private means the handle is not shared/cached.
int track(tModInfo *modInfo)