Example #1
0
        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);
        }
Example #2
0
        /// <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();
            }
        }