예제 #1
0
        public void Close()
        {
            if (SourceId.Id != 0)
            {
                UserInterface userInterface = new UserInterface();

                TwainResult result = Twain32Native.DsUserInterface(
                    _applicationId,
                    SourceId,
                    DataGroup.Control,
                    DataArgumentType.UserInterface,
                    Message.DisableDS,
                    userInterface);

                if (result != TwainResult.Failure)
                {
                    result = Twain32Native.DsmIdentity(
                        _applicationId,
                        IntPtr.Zero,
                        DataGroup.Control,
                        DataArgumentType.Identity,
                        Message.CloseDS,
                        SourceId);
                }
            }
        }
예제 #2
0
        public void Close()
        {
            if (SourceId.Id != 0)
            {
                try
                {
                    UserInterface userInterface = new UserInterface();

                    TwainResult result = Twain32Native.DsUserInterface(
                        _applicationId,
                        SourceId,
                        DataGroup.Control,
                        DataArgumentType.UserInterface,
                        Message.DisableDS,
                        userInterface);

                    if (result != TwainResult.Failure)
                    {
                        result = Twain32Native.DsmIdentity(
                            _applicationId,
                            IntPtr.Zero,
                            DataGroup.Control,
                            DataArgumentType.Identity,
                            Message.CloseDS,
                            SourceId);
                    }
                }
                catch
                {
                    // ignore this is bypass an error that if trigerd needs the whole twain classto be reinitialised
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 打開DS,進入State 4以溝通Capabilities
        /// </summary>
        /// <exception cref="DeviceOpenExcetion">當DS被其他人占用的時候可能會擲回,或twain DLL沒有錯誤,但是回傳值失敗的話就會擲回</exception>
        public void OpenSource()
        {
            TwainResult result = TwainResult.NotDSEvent;

            try
            {
                result = Twain32Native.DsmIdentity(
                    _applicationId,
                    IntPtr.Zero,
                    DataGroup.Control,
                    DataArgumentType.Identity,
                    Message.OpenDS,
                    SourceId);
            }
            catch (Exception ex)
            {
                throw new DeviceOpenExcetion(ex.Message);
            }

            if (result != TwainResult.Success)
            {
                throw new DeviceOpenExcetion("Error opening data source", result);
            }
            Logger.WriteLog(LOG_LEVEL.LL_NORMAL_LOG, string.Format("DataSource \"{0}\" successfully opened.", this.SourceId.ProductName));
        }
예제 #4
0
        public DataSourceManager(Identity applicationId, IWindowsMessageHook messageHook)
        {
            // Make a copy of the identity in case it gets modified
            ApplicationId = applicationId.Clone();

            ScanningComplete += delegate { };
            TransferImage    += delegate { };

            _messageHook = messageHook;
            _messageHook.FilterMessageCallback = FilterMessage;
            IntPtr windowHandle = _messageHook.WindowHandle;

            _eventMessage.EventPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WindowsMessage)));

            // Initialise the data source manager
            TwainResult result = Twain32Native.DsmParent(
                ApplicationId,
                IntPtr.Zero,
                DataGroup.Control,
                DataArgumentType.Parent,
                Message.OpenDSM,
                ref windowHandle);

            if (result == TwainResult.Success)
            {
                //according to the 2.0 spec (2-10) if (applicationId.SupportedGroups
                // | DataGroup.Dsm2) > 0 then we should call DM_Entry(id, 0, DG_Control, DAT_Entrypoint, MSG_Get, wh)
                //right here
                DataSource = DataSource.GetDefault(ApplicationId, _messageHook);
            }
            else
            {
                throw new TwainException("Error initialising DSM: " + result, result);
            }
        }
