From 37ac4c684ce3904c5ec614362ed99bb9867ca0f3 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 29 May 2017 20:08:30 -0400 Subject: It's amazing what talking to Rylan can do to an integer datatype. --- ShiftOS_TheReturn/Commands.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ShiftOS_TheReturn/Commands.cs') diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index b97cd1d..ec89539 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -311,7 +311,7 @@ namespace ShiftOS.Engine if (args.ContainsKey("amount")) try { - long codepointsToAdd = Convert.ToInt64(args["amount"].ToString()); + ulong codepointsToAdd = Convert.ToUInt64(args["amount"].ToString()); SaveSystem.CurrentSave.Codepoints += codepointsToAdd; return true; } @@ -639,7 +639,7 @@ shiftorium.buy{{upgrade:""{upg.ID}""}}"); cat = args["cat"].ToString(); } - Dictionary upgrades = new Dictionary(); + Dictionary upgrades = new Dictionary(); int maxLength = 5; IEnumerable upglist = Shiftorium.GetAvailable(); -- cgit v1.2.3 From 11e80a6a6134e2cbee1041d6ddc95781a265bead Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 2 Jun 2017 11:38:38 -0400 Subject: fix the audio system --- ShiftOS.Objects/Save.cs | 6 ++-- ShiftOS.WinForms/AudioManager.cs | 51 +++++++++++++++++++++++--------- ShiftOS_TheReturn/AudioManager.cs | 61 +++++++++++++++++++++++++-------------- ShiftOS_TheReturn/Commands.cs | 40 +++++++++++++++++++------ 4 files changed, 111 insertions(+), 47 deletions(-) (limited to 'ShiftOS_TheReturn/Commands.cs') diff --git a/ShiftOS.Objects/Save.cs b/ShiftOS.Objects/Save.cs index 0fef7b3..cbd77e2 100644 --- a/ShiftOS.Objects/Save.cs +++ b/ShiftOS.Objects/Save.cs @@ -34,9 +34,9 @@ namespace ShiftOS.Objects //Better to store this stuff server-side so we can do some neat stuff with hacking... public class Save { - - public int MusicVolume { get; set; } - public int SfxVolume { get; set; } + public bool MusicEnabled = true; + public bool SoundEnabled = true; + public int MusicVolume = 100; [Obsolete("This save variable is no longer used in Beta 2.4 and above of ShiftOS. Please use ShiftOS.Engine.SaveSystem.CurrentUser.Username to access the current user's username.")] public string Username { get; set; } diff --git a/ShiftOS.WinForms/AudioManager.cs b/ShiftOS.WinForms/AudioManager.cs index ec12614..afa0d78 100644 --- a/ShiftOS.WinForms/AudioManager.cs +++ b/ShiftOS.WinForms/AudioManager.cs @@ -88,23 +88,46 @@ namespace ShiftOS.WinForms }; while (shuttingDown == false) { - str = new MemoryStream(GetRandomSong()); - mp3 = new NAudio.Wave.Mp3FileReader(str); - o = new NAudio.Wave.WaveOut(); - o.Init(mp3); - bool c = false; - o.Play(); - o.PlaybackStopped += (s, a) => + if (Engine.SaveSystem.CurrentSave != null) { - c = true; - }; - while (!c) - { - try + if (Engine.SaveSystem.CurrentSave.MusicEnabled) + { + str = new MemoryStream(GetRandomSong()); + mp3 = new NAudio.Wave.Mp3FileReader(str); + o = new NAudio.Wave.WaveOut(); + o.Init(mp3); + bool c = false; + o.Play(); + o.PlaybackStopped += (s, a) => + { + c = true; + }; + + while (!c) + { + if (Engine.SaveSystem.CurrentSave.MusicEnabled) + { + try + { + o.Volume = (float)Engine.SaveSystem.CurrentSave.MusicVolume / 100; + } + catch { } + } + else + { + o.Stop(); + c = true; + } + Thread.Sleep(10); + } + } + else { - o.Volume = (float)Engine.SaveSystem.CurrentSave.MusicVolume / 100; + Thread.Sleep(10); } - catch { } + } + else + { Thread.Sleep(10); } } diff --git a/ShiftOS_TheReturn/AudioManager.cs b/ShiftOS_TheReturn/AudioManager.cs index 553a1d9..0a1a210 100644 --- a/ShiftOS_TheReturn/AudioManager.cs +++ b/ShiftOS_TheReturn/AudioManager.cs @@ -83,21 +83,28 @@ namespace ShiftOS.Engine /// The file to play. public static void Play(string file) { - try + bool play = true; + float volume = 1f; + if (SaveSystem.CurrentSave != null) { - _reader = new AudioFileReader(file); - _out = new WaveOut(); - _out.Init(_reader); - _out.Play(); - if (SaveSystem.CurrentSave == null) - _out.Volume = 1.0f; - else - _out.Volume = (float)SaveSystem.CurrentSave.MusicVolume / 100; - _out.PlaybackStopped += (o, a) => { PlayCompleted?.Invoke(); }; + play = (SaveSystem.CurrentSave.SoundEnabled); + volume = (float)SaveSystem.CurrentSave.MusicVolume / 100f; } - catch(Exception ex) + if (play) { - Console.WriteLine("Audio error: " + ex.Message); + try + { + _reader = new AudioFileReader(file); + _out = new WaveOut(); + _out.Init(_reader); + _out.Volume = volume; + _out.Play(); + _out.PlaybackStopped += (o, a) => { PlayCompleted?.Invoke(); }; + } + catch (Exception ex) + { + Console.WriteLine("Audio error: " + ex.Message); + } } } @@ -107,15 +114,27 @@ namespace ShiftOS.Engine /// The stream to read from. public static void PlayStream(Stream str) { - var bytes = new byte[str.Length]; - str.Read(bytes, 0, bytes.Length); - ShiftOS.Engine.AudioManager.Stop(); - if (File.Exists("snd.wav")) - File.Delete("snd.wav"); - File.WriteAllBytes("snd.wav", bytes); - - ShiftOS.Engine.AudioManager.Play("snd.wav"); - + try + { + bool play = true; + float volume = 1f; + if (SaveSystem.CurrentSave != null) + { + play = (SaveSystem.CurrentSave.SoundEnabled); + volume = (float)SaveSystem.CurrentSave.MusicVolume / 100f; + } + if (play) + { + ShiftOS.Engine.AudioManager.Stop(); + _out = new WaveOut(); + var mp3 = new WaveFileReader(str); + _out.Init(mp3); + _out.Volume = volume; + _out.Play(); + _out.PlaybackStopped += (o, a) => { PlayCompleted?.Invoke(); }; + } + } + catch { } } public static event Action PlayCompleted; diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index ec89539..e379a50 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -383,26 +383,48 @@ namespace ShiftOS.Engine [Namespace("sos")] public static class ShiftOSCommands { - [Command("setsfxvolume", description = "Set the volume of various sound effects to a value between 1 and 100.")] + + [Command("setsfxenabled", description = "Set whether or not sound effects are enabled in the system.")] [RequiresArgument("value")] - public static bool SetSfxVolume(Dictionary args) + public static bool SetSfxEnabled(Dictionary args) { - int value = int.Parse(args["value"].ToString()); - if (value >= 0 && value <= 100) + try { - SaveSystem.CurrentSave.SfxVolume = value; + bool value = Convert.ToBoolean(args["value"].ToString()); + SaveSystem.CurrentSave.SoundEnabled = value; SaveSystem.SaveGame(); } - else + catch { - Console.WriteLine("Volume must be between 0 and 100!"); + Console.WriteLine("Error: Value must be either true or false."); } return true; } - [Command("setmusicvolume", description ="Set the music volume to a value between 1 and 100.")] + + + [Command("setmusicenabled", description = "Set whether or not music is enabled in the system.")] [RequiresArgument("value")] - public static bool SetMusicVolume(Dictionary args) + public static bool SetMusicEnabled(Dictionary args) + { + try + { + bool value = Convert.ToBoolean(args["value"].ToString()); + SaveSystem.CurrentSave.MusicEnabled = value; + SaveSystem.SaveGame(); + } + catch + { + Console.WriteLine("Error: Value must be either true or false."); + } + return true; + } + + + + [Command("setsfxvolume", description ="Set the system sound volume to a value between 1 and 100.")] + [RequiresArgument("value")] + public static bool SetSfxVolume(Dictionary args) { int value = int.Parse(args["value"].ToString()); if(value >= 0 && value <= 100) -- cgit v1.2.3 From cc55af0c8b4d14053bfb46ec14c3e1887d375f7d Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 3 Jun 2017 09:16:44 -0400 Subject: story objectives system --- ShiftOS.WinForms/ShiftOS.WinForms.csproj | 1 + ShiftOS.WinForms/Stories/DevXSkinningStory.cs | 99 ++++++++++++++++++++++++ ShiftOS_TheReturn/Commands.cs | 15 +++- ShiftOS_TheReturn/Story.cs | 104 +++++++++++++++++++++++++- 4 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 ShiftOS.WinForms/Stories/DevXSkinningStory.cs (limited to 'ShiftOS_TheReturn/Commands.cs') diff --git a/ShiftOS.WinForms/ShiftOS.WinForms.csproj b/ShiftOS.WinForms/ShiftOS.WinForms.csproj index 0a59c00..e1afa84 100644 --- a/ShiftOS.WinForms/ShiftOS.WinForms.csproj +++ b/ShiftOS.WinForms/ShiftOS.WinForms.csproj @@ -427,6 +427,7 @@ Volume.cs + diff --git a/ShiftOS.WinForms/Stories/DevXSkinningStory.cs b/ShiftOS.WinForms/Stories/DevXSkinningStory.cs new file mode 100644 index 0000000..09dfd7f --- /dev/null +++ b/ShiftOS.WinForms/Stories/DevXSkinningStory.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using ShiftOS.Engine; + +namespace ShiftOS.WinForms.Stories +{ + public class DevXSkinningStory + { + [Story("devx_1000_codepoints")] + public static void DevX1000CPStory() + { + Desktop.InvokeOnWorkerThread(() => + { + var t = new Applications.Terminal(); + AppearanceManager.SetupWindow(t); + }); + TerminalBackend.InStory = true; + TerminalBackend.PrefixEnabled = false; + Thread.Sleep(3000); + Engine.AudioManager.PlayStream(Properties.Resources._3beepvirus); + Console.WriteLine("devx@anon_127420: Connection established."); + Thread.Sleep(1500); + Console.WriteLine("DevX: Hello, " + SaveSystem.CurrentUser.Username + "@" + SaveSystem.CurrentSave.SystemName + "! I see you've gotten a decent amount of Codepoints."); + Thread.Sleep(2000); + Console.WriteLine("DevX: Have you gotten a chance to install my \"Shifter\" application yet?"); + Thread.Sleep(1500); + if (!Shiftorium.UpgradeInstalled("shifter")) + { + Console.WriteLine("You: Not yet. What's it for?"); + Thread.Sleep(2000); + Console.WriteLine("DevX: The Shifter is a very effective way to make ShiftOS look however you want it to."); + Thread.Sleep(2000); + Console.WriteLine("DevX: It can even be adapted to support other applications, features and upgrades."); + Thread.Sleep(2000); + } + else + { + Console.WriteLine("You: Yeah. Just seems kinda lackluster to me. What is it supposed to do?"); + Thread.Sleep(2000); + Console.WriteLine("DevX: The Shifter is a very effective way to make ShiftOS look however you want it to."); + Thread.Sleep(2000); + Console.WriteLine("DevX: It can even be adapted to support other applications, features and upgrades."); + Thread.Sleep(2000); + Console.WriteLine("DevX: I haven't finished it just yet. Keep upgrading it and you'll notice it gets a lot better."); + Thread.Sleep(2000); + } + Console.WriteLine("DevX: I'd also recommend going for the Skin Loader, that way you can save your creations to the disk. Also, go for the Skinning upgrade - which will allow more rich customization of certain elements."); + Thread.Sleep(2000); + Console.WriteLine("You: This still ain't gonna help me get back to my old system and out of this stupid Digital Society, is it?"); + Thread.Sleep(2000); + Console.WriteLine("DevX: How the...How do you know about the Digital Societ....Who the hell talked!?"); + Thread.Sleep(2000); + Console.WriteLine("You: Whoa! Just... calm down, will ya? I heard about it in the news, shortly before I got infected by this damn virus of an operating system."); + Thread.Sleep(2000); + Console.WriteLine("DevX: Whatever. That doesn't matter yet. Just focus on upgrading ShiftOS and earning Codepoints. I'll let you know when we're done. I've gotta go...work on something else."); + Thread.Sleep(1500); + Console.WriteLine("User disconnected."); + Thread.Sleep(2000); + Console.WriteLine("You: Something doesn't seem right about DevX. I wonder what he's really up to."); + + if (Shiftorium.UpgradeInstalled("shifter")) + PushObjectives(); + else + Story.PushObjective("Buy the Shifter.", "The Shifter is a super-effective way to earn more Codepoints. It is an essential buy if you haven't already bought it. Save up for the Shifter, and buy it using shiftorium.buy{upgrade:\"shifter\"}.", () => + { + return Shiftorium.UpgradeInstalled("shifter"); + }, () => + { + PushObjectives(); + }); + Story.Context.AutoComplete = false; + TerminalBackend.InStory = false; + TerminalBackend.PrefixEnabled = false; + TerminalBackend.PrintPrompt(); + } + + public static void PushObjectives() + { + Story.PushObjective("Buy the Skinning upgrade", "The Skinning upgrade will allow you to set pictures in place of solid colors for most UI elements. If you want richer customization and more Codepoints, this upgrade is a necessity.", () => + { + return Shiftorium.UpgradeInstalled("skinning"); + }, ()=> + { + Story.PushObjective("Buy the Skin Loader.", "The Skin Loader is an application that allows you to save and load .skn files containing Shifter skin data. These files can be loaded in to the Skin Loader and applied to the system to give ShiftOS a completely different feel. It's Shiftorium upgrade ID is \"skin_loader\".", () => + { + return Shiftorium.UpgradeInstalled("skin_loader"); + }, + () => + { + Story.Context.MarkComplete(); + }); + }); + } + } +} diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index e379a50..72bccb1 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -533,11 +533,20 @@ namespace ShiftOS.Engine Codepoints: {SaveSystem.CurrentSave.Codepoints} Upgrades: {SaveSystem.CurrentSave.CountUpgrades()} installed, - {Shiftorium.GetAvailable().Length} available"; + {Shiftorium.GetAvailable().Length} available + +"; - if (Shiftorium.UpgradeInstalled("mud_control_centre")) - status += Environment.NewLine + $"Reputation: {SaveSystem.CurrentSave.RawReputation} ({SaveSystem.CurrentSave.Reputation})"; Console.WriteLine(status); + + if(Story.CurrentObjective != null) + { + Console.WriteLine("CURRENT OBJECTIVE: " + Story.CurrentObjective.Name); + Console.WriteLine("-------------------------------"); + Console.WriteLine(); + Console.WriteLine(Story.CurrentObjective.Description); + } + return true; } } diff --git a/ShiftOS_TheReturn/Story.cs b/ShiftOS_TheReturn/Story.cs index d62dae4..848c757 100644 --- a/ShiftOS_TheReturn/Story.cs +++ b/ShiftOS_TheReturn/Story.cs @@ -35,11 +35,100 @@ using Newtonsoft.Json; namespace ShiftOS.Engine { + public class StoryContext + { + public string Id { get; set; } + public MethodInfo Method { get; set; } + public bool AutoComplete = false; + + public StoryContext() + { + AutoComplete = true; + } + + public void MarkComplete() + { + SaveSystem.CurrentSave.StoriesExperienced.Add(Id); + OnComplete?.Invoke(); + } + + public event Action OnComplete; + } + + public class Objective + { + private Func _completeFunc = null; + + public string Name { get; set; } + public string Description { get; set; } + + public bool IsComplete + { + get + { + return (bool)_completeFunc?.Invoke(); + } + } + + public Objective(string name, string desc, Func completeFunc, Action onComplete) + { + _completeFunc = completeFunc; + Name = name; + Description = desc; + this.onComplete = onComplete; + } + + private Action onComplete = null; + + public void Complete() + { + onComplete?.Invoke(); + } + } + /// /// Storyline management class. /// public static class Story { + public static StoryContext Context { get; private set; } + public static event Action StoryComplete; + public static Objective CurrentObjective { get; private set; } + + public static void PushObjective(string name, string desc, Func completeFunc, Action onComplete) + { + if (CurrentObjective != null) + { + if (CurrentObjective.IsComplete == false) + { + throw new Exception("Cannot start objective - an objective is already running."); + } + else + { + CurrentObjective = null; + } + } + + CurrentObjective = new Objective(name, desc, completeFunc, onComplete); + + var t = new Thread(() => + { + var obj = CurrentObjective; + while (!obj.IsComplete) + { + Thread.Sleep(5000); + } + obj.Complete(); + CurrentObjective = null; + }); + t.IsBackground = true; + t.Start(); + + Console.WriteLine("NEW OBJECTIVE:"); + Console.WriteLine("A new objective has been added to your system. Run sos.status to find out what you need to do."); + } + + /// /// Starts the storyline with the specified Storyline ID. /// @@ -68,8 +157,21 @@ namespace ShiftOS.Engine { new Thread(() => { + Context = new Engine.StoryContext + { + Id = stid, + Method = mth, + AutoComplete = true, + }; + Context.OnComplete += () => + { + StoryComplete?.Invoke(stid); + }; mth.Invoke(null, null); - SaveSystem.CurrentSave.StoriesExperienced.Add(stid); + if (Context.AutoComplete) + { + Context.MarkComplete(); + } }).Start(); return; } -- cgit v1.2.3 From 69aba3b373f9c9c70ec4ef2250e71465d3327299 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 4 Jun 2017 15:18:53 -0400 Subject: A fuckton of storyline features. --- ShiftOS.Objects/Save.cs | 5 ++ ShiftOS.WinForms/Applications/Terminal.cs | 82 ++++++++++++++++- ShiftOS.WinForms/Commands.cs | 1 - ShiftOS.WinForms/Oobe.cs | 6 +- ShiftOS.WinForms/Stories/LegionStory.cs | 144 +++++++++++++++++++++--------- ShiftOS.WinForms/Tools/ControlManager.cs | 12 ++- ShiftOS_TheReturn/Commands.cs | 27 ++++-- ShiftOS_TheReturn/SaveSystem.cs | 10 +++ ShiftOS_TheReturn/Story.cs | 25 ++---- 9 files changed, 239 insertions(+), 73 deletions(-) (limited to 'ShiftOS_TheReturn/Commands.cs') diff --git a/ShiftOS.Objects/Save.cs b/ShiftOS.Objects/Save.cs index e0282e8..7891a22 100644 --- a/ShiftOS.Objects/Save.cs +++ b/ShiftOS.Objects/Save.cs @@ -173,6 +173,11 @@ namespace ShiftOS.Objects } public List Users { get; set; } + + /// + /// DO NOT MODIFY THIS. EVER. YOU WILL BREAK THE STORYLINE. Let the engine do it's job. + /// + public string PickupPoint { get; set; } } public class SettingsObject : DynamicObject diff --git a/ShiftOS.WinForms/Applications/Terminal.cs b/ShiftOS.WinForms/Applications/Terminal.cs index a4b77ae..687b2b9 100644 --- a/ShiftOS.WinForms/Applications/Terminal.cs +++ b/ShiftOS.WinForms/Applications/Terminal.cs @@ -410,8 +410,6 @@ namespace ShiftOS.WinForms.Applications public static void FirstSteps() { TerminalBackend.PrefixEnabled = false; - new Thread(() => - { TerminalBackend.InStory = true; Console.WriteLine("Hey there, and welcome to ShiftOS."); Thread.Sleep(2000); @@ -521,8 +519,86 @@ namespace ShiftOS.WinForms.Applications TerminalBackend.InStory = false; SaveSystem.SaveGame(); Thread.Sleep(1000); + + Story.Context.AutoComplete = false; + + Console.WriteLine(@"Welcome to the ShiftOS Newbie's Guide. + +This tutorial will guide you through the more intermediate features of ShiftOS, +such as earning Codepoints, buying Shiftoorium Upgrades, and using the objectives system. + +Every now and then, you'll get a notification in your terminal of a ""NEW OBJECTIVE"". +This means that someone has instructed you to do something inside ShiftOS. At any moment +you may type ""sos.status"" in your Terminal to see your current objectives. + +This command is very useful as not only does it allow you to see your current objectives +but you can also see the amount of Codepoints you have as well as the upgrades you've +installed and how many upgrades are available. + +Now, onto your first objective! All you need to do is earn 200 Codepoints using any +program on your system."); + + Story.PushObjective("First Steps: Your First Codepoints", "Play a few rounds of Pong, or use another program to earn 200 Codepoints.", () => + { + return SaveSystem.CurrentSave.Codepoints >= 200; + }, () => + { + Desktop.InvokeOnWorkerThread(() => + { + AppearanceManager.SetupWindow(new Terminal()); + }); + Console.WriteLine("Good job! You've earned " + SaveSystem.CurrentSave.Codepoints + @" Codepoints! You can use these inside the +Shiftorium to buy new upgrades inside ShiftOS. + +These upgrades can give ShiftOS more features, fixes and programs, +which can make the operating system easier to use and navigate around +and also make it easier for you to earn more Codepoints and thus upgrade +te system further. + +Be cautious though! Only certain upgrades offer the ability to earn more +Codepoints. These upgrades are typically in the form of new programs. + +So, try to get as many new programs as possible for your computer, and save +the system feature upgrades for later unless you absolutely need them. + +The worst thing that could happen is you end up stuck with very little Codepoints +and only a few small programs to use to earn very little amounts of Codepoints. + +Now, let's get you your first Shiftorium upgrade!"); + + Story.PushObjective("First Steps: The Shiftorium", "Buy your first Shiftorium upgrade with your new Codepoints using shiftorium.list, shiftorium.info and shiftorium.buy.", + () => + { + return SaveSystem.CurrentSave.CountUpgrades() > 0; + }, () => + { + Console.WriteLine("This concludes the ShiftOS Newbie's Guide! Now, go, and shift it your way!"); + Console.WriteLine(@" +Your goal: Earn 1,000 Codepoints."); + Story.Context.MarkComplete(); + Story.Start("first_steps_transition"); + }); TerminalBackend.PrintPrompt(); - }).Start(); + }); + + TerminalBackend.PrintPrompt(); + } + + + [Story("first_steps_transition")] + public static void FirstStepsTransition() + { + Story.PushObjective("Earn 1000 Codepoints", "You now know the basics of ShiftOS. Let's get your system up and running with a few upgrades, and get a decent amount of Codepoints.", () => + { + return SaveSystem.CurrentSave.Codepoints >= 1000; + }, + () => + { + Story.Context.MarkComplete(); + Story.Start("victortran_shiftnet"); + }); + + Story.Context.AutoComplete = false; } public void OnSkinLoad() diff --git a/ShiftOS.WinForms/Commands.cs b/ShiftOS.WinForms/Commands.cs index 2d297f5..b04ffe7 100644 --- a/ShiftOS.WinForms/Commands.cs +++ b/ShiftOS.WinForms/Commands.cs @@ -80,7 +80,6 @@ namespace ShiftOS.WinForms } } - [Namespace("coherence")] [RequiresUpgrade("kernel_coherence")] public static class CoherenceCommands diff --git a/ShiftOS.WinForms/Oobe.cs b/ShiftOS.WinForms/Oobe.cs index 96c2bf5..271e1fd 100644 --- a/ShiftOS.WinForms/Oobe.cs +++ b/ShiftOS.WinForms/Oobe.cs @@ -91,6 +91,7 @@ namespace ShiftOS.WinForms slashcount++; if (slashcount == 5) slashcount = 1; + Engine.AudioManager.PlayStream(Properties.Resources.writesound); Thread.Sleep(50); } rtext += Environment.NewLine; @@ -138,7 +139,10 @@ namespace ShiftOS.WinForms TextType("Your computer has been taken over by ShiftOS, and is currently being wiped clean of all existing files and programs."); Thread.Sleep(2000); Clear(); - TextType("I will not share my identity or my intentions at this moment.I will just proceed with the installation.There’s nothing you can do to stop it."); + TextType("I will not share my identity or my intentions at this moment."); + Thread.Sleep(2000); + Clear(); + TextType("I will just proceed with the installation.There’s nothing you can do to stop it."); Thread.Sleep(2000); Clear(); TextType("All I will say, is I need your help.Once ShiftOS is installed, I will explain."); diff --git a/ShiftOS.WinForms/Stories/LegionStory.cs b/ShiftOS.WinForms/Stories/LegionStory.cs index a0fc9bf..8c79f0e 100644 --- a/ShiftOS.WinForms/Stories/LegionStory.cs +++ b/ShiftOS.WinForms/Stories/LegionStory.cs @@ -16,8 +16,8 @@ namespace ShiftOS.WinForms.Stories [Story("victortran_shiftnet")] public static void ShiftnetStoryFeaturingTheBlueSmileyFaceHolyFuckThisFunctionNameIsLong() { - CharacterName = "victor_tran"; - SysName = "theos"; + CharacterName = "aiden"; + SysName = "appscape_main"; bool waiting = false; var installer = new Applications.Installer(); installer.InstallCompleted += () => @@ -35,53 +35,107 @@ namespace ShiftOS.WinForms.Stories AppearanceManager.SetupWindow(term); } - var t = new Thread(() => + WriteLine("aiden@appscape_main - user connecting to your system.", false); + Thread.Sleep(2000); + WriteLine("Hello there! My name's Aiden Nirh."); + WriteLine("I run a small Shiftnet website known simply as \"Appscape\"."); + WriteLine("Oh - wait... you don't know what the Shiftnet is..."); + WriteLine("Well, the Shiftnet is like... a private Internet, only accessible through ShiftOS."); + WriteLine("It has many sites and companies on it - banks, software centres, service providers, you name it."); + WriteLine("Appscape is one of them. I host many applications on Appscape, from games to utilities to productivity programs, and anything in between. If it exists as a ShiftOS program, it's either on the Shiftorium or Appscape."); + WriteLine("I'm going to assume you're interested... and I'll install the Shiftnet just in case."); + WriteLine("Beginning installation of Shiftnet..."); + //Set up an Installer. + waiting = true; + Desktop.InvokeOnWorkerThread(() => { - WriteLine("victortran@theos - user connecting to your system.", false); - Thread.Sleep(2000); - WriteLine("Hey there - yes, I am not just a sentient being. I am indeed Victor Tran."); - WriteLine("I am the creator of a Linux desktop environment called theShell."); - WriteLine("I'm in the middle of working on a ShiftOS version of it."); - WriteLine("However, before I start, I feel I need to show you something."); - WriteLine("You have a lot of ShiftOS applications, and you can earn lots of Codepoints - and you already have lots."); - WriteLine("Well, you'd be a perfect candidate for me to install the Shiftnet Client on your system."); - WriteLine("I'll begin the installation right now."); - //Set up an Installer. - waiting = true; - Desktop.InvokeOnWorkerThread(() => - { - Story.Start("installer"); - while (!Shiftorium.UpgradeInstalled("installer")) - Thread.Sleep(20); - AppearanceManager.SetupWindow(installer); - installer.InitiateInstall(new ShiftnetInstallation()); - }); - while (waiting == true) - Thread.Sleep(25); + SaveSystem.CurrentSave.StoriesExperienced.Add("installer"); + SaveSystem.CurrentSave.StoriesExperienced.Add("downloader"); - WriteLine("All installed! Once I disconnect, type win.open to see a list of your new apps."); - WriteLine("The Shiftnet is a vast network of websites only accessible through ShiftOS."); - WriteLine("Think of it as the DarkNet, but much darker, and much more secretive."); - WriteLine("There are lots of apps, games, skins and utilities on the Shiftnet."); - WriteLine("There are also lots of companies offering many services."); - WriteLine("I'd stay on the shiftnet/ cluster though, others may be dangerous."); - WriteLine("I'd also stick to the sites listed on shiftnet/shiftsoft/ping - that site is regularly updated with the most safe Shiftnet sites."); - WriteLine("Oh, that reminds me. I have set you up with ShiftSoft's service provider, Freebie Solutions."); - WriteLine("It's a free provider, but it offers only 256 bytes per second download and upload speeds."); - WriteLine("You may want to go look for another provider when you can afford it."); - WriteLine("Trust me - with this provider, things get slow."); - WriteLine("Anyways, it was nice meeting you, hopefully someday you'll give theShell a try."); + while (!Shiftorium.UpgradeInstalled("installer")) + Thread.Sleep(20); + AppearanceManager.SetupWindow(installer); + installer.InitiateInstall(new ShiftnetInstallation()); + }); + while (waiting == true) + Thread.Sleep(25); - TerminalBackend.PrefixEnabled = true; + WriteLine("All good to go! Once I disconnect, type win.open to see a list of your new apps."); + WriteLine("I've installed everything you need, for free."); + WriteLine("You've got the Downloader, a simple application to help you track Shiftnet file downloads..."); + WriteLine("...the Installer which will help you unpack programs from .stp files and install them to your system..."); + WriteLine("...and lastly, the Shiftnet browser itself. This program lets you browse the Shiftnet, much like you would the real Internet."); + WriteLine("I'd stay on the shiftnet/ cluster though, because although there are many services on the Shiftnet, some of them may try to scam you into losing loads of Codepoints, or worse, wrecking your system with viruses."); + WriteLine("If you want a nice list of safe Shiftnet services, head to ShiftSoft's \"Ping\" site, at shiftnet/shiftsoft/ping."); + WriteLine("Oh, also, the Shiftnet, much like the real internet, is not free."); + WriteLine("It requires a service provider. Service providers cost a fair amount of Codepoints, but if you want to get faster speeds and more reliable connections on the Shiftnet, finding a good service provider is a necessity."); + WriteLine("Right now, you are on ShiftSoft's free trial plan, Freebie Solutions, which gives you access to the Shiftnet however you are locked at 256 bytes per second file downloads and can't leave the shiftnet/ cluster."); + WriteLine("It's enough to get you started - you'll want to find a faster provider though.."); + WriteLine("Anyways, that's all I'll say for now. Have fun on the Shiftnet. I have to go work on something."); + WriteLine("One of my friends'll contact you once you've gotten a new service provider."); + + Story.PushObjective("Register with a new Shiftnet service provider.", "You've just unlocked the Shiftnet, which has opened up a whole new world of applications and features for ShiftOS. Before you go nuts with it, you may want to register with a better service provider than Freebie Solutions.", () => + { + return SaveSystem.CurrentSave.ShiftnetSubscription != 0; + }, + () => + { + Story.Context.MarkComplete(); + SaveSystem.SaveGame(); TerminalBackend.PrintPrompt(); + Story.Start("hacker101_breakingbonds_1"); }); - t.IsBackground = true; - t.Start(); - TerminalBackend.PrefixEnabled = false; + TerminalBackend.PrefixEnabled = true; + TerminalBackend.PrintPrompt(); + Story.Context.AutoComplete = false; } + [Story("hacker101_breakingbonds_1")] + public static void BreakingTheBondsIntro() + { + CharacterName = "hacker101"; + SysName = "pebcak"; + + if (!terminalOpen()) + { + var term = new Applications.Terminal(); + AppearanceManager.SetupWindow(term); + } + + WriteLine("hacker101@pebcak - user connecting to your system.", false); + Thread.Sleep(2000); + WriteLine("Greetings, user."); + WriteLine("My name is hacker101. I have a few things to show you."); + WriteLine("Before I can do that, however, I need you to do a few things."); + WriteLine("I'll assign what I need you to do as an objective. When you're done, I'll tell you what you need to know."); + + Story.PushObjective("Breaking the Bonds: Errand Boy", @"hacker101 has something he needs to show you, however before he can, you need to do the following: + + - Buy ""TriWrite"" from Appscape + - Buy ""Address Book"" from Appscape + - Buy ""SimpleSRC"" from Appscape", () => + { + bool flag1 = Shiftorium.UpgradeInstalled("address_book"); + bool flag2 = Shiftorium.UpgradeInstalled("triwrite"); + bool flag3 = Shiftorium.UpgradeInstalled("simplesrc"); + return flag1 && flag2 && flag3; + }, () => + { + Story.Context.MarkComplete(); + SaveSystem.SaveGame(); + Story.Start("hacker101_breakingbonds_2"); + }); + + TerminalBackend.PrefixEnabled = true; + TerminalBackend.PrintPrompt(); + + Story.Context.AutoComplete = false; + + } + + private static void WriteLine(string text, bool showCharacterName=true) { Console.WriteLine(); @@ -90,15 +144,23 @@ namespace ShiftOS.WinForms.Stories ConsoleEx.Bold = true; ConsoleEx.ForegroundColor = ConsoleColor.DarkMagenta; Console.Write(CharacterName); + ConsoleEx.OnFlush?.Invoke(); Console.ForegroundColor = ConsoleColor.White; Console.Write("@"); + ConsoleEx.OnFlush?.Invoke(); ConsoleEx.ForegroundColor = ConsoleColor.Yellow; Console.Write(SysName + ": "); + ConsoleEx.OnFlush?.Invoke(); } ConsoleEx.ForegroundColor = ConsoleColor.Gray; ConsoleEx.Bold = false; - Console.WriteLine(text); + foreach(var c in text) + { + Console.Write(c); + ConsoleEx.OnFlush?.Invoke(); + Thread.Sleep(45); + } Thread.Sleep(1000); } diff --git a/ShiftOS.WinForms/Tools/ControlManager.cs b/ShiftOS.WinForms/Tools/ControlManager.cs index 548a62a..7fbfd1b 100644 --- a/ShiftOS.WinForms/Tools/ControlManager.cs +++ b/ShiftOS.WinForms/Tools/ControlManager.cs @@ -137,10 +137,14 @@ namespace ShiftOS.WinForms.Tools /// The control to center (this is an extension method - you can call it on a control as though it was a method in that control) public static void CenterParent(this Control ctrl) { - ctrl.Location = new Point( - (ctrl.Parent.Width - ctrl.Width) / 2, - (ctrl.Parent.Height - ctrl.Height) / 2 - ); + try + { + ctrl.Location = new Point( + (ctrl.Parent.Width - ctrl.Width) / 2, + (ctrl.Parent.Height - ctrl.Height) / 2 + ); + } + catch { } } public static void SetupControl(Control ctrl) diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index 72bccb1..f37bcb3 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -538,15 +538,28 @@ Upgrades: {SaveSystem.CurrentSave.CountUpgrades()} installed, "; Console.WriteLine(status); - - if(Story.CurrentObjective != null) + Console.WriteLine("Objectives:"); + try + { + if (Story.CurrentObjectives.Count > 0) + { + foreach (var obj in Story.CurrentObjectives) + { + Console.WriteLine(obj.Name); + Console.WriteLine("-------------------------------"); + Console.WriteLine(); + Console.WriteLine(obj.Description); + } + } + else + { + Console.WriteLine(" - No objectives are running. Check back later!"); + } + } + catch { - Console.WriteLine("CURRENT OBJECTIVE: " + Story.CurrentObjective.Name); - Console.WriteLine("-------------------------------"); - Console.WriteLine(); - Console.WriteLine(Story.CurrentObjective.Description); + Console.WriteLine(" - No objectives are running. Check back later!"); } - return true; } } diff --git a/ShiftOS_TheReturn/SaveSystem.cs b/ShiftOS_TheReturn/SaveSystem.cs index 155f002..e98a51e 100644 --- a/ShiftOS_TheReturn/SaveSystem.cs +++ b/ShiftOS_TheReturn/SaveSystem.cs @@ -453,6 +453,16 @@ namespace ShiftOS.Engine Desktop.InvokeOnWorkerThread(new Action(() => Desktop.PopulateAppLauncher())); GameReady?.Invoke(); + + if (!string.IsNullOrWhiteSpace(CurrentSave.PickupPoint)) + { + try + { + Story.Start(CurrentSave.PickupPoint); + TerminalBackend.PrintPrompt(); + } + catch { } + } } /// diff --git a/ShiftOS_TheReturn/Story.cs b/ShiftOS_TheReturn/Story.cs index 848c757..4d1d5cc 100644 --- a/ShiftOS_TheReturn/Story.cs +++ b/ShiftOS_TheReturn/Story.cs @@ -93,33 +93,24 @@ namespace ShiftOS.Engine { public static StoryContext Context { get; private set; } public static event Action StoryComplete; - public static Objective CurrentObjective { get; private set; } + public static List CurrentObjectives { get; private set; } public static void PushObjective(string name, string desc, Func completeFunc, Action onComplete) { - if (CurrentObjective != null) - { - if (CurrentObjective.IsComplete == false) - { - throw new Exception("Cannot start objective - an objective is already running."); - } - else - { - CurrentObjective = null; - } - } - - CurrentObjective = new Objective(name, desc, completeFunc, onComplete); + if (CurrentObjectives == null) + CurrentObjectives = new List(); + var currentObjective = new Objective(name, desc, completeFunc, onComplete); + CurrentObjectives.Add(currentObjective); var t = new Thread(() => { - var obj = CurrentObjective; + var obj = currentObjective; while (!obj.IsComplete) { Thread.Sleep(5000); } + CurrentObjectives.Remove(obj); obj.Complete(); - CurrentObjective = null; }); t.IsBackground = true; t.Start(); @@ -163,9 +154,11 @@ namespace ShiftOS.Engine Method = mth, AutoComplete = true, }; + SaveSystem.CurrentSave.Password = Context.Id; Context.OnComplete += () => { StoryComplete?.Invoke(stid); + SaveSystem.CurrentSave.PickupPoint = null; }; mth.Invoke(null, null); if (Context.AutoComplete) -- cgit v1.2.3 From 107a98686a105468b5f200ebcbd27343c1210ce4 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Sun, 11 Jun 2017 17:34:38 +1000 Subject: ReflectMan Saves The Day.............. Refactored every part in the code that used that damn foreach loop. All assemblies are now loaded on startup into an array, and the results of GetType() on each are concatenated into another array. The parts of the code that were loading the assemblies and scanning them themselves now look to ReflectMan.Types, and all disk I/O is limited to the first time ReflectMan is accessed. While I was there I also replaced some other foreach loops with array comprehensions and such to speed things up - there is a noticeable improvement. It doesn't seem to have broken anything, but I'd appreciate if someone could do more stress testing for me. --- ShiftOS.WinForms/Applications/IconManager.cs | 99 ++++++++---------- ShiftOS.WinForms/Applications/Shiftnet.cs | 113 +++++++++------------ .../Applications/ShiftoriumFrontend.cs | 7 +- ShiftOS.WinForms/HackerCommands.cs | 25 +---- ShiftOS.WinForms/Program.cs | 70 +++++-------- ShiftOS.WinForms/ShiftnetSites/AppscapeMain.cs | 30 ++---- ShiftOS.WinForms/ShiftnetSites/MainHomepage.cs | 57 ++++------- ShiftOS.WinForms/ShiftnetSites/ShiftSoft_Ping.cs | 69 +++++-------- ShiftOS.WinForms/WidgetManager.cs | 36 ++----- ShiftOS_TheReturn/AppLauncherDaemon.cs | 53 ++-------- ShiftOS_TheReturn/AppearanceManager.cs | 20 +--- ShiftOS_TheReturn/Commands.cs | 89 +++++----------- ShiftOS_TheReturn/NotificationDaemon.cs | 21 +--- ShiftOS_TheReturn/ReflectMan.cs | 80 +++++++++++++++ ShiftOS_TheReturn/Scripting.cs | 53 ++-------- ShiftOS_TheReturn/ServerManager.cs | 27 ++--- ShiftOS_TheReturn/ShiftOS.Engine.csproj | 1 + ShiftOS_TheReturn/Shiftorium.cs | 22 +--- ShiftOS_TheReturn/Skinning.cs | 34 ++----- ShiftOS_TheReturn/Story.cs | 65 +++++------- ShiftOS_TheReturn/TerminalBackend.cs | 66 +++++------- 21 files changed, 374 insertions(+), 663 deletions(-) create mode 100644 ShiftOS_TheReturn/ReflectMan.cs (limited to 'ShiftOS_TheReturn/Commands.cs') diff --git a/ShiftOS.WinForms/Applications/IconManager.cs b/ShiftOS.WinForms/Applications/IconManager.cs index 0c6e119..7bbeb34 100644 --- a/ShiftOS.WinForms/Applications/IconManager.cs +++ b/ShiftOS.WinForms/Applications/IconManager.cs @@ -92,70 +92,51 @@ namespace ShiftOS.WinForms.Applications { flbody.Controls.Clear(); //Clear the icon list. - List types = new List(); + Type[] types = Array.FindAll(ReflectMan.Types, x => x.GetCustomAttributes(false).FirstOrDefault(y => y is DefaultIconAttribute) != null); - foreach(var exe in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if(exe.ToLower().EndsWith(".exe") || exe.ToLower().EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(exe); + pageCount = types.GetPageCount(pageSize); - var typeList = asm.GetTypes().Where(x => x.GetCustomAttributes(false).FirstOrDefault(y => y is DefaultIconAttribute) != null); - types.AddRange(typeList); - - } - catch { } - } - } - - pageCount = types.ToArray().GetPageCount(pageSize); - - foreach (var type in types.ToArray().GetItemsOnPage(currentPage, pageSize)) + foreach (var type in Array.FindAll(types.GetItemsOnPage(currentPage, pageSize), t => Shiftorium.UpgradeAttributesUnlocked(t))) { - if (Shiftorium.UpgradeAttributesUnlocked(type)) + var pnl = new Panel(); + pnl.Height = 30; + pnl.Width = flbody.Width - 15; + flbody.Controls.Add(pnl); + pnl.Show(); + var pic = new PictureBox(); + pic.SizeMode = PictureBoxSizeMode.StretchImage; + pic.Size = new Size(24, 24); + pic.Image = GetIcon(type.Name); + pnl.Controls.Add(pic); + pic.Left = 5; + pic.Top = (pnl.Height - pic.Height) / 2; + pic.Show(); + var lbl = new Label(); + lbl.Tag = "header3"; + lbl.AutoSize = true; + lbl.Text = NameChangerBackend.GetNameRaw(type); + ControlManager.SetupControl(lbl); + pnl.Controls.Add(lbl); + lbl.CenterParent(); + lbl.Show(); + var btn = new Button(); + btn.Text = "Change..."; + btn.AutoSize = true; + btn.AutoSizeMode = AutoSizeMode.GrowAndShrink; + pnl.Controls.Add(btn); + btn.Left = (pnl.Width - btn.Width) - 5; + btn.Top = (pnl.Height - btn.Height) / 2; + btn.Click += (o, a) => { - var pnl = new Panel(); - pnl.Height = 30; - pnl.Width = flbody.Width - 15; - flbody.Controls.Add(pnl); - pnl.Show(); - var pic = new PictureBox(); - pic.SizeMode = PictureBoxSizeMode.StretchImage; - pic.Size = new Size(24, 24); - pic.Image = GetIcon(type.Name); - pnl.Controls.Add(pic); - pic.Left = 5; - pic.Top = (pnl.Height - pic.Height) / 2; - pic.Show(); - var lbl = new Label(); - lbl.Tag = "header3"; - lbl.AutoSize = true; - lbl.Text = NameChangerBackend.GetNameRaw(type); - ControlManager.SetupControl(lbl); - pnl.Controls.Add(lbl); - lbl.CenterParent(); - lbl.Show(); - var btn = new Button(); - btn.Text = "Change..."; - btn.AutoSize = true; - btn.AutoSizeMode = AutoSizeMode.GrowAndShrink; - pnl.Controls.Add(btn); - btn.Left = (pnl.Width - btn.Width) - 5; - btn.Top = (pnl.Height - btn.Height) / 2; - btn.Click += (o, a) => + var gfp = new GraphicPicker(pic.Image, lbl.Text + " icon", ImageLayout.Stretch, (raw, img, layout) => { - var gfp = new GraphicPicker(pic.Image, lbl.Text + " icon", ImageLayout.Stretch, (raw, img, layout) => - { - pic.Image = img; - SetIcon(type.Name, raw); - }); - AppearanceManager.SetupDialog(gfp); - }; - btn.Show(); - ControlManager.SetupControls(pnl); - } + pic.Image = img; + SetIcon(type.Name, raw); + }); + AppearanceManager.SetupDialog(gfp); + }; + btn.Show(); + ControlManager.SetupControls(pnl); } btnnext.Visible = (currentPage < pageCount - 1); diff --git a/ShiftOS.WinForms/Applications/Shiftnet.cs b/ShiftOS.WinForms/Applications/Shiftnet.cs index 6ccdb19..136f680 100644 --- a/ShiftOS.WinForms/Applications/Shiftnet.cs +++ b/ShiftOS.WinForms/Applications/Shiftnet.cs @@ -150,79 +150,60 @@ namespace ShiftOS.WinForms.Applications { txturl.Text = url; - foreach(var exe in Directory.GetFiles(Environment.CurrentDirectory)) + try { - if(exe.EndsWith(".exe") || exe.EndsWith(".dll")) + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftnetSite)) && t.BaseType == typeof(UserControl) && Shiftorium.UpgradeAttributesUnlocked(t))) { - try + var attribute = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftnetSiteAttribute && (x as ShiftnetSiteAttribute).Url == url) as ShiftnetSiteAttribute; + if (attribute != null) { - var asm = Assembly.LoadFile(exe); - foreach (var type in asm.GetTypes()) - { - if (type.GetInterfaces().Contains(typeof(IShiftnetSite))) + var obj = (IShiftnetSite)Activator.CreateInstance(type, null); + obj.GoToUrl += (u) => { - if (type.BaseType == typeof(UserControl)) - { - var attribute = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftnetSiteAttribute) as ShiftnetSiteAttribute; - if (attribute != null) - { - if (attribute.Url == url) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - var obj = (IShiftnetSite)Activator.CreateInstance(type, null); - obj.GoToUrl += (u) => - { - History.Push(CurrentUrl); - NavigateToUrl(u); - }; - obj.GoBack += () => - { - string u = History.Pop(); - Future.Push(u); - NavigateToUrl(u); - }; - CurrentPage = obj; - this.pnlcanvas.Controls.Clear(); - this.pnlcanvas.Controls.Add((UserControl)obj); - ((UserControl)obj).Show(); - ((UserControl)obj).Dock = DockStyle.Fill; - obj.OnUpgrade(); - obj.OnSkinLoad(); - obj.Setup(); - AppearanceManager.SetWindowTitle(this, attribute.Name + " - Shiftnet"); - return; - } - } - } - } - } - } - } - catch (Exception ex) - { - pnlcanvas.Controls.Clear(); - var tlbl = new Label(); - tlbl.Text = "Server error in \"" + url + "\" application."; - tlbl.Tag = "header1"; - tlbl.AutoSize = true; - tlbl.Location = new Point(10, 10); - tlbl.Dock = DockStyle.Top; - pnlcanvas.Controls.Add(tlbl); - tlbl.Show(); - - var crash = new Label(); - crash.Dock = DockStyle.Fill; - crash.AutoSize = false; - crash.Text = ex.ToString(); - pnlcanvas.Controls.Add(crash); - crash.Show(); - crash.BringToFront(); - ControlManager.SetupControls(pnlcanvas); - return; + History.Push(CurrentUrl); + NavigateToUrl(u); + }; + obj.GoBack += () => + { + string u = History.Pop(); + Future.Push(u); + NavigateToUrl(u); + }; + CurrentPage = obj; + this.pnlcanvas.Controls.Clear(); + this.pnlcanvas.Controls.Add((UserControl)obj); + ((UserControl)obj).Show(); + ((UserControl)obj).Dock = DockStyle.Fill; + obj.OnUpgrade(); + obj.OnSkinLoad(); + obj.Setup(); + AppearanceManager.SetWindowTitle(this, attribute.Name + " - Shiftnet"); + return; } } } + catch (Exception ex) + { + pnlcanvas.Controls.Clear(); + var tlbl = new Label(); + tlbl.Text = "Server error in \"" + url + "\" application."; + tlbl.Tag = "header1"; + tlbl.AutoSize = true; + tlbl.Location = new Point(10, 10); + tlbl.Dock = DockStyle.Top; + pnlcanvas.Controls.Add(tlbl); + tlbl.Show(); + + var crash = new Label(); + crash.Dock = DockStyle.Fill; + crash.AutoSize = false; + crash.Text = ex.ToString(); + pnlcanvas.Controls.Add(crash); + crash.Show(); + crash.BringToFront(); + ControlManager.SetupControls(pnlcanvas); + return; + } pnlcanvas.Controls.Clear(); var lbl = new Label(); lbl.Text = "Page not found!"; diff --git a/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs b/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs index eebd897..6886d98 100644 --- a/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs +++ b/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs @@ -114,8 +114,12 @@ namespace ShiftOS.WinForms.Applications private void SetList() { - lbnoupgrades.Hide(); lbupgrades.Items.Clear(); + if (upgrades.Length == 0) + return; + lbnoupgrades.Hide(); + if (CategoryId > upgrades.Length) + CategoryId = 0; try { lbupgrades.Items.AddRange(upgrades[CategoryId].Keys.ToArray()); @@ -250,6 +254,7 @@ namespace ShiftOS.WinForms.Applications private void moveCat(short direction) // direction is -1 to move backwards or 1 to move forwards { + if (cats.Length == 0) return; CategoryId += direction; CategoryId %= cats.Length; if (CategoryId < 0) CategoryId += cats.Length; // fix modulo on negatives diff --git a/ShiftOS.WinForms/HackerCommands.cs b/ShiftOS.WinForms/HackerCommands.cs index 316b7fc..dd8bde8 100644 --- a/ShiftOS.WinForms/HackerCommands.cs +++ b/ShiftOS.WinForms/HackerCommands.cs @@ -679,28 +679,13 @@ namespace ShiftOS.WinForms [Command("list", description ="Lists all story IDs.")] public static bool ListIds() { - foreach(var exec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if(exec.ToLower().EndsWith(".exe") || exec.ToLower().EndsWith(".dll")) + foreach(var type in ReflectMan.Types) + foreach(var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) { - try - { - var asm = Assembly.LoadFile(exec); - { - foreach(var type in asm.GetTypes()) - { - foreach(var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) - { - var attr = method.GetCustomAttributes(false).FirstOrDefault(x => x is StoryAttribute); - if (attr != null) - Console.WriteLine(" - " + (attr as StoryAttribute).StoryID); - } - } - } - } - catch { } + var attr = method.GetCustomAttributes(false).FirstOrDefault(x => x is StoryAttribute); + if (attr != null) + Console.WriteLine(" - " + (attr as StoryAttribute).StoryID); } - } return true; } diff --git a/ShiftOS.WinForms/Program.cs b/ShiftOS.WinForms/Program.cs index b5fb731..d3530a0 100644 --- a/ShiftOS.WinForms/Program.cs +++ b/ShiftOS.WinForms/Program.cs @@ -114,53 +114,39 @@ namespace ShiftOS.WinForms { var defaultList = JsonConvert.DeserializeObject>(Properties.Resources.Shiftorium); - foreach(var exe in Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in ReflectMan.Types) { - if (exe.EndsWith(".exe") || exe.EndsWith(".dll")) + var attribs = type.GetCustomAttributes(false); + var attrib = attribs.FirstOrDefault(x => x is AppscapeEntryAttribute) as AppscapeEntryAttribute; + if (attrib != null) { - try + var upgrade = new ShiftoriumUpgrade { - var asm = Assembly.LoadFile(exe); - foreach (var type in asm.GetTypes()) - { - var attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is AppscapeEntryAttribute) as AppscapeEntryAttribute; - if (attrib != null) - { - var upgrade = new ShiftoriumUpgrade - { - Id = attrib.Name.ToLower().Replace(" ", "_"), - Name = attrib.Name, - Description = attrib.Description, - Cost = attrib.Cost, - Category = attrib.Category, - Dependencies = (string.IsNullOrWhiteSpace(attrib.DependencyString)) ? "appscape_handled_nodisplay" : "appscape_handled_nodisplay;" + attrib.DependencyString - }; - defaultList.Add(upgrade); - } - - var sattrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is StpContents) as StpContents; - if (sattrib != null) - { - var upgrade = new ShiftoriumUpgrade - { - Id = sattrib.Upgrade, - Name = sattrib.Name, - Description = "This is a hidden dummy upgrade for the .stp file installation attribute \"" + sattrib.Name + "\".", - Cost = 0, - Category = "If this is shown, there's a bug in the Shiftorium Provider or the user is a supreme Shifter.", - Dependencies = "dummy_nodisplay" - }; - defaultList.Add(upgrade); - } - - } - - - + Id = attrib.Name.ToLower().Replace(" ", "_"), + Name = attrib.Name, + Description = attrib.Description, + Cost = attrib.Cost, + Category = attrib.Category, + Dependencies = (string.IsNullOrWhiteSpace(attrib.DependencyString)) ? "appscape_handled_nodisplay" : "appscape_handled_nodisplay;" + attrib.DependencyString + }; + defaultList.Add(upgrade); + } - } - catch { } + var sattrib = attribs.FirstOrDefault(x => x is StpContents) as StpContents; + if (sattrib != null) + { + var upgrade = new ShiftoriumUpgrade + { + Id = sattrib.Upgrade, + Name = sattrib.Name, + Description = "This is a hidden dummy upgrade for the .stp file installation attribute \"" + sattrib.Name + "\".", + Cost = 0, + Category = "If this is shown, there's a bug in the Shiftorium Provider or the user is a supreme Shifter.", + Dependencies = "dummy_nodisplay" + }; + defaultList.Add(upgrade); } + } return defaultList; } diff --git a/ShiftOS.WinForms/ShiftnetSites/AppscapeMain.cs b/ShiftOS.WinForms/ShiftnetSites/AppscapeMain.cs index c7830d0..c9b6f64 100644 --- a/ShiftOS.WinForms/ShiftnetSites/AppscapeMain.cs +++ b/ShiftOS.WinForms/ShiftnetSites/AppscapeMain.cs @@ -207,33 +207,21 @@ namespace ShiftOS.WinForms.ShiftnetSites if (result == true) { SaveSystem.CurrentSave.Codepoints -= upg.Cost; - foreach (var exe in Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in ReflectMan.Types) { - if (exe.EndsWith(".exe") || exe.EndsWith(".dll")) + var attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is AppscapeEntryAttribute) as AppscapeEntryAttribute; + if (attrib != null) { - try + if (attrib.Name == upg.Name) { - var asm = Assembly.LoadFile(exe); - foreach (var type in asm.GetTypes()) - { - var attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is AppscapeEntryAttribute) as AppscapeEntryAttribute; - if (attrib != null) - { - if (attrib.Name == upg.Name) - { - var installer = new Applications.Installer(); - var installation = new AppscapeInstallation(upg.Name, attrib.DownloadSize, upg.ID); - AppearanceManager.SetupWindow(installer); - installer.InitiateInstall(installation); - return; - } - } - } + var installer = new Applications.Installer(); + var installation = new AppscapeInstallation(upg.Name, attrib.DownloadSize, upg.ID); + AppearanceManager.SetupWindow(installer); + installer.InitiateInstall(installation); + return; } - catch { } } } - } }); } diff --git a/ShiftOS.WinForms/ShiftnetSites/MainHomepage.cs b/ShiftOS.WinForms/ShiftnetSites/MainHomepage.cs index 6e692a7..10ba809 100644 --- a/ShiftOS.WinForms/ShiftnetSites/MainHomepage.cs +++ b/ShiftOS.WinForms/ShiftnetSites/MainHomepage.cs @@ -39,49 +39,30 @@ namespace ShiftOS.WinForms.ShiftnetSites { //Get the Fundamentals List flfundamentals.Controls.Clear(); - foreach (var exe in Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftnetSite)) && t.BaseType == typeof(UserControl) && Shiftorium.UpgradeAttributesUnlocked(t))) { - if (exe.EndsWith(".exe") || exe.EndsWith(".dll")) + var attrs = type.GetCustomAttributes(false); + var attribute = attrs.FirstOrDefault(x => x is ShiftnetSiteAttribute) as ShiftnetSiteAttribute; + if (attribute != null) { - try + if (attrs.OfType().Any()) { - var asm = Assembly.LoadFile(exe); - foreach (var type in asm.GetTypes()) + var dash = new Label(); + dash.Text = " - "; + dash.AutoSize = true; + flfundamentals.Controls.Add(dash); + dash.Show(); + var link = new LinkLabel(); + link.Text = attribute.Name; + link.Click += (o, a) => { - if (type.GetInterfaces().Contains(typeof(IShiftnetSite))) - { - if (type.BaseType == typeof(UserControl)) - { - var attribute = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftnetSiteAttribute) as ShiftnetSiteAttribute; - if (attribute != null) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - if (type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftnetFundamentalAttribute) != null) - { - var dash = new Label(); - dash.Text = " - "; - dash.AutoSize = true; - flfundamentals.Controls.Add(dash); - dash.Show(); - var link = new LinkLabel(); - link.Text = attribute.Name; - link.Click += (o, a) => - { - GoToUrl?.Invoke(attribute.Url); - }; - flfundamentals.Controls.Add(link); - flfundamentals.SetFlowBreak(link, true); - link.Show(); - link.LinkColor = SkinEngine.LoadedSkin.ControlTextColor; - } - } - } - } - } - } + GoToUrl?.Invoke(attribute.Url); + }; + flfundamentals.Controls.Add(link); + flfundamentals.SetFlowBreak(link, true); + link.Show(); + link.LinkColor = SkinEngine.LoadedSkin.ControlTextColor; } - catch { } } } diff --git a/ShiftOS.WinForms/ShiftnetSites/ShiftSoft_Ping.cs b/ShiftOS.WinForms/ShiftnetSites/ShiftSoft_Ping.cs index 1593117..9b1c3b4 100644 --- a/ShiftOS.WinForms/ShiftnetSites/ShiftSoft_Ping.cs +++ b/ShiftOS.WinForms/ShiftnetSites/ShiftSoft_Ping.cs @@ -34,53 +34,38 @@ namespace ShiftOS.WinForms.ShiftnetSites public void SetupListing() { fllist.Controls.Clear(); - foreach(var exec in Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftnetSite)))) { - if(exec.ToLower().EndsWith(".exe") || exec.ToLower().EndsWith(".dll")) + var attr = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftnetSiteAttribute) as ShiftnetSiteAttribute; + if (attr != null) { - try + if (attr.Url.StartsWith("shiftnet/")) { - var asm = Assembly.LoadFile(exec); - var types = asm.GetTypes(); - foreach (var type in types) + var lnk = new LinkLabel(); + lnk.LinkColor = SkinEngine.LoadedSkin.ControlTextColor; + lnk.Text = attr.Name; + var desc = new Label(); + desc.AutoSize = true; + lnk.AutoSize = true; + desc.MaximumSize = new Size(this.Width / 3, 0); + desc.Text = attr.Description; + desc.Padding = new Padding { - if (type.GetInterfaces().Contains(typeof(IShiftnetSite))) - { - var attr = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftnetSiteAttribute) as ShiftnetSiteAttribute; - if (attr != null) - { - if (attr.Url.StartsWith("shiftnet/")) - { - var lnk = new LinkLabel(); - lnk.LinkColor = SkinEngine.LoadedSkin.ControlTextColor; - lnk.Text = attr.Name; - var desc = new Label(); - desc.AutoSize = true; - lnk.AutoSize = true; - desc.MaximumSize = new Size(this.Width / 3, 0); - desc.Text = attr.Description; - desc.Padding = new Padding - { - Bottom = 25, - Top = 0, - Left = 10, - Right = 10 - }; - lnk.Click += (o, a) => - { - GoToUrl?.Invoke(attr.Url); - }; - fllist.Controls.Add(lnk); - fllist.Controls.Add(desc); - ControlManager.SetupControls(lnk); - lnk.Show(); - desc.Show(); - } - } - } - } + Bottom = 25, + Top = 0, + Left = 10, + Right = 10 + }; + lnk.Click += (o, a) => + { + GoToUrl?.Invoke(attr.Url); + }; + fllist.Controls.Add(lnk); + fllist.Controls.Add(desc); + ControlManager.SetupControls(lnk); + lnk.Show(); + desc.Show(); } - catch { } } } } diff --git a/ShiftOS.WinForms/WidgetManager.cs b/ShiftOS.WinForms/WidgetManager.cs index fec09f9..81a97af 100644 --- a/ShiftOS.WinForms/WidgetManager.cs +++ b/ShiftOS.WinForms/WidgetManager.cs @@ -16,36 +16,12 @@ namespace ShiftOS.WinForms { public static Dictionary GetAllWidgetTypes() { - Dictionary types = new Dictionary(); - foreach(var exe in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if(exe.EndsWith(".exe") || exe.EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(exe); - foreach(var type in asm.GetTypes()) - { - if (type.GetInterfaces().Contains(typeof(IDesktopWidget))) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - foreach (var attrib in type.GetCustomAttributes(false)) - { - if (attrib is DesktopWidgetAttribute) - { - var dw = attrib as DesktopWidgetAttribute; - types.Add(dw, type); - } - } - } - } - } - } - catch { } - } - } - return types; + var ret = new Dictionary(); + var types = Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IDesktopWidget)) && Shiftorium.UpgradeAttributesUnlocked(t)); + foreach (var type in types) + foreach (var attrib in Array.FindAll(type.GetCustomAttributes(false), a => a is DesktopWidgetAttribute)) + ret.Add(attrib as DesktopWidgetAttribute, type); + return ret; } internal static void SaveDetails(Type type, WidgetDetails location) diff --git a/ShiftOS_TheReturn/AppLauncherDaemon.cs b/ShiftOS_TheReturn/AppLauncherDaemon.cs index 716a6a3..c259556 100644 --- a/ShiftOS_TheReturn/AppLauncherDaemon.cs +++ b/ShiftOS_TheReturn/AppLauncherDaemon.cs @@ -63,55 +63,16 @@ namespace ShiftOS.Engine { List win = new List(); - foreach (var asmExec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftOSWindow)) && Shiftorium.UpgradeAttributesUnlocked(t))) { - if (asmExec.EndsWith(".dll") | asmExec.EndsWith(".exe")) - { - try - { - var asm = Assembly.LoadFrom(asmExec); - - if (asm.GetReferencedAssemblies().Contains("ShiftOS.Engine") || asm.FullName.Contains("ShiftOS.Engine")) + foreach (var attr in type.GetCustomAttributes(false)) + if (!(attr is MultiplayerOnlyAttribute && !KernelWatchdog.MudConnected)) + if (attr is LauncherAttribute) { - foreach (var type in asm.GetTypes()) - { - if (type.GetInterfaces().Contains(typeof(IShiftOSWindow))) - { - bool isAllowed = true; - foreach (var attr in type.GetCustomAttributes(false)) - { - if(attr is MultiplayerOnlyAttribute) - { - if(KernelWatchdog.MudConnected == false) - { - isAllowed = false; - - } - } - if (isAllowed == true) - { - if (attr is LauncherAttribute) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - var launch = attr as LauncherAttribute; - if (launch.UpgradeInstalled) - { - win.Add(new LauncherItem { DisplayData = launch, LaunchType = type }); - } - } - } - } - } - } - } + var launch = attr as LauncherAttribute; + if (launch.UpgradeInstalled) + win.Add(new LauncherItem { DisplayData = launch, LaunchType = type }); } - } - catch - { - - } - } } foreach(var file in Utils.GetFiles(Paths.GetPath("applauncher"))) diff --git a/ShiftOS_TheReturn/AppearanceManager.cs b/ShiftOS_TheReturn/AppearanceManager.cs index e244b77..76060dd 100644 --- a/ShiftOS_TheReturn/AppearanceManager.cs +++ b/ShiftOS_TheReturn/AppearanceManager.cs @@ -58,25 +58,7 @@ namespace ShiftOS.Engine //HEY LETS FIND THE WINDOWS public static IEnumerable GetAllWindowTypes() { - List types = new List(); - foreach(var file in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - // hey if a thing is an exe or a dll show up plz kthx - if(file.EndsWith(".exe") || file.EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(file); - foreach(var type in asm.GetTypes()) - { - if (type.GetInterfaces().Contains(typeof(IShiftOSWindow))) - types.Add(type); - } - } - catch { } - } - } - return types; + return Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftOSWindow))); } // hey you know that window we just made appear? well give it its title diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index f37bcb3..da4fb29 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -771,84 +771,41 @@ shiftorium.buy{{upgrade:""{upg.ID}""}}"); { var app = args["app"] as string; //ANNND now we start reflecting... - foreach (var asmExec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.BaseType == typeof(UserControl))) { - if (asmExec.EndsWith(".exe") || asmExec.EndsWith(".dll")) + var attr = type.GetCustomAttributes(false).FirstOrDefault(a => a is WinOpenAttribute && app == (a as WinOpenAttribute).ID); + if (attr != null) { - var asm = Assembly.LoadFile(asmExec); - try + if (SaveSystem.CurrentSave.Upgrades.ContainsKey(app)) { - foreach (var type in asm.GetTypes()) + if (Shiftorium.UpgradeInstalled(app)) { - if (type.BaseType == typeof(UserControl)) - { - foreach (var attr in type.GetCustomAttributes(false)) - { - if (attr is WinOpenAttribute) - { - if (app == (attr as WinOpenAttribute).ID) - { - if (SaveSystem.CurrentSave.Upgrades.ContainsKey(app)) - { - if (Shiftorium.UpgradeInstalled(app)) - { - IShiftOSWindow frm = Activator.CreateInstance(type) as IShiftOSWindow; - AppearanceManager.SetupWindow(frm); - return true; - } - else - { - throw new Exception($"{app} was not found on your system! Try looking in the shiftorium..."); - } - } - else - { - IShiftOSWindow frm = Activator.CreateInstance(type) as IShiftOSWindow; - AppearanceManager.SetupWindow(frm); - return true; - } - } - } - } - } + IShiftOSWindow frm = Activator.CreateInstance(type) as IShiftOSWindow; + AppearanceManager.SetupWindow(frm); + return true; + } + else + { + throw new Exception($"{app} was not found on your system! Try looking in the shiftorium..."); } } - catch { } - + else + { + IShiftOSWindow frm = Activator.CreateInstance(type) as IShiftOSWindow; + AppearanceManager.SetupWindow(frm); + return true; + } } } } else { - foreach (var asmExec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if (asmExec.EndsWith(".exe") || asmExec.EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(asmExec); - - foreach (var type in asm.GetTypes()) - { - if (type.GetInterfaces().Contains(typeof(IShiftOSWindow))) - { - foreach (var attr in type.GetCustomAttributes(false)) - { - if (attr is WinOpenAttribute) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - Console.WriteLine("win.open{app:\"" + (attr as WinOpenAttribute).ID + "\"}"); - } - } - } - } - } - } - catch { } - } - } + + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftOSWindow)) && Shiftorium.UpgradeAttributesUnlocked(t))) + foreach (var attr in Array.FindAll(type.GetCustomAttributes(false), a => a is WinOpenAttribute)) + if (Shiftorium.UpgradeAttributesUnlocked(type)) + Console.WriteLine("win.open{app:\"" + (attr as WinOpenAttribute).ID + "\"}"); return true; diff --git a/ShiftOS_TheReturn/NotificationDaemon.cs b/ShiftOS_TheReturn/NotificationDaemon.cs index 0725782..a532466 100644 --- a/ShiftOS_TheReturn/NotificationDaemon.cs +++ b/ShiftOS_TheReturn/NotificationDaemon.cs @@ -41,26 +41,7 @@ namespace ShiftOS.Engine /// An array of s containing the found objects. public static Type[] GetAllStatusIcons() { - List lst = new List(); - foreach(var exec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if(exec.ToLower().EndsWith(".exe") || exec.ToLower().EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(exec); - foreach(var type in asm.GetTypes().Where(x => x.GetInterfaces().Contains(typeof(IStatusIcon)))) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - lst.Add(type); - } - } - } - catch { } - } - } - return lst.ToArray(); + return Array.FindAll(ReflectMan.Types, x => x.GetInterfaces().Contains(typeof(IStatusIcon)) && Shiftorium.UpgradeAttributesUnlocked(x)); } diff --git a/ShiftOS_TheReturn/ReflectMan.cs b/ShiftOS_TheReturn/ReflectMan.cs new file mode 100644 index 0000000..a0ead60 --- /dev/null +++ b/ShiftOS_TheReturn/ReflectMan.cs @@ -0,0 +1,80 @@ +/* + * MIT License + * + * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ShiftOS.Engine +{ + public static class ReflectMan + { + private static Assembly[] asms = null; + public static Assembly[] Asms + { + get + { + if (asms == null) + LoadAssemblies(); + return asms; + } + } + + private static Type[] types = null; + public static Type[] Types + { + get + { + if (types == null) + FindTypes(); + return types; + } + } + + private static void LoadAssemblies() + { + var ret = new List(); + foreach (var exe in Array.FindAll(System.IO.Directory.GetFiles(Environment.CurrentDirectory), n => n.EndsWith(".exe") || n.EndsWith(".dll"))) + try + { + var asm = Assembly.LoadFile(exe); + if (asm.GetReferencedAssemblies().Contains("ShiftOS.Engine") || asm.FullName.Contains("ShiftOS.Engine")) + ret.Add(asm); + } + catch { } // probably not a managed assembly + asms = ret.ToArray(); + } + + private static void FindTypes() + { + var ret = new List(); + foreach (var asm in Asms) + ret.AddRange(asm.GetTypes()); + types = ret.ToArray(); + } + } +} diff --git a/ShiftOS_TheReturn/Scripting.cs b/ShiftOS_TheReturn/Scripting.cs index 5021f50..081a6ae 100644 --- a/ShiftOS_TheReturn/Scripting.cs +++ b/ShiftOS_TheReturn/Scripting.cs @@ -205,55 +205,14 @@ end"); //This temporary proxy() method will be used by the API prober. Lua.proxy = new Func((objName) => { - foreach (var f in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if (f.EndsWith(".exe") || f.EndsWith(".dll")) - { - try - { - - var asm = Assembly.LoadFile(f); - foreach (var type in asm.GetTypes()) - { - if (type.Name == objName) - { - dynamic dynObj = Activator.CreateInstance(type); - return dynObj; - } - - } - } - catch { } - } - } + dynamic dynObj = ReflectMan.Types.FirstOrDefault(t => t.Name == objName); + if (dynObj != null) + return dynObj; throw new Exception("{CLASS_NOT_FOUND}"); }); - - foreach (var f in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if (f.EndsWith(".exe") || f.EndsWith(".dll")) - { - try - { - var thisasm = Assembly.LoadFile(f); - foreach (var type in thisasm.GetTypes()) - { - foreach (var attr in type.GetCustomAttributes(false)) - { - if (attr is ExposedAttribute) - { - var eattr = attr as ExposedAttribute; - Lua($"{eattr.Name} = proxy(\"{type.Name}\")"); - } - } - } - } - catch - { - - } - } - } + foreach (var type in ReflectMan.Types) + foreach (var attr in Array.FindAll(type.GetCustomAttributes(false), a => a is ExposedAttribute)) + Lua($"{(attr as ExposedAttribute).Name} = proxy(\"{type.Name}\")"); //Now we can null out the proxy() method as it can cause security risks. Lua.isRunning = new Func(() => { return this.Running; }); Lua.proxy = null; diff --git a/ShiftOS_TheReturn/ServerManager.cs b/ShiftOS_TheReturn/ServerManager.cs index be4f086..e6baa9a 100644 --- a/ShiftOS_TheReturn/ServerManager.cs +++ b/ShiftOS_TheReturn/ServerManager.cs @@ -110,32 +110,19 @@ Ping: {ServerManager.DigitalSocietyPing} ms { string[] split = msg.GUID.Split('|'); bool finished = false; - foreach (var exec in Directory.GetFiles(Environment.CurrentDirectory)) - { - if(exec.ToLower().EndsWith(".exe") || exec.ToLower().EndsWith(".dll")) + if (split[0] == SaveSystem.CurrentSave.SystemName) + foreach(var type in Array.FindAll(ReflectMan.Types, x => x.GetInterfaces().Contains(typeof(Server)) && Shiftorium.UpgradeAttributesUnlocked(x))) { - try + var attrib = type.GetCustomAttributes().FirstOrDefault(x => x is ServerAttribute) as ServerAttribute; + if(attrib != null) { - var asm = Assembly.LoadFile(exec); - foreach(var type in asm.GetTypes().Where(x => x.GetInterfaces().Contains(typeof(Server)))) + if(split[1] == attrib.Port.ToString()) { - var attrib = type.GetCustomAttributes().FirstOrDefault(x => x is ServerAttribute) as ServerAttribute; - if(attrib != null) - { - if(split[0] == SaveSystem.CurrentSave.SystemName && split[1] == attrib.Port.ToString()) - { - if (Shiftorium.UpgradeAttributesUnlocked(type)) - { - type.GetMethods(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name == "MessageReceived")?.Invoke(Activator.CreateInstance(type), null); - finished = true; - } - } - } + type.GetMethods(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name == "MessageReceived")?.Invoke(Activator.CreateInstance(type), null); + finished = true; } } - catch { } } - } if (finished == false) { Forward(split[2], "Error", $"{split[0]}:{split[1]}: connection refused"); diff --git a/ShiftOS_TheReturn/ShiftOS.Engine.csproj b/ShiftOS_TheReturn/ShiftOS.Engine.csproj index f70c41e..39299fd 100644 --- a/ShiftOS_TheReturn/ShiftOS.Engine.csproj +++ b/ShiftOS_TheReturn/ShiftOS.Engine.csproj @@ -123,6 +123,7 @@ True Resources.resx + diff --git a/ShiftOS_TheReturn/Shiftorium.cs b/ShiftOS_TheReturn/Shiftorium.cs index 7faf336..0362566 100644 --- a/ShiftOS_TheReturn/Shiftorium.cs +++ b/ShiftOS_TheReturn/Shiftorium.cs @@ -214,23 +214,11 @@ namespace ShiftOS.Engine { upgDb = new List(); //Now we probe for ShiftoriumUpgradeAttributes for mods. - foreach (var file in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if (file.EndsWith(".exe") || file.EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(file); - foreach (var type in asm.GetTypes()) + foreach (var type in ReflectMan.Types) { if (type.GetInterfaces().Contains(typeof(IShiftoriumProvider))) - { - if (type.GetCustomAttributes().FirstOrDefault(x => x is ShiftoriumProviderAttribute) != null) - { - var _p = Activator.CreateInstance(type, null) as IShiftoriumProvider; - upgDb.AddRange(_p.GetDefaults()); - } - } + if (type.GetCustomAttributes().Any(x => x is ShiftoriumProviderAttribute)) + upgDb.AddRange((Activator.CreateInstance(type, null) as IShiftoriumProvider).GetDefaults()); ShiftoriumUpgradeAttribute attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; @@ -310,10 +298,6 @@ namespace ShiftOS.Engine } } - } - catch { } - } - } diff --git a/ShiftOS_TheReturn/Skinning.cs b/ShiftOS_TheReturn/Skinning.cs index d5114c5..ab2d6b1 100644 --- a/ShiftOS_TheReturn/Skinning.cs +++ b/ShiftOS_TheReturn/Skinning.cs @@ -242,38 +242,16 @@ namespace ShiftOS.Engine /// The resulting icon image. public static Image GetDefaultIcon(string id) { - if (_iconProber == null) + if (_iconProber != null) { - return new Bitmap(16, 16); - } - else - { - foreach (var f in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) + foreach (var type in Array.FindAll(ReflectMan.Types, t => t.Name == id)) { - if (f.EndsWith(".exe") || f.EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(f); - foreach (var type in asm.GetTypes()) - { - if (type.Name == id) - { - foreach (var attr in type.GetCustomAttributes(true)) - { - if (attr is DefaultIconAttribute) - { - return _iconProber.GetIcon(attr as DefaultIconAttribute); - } - } - } - } - } - catch { } - } + var attr = Array.Find(type.GetCustomAttributes(true), a => a is DefaultIconAttribute); + if (attr != null) + return _iconProber.GetIcon(attr as DefaultIconAttribute); } - return new Bitmap(16, 16); } + return new Bitmap(16, 16); } /// diff --git a/ShiftOS_TheReturn/Story.cs b/ShiftOS_TheReturn/Story.cs index e44d2be..c01c055 100644 --- a/ShiftOS_TheReturn/Story.cs +++ b/ShiftOS_TheReturn/Story.cs @@ -134,55 +134,42 @@ namespace ShiftOS.Engine /// The storyline ID to start. public static void Start(string stid) { - foreach (var exec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) + if (SaveSystem.CurrentSave.StoriesExperienced == null) + SaveSystem.CurrentSave.StoriesExperienced = new List(); + foreach (var type in ReflectMan.Types) { - if(exec.EndsWith(".exe") || exec.EndsWith(".dll")) + foreach (var mth in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) { - try + foreach (var attrib in Array.FindAll(mth.GetCustomAttributes(false), a => a is StoryAttribute)) { - if (SaveSystem.CurrentSave.StoriesExperienced == null) - SaveSystem.CurrentSave.StoriesExperienced = new List(); - var asm = Assembly.LoadFile(exec); - foreach(var type in asm.GetTypes()) + var story = attrib as StoryAttribute; + if (story.StoryID == stid) { - foreach(var mth in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) + new Thread(() => { - foreach(var attrib in mth.GetCustomAttributes(false)) + Context = new Engine.StoryContext { - if(attrib is StoryAttribute) - { - var story = attrib as StoryAttribute; - if(story.StoryID == stid) - { - new Thread(() => - { - Context = new Engine.StoryContext - { - Id = stid, - Method = mth, - AutoComplete = true, - }; - SaveSystem.CurrentSave.PickupPoint = Context.Id; - Context.OnComplete += () => - { - StoryComplete?.Invoke(stid); - SaveSystem.CurrentSave.PickupPoint = null; - }; - mth.Invoke(null, null); - if (Context.AutoComplete) - { - Context.MarkComplete(); - } - }).Start(); - return; - } - } + Id = stid, + Method = mth, + AutoComplete = true, + }; + SaveSystem.CurrentSave.PickupPoint = Context.Id; + Context.OnComplete += () => + { + StoryComplete?.Invoke(stid); + SaveSystem.CurrentSave.PickupPoint = null; + }; + mth.Invoke(null, null); + if (Context.AutoComplete) + { + Context.MarkComplete(); } - } + }).Start(); + return; } } - catch (Exception ex) { throw ex; } } + } #if DEBUG throw new ArgumentException("Story ID not found: " + stid + " - Talk to Michael. NOW."); diff --git a/ShiftOS_TheReturn/TerminalBackend.cs b/ShiftOS_TheReturn/TerminalBackend.cs index 09ef3d6..81ea971 100644 --- a/ShiftOS_TheReturn/TerminalBackend.cs +++ b/ShiftOS_TheReturn/TerminalBackend.cs @@ -295,54 +295,40 @@ namespace ShiftOS.Engine public static void PopulateTerminalCommands() { Commands = new List(); - foreach(var exec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) + foreach(var type in ReflectMan.Types) { - if(exec.ToLower().EndsWith(".exe") || exec.ToLower().EndsWith(".dll")) + var ns = type.GetCustomAttributes(false).FirstOrDefault(x => x is Namespace) as Namespace; + if(ns != null) { - try + foreach(var mth in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) { - var asm = Assembly.LoadFile(exec); - foreach(var type in asm.GetTypes()) + var cmd = mth.GetCustomAttributes(false).FirstOrDefault(x => x is Command); + if(cmd != null) { - var ns = type.GetCustomAttributes(false).FirstOrDefault(x => x is Namespace) as Namespace; - if(ns != null) + var tc = new TerminalCommand(); + tc.RequiresElevation = !(type.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); + + tc.NamespaceInfo = ns; + + tc.CommandInfo = cmd as Command; + tc.RequiresElevation = tc.RequiresElevation || !(mth.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); + tc.RequiredArguments = new List(); + foreach (var arg in mth.GetCustomAttributes(false).Where(x=>x is RequiresArgument)) { - foreach(var mth in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) - { - var cmd = mth.GetCustomAttributes(false).FirstOrDefault(x => x is Command); - if(cmd != null) - { - var tc = new TerminalCommand(); - tc.RequiresElevation = !(type.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); - - tc.NamespaceInfo = ns; - - tc.CommandInfo = cmd as Command; - tc.RequiresElevation = tc.RequiresElevation || !(mth.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); - tc.RequiredArguments = new List(); - foreach (var arg in mth.GetCustomAttributes(false).Where(x=>x is RequiresArgument)) - { - var rarg = arg as RequiresArgument; - tc.RequiredArguments.Add(rarg.argument); - } - var rupg = mth.GetCustomAttributes(false).FirstOrDefault(x => x is RequiresUpgradeAttribute) as RequiresUpgradeAttribute; - if (rupg != null) - tc.Dependencies = rupg.Upgrade; - else - tc.Dependencies = ""; - tc.CommandType = type; - tc.CommandHandler = mth; - if (!Commands.Contains(tc)) - Commands.Add(tc); - } - } + var rarg = arg as RequiresArgument; + tc.RequiredArguments.Add(rarg.argument); } + var rupg = mth.GetCustomAttributes(false).FirstOrDefault(x => x is RequiresUpgradeAttribute) as RequiresUpgradeAttribute; + if (rupg != null) + tc.Dependencies = rupg.Upgrade; + else + tc.Dependencies = ""; + tc.CommandType = type; + tc.CommandHandler = mth; + if (!Commands.Contains(tc)) + Commands.Add(tc); } } - catch(Exception e) - { - Console.WriteLine("[termdb] Error: " + e.ToString()); - } } } Console.WriteLine("[termdb] " + Commands.Count + " commands found."); -- cgit v1.2.3 From 2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Tue, 13 Jun 2017 20:06:38 +1000 Subject: Python API It uses a meta-language and a CSharpCodeProvider on startup. I will release a tutorial on the forums soon showing how to use it. This commit also adds an extremely basic loading screen which shows while Desktop is getting everything ready. Which can take a while if you have any Python mods. Thanks, IronPython. --- ModLauncher/App.config | 8 + ShiftOS.MFSProfiler/App.config | 8 + ShiftOS.Modding.VB.LegacySkinConverter/App.config | 8 + ShiftOS.Modding.VirtualMachine/App.config | 8 + ShiftOS.Updater/App.config | 8 + ShiftOS.WinForms/App.config | 8 + ShiftOS.WinForms/MainMenu/Loading.Designer.cs | 66 + ShiftOS.WinForms/MainMenu/Loading.cs | 31 + ShiftOS.WinForms/MainMenu/Loading.resx | 120 + ShiftOS.WinForms/MainMenu/MainMenu.cs | 13 +- ShiftOS.WinForms/Properties/Resources.Designer.cs | 15 +- ShiftOS.WinForms/ShiftOS.WinForms.csproj | 11 + ShiftOS_TheReturn/App.config | 8 + ShiftOS_TheReturn/Commands.cs | 3 +- ShiftOS_TheReturn/Lib/BaseHTTPServer.py | 614 + ShiftOS_TheReturn/Lib/Bastion.py | 180 + ShiftOS_TheReturn/Lib/CGIHTTPServer.py | 378 + ShiftOS_TheReturn/Lib/ConfigParser.py | 753 ++ ShiftOS_TheReturn/Lib/Cookie.py | 773 ++ ShiftOS_TheReturn/Lib/DocXMLRPCServer.py | 279 + ShiftOS_TheReturn/Lib/HTMLParser.py | 475 + ShiftOS_TheReturn/Lib/MimeWriter.py | 186 + ShiftOS_TheReturn/Lib/Queue.py | 244 + ShiftOS_TheReturn/Lib/SimpleHTTPServer.py | 235 + ShiftOS_TheReturn/Lib/SimpleXMLRPCServer.py | 708 + ShiftOS_TheReturn/Lib/SocketServer.py | 731 + ShiftOS_TheReturn/Lib/StringIO.py | 324 + ShiftOS_TheReturn/Lib/UserDict.py | 213 + ShiftOS_TheReturn/Lib/UserList.py | 88 + ShiftOS_TheReturn/Lib/UserString.py | 228 + ShiftOS_TheReturn/Lib/_LWPCookieJar.py | 170 + ShiftOS_TheReturn/Lib/_MozillaCookieJar.py | 149 + ShiftOS_TheReturn/Lib/__future__.py | 128 + ShiftOS_TheReturn/Lib/__phello__.foo.py | 1 + ShiftOS_TheReturn/Lib/_abcoll.py | 695 + ShiftOS_TheReturn/Lib/_osx_support.py | 502 + ShiftOS_TheReturn/Lib/_pyio.py | 2037 +++ ShiftOS_TheReturn/Lib/_strptime.py | 478 + ShiftOS_TheReturn/Lib/_threading_local.py | 251 + ShiftOS_TheReturn/Lib/_weakrefset.py | 204 + ShiftOS_TheReturn/Lib/abc.py | 185 + ShiftOS_TheReturn/Lib/aifc.py | 989 ++ ShiftOS_TheReturn/Lib/antigravity.py | 4 + ShiftOS_TheReturn/Lib/anydbm.py | 85 + ShiftOS_TheReturn/Lib/argparse.py | 2374 ++++ ShiftOS_TheReturn/Lib/ast.py | 311 + ShiftOS_TheReturn/Lib/asynchat.py | 321 + ShiftOS_TheReturn/Lib/asyncore.py | 659 + ShiftOS_TheReturn/Lib/atexit.py | 65 + ShiftOS_TheReturn/Lib/audiodev.py | 260 + ShiftOS_TheReturn/Lib/base64.py | 367 + ShiftOS_TheReturn/Lib/bdb.py | 645 + ShiftOS_TheReturn/Lib/binhex.py | 518 + ShiftOS_TheReturn/Lib/bisect.py | 92 + ShiftOS_TheReturn/Lib/calendar.py | 713 + ShiftOS_TheReturn/Lib/cgi.py | 1059 ++ ShiftOS_TheReturn/Lib/cgitb.py | 323 + ShiftOS_TheReturn/Lib/chunk.py | 169 + ShiftOS_TheReturn/Lib/cmd.py | 404 + ShiftOS_TheReturn/Lib/code.py | 310 + ShiftOS_TheReturn/Lib/codecs.py | 1113 ++ ShiftOS_TheReturn/Lib/codeop.py | 168 + ShiftOS_TheReturn/Lib/collections.py | 742 ++ ShiftOS_TheReturn/Lib/colorsys.py | 156 + ShiftOS_TheReturn/Lib/commands.py | 90 + ShiftOS_TheReturn/Lib/compileall.py | 227 + ShiftOS_TheReturn/Lib/contextlib.py | 154 + ShiftOS_TheReturn/Lib/cookielib.py | 1810 +++ ShiftOS_TheReturn/Lib/copy.py | 433 + ShiftOS_TheReturn/Lib/csv.py | 456 + ShiftOS_TheReturn/Lib/ctypes/__init__.py | 554 + ShiftOS_TheReturn/Lib/ctypes/_endian.py | 61 + ShiftOS_TheReturn/Lib/ctypes/macholib/__init__.py | 9 + ShiftOS_TheReturn/Lib/ctypes/macholib/dyld.py | 166 + ShiftOS_TheReturn/Lib/ctypes/macholib/dylib.py | 63 + ShiftOS_TheReturn/Lib/ctypes/macholib/framework.py | 65 + ShiftOS_TheReturn/Lib/ctypes/util.py | 271 + ShiftOS_TheReturn/Lib/ctypes/wintypes.py | 181 + ShiftOS_TheReturn/Lib/decimal.py | 6214 +++++++++ ShiftOS_TheReturn/Lib/difflib.py | 2057 +++ ShiftOS_TheReturn/Lib/dircache.py | 41 + ShiftOS_TheReturn/Lib/dis.py | 224 + ShiftOS_TheReturn/Lib/distutils/__init__.py | 13 + ShiftOS_TheReturn/Lib/distutils/archive_util.py | 243 + ShiftOS_TheReturn/Lib/distutils/bcppcompiler.py | 394 + ShiftOS_TheReturn/Lib/distutils/ccompiler.py | 1096 ++ ShiftOS_TheReturn/Lib/distutils/cmd.py | 457 + .../Lib/distutils/command/__init__.py | 33 + ShiftOS_TheReturn/Lib/distutils/command/bdist.py | 146 + .../Lib/distutils/command/bdist_dumb.py | 133 + .../Lib/distutils/command/bdist_rpm.py | 588 + .../Lib/distutils/command/bdist_wininst.py | 368 + ShiftOS_TheReturn/Lib/distutils/command/build.py | 147 + .../Lib/distutils/command/build_clib.py | 209 + .../Lib/distutils/command/build_ext.py | 768 ++ .../Lib/distutils/command/build_py.py | 394 + .../Lib/distutils/command/build_scripts.py | 131 + ShiftOS_TheReturn/Lib/distutils/command/check.py | 149 + ShiftOS_TheReturn/Lib/distutils/command/clean.py | 80 + ShiftOS_TheReturn/Lib/distutils/command/config.py | 357 + ShiftOS_TheReturn/Lib/distutils/command/install.py | 672 + .../Lib/distutils/command/install_data.py | 81 + .../Lib/distutils/command/install_egg_info.py | 78 + .../Lib/distutils/command/install_headers.py | 51 + .../Lib/distutils/command/install_lib.py | 219 + .../Lib/distutils/command/install_scripts.py | 64 + .../Lib/distutils/command/register.py | 315 + ShiftOS_TheReturn/Lib/distutils/command/sdist.py | 477 + ShiftOS_TheReturn/Lib/distutils/command/upload.py | 194 + ShiftOS_TheReturn/Lib/distutils/config.py | 116 + ShiftOS_TheReturn/Lib/distutils/core.py | 239 + ShiftOS_TheReturn/Lib/distutils/cygwinccompiler.py | 463 + ShiftOS_TheReturn/Lib/distutils/debug.py | 7 + ShiftOS_TheReturn/Lib/distutils/dep_util.py | 89 + ShiftOS_TheReturn/Lib/distutils/dir_util.py | 214 + ShiftOS_TheReturn/Lib/distutils/dist.py | 1249 ++ ShiftOS_TheReturn/Lib/distutils/emxccompiler.py | 319 + ShiftOS_TheReturn/Lib/distutils/errors.py | 88 + ShiftOS_TheReturn/Lib/distutils/extension.py | 255 + ShiftOS_TheReturn/Lib/distutils/fancy_getopt.py | 484 + ShiftOS_TheReturn/Lib/distutils/file_util.py | 239 + ShiftOS_TheReturn/Lib/distutils/filelist.py | 343 + ShiftOS_TheReturn/Lib/distutils/log.py | 71 + ShiftOS_TheReturn/Lib/distutils/msvccompiler.py | 659 + ShiftOS_TheReturn/Lib/distutils/spawn.py | 226 + ShiftOS_TheReturn/Lib/distutils/sysconfig.py | 483 + ShiftOS_TheReturn/Lib/distutils/text_file.py | 304 + ShiftOS_TheReturn/Lib/distutils/unixccompiler.py | 310 + ShiftOS_TheReturn/Lib/distutils/util.py | 477 + ShiftOS_TheReturn/Lib/distutils/version.py | 299 + .../Lib/distutils/versionpredicate.py | 164 + ShiftOS_TheReturn/Lib/doctest.py | 2817 ++++ ShiftOS_TheReturn/Lib/dumbdbm.py | 249 + ShiftOS_TheReturn/Lib/dummy_thread.py | 145 + ShiftOS_TheReturn/Lib/dummy_threading.py | 78 + ShiftOS_TheReturn/Lib/email/__init__.py | 123 + ShiftOS_TheReturn/Lib/email/_parseaddr.py | 497 + ShiftOS_TheReturn/Lib/email/base64mime.py | 183 + ShiftOS_TheReturn/Lib/email/charset.py | 397 + ShiftOS_TheReturn/Lib/email/encoders.py | 82 + ShiftOS_TheReturn/Lib/email/errors.py | 57 + ShiftOS_TheReturn/Lib/email/feedparser.py | 505 + ShiftOS_TheReturn/Lib/email/generator.py | 371 + ShiftOS_TheReturn/Lib/email/header.py | 514 + ShiftOS_TheReturn/Lib/email/iterators.py | 73 + ShiftOS_TheReturn/Lib/email/message.py | 797 ++ ShiftOS_TheReturn/Lib/email/mime/__init__.py | 0 ShiftOS_TheReturn/Lib/email/mime/application.py | 36 + ShiftOS_TheReturn/Lib/email/mime/audio.py | 73 + ShiftOS_TheReturn/Lib/email/mime/base.py | 26 + ShiftOS_TheReturn/Lib/email/mime/image.py | 46 + ShiftOS_TheReturn/Lib/email/mime/message.py | 34 + ShiftOS_TheReturn/Lib/email/mime/multipart.py | 47 + ShiftOS_TheReturn/Lib/email/mime/nonmultipart.py | 22 + ShiftOS_TheReturn/Lib/email/mime/text.py | 30 + ShiftOS_TheReturn/Lib/email/parser.py | 91 + ShiftOS_TheReturn/Lib/email/quoprimime.py | 336 + ShiftOS_TheReturn/Lib/email/utils.py | 323 + ShiftOS_TheReturn/Lib/encodings/__init__.py | 157 + ShiftOS_TheReturn/Lib/encodings/aliases.py | 527 + ShiftOS_TheReturn/Lib/encodings/ascii.py | 50 + ShiftOS_TheReturn/Lib/encodings/base64_codec.py | 80 + ShiftOS_TheReturn/Lib/encodings/bz2_codec.py | 103 + ShiftOS_TheReturn/Lib/encodings/charmap.py | 69 + ShiftOS_TheReturn/Lib/encodings/cp037.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1006.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1026.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1140.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1250.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1251.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1252.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1253.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1254.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1255.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1256.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1257.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1258.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp424.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp437.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp500.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp720.py | 309 + ShiftOS_TheReturn/Lib/encodings/cp737.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp775.py | 697 + ShiftOS_TheReturn/Lib/encodings/cp850.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp852.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp855.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp856.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp857.py | 694 + ShiftOS_TheReturn/Lib/encodings/cp858.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp860.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp861.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp862.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp863.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp864.py | 690 + ShiftOS_TheReturn/Lib/encodings/cp865.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp866.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp869.py | 689 + ShiftOS_TheReturn/Lib/encodings/cp874.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp875.py | 307 + ShiftOS_TheReturn/Lib/encodings/hex_codec.py | 80 + ShiftOS_TheReturn/Lib/encodings/hp_roman8.py | 152 + ShiftOS_TheReturn/Lib/encodings/idna.py | 288 + ShiftOS_TheReturn/Lib/encodings/iso8859_1.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_10.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_11.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_13.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_14.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_15.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_16.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_2.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_3.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_4.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_5.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_6.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_7.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_8.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_9.py | 307 + ShiftOS_TheReturn/Lib/encodings/koi8_r.py | 307 + ShiftOS_TheReturn/Lib/encodings/koi8_u.py | 307 + ShiftOS_TheReturn/Lib/encodings/latin_1.py | 50 + ShiftOS_TheReturn/Lib/encodings/mac_arabic.py | 698 + ShiftOS_TheReturn/Lib/encodings/mac_centeuro.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_croatian.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_cyrillic.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_farsi.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_greek.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_iceland.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_latin2.py | 183 + ShiftOS_TheReturn/Lib/encodings/mac_roman.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_romanian.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_turkish.py | 307 + ShiftOS_TheReturn/Lib/encodings/mbcs.py | 47 + ShiftOS_TheReturn/Lib/encodings/palmos.py | 83 + ShiftOS_TheReturn/Lib/encodings/ptcp154.py | 175 + ShiftOS_TheReturn/Lib/encodings/punycode.py | 238 + ShiftOS_TheReturn/Lib/encodings/quopri_codec.py | 76 + .../Lib/encodings/raw_unicode_escape.py | 45 + ShiftOS_TheReturn/Lib/encodings/rot_13.py | 119 + ShiftOS_TheReturn/Lib/encodings/string_escape.py | 38 + ShiftOS_TheReturn/Lib/encodings/tis_620.py | 307 + ShiftOS_TheReturn/Lib/encodings/undefined.py | 49 + ShiftOS_TheReturn/Lib/encodings/unicode_escape.py | 45 + .../Lib/encodings/unicode_internal.py | 45 + ShiftOS_TheReturn/Lib/encodings/utf_16.py | 126 + ShiftOS_TheReturn/Lib/encodings/utf_16_be.py | 42 + ShiftOS_TheReturn/Lib/encodings/utf_16_le.py | 42 + ShiftOS_TheReturn/Lib/encodings/utf_32.py | 150 + ShiftOS_TheReturn/Lib/encodings/utf_32_be.py | 37 + ShiftOS_TheReturn/Lib/encodings/utf_32_le.py | 37 + ShiftOS_TheReturn/Lib/encodings/utf_7.py | 38 + ShiftOS_TheReturn/Lib/encodings/utf_8.py | 42 + ShiftOS_TheReturn/Lib/encodings/utf_8_sig.py | 117 + ShiftOS_TheReturn/Lib/encodings/uu_codec.py | 130 + ShiftOS_TheReturn/Lib/encodings/zlib_codec.py | 103 + ShiftOS_TheReturn/Lib/ensurepip/__init__.py | 238 + ShiftOS_TheReturn/Lib/ensurepip/__main__.py | 4 + .../_bundled/pip-8.1.1-py2.py3-none-any.whl | Bin 0 -> 1197706 bytes .../setuptools-20.10.1-py2.py3-none-any.whl | Bin 0 -> 509211 bytes ShiftOS_TheReturn/Lib/ensurepip/_uninstall.py | 30 + ShiftOS_TheReturn/Lib/filecmp.py | 296 + ShiftOS_TheReturn/Lib/fileinput.py | 405 + ShiftOS_TheReturn/Lib/fnmatch.py | 120 + ShiftOS_TheReturn/Lib/formatter.py | 445 + ShiftOS_TheReturn/Lib/fpformat.py | 145 + ShiftOS_TheReturn/Lib/fractions.py | 605 + ShiftOS_TheReturn/Lib/ftplib.py | 1078 ++ ShiftOS_TheReturn/Lib/functools.py | 100 + ShiftOS_TheReturn/Lib/genericpath.py | 113 + ShiftOS_TheReturn/Lib/getopt.py | 210 + ShiftOS_TheReturn/Lib/getpass.py | 179 + ShiftOS_TheReturn/Lib/gettext.py | 594 + ShiftOS_TheReturn/Lib/glob.py | 100 + ShiftOS_TheReturn/Lib/gzip.py | 527 + ShiftOS_TheReturn/Lib/hashlib.py | 221 + ShiftOS_TheReturn/Lib/heapq.py | 485 + ShiftOS_TheReturn/Lib/hmac.py | 136 + ShiftOS_TheReturn/Lib/htmlentitydefs.py | 273 + ShiftOS_TheReturn/Lib/htmllib.py | 491 + ShiftOS_TheReturn/Lib/httplib.py | 1445 ++ ShiftOS_TheReturn/Lib/ihooks.py | 554 + ShiftOS_TheReturn/Lib/imaplib.py | 1536 +++ ShiftOS_TheReturn/Lib/imghdr.py | 159 + ShiftOS_TheReturn/Lib/importlib/__init__.py | 38 + ShiftOS_TheReturn/Lib/imputil.py | 725 + ShiftOS_TheReturn/Lib/inspect.py | 1064 ++ ShiftOS_TheReturn/Lib/io.py | 90 + ShiftOS_TheReturn/Lib/json/__init__.py | 352 + ShiftOS_TheReturn/Lib/json/decoder.py | 383 + ShiftOS_TheReturn/Lib/json/encoder.py | 448 + ShiftOS_TheReturn/Lib/json/scanner.py | 67 + ShiftOS_TheReturn/Lib/json/tool.py | 40 + ShiftOS_TheReturn/Lib/keyword.py | 93 + ShiftOS_TheReturn/Lib/lib2to3/__init__.py | 1 + ShiftOS_TheReturn/Lib/lib2to3/__main__.py | 4 + ShiftOS_TheReturn/Lib/lib2to3/btm_matcher.py | 168 + ShiftOS_TheReturn/Lib/lib2to3/btm_utils.py | 283 + ShiftOS_TheReturn/Lib/lib2to3/fixer_base.py | 189 + ShiftOS_TheReturn/Lib/lib2to3/fixer_util.py | 432 + ShiftOS_TheReturn/Lib/lib2to3/fixes/__init__.py | 1 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_apply.py | 59 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_asserts.py | 34 + .../Lib/lib2to3/fixes/fix_basestring.py | 14 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_buffer.py | 22 + .../Lib/lib2to3/fixes/fix_callable.py | 37 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_dict.py | 107 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_except.py | 93 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_exec.py | 40 + .../Lib/lib2to3/fixes/fix_execfile.py | 52 + .../Lib/lib2to3/fixes/fix_exitfunc.py | 72 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_filter.py | 76 + .../Lib/lib2to3/fixes/fix_funcattrs.py | 21 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_future.py | 22 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_getcwdu.py | 19 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_has_key.py | 110 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_idioms.py | 152 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_import.py | 99 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_imports.py | 145 + .../Lib/lib2to3/fixes/fix_imports2.py | 16 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_input.py | 26 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_intern.py | 46 + .../Lib/lib2to3/fixes/fix_isinstance.py | 52 + .../Lib/lib2to3/fixes/fix_itertools.py | 43 + .../Lib/lib2to3/fixes/fix_itertools_imports.py | 57 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_long.py | 19 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_map.py | 91 + .../Lib/lib2to3/fixes/fix_metaclass.py | 228 + .../Lib/lib2to3/fixes/fix_methodattrs.py | 24 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_ne.py | 23 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_next.py | 103 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_nonzero.py | 21 + .../Lib/lib2to3/fixes/fix_numliterals.py | 28 + .../Lib/lib2to3/fixes/fix_operator.py | 96 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_paren.py | 44 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_print.py | 87 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_raise.py | 90 + .../Lib/lib2to3/fixes/fix_raw_input.py | 17 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_reduce.py | 35 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_renames.py | 70 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_repr.py | 23 + .../Lib/lib2to3/fixes/fix_set_literal.py | 53 + .../Lib/lib2to3/fixes/fix_standarderror.py | 18 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_sys_exc.py | 30 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_throw.py | 56 + .../Lib/lib2to3/fixes/fix_tuple_params.py | 175 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_types.py | 62 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_unicode.py | 42 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_urllib.py | 197 + .../Lib/lib2to3/fixes/fix_ws_comma.py | 39 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_xrange.py | 73 + .../Lib/lib2to3/fixes/fix_xreadlines.py | 25 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_zip.py | 35 + ShiftOS_TheReturn/Lib/lib2to3/main.py | 269 + ShiftOS_TheReturn/Lib/lib2to3/patcomp.py | 205 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/__init__.py | 4 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/conv.py | 257 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/driver.py | 157 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/grammar.py | 185 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/literals.py | 60 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/parse.py | 201 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/pgen.py | 386 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/token.py | 83 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/tokenize.py | 502 + ShiftOS_TheReturn/Lib/lib2to3/pygram.py | 40 + ShiftOS_TheReturn/Lib/lib2to3/pytree.py | 887 ++ ShiftOS_TheReturn/Lib/lib2to3/refactor.py | 747 ++ ShiftOS_TheReturn/Lib/linecache.py | 139 + ShiftOS_TheReturn/Lib/locale.py | 2064 +++ ShiftOS_TheReturn/Lib/logging/__init__.py | 1744 +++ ShiftOS_TheReturn/Lib/logging/config.py | 919 ++ ShiftOS_TheReturn/Lib/logging/handlers.py | 1227 ++ ShiftOS_TheReturn/Lib/macpath.py | 216 + ShiftOS_TheReturn/Lib/macurl2path.py | 77 + ShiftOS_TheReturn/Lib/mailbox.py | 2240 ++++ ShiftOS_TheReturn/Lib/mailcap.py | 255 + ShiftOS_TheReturn/Lib/markupbase.py | 396 + ShiftOS_TheReturn/Lib/md5.py | 14 + ShiftOS_TheReturn/Lib/mhlib.py | 1005 ++ ShiftOS_TheReturn/Lib/mimetools.py | 250 + ShiftOS_TheReturn/Lib/mimetypes.py | 598 + ShiftOS_TheReturn/Lib/mimify.py | 468 + ShiftOS_TheReturn/Lib/modulefinder.py | 716 + ShiftOS_TheReturn/Lib/multifile.py | 162 + ShiftOS_TheReturn/Lib/multiprocessing/__init__.py | 281 + .../Lib/multiprocessing/connection.py | 477 + .../Lib/multiprocessing/dummy/__init__.py | 153 + .../Lib/multiprocessing/dummy/connection.py | 87 + ShiftOS_TheReturn/Lib/multiprocessing/forking.py | 526 + ShiftOS_TheReturn/Lib/multiprocessing/heap.py | 254 + ShiftOS_TheReturn/Lib/multiprocessing/managers.py | 1117 ++ ShiftOS_TheReturn/Lib/multiprocessing/pool.py | 744 ++ ShiftOS_TheReturn/Lib/multiprocessing/process.py | 323 + ShiftOS_TheReturn/Lib/multiprocessing/queues.py | 395 + ShiftOS_TheReturn/Lib/multiprocessing/reduction.py | 215 + .../Lib/multiprocessing/sharedctypes.py | 271 + .../Lib/multiprocessing/synchronize.py | 344 + ShiftOS_TheReturn/Lib/multiprocessing/util.py | 350 + ShiftOS_TheReturn/Lib/mutex.py | 55 + ShiftOS_TheReturn/Lib/netrc.py | 145 + ShiftOS_TheReturn/Lib/new.py | 17 + ShiftOS_TheReturn/Lib/nntplib.py | 636 + ShiftOS_TheReturn/Lib/ntpath.py | 550 + ShiftOS_TheReturn/Lib/nturl2path.py | 68 + ShiftOS_TheReturn/Lib/numbers.py | 391 + ShiftOS_TheReturn/Lib/opcode.py | 192 + ShiftOS_TheReturn/Lib/optparse.py | 1704 +++ ShiftOS_TheReturn/Lib/os.py | 742 ++ ShiftOS_TheReturn/Lib/os2emxpath.py | 160 + ShiftOS_TheReturn/Lib/pdb.py | 1341 ++ ShiftOS_TheReturn/Lib/pickle.py | 1397 ++ ShiftOS_TheReturn/Lib/pickletools.py | 2274 ++++ ShiftOS_TheReturn/Lib/pipes.py | 278 + ShiftOS_TheReturn/Lib/pkgutil.py | 591 + ShiftOS_TheReturn/Lib/platform.py | 1604 +++ ShiftOS_TheReturn/Lib/plistlib.py | 474 + ShiftOS_TheReturn/Lib/popen2.py | 201 + ShiftOS_TheReturn/Lib/poplib.py | 427 + ShiftOS_TheReturn/Lib/posixfile.py | 237 + ShiftOS_TheReturn/Lib/posixpath.py | 439 + ShiftOS_TheReturn/Lib/pprint.py | 346 + ShiftOS_TheReturn/Lib/profile.py | 610 + ShiftOS_TheReturn/Lib/pstats.py | 705 + ShiftOS_TheReturn/Lib/py_compile.py | 118 + ShiftOS_TheReturn/Lib/pyclbr.py | 344 + ShiftOS_TheReturn/Lib/pydoc.py | 2409 ++++ ShiftOS_TheReturn/Lib/pydoc_data/__init__.py | 0 ShiftOS_TheReturn/Lib/pydoc_data/topics.py | 13325 +++++++++++++++++++ ShiftOS_TheReturn/Lib/quopri.py | 237 + ShiftOS_TheReturn/Lib/random.py | 910 ++ ShiftOS_TheReturn/Lib/repr.py | 132 + ShiftOS_TheReturn/Lib/rexec.py | 588 + ShiftOS_TheReturn/Lib/rfc822.py | 1016 ++ ShiftOS_TheReturn/Lib/rlcompleter.py | 172 + ShiftOS_TheReturn/Lib/robotparser.py | 233 + ShiftOS_TheReturn/Lib/runpy.py | 290 + ShiftOS_TheReturn/Lib/sched.py | 134 + ShiftOS_TheReturn/Lib/sets.py | 557 + ShiftOS_TheReturn/Lib/sgmllib.py | 553 + ShiftOS_TheReturn/Lib/sha.py | 15 + ShiftOS_TheReturn/Lib/shelve.py | 243 + ShiftOS_TheReturn/Lib/shlex.py | 292 + ShiftOS_TheReturn/Lib/shutil.py | 564 + ShiftOS_TheReturn/Lib/site-packages/README.txt | 2 + ShiftOS_TheReturn/Lib/site.py | 604 + ShiftOS_TheReturn/Lib/smtpd.py | 555 + ShiftOS_TheReturn/Lib/smtplib.py | 883 ++ ShiftOS_TheReturn/Lib/sndhdr.py | 228 + ShiftOS_TheReturn/Lib/sqlite3/__init__.py | 32 + ShiftOS_TheReturn/Lib/sqlite3/dbapi2.py | 90 + ShiftOS_TheReturn/Lib/sqlite3/dump.py | 70 + ShiftOS_TheReturn/Lib/sre_compile.py | 596 + ShiftOS_TheReturn/Lib/sre_constants.py | 263 + ShiftOS_TheReturn/Lib/sre_parse.py | 834 ++ ShiftOS_TheReturn/Lib/ssl.py | 1037 ++ ShiftOS_TheReturn/Lib/stat.py | 96 + ShiftOS_TheReturn/Lib/statvfs.py | 18 + ShiftOS_TheReturn/Lib/string.py | 656 + ShiftOS_TheReturn/Lib/stringold.py | 432 + ShiftOS_TheReturn/Lib/stringprep.py | 272 + ShiftOS_TheReturn/Lib/struct.py | 3 + ShiftOS_TheReturn/Lib/subprocess.py | 1748 +++ ShiftOS_TheReturn/Lib/sunau.py | 493 + ShiftOS_TheReturn/Lib/sunaudio.py | 49 + ShiftOS_TheReturn/Lib/symbol.py | 114 + ShiftOS_TheReturn/Lib/sysconfig.py | 642 + ShiftOS_TheReturn/Lib/tabnanny.py | 329 + ShiftOS_TheReturn/Lib/tarfile.py | 2628 ++++ ShiftOS_TheReturn/Lib/telnetlib.py | 791 ++ ShiftOS_TheReturn/Lib/tempfile.py | 640 + ShiftOS_TheReturn/Lib/textwrap.py | 429 + ShiftOS_TheReturn/Lib/this.py | 28 + ShiftOS_TheReturn/Lib/threading.py | 1322 ++ ShiftOS_TheReturn/Lib/timeit.py | 343 + ShiftOS_TheReturn/Lib/toaiff.py | 110 + ShiftOS_TheReturn/Lib/token.py | 140 + ShiftOS_TheReturn/Lib/tokenize.py | 449 + ShiftOS_TheReturn/Lib/trace.py | 819 ++ ShiftOS_TheReturn/Lib/traceback.py | 320 + ShiftOS_TheReturn/Lib/types.py | 86 + ShiftOS_TheReturn/Lib/unittest/__init__.py | 69 + ShiftOS_TheReturn/Lib/unittest/__main__.py | 12 + ShiftOS_TheReturn/Lib/unittest/case.py | 1076 ++ ShiftOS_TheReturn/Lib/unittest/loader.py | 316 + ShiftOS_TheReturn/Lib/unittest/main.py | 236 + ShiftOS_TheReturn/Lib/unittest/result.py | 193 + ShiftOS_TheReturn/Lib/unittest/runner.py | 196 + ShiftOS_TheReturn/Lib/unittest/signals.py | 71 + ShiftOS_TheReturn/Lib/unittest/suite.py | 303 + ShiftOS_TheReturn/Lib/unittest/util.py | 156 + ShiftOS_TheReturn/Lib/urllib.py | 1660 +++ ShiftOS_TheReturn/Lib/urllib2.py | 1489 +++ ShiftOS_TheReturn/Lib/urlparse.py | 428 + ShiftOS_TheReturn/Lib/user.py | 48 + ShiftOS_TheReturn/Lib/uu.py | 196 + ShiftOS_TheReturn/Lib/uuid.py | 597 + ShiftOS_TheReturn/Lib/warnings.py | 422 + ShiftOS_TheReturn/Lib/wave.py | 517 + ShiftOS_TheReturn/Lib/weakref.py | 458 + ShiftOS_TheReturn/Lib/webbrowser.py | 704 + ShiftOS_TheReturn/Lib/whichdb.py | 117 + ShiftOS_TheReturn/Lib/wsgiref/__init__.py | 23 + ShiftOS_TheReturn/Lib/wsgiref/handlers.py | 450 + ShiftOS_TheReturn/Lib/wsgiref/headers.py | 169 + ShiftOS_TheReturn/Lib/wsgiref/simple_server.py | 163 + ShiftOS_TheReturn/Lib/wsgiref/util.py | 165 + ShiftOS_TheReturn/Lib/wsgiref/validate.py | 432 + ShiftOS_TheReturn/Lib/xdrlib.py | 248 + ShiftOS_TheReturn/Lib/xml/__init__.py | 41 + ShiftOS_TheReturn/Lib/xml/dom/NodeFilter.py | 27 + ShiftOS_TheReturn/Lib/xml/dom/__init__.py | 139 + ShiftOS_TheReturn/Lib/xml/dom/domreg.py | 99 + ShiftOS_TheReturn/Lib/xml/dom/minicompat.py | 110 + ShiftOS_TheReturn/Lib/xml/dom/minidom.py | 1941 +++ ShiftOS_TheReturn/Lib/xml/dom/pulldom.py | 351 + ShiftOS_TheReturn/Lib/xml/dom/xmlbuilder.py | 386 + ShiftOS_TheReturn/Lib/xml/etree/ElementInclude.py | 142 + ShiftOS_TheReturn/Lib/xml/etree/ElementPath.py | 303 + ShiftOS_TheReturn/Lib/xml/etree/ElementTree.py | 1684 +++ .../Lib/xml/etree/SimpleXMLTreeBuilder.py | 143 + ShiftOS_TheReturn/Lib/xml/etree/__init__.py | 33 + ShiftOS_TheReturn/Lib/xml/parsers/__init__.py | 8 + ShiftOS_TheReturn/Lib/xml/sax/__init__.py | 108 + ShiftOS_TheReturn/Lib/xml/sax/_exceptions.py | 131 + ShiftOS_TheReturn/Lib/xml/sax/handler.py | 342 + ShiftOS_TheReturn/Lib/xml/sax/saxutils.py | 353 + ShiftOS_TheReturn/Lib/xml/sax/xmlreader.py | 381 + ShiftOS_TheReturn/Lib/xmllib.py | 930 ++ ShiftOS_TheReturn/Lib/xmlrpclib.py | 1656 +++ ShiftOS_TheReturn/Lib/zipfile.py | 1541 +++ ShiftOS_TheReturn/Properties/Resources.Designer.cs | 74 +- ShiftOS_TheReturn/Properties/Resources.resx | 3 + ShiftOS_TheReturn/PythonAPI.cs | 309 + ShiftOS_TheReturn/ReflectMan.cs | 45 +- ShiftOS_TheReturn/Resources/pywintemplate.txt | 68 + ShiftOS_TheReturn/ShiftOS.Engine.csproj | 1575 +++ ShiftOS_TheReturn/packages.config | 4 + 535 files changed, 208623 insertions(+), 65 deletions(-) create mode 100644 ShiftOS.WinForms/MainMenu/Loading.Designer.cs create mode 100644 ShiftOS.WinForms/MainMenu/Loading.cs create mode 100644 ShiftOS.WinForms/MainMenu/Loading.resx create mode 100644 ShiftOS_TheReturn/Lib/BaseHTTPServer.py create mode 100644 ShiftOS_TheReturn/Lib/Bastion.py create mode 100644 ShiftOS_TheReturn/Lib/CGIHTTPServer.py create mode 100644 ShiftOS_TheReturn/Lib/ConfigParser.py create mode 100644 ShiftOS_TheReturn/Lib/Cookie.py create mode 100644 ShiftOS_TheReturn/Lib/DocXMLRPCServer.py create mode 100644 ShiftOS_TheReturn/Lib/HTMLParser.py create mode 100644 ShiftOS_TheReturn/Lib/MimeWriter.py create mode 100644 ShiftOS_TheReturn/Lib/Queue.py create mode 100644 ShiftOS_TheReturn/Lib/SimpleHTTPServer.py create mode 100644 ShiftOS_TheReturn/Lib/SimpleXMLRPCServer.py create mode 100644 ShiftOS_TheReturn/Lib/SocketServer.py create mode 100644 ShiftOS_TheReturn/Lib/StringIO.py create mode 100644 ShiftOS_TheReturn/Lib/UserDict.py create mode 100644 ShiftOS_TheReturn/Lib/UserList.py create mode 100644 ShiftOS_TheReturn/Lib/UserString.py create mode 100644 ShiftOS_TheReturn/Lib/_LWPCookieJar.py create mode 100644 ShiftOS_TheReturn/Lib/_MozillaCookieJar.py create mode 100644 ShiftOS_TheReturn/Lib/__future__.py create mode 100644 ShiftOS_TheReturn/Lib/__phello__.foo.py create mode 100644 ShiftOS_TheReturn/Lib/_abcoll.py create mode 100644 ShiftOS_TheReturn/Lib/_osx_support.py create mode 100644 ShiftOS_TheReturn/Lib/_pyio.py create mode 100644 ShiftOS_TheReturn/Lib/_strptime.py create mode 100644 ShiftOS_TheReturn/Lib/_threading_local.py create mode 100644 ShiftOS_TheReturn/Lib/_weakrefset.py create mode 100644 ShiftOS_TheReturn/Lib/abc.py create mode 100644 ShiftOS_TheReturn/Lib/aifc.py create mode 100644 ShiftOS_TheReturn/Lib/antigravity.py create mode 100644 ShiftOS_TheReturn/Lib/anydbm.py create mode 100644 ShiftOS_TheReturn/Lib/argparse.py create mode 100644 ShiftOS_TheReturn/Lib/ast.py create mode 100644 ShiftOS_TheReturn/Lib/asynchat.py create mode 100644 ShiftOS_TheReturn/Lib/asyncore.py create mode 100644 ShiftOS_TheReturn/Lib/atexit.py create mode 100644 ShiftOS_TheReturn/Lib/audiodev.py create mode 100644 ShiftOS_TheReturn/Lib/base64.py create mode 100644 ShiftOS_TheReturn/Lib/bdb.py create mode 100644 ShiftOS_TheReturn/Lib/binhex.py create mode 100644 ShiftOS_TheReturn/Lib/bisect.py create mode 100644 ShiftOS_TheReturn/Lib/calendar.py create mode 100644 ShiftOS_TheReturn/Lib/cgi.py create mode 100644 ShiftOS_TheReturn/Lib/cgitb.py create mode 100644 ShiftOS_TheReturn/Lib/chunk.py create mode 100644 ShiftOS_TheReturn/Lib/cmd.py create mode 100644 ShiftOS_TheReturn/Lib/code.py create mode 100644 ShiftOS_TheReturn/Lib/codecs.py create mode 100644 ShiftOS_TheReturn/Lib/codeop.py create mode 100644 ShiftOS_TheReturn/Lib/collections.py create mode 100644 ShiftOS_TheReturn/Lib/colorsys.py create mode 100644 ShiftOS_TheReturn/Lib/commands.py create mode 100644 ShiftOS_TheReturn/Lib/compileall.py create mode 100644 ShiftOS_TheReturn/Lib/contextlib.py create mode 100644 ShiftOS_TheReturn/Lib/cookielib.py create mode 100644 ShiftOS_TheReturn/Lib/copy.py create mode 100644 ShiftOS_TheReturn/Lib/csv.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/_endian.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/dyld.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/dylib.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/framework.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/util.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/wintypes.py create mode 100644 ShiftOS_TheReturn/Lib/decimal.py create mode 100644 ShiftOS_TheReturn/Lib/difflib.py create mode 100644 ShiftOS_TheReturn/Lib/dircache.py create mode 100644 ShiftOS_TheReturn/Lib/dis.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/archive_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/bcppcompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/ccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/cmd.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist_dumb.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist_rpm.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist_wininst.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_clib.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_ext.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_py.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_scripts.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/check.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/clean.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/config.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_data.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_egg_info.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_headers.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_lib.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_scripts.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/register.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/sdist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/upload.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/config.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/core.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/cygwinccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/debug.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/dep_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/dir_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/dist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/emxccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/errors.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/extension.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/fancy_getopt.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/file_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/filelist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/log.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/msvccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/spawn.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/sysconfig.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/text_file.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/unixccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/version.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/versionpredicate.py create mode 100644 ShiftOS_TheReturn/Lib/doctest.py create mode 100644 ShiftOS_TheReturn/Lib/dumbdbm.py create mode 100644 ShiftOS_TheReturn/Lib/dummy_thread.py create mode 100644 ShiftOS_TheReturn/Lib/dummy_threading.py create mode 100644 ShiftOS_TheReturn/Lib/email/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/email/_parseaddr.py create mode 100644 ShiftOS_TheReturn/Lib/email/base64mime.py create mode 100644 ShiftOS_TheReturn/Lib/email/charset.py create mode 100644 ShiftOS_TheReturn/Lib/email/encoders.py create mode 100644 ShiftOS_TheReturn/Lib/email/errors.py create mode 100644 ShiftOS_TheReturn/Lib/email/feedparser.py create mode 100644 ShiftOS_TheReturn/Lib/email/generator.py create mode 100644 ShiftOS_TheReturn/Lib/email/header.py create mode 100644 ShiftOS_TheReturn/Lib/email/iterators.py create mode 100644 ShiftOS_TheReturn/Lib/email/message.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/application.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/audio.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/base.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/image.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/message.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/multipart.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/nonmultipart.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/text.py create mode 100644 ShiftOS_TheReturn/Lib/email/parser.py create mode 100644 ShiftOS_TheReturn/Lib/email/quoprimime.py create mode 100644 ShiftOS_TheReturn/Lib/email/utils.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/aliases.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/ascii.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/base64_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/bz2_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/charmap.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp037.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1006.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1026.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1140.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1250.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1251.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1252.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1253.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1254.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1255.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1256.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1257.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1258.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp424.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp437.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp500.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp720.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp737.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp775.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp850.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp852.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp855.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp856.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp857.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp858.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp860.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp861.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp862.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp863.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp864.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp865.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp866.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp869.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp874.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp875.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/hex_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/hp_roman8.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/idna.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_1.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_10.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_11.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_13.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_14.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_15.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_16.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_2.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_3.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_4.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_5.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_6.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_7.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_8.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_9.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/koi8_r.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/koi8_u.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/latin_1.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_arabic.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_centeuro.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_croatian.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_cyrillic.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_farsi.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_greek.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_iceland.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_latin2.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_roman.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_romanian.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_turkish.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mbcs.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/palmos.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/ptcp154.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/punycode.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/quopri_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/raw_unicode_escape.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/rot_13.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/string_escape.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/tis_620.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/undefined.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/unicode_escape.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/unicode_internal.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_16.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_16_be.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_16_le.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_32.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_32_be.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_32_le.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_7.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_8.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_8_sig.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/uu_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/zlib_codec.py create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/__main__.py create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/_bundled/pip-8.1.1-py2.py3-none-any.whl create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/_bundled/setuptools-20.10.1-py2.py3-none-any.whl create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/_uninstall.py create mode 100644 ShiftOS_TheReturn/Lib/filecmp.py create mode 100644 ShiftOS_TheReturn/Lib/fileinput.py create mode 100644 ShiftOS_TheReturn/Lib/fnmatch.py create mode 100644 ShiftOS_TheReturn/Lib/formatter.py create mode 100644 ShiftOS_TheReturn/Lib/fpformat.py create mode 100644 ShiftOS_TheReturn/Lib/fractions.py create mode 100644 ShiftOS_TheReturn/Lib/ftplib.py create mode 100644 ShiftOS_TheReturn/Lib/functools.py create mode 100644 ShiftOS_TheReturn/Lib/genericpath.py create mode 100644 ShiftOS_TheReturn/Lib/getopt.py create mode 100644 ShiftOS_TheReturn/Lib/getpass.py create mode 100644 ShiftOS_TheReturn/Lib/gettext.py create mode 100644 ShiftOS_TheReturn/Lib/glob.py create mode 100644 ShiftOS_TheReturn/Lib/gzip.py create mode 100644 ShiftOS_TheReturn/Lib/hashlib.py create mode 100644 ShiftOS_TheReturn/Lib/heapq.py create mode 100644 ShiftOS_TheReturn/Lib/hmac.py create mode 100644 ShiftOS_TheReturn/Lib/htmlentitydefs.py create mode 100644 ShiftOS_TheReturn/Lib/htmllib.py create mode 100644 ShiftOS_TheReturn/Lib/httplib.py create mode 100644 ShiftOS_TheReturn/Lib/ihooks.py create mode 100644 ShiftOS_TheReturn/Lib/imaplib.py create mode 100644 ShiftOS_TheReturn/Lib/imghdr.py create mode 100644 ShiftOS_TheReturn/Lib/importlib/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/imputil.py create mode 100644 ShiftOS_TheReturn/Lib/inspect.py create mode 100644 ShiftOS_TheReturn/Lib/io.py create mode 100644 ShiftOS_TheReturn/Lib/json/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/json/decoder.py create mode 100644 ShiftOS_TheReturn/Lib/json/encoder.py create mode 100644 ShiftOS_TheReturn/Lib/json/scanner.py create mode 100644 ShiftOS_TheReturn/Lib/json/tool.py create mode 100644 ShiftOS_TheReturn/Lib/keyword.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/__main__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/btm_matcher.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/btm_utils.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixer_base.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixer_util.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_apply.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_asserts.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_basestring.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_buffer.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_callable.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_dict.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_except.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_exec.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_execfile.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_exitfunc.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_filter.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_funcattrs.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_future.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_getcwdu.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_has_key.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_idioms.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_import.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_imports.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_imports2.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_input.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_intern.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_isinstance.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_itertools.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_itertools_imports.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_long.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_map.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_metaclass.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_methodattrs.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_ne.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_next.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_nonzero.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_numliterals.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_operator.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_paren.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_print.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_raise.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_raw_input.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_reduce.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_renames.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_repr.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_set_literal.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_standarderror.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_sys_exc.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_throw.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_tuple_params.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_types.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_unicode.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_urllib.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_ws_comma.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_xrange.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_xreadlines.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_zip.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/main.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/patcomp.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/conv.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/driver.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/grammar.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/literals.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/parse.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/pgen.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/token.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/tokenize.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pygram.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pytree.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/refactor.py create mode 100644 ShiftOS_TheReturn/Lib/linecache.py create mode 100644 ShiftOS_TheReturn/Lib/locale.py create mode 100644 ShiftOS_TheReturn/Lib/logging/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/logging/config.py create mode 100644 ShiftOS_TheReturn/Lib/logging/handlers.py create mode 100644 ShiftOS_TheReturn/Lib/macpath.py create mode 100644 ShiftOS_TheReturn/Lib/macurl2path.py create mode 100644 ShiftOS_TheReturn/Lib/mailbox.py create mode 100644 ShiftOS_TheReturn/Lib/mailcap.py create mode 100644 ShiftOS_TheReturn/Lib/markupbase.py create mode 100644 ShiftOS_TheReturn/Lib/md5.py create mode 100644 ShiftOS_TheReturn/Lib/mhlib.py create mode 100644 ShiftOS_TheReturn/Lib/mimetools.py create mode 100644 ShiftOS_TheReturn/Lib/mimetypes.py create mode 100644 ShiftOS_TheReturn/Lib/mimify.py create mode 100644 ShiftOS_TheReturn/Lib/modulefinder.py create mode 100644 ShiftOS_TheReturn/Lib/multifile.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/connection.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/dummy/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/dummy/connection.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/forking.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/heap.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/managers.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/pool.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/process.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/queues.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/reduction.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/sharedctypes.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/synchronize.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/util.py create mode 100644 ShiftOS_TheReturn/Lib/mutex.py create mode 100644 ShiftOS_TheReturn/Lib/netrc.py create mode 100644 ShiftOS_TheReturn/Lib/new.py create mode 100644 ShiftOS_TheReturn/Lib/nntplib.py create mode 100644 ShiftOS_TheReturn/Lib/ntpath.py create mode 100644 ShiftOS_TheReturn/Lib/nturl2path.py create mode 100644 ShiftOS_TheReturn/Lib/numbers.py create mode 100644 ShiftOS_TheReturn/Lib/opcode.py create mode 100644 ShiftOS_TheReturn/Lib/optparse.py create mode 100644 ShiftOS_TheReturn/Lib/os.py create mode 100644 ShiftOS_TheReturn/Lib/os2emxpath.py create mode 100644 ShiftOS_TheReturn/Lib/pdb.py create mode 100644 ShiftOS_TheReturn/Lib/pickle.py create mode 100644 ShiftOS_TheReturn/Lib/pickletools.py create mode 100644 ShiftOS_TheReturn/Lib/pipes.py create mode 100644 ShiftOS_TheReturn/Lib/pkgutil.py create mode 100644 ShiftOS_TheReturn/Lib/platform.py create mode 100644 ShiftOS_TheReturn/Lib/plistlib.py create mode 100644 ShiftOS_TheReturn/Lib/popen2.py create mode 100644 ShiftOS_TheReturn/Lib/poplib.py create mode 100644 ShiftOS_TheReturn/Lib/posixfile.py create mode 100644 ShiftOS_TheReturn/Lib/posixpath.py create mode 100644 ShiftOS_TheReturn/Lib/pprint.py create mode 100644 ShiftOS_TheReturn/Lib/profile.py create mode 100644 ShiftOS_TheReturn/Lib/pstats.py create mode 100644 ShiftOS_TheReturn/Lib/py_compile.py create mode 100644 ShiftOS_TheReturn/Lib/pyclbr.py create mode 100644 ShiftOS_TheReturn/Lib/pydoc.py create mode 100644 ShiftOS_TheReturn/Lib/pydoc_data/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/pydoc_data/topics.py create mode 100644 ShiftOS_TheReturn/Lib/quopri.py create mode 100644 ShiftOS_TheReturn/Lib/random.py create mode 100644 ShiftOS_TheReturn/Lib/repr.py create mode 100644 ShiftOS_TheReturn/Lib/rexec.py create mode 100644 ShiftOS_TheReturn/Lib/rfc822.py create mode 100644 ShiftOS_TheReturn/Lib/rlcompleter.py create mode 100644 ShiftOS_TheReturn/Lib/robotparser.py create mode 100644 ShiftOS_TheReturn/Lib/runpy.py create mode 100644 ShiftOS_TheReturn/Lib/sched.py create mode 100644 ShiftOS_TheReturn/Lib/sets.py create mode 100644 ShiftOS_TheReturn/Lib/sgmllib.py create mode 100644 ShiftOS_TheReturn/Lib/sha.py create mode 100644 ShiftOS_TheReturn/Lib/shelve.py create mode 100644 ShiftOS_TheReturn/Lib/shlex.py create mode 100644 ShiftOS_TheReturn/Lib/shutil.py create mode 100644 ShiftOS_TheReturn/Lib/site-packages/README.txt create mode 100644 ShiftOS_TheReturn/Lib/site.py create mode 100644 ShiftOS_TheReturn/Lib/smtpd.py create mode 100644 ShiftOS_TheReturn/Lib/smtplib.py create mode 100644 ShiftOS_TheReturn/Lib/sndhdr.py create mode 100644 ShiftOS_TheReturn/Lib/sqlite3/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/sqlite3/dbapi2.py create mode 100644 ShiftOS_TheReturn/Lib/sqlite3/dump.py create mode 100644 ShiftOS_TheReturn/Lib/sre_compile.py create mode 100644 ShiftOS_TheReturn/Lib/sre_constants.py create mode 100644 ShiftOS_TheReturn/Lib/sre_parse.py create mode 100644 ShiftOS_TheReturn/Lib/ssl.py create mode 100644 ShiftOS_TheReturn/Lib/stat.py create mode 100644 ShiftOS_TheReturn/Lib/statvfs.py create mode 100644 ShiftOS_TheReturn/Lib/string.py create mode 100644 ShiftOS_TheReturn/Lib/stringold.py create mode 100644 ShiftOS_TheReturn/Lib/stringprep.py create mode 100644 ShiftOS_TheReturn/Lib/struct.py create mode 100644 ShiftOS_TheReturn/Lib/subprocess.py create mode 100644 ShiftOS_TheReturn/Lib/sunau.py create mode 100644 ShiftOS_TheReturn/Lib/sunaudio.py create mode 100644 ShiftOS_TheReturn/Lib/symbol.py create mode 100644 ShiftOS_TheReturn/Lib/sysconfig.py create mode 100644 ShiftOS_TheReturn/Lib/tabnanny.py create mode 100644 ShiftOS_TheReturn/Lib/tarfile.py create mode 100644 ShiftOS_TheReturn/Lib/telnetlib.py create mode 100644 ShiftOS_TheReturn/Lib/tempfile.py create mode 100644 ShiftOS_TheReturn/Lib/textwrap.py create mode 100644 ShiftOS_TheReturn/Lib/this.py create mode 100644 ShiftOS_TheReturn/Lib/threading.py create mode 100644 ShiftOS_TheReturn/Lib/timeit.py create mode 100644 ShiftOS_TheReturn/Lib/toaiff.py create mode 100644 ShiftOS_TheReturn/Lib/token.py create mode 100644 ShiftOS_TheReturn/Lib/tokenize.py create mode 100644 ShiftOS_TheReturn/Lib/trace.py create mode 100644 ShiftOS_TheReturn/Lib/traceback.py create mode 100644 ShiftOS_TheReturn/Lib/types.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/__main__.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/case.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/loader.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/main.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/result.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/runner.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/signals.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/suite.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/util.py create mode 100644 ShiftOS_TheReturn/Lib/urllib.py create mode 100644 ShiftOS_TheReturn/Lib/urllib2.py create mode 100644 ShiftOS_TheReturn/Lib/urlparse.py create mode 100644 ShiftOS_TheReturn/Lib/user.py create mode 100644 ShiftOS_TheReturn/Lib/uu.py create mode 100644 ShiftOS_TheReturn/Lib/uuid.py create mode 100644 ShiftOS_TheReturn/Lib/warnings.py create mode 100644 ShiftOS_TheReturn/Lib/wave.py create mode 100644 ShiftOS_TheReturn/Lib/weakref.py create mode 100644 ShiftOS_TheReturn/Lib/webbrowser.py create mode 100644 ShiftOS_TheReturn/Lib/whichdb.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/handlers.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/headers.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/simple_server.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/util.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/validate.py create mode 100644 ShiftOS_TheReturn/Lib/xdrlib.py create mode 100644 ShiftOS_TheReturn/Lib/xml/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/NodeFilter.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/domreg.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/minicompat.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/minidom.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/pulldom.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/xmlbuilder.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/ElementInclude.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/ElementPath.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/ElementTree.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/SimpleXMLTreeBuilder.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/parsers/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/_exceptions.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/handler.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/saxutils.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/xmlreader.py create mode 100644 ShiftOS_TheReturn/Lib/xmllib.py create mode 100644 ShiftOS_TheReturn/Lib/xmlrpclib.py create mode 100644 ShiftOS_TheReturn/Lib/zipfile.py create mode 100644 ShiftOS_TheReturn/PythonAPI.cs create mode 100644 ShiftOS_TheReturn/Resources/pywintemplate.txt (limited to 'ShiftOS_TheReturn/Commands.cs') diff --git a/ModLauncher/App.config b/ModLauncher/App.config index 757ddce..4e65683 100644 --- a/ModLauncher/App.config +++ b/ModLauncher/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.MFSProfiler/App.config b/ShiftOS.MFSProfiler/App.config index a0a13df..b899c11 100644 --- a/ShiftOS.MFSProfiler/App.config +++ b/ShiftOS.MFSProfiler/App.config @@ -14,6 +14,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.Modding.VB.LegacySkinConverter/App.config b/ShiftOS.Modding.VB.LegacySkinConverter/App.config index 757ddce..4e65683 100644 --- a/ShiftOS.Modding.VB.LegacySkinConverter/App.config +++ b/ShiftOS.Modding.VB.LegacySkinConverter/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.Modding.VirtualMachine/App.config b/ShiftOS.Modding.VirtualMachine/App.config index 757ddce..4e65683 100644 --- a/ShiftOS.Modding.VirtualMachine/App.config +++ b/ShiftOS.Modding.VirtualMachine/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.Updater/App.config b/ShiftOS.Updater/App.config index 757ddce..4e65683 100644 --- a/ShiftOS.Updater/App.config +++ b/ShiftOS.Updater/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.WinForms/App.config b/ShiftOS.WinForms/App.config index a0a13df..b899c11 100644 --- a/ShiftOS.WinForms/App.config +++ b/ShiftOS.WinForms/App.config @@ -14,6 +14,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.WinForms/MainMenu/Loading.Designer.cs b/ShiftOS.WinForms/MainMenu/Loading.Designer.cs new file mode 100644 index 0000000..95619d9 --- /dev/null +++ b/ShiftOS.WinForms/MainMenu/Loading.Designer.cs @@ -0,0 +1,66 @@ +namespace ShiftOS.WinForms.MainMenu +{ + partial class Loading + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label + // + this.label.Dock = System.Windows.Forms.DockStyle.Fill; + this.label.Font = new System.Drawing.Font("Tahoma", 72F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label.ForeColor = System.Drawing.Color.White; + this.label.Location = new System.Drawing.Point(0, 0); + this.label.Name = "label"; + this.label.Size = new System.Drawing.Size(284, 262); + this.label.TabIndex = 0; + this.label.Text = "Loading..."; + this.label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // Loading + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Black; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.label); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Loading"; + this.Text = "Loading"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Shown += new System.EventHandler(this.Loading_FormShown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label; + } +} \ No newline at end of file diff --git a/ShiftOS.WinForms/MainMenu/Loading.cs b/ShiftOS.WinForms/MainMenu/Loading.cs new file mode 100644 index 0000000..555f1d4 --- /dev/null +++ b/ShiftOS.WinForms/MainMenu/Loading.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ShiftOS.Engine; + +namespace ShiftOS.WinForms.MainMenu +{ + public partial class Loading : Form + { + public Loading() + { + InitializeComponent(); + } + + private void Loading_FormShown(object sender, EventArgs e) + { + // This hideous timer thing is the most reliable way to make the form update + // before it starts doing stuff. + var callback = new Timer(); + callback.Tick += (o, a) => { Desktop.CurrentDesktop.Show(); Hide(); callback.Stop(); }; + callback.Interval = 1; + callback.Start(); + } + } +} diff --git a/ShiftOS.WinForms/MainMenu/Loading.resx b/ShiftOS.WinForms/MainMenu/Loading.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ShiftOS.WinForms/MainMenu/Loading.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ShiftOS.WinForms/MainMenu/MainMenu.cs b/ShiftOS.WinForms/MainMenu/MainMenu.cs index e11edc2..1936fec 100644 --- a/ShiftOS.WinForms/MainMenu/MainMenu.cs +++ b/ShiftOS.WinForms/MainMenu/MainMenu.cs @@ -15,6 +15,11 @@ namespace ShiftOS.WinForms.MainMenu { public partial class MainMenu : Form { + private void StartGame() + { + new Loading().Show(); + } + public MainMenu(IDesktop desk) { InitializeComponent(); @@ -163,7 +168,7 @@ namespace ShiftOS.WinForms.MainMenu private void button2_Click(object sender, EventArgs e) { (Desktop.CurrentDesktop as WinformsDesktop).IsSandbox = true; - Desktop.CurrentDesktop.Show(); + StartGame(); } private void button3_Click(object sender, EventArgs e) @@ -239,7 +244,7 @@ namespace ShiftOS.WinForms.MainMenu private void btncontinue_Click(object sender, EventArgs e) { - Desktop.CurrentDesktop.Show(); + StartGame(); } @@ -253,13 +258,13 @@ namespace ShiftOS.WinForms.MainMenu if (result == true) { System.IO.File.Delete(path); - Desktop.CurrentDesktop.Show(); + StartGame(); } }); } else { - Desktop.CurrentDesktop.Show(); + StartGame(); } } } diff --git a/ShiftOS.WinForms/Properties/Resources.Designer.cs b/ShiftOS.WinForms/Properties/Resources.Designer.cs index 137db4b..2cba3c9 100644 --- a/ShiftOS.WinForms/Properties/Resources.Designer.cs +++ b/ShiftOS.WinForms/Properties/Resources.Designer.cs @@ -1094,7 +1094,7 @@ namespace ShiftOS.WinForms.Properties { /// Name: "NetXtreme Hyper Edition", /// CostPerMonth: 150, /// DownloadSpeed: 524288, //512 kb/s - /// Description: "It's time to supercharge your Shift [rest of string was truncated]";. + /// Description: "It's time to supercharge your Shiftnet experience. [rest of string was truncated]";. /// internal static string ShiftnetServices { get { @@ -1116,7 +1116,8 @@ namespace ShiftOS.WinForms.Properties { /// Name: "Icon Manager", /// Cost: 450, /// Description: "This tool allows you to add and edit application icons within ShiftOS for the small prive of 450 Codepoints!", - /// Dependencies: "skinning [rest of string was truncated]";. + /// Dependencies: "skinning", + /// Category [rest of string was truncated]";. /// internal static string Shiftorium { get { @@ -1126,7 +1127,7 @@ namespace ShiftOS.WinForms.Properties { /// /// Looks up a localized string similar to {\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} - ///{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\fl [rest of string was truncated]";. + ///{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\flo [rest of string was truncated]";. /// internal static string ShiftOS { get { @@ -1275,7 +1276,8 @@ namespace ShiftOS.WinForms.Properties { ///Eine kurze Erklärung wie du das Terminal benutzt lautet wiefolgt. Du kannst das command 'sos.help' benutzen um eine Liste aller commands aufzurufen. Schreib es ///einfach in das Terminal und drĂ¼cke <enter> um alle commands anzuzeigen. /// - ///Commands können mit argumenten versehen werden, indem du ein key-value Paar in einem {} Block hinter dem command angibst. Zum Be [rest of string was truncated]";. + ///Commands können mit argumenten versehen werden, indem du ein key-value Paar in einem {} Block hinter dem command angibst. Zum Beispiel: + /// [rest of string was truncated]";. /// internal static string strings_de { get { @@ -1294,7 +1296,8 @@ namespace ShiftOS.WinForms.Properties { ///Commands can be sent arguments by specifying a key-value pair inside a {} block at the end of the command. For example: /// ///some.command{print:\"hello\"} - ///math.add{op1 [rest of string was truncated]";. + ///math.add{op1:1,op2:2} + /// [rest of string was truncated]";. /// internal static string strings_en { get { @@ -1482,7 +1485,7 @@ namespace ShiftOS.WinForms.Properties { /// "Before you can begin with ShiftOS, you'll need to know a few things about it.", /// "One: Terminal command syntax.", /// "Inside ShiftOS, the bulk of your time is going to be spent within the Terminal.", - /// "The Terminal is an application that starts up when you turn on your computer. It allows you to execute system commands, ope [rest of string was truncated]";. + /// "The Terminal is an application that starts up when you turn on your computer. It allows you to execute system commands, open program [rest of string was truncated]";. /// internal static string sys_shiftoriumstory { get { diff --git a/ShiftOS.WinForms/ShiftOS.WinForms.csproj b/ShiftOS.WinForms/ShiftOS.WinForms.csproj index e0a53ea..31de44e 100644 --- a/ShiftOS.WinForms/ShiftOS.WinForms.csproj +++ b/ShiftOS.WinForms/ShiftOS.WinForms.csproj @@ -37,6 +37,7 @@ ..\packages\CommonMark.NET.0.15.0\lib\net45\CommonMark.dll True + ..\packages\NAudio.1.8.0\lib\net35\NAudio.dll @@ -356,6 +357,12 @@ + + Form + + + Loading.cs + Form @@ -609,6 +616,9 @@ GUILogin.cs + + Loading.cs + MainMenu.cs @@ -875,6 +885,7 @@ + diff --git a/ShiftOS_TheReturn/App.config b/ShiftOS_TheReturn/App.config index a0a13df..b899c11 100644 --- a/ShiftOS_TheReturn/App.config +++ b/ShiftOS_TheReturn/App.config @@ -14,6 +14,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index da4fb29..6f3ab15 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -804,8 +804,7 @@ shiftorium.buy{{upgrade:""{upg.ID}""}}"); foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftOSWindow)) && Shiftorium.UpgradeAttributesUnlocked(t))) foreach (var attr in Array.FindAll(type.GetCustomAttributes(false), a => a is WinOpenAttribute)) - if (Shiftorium.UpgradeAttributesUnlocked(type)) - Console.WriteLine("win.open{app:\"" + (attr as WinOpenAttribute).ID + "\"}"); + Console.WriteLine("win.open{app:\"" + (attr as WinOpenAttribute).ID + "\"}"); return true; diff --git a/ShiftOS_TheReturn/Lib/BaseHTTPServer.py b/ShiftOS_TheReturn/Lib/BaseHTTPServer.py new file mode 100644 index 0000000..3df3323 --- /dev/null +++ b/ShiftOS_TheReturn/Lib/BaseHTTPServer.py @@ -0,0 +1,614 @@ +"""HTTP server base class. + +Note: the class in this module doesn't implement any HTTP request; see +SimpleHTTPServer for simple implementations of GET, HEAD and POST +(including CGI scripts). It does, however, optionally implement HTTP/1.1 +persistent connections, as of version 0.3. + +Contents: + +- BaseHTTPRequestHandler: HTTP request handler base class +- test: test function + +XXX To do: + +- log requests even later (to capture byte count) +- log user-agent header and other interesting goodies +- send error log to separate file +""" + + +# See also: +# +# HTTP Working Group T. Berners-Lee +# INTERNET-DRAFT R. T. Fielding +# H. Frystyk Nielsen +# Expires September 8, 1995 March 8, 1995 +# +# URL: http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v10-spec-00.txt +# +# and +# +# Network Working Group R. Fielding +# Request for Comments: 2616 et al +# Obsoletes: 2068 June 1999 +# Category: Standards Track +# +# URL: http://www.faqs.org/rfcs/rfc2616.html + +# Log files +# --------- +# +# Here's a quote from the NCSA httpd docs about log file format. +# +# | The logfile format is as follows. Each line consists of: +# | +# | host rfc931 authuser [DD/Mon/YYYY:hh:mm:ss] "request" ddd bbbb +# | +# | host: Either the DNS name or the IP number of the remote client +# | rfc931: Any information returned by identd for this person, +# | - otherwise. +# | authuser: If user sent a userid for authentication, the user name, +# | - otherwise. +# | DD: Day +# | Mon: Month (calendar name) +# | YYYY: Year +# | hh: hour (24-hour format, the machine's timezone) +# | mm: minutes +# | ss: seconds +# | request: The first line of the HTTP request as sent by the client. +# | ddd: the status code returned by the server, - if not available. +# | bbbb: the total number of bytes sent, +# | *not including the HTTP/1.0 header*, - if not available +# | +# | You can determine the name of the file accessed through request. +# +# (Actually, the latter is only true if you know the server configuration +# at the time the request was made!) + +__version__ = "0.3" + +__all__ = ["HTTPServer", "BaseHTTPRequestHandler"] + +import sys +import time +import socket # For gethostbyaddr() +from warnings import filterwarnings, catch_warnings +with catch_warnings(): + if sys.py3kwarning: + filterwarnings("ignore", ".*mimetools has been removed", + DeprecationWarning) + import mimetools +import SocketServer + +# Default error message template +DEFAULT_ERROR_MESSAGE = """\ + +Error response + + +

Error response

+

Error code %(code)d. +

Message: %(message)s. +

Error code explanation: %(code)s = %(explain)s. + +""" + +DEFAULT_ERROR_CONTENT_TYPE = "text/html" + +def _quote_html(html): + return html.replace("&", "&").replace("<", "<").replace(">", ">") + +class HTTPServer(SocketServer.TCPServer): + + allow_reuse_address = 1 # Seems to make sense in testing environment + + def server_bind(self): + """Override server_bind to store the server name.""" + SocketServer.TCPServer.server_bind(self) + host, port = self.socket.getsockname()[:2] + self.server_name = socket.getfqdn(host) + self.server_port = port + + +class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler): + + """HTTP request handler base class. + + The following explanation of HTTP serves to guide you through the + code as well as to expose any misunderstandings I may have about + HTTP (so you don't need to read the code to figure out I'm wrong + :-). + + HTTP (HyperText Transfer Protocol) is an extensible protocol on + top of a reliable stream transport (e.g. TCP/IP). The protocol + recognizes three parts to a request: + + 1. One line identifying the request type and path + 2. An optional set of RFC-822-style headers + 3. An optional data part + + The headers and data are separated by a blank line. + + The first line of the request has the form + + + + where is a (case-sensitive) keyword such as GET or POST, + is a string containing path information for the request, + and should be the string "HTTP/1.0" or "HTTP/1.1". + is encoded using the URL encoding scheme (using %xx to signify + the ASCII character with hex code xx). + + The specification specifies that lines are separated by CRLF but + for compatibility with the widest range of clients recommends + servers also handle LF. Similarly, whitespace in the request line + is treated sensibly (allowing multiple spaces between components + and allowing trailing whitespace). + + Similarly, for output, lines ought to be separated by CRLF pairs + but most clients grok LF characters just fine. + + If the first line of the request has the form + + + + (i.e. is left out) then this is assumed to be an HTTP + 0.9 request; this form has no optional headers and data part and + the reply consists of just the data. + + The reply form of the HTTP 1.x protocol again has three parts: + + 1. One line giving the response code + 2. An optional set of RFC-822-style headers + 3. The data + + Again, the headers and data are separated by a blank line. + + The response code line has the form + + + + where is the protocol version ("HTTP/1.0" or "HTTP/1.1"), + is a 3-digit response code indicating success or + failure of the request, and is an optional + human-readable string explaining what the response code means. + + This server parses the request and the headers, and then calls a + function specific to the request type (). Specifically, + a request SPAM will be handled by a method do_SPAM(). If no + such method exists the server sends an error response to the + client. If it exists, it is called with no arguments: + + do_SPAM() + + Note that the request name is case sensitive (i.e. SPAM and spam + are different requests). + + The various request details are stored in instance variables: + + - client_address is the client IP address in the form (host, + port); + + - command, path and version are the broken-down request line; + + - headers is an instance of mimetools.Message (or a derived + class) containing the header information; + + - rfile is a file object open for reading positioned at the + start of the optional input data part; + + - wfile is a file object open for writing. + + IT IS IMPORTANT TO ADHERE TO THE PROTOCOL FOR WRITING! + + The first thing to be written must be the response line. Then + follow 0 or more header lines, then a blank line, and then the + actual data (if any). The meaning of the header lines depends on + the command executed by the server; in most cases, when data is + returned, there should be at least one header line of the form + + Content-type: / + + where and should be registered MIME types, + e.g. "text/html" or "text/plain". + + """ + + # The Python system version, truncated to its first component. + sys_version = "Python/" + sys.version.split()[0] + + # The server software version. You may want to override this. + # The format is multiple whitespace-separated strings, + # where each string is of the form name[/version]. + server_version = "BaseHTTP/" + __version__ + + # The default request version. This only affects responses up until + # the point where the request line is parsed, so it mainly decides what + # the client gets back when sending a malformed request line. + # Most web servers default to HTTP 0.9, i.e. don't send a status line. + default_request_version = "HTTP/0.9" + + def parse_request(self): + """Parse a request (internal). + + The request should be stored in self.raw_requestline; the results + are in self.command, self.path, self.request_version and + self.headers. + + Return True for success, False for failure; on failure, an + error is sent back. + + """ + self.command = None # set in case of error on the first line + self.request_version = version = self.default_request_version + self.close_connection = 1 + requestline = self.raw_requestline + requestline = requestline.rstrip('\r\n') + self.requestline = requestline + words = requestline.split() + if len(words) == 3: + command, path, version = words + if version[:5] != 'HTTP/': + self.send_error(400, "Bad request version (%r)" % version) + return False + try: + base_version_number = version.split('/', 1)[1] + version_number = base_version_number.split(".") + # RFC 2145 section 3.1 says there can be only one "." and + # - major and minor numbers MUST be treated as + # separate integers; + # - HTTP/2.4 is a lower version than HTTP/2.13, which in + # turn is lower than HTTP/12.3; + # - Leading zeros MUST be ignored by recipients. + if len(version_number) != 2: + raise ValueError + version_number = int(version_number[0]), int(version_number[1]) + except (ValueError, IndexError): + self.send_error(400, "Bad request version (%r)" % version) + return False + if version_number >= (1, 1) and self.protocol_version >= "HTTP/1.1": + self.close_connection = 0 + if version_number >= (2, 0): + self.send_error(505, + "Invalid HTTP Version (%s)" % base_version_number) + return False + elif len(words) == 2: + command, path = words + self.close_connection = 1 + if command != 'GET': + self.send_error(400, + "Bad HTTP/0.9 request type (%r)" % command) + return False + elif not words: + return False + else: + self.send_error(400, "Bad request syntax (%r)" % requestline) + return False + self.command, self.path, self.request_version = command, path, version + + # Examine the headers and look for a Connection directive + self.headers = self.MessageClass(self.rfile, 0) + + conntype = self.headers.get('Connection', "") + if conntype.lower() == 'close': + self.close_connection = 1 + elif (conntype.lower() == 'keep-alive' and + self.protocol_version >= "HTTP/1.1"): + self.close_connection = 0 + return True + + def handle_one_request(self): + """Handle a single HTTP request. + + You normally don't need to override this method; see the class + __doc__ string for information on how to handle specific HTTP + commands such as GET and POST. + + """ + try: + self.raw_requestline = self.rfile.readline(65537) + if len(self.raw_requestline) > 65536: + self.requestline = '' + self.request_version = '' + self.command = '' + self.send_error(414) + return + if not self.raw_requestline: + self.close_connection = 1 + return + if not self.parse_request(): + # An error code has been sent, just exit + return + mname = 'do_' + self.command + if not hasattr(self, mname): + self.send_error(501, "Unsupported method (%r)" % self.command) + return + method = getattr(self, mname) + method() + self.wfile.flush() #actually send the response if not already done. + except socket.timeout, e: + #a read or a write timed out. Discard this connection + self.log_error("Request timed out: %r", e) + self.close_connection = 1 + return + + def handle(self): + """Handle multiple requests if necessary.""" + self.close_connection = 1 + + self.handle_one_request() + while not self.close_connection: + self.handle_one_request() + + def send_error(self, code, message=None): + """Send and log an error reply. + + Arguments are the error code, and a detailed message. + The detailed message defaults to the short entry matching the + response code. + + This sends an error response (so it must be called before any + output has been generated), logs the error, and finally sends + a piece of HTML explaining the error to the user. + + """ + + try: + short, long = self.responses[code] + except KeyError: + short, long = '???', '???' + if message is None: + message = short + explain = long + self.log_error("code %d, message %s", code, message) + self.send_response(code, message) + self.send_header('Connection', 'close') + + # Message body is omitted for cases described in: + # - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified) + # - RFC7231: 6.3.6. 205(Reset Content) + content = None + if code >= 200 and code not in (204, 205, 304): + # HTML encode to prevent Cross Site Scripting attacks + # (see bug #1100201) + content = (self.error_message_format % { + 'code': code, + 'message': _quote_html(message), + 'explain': explain + }) + self.send_header("Content-Type", self.error_content_type) + self.end_headers() + + if self.command != 'HEAD' and content: + self.wfile.write(content) + + error_message_format = DEFAULT_ERROR_MESSAGE + error_content_type = DEFAULT_ERROR_CONTENT_TYPE + + def send_response(self, code, message=None): + """Send the response header and log the response code. + + Also send two standard headers with the server software + version and the current date. + + """ + self.log_request(code) + if message is None: + if code in self.responses: + message = self.responses[code][0] + else: + message = '' + if self.request_version != 'HTTP/0.9': + self.wfile.write("%s %d %s\r\n" % + (self.protocol_version, code, message)) + # print (self.protocol_version, code, message) + self.send_header('Server', self.version_string()) + self.send_header('Date', self.date_time_string()) + + def send_header(self, keyword, value): + """Send a MIME header.""" + if self.request_version != 'HTTP/0.9': + self.wfile.write("%s: %s\r\n" % (keyword, value)) + + if keyword.lower() == 'connection': + if value.lower() == 'close': + self.close_connection = 1 + elif value.lower() == 'keep-alive': + self.close_connection = 0 + + def end_headers(self): + """Send the blank line ending the MIME headers.""" + if self.request_version != 'HTTP/0.9': + self.wfile.write("\r\n") + + def log_request(self, code='-', size='-'): + """Log an accepted request. + + This is called by send_response(). + + """ + + self.log_message('"%s" %s %s', + self.requestline, str(code), str(size)) + + def log_error(self, format, *args): + """Log an error. + + This is called when a request cannot be fulfilled. By + default it passes the message on to log_message(). + + Arguments are the same as for log_message(). + + XXX This should go to the separate error log. + + """ + + self.log_message(format, *args) + + def log_message(self, format, *args): + """Log an arbitrary message. + + This is used by all other logging functions. Override + it if you have specific logging wishes. + + The first argument, FORMAT, is a format string for the + message to be logged. If the format string contains + any % escapes requiring parameters, they should be + specified as subsequent arguments (it's just like + printf!). + + The client ip address and current date/time are prefixed to every + message. + + """ + + sys.stderr.write("%s - - [%s] %s\n" % + (self.client_address[0], + self.log_date_time_string(), + format%args)) + + def version_string(self): + """Return the server software version string.""" + return self.server_version + ' ' + self.sys_version + + def date_time_string(self, timestamp=None): + """Return the current date and time formatted for a message header.""" + if timestamp is None: + timestamp = time.time() + year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) + s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( + self.weekdayname[wd], + day, self.monthname[month], year, + hh, mm, ss) + return s + + def log_date_time_string(self): + """Return the current time formatted for logging.""" + now = time.time() + year, month, day, hh, mm, ss, x, y, z = time.localtime(now) + s = "%02d/%3s/%04d %02d:%02d:%02d" % ( + day, self.monthname[month], year, hh, mm, ss) + return s + + weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + + monthname = [None, + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + + def address_string(self): + """Return the client address formatted for logging. + + This version looks up the full hostname using gethostbyaddr(), + and tries to find a name that contains at least one dot. + + """ + + host, port = self.client_address[:2] + return socket.getfqdn(host) + + # Essentially static class variables + + # The version of the HTTP protocol we support. + # Set this to HTTP/1.1 to enable automatic keepalive + protocol_version = "HTTP/1.0" + + # The Message-like class used to parse headers + MessageClass = mimetools.Message + + # Table mapping response codes to messages; entries have the + # form {code: (shortmessage, longmessage)}. + # See RFC 2616. + responses = { + 100: ('Continue', 'Request received, please continue'), + 101: ('Switching Protocols', + 'Switching to new protocol; obey Upgrade header'), + + 200: ('OK', 'Request fulfilled, document follows'), + 201: ('Created', 'Document created, URL follows'), + 202: ('Accepted', + 'Request accepted, processing continues off-line'), + 203: ('Non-Authoritative Information', 'Request fulfilled from cache'), + 204: ('No Content', 'Request fulfilled, nothing follows'), + 205: ('Reset Content', 'Clear input form for further input.'), + 206: ('Partial Content', 'Partial content follows.'), + + 300: ('Multiple Choices', + 'Object has several resources -- see URI list'), + 301: ('Moved Permanently', 'Object moved permanently -- see URI list'), + 302: ('Found', 'Object moved temporarily -- see URI list'), + 303: ('See Other', 'Object moved -- see Method and URL list'), + 304: ('Not Modified', + 'Document has not changed since given time'), + 305: ('Use Proxy', + 'You must use proxy specified in Location to access this ' + 'resource.'), + 307: ('Temporary Redirect', + 'Object moved temporarily -- see URI list'), + + 400: ('Bad Request', + 'Bad request syntax or unsupported method'), + 401: ('Unauthorized', + 'No permission -- see authorization schemes'), + 402: ('Payment Required', + 'No payment -- see charging schemes'), + 403: ('Forbidden', + 'Request forbidden -- authorization will not help'), + 404: ('Not Found', 'Nothing matches the given URI'), + 405: ('Method Not Allowed', + 'Specified method is invalid for this resource.'), + 406: ('Not Acceptable', 'URI not available in preferred format.'), + 407: ('Proxy Authentication Required', 'You must authenticate with ' + 'this proxy before proceeding.'), + 408: ('Request Timeout', 'Request timed out; try again later.'), + 409: ('Conflict', 'Request conflict.'), + 410: ('Gone', + 'URI no longer exists and has been permanently removed.'), + 411: ('Length Required', 'Client must specify Content-Length.'), + 412: ('Precondition Failed', 'Precondition in headers is false.'), + 413: ('Request Entity Too Large', 'Entity is too large.'), + 414: ('Request-URI Too Long', 'URI is too long.'), + 415: ('Unsupported Media Type', 'Entity body in unsupported format.'), + 416: ('Requested Range Not Satisfiable', + 'Cannot satisfy request range.'), + 417: ('Expectation Failed', + 'Expect condition could not be satisfied.'), + + 500: ('Internal Server Error', 'Server got itself in trouble'), + 501: ('Not Implemented', + 'Server does not support this operation'), + 502: ('Bad Gateway', 'Invalid responses from another server/proxy.'), + 503: ('Service Unavailable', + 'The server cannot process the request due to a high load'), + 504: ('Gateway Timeout', + 'The gateway server did not receive a timely response'), + 505: ('HTTP Version Not Supported', 'Cannot fulfill request.'), + } + + +def test(HandlerClass = BaseHTTPRequestHandler, + ServerClass = HTTPServer, protocol="HTTP/1.0"): + """Test the HTTP request handler class. + + This runs an HTTP server on port 8000 (or the first command line + argument). + + """ + + if sys.argv[1:]: + port = int(sys.argv[1]) + else: + port = 8000 + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + + +if __name__ == '__main__': + test() diff --git a/ShiftOS_TheReturn/Lib/Bastion.py b/ShiftOS_TheReturn/Lib/Bastion.py new file mode 100644 index 0000000..d0dddbf --- /dev/null +++ b/ShiftOS_TheReturn/Lib/Bastion.py @@ -0,0 +1,180 @@ +"""Bastionification utility. + +A bastion (for another object -- the 'original') is an object that has +the same methods as the original but does not give access to its +instance variables. Bastions have a number of uses, but the most +obvious one is to provide code executing in restricted mode with a +safe interface to an object implemented in unrestricted mode. + +The bastionification routine has an optional second argument which is +a filter function. Only those methods for which the filter method +(called with the method name as argument) returns true are accessible. +The default filter method returns true unless the method name begins +with an underscore. + +There are a number of possible implementations of bastions. We use a +'lazy' approach where the bastion's __getattr__() discipline does all +the work for a particular method the first time it is used. This is +usually fastest, especially if the user doesn't call all available +methods. The retrieved methods are stored as instance variables of +the bastion, so the overhead is only occurred on the first use of each +method. + +Detail: the bastion class has a __repr__() discipline which includes +the repr() of the original object. This is precomputed when the +bastion is created. + +""" +from warnings import warnpy3k +warnpy3k("the Bastion module has been removed in Python 3.0", stacklevel=2) +del warnpy3k + +__all__ = ["BastionClass", "Bastion"] + +from types import MethodType + + +class BastionClass: + + """Helper class used by the Bastion() function. + + You could subclass this and pass the subclass as the bastionclass + argument to the Bastion() function, as long as the constructor has + the same signature (a get() function and a name for the object). + + """ + + def __init__(self, get, name): + """Constructor. + + Arguments: + + get - a function that gets the attribute value (by name) + name - a human-readable name for the original object + (suggestion: use repr(object)) + + """ + self._get_ = get + self._name_ = name + + def __repr__(self): + """Return a representation string. + + This includes the name passed in to the constructor, so that + if you print the bastion during debugging, at least you have + some idea of what it is. + + """ + return "" % self._name_ + + def __getattr__(self, name): + """Get an as-yet undefined attribute value. + + This calls the get() function that was passed to the + constructor. The result is stored as an instance variable so + that the next time the same attribute is requested, + __getattr__() won't be invoked. + + If the get() function raises an exception, this is simply + passed on -- exceptions are not cached. + + """ + attribute = self._get_(name) + self.__dict__[name] = attribute + return attribute + + +def Bastion(object, filter = lambda name: name[:1] != '_', + name=None, bastionclass=BastionClass): + """Create a bastion for an object, using an optional filter. + + See the Bastion module's documentation for background. + + Arguments: + + object - the original object + filter - a predicate that decides whether a function name is OK; + by default all names are OK that don't start with '_' + name - the name of the object; default repr(object) + bastionclass - class used to create the bastion; default BastionClass + + """ + + raise RuntimeError, "This code is not secure in Python 2.2 and later" + + # Note: we define *two* ad-hoc functions here, get1 and get2. + # Both are intended to be called in the same way: get(name). + # It is clear that the real work (getting the attribute + # from the object and calling the filter) is done in get1. + # Why can't we pass get1 to the bastion? Because the user + # would be able to override the filter argument! With get2, + # overriding the default argument is no security loophole: + # all it does is call it. + # Also notice that we can't place the object and filter as + # instance variables on the bastion object itself, since + # the user has full access to all instance variables! + + def get1(name, object=object, filter=filter): + """Internal function for Bastion(). See source comments.""" + if filter(name): + attribute = getattr(object, name) + if type(attribute) == MethodType: + return attribute + raise AttributeError, name + + def get2(name, get1=get1): + """Internal function for Bastion(). See source comments.""" + return get1(name) + + if name is None: + name = repr(object) + return bastionclass(get2, name) + + +def _test(): + """Test the Bastion() function.""" + class Original: + def __init__(self): + self.sum = 0 + def add(self, n): + self._add(n) + def _add(self, n): + self.sum = self.sum + n + def total(self): + return self.sum + o = Original() + b = Bastion(o) + testcode = """if 1: + b.add(81) + b.add(18) + print "b.total() =", b.total() + try: + print "b.sum =", b.sum, + except: + print "inaccessible" + else: + print "accessible" + try: + print "b._add =", b._add, + except: + print "inaccessible" + else: + print "accessible" + try: + print "b._get_.func_defaults =", map(type, b._get_.func_defaults), + except: + print "inaccessible" + else: + print "accessible" + \n""" + exec testcode + print '='*20, "Using rexec:", '='*20 + import rexec + r = rexec.RExec() + m = r.add_module('__main__') + m.b = b + r.r_exec(testcode) + + +if __name__ == '__main__': + _test() diff --git a/ShiftOS_TheReturn/Lib/CGIHTTPServer.py b/ShiftOS_TheReturn/Lib/CGIHTTPServer.py new file mode 100644 index 0000000..5620083 --- /dev/null +++ b/ShiftOS_TheReturn/Lib/CGIHTTPServer.py @@ -0,0 +1,378 @@ +"""CGI-savvy HTTP Server. + +This module builds on SimpleHTTPServer by implementing GET and POST +requests to cgi-bin scripts. + +If the os.fork() function is not present (e.g. on Windows), +os.popen2() is used as a fallback, with slightly altered semantics; if +that function is not present either (e.g. on Macintosh), only Python +scripts are supported, and they are executed by the current process. + +In all cases, the implementation is intentionally naive -- all +requests are executed sychronously. + +SECURITY WARNING: DON'T USE THIS CODE UNLESS YOU ARE INSIDE A FIREWALL +-- it may execute arbitrary Python code or external programs. + +Note that status code 200 is sent prior to execution of a CGI script, so +scripts cannot send other status codes such as 302 (redirect). +""" + + +__version__ = "0.4" + +__all__ = ["CGIHTTPRequestHandler"] + +import os +import sys +import urllib +import BaseHTTPServer +import SimpleHTTPServer +import select +import copy + + +class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + + """Complete HTTP server with GET, HEAD and POST commands. + + GET and HEAD also support running CGI scripts. + + The POST command is *only* implemented for CGI scripts. + + """ + + # Determine platform specifics + have_fork = hasattr(os, 'fork') + have_popen2 = hasattr(os, 'popen2') + have_popen3 = hasattr(os, 'popen3') + + # Make rfile unbuffered -- we need to read one line and then pass + # the rest to a subprocess, so we can't use buffered input. + rbufsize = 0 + + def do_POST(self): + """Serve a POST request. + + This is only implemented for CGI scripts. + + """ + + if self.is_cgi(): + self.run_cgi() + else: + self.send_error(501, "Can only POST to CGI scripts") + + def send_head(self): + """Version of send_head that support CGI scripts""" + if self.is_cgi(): + return self.run_cgi() + else: + return SimpleHTTPServer.SimpleHTTPRequestHandler.send_head(self) + + def is_cgi(self): + """Test whether self.path corresponds to a CGI script. + + Returns True and updates the cgi_info attribute to the tuple + (dir, rest) if self.path requires running a CGI script. + Returns False otherwise. + + If any exception is raised, the caller should assume that + self.path was rejected as invalid and act accordingly. + + The default implementation tests whether the normalized url + path begins with one of the strings in self.cgi_directories + (and the next character is a '/' or the end of the string). + """ + collapsed_path = _url_collapse_path(self.path) + dir_sep = collapsed_path.find('/', 1) + head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] + if head in self.cgi_directories: + self.cgi_info = head, tail + return True + return False + + cgi_directories = ['/cgi-bin', '/htbin'] + + def is_executable(self, path): + """Test whether argument path is an executable file.""" + return executable(path) + + def is_python(self, path): + """Test whether argument path is a Python script.""" + head, tail = os.path.splitext(path) + return tail.lower() in (".py", ".pyw") + + def run_cgi(self): + """Execute a CGI script.""" + dir, rest = self.cgi_info + path = dir + '/' + rest + i = path.find('/', len(dir)+1) + while i >= 0: + nextdir = path[:i] + nextrest = path[i+1:] + + scriptdir = self.translate_path(nextdir) + if os.path.isdir(scriptdir): + dir, rest = nextdir, nextrest + i = path.find('/', len(dir)+1) + else: + break + + # find an explicit query string, if present. + rest, _, query = rest.partition('?') + + # dissect the part after the directory name into a script name & + # a possible additional path, to be stored in PATH_INFO. + i = rest.find('/') + if i >= 0: + script, rest = rest[:i], rest[i:] + else: + script, rest = rest, '' + + scriptname = dir + '/' + script + scriptfile = self.translate_path(scriptname) + if not os.path.exists(scriptfile): + self.send_error(404, "No such CGI script (%r)" % scriptname) + return + if not os.path.isfile(scriptfile): + self.send_error(403, "CGI script is not a plain file (%r)" % + scriptname) + return + ispy = self.is_python(scriptname) + if not ispy: + if not (self.have_fork or self.have_popen2 or self.have_popen3): + self.send_error(403, "CGI script is not a Python script (%r)" % + scriptname) + return + if not self.is_executable(scriptfile): + self.send_error(403, "CGI script is not executable (%r)" % + scriptname) + return + + # Reference: http://hoohoo.ncsa.uiuc.edu/cgi/env.html + # XXX Much of the following could be prepared ahead of time! + env = copy.deepcopy(os.environ) + env['SERVER_SOFTWARE'] = self.version_string() + env['SERVER_NAME'] = self.server.server_name + env['GATEWAY_INTERFACE'] = 'CGI/1.1' + env['SERVER_PROTOCOL'] = self.protocol_version + env['SERVER_PORT'] = str(self.server.server_port) + env['REQUEST_METHOD'] = self.command + uqrest = urllib.unquote(rest) + env['PATH_INFO'] = uqrest + env['PATH_TRANSLATED'] = self.translate_path(uqrest) + env['SCRIPT_NAME'] = scriptname + if query: + env['QUERY_STRING'] = query + host = self.address_string() + if host != self.client_address[0]: + env['REMOTE_HOST'] = host + env['REMOTE_ADDR'] = self.client_address[0] + authorization = self.headers.getheader("authorization") + if authorization: + authorization = authorization.split() + if len(authorization) == 2: + import base64, binascii + env['AUTH_TYPE'] = authorization[0] + if authorization[0].lower() == "basic": + try: + authorization = base64.decodestring(authorization[1]) + except binascii.Error: + pass + else: + authorization = authorization.split(':') + if len(authorization) == 2: + env['REMOTE_USER'] = authorization[0] + # XXX REMOTE_IDENT + if self.headers.typeheader is None: + env['CONTENT_TYPE'] = self.headers.type + else: + env['CONTENT_TYPE'] = self.headers.typeheader + length = self.headers.getheader('content-length') + if length: + env['CONTENT_LENGTH'] = length + referer = self.headers.getheader('referer') + if referer: + env['HTTP_REFERER'] = referer + accept = [] + for line in self.headers.getallmatchingheaders('accept'): + if line[:1] in "\t\n\r ": + accept.append(line.strip()) + else: + accept = accept + line[7:].split(',') + env['HTTP_ACCEPT'] = ','.join(accept) + ua = self.headers.getheader('user-agent') + if ua: + env['HTTP_USER_AGENT'] = ua + co = filter(None, self.headers.getheaders('cookie')) + if co: + env['HTTP_COOKIE'] = ', '.join(co) + # XXX Other HTTP_* headers + # Since we're setting the env in the parent, provide empty + # values to override previously set values + for k in ('QUERY_STRING', 'REMOTE_HOST', 'CONTENT_LENGTH', + 'HTTP_USER_AGENT', 'HTTP_COOKIE', 'HTTP_REFERER'): + env.setdefault(k, "") + + self.send_response(200, "Script output follows") + + decoded_query = query.replace('+', ' ') + + if self.have_fork: + # Unix -- fork as we should + args = [script] + if '=' not in decoded_query: + args.append(decoded_query) + nobody = nobody_uid() + self.wfile.flush() # Always flush before forking + pid = os.fork() + if pid != 0: + # Parent + pid, sts = os.waitpid(pid, 0) + # throw away additional data [see bug #427345] + while select.select([self.rfile], [], [], 0)[0]: + if not self.rfile.read(1): + break + if sts: + self.log_error("CGI script exit status %#x", sts) + return + # Child + try: + try: + os.setuid(nobody) + except os.error: + pass + os.dup2(self.rfile.fileno(), 0) + os.dup2(self.wfile.fileno(), 1) + os.execve(scriptfile, args, env) + except: + self.server.handle_error(self.request, self.client_address) + os._exit(127) + + else: + # Non Unix - use subprocess + import subprocess + cmdline = [scriptfile] + if self.is_python(scriptfile): + interp = sys.executable + if interp.lower().endswith("w.exe"): + # On Windows, use python.exe, not pythonw.exe + interp = interp[:-5] + interp[-4:] + cmdline = [interp, '-u'] + cmdline + if '=' not in query: + cmdline.append(query) + + self.log_message("command: %s", subprocess.list2cmdline(cmdline)) + try: + nbytes = int(length) + except (TypeError, ValueError): + nbytes = 0 + p = subprocess.Popen(cmdline, + stdin = subprocess.PIPE, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE, + env = env + ) + if self.command.lower() == "post" and nbytes > 0: + data = self.rfile.read(nbytes) + else: + data = None + # throw away additional data [see bug #427345] + while select.select([self.rfile._sock], [], [], 0)[0]: + if not self.rfile._sock.recv(1): + break + stdout, stderr = p.communicate(data) + self.wfile.write(stdout) + if stderr: + self.log_error('%s', stderr) + p.stderr.close() + p.stdout.close() + status = p.returncode + if status: + self.log_error("CGI script exit status %#x", status) + else: + self.log_message("CGI script exited OK") + + +def _url_collapse_path(path): + """ + Given a URL path, remove extra '/'s and '.' path elements and collapse + any '..' references and returns a colllapsed path. + + Implements something akin to RFC-2396 5.2 step 6 to parse relative paths. + The utility of this function is limited to is_cgi method and helps + preventing some security attacks. + + Returns: The reconstituted URL, which will always start with a '/'. + + Raises: IndexError if too many '..' occur within the path. + + """ + # Query component should not be involved. + path, _, query = path.partition('?') + path = urllib.unquote(path) + + # Similar to os.path.split(os.path.normpath(path)) but specific to URL + # path semantics rather than local operating system semantics. + path_parts = path.split('/') + head_parts = [] + for part in path_parts[:-1]: + if part == '..': + head_parts.pop() # IndexError if more '..' than prior parts + elif part and part != '.': + head_parts.append( part ) + if path_parts: + tail_part = path_parts.pop() + if tail_part: + if tail_part == '..': + head_parts.pop() + tail_part = '' + elif tail_part == '.': + tail_part = '' + else: + tail_part = '' + + if query: + tail_part = '?'.join((tail_part, query)) + + splitpath = ('/' + '/'.join(head_parts), tail_part) + collapsed_path = "/".join(splitpath) + + return collapsed_path + + +nobody = None + +def nobody_uid(): + """Internal routine to get nobody's uid""" + global nobody + if nobody: + return nobody + try: + import pwd + except ImportError: + return -1 + try: + nobody = pwd.getpwnam('nobody')[2] + except KeyError: + nobody = 1 + max(map(lambda x: x[2], pwd.getpwall())) + return nobody + + +def executable(path): + """Test for executable file.""" + try: + st = os.stat(path) + except os.error: + return False + return st.st_mode & 0111 != 0 + + +def test(HandlerClass = CGIHTTPRequestHandler, + ServerClass = BaseHTTPServer.HTTPServer): + SimpleHTTPServer.test(HandlerClass, ServerClass) + + +if __name__ == '__main__': + test() diff --git a/ShiftOS_TheReturn/Lib/ConfigParser.py b/ShiftOS_TheReturn/Lib/ConfigParser.py new file mode 100644 index 0000000..7e6cdbc --- /dev/null +++ b/ShiftOS_TheReturn/Lib/ConfigParser.py @@ -0,0 +1,753 @@ +"""Configuration file parser. + +A setup file consists of sections, lead by a "[section]" header, +and followed by "name: value" entries, with continuations and such in +the style of RFC 822. + +The option values can contain format strings which refer to other values in +the same section, or values in a special [DEFAULT] section. + +For example: + + something: %(dir)s/whatever + +would resolve the "%(dir)s" to the value of dir. All reference +expansions are done late, on demand. + +Intrinsic defaults can be specified by passing them into the +ConfigParser constructor as a dictionary. + +class: + +ConfigParser -- responsible for parsing a list of + configuration files, and managing the parsed database. + + methods: + + __init__(defaults=None) + create the parser and specify a dictionary of intrinsic defaults. The + keys must be strings, the values must be appropriate for %()s string + interpolation. Note that `__name__' is always an intrinsic default; + its value is the section's name. + + sections() + return all the configuration section names, sans DEFAULT + + has_section(section) + return whether the given section exists + + has_option(section, option) + return whether the given option exists in the given section + + options(section) + return list of configuration options for the named section + + read(filenames) + read and parse the list of named configuration files, given by + name. A single filename is also allowed. Non-existing files + are ignored. Return list of successfully read files. + + readfp(fp, filename=None) + read and parse one configuration file, given as a file object. + The filename defaults to fp.name; it is only used in error + messages (if fp has no `name' attribute, the string `' is used). + + get(section, option, raw=False, vars=None) + return a string value for the named option. All % interpolations are + expanded in the return values, based on the defaults passed into the + constructor and the DEFAULT section. Additional substitutions may be + provided using the `vars' argument, which must be a dictionary whose + contents override any pre-existing defaults. + + getint(section, options) + like get(), but convert value to an integer + + getfloat(section, options) + like get(), but convert value to a float + + getboolean(section, options) + like get(), but convert value to a boolean (currently case + insensitively defined as 0, false, no, off for False, and 1, true, + yes, on for True). Returns False or True. + + items(section, raw=False, vars=None) + return a list of tuples with (name, value) for each option + in the section. + + remove_section(section) + remove the given file section and all its options + + remove_option(section, option) + remove the given option from the given section + + set(section, option, value) + set the given option + + write(fp) + write the configuration state in .ini format +""" + +try: + from collections import OrderedDict as _default_dict +except ImportError: + # fallback for setup.py which hasn't yet built _collections + _default_dict = dict + +import re + +__all__ = ["NoSectionError", "DuplicateSectionError", "NoOptionError", + "InterpolationError", "InterpolationDepthError", + "InterpolationSyntaxError", "ParsingError", + "MissingSectionHeaderError", + "ConfigParser", "SafeConfigParser", "RawConfigParser", + "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"] + +DEFAULTSECT = "DEFAULT" + +MAX_INTERPOLATION_DEPTH = 10 + + + +# exception classes +class Error(Exception): + """Base class for ConfigParser exceptions.""" + + def _get_message(self): + """Getter for 'message'; needed only to override deprecation in + BaseException.""" + return self.__message + + def _set_message(self, value): + """Setter for 'message'; needed only to override deprecation in + BaseException.""" + self.__message = value + + # BaseException.message has been deprecated since Python 2.6. To prevent + # DeprecationWarning from popping up over this pre-existing attribute, use + # a new property that takes lookup precedence. + message = property(_get_message, _set_message) + + def __init__(self, msg=''): + self.message = msg + Exception.__init__(self, msg) + + def __repr__(self): + return self.message + + __str__ = __repr__ + +class NoSectionError(Error): + """Raised when no section matches a requested option.""" + + def __init__(self, section): + Error.__init__(self, 'No section: %r' % (section,)) + self.section = section + self.args = (section, ) + +class DuplicateSectionError(Error): + """Raised when a section is multiply-created.""" + + def __init__(self, section): + Error.__init__(self, "Section %r already exists" % section) + self.section = section + self.args = (section, ) + +class NoOptionError(Error): + """A requested option was not found.""" + + def __init__(self, option, section): + Error.__init__(self, "No option %r in section: %r" % + (option, section)) + self.option = option + self.section = section + self.args = (option, section) + +class InterpolationError(Error): + """Base class for interpolation-related exceptions.""" + + def __init__(self, option, section, msg): + Error.__init__(self, msg) + self.option = option + self.section = section + self.args = (option, section, msg) + +class InterpolationMissingOptionError(InterpolationError): + """A string substitution required a setting which was not available.""" + + def __init__(self, option, section, rawval, reference): + msg = ("Bad value substitution:\n" + "\tsection: [%s]\n" + "\toption : %s\n" + "\tkey : %s\n" + "\trawval : %s\n" + % (section, option, reference, rawval)) + InterpolationError.__init__(self, option, section, msg) + self.reference = reference + self.args = (option, section, rawval, reference) + +class InterpolationSyntaxError(InterpolationError): + """Raised when the source text into which substitutions are made + does not conform to the required syntax.""" + +class InterpolationDepthError(InterpolationError): + """Raised when substitutions are nested too deeply.""" + + def __init__(self, option, section, rawval): + msg = ("Value interpolation too deeply recursive:\n" + "\tsection: [%s]\n" + "\toption : %s\n" + "\trawval : %s\n" + % (section, option, rawval)) + InterpolationError.__init__(self, option, section, msg) + self.args = (option, section, rawval) + +class ParsingError(Error): + """Raised when a configuration file does not follow legal syntax.""" + + def __init__(self, filename): + Error.__init__(self, 'File contains parsing errors: %s' % filename) + self.filename = filename + self.errors = [] + self.args = (filename, ) + + def append(self, lineno, line): + self.errors.append((lineno, line)) + self.message += '\n\t[line %2d]: %s' % (lineno, line) + +class MissingSectionHeaderError(ParsingError): + """Raised when a key-value pair is found before any section header.""" + + def __init__(self, filename, lineno, line): + Error.__init__( + self, + 'File contains no section headers.\nfile: %s, line: %d\n%r' % + (filename, lineno, line)) + self.filename = filename + self.lineno = lineno + self.line = line + self.args = (filename, lineno, line) + + +class RawConfigParser: + def __init__(self, defaults=None, dict_type=_default_dict, + allow_no_value=False): + self._dict = dict_type + self._sections = self._dict() + self._defaults = self._dict() + if allow_no_value: + self._optcre = self.OPTCRE_NV + else: + self._optcre = self.OPTCRE + if defaults: + for key, value in defaults.items(): + self._defaults[self.optionxform(key)] = value + + def defaults(self): + return self._defaults + + def sections(self): + """Return a list of section names, excluding [DEFAULT]""" + # self._sections will never have [DEFAULT] in it + return self._sections.keys() + + def add_section(self, section): + """Create a new section in the configuration. + + Raise DuplicateSectionError if a section by the specified name + already exists. Raise ValueError if name is DEFAULT or any of it's + case-insensitive variants. + """ + if section.lower() == "default": + raise ValueError, 'Invalid section name: %s' % section + + if section in self._sections: + raise DuplicateSectionError(section) + self._sections[section] = self._dict() + + def has_section(self, section): + """Indicate whether the named section is present in the configuration. + + The DEFAULT section is not acknowledged. + """ + return section in self._sections + + def options(self, section): + """Return a list of option names for the given section name.""" + try: + opts = self._sections[section].copy() + except KeyError: + raise NoSectionError(section) + opts.update(self._defaults) + if '__name__' in opts: + del opts['__name__'] + return opts.keys() + + def read(self, filenames): + """Read and parse a filename or a list of filenames. + + Files that cannot be opened are silently ignored; this is + designed so that you can specify a list of potential + configuration file locations (e.g. current directory, user's + home directory, systemwide directory), and all existing + configuration files in the list will be read. A single + filename may also be given. + + Return list of successfully read files. + """ + if isinstance(filenames, basestring): + filenames = [filenames] + read_ok = [] + for filename in filenames: + try: + fp = open(filename) + except IOError: + continue + self._read(fp, filename) + fp.close() + read_ok.append(filename) + return read_ok + + def readfp(self, fp, filename=None): + """Like read() but the argument must be a file-like object. + + The `fp' argument must have a `readline' method. Optional + second argument is the `filename', which if not given, is + taken from fp.name. If fp has no `name' attribute, `' is + used. + + """ + if filename is None: + try: + filename = fp.name + except AttributeError: + filename = '' + self._read(fp, filename) + + def get(self, section, option): + opt = self.optionxform(option) + if section not in self._sections: + if section != DEFAULTSECT: + raise NoSectionError(section) + if opt in self._defaults: + return self._defaults[opt] + else: + raise NoOptionError(option, section) + elif opt in self._sections[section]: + return self._sections[section][opt] + elif opt in self._defaults: + return self._defaults[opt] + else: + raise NoOptionError(option, section) + + def items(self, section): + try: + d2 = self._sections[section] + except KeyError: + if section != DEFAULTSECT: + raise NoSectionError(section) + d2 = self._dict() + d = self._defaults.copy() + d.update(d2) + if "__name__" in d: + del d["__name__"] + return d.items() + + def _get(self, section, conv, option): + return conv(self.get(section, option)) + + def getint(self, section, option): + return self._get(section, int, option) + + def getfloat(self, section, option): + return self._get(section, float, option) + + _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, + '0': False, 'no': False, 'false': False, 'off': False} + + def getboolean(self, section, option): + v = self.get(section, option) + if v.lower() not in self._boolean_states: + raise ValueError, 'Not a boolean: %s' % v + return self._boolean_states[v.lower()] + + def optionxform(self, optionstr): + return optionstr.lower() + + def has_option(self, section, option): + """Check for the existence of a given option in a given section.""" + if not section or section == DEFAULTSECT: + option = self.optionxform(option) + return option in self._defaults + elif section not in self._sections: + return False + else: + option = self.optionxform(option) + return (option in self._sections[section] + or option in self._defaults) + + def set(self, section, option, value=None): + """Set an option.""" + if not section or section == DEFAULTSECT: + sectdict = self._defaults + else: + try: + sectdict = self._sections[section] + except KeyError: + raise NoSectionError(section) + sectdict[self.optionxform(option)] = value + + def write(self, fp): + """Write an .ini-format representation of the configuration state.""" + if self._defaults: + fp.write("[%s]\n" % DEFAULTSECT) + for (key, value) in self._defaults.items(): + fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) + fp.write("\n") + for section in self._sections: + fp.write("[%s]\n" % section) + for (key, value) in self._sections[section].items(): + if key == "__name__": + continue + if (value is not None) or (self._optcre == self.OPTCRE): + key = " = ".join((key, str(value).replace('\n', '\n\t'))) + fp.write("%s\n" % (key)) + fp.write("\n") + + def remove_option(self, section, option): + """Remove an option.""" + if not section or section == DEFAULTSECT: + sectdict = self._defaults + else: + try: + sectdict = self._sections[section] + except KeyError: + raise NoSectionError(section) + option = self.optionxform(option) + existed = option in sectdict + if existed: + del sectdict[option] + return existed + + def remove_section(self, section): + """Remove a file section.""" + existed = section in self._sections + if existed: + del self._sections[section] + return existed + + # + # Regular expressions for parsing section headers and options. + # + SECTCRE = re.compile( + r'\[' # [ + r'(?P

[^]]+)' # very permissive! + r'\]' # ] + ) + OPTCRE = re.compile( + r'(?P