mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
99 lines
2.4 KiB
C++
99 lines
2.4 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
/**
|
||
|
* Utility class for providing some basic capabilities for enumerating and specifying MOD
|
||
|
* directories.
|
||
|
*
|
||
|
* \version 1.0
|
||
|
*
|
||
|
* \date 07-18-2006
|
||
|
*
|
||
|
* \author mdurand
|
||
|
*
|
||
|
* \todo
|
||
|
*
|
||
|
* \bug
|
||
|
*
|
||
|
*/
|
||
|
#include "ModConfigsHelper.h"
|
||
|
#include <windows.h>
|
||
|
|
||
|
ModConfigsHelper::ModConfigsHelper()
|
||
|
{
|
||
|
setSourceModBaseDir();
|
||
|
EnumerateModDirs();
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Default destructor.
|
||
|
*/
|
||
|
ModConfigsHelper::~ModConfigsHelper()
|
||
|
{
|
||
|
// Empty the vector of directory names
|
||
|
m_ModDirs.PurgeAndDeleteElements();
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Getter method that provides the parent directory for all MODs.
|
||
|
* \return parent directory for all MODs
|
||
|
*/
|
||
|
const char *ModConfigsHelper::getSourceModBaseDir()
|
||
|
{
|
||
|
return m_sourceModBaseDir;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Getter method that provides a vector of the names of each MOD found.
|
||
|
* \return vector of the names of each MOD found
|
||
|
*/
|
||
|
const CUtlVector<char *> &ModConfigsHelper::getModDirsVector()
|
||
|
{
|
||
|
return m_ModDirs;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Determines and sets the base directory for all MODs
|
||
|
*/
|
||
|
void ModConfigsHelper::setSourceModBaseDir()
|
||
|
{
|
||
|
Q_strncpy( m_sourceModBaseDir, GetSDKLauncherBaseDirectory(), sizeof( m_sourceModBaseDir) ); // Start with the base directory
|
||
|
Q_StripLastDir( m_sourceModBaseDir, sizeof( m_sourceModBaseDir ) ); // Get rid of the 'sourcesdk' directory.
|
||
|
Q_StripLastDir( m_sourceModBaseDir, sizeof( m_sourceModBaseDir ) ); // Get rid of the '%USER%' directory.
|
||
|
Q_strncat( m_sourceModBaseDir, "SourceMods", sizeof( m_sourceModBaseDir ), COPY_ALL_CHARACTERS ); // Add 'SourceMods'
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Searches the parent MOD directory for child MODs and puts their names in the member vector
|
||
|
*/
|
||
|
void ModConfigsHelper::EnumerateModDirs()
|
||
|
{
|
||
|
char szWildCardPath[MAX_PATH];
|
||
|
WIN32_FIND_DATA wfd;
|
||
|
|
||
|
Q_strncpy( szWildCardPath, m_sourceModBaseDir, sizeof( szWildCardPath ) );
|
||
|
Q_AppendSlash( szWildCardPath, sizeof( szWildCardPath ) );
|
||
|
Q_strncat( szWildCardPath, "*.*", sizeof( szWildCardPath ), COPY_ALL_CHARACTERS );
|
||
|
|
||
|
HANDLE ff = FindFirstFile( szWildCardPath, &wfd );
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
|
||
|
{
|
||
|
if ( wfd.cFileName[ 0 ] == '.' )
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// They are directories not named '.' or '..' so add them to the list of mod directories
|
||
|
char *dirName = new char[ strlen( wfd.cFileName ) + 1 ];
|
||
|
Q_strncpy( dirName, wfd.cFileName, strlen( wfd.cFileName ) + 1 );
|
||
|
m_ModDirs.AddToTail( dirName );
|
||
|
}
|
||
|
}
|
||
|
} while ( FindNextFile( ff, &wfd ) );
|
||
|
}
|