Subversion Repositories spk

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#pragma once
2
 
3
using namespace System;
4
using namespace System::ComponentModel;
5
using namespace System::Collections;
6
using namespace System::Windows::Forms;
7
using namespace System::Data;
8
using namespace System::Drawing;
9
 
10
enum {ERROR_NONE, ERROR_ACCESSDENIED};
11
namespace PluginManager {
12
 
13
	/// <summary>
14
	/// Summary for CheckUpdate
15
	///
16
	/// WARNING: If you change the name of this class, you will need to change the
17
	///          'Resource File Name' property for the managed resource compiler tool
18
	///          associated with all .resx files this class depends on.  Otherwise,
19
	///          the designers will not be able to interact properly with localized
20
	///          resources associated with this form.
21
	/// </summary>
22
	public ref class CheckUpdate : public System::Windows::Forms::Form
23
	{
24
	public:
25
		CheckUpdate(CPackages *p, ImageList ^images)
26
		{
27
			m_iStatus = 0;
28
			InitializeComponent();
29
 
30
			m_lInstall = gcnew ArrayList();
31
			m_pPackages = p;
32
			m_pPackage = NULL;
33
			m_pImageList = images;
34
			this->listView1->SmallImageList = m_pImageList;
35
			this->listView1->LargeImageList = m_pImageList;
36
 
37
			this->listView1->Groups->Add(gcnew ListViewGroup("Packages", HorizontalAlignment::Left));
38
			this->listView1->Groups->Add(gcnew ListViewGroup("Ships", HorizontalAlignment::Left));
39
			this->listView1->Groups->Add(gcnew ListViewGroup("Mods", HorizontalAlignment::Left));
40
 
41
			m_pCurrentItem = nullptr;
42
			m_lAddress = new CyStringList;
43
 
44
			for ( CBaseFile *package = p->PackageList()->First(); package; package = p->PackageList()->Next() )
45
			{
46
				if ( !package->GetWebAddress().Empty() )
47
					this->AddPackage(package);
48
			}
49
 
50
			this->UpdateList();
51
		}
52
 
53
		void SetDownloader()
54
		{
55
			m_bDownloader = true;
56
			this->Text = "Download Packages";
57
 
58
			this->listView1->Items->Clear();
59
			for ( SAvailablePackage *package = m_pPackages->GetAvailablePackageList()->First(); package; package = m_pPackages->GetAvailablePackageList()->Next() )
60
				this->AddPackage(package);
61
 
62
			this->UpdateList();
63
		}
64
 
65
		ArrayList ^GetInstallList() { return m_lInstall; }
66
 
67
		void OnePackage(CBaseFile *p)
68
		{
69
			this->listView1->Items->Clear();
70
			this->listView1->Groups->Clear();
71
			this->listView1->CheckBoxes = false;
72
			m_pCurrentItem = this->AddPackage(p);
73
			this->UpdateList();
74
			this->button2->Visible = false;
75
			m_pPackage = p;
76
			this->Height = 250;
77
		}
78
 
79
		void OnePackage(SAvailablePackage *p)
80
		{
81
			m_bDownloader = true;
82
			this->Text = "Download Package";
83
			this->listView1->Items->Clear();
84
			this->listView1->Groups->Clear();
85
			this->listView1->CheckBoxes = false;
86
			m_pCurrentItem = this->AddPackage(p);
87
			this->UpdateList();
88
			this->button2->Visible = false;
89
			m_pDownloadPackage = p;
90
			this->Height = 250;
91
		}
92
 
93
		ListViewItem ^AddPackage(SAvailablePackage *p)
94
		{
95
			ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(p->sName));
96
			item->SubItems->Add(SystemStringFromCyString(p->sAuthor));
97
			item->SubItems->Add(SystemStringFromCyString(p->sVersion));
98
			item->SubItems->Add("Waiting");
99
			item->SubItems->Add(SystemStringFromCyString(p->sFilename));
100
			item->Tag = SystemStringFromCyString(p->sFilename);
101
 
102
			AddPackage(item, p->iType);
103
 
104
			return item;
105
		}
106
 
107
		void AddPackage(ListViewItem ^item, int type)
108
		{
109
			item->SubItems->Add("");
110
			item->Checked = true;
111
			item->SubItems->Add("");
112
			this->listView1->Items->Add(item);
113
 
114
			if ( this->listView1->Groups->Count )
115
			{
116
				if ( type == PACKAGETYPE_SHIP )
117
					item->Group = this->listView1->Groups[1];
118
				else if ( type == PACKAGETYPE_MOD )
119
					item->Group = this->listView1->Groups[2];
120
				else
121
					item->Group = this->listView1->Groups[0];
122
			}
123
 
124
			item->ImageIndex = -1;
125
 
126
			if ( item->ImageIndex == -1 )
127
			{
128
				if ( type == PACKAGETYPE_SHIP )
129
					item->ImageKey = "ship.png";
130
				else if ( type == PACKAGETYPE_LIBRARY )
131
					item->ImageKey = "library.png";
132
				else if ( type == PACKAGETYPE_FAKEPATCH || type == PACKAGETYPE_MOD )
133
					item->ImageKey = "fake.png";
134
				else
135
					item->ImageKey = "package.png";
136
			}
137
		}
138
 
139
		ListViewItem ^AddPackage(CBaseFile *p)
140
		{
141
			ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())));
