Skip to content

Commit

Permalink
Implement all of the System.* public surface area from System.Runtime…
Browse files Browse the repository at this point in the history
….WindowsRuntime (#134)

* Fix todo in AsyncInfoToTaskBridge

* Copy Windows.Storage.Streams extensions from dotnet/runtime into cswinrt. Still work to do to get it compiling.

* Manually project required COM interfaces for WindowsRuntimeBuffer implementation.

* Fix usage of IBufferByteAccess.

* Clean up IBufferByteAccess and IMarshal implementations.

* Remove CLSCompliant attributes.

* Add AsyncInfo extensions and get Windows.Storage and Windows.Storage.Streams extensions compiling.

* Fix usage of IStorageFolderHandleAccess and IStorageItemHandleAccess to use hand-written marshalling instead of the built-in runtime support.

Fix namespaces.

* Fix namespacing.

* Port over types used by AsyncInfo to implement its adapters.
  • Loading branch information
jkoritzinsky authored Apr 14, 2020
1 parent 4143fcc commit 7b9de18
Show file tree
Hide file tree
Showing 32 changed files with 6,044 additions and 4 deletions.
54 changes: 53 additions & 1 deletion WinRT.Runtime/ExceptionHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,61 @@ internal static bool TryGetRestrictedLanguageErrorObject(

return false;
}

public static Exception AttachRestrictedErrorInfo(Exception e)
{
// If there is no exception, then the restricted error info doesn't apply to it
if (e != null)
{
try
{
// Get the restricted error info for this thread and see if it may correlate to the current
// exception object. Note that in general the thread's IRestrictedErrorInfo is not meant for
// exceptions that are marshaled Windows.Foundation.HResults and instead are intended for
// HRESULT ABI return values. However, in many cases async APIs will set the thread's restricted
// error info as a convention in order to provide extended debugging information for the ErrorCode
// property.
Marshal.ThrowExceptionForHR(getRestrictedErrorInfo(out IntPtr restrictedErrorInfoPtr));

if (restrictedErrorInfoPtr != IntPtr.Zero)
{
IObjectReference restrictedErrorInfoRef = ObjectReference<ABI.WinRT.Interop.IRestrictedErrorInfo.Vftbl>.Attach(ref restrictedErrorInfoPtr);

ABI.WinRT.Interop.IRestrictedErrorInfo restrictedErrorInfo = new ABI.WinRT.Interop.IRestrictedErrorInfo(restrictedErrorInfoRef);

restrictedErrorInfo.GetErrorDetails(out string description,
out int restrictedErrorInfoHResult,
out string restrictedDescription,
out string capabilitySid);

// Since this is a special case where by convention there may be a correlation, there is not a
// guarantee that the restricted error info does belong to the async error code. In order to
// reduce the risk that we associate incorrect information with the exception object, we need
// to apply a heuristic where we attempt to match the current exception's HRESULT with the
// HRESULT the IRestrictedErrorInfo belongs to. If it is a match we will assume association
// for the IAsyncInfo case.
if (e.HResult == restrictedErrorInfoHResult)
{
e.AddExceptionDataForRestrictedErrorInfo(description,
restrictedDescription,
restrictedErrorInfo.GetReference(),
capabilitySid,
restrictedErrorInfoRef.As<ABI.WinRT.Interop.IRestrictedErrorInfo.Vftbl>());
}
}
}
catch
{
// If we can't get the restricted error info, then proceed as if it isn't associated with this
// error.
}
}

return e;
}
}

