Browse Source

Added documentation to those that needed it, and internalized those that don't.

pull/46/head
Anairkoen Schno 5 years ago
parent
commit
3278c21a3d
14 changed files with 160 additions and 27 deletions
  1. +1
    -0
      IPA.Loader/IPA.Loader.csproj
  2. +1
    -1
      IPA.Loader/Loader/Composite/CompositeBSPlugin.cs
  3. +1
    -1
      IPA.Loader/Loader/Composite/CompositeIPAPlugin.cs
  4. +3
    -3
      IPA.Loader/Loader/PluginComponent.cs
  5. +13
    -3
      IPA.Loader/Loader/PluginManager.cs
  6. +19
    -4
      IPA.Loader/Logging/Printers/ColoredConsolePrinter.cs
  7. +17
    -1
      IPA.Loader/Logging/Printers/GZFilePrinter.cs
  8. +19
    -2
      IPA.Loader/Logging/Printers/GlobalLogFilePrinter.cs
  9. +23
    -2
      IPA.Loader/Logging/Printers/PluginLogFilePrinter.cs
  10. +18
    -4
      IPA.Loader/Logging/StandardLogger.cs
  11. +1
    -1
      IPA.Loader/Updating/Backup/BackupUnit.cs
  12. +8
    -0
      IPA.Loader/Utilities/Extensions.cs
  13. +27
    -2
      IPA.Loader/Utilities/LoneFunctions.cs
  14. +9
    -3
      IPA.Loader/Utilities/SteamCheck.cs

+ 1
- 0
IPA.Loader/IPA.Loader.csproj View File

@ -22,6 +22,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DocumentationFile>bin\Debug\IPA.Loader.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>


+ 1
- 1
IPA.Loader/Loader/Composite/CompositeBSPlugin.cs View File