142
			item->SubItems->Add(SystemStringFromCyString(p->GetAuthor()));
143
			item->SubItems->Add(SystemStringFromCyString(p->GetVersion()));
144
			item->SubItems->Add("Waiting");
145
			item->SubItems->Add(SystemStringFromCyString(p->GetNameValidFile().Remove(' ') + "_" + p->GetAuthor().Remove(' ') + ".dat"));
146
			item->Tag = p->GetNum();
147
 
148
			if ( p->GetType() == TYPE_XSP )
149
				AddPackage(item, PACKAGETYPE_SHIP);
150
			else if ( p->IsMod() )
151
				AddPackage(item, PACKAGETYPE_MOD);
152
			else if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsLibrary() )
153
				AddPackage(item, PACKAGETYPE_LIBRARY);
154
			else if ( p->IsFakePatch() )
155
				AddPackage(item, PACKAGETYPE_FAKEPATCH);
156
			else
157
				AddPackage(item, PACKAGETYPE_NORMAL);
158
 
159
			if ( p->GetIcon() )
160
				PluginManager::DisplayListIcon(p, this->listView1, item);
161
 
162
			return item;
163
		}
164
 
165
		void UpdateNextPackage()
166
		{
167
			m_pPackage = NULL;
168
			m_pDownloadPackage = NULL;
169
			int pos = (m_pCurrentItem) ? this->listView1->Items->IndexOf(m_pCurrentItem) : -1;
170
			m_pCurrentItem = nullptr;
171
 
172
			++pos;
173
			if ( pos < this->listView1->Items->Count )
174
			{
175
				m_pCurrentItem = this->listView1->Items[pos];
176
				if ( m_bDownloader )
177
					m_pDownloadPackage = m_pPackages->FindAvailablePackage(CyStringFromSystemString(Convert::ToString(m_pCurrentItem->Tag)));
178
				else
179
					m_pPackage = m_pPackages->GetPackageAt(Convert::ToInt32(m_pCurrentItem->Tag));
180
			}
181
 
182
			if ( m_pCurrentItem && (m_pPackage || m_pDownloadPackage) )
183
				this->StartUpdate();
184
			else // end of the list
185
			{
186
				this->progressBar1->Style = Windows::Forms::ProgressBarStyle::Continuous;
187
				this->listView1->UseWaitCursor = false;
188
				if ( m_bDownloader )
189
					this->button2->Text = "Install Now";
190
				else
191
					this->button2->Text = "Update Now";
192
				this->button2->DialogResult = Windows::Forms::DialogResult::OK;
193
				this->button1->Text = "Close";
194
				this->button1->DialogResult = Windows::Forms::DialogResult::Cancel;
195
				this->listView1->CheckBoxes = false;
196
 
197
				m_iStatus = 2;
198
				// check if theres any updates
199
				this->CheckButton();
200
			}
201
		}
202
 
203
		void CheckNextPackage()
