Skip to content

Instantly share code, notes, and snippets.

@itissid
Created November 29, 2010 04:54
Show Gist options
  • Save itissid/719596 to your computer and use it in GitHub Desktop.
Save itissid/719596 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.XPath;
using System.Net;
using System.IO;
using System.Runtime.InteropServices;
namespace PandoraSmuggler
{
public partial class PandoraSmuggler : Form
{
#region PInvoke functions
// From http://support.microsoft.com/default.aspx/kb/326201/EN-US/
// For PInvoke: Contains information about an entry in the Internet cache
[StructLayout(LayoutKind.Explicit, Size = 80)]
public struct INTERNET_CACHE_ENTRY_INFOA
{
[FieldOffset(0)]
public uint dwStructSize;
[FieldOffset(4)]
public IntPtr lpszSourceUrlName;
[FieldOffset(8)]
public IntPtr lpszLocalFileName;
[FieldOffset(12)]
public uint CacheEntryType;
[FieldOffset(16)]
public uint dwUseCount;
[FieldOffset(20)]
public uint dwHitRate;
[FieldOffset(24)]
public uint dwSizeLow;
[FieldOffset(28)]
public uint dwSizeHigh;
[FieldOffset(32)]
public System.Runtime.InteropServices.ComTypes.FILETIME LastModifiedTime;
[FieldOffset(40)]
public System.Runtime.InteropServices.ComTypes.FILETIME ExpireTime;
[FieldOffset(48)]
public System.Runtime.InteropServices.ComTypes.FILETIME LastAccessTime;
[FieldOffset(56)]
public System.Runtime.InteropServices.ComTypes.FILETIME LastSyncTime;
[FieldOffset(64)]
public IntPtr lpHeaderInfo;
[FieldOffset(68)]
public uint dwHeaderInfoSize;
[FieldOffset(72)]
public IntPtr lpszFileExtension;
[FieldOffset(76)]
public uint dwReserved;
[FieldOffset(76)]
public uint dwExemptDelta;
}
// For PInvoke: Initiates the enumeration of the cache groups in the Internet cache
[DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "FindFirstUrlCacheGroup", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr FindFirstUrlCacheGroup(int dwFlags, int dwFilter, IntPtr lpSearchCondition, int dwSearchCondition, ref long lpGroupId, IntPtr lpReserved);
// For PInvoke: Retrieves the next cache group in a cache group enumeration
[DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "FindNextUrlCacheGroup", CallingConvention = CallingConvention.StdCall)]
public static extern bool FindNextUrlCacheGroup(IntPtr hFind, ref long lpGroupId, IntPtr lpReserved);
// For PInvoke: Releases the specified GROUPID and any associated state in the cache index file
[DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "DeleteUrlCacheGroup", CallingConvention = CallingConvention.StdCall)]
public static extern bool DeleteUrlCacheGroup(long GroupId, int dwFlags, IntPtr lpReserved);
// For PInvoke: Begins the enumeration of the Internet cache
[DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "FindFirstUrlCacheEntryA", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr FindFirstUrlCacheEntry([MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern, IntPtr lpFirstCacheEntryInfo, ref int lpdwFirstCacheEntryInfoBufferSize);
// For PInvoke: Retrieves the next entry in the Internet cache
[DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "FindNextUrlCacheEntryA", CallingConvention = CallingConvention.StdCall)]
public static extern bool FindNextUrlCacheEntry(IntPtr hFind, IntPtr lpNextCacheEntryInfo, ref int lpdwNextCacheEntryInfoBufferSize);
// For PInvoke: Removes the file that is associated with the source name from the cache, if the file exists
[DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "DeleteUrlCacheEntryA", CallingConvention = CallingConvention.StdCall)]
public static extern bool DeleteUrlCacheEntry(IntPtr lpszUrlName);
#endregion
# region Variables
private Dictionary<string, string> downloadURLList = new Dictionary<string, string>();
private Dictionary<string, string> songTitleList = new Dictionary<string, string>();
private Dictionary<string, string> artistNameList = new Dictionary<string, string>();
private Dictionary<string, string> albumTitleList = new Dictionary<string, string>();
private Dictionary<int, int> viewCountRelation = new Dictionary<int, int>();
WebClient client = new WebClient();
Queue<int> downloadQueue = new Queue<int>();
private int count = 0;
private bool findingFiles = false;
private bool downloadingData = false;
private string downloadDirectoryPath = @"C:\\Pandora\\";
private DialogResult drexit;
#endregion
#region constructor
public PandoraSmuggler()
{
InitializeComponent();
this.Show();
findFiles();
if(!System.IO.Directory.Exists(downloadDirectoryPath))
{
System.IO.Directory.CreateDirectory(downloadDirectoryPath);
}
}
#endregion
public void findFiles()
{
findingFiles = true;
const int ERROR_NO_MORE_ITEMS = 259;
viewCountRelation.Clear();
downloadURLList.Clear();
songTitleList.Clear();
albumTitleList.Clear();
artistNameList.Clear();
listView1.Items.Clear();
// Local variables
int cacheEntryInfoBufferSizeInitial = 0;
int cacheEntryInfoBufferSize = 0;
IntPtr cacheEntryInfoBuffer = IntPtr.Zero;
INTERNET_CACHE_ENTRY_INFOA internetCacheEntry;
IntPtr enumHandle = IntPtr.Zero;
bool returnValue = true;
bool tempFileFound = false;
// Start to delete URLs that do not belong to any group.
enumHandle = FindFirstUrlCacheEntry(null, IntPtr.Zero, ref cacheEntryInfoBufferSizeInitial);
if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
return;
cacheEntryInfoBufferSize = cacheEntryInfoBufferSizeInitial;
cacheEntryInfoBuffer = Marshal.AllocHGlobal(cacheEntryInfoBufferSize);
enumHandle = FindFirstUrlCacheEntry(null, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);
while (returnValue)
{
internetCacheEntry = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(cacheEntryInfoBuffer, typeof(INTERNET_CACHE_ENTRY_INFOA));
string localName = (string)Marshal.PtrToStringAnsi(internetCacheEntry.lpszLocalFileName);
string remoteName = (string)Marshal.PtrToStringAnsi(internetCacheEntry.lpszSourceUrlName);
if ((localName != null) && (remoteName != null))
{
if ((localName.Substring(localName.Length - 3).ToLower() == "xml") && (remoteName.Contains("pandora.com")) && (remoteName.Contains("getFragment")))
{
checkData(localName);
tempFileFound = true;
}
}
cacheEntryInfoBufferSizeInitial = cacheEntryInfoBufferSize;
if (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
{
returnValue = false;
}
else
{
returnValue = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);
}
if (cacheEntryInfoBufferSizeInitial > cacheEntryInfoBufferSize)
{
cacheEntryInfoBufferSize = cacheEntryInfoBufferSizeInitial;
cacheEntryInfoBuffer = Marshal.ReAllocHGlobal(cacheEntryInfoBuffer, (IntPtr)cacheEntryInfoBufferSize);
returnValue = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);
}
if (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
{
returnValue = false;
if (!tempFileFound)
{
MessageBox.Show("No data available yet. Please run Pandora.com in Internet Explorer", "Need to run pandora.com", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
Marshal.FreeHGlobal(cacheEntryInfoBuffer);
findingFiles = false;
}
private void checkData(string localName)
{
XmlTextReader reader = new XmlTextReader(localName);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
reader.Close();
int tagsPerSong = 0;
XmlElement root = doc.DocumentElement;
XmlNodeList list = root.SelectNodes("//methodResponse/params/param/value/array/data/value/struct/member");
XmlNodeList songs = root.SelectNodes("//methodResponse/params/param/value/array/data/value");
if ((list.Count % songs.Count) == 0)
{
tagsPerSong = list.Count / songs.Count;
}
else
{
MessageBox.Show("Error in format, please contact support", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
string artistSummary = null;
string albumTitle = null;
string audioUrl = null;
string songTitle = null;
for (int i = 0; i < list.Count; i++)
{
// Corresponds to a particular row
XmlElement member = (XmlElement) list[i];
string memberXml = member.InnerXml;
int nameStart = memberXml.IndexOf("<name>");
int nameEnd = memberXml.IndexOf("</name>");
int valueStart = memberXml.IndexOf("<value>");
int valueEnd = memberXml.IndexOf("</value>");
string memberName = memberXml.Substring(nameStart + 6, nameEnd - nameStart - 6);
string memberValue = memberXml.Substring(valueStart + 7, valueEnd - valueStart - 7);
if (memberName == "artistSummary") artistSummary = memberValue;
if (memberName == "albumTitle") albumTitle = memberValue;
if (memberName == "audioURL") audioUrl = memberValue;
if (memberName == "songTitle") songTitle = memberValue;
if ((i != 0) && (((i+1) % tagsPerSong) == 0))
{
// Access for a song completed
count++;
string[] itemValues = new string[3];
itemValues[0] = songTitle;
itemValues[1] = artistSummary;
itemValues[2] = albumTitle;
ListViewItem item = new ListViewItem(itemValues);
listView1.Items.Add(item);
viewCountRelation.Add(listView1.Items.Count - 1, count);
downloadURLList.Add(count.ToString(), audioUrl);
songTitleList.Add(count.ToString(), songTitle);
artistNameList.Add(count.ToString(), artistSummary);
albumTitleList.Add(count.ToString(), albumTitle);
// Refresh for new values
artistSummary = null;
albumTitle = null;
audioUrl = null;
songTitle = null;
}
}
}
private void OnCloseClick(object sender, EventArgs e)
{
if (downloadingData)
{
drexit = MessageBox.Show("Data download is in progress. Are you sure you want to quit?", "Data Downloading", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (drexit == DialogResult.Yes)
{
client.CancelAsync();
Application.Exit();
}
}
else
{
Application.Exit();
}
}
private void OnRefreshClick(object sender, EventArgs e)
{
if (downloadingData)
MessageBox.Show("Please wait for current downloads to finish", "Please wait", MessageBoxButtons.OK, MessageBoxIcon.Hand);
else if (findingFiles)
MessageBox.Show("Please wait for current search to finish", "Please wait", MessageBoxButtons.OK, MessageBoxIcon.Hand);
else
findFiles();
}
private void OnDownloadClick(object sender, EventArgs e)
{
// Find which items have been selected
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Checked)
{
downloadQueue.Enqueue(viewCountRelation[i]);
listView1.Items[i].Checked = false;
}
}
if(!downloadingData)
checkDownloadQueue();
}
void checkDownloadQueue()
{
if (!downloadingData)
{
if (downloadQueue.Count != 0)
{
int i = downloadQueue.Dequeue();
try
{
if (System.IO.File.Exists(downloadDirectoryPath + artistNameList[i.ToString()] + " - " + songTitleList[i.ToString()] + ".mp3"))
{
DialogResult dr = MessageBox.Show("File has already been downloaded. Do you want to download it again?", "File already Downloaded", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
if (dr == DialogResult.OK)
{
try
{
Uri url = new Uri(downloadURLList[i.ToString()]);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileAsync(url, downloadDirectoryPath + artistNameList[i.ToString()] + " - " + songTitleList[i.ToString()] + ".mp3");
label4.Text = "Currently downloading " + songTitleList[i.ToString()] + " by " + artistNameList[i.ToString()] + " from album " + albumTitleList[i.ToString()];
downloadingData = true;
progressBar1.Value = 0;
}
catch (KeyNotFoundException)
{
drexit = DialogResult.Yes;
MessageBox.Show("A butterfly fluttered in South America. I can no longer exits. Please call me again if you feel like", "Butterfly effect", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
else
{
checkDownloadQueue();
}
}
else
{
Uri url = new Uri(downloadURLList[i.ToString()]);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileAsync(url, downloadDirectoryPath + artistNameList[i.ToString()] + " - " + songTitleList[i.ToString()] + ".mp3");
label4.Text = "Currently downloading " + songTitleList[i.ToString()] + " by " + artistNameList[i.ToString()] + " from album " + albumTitleList[i.ToString()];
downloadingData = true;
progressBar1.Value = 0;
}
}
catch (WebException)
{
MessageBox.Show("Please check your internet connection.", "Connection Failure", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
downloadQueue.Clear();
}
catch (InvalidOperationException)
{
MessageBox.Show("File in use by another application.", "File in user", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
checkDownloadQueue();
}
}
else
{
label4.Text = "No songs in Queue";
progressBar1.Value = 0;
}
}
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
progressBar1.Value = 0;
checkDownloadQueue();
label4.Text = "No songs in Queue";
downloadingData = false;
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
if (drexit == DialogResult.Yes)
{
client.CancelAsync();
Application.Exit();
}
progressBar1.Value = e.ProgressPercentage;
}
}
}
namespace PandoraSmuggler
{
partial class PandoraSmuggler
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.listView1 = new System.Windows.Forms.ListView();
this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.button5 = new System.Windows.Forms.Button();
this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.label4 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.Font = new System.Drawing.Font("Verdana", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(215, 19);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(327, 20);
this.label1.TabIndex = 0;
this.label1.Text = "Pandora Downloader by Vercingetorix";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label2
//
this.label2.Location = new System.Drawing.Point(218, 44);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(324, 20);
this.label2.TabIndex = 2;
this.label2.Text = "Songs currently available for download";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// listView1
//
this.listView1.Activation = System.Windows.Forms.ItemActivation.OneClick;
this.listView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(255)))));
this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.listView1.CheckBoxes = true;
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3});
this.listView1.FullRowSelect = true;
this.listView1.GridLines = true;
this.listView1.HideSelection = false;
this.listView1.HotTracking = true;
this.listView1.HoverSelection = true;
this.listView1.Location = new System.Drawing.Point(24, 75);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(700, 353);
this.listView1.TabIndex = 3;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
//
// columnHeader1
//
this.columnHeader1.Text = "Title";
this.columnHeader1.Width = 200;
//
// columnHeader2
//
this.columnHeader2.Text = "Artist";
this.columnHeader2.Width = 200;
//
// columnHeader3
//
this.columnHeader3.Text = "Album";
this.columnHeader3.Width = 300;
//
// button1
//
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button1.Image = global::PandoraSmuggler.Properties.Resources.Vxmini;
this.button1.Location = new System.Drawing.Point(24, 19);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(45, 45);
this.button1.TabIndex = 5;
this.button1.UseVisualStyleBackColor = true;
//
// button2
//
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button2.Image = global::PandoraSmuggler.Properties.Resources.Vxmini;
this.button2.Location = new System.Drawing.Point(678, 19);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(45, 45);
this.button2.TabIndex = 6;
this.button2.UseVisualStyleBackColor = true;
//
// button3
//
this.button3.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button3.Location = new System.Drawing.Point(24, 484);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(120, 25);
this.button3.TabIndex = 7;
this.button3.Text = "Refresh";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler(this.OnRefreshClick);
//
// button4
//
this.button4.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button4.Location = new System.Drawing.Point(147, 484);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(120, 25);
this.button4.TabIndex = 8;
this.button4.Text = "Download";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += new System.EventHandler(this.OnDownloadClick);
//
// label3
//
this.label3.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.Location = new System.Drawing.Point(397, 486);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(326, 20);
this.label3.TabIndex = 4;
this.label3.Text = "Please mail any bugs to sudhanshuraheja@gmail.com";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// button5
//
this.button5.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button5.Location = new System.Drawing.Point(270, 484);
this.button5.Name = "button5";
this.button5.Size = new System.Drawing.Size(120, 25);
this.button5.TabIndex = 9;
this.button5.Text = "Close";
this.button5.UseVisualStyleBackColor = true;
this.button5.Click += new System.EventHandler(this.OnCloseClick);
//
// progressBar1
//
this.progressBar1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(255)))));
this.progressBar1.Location = new System.Drawing.Point(25, 455);
this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(699, 23);
this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
this.progressBar1.TabIndex = 10;
//
// label4
//
this.label4.Font = new System.Drawing.Font("Verdana", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label4.Location = new System.Drawing.Point(22, 431);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(701, 20);
this.label4.TabIndex = 11;
this.label4.Text = "No songs in queue";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255)))));
this.ClientSize = new System.Drawing.Size(750, 520);
this.Controls.Add(this.label4);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.button5);
this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.listView1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Margin = new System.Windows.Forms.Padding(4);
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Pandora Download by Vercingetorix";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button5;
private System.Windows.Forms.ProgressBar progressBar1;
private System.Windows.Forms.Label label4;
}
}
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace PandoraSmuggler
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new PandoraSmuggler());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment