diff options
author | Jesse Plamondon-Willard <github@jplamondonw.com> | 2018-05-22 22:53:44 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <github@jplamondonw.com> | 2018-05-22 22:53:44 -0400 |
commit | bd04d46dd1d66b30d4f21575bbbd2e541eabcef3 (patch) | |
tree | d40fac21157dc7893e3763b34505079171163e5d /src/SMAPI/Framework/ContentManagers/IContentManager.cs | |
parent | 3e36af75d59dbd539cfb2c304281f64f1753fc9f (diff) | |
download | SMAPI-bd04d46dd1d66b30d4f21575bbbd2e541eabcef3.tar.gz SMAPI-bd04d46dd1d66b30d4f21575bbbd2e541eabcef3.tar.bz2 SMAPI-bd04d46dd1d66b30d4f21575bbbd2e541eabcef3.zip |
refactor content API to fix load errors with decentralised cache (#524)
Diffstat (limited to 'src/SMAPI/Framework/ContentManagers/IContentManager.cs')
-rw-r--r-- | src/SMAPI/Framework/ContentManagers/IContentManager.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/ContentManagers/IContentManager.cs b/src/SMAPI/Framework/ContentManagers/IContentManager.cs new file mode 100644 index 00000000..aa5be9b6 --- /dev/null +++ b/src/SMAPI/Framework/ContentManagers/IContentManager.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using Microsoft.Xna.Framework.Content; +using StardewModdingAPI.Framework.Exceptions; +using StardewValley; + +namespace StardewModdingAPI.Framework.ContentManagers +{ + /// <summary>A content manager which handles reading files.</summary> + internal interface IContentManager : IDisposable + { + /********* + ** Accessors + *********/ + /// <summary>A name for the mod manager. Not guaranteed to be unique.</summary> + string Name { get; } + + /// <summary>The current language as a constant.</summary> + LocalizedContentManager.LanguageCode Language { get; } + + /// <summary>The absolute path to the <see cref="ContentManager.RootDirectory"/>.</summary> + string FullRootDirectory { get; } + + /// <summary>Whether this content manager is for a mod folder.</summary> + bool IsModContentManager { get; } + + + /********* + ** Methods + *********/ + /// <summary>Load an asset that has been processed by the content pipeline.</summary> + /// <typeparam name="T">The type of asset to load.</typeparam> + /// <param name="assetName">The asset path relative to the loader root directory, not including the <c>.xnb</c> extension.</param> + T Load<T>(string assetName); + + /// <summary>Load an asset that has been processed by the content pipeline.</summary> + /// <typeparam name="T">The type of asset to load.</typeparam> + /// <param name="assetName">The asset path relative to the loader root directory, not including the <c>.xnb</c> extension.</param> + /// <param name="language">The language code for which to load content.</param> + T Load<T>(string assetName, LocalizedContentManager.LanguageCode language); + + /// <summary>Inject an asset into the cache.</summary> + /// <typeparam name="T">The type of asset to inject.</typeparam> + /// <param name="assetName">The asset path relative to the loader root directory, not including the <c>.xnb</c> extension.</param> + /// <param name="value">The asset value.</param> + void Inject<T>(string assetName, T value); + + /// <summary>Normalise path separators in a file path. For asset keys, see <see cref="AssertAndNormaliseAssetName"/> instead.</summary> + /// <param name="path">The file path to normalise.</param> + [Pure] + string NormalisePathSeparators(string path); + + /// <summary>Assert that the given key has a valid format and return a normalised form consistent with the underlying cache.</summary> + /// <param name="assetName">The asset key to check.</param> + /// <exception cref="SContentLoadException">The asset key is empty or contains invalid characters.</exception> + [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local", Justification = "Parameter is only used for assertion checks by design.")] + string AssertAndNormaliseAssetName(string assetName); + + /// <summary>Get the current content locale.</summary> + string GetLocale(); + + /// <summary>The locale for a language.</summary> + /// <param name="language">The language.</param> + string GetLocale(LocalizedContentManager.LanguageCode language); + + /// <summary>Get whether the content manager has already loaded and cached the given asset.</summary> + /// <param name="assetName">The asset path relative to the loader root directory, not including the <c>.xnb</c> extension.</param> + bool IsLoaded(string assetName); + + /// <summary>Get the cached asset keys.</summary> + IEnumerable<string> GetAssetKeys(); + + /// <summary>Purge matched assets from the cache.</summary> + /// <param name="predicate">Matches the asset keys to invalidate.</param> + /// <param name="dispose">Whether to dispose invalidated assets. This should only be <c>true</c> when they're being invalidated as part of a dispose, to avoid crashing the game.</param> + /// <returns>Returns the number of invalidated assets.</returns> + IEnumerable<string> InvalidateCache(Func<string, Type, bool> predicate, bool dispose = false); + } +} |