204
		{
205
			m_pPackage = NULL;
206
			m_pDownloadPackage = NULL;
207
			int pos = (m_pCurrentItem) ? this->listView1->Items->IndexOf(m_pCurrentItem) : -1;
208
			m_pCurrentItem = nullptr;
209
 
210
			++pos;
211
			if ( pos < this->listView1->Items->Count )
212
			{
213
				m_pCurrentItem = this->listView1->Items[pos];
214
				if ( m_bDownloader )
215
					m_pDownloadPackage = m_pPackages->FindAvailablePackage(CyStringFromSystemString(Convert::ToString(m_pCurrentItem->Tag)));
216
				else
217
					m_pPackage = m_pPackages->GetPackageAt(Convert::ToInt32(m_pCurrentItem->Tag));
218
			}
219
 
220
			if ( m_pCurrentItem && (m_pPackage || m_pDownloadPackage) )
221
				this->StartCheck();
222
			else // end of the list
223
			{
224
				this->progressBar1->Style = Windows::Forms::ProgressBarStyle::Continuous;
225
				this->listView1->UseWaitCursor = false;
226
				if ( m_bDownloader )
227
					this->button2->Text = "Start Download";
228
				else
229
					this->button2->Text = "Start Update";
230
				this->button1->Text = "Close";
231
				this->button1->DialogResult = Windows::Forms::DialogResult::Cancel;
232
 
233
				m_iStatus = 1;
234
				// check if theres any updates
235
				this->CheckButton();
236
			}
237
		}
238
 
239
		void CheckButton()
240
		{
241
			this->button2->Visible = false;
242
 
243
			if ( m_pCurrentItem )
244
				return;
245
 
246
			for ( int i = 0; i < this->listView1->Items->Count; i++ )
247
			{
248
				if ( !this->listView1->CheckBoxes || this->listView1->Items[i]->Checked )
249
				{
250
					// if we are updating, check for a valid server
251
					if ( m_iStatus == 0 || this->listView1->Items[i]->SubItems[5]->Text->Length )
252
					{
253
						this->button2->Visible = true;
254
						break;
255
					}
256
				}
257
			}
258
		}
259
 
260
		void StartCheck()
261
		{
262
			this->CheckButton();
263
			this->button1->Text = "Cancel";
264
			this->button1->DialogResult = Windows::Forms::DialogResult::None;
265
			this->progressBar1->Style = Windows::Forms::ProgressBarStyle::Marquee;
266
			this->listView1->UseWaitCursor = true;
267
			m_sStatus = "";
268
			m_sBestServer = "";
269
			m_pCurrentItem->Selected = true;
270
			m_pCurrentItem->SubItems[3]->Text = "Checking";
271
 
272
			this->UpdateList();
273
 
274
			// add all address
275
			if ( m_pDownloadPackage )
276
				m_lAddress->PushBack(m_pDownloadPackage->sFilename);
277
			else if ( m_pPackage )
278
			{
279
				m_lAddress->PushBack(m_pPackage->GetWebAddress());
280
				for ( int i = 0; i < m_pPackage->GetMaxWebMirrors(); i++ )
281
					m_lAddress->PushBack(m_pPackage->GetWebMirror(i));
282
			}
283
			else
284
				return;
285
 
286
			// start the check
287
			this->backgroundWorker1->RunWorkerAsync();
288
		}
289
 
290
		void StartUpdate()
291
		{
292
			// create downloads directory
293
			System::String ^dir = System::IO::FileInfo(System::Windows::Forms::Application::ExecutablePath).DirectoryName;
294
			if ( !IO::Directory::Exists(dir + "\\Downloads") )
295
			{
296
				try {
297
					IO::Directory::CreateDirectory(dir + "\\Downloads");
298
				}
299
				catch (System::UnauthorizedAccessException ^) {
300
					MessageBox::Show(this, "Unable to create directory for downloads\nAccess Denied\n(" + dir + "\\Downloads)", "Access Denied", MessageBoxButtons::OK, MessageBoxIcon::Error);
301
					this->Close();					
302
				}
303
			}
304
 
305
			// start the update
306
			this->CheckButton();
307
			this->button1->Text = "Cancel";
308
			this->button1->DialogResult = Windows::Forms::DialogResult::None;
309
			this->progressBar1->Style = Windows::Forms::ProgressBarStyle::Marquee;
310
 
311
			this->listView1->UseWaitCursor = true;
312
			m_pCurrentItem->Selected = true;
313
			m_pCurrentItem->SubItems[3]->Text = "Downloading";
314
			this->UpdateList();
315
 
316
			// start the update
317
			this->backgroundWorker2->RunWorkerAsync();
318
		}
319
 
320
		void UpdateList()
321
		{
322
			this->listView1->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
323
		}
324
 
325
		bool ReadData(String ^url)
