diff --git a/Source/Core/DiscIO/Src/FileMonitor.cpp b/Source/Core/DiscIO/Src/FileMonitor.cpp index 06f4a7b789..7cccf15487 100644 --- a/Source/Core/DiscIO/Src/FileMonitor.cpp +++ b/Source/Core/DiscIO/Src/FileMonitor.cpp @@ -95,7 +95,7 @@ void ReadGC(std::string FileName) } // Check if we should play this file -void CheckFile(std::string File, int Size) +void CheckFile(std::string File, u64 Size) { // Don't do anything if the log is unselected if (!LogManager::GetInstance()->isEnable(LogTypes::FILEMON)) return; diff --git a/Source/Core/DiscIO/Src/FileMonitor.h b/Source/Core/DiscIO/Src/FileMonitor.h index a54cd544e0..eba6d0fe02 100644 --- a/Source/Core/DiscIO/Src/FileMonitor.h +++ b/Source/Core/DiscIO/Src/FileMonitor.h @@ -26,8 +26,8 @@ namespace FileMon void ShowSound(std::string File); void ReadGC(std::string File); -void CheckFile(std::string File, int Size); +void CheckFile(std::string File, u64 Size); void FindFilename(u64 Offset); void Close(); -} +} diff --git a/Source/Core/VideoCommon/Src/VideoConfig.cpp b/Source/Core/VideoCommon/Src/VideoConfig.cpp index a956a53cf2..0b97e604a2 100644 --- a/Source/Core/VideoCommon/Src/VideoConfig.cpp +++ b/Source/Core/VideoCommon/Src/VideoConfig.cpp @@ -113,37 +113,37 @@ void VideoConfig::GameIniLoad(const char *ini_file) iniFile.Load(ini_file); if (iniFile.Exists("Video", "ForceFiltering")) - iniFile.Get("Video", "ForceFiltering", &bForceFiltering, 0); + iniFile.Get("Video", "ForceFiltering", &bForceFiltering); if (iniFile.Exists("Video", "MaxAnisotropy")) - iniFile.Get("Video", "MaxAnisotropy", &iMaxAnisotropy, 3); // NOTE - this is x in (1 << x) + iniFile.Get("Video", "MaxAnisotropy", &iMaxAnisotropy); // NOTE - this is x in (1 << x) if (iniFile.Exists("Video", "EFBCopyDisable")) - iniFile.Get("Video", "EFBCopyDisable", &bEFBCopyDisable, 0); + iniFile.Get("Video", "EFBCopyDisable", &bEFBCopyDisable); if (iniFile.Exists("Video", "EFBCopyDisableHotKey")) - iniFile.Get("Video", "EFBCopyDisableHotKey", &bOSDHotKey, 0); + iniFile.Get("Video", "EFBCopyDisableHotKey", &bOSDHotKey); if (iniFile.Exists("Video", "EFBToTextureEnable")) - iniFile.Get("Video", "EFBToTextureEnable", &bCopyEFBToTexture, 0); + iniFile.Get("Video", "EFBToTextureEnable", &bCopyEFBToTexture); if (iniFile.Exists("Video", "EFBScaledCopy")) - iniFile.Get("Video", "EFBScaledCopy", &bCopyEFBScaled, 0); + iniFile.Get("Video", "EFBScaledCopy", &bCopyEFBScaled); if (iniFile.Exists("Video", "SafeTextureCache")) - iniFile.Get("Video", "SafeTextureCache", &bSafeTextureCache, false); + iniFile.Get("Video", "SafeTextureCache", &bSafeTextureCache); //Safe texture cache params if (iniFile.Exists("Video", "SafeTextureCacheColorSamples")) - iniFile.Get("Video", "SafeTextureCacheColorSamples", &iSafeTextureCache_ColorSamples,512); + iniFile.Get("Video", "SafeTextureCacheColorSamples", &iSafeTextureCache_ColorSamples); if (iniFile.Exists("Video", "MSAA")) - iniFile.Get("Video", "MSAA", &iMultisampleMode, 0); + iniFile.Get("Video", "MSAA", &iMultisampleMode); if (iniFile.Exists("Video", "DstAlphaPass")) - iniFile.Get("Video", "DstAlphaPass", &bDstAlphaPass, false); + iniFile.Get("Video", "DstAlphaPass", &bDstAlphaPass); if (iniFile.Exists("Video", "UseXFB")) - iniFile.Get("Video", "UseXFB", &bUseXFB, 0); + iniFile.Get("Video", "UseXFB", &bUseXFB); if (iniFile.Exists("Video", "UseRealXFB")) - iniFile.Get("Video", "UseRealXFB", &bUseRealXFB, 0); + iniFile.Get("Video", "UseRealXFB", &bUseRealXFB); if (iniFile.Exists("Video", "FIFOBPHack")) - iniFile.Get("Video", "FIFOBPHack", &bFIFOBPhack, false); + iniFile.Get("Video", "FIFOBPHack", &bFIFOBPhack); if (iniFile.Exists("Video", "ProjectionHack")) - iniFile.Get("Video", "ProjectionHack", &iPhackvalue, 0); + iniFile.Get("Video", "ProjectionHack", &iPhackvalue); if (iniFile.Exists("Video", "UseNativeMips")) - iniFile.Get("Video", "UseNativeMips", &bUseNativeMips, true); + iniFile.Get("Video", "UseNativeMips", &bUseNativeMips); } void VideoConfig::Save(const char *ini_file) diff --git a/Source/Plugins/InputPluginCommon/InputPluginCommon.vcproj b/Source/Plugins/InputPluginCommon/InputPluginCommon.vcproj index d7df1fea37..11642d9962 100644 --- a/Source/Plugins/InputPluginCommon/InputPluginCommon.vcproj +++ b/Source/Plugins/InputPluginCommon/InputPluginCommon.vcproj @@ -1,7 +1,7 @@ - - - - diff --git a/Source/Plugins/InputPluginCommon/Src/Config.cpp b/Source/Plugins/InputPluginCommon/Src/Config.cpp index 417867c175..656752edd4 100644 --- a/Source/Plugins/InputPluginCommon/Src/Config.cpp +++ b/Source/Plugins/InputPluginCommon/Src/Config.cpp @@ -1,6 +1,7 @@ #include "Config.h" + Plugin::Plugin( const char* const _ini_name, const char* const _gui_name, const char* const _profile_name ) : ini_name(_ini_name) , gui_name(_gui_name) @@ -26,32 +27,26 @@ Plugin::~Plugin() void Plugin::LoadConfig() { IniFile inifile; - - std::ifstream file; - file.open( (std::string(File::GetUserPath(D_CONFIG_IDX)) + ini_name + ".ini" ).c_str() ); - inifile.Load( file ); - file.close(); + inifile.Load(std::string(File::GetUserPath(D_CONFIG_IDX)) + ini_name + ".ini"); std::vector< ControllerEmu* >::const_iterator i = controllers.begin(), e = controllers.end(); - for ( ; i!=e; ++i ) - (*i)->LoadConfig( inifile[ (*i)->GetName() ] ); + for ( ; i!=e; ++i ) { + (*i)->LoadConfig(inifile.GetOrCreateSection((*i)->GetName().c_str())); + } } void Plugin::SaveConfig() { + std::string ini_filename = (std::string(File::GetUserPath(D_CONFIG_IDX)) + ini_name + ".ini" ); + IniFile inifile; + inifile.Load(ini_filename); std::vector< ControllerEmu* >::const_iterator i = controllers.begin(), e = controllers.end(); for ( ; i!=e; ++i ) - (*i)->SaveConfig( inifile[ (*i)->GetName() ] ); + (*i)->SaveConfig(inifile.GetOrCreateSection((*i)->GetName().c_str())); - // dont need to save empty values - //inifile.Clean(); - - std::ofstream file; - file.open( (std::string(File::GetUserPath(D_CONFIG_IDX)) + ini_name + ".ini" ).c_str() ); - inifile.Save( file ); - file.close(); + inifile.Save(ini_filename); } diff --git a/Source/Plugins/InputPluginCommon/Src/ConfigDiag.cpp b/Source/Plugins/InputPluginCommon/Src/ConfigDiag.cpp index fa6e490c3b..ace72a812f 100644 --- a/Source/Plugins/InputPluginCommon/Src/ConfigDiag.cpp +++ b/Source/Plugins/InputPluginCommon/Src/ConfigDiag.cpp @@ -283,12 +283,12 @@ void GamepadPage::ClearAll( wxCommandEvent& event ) g_plugin->controls_crit.Enter(); // enter // just load an empty ini section to clear everything :P - IniSection section; - controller->LoadConfig( section ); + IniFile::Section section; + controller->LoadConfig(§ion); // no point in using the real ControllerInterface i guess ControllerInterface face; - controller->UpdateReferences( face ); + controller->UpdateReferences(face); UpdateGUI(); @@ -524,7 +524,6 @@ void GamepadPage::LoadProfile( wxCommandEvent& event ) g_plugin->controls_crit.Enter(); - std::ifstream file; std::string fname( File::GetUserPath(D_CONFIG_IDX) ); fname += PROFILES_PATH; fname += g_plugin->profile_name; fname += '/'; fname += profile_cbox->GetValue().ToAscii(); fname += ".ini"; @@ -532,16 +531,12 @@ void GamepadPage::LoadProfile( wxCommandEvent& event ) if ( false == File::Exists( fname.c_str() ) ) return; - file.open( fname.c_str() ); IniFile inifile; - inifile.Load( file ); - controller->LoadConfig( inifile["Profile"] ); - file.close(); - + inifile.Load(fname); + controller->LoadConfig( inifile.GetOrCreateSection("Profile")); controller->UpdateReferences( g_plugin->controller_interface ); g_plugin->controls_crit.Leave(); - UpdateGUI(); } @@ -551,21 +546,17 @@ void GamepadPage::SaveProfile( wxCommandEvent& event ) if ( profile_cbox->GetValue().empty() ) return; - // don't need lock - IniFile inifile; - controller->SaveConfig( inifile["Profile"] ); - std::ofstream file; std::string fname( File::GetUserPath(D_CONFIG_IDX) ); fname += PROFILES_PATH; fname += g_plugin->profile_name; fname += '/'; - if ( false == File::Exists( fname.c_str() ) ) File::CreateFullPath( fname.c_str() ); - fname += profile_cbox->GetValue().ToAscii(); fname += ".ini"; - file.open( fname.c_str() ); - inifile.Save( file ); - file.close(); + // don't need lock + IniFile inifile; + inifile.Load(fname); + controller->SaveConfig( inifile.GetOrCreateSection("Profile") ); + inifile.Save(fname); m_config_dialog->UpdateProfileComboBox(); } diff --git a/Source/Plugins/InputPluginCommon/Src/ControllerEmu.cpp b/Source/Plugins/InputPluginCommon/Src/ControllerEmu.cpp index 6422f59eb4..a333d3b4c8 100644 --- a/Source/Plugins/InputPluginCommon/Src/ControllerEmu.cpp +++ b/Source/Plugins/InputPluginCommon/Src/ControllerEmu.cpp @@ -98,7 +98,7 @@ void ControllerEmu::UpdateDefaultDevice() } } -void ControllerEmu::ControlGroup::LoadConfig( IniFile::Section& sec, const std::string& defdev, const std::string& base ) +void ControllerEmu::ControlGroup::LoadConfig(IniFile::Section *sec, const std::string& defdev, const std::string& base ) { std::string group( base + name ); group += "/"; @@ -107,7 +107,7 @@ void ControllerEmu::ControlGroup::LoadConfig( IniFile::Section& sec, const std:: si = settings.begin(), se = settings.end(); for ( ; si!=se; ++si ) - (*si)->value = sec.Get(group+(*si)->name, (*si)->default_value*100) / 100; + (*si)->value = sec->Get((group+(*si)->name).c_str(), (*si)->default_value*100) / 100; // controls std::vector::const_iterator @@ -116,16 +116,17 @@ void ControllerEmu::ControlGroup::LoadConfig( IniFile::Section& sec, const std:: for ( ; ci!=ce; ++ci ) { // control and dev qualifier - (*ci)->control_ref->control_qualifier.name = sec[group + (*ci)->name]; - (*ci)->control_ref->device_qualifier.FromString( sec.Get( group+(*ci)->name+"/Device", defdev ) ); + (*ci)->control_ref->control_qualifier.name = sec->Get((group + (*ci)->name).c_str(), ""); + (*ci)->control_ref->device_qualifier.FromString( + sec->Get((group+(*ci)->name+"/Device").c_str(), defdev.c_str() ) ); // range - (*ci)->control_ref->range = sec.Get( group+(*ci)->name+"/Range", 100.0f ) / 100; + (*ci)->control_ref->range = sec->Get( (group+(*ci)->name+"/Range").c_str(), 100.0f ) / 100; // input mode if ( (*ci)->control_ref->is_input ) ((ControllerInterface::InputReference*)((*ci)->control_ref))->mode - = sec.Get( group+(*ci)->name+"/Mode", 0 ); + = sec->Get( (group+(*ci)->name+"/Mode").c_str(), 0 ); } // extensions @@ -135,7 +136,7 @@ void ControllerEmu::ControlGroup::LoadConfig( IniFile::Section& sec, const std:: ex->switch_extension = 0; unsigned int n = 0; - const std::string extname = sec[ base + name ]; + const std::string extname = sec->Get((base + name).c_str(), ""); std::vector::const_iterator ai = ((Extension*)this)->attachments.begin(), @@ -151,22 +152,21 @@ void ControllerEmu::ControlGroup::LoadConfig( IniFile::Section& sec, const std:: } } -void ControllerEmu::LoadConfig( IniFile::Section& sec, const std::string& base ) +void ControllerEmu::LoadConfig( IniFile::Section *sec, const std::string& base ) { std::string defdev = default_device.ToString(); - if ( base.empty() ) + if (base.empty()) { - defdev = sec[ base + "Device" ]; - default_device.FromString( defdev ); + defdev = sec->Get((base + "Device").c_str(), ""); + default_device.FromString(defdev); } - std::vector::const_iterator i = groups.begin(), e = groups.end(); for ( ; i!=e; ++i ) - (*i)->LoadConfig( sec, defdev, base ); + (*i)->LoadConfig(sec, defdev, base); } -void ControllerEmu::ControlGroup::SaveConfig( IniFile::Section& sec, const std::string& defdev, const std::string& base ) +void ControllerEmu::ControlGroup::SaveConfig( IniFile::Section *sec, const std::string& defdev, const std::string& base ) { std::string group( base + name ); group += "/"; @@ -175,7 +175,7 @@ void ControllerEmu::ControlGroup::SaveConfig( IniFile::Section& sec, const std:: si = settings.begin(), se = settings.end(); for ( ; si!=se; ++si ) - sec.Set( group+(*si)->name, (*si)->value*100, (*si)->default_value*100 ); + sec->Set( (group+(*si)->name).c_str(), (*si)->value*100.0f); // controls std::vector::const_iterator @@ -184,23 +184,23 @@ void ControllerEmu::ControlGroup::SaveConfig( IniFile::Section& sec, const std:: for ( ; ci!=ce; ++ci ) { // control and dev qualifier - sec.Set( group+(*ci)->name, (*ci)->control_ref->control_qualifier.name ); - sec.Set( group+(*ci)->name+"/Device", (*ci)->control_ref->device_qualifier.ToString(), defdev ); + sec->Set( (group+(*ci)->name).c_str(), (*ci)->control_ref->control_qualifier.name ); + sec->Set( (group+(*ci)->name+"/Device").c_str(), (*ci)->control_ref->device_qualifier.ToString()); // range - sec.Set( group+(*ci)->name+"/Range", (*ci)->control_ref->range*100, 100 ); + sec->Set( (group+(*ci)->name+"/Range").c_str(), (*ci)->control_ref->range*100.0f); // input mode if ( (*ci)->control_ref->is_input ) - sec.Set( group+(*ci)->name+"/Mode", - ((ControllerInterface::InputReference*)((*ci)->control_ref))->mode, (unsigned int)0 ); + sec->Set( (group+(*ci)->name+"/Mode").c_str(), + ((ControllerInterface::InputReference*)((*ci)->control_ref))->mode); } // extensions if ( GROUP_TYPE_EXTENSION == type ) { Extension* const ext = ((Extension*)this); - sec.Set( base + name, ext->attachments[ext->switch_extension]->GetName(), std::string("None") ); + sec->Set((base + name).c_str(), ext->attachments[ext->switch_extension]->GetName()); std::vector::const_iterator ai = ((Extension*)this)->attachments.begin(), @@ -210,11 +210,11 @@ void ControllerEmu::ControlGroup::SaveConfig( IniFile::Section& sec, const std:: } } -void ControllerEmu::SaveConfig( IniFile::Section& sec, const std::string& base ) +void ControllerEmu::SaveConfig( IniFile::Section *sec, const std::string& base ) { const std::string defdev = default_device.ToString(); if ( base.empty() ) - sec.Set( std::string(" ") + base + "Device", defdev ); + sec->Set( std::string(" ") + base + "Device", defdev ); std::vector::const_iterator i = groups.begin(), e = groups.end(); diff --git a/Source/Plugins/InputPluginCommon/Src/ControllerEmu.h b/Source/Plugins/InputPluginCommon/Src/ControllerEmu.h index d5eeee962d..ee4b689356 100644 --- a/Source/Plugins/InputPluginCommon/Src/ControllerEmu.h +++ b/Source/Plugins/InputPluginCommon/Src/ControllerEmu.h @@ -101,8 +101,8 @@ public: ControlGroup( const char* const _name, const unsigned int _type = GROUP_TYPE_OTHER ) : name(_name), type(_type) {} virtual ~ControlGroup(); - void LoadConfig( IniFile::Section& sec, const std::string& defdev = "", const std::string& base = "" ); - void SaveConfig( IniFile::Section& sec, const std::string& defdev = "", const std::string& base = "" ); + void LoadConfig(IniFile::Section *sec, const std::string& defdev = "", const std::string& base = "" ); + void SaveConfig(IniFile::Section *sec, const std::string& defdev = "", const std::string& base = "" ); const char* const name; const unsigned int type; @@ -382,8 +382,8 @@ public: virtual std::string GetName() const = 0; - void LoadConfig( IniFile::Section& sec, const std::string& base = "" ); - void SaveConfig( IniFile::Section& sec, const std::string& base = "" ); + void LoadConfig(IniFile::Section *sec, const std::string& base = ""); + void SaveConfig(IniFile::Section *sec, const std::string& base = ""); void UpdateDefaultDevice(); void UpdateReferences( ControllerInterface& devi ); diff --git a/Source/Plugins/InputPluginCommon/Src/IniFile.cpp b/Source/Plugins/InputPluginCommon/Src/IniFile.cpp deleted file mode 100644 index 0f10b25452..0000000000 --- a/Source/Plugins/InputPluginCommon/Src/IniFile.cpp +++ /dev/null @@ -1,156 +0,0 @@ - -#include "IniFile.h" - -// -// TrimChars -// -// trim whitespace, or any, chars from both ends -// -template -std::string TrimChars( const std::string& str, const S space ) -{ - const size_t start = str.find_first_not_of( space ); - - if ( str.npos == start ) - return ""; - - return str.substr( start, str.find_last_not_of( space ) - start + 1 ); -} - -// -// IniSection :: Set -// -// set key's value if it doesn't match the default -// otherwise remove the key from the section if it exists -// -void IniSection::Set( const std::string& key, const std::string& val, const std::string& def ) -{ - if ( val != def ) - operator[](key) = val; - else - { - iterator f = find(key); - if ( f != end() ) - erase( f ); - } -} - -// -// IniSection :: Get -// -// return a key's value if it exists -// otherwise return the default -// -std::string IniSection::Get( const std::string& key, const std::string& def ) -{ - const const_iterator f = find(key); - if ( f != end() ) - if ( false == f->second.empty() ) - return f->second; - return def; -} - -// -// IniFile :: Save -// -// save a file -// -void IniFile::Save( std::ostream& file ) -{ - const_iterator i = begin(), - e = end(); - for ( ; i != e; ++i ) - { - // skip a line at new sections - file << "\n[" << i->first << "]\n"; - Section::const_iterator si = i->second.begin(), - se = i->second.end(); - for ( ; si != se; ++si ) - { - file << si->first << " = "; - // if value has quotes or whitespace, surround it with quotes - if (si->second.find_first_of("\"\t ") != std::string::npos) - file << '"' << si->second << '"'; - else - file << si->second; - file << '\n'; - } - } -} - -// -// IniFile :: Load -// -// load a file -// -void IniFile::Load( std::istream& file ) -{ - const char* const space = "\t\r "; - std::string line; - // start off with an empty section - Section* section = &(*this)[""]; - while ( std::getline( file, line ).good() ) // read a line - { - line = TrimChars(line,space); - if ( line.size() ) - { - switch ( line[0] ) - { - // comment - case '#' : - case ';' : - break; - // section - case '[' : - // kinda odd trimming - section = &(*this)[ TrimChars(line,"][\t\r ") ]; - break; - // key/value - default : - { - std::istringstream ss(line); - std::string key; std::getline( ss, key, '=' ); - std::string val; std::getline( ss, val ); - val = TrimChars(val,space); - // handle quote surrounded values - if (val.length() > 1) - if ('"' == val[0]) - val = val.substr(1, val.length()-2); - - (*section)[ TrimChars(key,space) ] = val; - break; - } - } - } - } - Clean(); -} - -// -// IniFile :: Clean -// -// remove empty key/values and sections -// after trying to access ini sections/values, they are automatically allocated -// this deletes the empty stuff -// -void IniFile::Clean() -{ - iterator i = begin(), - e = end(); - for ( ; i != e; ) - { - Section::iterator si = i->second.begin(), - se = i->second.end(); - for ( ; si != se; ) - { - if ( si->second.empty() ) - i->second.erase( si++ ); - else - ++si; - } - if ( i->second.empty() ) - erase( i++ ); - else - ++i; - } -} diff --git a/Source/Plugins/InputPluginCommon/Src/IniFile.h b/Source/Plugins/InputPluginCommon/Src/IniFile.h deleted file mode 100644 index 583a87bdd1..0000000000 --- a/Source/Plugins/InputPluginCommon/Src/IniFile.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _INIFILE_H_ -#define _INIFILE_H_ - -#include -#include -#include -#include - -// -// IniFile -// -class IniSection : public std::map< std::string, std::string > -{ -public: - void Set( const std::string& key, const std::string& val, const std::string& def = "" ); - std::string Get( const std::string& key, const std::string& def = "" ); - - template - void Set( const std::string& key, const V& val, const D& def = 0 ) - { - if ( val != def ) - { - std::ostringstream ss; - ss << long(val); - operator[](key) = ss.str(); - } - else - { - iterator f = find(key); - if ( f != end() ) - erase( f ); - } - } - template - V Get( const std::string& key, const V& def = 0 ) - { - const const_iterator f = find(key); - if ( f != end() ) - if ( false == f->second.empty() ) - { - std::istringstream ss(f->second); - int val; - ss >> val; - return V(val); - } - return def; - } -}; - -class IniFile : public std::map< std::string, IniSection > -{ -public: - typedef IniSection Section; - - void Clean(); - void Save( std::ostream& file ); - void Load( std::istream& file ); -}; - - -#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index c28b99e778..77a6fd2b54 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -418,7 +418,7 @@ bool OpenGL_MakeCurrent() #elif defined(__APPLE__) cocoaGLMakeCurrent(GLWin.cocoaCtx,GLWin.cocoaWin); #elif defined(_WIN32) - return wglMakeCurrent(hDC,hRC); + return wglMakeCurrent(hDC,hRC) ? true : false; #elif defined(HAVE_X11) && HAVE_X11 g_VideoInitialize.pRequestWindowSize(GLWin.x, GLWin.y, (int&)GLWin.width, (int&)GLWin.height); XMoveResizeWindow(GLWin.dpy, GLWin.win, GLWin.x, GLWin.y, GLWin.width, GLWin.height); diff --git a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/EmuSubroutines.cpp b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/EmuSubroutines.cpp index 0a11b0533b..93e654f643 100644 --- a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/EmuSubroutines.cpp +++ b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/EmuSubroutines.cpp @@ -31,6 +31,7 @@ #include #include +#include #include "Common.h" // Common #include "FileUtil.h"