TransferMechs GetTransferMechs() { TransferMechs retVal = default; bool xferImage = true; // default to always xfer image bool xferAudio = false; DataGroups xferGroup = DataGroups.None; XferMech imgXferMech = XferMech.Native; XferMech audXferMech = XferMech.Native; if (DGControl.XferGroup.Get(ref xferGroup) == ReturnCode.Success) { xferAudio = (xferGroup & DataGroups.Audio) == DataGroups.Audio; // some DS returns none but we will assume it's image xferImage = xferGroup == DataGroups.None || (xferGroup & DataGroups.Image) == DataGroups.Image; } // TODO: restore this if (xferImage) { //imgXferMech = CurrentSource.Capabilities.ICapXferMech.GetCurrent(); retVal.ImageMech = imgXferMech; } if (xferAudio) { //audXferMech = CurrentSource.Capabilities.ACapXferMech.GetCurrent(); retVal.AudioMech = audXferMech; } return(retVal); }
/// <summary> /// Performs the TWAIN transfer routine at state 6. /// </summary> public static void DoTransferRoutine(ITwainSessionInternal session) { #region get xfer types bool xferImage = true; // default to always xfer image bool xferAudio = false; DataGroups xferGroup = DataGroups.None; XferMech imgXferMech = XferMech.Native; XferMech audXferMech = XferMech.Native; if (session.DGControl.XferGroup.Get(ref xferGroup) == ReturnCode.Success) { xferAudio = (xferGroup & DataGroups.Audio) == DataGroups.Audio; // check for Plustek OpticSlim 2680H, this scanner returns wrong xferGroup after first scanning if (session.CurrentSource.Identity.ProductName.IndexOf("Plustek", StringComparison.OrdinalIgnoreCase) > -1 && session.CurrentSource.Identity.ProductName.IndexOf("OpticSlim", StringComparison.OrdinalIgnoreCase) > -1 && session.CurrentSource.Identity.ProductName.IndexOf("2680H", StringComparison.OrdinalIgnoreCase) > -1) { xferImage = true; } else { xferImage = xferGroup == DataGroups.None || (xferGroup & DataGroups.Image) == DataGroups.Image; } } // some DS end up getting none but we will assume it's image if (xferImage) { imgXferMech = session.CurrentSource.Capabilities.ICapXferMech.GetCurrent(); } if (xferAudio) { var mech = session.CurrentSource.Capabilities.ACapXferMech.GetCurrent(); } #endregion var pending = new TWPendingXfers(); var rc = session.DGControl.PendingXfers.Get(pending); if (rc == ReturnCode.Success) { do { #region raise xfer ready var preXferArgs = new TransferReadyEventArgs(session.CurrentSource, pending.Count, pending.EndOfJob);; session.SafeSyncableRaiseEvent(preXferArgs); #endregion #region actually handle xfer if (preXferArgs.CancelAll || session.CloseDSRequested) { rc = session.DGControl.PendingXfers.Reset(pending); } else { if (!preXferArgs.CancelCurrent) { if (xferImage) { switch (imgXferMech) { case XferMech.Memory: rc = DoImageMemoryXfer(session); break; case XferMech.File: rc = DoImageFileXfer(session); break; case XferMech.MemFile: rc = DoImageMemoryFileXfer(session); break; case XferMech.Native: default: // always assume native rc = DoImageNativeXfer(session); break; } } if (xferAudio) { switch (audXferMech) { case XferMech.File: rc = DoAudioFileXfer(session); break; case XferMech.Native: default: // always assume native rc = DoAudioNativeXfer(session); break; } } } if (rc != ReturnCode.Success && session.StopOnTransferError) { // end xfer without setting rc to exit (good/bad?) session.DGControl.PendingXfers.Reset(pending); } else { rc = session.DGControl.PendingXfers.EndXfer(pending); } } #endregion } while (rc == ReturnCode.Success && pending.Count != 0 && !session.CloseDSRequested); } else { HandleReturnCode(session, rc); } // some poorly written scanner drivers return failure on EndXfer so also check for pending count now. // this may break with other sources but we'll see if (//pending.Count == 0 && session.State > 5) { session.ChangeState(5, true); session.DisableSource(); } }