326
		{
327
			bool ret = false;
328
			m_sData = "";
329
			try 
330
			{
331
				System::Net::WebClient ^Client = gcnew System::Net::WebClient();
332
				Client->Headers->Add( "user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)" );
333
				System::IO::Stream ^strm = Client->OpenRead(url);
334
				System::IO::StreamReader ^sr = gcnew System::IO::StreamReader(strm);
335
				m_sData = sr->ReadToEnd();
336
 
337
				strm->Close();
338
				sr->Close();
339
 
340
				ret = true;
341
			}
342
			catch (System::Net::WebException ^)
343
			{
344
				return false;
345
			}
346
 
347
			if ( m_sData->Length )
348
				return ret;
349
			return false;
350
		}
351
		int CheckFile(String ^url)
352
		{
353
			int ret = CONNECTERROR_UNKNOWN;
354
			try 
355
			{
356
				// check for the file
357
				Net::WebRequest ^check = (Net::HttpWebRequest ^)Net::WebRequest::Create(url);
358
				check->Credentials = Net::CredentialCache::DefaultCredentials;
359
				Net::WebResponse ^response = (Net::HttpWebResponse ^)check->GetResponse();
360
				// check the file size
361
				__int64 fileSize = response->ContentLength;
362
				if ( fileSize )
363
					ret = CONNECTERROR_NONE;
364
 
365
				response->Close();
366
 
367
			}
368
			catch (System::Net::WebException ^ex)
369
			{
370
				if ( ex->Status == System::Net::WebExceptionStatus::ConnectFailure )
371
					ret = CONNECTERROR_FAILED;
372
				else
373
				{
374
					switch ( cli::safe_cast<Net::HttpWebResponse ^>(ex->Response)->StatusCode )
375
					{
376
						case Net::HttpStatusCode::NotFound:
377
							ret = CONNECTERROR_NOFILE;
378
							break;
379
						case Net::HttpStatusCode::RequestTimeout:
380
							ret = CONNECTERROR_TIMEOUT;
381
							break;
382
						default:
383
							ret = CONNECTERROR_UNKNOWN;
384
					}
385
				}
386
			}
387
 
388
			return ret;
389
		}
390
 
391
	protected:
392
		ImageList		^m_pImageList;
393
		ArrayList		^m_lInstall;
394
		String			^m_sData;
395
		String			^m_sStatus;
396
		String			^m_sBestServer;
397
		CyStringList	*m_lAddress;
398
		ListViewItem	^m_pCurrentItem;
399
		CPackages		*m_pPackages;
400
		CBaseFile		*m_pPackage;
401
		int				 m_iStatus;
402
		bool			 m_bDownloader;
403
		SAvailablePackage *m_pDownloadPackage;
404
		int				 m_iErrorState;			
405
private: System::Windows::Forms::ColumnHeader^  columnHeader4;
406
private: System::ComponentModel::BackgroundWorker^  backgroundWorker2;
407
private: System::Windows::Forms::Button^  button2;
408
protected: 
409
 
410
		/// <summary>
411
		/// Clean up any resources being used.
412
		/// </summary>
413
		~CheckUpdate()
414
		{
415
			if (components)
416
			{
417
				delete components;
418
			}
419
			delete m_lAddress;
420
		}
421
 
422
	private: System::Windows::Forms::ProgressBar^  progressBar1;
423
	private: System::ComponentModel::BackgroundWorker^  backgroundWorker1;
424
	private: System::Windows::Forms::ListView^  listView1;
425
	private: System::Windows::Forms::ColumnHeader^  columnHeader1;
426
	private: System::Windows::Forms::ColumnHeader^  columnHeader2;
427
	private: System::Windows::Forms::ColumnHeader^  columnHeader3;
428
	private: System::Windows::Forms::Panel^  panel4;
429
	private: System::Windows::Forms::Button^  button1;
430
	protected: 
431
 
432
	private:
433
		/// <summary>
434
		/// Required designer variable.
435
		/// </summary>
436
		System::ComponentModel::Container ^components;
437
 
438
#pragma region Windows Form Designer generated code
439
		/// <summary>
440
		/// Required method for Designer support - do not modify
441
		/// the contents of this method with the code editor.
442
		/// </summary>
443
		void InitializeComponent(void)
