File: System\Private\Windows\Ole\DataObjectCore.cs
Web Access
Project: src\src\System.Private.Windows.Core\src\System.Private.Windows.Core.csproj (System.Private.Windows.Core)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using Windows.Win32.System.Com;
using ComTypes = System.Runtime.InteropServices.ComTypes;
 
namespace System.Private.Windows.Ole;
 
internal static unsafe class DataObjectCore<TRuntime, TDataFormat, TDataObject, TIDataObject>
    where TRuntime : IRuntime<TDataFormat>
    where TDataFormat : IDataFormat<TDataFormat>
    where TDataObject : IComVisibleDataObject
{
    /// <summary>
    ///  JSON serialize the data only if the format is not a restricted deserialization format and the data is not an intrinsic type.
    /// </summary>
    /// <returns>
    ///  The passed in <paramref name="data"/> as is if the format is restricted. Otherwise the JSON serialized <paramref name="data"/>.
    /// </returns>
    internal static object TryJsonSerialize<T>(string format, T data)
    {
        if (string.IsNullOrWhiteSpace(format.OrThrowIfNull()))
        {
            throw new ArgumentException(SR.DataObjectWhitespaceEmptyFormatNotAllowed, nameof(format));
        }
 
        data.OrThrowIfNull(nameof(data));
 
        if (typeof(T) == typeof(TDataObject))
        {
            throw new InvalidOperationException(string.Format(SR.ClipboardOrDragDrop_CannotJsonSerializeDataObject, "SetData"));
        }
 
        return DataFormatNames.IsRestrictedFormat(format) || TRuntime.IsSupportedType<T>()
            ? data
            : new JsonData<T>() { JsonBytes = JsonSerializer.SerializeToUtf8Bytes(data) };
    }
 
    internal static Composition<TRuntime, TDataFormat> CreateComposition() =>
        Composition<TRuntime, TDataFormat>.CreateFromManagedDataObject(new DataStore<TRuntime>());
 
    internal static Composition<TRuntime, TDataFormat> CreateComposition(IDataObject* data) =>
        Composition<TRuntime, TDataFormat>.CreateFromNativeDataObject(data);
 
    internal static Composition<TRuntime, TDataFormat> CreateComposition(
        object data,
        Func<TIDataObject, IDataObjectInternal> adapterFactory)
    {
        if (data is IDataObjectInternal internalDataObject)
        {
            return Composition<TRuntime, TDataFormat>.CreateFromManagedDataObject(internalDataObject);
        }
        else if (data is TIDataObject iDataObject)
        {
            return Composition<TRuntime, TDataFormat>.CreateFromManagedDataObject(adapterFactory(iDataObject));
        }
        else if (data is ComTypes.IDataObject comDataObject)
        {
            return Composition<TRuntime, TDataFormat>.CreateFromRuntimeDataObject(comDataObject);
        }
 
        var composition = Composition<TRuntime, TDataFormat>.CreateFromManagedDataObject(new DataStore<TRuntime>());
        composition.SetData(data);
        return composition;
    }
}