mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
Add project files.
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
// Decompiled with JetBrains decompiler
|
||||
// Type: Microsoft.Iris.Data.Resource
|
||||
// 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.OS;
|
||||
using System;
|
||||
|
||||
namespace Microsoft.Iris.Data
|
||||
{
|
||||
internal abstract class Resource
|
||||
{
|
||||
protected string _uri;
|
||||
private bool _forceSynchronous;
|
||||
private IntPtr _buffer;
|
||||
private uint _length;
|
||||
private bool _requiresMemoryFree;
|
||||
private ResourceStatus _status;
|
||||
private string _errorDetails;
|
||||
private int _acquisitions;
|
||||
private ResourceAcquisitionCompleteHandler _completeHandlers;
|
||||
|
||||
public Resource(string uri, bool forceSynchronous)
|
||||
{
|
||||
_uri = uri;
|
||||
_forceSynchronous = forceSynchronous;
|
||||
_status = ResourceStatus.NeedsAcquire;
|
||||
}
|
||||
|
||||
public string Uri => _uri;
|
||||
|
||||
public abstract string Identifier { get; }
|
||||
|
||||
public void Acquire() => Acquire(null);
|
||||
|
||||
public void Acquire(ResourceAcquisitionCompleteHandler completeHandler)
|
||||
{
|
||||
++_acquisitions;
|
||||
if (completeHandler != null)
|
||||
_completeHandlers += completeHandler;
|
||||
if (_status == ResourceStatus.Acquiring)
|
||||
return;
|
||||
if (_status != ResourceStatus.Available)
|
||||
{
|
||||
_status = ResourceStatus.Acquiring;
|
||||
_errorDetails = null;
|
||||
StartAcquisition(_forceSynchronous);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (completeHandler == null)
|
||||
return;
|
||||
completeHandler(this);
|
||||
}
|
||||
}
|
||||
|
||||
public void Free() => Free(null);
|
||||
|
||||
public void Free(ResourceAcquisitionCompleteHandler completeHandler)
|
||||
{
|
||||
--_acquisitions;
|
||||
if (completeHandler != null)
|
||||
_completeHandlers -= completeHandler;
|
||||
if (_acquisitions != 0)
|
||||
return;
|
||||
if (_status == ResourceStatus.Acquiring)
|
||||
CancelAcquisition();
|
||||
else if (_buffer != IntPtr.Zero)
|
||||
{
|
||||
if (_requiresMemoryFree)
|
||||
FreeNativeBuffer(_buffer);
|
||||
_buffer = IntPtr.Zero;
|
||||
}
|
||||
_status = ResourceStatus.NeedsAcquire;
|
||||
}
|
||||
|
||||
public ResourceStatus Status
|
||||
{
|
||||
get => _status;
|
||||
set => _status = value;
|
||||
}
|
||||
|
||||
public string ErrorDetails => _errorDetails;
|
||||
|
||||
public IntPtr Buffer => _buffer;
|
||||
|
||||
public uint Length => _length;
|
||||
|
||||
public bool ForceSynchronous => _forceSynchronous;
|
||||
|
||||
protected abstract void StartAcquisition(bool forceSynchronous);
|
||||
|
||||
protected abstract void CancelAcquisition();
|
||||
|
||||
protected void NotifyAcquisitionComplete(
|
||||
IntPtr buffer,
|
||||
uint length,
|
||||
bool requiresMemoryFree,
|
||||
string errorDetails)
|
||||
{
|
||||
_buffer = buffer;
|
||||
_length = length;
|
||||
_requiresMemoryFree = requiresMemoryFree;
|
||||
if (buffer != IntPtr.Zero)
|
||||
{
|
||||
_status = ResourceStatus.Available;
|
||||
}
|
||||
else
|
||||
{
|
||||
_status = ResourceStatus.Error;
|
||||
if (errorDetails == null)
|
||||
errorDetails = string.Format("Failed to acquire resource '{0}'", Identifier);
|
||||
_errorDetails = errorDetails;
|
||||
}
|
||||
if (_completeHandlers == null)
|
||||
return;
|
||||
_completeHandlers(this);
|
||||
}
|
||||
|
||||
protected static IntPtr AllocNativeBuffer(uint length) => NativeApi.MemAlloc(length, false);
|
||||
|
||||
protected static void FreeNativeBuffer(IntPtr buffer) => NativeApi.MemFree(buffer);
|
||||
|
||||
private void FireAcquisitionCompleteHandlers()
|
||||
{
|
||||
if (_completeHandlers == null)
|
||||
return;
|
||||
_completeHandlers(this);
|
||||
_completeHandlers = null;
|
||||
}
|
||||
|
||||
public override string ToString() => _uri;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user