text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: 
  //
  // $NoKeywords: $
  //=============================================================================//
  
  #undef fopen
  
  #ifdef _XBOX
  #include "xbox/xbox_platform.h"
  #include "xbox/xbox_win32stubs.h"
  #endif
  
  #if !defined( _X360 )
  #include <windows.h>
  #endif
  #include <stdio.h>
  
  #include "ChangeGameDialog.h"
  #include "ModInfo.h"
  #include "EngineInterface.h"
  
  #include <vgui_controls/ListPanel.h>
  #include <KeyValues.h>
  
  // memdbgon must be the last include file in a .cpp file!!!
  #include <tier0/memdbgon.h>
  
  using namespace vgui;
  
  //-----------------------------------------------------------------------------
  // Purpose: Constructor
  //-----------------------------------------------------------------------------
  CChangeGameDialog::CChangeGameDialog(vgui::Panel *parent) : Frame(parent, "ChangeGameDialog")
  {
  	SetSize(400, 340);
  	SetMinimumSize(400, 340);
  	SetTitle("#GameUI_ChangeGame", true);
  
  	m_pModList = new ListPanel(this, "ModList");
  	m_pModList->SetEmptyListText("#GameUI_NoOtherGamesAvailable");
  	m_pModList->AddColumnHeader(0, "ModName", "#GameUI_Game", 128);
  
  	LoadModList();
  	LoadControlSettings("Resource/ChangeGameDialog.res");
  
  	// if there's a mod in the list, select the first one
  	if (m_pModList->GetItemCount() > 0)
  	{
  		m_pModList->SetSingleSelectedItem(m_pModList->GetItemIDFromRow(0));
  	}
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: Destructor
  //-----------------------------------------------------------------------------
  CChangeGameDialog::~CChangeGameDialog()
  {
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: Fills the mod list
  //-----------------------------------------------------------------------------
  void CChangeGameDialog::LoadModList()
  {
  	// look for third party games
  	char szSearchPath[_MAX_PATH + 5];
  	Q_strncpy(szSearchPath, "*.*", sizeof( szSearchPath ) );
  
  	// use local filesystem since it has to look outside path system, and will never be used under steam
  	WIN32_FIND_DATA wfd;
  	HANDLE hResult;
  	memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
  	
  	hResult = FindFirstFile( szSearchPath, &wfd);
  	if (hResult != INVALID_HANDLE_VALUE)
  	{
  		BOOL bMoreFiles;
  		while (1)
  		{
  			if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (Q_strnicmp(wfd.cFileName, ".", 1)))
  			{
  				// Check for dlls\*.dll
  				char szDllDirectory[MAX_PATH + 16];
  				Q_snprintf(szDllDirectory, sizeof( szDllDirectory ), "%s\\gameinfo.txt", wfd.cFileName);
  
  				FILE *f = fopen(szDllDirectory, "rb");
  				if (f)
  				{
  					// find the description
  					fseek(f, 0, SEEK_END);
  					unsigned int size = ftell(f);
  					fseek(f, 0, SEEK_SET);
  					char *buf = (char *)malloc(size + 1);
  					if (fread(buf, 1, size, f) == size)
  					{
  						buf[size] = 0;
  
  						CModInfo modInfo;
  						modInfo.LoadGameInfoFromBuffer(buf);
  
  						if (strcmp(modInfo.GetGameName(), ModInfo().GetGameName()))
  						{
  							// Add the game directory.
  							strlwr(wfd.cFileName);
  							KeyValues *itemData = new KeyValues("Mod");
  							itemData->SetString("ModName", modInfo.GetGameName());
  							itemData->SetString("ModDir", wfd.cFileName);
  							m_pModList->AddItem(itemData, 0, false, false);
  						}
  					}
  					free(buf);
  					fclose(f);
  				}
  			}
  			bMoreFiles = FindNextFile(hResult, &wfd);
  			if (!bMoreFiles)
  				break;
  		}
  		
  		FindClose(hResult);
  	}
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  //-----------------------------------------------------------------------------
  void CChangeGameDialog::OnCommand(const char *command)
  {
  	if (!stricmp(command, "OK"))
  	{
  		if (m_pModList->GetSelectedItemsCount() > 0)
  		{
  			KeyValues *kv = m_pModList->GetItem(m_pModList->GetSelectedItem(0));
  			if (kv)
  			{
  				// change the game dir and restart the engine
  				char szCmd[256];
  				Q_snprintf(szCmd, sizeof( szCmd ), "_setgamedir %s\n", kv->GetString("ModDir"));
  				engine->ClientCmd_Unrestricted(szCmd);
  
  				// Force restart of entire engine
  				engine->ClientCmd_Unrestricted("_restart\n");
  			}
  		}
  	}
  	else if (!stricmp(command, "Cancel"))
  	{
  		Close();
  	}
  	else
  	{
  		BaseClass::OnCommand(command);
  	}
  }
  
  
  
  
  
  
  