| 1 | cycrow | 1 | #include "..\StdAfx.h"
 | 
        
           |  |  | 2 | #include "..\listviewsorter.h"
 | 
        
           |  |  | 3 |   | 
        
           |  |  | 4 | #include "PackageBrowser.h"
 | 
        
           |  |  | 5 | #include "CheckUpdate.h"
 | 
        
           |  |  | 6 | #include "MainGui.h"
 | 
        
           |  |  | 7 |   | 
        
           |  |  | 8 | using namespace System::IO;
 | 
        
           |  |  | 9 |   | 
        
           |  |  | 10 | #undef GetTempPath
 | 
        
           |  |  | 11 | #undef GetCurrentDirectory
 | 
        
           |  |  | 12 |   | 
        
           |  |  | 13 | namespace PluginManager {
 | 
        
           |  |  | 14 |   | 
        
           |  |  | 15 | 	void PackageBrowser::FindPackages_Files(System::String ^dir)
 | 
        
           |  |  | 16 | 	{
 | 
        
           |  |  | 17 | 		for ( int type = 0; type < 2; type++ )
 | 
        
           |  |  | 18 | 		{
 | 
        
           |  |  | 19 | 			array <System::String ^> ^Files = nullptr;
 | 
        
           |  |  | 20 | 			if ( type == 0 )
 | 
        
           |  |  | 21 | 				Files = Directory::GetFiles(dir, "*.spk");
 | 
        
           |  |  | 22 | 			else if ( type == 1 )
 | 
        
           |  |  | 23 | 				Files = Directory::GetFiles(dir, "*.xsp");
 | 
        
           |  |  | 24 | 			else
 | 
        
           |  |  | 25 | 				break;
 | 
        
           |  |  | 26 |   | 
        
           |  |  | 27 | 			for ( int i = 0; i < Files->Length; i++ )
 | 
        
           |  |  | 28 | 			{
 | 
        
           |  |  | 29 | 				CyString file = CyStringFromSystemString(Files[i]);
 | 
        
           |  |  | 30 | 				int error = 0;
 | 
        
           |  |  | 31 | 				CBaseFile *p = m_pPackages->OpenPackage(file, &error, 0, SPKREAD_NODATA);
 | 
        
           |  |  | 32 | 				if ( !p )
 | 
        
           |  |  | 33 | 					continue;
 | 
        
           |  |  | 34 | 				if ( p->IsMod() || m_pPackages->FindSpkPackage(p->GetName(), p->GetAuthor()) )
 | 
        
           |  |  | 35 | 				{
 | 
        
           |  |  | 36 | 					delete p;
 | 
        
           |  |  | 37 | 					continue;
 | 
        
           |  |  | 38 | 				}
 | 
        
           |  |  | 39 |   | 
        
           |  |  | 40 | 				// check its for the correct game
 | 
        
           |  |  | 41 | 				if ( !p->CheckGameCompatability(m_pPackages->GetGame()) )
 | 
        
           |  |  | 42 | 				{
 | 
        
           |  |  | 43 | 					delete p;
 | 
        
           |  |  | 44 | 					continue;
 | 
        
           |  |  | 45 | 				}
 | 
        
           |  |  | 46 |   | 
        
           |  |  | 47 | 				// check if its already on the list
 | 
        
           |  |  | 48 | 				bool found = false;
 | 
        
           |  |  | 49 | 				for ( CBaseFile *checkp = m_lAvailablePackages->First(); checkp; checkp = m_lAvailablePackages->Next() )
 | 
        
           |  |  | 50 | 				{
 | 
        
           |  |  | 51 | 					if ( p->GetName().Compare(checkp->GetName()) && p->GetAuthor().Compare(checkp->GetAuthor()) )
 | 
        
           |  |  | 52 | 					{
 | 
        
           |  |  | 53 | 						found = true;
 | 
        
           |  |  | 54 | 						break;
 | 
        
           |  |  | 55 | 					}
 | 
        
           |  |  | 56 | 				}
 | 
        
           |  |  | 57 |   | 
        
           |  |  | 58 | 				if ( found )
 | 
        
           |  |  | 59 | 				{
 | 
        
           |  |  | 60 | 					delete p;
 | 
        
           |  |  | 61 | 					continue;
 | 
        
           |  |  | 62 | 				}
 | 
        
           |  |  | 63 |   | 
        
           |  |  | 64 | 				if ( p->GetIcon() )
 | 
        
           |  |  | 65 | 				{
 | 
        
           |  |  | 66 | 					bool addedIcon = false;
 | 
        
           |  |  | 67 | 					p->ReadIconFileToMemory();
 | 
        
           |  |  | 68 | 					p->GetIcon()->SetFilename(m_pPackages->GetTempDirectory().FindReplace("\\", "/") + "/" + p->GetAuthor() + "_" + p->GetName() + "." + p->GetIconExt());
 | 
        
           |  |  | 69 | 					p->GetIcon()->SetFullDir(m_pPackages->GetTempDirectory());
 | 
        
           |  |  | 70 | 					if ( p->GetIcon()->UncompressData() )
 | 
        
           |  |  | 71 | 					{
 | 
        
           |  |  | 72 | 						if ( p->GetIcon()->WriteFilePointer() )
 | 
        
           |  |  | 73 | 							addedIcon = true;
 | 
        
           |  |  | 74 | 					}
 | 
        
           |  |  | 75 |   | 
        
           |  |  | 76 | 					if ( !addedIcon )
 | 
        
           |  |  | 77 | 						p->SetIcon(NULL, "");
 | 
        
           |  |  | 78 | 				}
 | 
        
           |  |  | 79 |   | 
        
           |  |  | 80 | 				// get an advert to display
 | 
        
           |  |  | 81 | 				if ( p->GetFirstFile(FILETYPE_ADVERT) )
 | 
        
           |  |  | 82 | 				{
 | 
        
           |  |  | 83 | 					bool done = false;
 | 
        
           |  |  | 84 | 					C_File *f = p->GetFirstFile(FILETYPE_ADVERT);
 | 
        
           |  |  | 85 | 					if ( p->ReadFileToMemory(f) )
 | 
        
           |  |  | 86 | 					{
 | 
        
           |  |  | 87 | 						f->SetFullDir(m_pPackages->GetTempDirectory());
 | 
        
           |  |  | 88 | 						if ( f->UncompressData() )
 | 
        
           |  |  | 89 | 						{
 | 
        
           |  |  | 90 | 							if ( f->WriteFilePointer() )
 | 
        
           |  |  | 91 | 								done = true;
 | 
        
           |  |  | 92 | 						}
 | 
        
           |  |  | 93 | 					}
 | 
        
           |  |  | 94 |   | 
        
           |  |  | 95 | 					if ( !done )
 | 
        
           |  |  | 96 | 						f->DeleteData();
 | 
        
           |  |  | 97 | 				}
 | 
        
           |  |  | 98 |   | 
        
           |  |  | 99 | 				m_lAvailablePackages->push_back(p);				
 | 
        
           |  |  | 100 | 			}
 | 
        
           |  |  | 101 | 		}
 | 
        
           |  |  | 102 | 	}
 | 
        
           |  |  | 103 |   | 
        
           |  |  | 104 | 	bool PackageBrowser::AnyPackages()
 | 
        
           |  |  | 105 | 	{
 | 
        
           |  |  | 106 | 		if ( m_lAvailablePackages && m_lAvailablePackages->size() )
 | 
        
           |  |  | 107 | 			return true;
 | 
        
           |  |  | 108 | 		if ( m_pPackages->AnyAvailablePackages() )
 | 
        
           |  |  | 109 | 			return true;
 | 
        
           |  |  | 110 | 		return false;
 | 
        
           |  |  | 111 | 	}
 | 
        
           |  |  | 112 |   | 
        
           |  |  | 113 | 	void PackageBrowser::FindPackages_Directory(String ^dir)
 | 
        
           |  |  | 114 | 	{
 | 
        
           |  |  | 115 | 		if ( Directory::Exists(dir) )
 | 
        
           |  |  | 116 | 		{
 | 
        
           |  |  | 117 | 			this->FindPackages_Files(dir);
 | 
        
           |  |  | 118 |   | 
        
           |  |  | 119 | 			array <System::String ^> ^Dirs = Directory::GetDirectories(dir);
 | 
        
           |  |  | 120 | 			if ( Dirs )
 | 
        
           |  |  | 121 | 			{
 | 
        
           |  |  | 122 | 				for ( int i = 0; i < Dirs->Length; i++ )
 | 
        
           |  |  | 123 | 					this->FindPackages_Directory(Dirs[i]);
 | 
        
           |  |  | 124 | 			}
 | 
        
           |  |  | 125 | 		}
 | 
        
           |  |  | 126 | 	}
 | 
        
           |  |  | 127 |   | 
        
           |  |  | 128 | 	void PackageBrowser::FindPackages()
 | 
        
           |  |  | 129 | 	{
 | 
        
           |  |  | 130 | 		if ( !m_lAvailablePackages )
 | 
        
           |  |  | 131 | 			m_lAvailablePackages = new CLinkList<CBaseFile>;
 | 
        
           |  |  | 132 |   | 
        
           |  |  | 133 | 		String ^curDir = System::IO::FileInfo(System::Windows::Forms::Application::ExecutablePath).DirectoryName;
 | 
        
           |  |  | 134 | 		this->FindPackages_Directory(curDir + "\\Addons");
 | 
        
           |  |  | 135 | 		this->FindPackages_Directory(curDir + "\\Downloads");
 | 
        
           |  |  | 136 | 		this->FindPackages_Directory(".\\Addons");
 | 
        
           |  |  | 137 | 		this->FindPackages_Directory(".\\Downloads");
 | 
        
           |  |  | 138 | 		this->FindPackages_Directory(m_sCurrentDir + "\\Addons");
 | 
        
           |  |  | 139 | 		this->FindPackages_Directory(m_sCurrentDir + "\\Downloads");
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 | 		// find packages from registry key
 | 
        
           |  |  | 142 | 		RegistryKey ^searchKey = Registry::CurrentUser->OpenSubKey("Software\\Egosoft\\SuperBox");
 | 
        
           |  |  | 143 | 		if ( searchKey )
 | 
        
           |  |  | 144 | 		{
 | 
        
           |  |  | 145 | 			String ^dir = System::Convert::ToString(searchKey->GetValue("Addons"));
 | 
        
           |  |  | 146 | 			if ( dir )
 | 
        
           |  |  | 147 | 				this->FindPackages_Directory(dir);
 | 
        
           |  |  | 148 | 		}
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 | 		// find packages from DVD
 | 
        
           |  |  | 151 | 		cli::array<IO::DriveInfo ^> ^Drives = IO::DriveInfo::GetDrives();
 | 
        
           |  |  | 152 | 		if ( Drives )
 | 
        
           |  |  | 153 | 		{
 | 
        
           |  |  | 154 | 			for ( int i = 0; i < Drives->Length; i++ )
 | 
        
           |  |  | 155 | 			{
 | 
        
           |  |  | 156 | 				IO::DriveInfo ^info = Drives[i];
 | 
        
           |  |  | 157 | 				if ( info->DriveType != IO::DriveType::CDRom )
 | 
        
           |  |  | 158 | 					continue;
 | 
        
           |  |  | 159 | 				if ( info->IsReady )
 | 
        
           |  |  | 160 | 					this->FindPackages_Directory(info->RootDirectory + "XPluginManager");
 | 
        
           |  |  | 161 | 			}
 | 
        
           |  |  | 162 | 		}
 | 
        
           |  |  | 163 |   | 
        
           |  |  | 164 | 		// read all game directories extra content
 | 
        
           |  |  | 165 | 		this->FindPackages_Directory(SystemStringFromCyString(m_pPackages->GetCurrentDirectoryW().FindReplace("/","\\")) + "\\ExtraContent");
 | 
        
           |  |  | 166 |   | 
        
           |  |  | 167 |   | 
        
           |  |  | 168 | 		int num = 0;
 | 
        
           |  |  | 169 | 		for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
 | 
        
           |  |  | 170 | 		{
 | 
        
           |  |  | 171 | 			p->SetNum(num);
 | 
        
           |  |  | 172 | 			++num;
 | 
        
           |  |  | 173 | 		}
 | 
        
           |  |  | 174 | 	}
 | 
        
           |  |  | 175 |   | 
        
           |  |  | 176 | 	bool PackageBrowser::CheckValidPackage(CBaseFile *p)
 | 
        
           |  |  | 177 | 	{
 | 
        
           |  |  | 178 | 		if ( !p->CheckGameCompatability(m_pPackages->GetGame()) )
 | 
        
           |  |  | 179 | 			return false;
 | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 | 		if ( !this->CheckCheat->Checked && p->GetPluginType() == PLUGIN_CHEAT )
 | 
        
           |  |  | 182 | 			return false;
 | 
        
           |  |  | 183 | 		if ( !this->CheckExperimental->Checked && p->GetPluginType() == PLUGIN_EXPERIMENTAL )
 | 
        
           |  |  | 184 | 			return false;
 | 
        
           |  |  | 185 | 		if ( p->GetType() == TYPE_XSP && !this->CheckShips->Checked )
 | 
        
           |  |  | 186 | 			return false;
 | 
        
           |  |  | 187 | 		if ( this->CheckSigned->Checked && !p->IsSigned() )
 | 
        
           |  |  | 188 | 			return false;
 | 
        
           |  |  | 189 |   | 
        
           |  |  | 190 | 		return true;
 | 
        
           |  |  | 191 | 	}
 | 
        
           |  |  | 192 |   | 
        
           |  |  | 193 | 	bool PackageBrowser::CheckValidPackage(SAvailablePackage *p)
 | 
        
           |  |  | 194 | 	{
 | 
        
           |  |  | 195 | 		if ( p->iType == PACKAGETYPE_MOD )
 | 
        
           |  |  | 196 | 			return false;
 | 
        
           |  |  | 197 |   | 
        
           |  |  | 198 | 		if ( !p->lGames.empty() )
 | 
        
           |  |  | 199 | 		{
 | 
        
           |  |  | 200 | 			bool found = false;
 | 
        
           |  |  | 201 | 			for ( SGameCompat *gc = p->lGames.First(); gc; gc = p->lGames.Next() ) {
 | 
        
           |  |  | 202 | 				if ( gc->iGame == m_pPackages->GetGame() ) {
 | 
        
           |  |  | 203 | 					found = true;
 | 
        
           |  |  | 204 | 					break;
 | 
        
           |  |  | 205 | 				}
 | 
        
           |  |  | 206 | 			}
 | 
        
           |  |  | 207 |   | 
        
           |  |  | 208 | 			if ( !found )
 | 
        
           |  |  | 209 | 				return false;
 | 
        
           |  |  | 210 | 		}
 | 
        
           |  |  | 211 |   | 
        
           |  |  | 212 | 		if ( !this->CheckCheat->Checked && p->iPluginType == PLUGIN_CHEAT )
 | 
        
           |  |  | 213 | 			return false;
 | 
        
           |  |  | 214 | 		if ( !this->CheckExperimental->Checked && p->iPluginType == PLUGIN_EXPERIMENTAL )
 | 
        
           |  |  | 215 | 			return false;
 | 
        
           |  |  | 216 | 		if ( p->iType == PACKAGETYPE_SHIP && !this->CheckShips->Checked )
 | 
        
           |  |  | 217 | 			return false;
 | 
        
           |  |  | 218 | 		if ( this->CheckSigned->Checked && !p->bSigned )
 | 
        
           |  |  | 219 | 			return false;
 | 
        
           |  |  | 220 |   | 
        
           |  |  | 221 | 		return true;
 | 
        
           |  |  | 222 | 	}
 | 
        
           |  |  | 223 |   | 
        
           |  |  | 224 | 	ListViewItem ^PackageBrowser::CreateItem(CBaseFile *p)
 | 
        
           |  |  | 225 | 	{
 | 
        
           |  |  | 226 | 		ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())), -1);
 | 
        
           |  |  | 227 | 		item->SubItems->Add(SystemStringFromCyString(p->GetAuthor()));
 | 
        
           |  |  | 228 | 		item->SubItems->Add(SystemStringFromCyString(p->GetVersion()));
 | 
        
           |  |  | 229 | 		item->SubItems->Add(SystemStringFromCyString(p->GetCreationDate()));
 | 
        
           |  |  | 230 | 		if ( p->GetType() == TYPE_SPK )
 | 
        
           |  |  | 231 | 			item->SubItems->Add(SystemStringFromCyString(((CSpkFile *)p)->GetScriptTypeString(m_pPackages->GetLanguage())));
 | 
        
           |  |  | 232 | 		else if ( p->GetType() == TYPE_XSP )
 | 
        
           |  |  | 233 | 			item->SubItems->Add("Ship");
 | 
        
           |  |  | 234 |   | 
        
           |  |  | 235 | 		if ( p->IsSigned() )
 | 
        
           |  |  | 236 | 			item->SubItems->Add("Yes");
 | 
        
           |  |  | 237 | 		else
 | 
        
           |  |  | 238 | 			item->SubItems->Add("No");
 | 
        
           |  |  | 239 |   | 
        
           |  |  | 240 |   | 
        
           |  |  | 241 | 		return item;
 | 
        
           |  |  | 242 | 	}
 | 
        
           |  |  | 243 |   | 
        
           |  |  | 244 | 	ListViewItem ^PackageBrowser::CreateItem(SAvailablePackage *p)
 | 
        
           |  |  | 245 | 	{
 | 
        
           |  |  | 246 | 		ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(p->sName), -1);
 | 
        
           |  |  | 247 | 		item->SubItems->Add(SystemStringFromCyString(p->sAuthor));
 | 
        
           |  |  | 248 | 		item->SubItems->Add(SystemStringFromCyString(p->sVersion));
 | 
        
           |  |  | 249 | 		item->SubItems->Add(SystemStringFromCyString(p->sUpdated));
 | 
        
           |  |  | 250 |   | 
        
           |  |  | 251 | 		switch (p->iType)
 | 
        
           |  |  | 252 | 		{
 | 
        
           |  |  | 253 | 			case PACKAGETYPE_SHIP:
 | 
        
           |  |  | 254 | 				item->SubItems->Add("Ship");
 | 
        
           |  |  | 255 | 				break;
 | 
        
           |  |  | 256 | 			case PACKAGETYPE_LIBRARY:
 | 
        
           |  |  | 257 | 				item->SubItems->Add("Library");
 | 
        
           |  |  | 258 | 				break;
 | 
        
           |  |  | 259 | 			case PACKAGETYPE_CUSTOMSTART:
 | 
        
           |  |  | 260 | 				item->SubItems->Add("Custom Start");
 | 
        
           |  |  | 261 | 				break;
 | 
        
           |  |  | 262 | 			case PACKAGETYPE_PATCH:
 | 
        
           |  |  | 263 | 				item->SubItems->Add("Patch");
 | 
        
           |  |  | 264 | 				break;
 | 
        
           |  |  | 265 | 			case PACKAGETYPE_UPDATE:
 | 
        
           |  |  | 266 | 				item->SubItems->Add("Update");
 | 
        
           |  |  | 267 | 				break;
 | 
        
           |  |  | 268 | 			case PACKAGETYPE_MOD:
 | 
        
           |  |  | 269 | 				item->SubItems->Add("Mod");
 | 
        
           |  |  | 270 | 				break;
 | 
        
           |  |  | 271 | 			case PACKAGETYPE_FAKEPATCH:
 | 
        
           |  |  | 272 | 				item->SubItems->Add("Fake Patch");
 | 
        
           |  |  | 273 | 				break;
 | 
        
           |  |  | 274 | 			case PACKAGETYPE_NORMAL:
 | 
        
           |  |  | 275 | 				if ( p->iScriptType > 0 )
 | 
        
           |  |  | 276 | 					item->SubItems->Add(SystemStringFromCyString(CSpkFile::GetScriptTypeStringStatic(p->iScriptType)));
 | 
        
           |  |  | 277 | 				else
 | 
        
           |  |  | 278 | 					item->SubItems->Add("Package");
 | 
        
           |  |  | 279 | 				break;
 | 
        
           |  |  | 280 | 		}
 | 
        
           |  |  | 281 |   | 
        
           |  |  | 282 | 		if ( p->bSigned )
 | 
        
           |  |  | 283 | 			item->SubItems->Add("Yes");
 | 
        
           |  |  | 284 | 		else
 | 
        
           |  |  | 285 | 			item->SubItems->Add("No");
 | 
        
           |  |  | 286 |   | 
        
           |  |  | 287 | 		return item;
 | 
        
           |  |  | 288 | 	}
 | 
        
           |  |  | 289 |   | 
        
           |  |  | 290 | 	void PackageBrowser::UpdatePackages()
 | 
        
           |  |  | 291 | 	{
 | 
        
           |  |  | 292 | 		m_pPackages->AssignPackageNumbers();
 | 
        
           |  |  | 293 | 		ListPackages->Items->Clear();
 | 
        
           |  |  | 294 | 		ListPackages->Groups->Clear();
 | 
        
           |  |  | 295 |   | 
        
           |  |  | 296 | 		ListViewGroup ^gNormal = gcnew ListViewGroup("Normal", HorizontalAlignment::Left);
 | 
        
           |  |  | 297 | 		ListPackages->Groups->Add(gNormal);
 | 
        
           |  |  | 298 | 		ListViewGroup ^gStable = gcnew ListViewGroup("Stable", HorizontalAlignment::Left);
 | 
        
           |  |  | 299 | 		ListPackages->Groups->Add(gStable);
 | 
        
           |  |  | 300 | 		ListViewGroup ^gExperimental = gcnew ListViewGroup("Experimental", HorizontalAlignment::Left);
 | 
        
           |  |  | 301 | 		ListPackages->Groups->Add(gExperimental);
 | 
        
           |  |  | 302 | 		ListViewGroup ^gCheat = gcnew ListViewGroup("Cheat", HorizontalAlignment::Left);
 | 
        
           |  |  | 303 | 		ListPackages->Groups->Add(gCheat);
 | 
        
           |  |  | 304 | 		ListViewGroup ^gShip = gcnew ListViewGroup("Ships", HorizontalAlignment::Left);
 | 
        
           |  |  | 305 | 		ListPackages->Groups->Add(gShip);
 | 
        
           |  |  | 306 | 		ListViewGroup ^gMod = gcnew ListViewGroup("Mods", HorizontalAlignment::Left);
 | 
        
           |  |  | 307 | 		ListPackages->Groups->Add(gMod);
 | 
        
           |  |  | 308 |   | 
        
           |  |  | 309 | 		if ( m_lAvailablePackages )
 | 
        
           |  |  | 310 | 		{
 | 
        
           |  |  | 311 | 			for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
 | 
        
           |  |  | 312 | 			{
 | 
        
           |  |  | 313 | 				// check if its already installed
 | 
        
           |  |  | 314 | 				if ( m_pPackages->FindPackage(p) )
 | 
        
           |  |  | 315 | 					continue;
 | 
        
           |  |  | 316 |   | 
        
           |  |  | 317 | 				if ( !this->CheckValidPackage(p) )
 | 
        
           |  |  | 318 | 					continue;
 | 
        
           |  |  | 319 |   | 
        
           |  |  | 320 |   | 
        
           |  |  | 321 | 				ListViewItem ^item = this->CreateItem(p);
 | 
        
           |  |  | 322 | 				item->Group = gNormal;
 | 
        
           |  |  | 323 | 				if ( p->GetType() == TYPE_XSP )
 | 
        
           |  |  | 324 | 					item->Group = gShip;
 | 
        
           |  |  | 325 | 				else if ( p->GetType() == TYPE_SPK )
 | 
        
           |  |  | 326 | 				{
 | 
        
           |  |  | 327 | 					switch ( p->GetPluginType() )
 | 
        
           |  |  | 328 | 					{
 | 
        
           |  |  | 329 | 						case PLUGIN_STABLE:
 | 
        
           |  |  | 330 | 							item->Group = gStable;
 | 
        
           |  |  | 331 | 							break;
 | 
        
           |  |  | 332 | 						case PLUGIN_EXPERIMENTAL:
 | 
        
           |  |  | 333 | 							item->Group = gExperimental;
 | 
        
           |  |  | 334 | 							break;
 | 
        
           |  |  | 335 | 						case PLUGIN_CHEAT:
 | 
        
           |  |  | 336 | 							item->Group = gCheat;
 | 
        
           |  |  | 337 | 							break;
 | 
        
           |  |  | 338 | 						case PLUGIN_MOD:
 | 
        
           |  |  | 339 | 							item->Group = gMod;
 | 
        
           |  |  | 340 | 							break;
 | 
        
           |  |  | 341 | 					}
 | 
        
           |  |  | 342 | 				}
 | 
        
           |  |  | 343 |   | 
        
           |  |  | 344 | 				item->Tag = p->GetNum();
 | 
        
           |  |  | 345 | 				ListPackages->Items->Add(item);
 | 
        
           |  |  | 346 | 				if ( p->GetIcon() )
 | 
        
           |  |  | 347 | 					PluginManager::DisplayListIcon(p, ListPackages, item);
 | 
        
           |  |  | 348 | 				else
 | 
        
           |  |  | 349 | 				{
 | 
        
           |  |  | 350 | 					if ( p->GetType() == TYPE_XSP )
 | 
        
           |  |  | 351 | 						item->ImageIndex = this->imageList1->Images->IndexOfKey("ship.png");
 | 
        
           |  |  | 352 | 					else if ( p->IsMod() || p->IsFakePatch() )
 | 
        
           |  |  | 353 | 						item->ImageIndex = this->imageList1->Images->IndexOfKey("fake.png");
 | 
        
           |  |  | 354 | 					else if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsLibrary() )
 | 
        
           |  |  | 355 | 						item->ImageIndex = this->imageList1->Images->IndexOfKey("library.png");
 | 
        
           |  |  | 356 | 					else
 | 
        
           |  |  | 357 | 						item->ImageIndex = this->imageList1->Images->IndexOfKey("package.png");
 | 
        
           |  |  | 358 | 				}
 | 
        
           |  |  | 359 | 			}
 | 
        
           |  |  | 360 | 		}
 | 
        
           |  |  | 361 |   | 
        
           |  |  | 362 | 		if ( this->checkBox1->Checked )
 | 
        
           |  |  | 363 | 		{
 | 
        
           |  |  | 364 | 			for ( SAvailablePackage *p = m_pPackages->GetAvailablePackageList()->First(); p; p = m_pPackages->GetAvailablePackageList()->Next() )
 | 
        
           |  |  | 365 | 			{
 | 
        
           |  |  | 366 | 				if ( m_pPackages->FindPackage(p->sName, p->sAuthor) ) continue;
 | 
        
           |  |  | 367 | 				if ( !this->CheckValidPackage(p) ) continue;
 | 
        
           |  |  | 368 |   | 
        
           |  |  | 369 | 				ListViewItem ^item = this->CreateItem(p);
 | 
        
           |  |  | 370 | 				item->Group = gNormal;
 | 
        
           |  |  | 371 | 				if ( p->iType == PACKAGETYPE_SHIP )
 | 
        
           |  |  | 372 | 					item->Group = gShip;
 | 
        
           |  |  | 373 | 				else 
 | 
        
           |  |  | 374 | 				{
 | 
        
           |  |  | 375 | 					switch ( p->iPluginType )
 | 
        
           |  |  | 376 | 					{
 | 
        
           |  |  | 377 | 						case PLUGIN_STABLE:
 | 
        
           |  |  | 378 | 							item->Group = gStable;
 | 
        
           |  |  | 379 | 							break;
 | 
        
           |  |  | 380 | 						case PLUGIN_EXPERIMENTAL:
 | 
        
           |  |  | 381 | 							item->Group = gExperimental;
 | 
        
           |  |  | 382 | 							break;
 | 
        
           |  |  | 383 | 						case PLUGIN_CHEAT:
 | 
        
           |  |  | 384 | 							item->Group = gCheat;
 | 
        
           |  |  | 385 | 							break;
 | 
        
           |  |  | 386 | 						case PLUGIN_MOD:
 | 
        
           |  |  | 387 | 							item->Group = gMod;
 | 
        
           |  |  | 388 | 							break;
 | 
        
           |  |  | 389 | 					}
 | 
        
           |  |  | 390 | 				}
 | 
        
           |  |  | 391 |   | 
        
           |  |  | 392 | 				item->ImageIndex = this->imageList1->Images->IndexOfKey("download");
 | 
        
           |  |  | 393 |   | 
        
           |  |  | 394 |   | 
        
           |  |  | 395 | 				item->Tag = SystemStringFromCyString(p->sFilename);
 | 
        
           |  |  | 396 | 				ListPackages->Items->Add(item);
 | 
        
           |  |  | 397 | 			}
 | 
        
           |  |  | 398 | 		}
 | 
        
           |  |  | 399 |   | 
        
           |  |  | 400 | 		ListPackages->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
 | 
        
           |  |  | 401 | 		PackageSelected(ListPackages, gcnew System::EventArgs());
 | 
        
           |  |  | 402 | 	}
 | 
        
           |  |  | 403 |   | 
        
           |  |  | 404 | 	void PackageBrowser::RemovePackages()
 | 
        
           |  |  | 405 | 	{
 | 
        
           |  |  | 406 | 		if ( m_lAvailablePackages )
 | 
        
           |  |  | 407 | 		{
 | 
        
           |  |  | 408 | 			for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
 | 
        
           |  |  | 409 | 			{
 | 
        
           |  |  | 410 | 				if ( p->GetIcon() )
 | 
        
           |  |  | 411 | 					CFileIO(p->GetIcon()->GetFilePointer()).Remove();
 | 
        
           |  |  | 412 | 				delete p;
 | 
        
           |  |  | 413 | 			}
 | 
        
           |  |  | 414 | 			m_lAvailablePackages->destroy();
 | 
        
           |  |  | 415 | 			delete m_lAvailablePackages;
 | 
        
           |  |  | 416 | 		}
 | 
        
           |  |  | 417 | 		m_lAvailablePackages = NULL;
 | 
        
           |  |  | 418 | 	}
 | 
        
           |  |  | 419 |   | 
        
           |  |  | 420 | 	void PackageBrowser::UpdateControls()
 | 
        
           |  |  | 421 | 	{
 | 
        
           |  |  | 422 | 	}
 | 
        
           |  |  | 423 |   | 
        
           |  |  | 424 | 	void PackageBrowser::SetupEvents()
 | 
        
           |  |  | 425 | 	{
 | 
        
           |  |  | 426 | 		ListPackages->SelectedIndexChanged += gcnew EventHandler(this, &PluginManager::PackageBrowser::PackageSelected);
 | 
        
           |  |  | 427 | 		CheckCheat->Click += gcnew EventHandler(this, &PluginManager::PackageBrowser::CheckEvent);
 | 
        
           |  |  | 428 | 		CheckShips->Click += gcnew EventHandler(this, &PluginManager::PackageBrowser::CheckEvent);
 | 
        
           |  |  | 429 | 		CheckExperimental->Click += gcnew EventHandler(this, &PluginManager::PackageBrowser::CheckEvent);
 | 
        
           |  |  | 430 | 		this->ListPackages->ColumnClick += gcnew ColumnClickEventHandler(this, &PluginManager::PackageBrowser::SortList);
 | 
        
           |  |  | 431 | 	}
 | 
        
           |  |  | 432 |   | 
        
           |  |  | 433 | 	void PackageBrowser::UpdateRatings(bool clear, int ease, int change, int rec)
 | 
        
           |  |  | 434 | 	{
 | 
        
           |  |  | 435 | 		if ( clear )
 | 
        
           |  |  | 436 | 		{
 | 
        
           |  |  | 437 | 			LabRecNA->Hide();
 | 
        
           |  |  | 438 | 			LabChangeNA->Hide();
 | 
        
           |  |  | 439 | 			LabEaseNA->Hide();
 | 
        
           |  |  | 440 | 			PicEase1->Hide();
 | 
        
           |  |  | 441 | 			PicEase2->Hide();
 | 
        
           |  |  | 442 | 			PicEase3->Hide();
 | 
        
           |  |  | 443 | 			PicEase4->Hide();
 | 
        
           |  |  | 444 | 			PicEase5->Hide();
 | 
        
           |  |  | 445 | 			PicChange1->Hide();
 | 
        
           |  |  | 446 | 			PicChange2->Hide();
 | 
        
           |  |  | 447 | 			PicChange3->Hide();
 | 
        
           |  |  | 448 | 			PicChange4->Hide();
 | 
        
           |  |  | 449 | 			PicChange5->Hide();
 | 
        
           |  |  | 450 | 			PicRec1->Hide();
 | 
        
           |  |  | 451 | 			PicRec2->Hide();
 | 
        
           |  |  | 452 | 			PicRec3->Hide();
 | 
        
           |  |  | 453 | 			PicRec4->Hide();
 | 
        
           |  |  | 454 | 			PicRec5->Hide();
 | 
        
           |  |  | 455 | 		}
 | 
        
           |  |  | 456 |   | 
        
           |  |  | 457 | 		// ease of use rating
 | 
        
           |  |  | 458 | 		if ( ease < 1 )
 | 
        
           |  |  | 459 | 			LabEaseNA->Show();
 | 
        
           |  |  | 460 | 		if ( ease >= 1 )
 | 
        
           |  |  | 461 | 			PicEase1->Show();
 | 
        
           |  |  | 462 | 		if ( ease >= 2 )
 | 
        
           |  |  | 463 | 			PicEase2->Show();
 | 
        
           |  |  | 464 | 		if ( ease >= 3 )
 | 
        
           |  |  | 465 | 			PicEase3->Show();
 | 
        
           |  |  | 466 | 		if ( ease >= 4 )
 | 
        
           |  |  | 467 | 			PicEase4->Show();
 | 
        
           |  |  | 468 | 		if ( ease >= 5 )
 | 
        
           |  |  | 469 | 			PicEase5->Show();
 | 
        
           |  |  | 470 |   | 
        
           |  |  | 471 | 		// game changing rating
 | 
        
           |  |  | 472 | 		if ( change < 1 )
 | 
        
           |  |  | 473 | 			LabChangeNA->Show();
 | 
        
           |  |  | 474 | 		if ( change >= 1 )
 | 
        
           |  |  | 475 | 			PicChange1->Show();
 | 
        
           |  |  | 476 | 		if ( change >= 2 )
 | 
        
           |  |  | 477 | 			PicChange2->Show();
 | 
        
           |  |  | 478 | 		if ( change >= 3 )
 | 
        
           |  |  | 479 | 			PicChange3->Show();
 | 
        
           |  |  | 480 | 		if ( change >= 4 )
 | 
        
           |  |  | 481 | 			PicChange4->Show();
 | 
        
           |  |  | 482 | 		if ( change >= 5 )
 | 
        
           |  |  | 483 | 			PicChange5->Show();
 | 
        
           |  |  | 484 |   | 
        
           |  |  | 485 | 		// Recommanded rating
 | 
        
           |  |  | 486 | 		if ( rec < 1 )
 | 
        
           |  |  | 487 | 			LabRecNA->Show();
 | 
        
           |  |  | 488 | 		if ( rec >= 1 )
 | 
        
           |  |  | 489 | 			PicRec1->Show();
 | 
        
           |  |  | 490 | 		if ( rec >= 2 )
 | 
        
           |  |  | 491 | 			PicRec2->Show();
 | 
        
           |  |  | 492 | 		if ( rec >= 3 )
 | 
        
           |  |  | 493 | 			PicRec3->Show();
 | 
        
           |  |  | 494 | 		if ( rec >= 4 )
 | 
        
           |  |  | 495 | 			PicRec4->Show();
 | 
        
           |  |  | 496 | 		if ( rec >= 5 )
 | 
        
           |  |  | 497 | 			PicRec5->Show();
 | 
        
           |  |  | 498 | 	}
 | 
        
           |  |  | 499 |   | 
        
           |  |  | 500 | 	void PackageBrowser::PackageSelected(System::Object ^Sender, System::EventArgs ^E)
 | 
        
           |  |  | 501 | 	{
 | 
        
           |  |  | 502 | 		this->PictureBox->Image = nullptr;
 | 
        
           |  |  | 503 |   | 
        
           |  |  | 504 | 		UpdateRatings(true, -1, -1, -1);
 | 
        
           |  |  | 505 |   | 
        
           |  |  | 506 | 		this->button1->Visible = false;
 | 
        
           |  |  | 507 | 		bool enabled = false;
 | 
        
           |  |  | 508 | 		CBaseFile *p = NULL;
 | 
        
           |  |  | 509 | 		SAvailablePackage *ap = NULL;
 | 
        
           |  |  | 510 | 		if ( ListPackages->SelectedItems->Count )
 | 
        
           |  |  | 511 | 		{
 | 
        
           |  |  | 512 | 			ListViewItem ^item = ListPackages->SelectedItems[0];
 | 
        
           |  |  | 513 | 			if ( item )
 | 
        
           |  |  | 514 | 			{
 | 
        
           |  |  | 515 | 				CyString sNum = CyStringFromSystemString(Convert::ToString(item->Tag));
 | 
        
           |  |  | 516 | 				if ( sNum.IsNumber() )
 | 
        
           |  |  | 517 | 				{
 | 
        
           |  |  | 518 | 					enabled = true;
 | 
        
           |  |  | 519 | 					p = m_lAvailablePackages->Get(Convert::ToInt32(item->Tag));
 | 
        
           |  |  | 520 | 				}
 | 
        
           |  |  | 521 | 				else
 | 
        
           |  |  | 522 | 				{
 | 
        
           |  |  | 523 | 					this->button1->Visible = true;
 | 
        
           |  |  | 524 | 					ap = m_pPackages->FindAvailablePackage(sNum);
 | 
        
           |  |  | 525 | 				}
 | 
        
           |  |  | 526 | 			}
 | 
        
           |  |  | 527 | 		}
 | 
        
           |  |  | 528 |   | 
        
           |  |  | 529 | 		// update package display
 | 
        
           |  |  | 530 | 		if ( p )
 | 
        
           |  |  | 531 | 		{
 | 
        
           |  |  | 532 | 			CyString desc = p->GetDescription();
 | 
        
           |  |  | 533 | 			desc = desc.FindReplace("<br>", "\n");
 | 
        
           |  |  | 534 | 			desc = desc.FindReplace("<br/>", "\n");
 | 
        
           |  |  | 535 | 			desc = desc.FindReplace("<p>", "\n\t");
 | 
        
           |  |  | 536 | 			desc = desc.FindReplace("<p/>", "\n");
 | 
        
           |  |  | 537 | 			TextDesc->Text = SystemStringFromCyString(desc.StripHTML());
 | 
        
           |  |  | 538 | 			GroupPackage->Text = "Current Package (" + SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())) + ")";
 | 
        
           |  |  | 539 |   | 
        
           |  |  | 540 | 			UpdateRatings(true, p->GetEaseOfUse(), p->GetGameChanging(), p->GetRecommended());
 | 
        
           |  |  | 541 | 			// display an advert
 | 
        
           |  |  | 542 | 			bool addedIcon = false;
 | 
        
           |  |  | 543 | 			if ( p->GetFirstFile(FILETYPE_ADVERT) )
 | 
        
           |  |  | 544 | 			{
 | 
        
           |  |  | 545 | 				C_File *f = p->GetFirstFile(FILETYPE_ADVERT);
 | 
        
           |  |  | 546 | 				System::String ^aFile = SystemStringFromCyString(f->GetFilePointer().FindReplace("/", "\\").FindReplace("\\\\", "\\"));
 | 
        
           |  |  | 547 | 				if ( System::IO::File::Exists(aFile) )
 | 
        
           |  |  | 548 | 				{
 | 
        
           |  |  | 549 | 					try 
 | 
        
           |  |  | 550 | 					{
 | 
        
           |  |  | 551 | 						Bitmap ^myBitmap = gcnew Bitmap(aFile);
 | 
        
           |  |  | 552 | 						if ( myBitmap )
 | 
        
           |  |  | 553 | 						{
 | 
        
           |  |  | 554 | 							this->PictureBox->Image = dynamic_cast<Image ^>(myBitmap);
 | 
        
           |  |  | 555 | 							addedIcon = true;
 | 
        
           |  |  | 556 | 						}
 | 
        
           |  |  | 557 | 					} catch (System::ArgumentException ^) {
 | 
        
           |  |  | 558 | 					}
 | 
        
           |  |  | 559 | 					if ( !addedIcon )
 | 
        
           |  |  | 560 | 					{
 | 
        
           |  |  | 561 | 						try 
 | 
        
           |  |  | 562 | 						{
 | 
        
           |  |  | 563 | 							Image ^myImage = Drawing::Image::FromFile(aFile);
 | 
        
           |  |  | 564 | 							if ( myImage )
 | 
        
           |  |  | 565 | 							{
 | 
        
           |  |  | 566 | 								this->PictureBox->Image = myImage;
 | 
        
           |  |  | 567 | 								addedIcon = true;
 | 
        
           |  |  | 568 | 							}
 | 
        
           |  |  | 569 | 						} catch (System::ArgumentException ^) {
 | 
        
           |  |  | 570 | 						} catch (System::OutOfMemoryException ^) {
 | 
        
           |  |  | 571 | 						}
 | 
        
           |  |  | 572 | 					}
 | 
        
           |  |  | 573 | 				}
 | 
        
           |  |  | 574 | 			}
 | 
        
           |  |  | 575 |   | 
        
           |  |  | 576 | 			if ( !addedIcon )
 | 
        
           |  |  | 577 | 			{
 | 
        
           |  |  | 578 | 				System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(PackageBrowser::typeid));
 | 
        
           |  |  | 579 | 				System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
 | 
        
           |  |  | 580 | 				this->PictureBox->Image = icon->ToBitmap();
 | 
        
           |  |  | 581 | 			}
 | 
        
           |  |  | 582 | 		}
 | 
        
           |  |  | 583 | 		else if ( ap )
 | 
        
           |  |  | 584 | 		{
 | 
        
           |  |  | 585 | 			CyString desc = ap->sDesc;
 | 
        
           |  |  | 586 | 			desc = desc.FindReplace("<br>", "\n");
 | 
        
           |  |  | 587 | 			desc = desc.FindReplace("<br/>", "\n");
 | 
        
           |  |  | 588 | 			desc = desc.FindReplace("<p>", "\n\t");
 | 
        
           |  |  | 589 | 			desc = desc.FindReplace("<p/>", "\n");
 | 
        
           |  |  | 590 | 			TextDesc->Text = SystemStringFromCyString(desc.StripHTML());
 | 
        
           |  |  | 591 | 			GroupPackage->Text = "Current Package (" + SystemStringFromCyString(ap->sName) + ") [DOWNLOAD REQUIRED]";
 | 
        
           |  |  | 592 |   | 
        
           |  |  | 593 | 			UpdateRatings(true, ap->iEase, ap->iChanging, ap->iRec);
 | 
        
           |  |  | 594 |   | 
        
           |  |  | 595 | 			System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(PackageBrowser::typeid));
 | 
        
           |  |  | 596 | 			System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
 | 
        
           |  |  | 597 | 			this->PictureBox->Image = icon->ToBitmap();
 | 
        
           |  |  | 598 | 		}
 | 
        
           |  |  | 599 | 		// clear package display
 | 
        
           |  |  | 600 | 		else
 | 
        
           |  |  | 601 | 		{
 | 
        
           |  |  | 602 | 			GroupPackage->Text = "Current Package (None)";
 | 
        
           |  |  | 603 | 			TextDesc->Text = "";
 | 
        
           |  |  | 604 | 		}
 | 
        
           |  |  | 605 |   | 
        
           |  |  | 606 | 		m_pSelectedMod = p;
 | 
        
           |  |  | 607 | 		m_pSelectedPackage = ap;
 | 
        
           |  |  | 608 |   | 
        
           |  |  | 609 | 		ButInstall->Enabled = enabled;
 | 
        
           |  |  | 610 | 	}
 | 
        
           |  |  | 611 |   | 
        
           |  |  | 612 | 	void PackageBrowser::SortList(System::Object ^Sender, ColumnClickEventArgs ^E)
 | 
        
           |  |  | 613 | 	{
 | 
        
           |  |  | 614 | 		if ( E->Column == m_iLastCol )
 | 
        
           |  |  | 615 | 		{
 | 
        
           |  |  | 616 | 			m_bReverse = !m_bReverse;
 | 
        
           |  |  | 617 | 			this->ListPackages->ListViewItemSorter = gcnew ListViewItemComparer(E->Column, m_bReverse);
 | 
        
           |  |  | 618 | 		}
 | 
        
           |  |  | 619 | 		else
 | 
        
           |  |  | 620 | 		{
 | 
        
           |  |  | 621 | 			m_bReverse = false;
 | 
        
           |  |  | 622 | 			this->ListPackages->ListViewItemSorter = gcnew ListViewItemComparer(E->Column, m_bReverse);
 | 
        
           |  |  | 623 | 		}
 | 
        
           |  |  | 624 | 		this->ListPackages->Sort();
 | 
        
           |  |  | 625 | 		m_iLastCol = E->Column;
 | 
        
           |  |  | 626 |   | 
        
           |  |  | 627 | 	}
 | 
        
           |  |  | 628 |   | 
        
           |  |  | 629 | 	void PackageBrowser::DownloadPackage()
 | 
        
           |  |  | 630 | 	{
 | 
        
           |  |  | 631 | 		if ( !m_pSelectedPackage ) 
 | 
        
           |  |  | 632 | 		{
 | 
        
           |  |  | 633 | 			this->button1->Visible = false;
 | 
        
           |  |  | 634 | 			return;
 | 
        
           |  |  | 635 | 		}
 | 
        
           |  |  | 636 |   | 
        
           |  |  | 637 | 		CheckUpdate ^update = gcnew CheckUpdate(m_pPackages, m_pImageList);
 | 
        
           |  |  | 638 | 		update->SetDownloader();
 | 
        
           |  |  | 639 | 		update->OnePackage(m_pSelectedPackage);
 | 
        
           |  |  | 640 | 		if ( update->ShowDialog(this) == Windows::Forms::DialogResult::OK )
 | 
        
           |  |  | 641 | 		{
 | 
        
           |  |  | 642 | 			this->DialogResult = Windows::Forms::DialogResult::Yes;
 | 
        
           |  |  | 643 | 			for ( int i = 0; i < update->GetInstallList()->Count; i++ )
 | 
        
           |  |  | 644 | 				cli::safe_cast<MainGui ^>(this->Owner)->InstallPackage(Convert::ToString(update->GetInstallList()[i]), false, false, true);
 | 
        
           |  |  | 645 | 			this->Close();
 | 
        
           |  |  | 646 | 		}
 | 
        
           |  |  | 647 | 	}
 | 
        
           |  |  | 648 |   | 
        
           |  |  | 649 | }
 |