예제 #5
0
        public bool Disable()
        {
            if (SourceState != null && SourceState >= TwainState.SourceEnabled)
            {
                if (SourceId.Id != 0)
                {
                    var userInterface = new UserInterface();

                    TwainResult result = Twain32Native.DsUserInterface(
                        _applicationId,
                        SourceId,
                        DataGroup.Control,
                        DataArgumentType.UserInterface,
                        Message.DisableDS,
                        userInterface);


                    if (result != TwainResult.Failure)
                    {
                        _log.Debug(string.Format("DisableDS, result: {0}", result));
                        SourceState = TwainState.SourceOpen;
                        return(true);
                    }
                    var condition = DataSourceManager.GetConditionCode(_applicationId, SourceId);
                    _log.Debug(string.Format("DisableDS, result: {0}, conditionCode: {1}", result, condition));
                    return(false);
                }
                return(false);
            }

            return(false);
        }
예제 #6
0
        protected void SetValue <T>(T value)
        {
            /*log.Debug(string.Format("Attempting to set capabilities:{0}, value:{1}, type:{1}",
             *  _capability, value, _twainType));*/
            Logger.WriteLog(LOG_LEVEL.LL_NORMAL_LOG, string.Format("Attempting to set capabilities:{0}, value:{1}, type:{2}",
                                                                   _capability, value, _twainType.ToString()));

            int rawValue        = Convert.ToInt32(value);
            var oneValue        = new CapabilityOneValue(_twainType, rawValue);
            var twainCapability = TwainCapability.From(_capability, oneValue);

            TwainResult result = Twain32Native.DsCapability(
                _applicationId,
                _sourceId,
                DataGroup.Control,
                DataArgumentType.Capability,
                Message.Set,
                twainCapability);

            if (result != TwainResult.Success)
            {
                Logger.WriteLog(LOG_LEVEL.LL_SUB_FUNC, string.Format("Failed to set capabilities:{0}, value:{1}, type:{2}, result:{3}",
                                                                     _capability, value, _twainType, result));

                if (result == TwainResult.Failure)
                {
                    var conditionCode = GetStatus();

                    Logger.WriteLog(LOG_LEVEL.LL_SERIOUS_ERROR, string.Format("Failed to set capabilites:{0} reason: {1}",
                                                                              _capability, conditionCode));

                    throw new TwainException("Failed to set capability.", result, conditionCode);
                }
                else if (result == TwainResult.CheckStatus)
                {
                    Logger.WriteLog(LOG_LEVEL.LL_SUB_FUNC, "Value changed but not to requested value");
                }
                else
                {
                    throw new TwainException("Failed to set capability.", result);
                }
            }
            else
            {
                Logger.WriteLog(LOG_LEVEL.LL_NORMAL_LOG, "Set capabilities:" + _capability + " successfully");
            }
        }
예제 #7
0
        protected void SetValue <T>(T value)
        {
            log.Debug(string.Format("Attempting to set capabilities:{0}, value:{1}, type:{1}",
                                    _capability, value, _twainType));

            int rawValue        = Convert.ToInt32(value);
            var oneValue        = new CapabilityOneValue(_twainType, rawValue);
            var twainCapability = TwainCapability.From(_capability, oneValue);

            TwainResult result = Twain32Native.DsCapability(
                _applicationId,
                _sourceId,
                DataGroup.Control,
                DataArgumentType.Capability,
                Message.Set,
                twainCapability);

            if (result != TwainResult.Success)
            {
                log.Debug(string.Format("Failed to set capabilities:{0}, value:{1}, type:{1}, result:{2}",
                                        _capability, value, _twainType, result));

                if (result == TwainResult.Failure)
                {
                    var conditionCode = GetStatus();

                    log.Error(string.Format("Failed to set capabilites:{0} reason: {1}",
                                            _capability, conditionCode));

                    throw new TwainException("Failed to set capability.", result, conditionCode);
                }
                else if (result == TwainResult.CheckStatus)
                {
                    log.Debug("Value changed but not to requested value");
                }
                else
                {
                    throw new TwainException("Failed to set capability.", result);
                }
            }
            else
            {
                log.Debug("Set capabilities successfully");
            }
        }