444
		{
445
			this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
446
			this->backgroundWorker1 = (gcnew System::ComponentModel::BackgroundWorker());
447
			this->listView1 = (gcnew System::Windows::Forms::ListView());
448
			this->columnHeader1 = (gcnew System::Windows::Forms::ColumnHeader());
449
			this->columnHeader2 = (gcnew System::Windows::Forms::ColumnHeader());
450
			this->columnHeader3 = (gcnew System::Windows::Forms::ColumnHeader());
451
			this->columnHeader4 = (gcnew System::Windows::Forms::ColumnHeader());
452
			this->panel4 = (gcnew System::Windows::Forms::Panel());
453
			this->button2 = (gcnew System::Windows::Forms::Button());
454
			this->button1 = (gcnew System::Windows::Forms::Button());
455
			this->backgroundWorker2 = (gcnew System::ComponentModel::BackgroundWorker());
456
			this->panel4->SuspendLayout();
457
			this->SuspendLayout();
458
			// 
459
			// progressBar1
460
			// 
461
			this->progressBar1->Dock = System::Windows::Forms::DockStyle::Bottom;
462
			this->progressBar1->Location = System::Drawing::Point(20, 192);
463
			this->progressBar1->MarqueeAnimationSpeed = 10;
464
			this->progressBar1->Name = L"progressBar1";
465
			this->progressBar1->Size = System::Drawing::Size(593, 31);
466
			this->progressBar1->Step = 1;
467
			this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Continuous;
468
			this->progressBar1->TabIndex = 3;
469
			// 
470
			// backgroundWorker1
471
			// 
472
			this->backgroundWorker1->WorkerReportsProgress = true;
473
			this->backgroundWorker1->WorkerSupportsCancellation = true;
474
			this->backgroundWorker1->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &CheckUpdate::backgroundWorker1_DoWork);
475
			this->backgroundWorker1->RunWorkerCompleted += gcnew System::ComponentModel::RunWorkerCompletedEventHandler(this, &CheckUpdate::backgroundWorker1_RunWorkerCompleted);
476
			// 
477
			// listView1
478
			// 
479
			this->listView1->CheckBoxes = true;
480
			this->listView1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::ColumnHeader^  >(4) {this->columnHeader1, this->columnHeader2, 
481
				this->columnHeader3, this->columnHeader4});
482
			this->listView1->Dock = System::Windows::Forms::DockStyle::Fill;
483
			this->listView1->FullRowSelect = true;
484
			this->listView1->HideSelection = false;
485
			this->listView1->Location = System::Drawing::Point(20, 20);
486
			this->listView1->MultiSelect = false;
487
			this->listView1->Name = L"listView1";
488
			this->listView1->ShowItemToolTips = true;
489
			this->listView1->Size = System::Drawing::Size(593, 172);
490
			this->listView1->Sorting = System::Windows::Forms::SortOrder::Ascending;
491
			this->listView1->TabIndex = 7;
492
			this->listView1->UseCompatibleStateImageBehavior = false;
493
			this->listView1->UseWaitCursor = true;
494
			this->listView1->View = System::Windows::Forms::View::Details;
495
			this->listView1->Click += gcnew System::EventHandler(this, &CheckUpdate::listView1_Click);
496
			// 
497
			// columnHeader1
498
			// 
499
			this->columnHeader1->Text = L"Package";
500
			this->columnHeader1->Width = 200;
501
			// 
502
			// columnHeader2
503
			// 
504
			this->columnHeader2->Text = L"Author";
505
			this->columnHeader2->Width = 50;
506
			// 
507
			// columnHeader3
508
			// 
509
			this->columnHeader3->Text = L"Version";
510
			// 
511
			// columnHeader4
512
			// 
513
			this->columnHeader4->Text = L"Status";
514
			// 
515
			// panel4
516
			// 
517
			this->panel4->Controls->Add(this->button2);
518
			this->panel4->Controls->Add(this->button1);
519
			this->panel4->Dock = System::Windows::Forms::DockStyle::Bottom;
520
			this->panel4->Location = System::Drawing::Point(20, 223);
521
			this->panel4->Name = L"panel4";
522
			this->panel4->Padding = System::Windows::Forms::Padding(10);
523
			this->panel4->Size = System::Drawing::Size(593, 55);
524
			this->panel4->TabIndex = 8;
525
			// 
526
			// button2
527
			// 
528
			this->button2->Dock = System::Windows::Forms::DockStyle::Left;
529
			this->button2->Location = System::Drawing::Point(10, 10);
530
			this->button2->Name = L"button2";
531
			this->button2->Size = System::Drawing::Size(132, 35);
