/// <summary>Identifies a ResourceData's type based from a hint, then falling back on the intrinsic data; and returns the data as a subclass of ResourceData.</summary> public static ResourceData GetResourceData(ResourceLang lang, ResourceHint hint, Byte[] rawData) { // an alternative (and for performance reasons), if Hinting doesn't work it falls back to UnknownResourceData and it's up to the user or consumer to attempt to recast it as a specific ResourceData subclass // If it does brute-force, there should be some presumption of type based on the ResourceType rather than brute-force all members of that ResourceType if (hint != ResourceHint.Unknown) { ResourceData data; if ((data = Heuristic(lang, hint, rawData)) != null) { return(data); } } // endif hint is known defined type return(BruteForce(lang, rawData)); }
/// <summary>Tests the ResourceData type as specified by the hint. If it works it returns a ResourceData. If it fails it returns null.</summary> private static ResourceData Heuristic(ResourceLang lang, ResourceHint hint, Byte[] rawData) { // try the hint's suggestion, if it doesn't fall-back on the tried 'n' true brute-force approach ResourceData rd; switch (hint) { #region Image case ResourceHint.Bitmap: if (BmpImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.Gif: if (GifImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.Jpeg: if (JpegImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.Png: if (PngImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; #endregion #region Directory case ResourceHint.CursorDirectory: if (CursorDirectoryResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.IconDirectory: if (IconDirectoryResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; #endregion // experiment: case ResourceHint.IconImage: if (IconImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; /* case Win32ResourceType.CursorImage: * case Win32ResourceType.IconImage: * * retval = new IconCursorImageResourceData(lang, rawData); * break; * * // case Win32ResourceType.CursorAnimated: // I have zero documentation on these 'animated' types * // case Win32ResourceType.IconAnimated: * case Win32ResourceType.CursorDirectory: * case Win32ResourceType.IconDirectory: * * retval = new IconCursorDirectoryResourceData(lang, rawData); * break; * * case Win32ResourceType.Manifest: * * retval = new XmlHtmlResourceData(lang, rawData); * break; * * case Win32ResourceType.Version: * * retval = new VersionResourceData(lang, rawData); * break; */ } return(null); }