Adding some CSharp classes

This commit is contained in:
DarkFeather 2016-09-27 09:32:39 -05:00
parent 10426b1dcd
commit ffb3bf8f73
3 changed files with 145 additions and 0 deletions

View File

@ -0,0 +1,59 @@
using System;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Collections.Generic;
namespace AniNIX.Shared {
public static class ExecuteCommand {
/// <summary>
/// This method allows a CSharp app to execute a command on the OS.
/// </summary>
/// <param name=command>The command string to run as the string argument to "bash -c 'command'"</param>
/// <param name=input>The effective replacement for the command's stdin</param
/// <return>The stdout of the command</return>
/// </summary>
public static String Run(String command, String input) {
//Sanitize inputs.
if (command.Contains("\'")) {
throw new Exception("Command strings cannot include \'.");
}
//Create process.
Process proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.FileName = "/bin/bash";
proc.StartInfo.Arguments = String.Format("-c \'{0}\'",command);
proc.StartInfo.UseShellExecute=false;
ReportMessage.Log(Verbosity.Verbose,String.Format("{0} {1}",proc.StartInfo.FileName,proc.StartInfo.Arguments));
//Redirect input
proc.StartInfo.RedirectStandardOutput=true;
proc.StartInfo.RedirectStandardInput=true;
//Start process
proc.Start();
//Add input and read output.
proc.StandardInput.Write(input);
proc.StandardInput.Close();
proc.WaitForExit();
if (proc.ExitCode != 0) {
throw new Exception(String.Format("Failed to exit command with return code {0}",proc.ExitCode));
}
String stdoutString = proc.StandardOutput.ReadToEnd();
//Close up and return
proc.Close();
return stdoutString;
}
//Add polymorphism to allow no stdin
public static String Run(String command) {
return Run(command,null);
}
}
}

View File

@ -0,0 +1,47 @@
using System;
namespace AniNIX.Shared {
public enum Verbosity {
Always = -2,
Error,
Quiet = 0,
Verbose,
VeryVerbose,
Explicit,
}
public static class ReportMessage {
// Set this statically here, but allow others to override.
public static Verbosity verbosity = Verbosity.Quiet;
/// <summary>
/// Log a new message for the user.
/// </summary>
public static void Log(Verbosity level,String message) {
if (level == Verbosity.Error) {
Console.Error.WriteLine(message);
return;
}
if (ReportMessage.verbosity == Verbosity.Quiet) {
return;
}
if (level == Verbosity.Always
|| (ReportMessage.verbosity == Verbosity.Verbose && level == Verbosity.Verbose)
|| (ReportMessage.verbosity == Verbosity.VeryVerbose && (level == Verbosity.Verbose || level == Verbosity.VeryVerbose))
|| (ReportMessage.verbosity == Verbosity.Explicit && (level == Verbosity.Verbose || level == Verbosity.VeryVerbose || level == Verbosity.Explicit))
) {
Console.WriteLine(message);
}
}
public static void Log(String message) {
Log(Verbosity.VeryVerbose,message);
}
}
}

39
CSharp/WebPageAPI.csharp Normal file
View File

@ -0,0 +1,39 @@
using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text.RegularExpressions;
namespace AniNIX.Shared {
public static class WebPageAPI {
// Thanks to MSDN for this regex.
// https://msdn.microsoft.com/en-us/library/ms998267.aspx
public static Regex URLRegEx = new Regex(@"(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?");
/// <summary>
/// Get a webpage source -- we use this instead of WebClient because Mono doesn't handle SSL well on Linux.
/// /usr/bin/curl -s SOMEURL
/// </summary>
/// <param name="pageURL"> the webpage whose title we should get</param>
/// <returns> the webpage source </returns>
public static string GetPage(String pageURL) {
return ExecuteCommand.Run(String.Format("/usr/bin/curl -s {0}",pageURL));
}
/// <summary>
/// Get a webpage title
/// Should be equivalent to:
/// /bin/bash -c '/usr/bin/curl -s SOMEURL | perl -l -0777 -ne "print \$1 if /<title.*?>\s*(.*?)\s*<\/title/si"'
/// </summary>
/// <param name="pageURL"> the webpage whose title we should get</param>
/// <returns> the webpage title </returns>
public static string GetPageTitle(String pageURL) {
string source = GetPage(pageURL);
return Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;
}
}
}