532
			this->button2->TabIndex = 1;
533
			this->button2->Text = L"Start Check";
534
			this->button2->UseVisualStyleBackColor = true;
535
			this->button2->Click += gcnew System::EventHandler(this, &CheckUpdate::button2_Click);
536
			// 
537
			// button1
538
			// 
539
			this->button1->DialogResult = System::Windows::Forms::DialogResult::Cancel;
540
			this->button1->Dock = System::Windows::Forms::DockStyle::Right;
541
			this->button1->Location = System::Drawing::Point(486, 10);
542
			this->button1->Name = L"button1";
543
			this->button1->Size = System::Drawing::Size(97, 35);
544
			this->button1->TabIndex = 0;
545
			this->button1->Text = L"Cancel";
546
			this->button1->UseVisualStyleBackColor = true;
547
			this->button1->Click += gcnew System::EventHandler(this, &CheckUpdate::button1_Click);
548
			// 
549
			// backgroundWorker2
550
			// 
551
			this->backgroundWorker2->WorkerReportsProgress = true;
552
			this->backgroundWorker2->WorkerSupportsCancellation = true;
553
			this->backgroundWorker2->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &CheckUpdate::backgroundWorker2_DoWork);
554
			this->backgroundWorker2->RunWorkerCompleted += gcnew System::ComponentModel::RunWorkerCompletedEventHandler(this, &CheckUpdate::backgroundWorker2_RunWorkerCompleted);
555
			this->backgroundWorker2->ProgressChanged += gcnew System::ComponentModel::ProgressChangedEventHandler(this, &CheckUpdate::backgroundWorker2_ProgressChanged);
556
			// 
557
			// CheckUpdate
558
			// 
559
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
560
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
561
			this->ClientSize = System::Drawing::Size(633, 298);
562
			this->ControlBox = false;
563
			this->Controls->Add(this->listView1);
564
			this->Controls->Add(this->progressBar1);
565
			this->Controls->Add(this->panel4);
566
			this->Name = L"CheckUpdate";
567
			this->Padding = System::Windows::Forms::Padding(20);
568
			this->ShowInTaskbar = false;
569
			this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent;
570
			this->Text = L"Checking Updates";
571
			this->Load += gcnew System::EventHandler(this, &CheckUpdate::CheckUpdate_Load);
572
			this->panel4->ResumeLayout(false);
573
			this->ResumeLayout(false);
574
 
575
		}
576
#pragma endregion
577
	private: System::Void CheckUpdate_Load(System::Object^  sender, System::EventArgs^  e) {
578
				 this->CheckButton();
579
				 if ( m_pCurrentItem )
580
				 {
581
					if ( m_pPackage )
582
						this->StartCheck();
583
					else if ( m_bDownloader && m_pDownloadPackage )
584
						this->StartCheck();
585
				 }
586
			 }
587
private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
588
			 // for each server
589
			 String ^bestServer = "";
590
			 CyString bestVersion = "0.00";
591
			 String ^bestFile = "";
592
 
593
			 for ( SStringList *str = m_lAddress->Head(); str; str = str->next )