internal static class ExceptionExtensions
public static class ExceptionExtensions
{
public static void SetHResult(this Exception ex, int value)
{
Expand Down
28 changes: 28 additions & 0 deletions cswinrt/cswinrt.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,35 @@
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="strings\additions\Windows.Foundation\AsyncInfo.cs" />
<None Include="strings\additions\Windows.Foundation\AsyncInfoIdGenerator.cs" />
<None Include="strings\additions\Windows.Foundation\ExceptionDispatchHelper.cs" />
<None Include="strings\additions\Windows.Foundation\TaskToAsyncActionAdapter.cs" />
<None Include="strings\additions\Windows.Foundation\TaskToAsyncActionWithProgressAdapter.cs" />
<None Include="strings\additions\Windows.Foundation\TaskToAsyncInfoAdapter.cs" />
<None Include="strings\additions\Windows.Foundation\TaskToAsyncOperationAdapter.cs" />
<None Include="strings\additions\Windows.Foundation\TaskToAsyncOperationWithProgressAdapter.cs" />
<None Include="strings\additions\Windows.Foundation\Windows.Foundation.cs" />
<None Include="strings\additions\Windows.Foundation\Windows.Foundation.SR.cs" />
<None Include="strings\additions\Windows.Storage.Streams\IBufferByteAccess.cs" />
<None Include="strings\additions\Windows.Storage.Streams\IMarshal.cs" />
<None Include="strings\additions\Windows.Storage.Streams\NetFxToWinRtStreamAdapter.cs" />
<None Include="strings\additions\Windows.Storage.Streams\Windows.Storage.Streams.SR.cs" />
<None Include="strings\additions\Windows.Storage.Streams\StreamOperationAsyncResult.cs" />
<None Include="strings\additions\Windows.Storage.Streams\StreamOperationsImplementation.cs" />
<None Include="strings\additions\Windows.Storage.Streams\WindowsRuntimeBuffer.cs" />
<None Include="strings\additions\Windows.Storage.Streams\WindowsRuntimeBufferExtensions.cs" />
<None Include="strings\additions\Windows.Storage.Streams\WindowsRuntimeStreamExtensions.cs" />
<None Include="strings\additions\Windows.Storage.Streams\WinRtIOHelper.cs" />
<None Include="strings\additions\Windows.Storage.Streams\WinRtToNetFxStreamAdapter.cs" />
<None Include="strings\additions\Windows.Storage\HANDLE_ACCESS_OPTIONS.cs" />
<None Include="strings\additions\Windows.Storage\HANDLE_CREATION_OPTIONS.cs" />
<None Include="strings\additions\Windows.Storage\HANDLE_OPTIONS.cs" />
<None Include="strings\additions\Windows.Storage\HANDLE_SHARING_OPTION.cs" />
<None Include="strings\additions\Windows.Storage\IStorageFolderHandleAccess.cs" />
<None Include="strings\additions\Windows.Storage\IStorageItemHandleAccess.cs" />
<None Include="strings\additions\Windows.Storage\Windows.Storage.SR.cs" />
<None Include="strings\additions\Windows.Storage\WindowsRuntimeStorageExtensions.cs" />
<None Include="strings\additions\Windows.UI.Xaml\Windows.UI.Xaml.cs" />
<None Include="strings\WinRT.cs" />
<None Include="strings\WinRT_Interop.cs" />
Expand Down
95 changes: 95 additions & 0 deletions cswinrt/cswinrt.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
<ClCompile Include="main.cpp" />
<ClCompile Include="pch.cpp" />
<ClCompile Include="@(StaticStrings->'%(Source)')" />
<ClCompile Include="@(StaticStrings->'%(Source)')" />
<ClCompile Include="@(StaticStrings->'%(Source)')" />
<ClCompile Include="@(StaticStrings->'%(Source)')" />
<ClCompile Include="@(StaticStrings->'%(Source)')" />
<ClCompile Include="@(StaticStrings->'%(Source)')" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="code_writers.h" />
Expand Down Expand Up @@ -32,6 +37,12 @@
<Filter Include="strings\additions\Windows.UI.Xaml">
<UniqueIdentifier>{8626e8bc-727e-4c4d-a7fa-fe90c02b3090}</UniqueIdentifier>
</Filter>
<Filter Include="strings\additions\Windows.Storage.Streams">
<UniqueIdentifier>{4035db1f-9a59-42da-84a0-e3c3227fe586}</UniqueIdentifier>
</Filter>
<Filter Include="strings\additions\Windows.Storage">
<UniqueIdentifier>{d939d5a3-d5f9-4802-a8f8-3c5ce8b3a07e}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="strings\WinRT.cs">
Expand All @@ -50,5 +61,89 @@
<None Include="strings\additions\Windows.UI.Xaml\Windows.UI.Xaml.cs">
<Filter>strings\additions\Windows.UI.Xaml</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\NetFxToWinRtStreamAdapter.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\StreamOperationAsyncResult.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\StreamOperationsImplementation.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\WindowsRuntimeStreamExtensions.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\WinRtIOHelper.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\WinRtToNetFxStreamAdapter.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\WindowsRuntimeBuffer.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\WindowsRuntimeBufferExtensions.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\IMarshal.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\IBufferByteAccess.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage\HANDLE_ACCESS_OPTIONS.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage\HANDLE_CREATION_OPTIONS.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage\HANDLE_OPTIONS.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage\HANDLE_SHARING_OPTION.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage\IStorageFolderHandleAccess.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage\IStorageItemHandleAccess.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage\WindowsRuntimeStorageExtensions.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Storage.Streams\Windows.Storage.Streams.SR.cs">
<Filter>strings\additions\Windows.Storage.Streams</Filter>
</None>
<None Include="strings\additions\Windows.Storage\Windows.Storage.SR.cs">
<Filter>strings\additions\Windows.Storage</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\AsyncInfo.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\AsyncInfoIdGenerator.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\ExceptionDispatchHelper.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\TaskToAsyncActionAdapter.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\TaskToAsyncActionWithProgressAdapter.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\TaskToAsyncInfoAdapter.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\TaskToAsyncOperationAdapter.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\TaskToAsyncOperationWithProgressAdapter.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
<None Include="strings\additions\Windows.Foundation\Windows.Foundation.SR.cs">
<Filter>strings\additions\Windows.Foundation</Filter>
</None>
</ItemGroup>
</Project>
Loading

0 comments on commit 7b9de18

Please sign in to comment.