DataStore<TOleServices>
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
namespace System.Private.Windows.Ole
{
[NullableContext(1)]
[Nullable(0)]
internal sealed class DataStore<[Nullable(0)] TOleServices> : IDataObjectInternal where TOleServices : IOleServices
{
[NullableContext(2)]
[Nullable(0)]
private readonly struct DataStoreEntry
{
[Required]
public object Data { get; }
[Required]
public bool AutoConvert { get; }
public DataStoreEntry(object data, bool autoConvert)
{
Data = data;
AutoConvert = autoConvert;
}
}
[Nullable(new byte[] {
1,
1,
0,
0
})]
private readonly Dictionary<string, DataStoreEntry> _mappedData = new Dictionary<string, DataStoreEntry>(BackCompatibleStringComparer.Default);
private bool TryGetDataInternal<[Nullable(2)] T>(string format, bool autoConvert, [NotNullWhen(true)] [MaybeNullWhen(false)] out T data)
{
data = default(T);
if (string.IsNullOrWhiteSpace(format))
return false;
if (<TryGetDataInternal>g__TryGetData|1_0(format, ref autoConvert, out data))
return true;
if (!autoConvert)
return false;
List<string> list = new List<string>();
DataFormatNames.AddMappedFormats<List<string>>(format, list);
foreach (string item in list) {
if (<TryGetDataInternal>g__TryGetData|1_0(item, ref autoConvert, out data))
return true;
}
return false;
}
[return: Nullable(2)]
public object GetData(string format, bool autoConvert)
{
TryGetDataInternal(format, autoConvert, out object data);
return data;
}
[return: Nullable(2)]
public object GetData(string format)
{
return GetData(format, true);
}
[return: Nullable(2)]
public object GetData(Type format)
{
return GetData(format.FullName);
}
public void SetData(string format, bool autoConvert, [Nullable(2)] object data)
{
ArgumentException.ThrowIfNullOrWhiteSpace(format, "format");
((IOleServices)).ValidateDataStoreData(ref format, autoConvert, data);
_mappedData[format] = new DataStoreEntry(data, autoConvert);
}
public void SetData(string format, [Nullable(2)] object data)
{
SetData(format, true, data);
}
public void SetData(Type format, [Nullable(2)] object data)
{
ArgumentNullException.ThrowIfNull(format, "format");
SetData(ArgumentValidation.OrThrowIfNull<string>(format.FullName, "format.FullName"), data);
}
[NullableContext(2)]
public void SetData(object data)
{
ArgumentNullException.ThrowIfNull(data, "data");
if (data is ISerializable && !_mappedData.ContainsKey("PersistentObject"))
SetData("PersistentObject", data);
SetData(data.GetType(), data);
}
public bool GetDataPresent(Type format)
{
return GetDataPresent(format.FullName);
}
public bool GetDataPresent(string format, bool autoConvert)
{
if (string.IsNullOrWhiteSpace(format))
return false;
if (!autoConvert)
return _mappedData.ContainsKey(format);
string[] formats = GetFormats(autoConvert);
for (int i = 0; i < formats.Length; i++) {
if (format.Equals(formats[i], StringComparison.OrdinalIgnoreCase))
return true;
}
return false;
}
public bool GetDataPresent(string format)
{
return GetDataPresent(format, true);
}
public string[] GetFormats(bool autoConvert)
{
string[] array = new string[_mappedData.Keys.Count];
_mappedData.Keys.CopyTo(array, 0);
if (autoConvert) {
int num = array.Length;
HashSet<string> hashSet = new HashSet<string>(num);
for (int i = 0; i < num; i++) {
string text = array[i];
if (_mappedData[text].AutoConvert) {
hashSet.Add(text);
DataFormatNames.AddMappedFormats<HashSet<string>>(text, hashSet);
} else
hashSet.Add(text);
}
array = Enumerable.ToArray<string>((IEnumerable<string>)hashSet);
}
return array;
}
public string[] GetFormats()
{
return GetFormats(true);
}
public bool TryGetData<[Nullable(2)] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(string format, [Nullable(new byte[] {
1,
1,
2
})] Func<TypeName, Type> resolver, bool autoConvert, [NotNullWhen(true)] [MaybeNullWhen(false)] out T data)
{
return TryGetDataInternal(format, autoConvert, out data);
}
public bool TryGetData<[Nullable(2)] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(string format, bool autoConvert, [NotNullWhen(true)] [MaybeNullWhen(false)] out T data)
{
return TryGetDataInternal(format, autoConvert, out data);
}
public bool TryGetData<[Nullable(2)] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(string format, [NotNullWhen(true)] [MaybeNullWhen(false)] out T data)
{
return TryGetDataInternal(format, false, out data);
}
public bool TryGetData<[Nullable(2)] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>([NotNullWhen(true)] [MaybeNullWhen(false)] out T data)
{
return TryGetDataInternal(typeof(T).FullName, false, out data);
}
}
}