594
			 {
595
				 if ( backgroundWorker1->CancellationPending )
596
					 break;
597
				 String ^address = SystemStringFromCyString(str->str);
598
				 m_sData = "";
599
				 String ^url = address;
600
 
601
				 if ( !m_bDownloader )
602
					url += "/" + m_pCurrentItem->SubItems[4]->Text;
603
 
604
				 //int error = this->CheckFile(url);
605
				 int error = CheckWebFileExists(url);
606
 
607
				 if ( backgroundWorker1->CancellationPending )
608
					 break;
609
 
610
				 if ( m_bDownloader )
611
				 {
612
					 if ( error == CONNECTERROR_NONE )
613
					 {
614
						 m_sBestServer = url;
615
						 m_sStatus = "Ready";
616
						 return;
617
					 }
618
					 switch(error)
619
					 {
620
						case CONNECTERROR_NOFILE:
621
							m_sStatus = "File Not Found";
622
							break;
623
						case CONNECTERROR_TIMEOUT:
624
							m_sStatus = "Connection Timedout";
625
							break;
626
						case CONNECTERROR_FAILED:
627
							m_sStatus = "Failed";
628
							break;
629
					 }
630
				 }
631
 
632
				 if ( error == CONNECTERROR_NONE )
633
				 {
634
					 // file exists, lets download and examine it
635
					 if ( this->ReadData(url) )
636
					 {
637
						 if ( backgroundWorker1->CancellationPending )
638
							 break;
639
 
640
						// we have the file, parse data
641
						cli::array<String ^> ^lines = m_sData->Split('\n');
642
						if ( lines )
643
						{
644
							 CyString version;
645
							 CyString file;
646
							 for ( int i = 0; i < lines->Length; i++ )
647
							 {
648
								 CyString l = CyStringFromSystemString(lines[i]).Remove(9).Remove('\r');
649
								 //if ( !l.IsIn(":") ) continue;
650
								 CyString first = l.GetToken(":", 1, 1);
651
								 if ( first.Compare("Version") )
652
									 version = l.GetToken(":", 2).RemoveFirstSpace();
653
								 else if ( first.Compare("File") )
654
									 file = l.GetToken(":", 2).RemoveFirstSpace();
655
							 }
656
 
657
							 if ( !version.Empty() && !file.Empty() )
658
							 {
659
								 int error = this->CheckFile(address + "/" + SystemStringFromCyString(file));
660
								 if ( error == CONNECTERROR_NONE )
661
								 {
662
									 if ( bestVersion.CompareVersion(version) == COMPARE_NEWER )
663
									 {
664
										 bestServer = address + "/" + SystemStringFromCyString(file);
665
										 bestVersion = version;
666
									 }
667
								 }
668
							 }
669
						 }
670
					}
671
				 }
672
			 }
673
 
674
			 if ( m_bDownloader )
675
				 return;
676
 
677
			 // now check if we have found an update
678
			 if ( bestServer->Length )
679
			 {
680
				 int v = m_pPackage->GetVersion().CompareVersion(bestVersion);
681
				 switch ( v )
682
				 {
683
					case COMPARE_OLDER:
684
						m_sStatus = "Older";
685
						break;
686
					case COMPARE_SAME:
687
						m_sStatus = "Same";
688
						break;
689
					case COMPARE_NEWER:
690
						m_sStatus = "Newer (" + SystemStringFromCyString(bestVersion) + ")";
691
						m_sBestServer = bestServer;
692
						break;
693
				 }
694
			 }
695
			 else
696
			 {
697
				 if ( this->backgroundWorker1->CancellationPending )
698
					m_sStatus = "Cancelled";
699
				 else
700
					m_sStatus = "No Update";
701
			 }
702
		 }
703
private: System::Void backgroundWorker1_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
704
			 // update the status display
705
			 m_pCurrentItem->SubItems[3]->Text = m_sStatus;
706
			 if ( m_sBestServer && m_sBestServer->Length )
707
				 m_pCurrentItem->SubItems[5]->Text = m_sBestServer;
708
			 this->UpdateList();
709
 
710
			 // next package
711
			 this->CheckNextPackage();
712
		 }
713
private: System::Void listView1_Click(System::Object^  sender, System::EventArgs^  e) {
714
			 this->CheckButton();
715
		 }
716
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
717
			 if ( m_iStatus == 0 ) // start check
718
			 {
719
				 // remove all items that are not checked
720
				 for ( int i = this->listView1->Items->Count - 1; i >= 0; i-- )
721
				 {
722
					 if ( this->listView1->Items[i]->Checked )
723
						 continue;
724
					 this->listView1->Items->RemoveAt(i);
725
				 }
726
 
727
				 this->CheckNextPackage();
728
			 }
729
			 else if ( m_iStatus == 1 ) // start downloading
730
			 {
731
				 for ( int i = this->listView1->Items->Count - 1; i >= 0; i-- )
732
				 {
733
					 if ( this->listView1->Items[i]->SubItems[5]->Text->Length && this->listView1->Items[i]->Checked )
734
						 continue;
735
					 this->listView1->Items->RemoveAt(i);
736
				 }
737
 
738
				 this->UpdateNextPackage();
739
			 }
740
			 else if ( m_iStatus == 2 ) // start installing
741
			 {
742
				 //this->button2 
743
			 }
744
		 }
745
private: System::Void backgroundWorker2_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
746
 
747
				m_iErrorState = ERROR_NONE;
748
 
749
				Threading::Thread::Sleep(1000);
750
				System::Net::WebResponse ^res = nullptr;
751
				System::Net::WebRequest ^req = nullptr;
752
				try {
753
					req = System::Net::WebRequest::Create(m_pCurrentItem->SubItems[5]->Text);
754
					req->Timeout = 25000;
755
					res = req->GetResponse();
756
				}
