mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
312 lines
12 KiB
C#
312 lines
12 KiB
C#
// Decompiled with JetBrains decompiler
|
|||
|
|
// Type: Microsoft.Iris.CodeModel.Cpp.DllProxyServices
|
||
|
|
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
||
|
|
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
|
||
|
|
// Assembly location: C:\Program Files\Zune\UIX.dll
|
||
|
|
|
||
|
|
using Microsoft.Iris.Drawing;
|
||
|
|
using Microsoft.Iris.Markup;
|
||
|
|
using Microsoft.Iris.OS;
|
||
|
|
using Microsoft.Iris.Render;
|
||
|
|
using Microsoft.Iris.RenderAPI;
|
||
|
|
using Microsoft.Iris.Session;
|
||
|
|
using System;
|
||
|
|
using System.Runtime.InteropServices;
|
||
|
|
|
||
|
|
namespace Microsoft.Iris.CodeModel.Cpp
|
||
|
|
{
|
||
|
|
internal class DllProxyServices : IRawUIXServices
|
||
|
|
{
|
||
|
|
private static StringProxyHandleTable s_stringTable;
|
||
|
|
|
||
|
|
public static void Startup()
|
||
|
|
{
|
||
|
|
DllProxyObject.CreateHandleTable();
|
||
|
|
s_stringTable = new StringProxyHandleTable();
|
||
|
|
int num = (int)NativeApi.SpRegisterNativeServicesCallbacks(new DllProxyServices());
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void Shutdown()
|
||
|
|
{
|
||
|
|
DllProxyObject.ReleaseOutstandingProxies();
|
||
|
|
NativeMarkupDataType.ReleaseOutstandingProxies();
|
||
|
|
NativeApi.SpUnregisterNativeServicesCallbacks();
|
||
|
|
s_stringTable = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
HRESULT IRawUIXServices.NotifyChangeForObject(
|
||
|
|
IntPtr nativeObject,
|
||
|
|
uint changedID)
|
||
|
|
{
|
||
|
|
return DllProxyObject.OnChangeNotification(nativeObject, changedID);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void Crash(string message) => throw new Exception(message);
|
||
|
|
|
||
|
|
void IRawUIXServices.Crash(string message) => Crash(message);
|
||
|
|
|
||
|
|
public static string GetString(IntPtr nativeStringObject)
|
||
|
|
{
|
||
|
|
string str = null;
|
||
|
|
if (nativeStringObject != IntPtr.Zero)
|
||
|
|
{
|
||
|
|
ulong handle;
|
||
|
|
NativeApi.SpGetStringHandle(nativeStringObject, out handle);
|
||
|
|
if (handle == 0UL)
|
||
|
|
NativeApi.SpConvertStringToManaged(nativeStringObject, out handle);
|
||
|
|
s_stringTable.LookupByHandle(handle, out str);
|
||
|
|
NativeApi.SpReleaseExternalObject(nativeStringObject);
|
||
|
|
}
|
||
|
|
return str;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void CreateNativeString(string value, out IntPtr nativeObject)
|
||
|
|
{
|
||
|
|
nativeObject = IntPtr.Zero;
|
||
|
|
if (value == null || NativeApi.SpCreateNativeString(AllocateStringHandle(value), value.Length, out nativeObject))
|
||
|
|
return;
|
||
|
|
Crash("Unable to allocate string");
|
||
|
|
}
|
||
|
|
|
||
|
|
unsafe ulong IRawUIXServices.AllocateString(char* value, out int length)
|
||
|
|
{
|
||
|
|
string str = new string(value);
|
||
|
|
length = str.Length;
|
||
|
|
return AllocateStringHandle(str);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static ulong AllocateStringHandle(string value)
|
||
|
|
{
|
||
|
|
ulong handle;
|
||
|
|
s_stringTable.GetStringHandle(value, out handle);
|
||
|
|
return handle;
|
||
|
|
}
|
||
|
|
|
||
|
|
unsafe void IRawUIXServices.CopyString(
|
||
|
|
ulong handle,
|
||
|
|
char* target,
|
||
|
|
uint targetSize)
|
||
|
|
{
|
||
|
|
string source;
|
||
|
|
s_stringTable.LookupByHandle(handle, out source);
|
||
|
|
NativeApi.SpCopyString(source, target, targetSize);
|
||
|
|
}
|
||
|
|
|
||
|
|
unsafe char* IRawUIXServices.PinString(ulong handle)
|
||
|
|
{
|
||
|
|
char* chPtr;
|
||
|
|
s_stringTable.PinString(handle, out chPtr);
|
||
|
|
return chPtr;
|
||
|
|
}
|
||
|
|
|
||
|
|
void IRawUIXServices.UnpinString(ulong handle) => s_stringTable.UnpinString(handle);
|
||
|
|
|
||
|
|
void IRawUIXServices.ReleaseString(ulong handle) => s_stringTable.ReleaseStringHandle(handle, out string _);
|
||
|
|
|
||
|
|
public static UIImage GetImage(IntPtr nativeImageObject)
|
||
|
|
{
|
||
|
|
UIImage uiImage = null;
|
||
|
|
if (nativeImageObject != IntPtr.Zero)
|
||
|
|
{
|
||
|
|
ulong handle;
|
||
|
|
NativeApi.SpGetImageHandle(nativeImageObject, out handle);
|
||
|
|
if (handle == 0UL)
|
||
|
|
NativeApi.SpConvertImageToManaged(nativeImageObject, out handle);
|
||
|
|
uiImage = (UIImage)GCHandle.FromIntPtr(new IntPtr((long)handle)).Target;
|
||
|
|
NativeApi.SpReleaseExternalObject(nativeImageObject);
|
||
|
|
}
|
||
|
|
return uiImage;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static MarkupDataQuery GetDataQuery(IntPtr nativeQuery)
|
||
|
|
{
|
||
|
|
MarkupDataQuery markupDataQuery = null;
|
||
|
|
if (nativeQuery != IntPtr.Zero)
|
||
|
|
{
|
||
|
|
ulong frameworkQuery;
|
||
|
|
int internalHandle = (int)NativeApi.SpDataBaseObjectGetInternalHandle(nativeQuery, out frameworkQuery);
|
||
|
|
markupDataQuery = NativeMarkupDataQuery.LookupByHandle(frameworkQuery);
|
||
|
|
NativeApi.SpReleaseExternalObject(nativeQuery);
|
||
|
|
}
|
||
|
|
return markupDataQuery;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static MarkupDataType GetDataType(IntPtr nativeObject)
|
||
|
|
{
|
||
|
|
NativeMarkupDataType nativeMarkupDataType = null;
|
||
|
|
if (nativeObject != IntPtr.Zero)
|
||
|
|
{
|
||
|
|
ulong frameworkQuery;
|
||
|
|
int internalHandle = (int)NativeApi.SpDataBaseObjectGetInternalHandle(nativeObject, out frameworkQuery);
|
||
|
|
if (frameworkQuery != 0UL)
|
||
|
|
nativeMarkupDataType = NativeMarkupDataType.LookupByHandle(frameworkQuery);
|
||
|
|
if (nativeMarkupDataType == null)
|
||
|
|
{
|
||
|
|
ulong typeHandle;
|
||
|
|
NativeApi.SpDataBaseObjectGetTypeHandle(nativeObject, out typeHandle);
|
||
|
|
nativeMarkupDataType = NativeMarkupDataType.Create(typeHandle, nativeObject);
|
||
|
|
}
|
||
|
|
NativeApi.SpReleaseExternalObject(nativeObject);
|
||
|
|
}
|
||
|
|
return nativeMarkupDataType;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void CreateNativeImage(UIImage image, out IntPtr nativeObject)
|
||
|
|
{
|
||
|
|
nativeObject = IntPtr.Zero;
|
||
|
|
if (image == null || !NativeApi.SpCreateNativeImage(GetImageHandle(image, image.Source), image.Source, out nativeObject).IsError())
|
||
|
|
return;
|
||
|
|
Crash("Unable to allocate native image object");
|
||
|
|
}
|
||
|
|
|
||
|
|
private static ulong GetImageHandle(UIImage image, string source) => (ulong)GCHandle.ToIntPtr(GCHandle.Alloc(image)).ToInt64();
|
||
|
|
|
||
|
|
unsafe ulong IRawUIXServices.AllocateImageFromUri(
|
||
|
|
string uri,
|
||
|
|
NativeApi.IMAGE_DECODE_PARAMS* decodeParams)
|
||
|
|
{
|
||
|
|
Size maximumSize;
|
||
|
|
bool flippable;
|
||
|
|
bool antialiasEdges;
|
||
|
|
CrackDecodeParams(decodeParams, out maximumSize, out flippable, out antialiasEdges);
|
||
|
|
return GetImageHandle(new UriImage(uri, Inset.Zero, maximumSize, flippable, antialiasEdges), uri);
|
||
|
|
}
|
||
|
|
|
||
|
|
unsafe ulong IRawUIXServices.AllocateImageFromBits(
|
||
|
|
string ID,
|
||
|
|
NativeApi.UIX_RAW_IMAGE_INFO* imageInfo,
|
||
|
|
NativeApi.IMAGE_DECODE_PARAMS* decodeParams)
|
||
|
|
{
|
||
|
|
SurfaceFormat surfaceFormat;
|
||
|
|
ImageFormatUtils.RawImageFormatToSurfaceFormat(imageInfo->format, out surfaceFormat);
|
||
|
|
Size maximumSize;
|
||
|
|
bool flippable;
|
||
|
|
bool antialiasEdges;
|
||
|
|
CrackDecodeParams(decodeParams, out maximumSize, out flippable, out antialiasEdges);
|
||
|
|
Size imageSize = new Size(imageInfo->width, imageInfo->height);
|
||
|
|
return GetImageHandle(new RawImage(ID, imageSize, imageInfo->stride, surfaceFormat, imageInfo->bits, true, Inset.Zero, maximumSize, flippable, antialiasEdges), ID);
|
||
|
|
}
|
||
|
|
|
||
|
|
unsafe void IRawUIXServices.RemoveCachedImage(
|
||
|
|
string ID,
|
||
|
|
NativeApi.IMAGE_DECODE_PARAMS* decodeParams)
|
||
|
|
{
|
||
|
|
Size maximumSize;
|
||
|
|
bool flippable;
|
||
|
|
bool antialiasEdges;
|
||
|
|
CrackDecodeParams(decodeParams, out maximumSize, out flippable, out antialiasEdges);
|
||
|
|
UriImage.RemoveCache(ID, maximumSize, flippable, antialiasEdges);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static unsafe void CrackDecodeParams(
|
||
|
|
NativeApi.IMAGE_DECODE_PARAMS* decodeParams,
|
||
|
|
out Size maximumSize,
|
||
|
|
out bool flippable,
|
||
|
|
out bool antialiasEdges)
|
||
|
|
{
|
||
|
|
if ((IntPtr)decodeParams != IntPtr.Zero)
|
||
|
|
{
|
||
|
|
maximumSize = new Size(decodeParams->maximumWidth, decodeParams->maximumHeight);
|
||
|
|
flippable = decodeParams->Flippable;
|
||
|
|
antialiasEdges = decodeParams->AntialiasEdges;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
maximumSize = Size.Zero;
|
||
|
|
flippable = false;
|
||
|
|
antialiasEdges = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void IRawUIXServices.ReleaseImage(ulong handle) => GCHandle.FromIntPtr(new IntPtr((long)handle)).Free();
|
||
|
|
|
||
|
|
void IRawUIXServices.RegisterDataProvider(
|
||
|
|
string providerName,
|
||
|
|
IntPtr nativeFactoryCallback)
|
||
|
|
{
|
||
|
|
MarkupDataProvider.RegisterDataProvider(new NativeDataProviderWrapper(providerName, nativeFactoryCallback));
|
||
|
|
}
|
||
|
|
|
||
|
|
unsafe void IRawUIXServices.GetDataMapping(
|
||
|
|
string providerName,
|
||
|
|
ulong typeHandle,
|
||
|
|
IntPtr nativeCallback)
|
||
|
|
{
|
||
|
|
if (!(TypeSchema.LookupById(typeHandle) is MarkupDataTypeSchema typeSchema))
|
||
|
|
return;
|
||
|
|
MarkupDataMapping dataMapping = MarkupDataProvider.FindDataMapping(providerName, typeSchema);
|
||
|
|
NativeApi.NativeDataMappingEntry[] entries = new NativeApi.NativeDataMappingEntry[dataMapping.Mappings.Length];
|
||
|
|
for (int index = 0; index < entries.Length; ++index)
|
||
|
|
{
|
||
|
|
MarkupDataMappingEntry mapping = dataMapping.Mappings[index];
|
||
|
|
entries[index].Source = mapping.Source;
|
||
|
|
entries[index].Target = mapping.Target;
|
||
|
|
entries[index].PropertyName = mapping.Property.Name;
|
||
|
|
entries[index].PropertyTypeName = mapping.Property.PropertyType.Name;
|
||
|
|
entries[index].PropertyTypeHandle = mapping.Property.PropertyType.UniqueId;
|
||
|
|
if (mapping.Property.AlternateType != null)
|
||
|
|
{
|
||
|
|
entries[index].UnderlyingCollectionTypeName = mapping.Property.AlternateType.Name;
|
||
|
|
entries[index].UnderlyingCollectionTypeHandle = mapping.Property.AlternateType.UniqueId;
|
||
|
|
}
|
||
|
|
// ISSUE: untyped stack allocation
|
||
|
|
UIXVariant* destination = stackalloc UIXVariant[sizeof(UIXVariant)];
|
||
|
|
UIXVariant.MarshalObject(mapping.DefaultValue, destination);
|
||
|
|
entries[index].DefaultValue = *destination;
|
||
|
|
}
|
||
|
|
int num = (int)NativeApi.SpDataProviderReportDataMapping(nativeCallback, providerName, typeHandle, (uint)entries.Length, entries);
|
||
|
|
}
|
||
|
|
|
||
|
|
void IRawUIXServices.NotifyChangeForDataObject(
|
||
|
|
ulong frameworkObjectHandle,
|
||
|
|
string propertyName,
|
||
|
|
UIXVariant.VariantType variantType)
|
||
|
|
{
|
||
|
|
MarkupDataTypeBaseObject dataTypeBaseObject = null;
|
||
|
|
switch (variantType)
|
||
|
|
{
|
||
|
|
case UIXVariant.VariantType.UIXDataQuery:
|
||
|
|
dataTypeBaseObject = NativeMarkupDataQuery.LookupByHandle(frameworkObjectHandle);
|
||
|
|
break;
|
||
|
|
case UIXVariant.VariantType.UIXDataType:
|
||
|
|
dataTypeBaseObject = NativeMarkupDataType.LookupByHandle(frameworkObjectHandle);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if (dataTypeBaseObject == null)
|
||
|
|
return;
|
||
|
|
propertyName = NotifyService.CanonicalizeString(propertyName);
|
||
|
|
dataTypeBaseObject.FireNotificationThreadSafe(propertyName);
|
||
|
|
}
|
||
|
|
|
||
|
|
IntPtr IRawUIXServices.GetAppWindowHandle()
|
||
|
|
{
|
||
|
|
IntPtr num = IntPtr.Zero;
|
||
|
|
if (UISession.Default != null && UISession.Default.Form != null)
|
||
|
|
num = UISession.Default.Form.__WindowHandle;
|
||
|
|
return num;
|
||
|
|
}
|
||
|
|
|
||
|
|
void IRawUIXServices.ReportError(bool isWarning, string message)
|
||
|
|
{
|
||
|
|
if (isWarning)
|
||
|
|
ErrorManager.ReportWarning(message);
|
||
|
|
else
|
||
|
|
ErrorManager.ReportError(message);
|
||
|
|
}
|
||
|
|
|
||
|
|
void IRawUIXServices.LowPriorityDeferredInvoke(IntPtr callback, IntPtr data) => DeferredCall.Post(DispatchPriority.Idle, new SimpleCallback(new DllProxyServices.DeferredInvokeState()
|
||
|
|
{
|
||
|
|
_callback = callback,
|
||
|
|
_data = data
|
||
|
|
}.Thunk));
|
||
|
|
|
||
|
|
internal class DeferredInvokeState
|
||
|
|
{
|
||
|
|
public IntPtr _callback;
|
||
|
|
public IntPtr _data;
|
||
|
|
|
||
|
|
public void Thunk() => NativeApi.SpCallDeferredInvokeProc(_callback, _data);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|