예제 #8
0
 public TwainException(string message, TwainResult returnCode, ConditionCode conditionCode)
     : this(message, null)
 {
     ReturnCode    = returnCode;
     ConditionCode = conditionCode;
 }
예제 #9
0
 public TwainException(string message, TwainResult returnCode, ConditionCode conditionCode)
     : this(message, null)
 {
     ReturnCode = returnCode;
     ConditionCode = conditionCode;
 }
예제 #10
0
        protected IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (DataSource.SourceId.Id == 0)
            {
                handled = false;
                return(IntPtr.Zero);
            }

            int pos = User32Native.GetMessagePos();

            WindowsMessage message = new WindowsMessage();

            message.hwnd    = hwnd;
            message.message = msg;
            message.wParam  = wParam;
            message.lParam  = lParam;
            message.time    = User32Native.GetMessageTime();
            message.x       = (short)pos;
            message.y       = (short)(pos >> 16);

            Marshal.StructureToPtr(message, _eventMessage.EventPtr, false);
            _eventMessage.Message = 0;

            TwainResult result = Twain32Native.DsEvent(
                ApplicationId,
                DataSource.SourceId,
                DataGroup.Control,
                DataArgumentType.Event,
                Message.ProcessEvent,
                ref _eventMessage);

            if (result == TwainResult.NotDSEvent)
            {
                handled = false;
                return(IntPtr.Zero);
            }

            switch (_eventMessage.Message)
            {
            case Message.XFerReady:
                Exception exception = null;
                try
                {
                    TransferPictures();
                }
                catch (Exception e)
                {
                    exception = e;
                }
                CloseDsAndCompleteScanning(exception);
                break;

            case Message.CloseDS:
            case Message.CloseDSOK:
            case Message.CloseDSReq:
                CloseDsAndCompleteScanning(null);
                break;

            case Message.DeviceEvent:
                break;

            default:
                break;
            }

            handled = true;
            return(IntPtr.Zero);
        }
 public DefaultDataSourceException(string message, TwainResult returnCode, ConditionCode conditionCode)
     : this(message, null)
 {
     ReturnCode    = returnCode;
     ConditionCode = conditionCode;
 }
예제 #12
0
        protected IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (DataSource.SourceId.Id == 0)
            {
                handled = false;
                return(IntPtr.Zero);
            }

            int pos = User32Native.GetMessagePos();

            WindowsMessage message = new WindowsMessage();

            message.hwnd    = hwnd;
            message.message = msg;
            message.wParam  = wParam;
            message.lParam  = lParam;
            message.time    = User32Native.GetMessageTime();
            message.x       = (short)pos;
            message.y       = (short)(pos >> 16);

            Marshal.StructureToPtr(message, _eventMessage.EventPtr, false);
            _eventMessage.Message = 0;

            TwainResult result = Twain32Native.DsEvent(
                ApplicationId,
                DataSource.SourceId,
                DataGroup.Control,
                DataArgumentType.Event,
                Message.ProcessEvent,
                ref _eventMessage);

            if (result == TwainResult.NotDSEvent)
            {
                handled = false;
                return(IntPtr.Zero);
            }

            switch (_eventMessage.Message)
            {
            case Message.XFerReady:
                IList <IntPtr> imagePointers = TransferPictures();

                foreach (IntPtr image in imagePointers)
                {
                    using (var renderer = new BitmapRenderer(image))
                    {
                        Images.Add(renderer.RenderToBitmap());
                    }
                }

                EndingScan();
                DataSource.Close();

                ScanningComplete(this, EventArgs.Empty);
                break;

            case Message.CloseDS:
                EndingScan();
                DataSource.Close();
                break;

            case Message.CloseDSOK:
                EndingScan();
                DataSource.Close();
                break;

            case Message.DeviceEvent:
                break;
            }

            handled = true;
            return(IntPtr.Zero);
        }