@ -9,7 +9,7 @@ using Logger = IPA.Logging.Logger;
namespace IPA.Loader.Composite
{
public class CompositeBSPlugin : IBeatSaberPlugin
internal class CompositeBSPlugin : IBeatSaberPlugin
{
IEnumerable<IBeatSaberPlugin> plugins;


+ 1
- 1
IPA.Loader/Loader/Composite/CompositeIPAPlugin.cs View File

@ -11,7 +11,7 @@ using Logger = IPA.Logging.Logger;
namespace IPA.Loader.Composite
{
#pragma warning disable CS0618 // Type or member is obsolete
public class CompositeIPAPlugin : IPlugin
internal class CompositeIPAPlugin : IPlugin
{
IEnumerable<IPlugin> plugins;


+ 3
- 3
IPA.Loader/Loader/PluginComponent.cs View File

@ -9,13 +9,13 @@ using IPA.Logging;
namespace IPA.Loader
{
public class PluginComponent : MonoBehaviour
internal class PluginComponent : MonoBehaviour
{
private CompositeBSPlugin bsPlugins;
private CompositeIPAPlugin ipaPlugins;
private bool quitting = false;
public static PluginComponent Create()
internal static PluginComponent Create()
{
Application.logMessageReceived += delegate (string condition, string stackTrace, LogType type)
{
@ -87,7 +87,7 @@ namespace IPA.Loader
ipaPlugins.OnLevelWasLoaded(level);
}
public void OnLevelWasInitialized(int level)
void OnLevelWasInitialized(int level)
{
ipaPlugins.OnLevelWasInitialized(level);
}


+ 13
- 3
IPA.Loader/Loader/PluginManager.cs View File

@ -5,6 +5,7 @@ using IPA.Updating;
using IPA.Utilities;
using Mono.Cecil;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@ -17,17 +18,23 @@ using System.Threading.Tasks;
namespace IPA.Loader
{
/// <summary>
/// The manager class for all plugins.
/// </summary>
public static class PluginManager
{
#pragma warning disable CS0618 // Type or member is obsolete (IPlugin)
public class BSPluginMeta
internal class BSPluginMeta
{
public IBeatSaberPlugin Plugin { get; internal set; }
public string Filename { get; internal set; }
public ModsaberModInfo ModsaberInfo { get; internal set; }
}
/// <summary>
/// An <see cref="IEnumerable"/> of new Beat Saber plugins
/// </summary>
public static IEnumerable<IBeatSaberPlugin> BSPlugins
{
get
@ -52,6 +59,9 @@ namespace IPA.Loader
}
}
/// <summary>
/// An <see cref="IEnumerable"/> of old IPA plugins
/// </summary>
public static IEnumerable<IPlugin> Plugins
{
get
@ -288,7 +298,7 @@ namespace IPA.Loader
return new Tuple<IEnumerable<BSPluginMeta>, IEnumerable<IPlugin>>(bsPlugins, ipaPlugins);
}
public class AppInfo
internal class AppInfo
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);


+ 19
- 4
IPA.Loader/Logging/Printers/ColoredConsolePrinter.cs View File

@ -8,18 +8,33 @@ using IPA.Logging;
namespace IPA.Logging.Printers
{
/// <summary>
/// Prints a pretty message to the console.
/// </summary>
public class ColoredConsolePrinter : LogPrinter
{
Logger.LogLevel filter = Logger.LogLevel.All;
public override Logger.LogLevel Filter { get => filter; set => filter = value; }
ConsoleColor color = Console.ForegroundColor;
public ConsoleColor Color { get => color; set => color = value; }
/// <summary>
/// A filter for this specific printer.
/// </summary>
public override Logger.LogLevel Filter { get => filter; set => filter = value; }
/// <summary>
/// The color to print messages as.
/// </summary>
public ConsoleColor Color { get; set; } = Console.ForegroundColor;
/// <summary>
/// Prints an entry to the associated file.
/// </summary>
/// <param name="level">the <see cref="Logger.Level"/> of the message</param>
/// <param name="time">the <see cref="DateTime"/> the message was recorded at</param>
/// <param name="logName">the name of the log that sent the message</param>
/// <param name="message">the message to print</param>
public override void Print(Logger.Level level, DateTime time, string logName, string message)
{
if (((byte)level & (byte)StandardLogger.PrintFilter) == 0) return;
Console.ForegroundColor = color;
Console.ForegroundColor = Color;
foreach (var line in message.Split(new string[] { "\n", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
Console.WriteLine(string.Format(Logger.LogFormat, line, logName, time, level.ToString().ToUpper()));
Console.ResetColor();


+ 17
- 1
IPA.Loader/Logging/Printers/GZFilePrinter.cs View File

@ -10,6 +10,9 @@ using System.Threading.Tasks;
namespace IPA.Logging.Printers
{
/// <summary>
/// A <see cref="LogPrinter"/> abstract class that provides the utilities to write to a GZip file.
/// </summary>
public abstract class GZFilePrinter : LogPrinter
{
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
@ -20,13 +23,20 @@ namespace IPA.Logging.Printers
);
[DllImport("Kernel32.dll")]
static extern Int32 GetLastError();
static extern int GetLastError();
private FileInfo fileInfo;
/// <summary>
/// The <see cref="StreamWriter"/> that writes to the GZip file.
/// </summary>
protected StreamWriter fileWriter;
private GZipStream zstream;
private FileStream fstream;
/// <summary>
/// Gets the <see cref="FileInfo"/> for the file to write to without the .gz extension.
/// </summary>
/// <returns></returns>
protected abstract FileInfo GetFileInfo();
private void InitLog()
@ -64,6 +74,9 @@ namespace IPA.Logging.Printers
}
}
/// <summary>
/// Called at the start of any print session.
/// </summary>
public override sealed void StartPrint()
{
InitLog();
@ -76,6 +89,9 @@ namespace IPA.Logging.Printers
fileWriter = new StreamWriter(zstream, new UTF8Encoding(false));
}
/// <summary>
/// Called at the end of any print session.
/// </summary>
public override sealed void EndPrint()
{
fileWriter.Flush();


+ 19
- 2
IPA.Loader/Logging/Printers/GlobalLogFilePrinter.cs View File

@ -8,16 +8,33 @@ using IPA.Logging;
namespace IPA.Logging.Printers
{
class GlobalLogFilePrinter : GZFilePrinter
/// <summary>
/// A printer for all messages to a unified log location.
/// </summary>
public class GlobalLogFilePrinter : GZFilePrinter
{
/// <summary>
/// Provides a filter for this specific printer.
/// </summary>
public override Logger.LogLevel Filter { get; set; } = Logger.LogLevel.All;
public override void Print(IPA.Logging.Logger.Level level, DateTime time, string logName, string message)
/// <summary>
/// Prints an entry to the associated file.
/// </summary>
/// <param name="level">the <see cref="Logger.Level"/> of the message</param>
/// <param name="time">the <see cref="DateTime"/> the message was recorded at</param>
/// <param name="logName">the name of the log that sent the message</param>
/// <param name="message">the message to print</param>
public override void Print(Logger.Level level, DateTime time, string logName, string message)
{
foreach (var line in message.Split(new string[] { "\n", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
fileWriter.WriteLine(string.Format(Logger.LogFormat, line, logName, time, level.ToString().ToUpper()));
}
/// <summary>
/// Gets the <see cref="FileInfo"/> for the target file.
/// </summary>
/// <returns></returns>
protected override FileInfo GetFileInfo()
{
var logsDir = new DirectoryInfo("Logs");


+ 23
- 2
IPA.Loader/Logging/Printers/PluginLogFilePrinter.cs View File

@ -8,12 +8,22 @@ using System.Threading.Tasks;
namespace IPA.Logging.Printers
{
class PluginLogFilePrinter : GZFilePrinter
/// <summary>
/// Prints log messages to the file specified by the name.
/// </summary>
public class PluginLogFilePrinter : GZFilePrinter
{
/// <summary>
/// Provides a filter for this specific printer.
/// </summary>
public override Logger.LogLevel Filter { get; set; } = Logger.LogLevel.All;
private string name;
/// <summary>
/// Gets the <see cref="FileInfo"/> for the target file.
/// </summary>
/// <returns></returns>
protected override FileInfo GetFileInfo()
{
var logsDir = new DirectoryInfo(Path.Combine("Logs",name));
@ -22,12 +32,23 @@ namespace IPA.Logging.Printers
return finfo;
}
/// <summary>
/// Creates a new printer with the given name.
/// </summary>
/// <param name="name">the name of the logger</param>
public PluginLogFilePrinter(string name)
{
this.name = name;
}
public override void Print(IPA.Logging.Logger.Level level, DateTime time, string logName, string message)
/// <summary>
/// Prints an entry to the associated file.
/// </summary>
/// <param name="level">the <see cref="Logger.Level"/> of the message</param>
/// <param name="time">the <see cref="DateTime"/> the message was recorded at</param>
/// <param name="logName">the name of the log that sent the message</param>
/// <param name="message">the message to print</param>
public override void Print(Logger.Level level, DateTime time, string logName, string message)
{
foreach (var line in message.Split(new string[] { "\n", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
fileWriter.WriteLine(string.Format("[{3} @ {2:HH:mm:ss}] {0}", line, logName, time, level.ToString().ToUpper()));


+ 18
- 4
IPA.Loader/Logging/StandardLogger.cs View File

@ -8,12 +8,14 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using IPA;
using LoggerBase = IPA.Logging.Logger;
using IPA.Logging.Printers;
namespace IPA.Logging
{
public class StandardLogger : LoggerBase
/// <summary>
/// The default <see cref="Logger"/> implimentation.
/// </summary>
public class StandardLogger : Logger
{
private static readonly IReadOnlyList<LogPrinter> defaultPrinters = new List<LogPrinter>()
{
@ -47,6 +49,9 @@ namespace IPA.Logging
private string logName;
private static bool showSourceClass = true;
/// <summary>
/// All levels defined by this filter will be sent to loggers. All others will be ignored.
/// </summary>
public static LogLevel PrintFilter { get; set; } = LogLevel.InfoUp;
private List<LogPrinter> printers = new List<LogPrinter>(defaultPrinters);
@ -70,6 +75,11 @@ namespace IPA.Logging
}
}
/// <summary>
/// Logs a specific message at a given level.
/// </summary>
/// <param name="level">the message level</param>
/// <param name="message">the message to log</param>
public override void Log(Level level, string message)
{
_logQueue.Add(new LogMessage
@ -80,7 +90,11 @@ namespace IPA.Logging
time = DateTime.Now
});
}
/// <summary>
/// An override to <see cref="Logger.Debug(string)"/> which shows the method that called it.
/// </summary>
/// <param name="message">the message to log</param>
public override void Debug(string message)
{ // add source to message
var stfm = new StackTrace().GetFrame(1).GetMethod();
@ -144,7 +158,7 @@ namespace IPA.Logging
}
}
public static void StopLogThread()
internal static void StopLogThread()
{
_logQueue.CompleteAdding();
_logThread.Join();


+ 1
- 1
IPA.Loader/Updating/Backup/BackupUnit.cs View File

@ -69,7 +69,7 @@ namespace IPA.Updating.Backup
/// <summary>
/// Adds a file to the list of changed files and backups it.
/// </summary>
/// <param name="path"></param>
/// <param name="file"></param>
public void Add(FileInfo file)
{
var relativePath = LoneFunctions.GetRelativePath(Environment.CurrentDirectory, file.FullName);


+ 8
- 0
IPA.Loader/Utilities/Extensions.cs View File

@ -6,8 +6,16 @@ using System.Threading.Tasks;
namespace IPA.Utilities
{
/// <summary>
/// A class providing various extension methods.
/// </summary>
public static class Extensions
{
/// <summary>
/// Gets the default value for a given <see cref="Type"/>.
/// </summary>
/// <param name="type">the <see cref="Type"/> to get the default value for</param>
/// <returns>the default value of <paramref name="type"/></returns>
public static object GetDefault(this Type type)
{
if (type.IsValueType)


+ 27
- 2
IPA.Loader/Utilities/LoneFunctions.cs View File

@ -7,8 +7,16 @@ using System.Threading.Tasks;
namespace IPA.Utilities
{
/// <summary>
/// A class providing static utility functions that in any other language would just *exist*.
/// </summary>
public static class LoneFunctions
{
/// <summary>
/// Converts a hex string to a byte array.
/// </summary>
/// <param name="hex">the hex stream</param>
/// <returns>the corresponding byte array</returns>
public static byte[] StringToByteArray(string hex)
{
int NumberChars = hex.Length;
@ -18,6 +26,11 @@ namespace IPA.Utilities
return bytes;
}
/// <summary>
///
/// </summary>
/// <param name="ba"></param>
/// <returns></returns>
public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
@ -30,6 +43,12 @@ namespace IPA.Utilities
// Distributed under the MIT/X11 software license
// Ref: http://www.opensource.org/licenses/mit-license.php.
// From: https://stackoverflow.com/a/8808245/3117125
/// <summary>
/// Uses unsafe code to compare 2 byte arrays quickly.
/// </summary>
/// <param name="a1">array 1</param>
/// <param name="a2">array 2</param>
/// <returns>whether or not they are byte-for-byte equal</returns>
public static unsafe bool UnsafeCompare(byte[] a1, byte[] a2)
{
if (a1 == a2) return true;
@ -48,9 +67,15 @@ namespace IPA.Utilities
}
}
public static string GetRelativePath(string filespec, string folder)
/// <summary>
/// Gets a path relative to the provided folder.
/// </summary>
/// <param name="file">the file to relativize</param>
/// <param name="folder">the source folder</param>
/// <returns>a path to get from <paramref name="folder"/> to <paramref name="file"/></returns>
public static string GetRelativePath(string file, string folder)
{
Uri pathUri = new Uri(filespec);
Uri pathUri = new Uri(file);
// Folders must end in a slash
if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString()))
{


+ 9
- 3
IPA.Loader/Utilities/SteamCheck.cs View File

@ -6,11 +6,17 @@ using System.Threading.Tasks;
namespace IPA.Utilities
{
/// <summary>
/// Provides a utility to test if this is a Steam build of Beat Saber.
/// </summary>
public static class SteamCheck
{
public static Type SteamVRCamera;
public static Type SteamVRExternalCamera;
public static Type SteamVRFade;
private static Type SteamVRCamera;
private static Type SteamVRExternalCamera;
private static Type SteamVRFade;
/// <summary>
/// Returns <see langword="true"/> when called on a Steam installation.
/// </summary>
public static bool IsAvailable => FindSteamVRAsset();
private static bool FindSteamVRAsset()


Loading…
Cancel
Save