757
				catch (System::Net::WebException ^) {
758
					return;
759
				}
760
 
761
				if ( backgroundWorker2->CancellationPending )
762
					return;
763
 
764
				System::String ^dir = System::IO::FileInfo(System::Windows::Forms::Application::ExecutablePath).DirectoryName;
765
				dir += "\\Downloads";
766
				String ^file = dir + "\\" + SystemStringFromCyString(CFileIO(CyStringFromSystemString(m_pCurrentItem->SubItems[5]->Text)).GetFilename().Remove('\r').Remove(9));
767
 
768
				__int64 maxSize = res->ContentLength;
769
				__int64 curSize = 0;
770
 
771
				System::IO::FileStream ^writeStream = nullptr;
772
				try {
773
					writeStream = gcnew System::IO::FileStream(file, System::IO::FileMode::OpenOrCreate);
774
				}
775
				catch (System::UnauthorizedAccessException ^) {
776
					m_iErrorState = ERROR_ACCESSDENIED;
777
					return;
778
				}
779
				catch (System::IO::IOException ^)
780
				{
781
					return;
782
				}
783
				catch (System::Exception ^e)
784
				{
785
					MessageBox::Show("Error: " + e->ToString(), "Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
786
					return;
787
				}
788
 
789
				do
790
				{
791
					if ( backgroundWorker2->CancellationPending )
792
						break;
793
 
794
					Threading::Thread::Sleep(20);
795
 
796
					array<unsigned char> ^readBytes = gcnew array<unsigned char>(4096);
797
					int read = res->GetResponseStream()->Read(readBytes, 0, 4096);
798
 
799
					curSize += (__int64)read;
800
 
801
					int percent = (int)((curSize * 100) / maxSize);
802
					backgroundWorker2->ReportProgress(percent);
803
 
804
					if ( read <= 0 )
805
						break;
806
 
807
					writeStream->Write(readBytes, 0, read);
808
				}
809
				while(1);
810
 
811
				res->GetResponseStream()->Close();
812
				writeStream->Close();
813
 
814
				Threading::Thread::Sleep(1000);
815
 
816
				if ( backgroundWorker2->CancellationPending )
817
				{
818
					try {
819
						System::IO::File::Delete(file);
820
					}
821
					catch (System::IO::IOException ^)
822
					{
823
					}
824
					catch (System::Exception ^)
825
					{
826
					}
827
				}
828
		 }
829
private: System::Void backgroundWorker2_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
830
			this->progressBar1->Style = Windows::Forms::ProgressBarStyle::Continuous;
831
 			this->progressBar1->Value = e->ProgressPercentage;
832
		 }
833
private: System::Void backgroundWorker2_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
834
			if ( this->backgroundWorker2->CancellationPending )
835
			{
836
				 m_pCurrentItem->SubItems[3]->Text = "Cancelled";
837
				 m_pCurrentItem->SubItems[5]->Text = "";
838
			}
839
			else
840
			{
841
				System::String ^dir = System::IO::FileInfo(System::Windows::Forms::Application::ExecutablePath).DirectoryName;
842
				dir += "\\Downloads";
843
				String ^file = dir + "\\" + SystemStringFromCyString(CFileIO(CyStringFromSystemString(m_pCurrentItem->SubItems[5]->Text)).GetFilename().Remove('\r').Remove(9));
844
 
845
				 if ( IO::File::Exists(file) )
846
				 {
847
					 m_pCurrentItem->SubItems[3]->Text = "Ready to Install";
848
					 m_pCurrentItem->SubItems[5]->Text = file;
849
					 m_lInstall->Add(file);
850
				 }
851
				 else
852
				 {
853
					 switch ( m_iErrorState ) {
854
						 case ERROR_ACCESSDENIED:
855
							 m_pCurrentItem->SubItems[3]->Text = "Access Denied";
856
							 break;
857
						 default:
858
							 m_pCurrentItem->SubItems[3]->Text = "Failed";
859
					 }
860
					 m_pCurrentItem->SubItems[5]->Text = "";
861
				 }
862
				 this->UpdateList();
863
				 this->UpdateNextPackage();
864
			}
865
		 }
866
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
867
			 this->backgroundWorker1->CancelAsync();
868
			 this->backgroundWorker2->CancelAsync();
869
		 }
870
};
871
}