mirror of
https://github.com/soukoku/ntwain.git
synced 2025-11-24 08:47:06 +08:00
Updated xfer ready flow for both audio/image.
This commit is contained in:
@@ -668,57 +668,31 @@ namespace NTwain
|
|||||||
/// Performs the TWAIN transfer routine at state 6.
|
/// Performs the TWAIN transfer routine at state 6.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual void DoTransferRoutine()
|
protected virtual void DoTransferRoutine()
|
||||||
{
|
|
||||||
DataGroups xferGroup = DataGroups.None;
|
|
||||||
|
|
||||||
if (DGControl.XferGroup.Get(ref xferGroup) != ReturnCode.Success)
|
|
||||||
{
|
|
||||||
xferGroup = DataGroups.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
// support one or the other or both?
|
|
||||||
if ((xferGroup & DataGroups.Image) == DataGroups.Image)
|
|
||||||
{
|
|
||||||
DoImageXfer();
|
|
||||||
}
|
|
||||||
else if ((xferGroup & DataGroups.Audio) == DataGroups.Audio)
|
|
||||||
{
|
|
||||||
DoAudioXfer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// ??? just cancel it
|
|
||||||
var pending = new TWPendingXfers();
|
|
||||||
var rc = ReturnCode.Success;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rc = DGControl.PendingXfers.Reset(pending);
|
|
||||||
} while (rc == ReturnCode.Success && pending.Count != 0);
|
|
||||||
|
|
||||||
State = 5;
|
|
||||||
DisableSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#region audio xfers
|
|
||||||
|
|
||||||
private void DoAudioXfer()
|
|
||||||
{
|
{
|
||||||
var pending = new TWPendingXfers();
|
var pending = new TWPendingXfers();
|
||||||
var rc = ReturnCode.Success;
|
var rc = ReturnCode.Success;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
#region build pre xfer info
|
#region build and raise xfer ready
|
||||||
|
|
||||||
TWAudioInfo audInfo;
|
TWAudioInfo audInfo;
|
||||||
DGAudio.AudioInfo.Get(out audInfo);
|
if (DGAudio.AudioInfo.Get(out audInfo) != ReturnCode.Success)
|
||||||
|
{
|
||||||
|
audInfo = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
TWImageInfo imgInfo;
|
||||||
|
if (DGImage.ImageInfo.Get(out imgInfo) != ReturnCode.Success)
|
||||||
|
{
|
||||||
|
imgInfo = null;
|
||||||
|
}
|
||||||
|
|
||||||
// ask consumer for xfer details
|
// ask consumer for xfer details
|
||||||
var preXferArgs = new TransferReadyEventArgs
|
var preXferArgs = new TransferReadyEventArgs
|
||||||
{
|
{
|
||||||
AudioInfo = audInfo,
|
AudioInfo = audInfo,
|
||||||
|
PendingImageInfo = imgInfo,
|
||||||
PendingTransferCount = pending.Count,
|
PendingTransferCount = pending.Count,
|
||||||
EndOfJob = pending.EndOfJob == 0
|
EndOfJob = pending.EndOfJob == 0
|
||||||
};
|
};
|
||||||
@@ -727,15 +701,41 @@ namespace NTwain
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region actually handle xfer
|
||||||
|
|
||||||
if (preXferArgs.CancelAll)
|
if (preXferArgs.CancelAll)
|
||||||
{
|
{
|
||||||
rc = DGControl.PendingXfers.Reset(pending);
|
rc = DGControl.PendingXfers.Reset(pending);
|
||||||
if (rc == ReturnCode.Success)
|
}
|
||||||
|
else if (!preXferArgs.CancelCurrent)
|
||||||
{
|
{
|
||||||
|
DataGroups xferGroup = DataGroups.None;
|
||||||
|
|
||||||
|
if (DGControl.XferGroup.Get(ref xferGroup) != ReturnCode.Success)
|
||||||
|
{
|
||||||
|
xferGroup = DataGroups.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((xferGroup & DataGroups.Image) == DataGroups.Image)
|
||||||
|
{
|
||||||
|
var mech = this.GetCurrentCap<XferMech>(CapabilityId.ICapXferMech);
|
||||||
|
switch (mech)
|
||||||
|
{
|
||||||
|
case XferMech.Native:
|
||||||
|
DoImageNativeXfer();
|
||||||
|
break;
|
||||||
|
case XferMech.Memory:
|
||||||
|
DoImageMemoryXfer();
|
||||||
|
break;
|
||||||
|
case XferMech.File:
|
||||||
|
DoImageFileXfer();
|
||||||
|
break;
|
||||||
|
case XferMech.MemFile:
|
||||||
|
DoImageMemoryFileXfer();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!preXferArgs.CancelCurrent)
|
if ((xferGroup & DataGroups.Audio) == DataGroups.Audio)
|
||||||
{
|
{
|
||||||
var mech = this.GetCurrentCap<XferMech>(CapabilityId.ACapXferMech);
|
var mech = this.GetCurrentCap<XferMech>(CapabilityId.ACapXferMech);
|
||||||
switch (mech)
|
switch (mech)
|
||||||
@@ -748,15 +748,20 @@ namespace NTwain
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
rc = DGControl.PendingXfers.EndXfer(pending);
|
rc = DGControl.PendingXfers.EndXfer(pending);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
} while (rc == ReturnCode.Success && pending.Count != 0);
|
} while (rc == ReturnCode.Success && pending.Count != 0);
|
||||||
|
|
||||||
State = 5;
|
State = 5;
|
||||||
DisableSource();
|
DisableSource();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region audio xfers
|
||||||
|
|
||||||
private void DoAudioNativeXfer()
|
private void DoAudioNativeXfer()
|
||||||
{
|
{
|
||||||
IntPtr dataPtr = IntPtr.Zero;
|
IntPtr dataPtr = IntPtr.Zero;
|
||||||
@@ -811,62 +816,6 @@ namespace NTwain
|
|||||||
|
|
||||||
#region image xfers
|
#region image xfers
|
||||||
|
|
||||||
private void DoImageXfer()
|
|
||||||
{
|
|
||||||
var pending = new TWPendingXfers();
|
|
||||||
var rc = ReturnCode.Success;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
#region build pre xfer info
|
|
||||||
|
|
||||||
TWImageInfo imgInfo;
|
|
||||||
DGImage.ImageInfo.Get(out imgInfo);
|
|
||||||
|
|
||||||
// ask consumer for xfer details
|
|
||||||
var preXferArgs = new TransferReadyEventArgs
|
|
||||||
{
|
|
||||||
PendingImageInfo = imgInfo,
|
|
||||||
PendingTransferCount = pending.Count,
|
|
||||||
EndOfJob = pending.EndOfJob == 0
|
|
||||||
};
|
|
||||||
|
|
||||||
OnTransferReady(preXferArgs);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
if (preXferArgs.CancelAll)
|
|
||||||
{
|
|
||||||
rc = DGControl.PendingXfers.Reset(pending);
|
|
||||||
}
|
|
||||||
else if (!preXferArgs.CancelCurrent)
|
|
||||||
{
|
|
||||||
var mech = this.GetCurrentCap<XferMech>(CapabilityId.ICapXferMech);
|
|
||||||
switch (mech)
|
|
||||||
{
|
|
||||||
case XferMech.Native:
|
|
||||||
DoImageNativeXfer();
|
|
||||||
break;
|
|
||||||
case XferMech.Memory:
|
|
||||||
DoImageMemoryXfer();
|
|
||||||
break;
|
|
||||||
case XferMech.File:
|
|
||||||
DoImageFileXfer();
|
|
||||||
break;
|
|
||||||
case XferMech.MemFile:
|
|
||||||
DoImageMemoryFileXfer();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = DGControl.PendingXfers.EndXfer(pending);
|
|
||||||
|
|
||||||
} while (rc == ReturnCode.Success && pending.Count != 0);
|
|
||||||
|
|
||||||
State = 5;
|
|
||||||
DisableSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DoImageNativeXfer()
|
private void DoImageNativeXfer()
|
||||||
{
|
{
|
||||||
IntPtr dataPtr = IntPtr.Zero;
|
IntPtr dataPtr = IntPtr.Zero;
|
||||||
|
|||||||
Reference in New Issue
Block a user